[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\ncharset = utf-8\nindent_size = 4\nindent_style = space\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n[*.{java,kt}]\nij_kotlin_imports_layout = *\n\n# Disable wildcard imports\nij_kotlin_name_count_to_use_star_import = 999\nij_kotlin_name_count_to_use_star_import_for_members = 999\nij_java_class_count_to_use_import_on_demand = 999\n\nktlint_code_style = android_studio\n\n# Disable trailing comma\nktlint_standard_trailing-comma-on-call-site = disabled\nktlint_standard_trailing-comma-on-declaration-site = disabled\n\nmax_line_length = off\n\n[*.{yml,yaml}]\nindent_size = 2\n"
  },
  {
    "path": ".gitattributes",
    "content": "* text=auto eol=lf\n\n*.bat text eol=crlf\n*.jar binary\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "open_collective: tusky\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/1.bug_report.yml",
    "content": "name: Bug Report\ndescription: If something isn't working as expected\nlabels: [bug]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Make sure that you are submitting a new bug that was not previously reported or already fixed.\n\n        Please use a concise and distinct title for the issue.\n\n        If possible, attach screenshots, videos or links to posts to illustrate the problem.\n  - type: textarea\n    attributes:\n      label: Detailed description\n    validations:\n      required: false\n  - type: textarea\n    attributes:\n      label: Steps to reproduce the problem\n      description: What were you trying to do?\n      value: |\n        1.\n        2.\n        3.\n        ...\n    validations:\n      required: false\n  - type: textarea\n    attributes:\n      label: Debug information\n      description: |\n        This info can be copied from the 'About' screen in Tusky 24+.\n        If you are on a lower version or can't access the screen, please provide us with the Tusky Version, Android Version, Device and the Mastodon instance this problem occurred on.\n      placeholder: |\n        Tusky Test 22.0-b814c2c0\n        Android 12\n        Fairphone 4\n        mastodon.social\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/2.feature_request.yml",
    "content": "name: Feature Request\ndescription: I have a suggestion\nlabels: [enhancement]\nbody:\n  - type: markdown\n    attributes:\n      value: Please use a concise and distinct title for the issue.\n  - type: textarea\n    attributes:\n      label: Pitch\n      description: Describe your idea for a feature. Make sure it has not already been suggested/implemented/turned down before.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Motivation\n      description: Why do you think this feature is needed? Who would benefit from it?\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: true\n"
  },
  {
    "path": ".github/actions/setup/action.yml",
    "content": "name: 'Setup build environment'\ndescription: 'Sets up an environment for building Tusky'\nruns:\n  using: \"composite\"\n  steps:\n    - uses: actions/setup-java@v4\n      with:\n        java-version: '21'\n        distribution: 'temurin'\n\n    - name: Copy CI gradle.properties\n      shell: bash\n      run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties\n\n    - name: Gradle Build Action\n      uses: gradle/actions/setup-gradle@v4\n      with:\n        cache-read-only: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/develop' }}\n"
  },
  {
    "path": ".github/ci-gradle.properties",
    "content": "#\n# Copyright 2023 Tusky Contributors\n#\n# This file is a part of Tusky.\n#\n# This program is free software; you can redistribute it and/or modify it under the terms of the\n# GNU General Public License as published by the Free Software Foundation; either version 3 of the\n# License, or (at your option) any later version.\n#\n# Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n# the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n# Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along with Tusky; if not,\n# see <http://www.gnu.org/licenses>.\n#\n\n# CI build workers are ephemeral, so don't benefit from the Gradle daemon\norg.gradle.daemon=false\norg.gradle.parallel=true\norg.gradle.workers.max=2\n\nkotlin.incremental=false\nkotlin.compiler.execution.strategy=in-process\n"
  },
  {
    "path": ".github/renovate.json",
    "content": "{\n    \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n    \"extends\": [\n        \"config:recommended\"\n    ],\n    \"packageRules\": [\n        {\n            \"groupName\": \"Kotlin\",\n            \"groupSlug\": \"kotlin\",\n            \"matchPackageNames\": [\n                \"com.google.devtools.ksp{/,}**\",\n                \"/org.jetbrains.kotlin.*/\"\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": ".github/workflows/check-and-build.yml",
    "content": "name: Check and build\n\non:\n  pull_request:\n  workflow_call:\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Setup\n        uses: ./.github/actions/setup\n\n      - name: Licensee\n        run: ./gradlew licensee\n\n      - name: ktlint\n        run: ./gradlew clean ktlintCheck\n\n      - name: Regular lint\n        run: ./gradlew app:lintGreenDebug\n\n      - name: Test\n        run: ./gradlew app:testGreenDebugUnitTest\n\n      - name: Build\n        run: ./gradlew app:buildGreenDebug\n"
  },
  {
    "path": ".github/workflows/deploy-release.yml",
    "content": "# When a tag is created, create a release build and upload it to Google Play\n\nname: Deploy release to Google Play\n\non:\n  push:\n    tags:\n      - '*'\n\njobs:\n  check-and-build:\n    uses: ./.github/workflows/check-and-build.yml\n  deploy:\n    runs-on: ubuntu-latest\n    needs: check-and-build\n    environment: Release\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Setup\n        uses: ./.github/actions/setup\n\n      - name: Build Blue aab\n        run: ./gradlew app:bundleBlueRelease\n\n      - uses: r0adkll/sign-android-release@f30bdd30588842ac76044ecdbd4b6d0e3e813478\n        name: Sign Tusky Blue aab\n        id: sign_aab\n        with:\n          releaseDirectory: app/build/outputs/bundle/blueRelease\n          signingKeyBase64: ${{ secrets.KEYSTORE }}\n          alias: ${{ secrets.KEY_ALIAS }}\n          keyStorePassword: ${{ secrets.KEYSTORE_PASSWORD }}\n          keyPassword: ${{ secrets.KEY_PASSWORD }}\n\n      - name: Generate whatsnew\n        id: generate-whatsnew\n        run: |\n          mkdir whatsnew\n          cp $(find fastlane/metadata/android/en-US/changelogs | sort -n -k6 -t/ | tail -n 1) whatsnew/whatsnew-en-US\n\n      - name: Upload AAB to Google Play\n        id: upload-release-asset-aab\n        uses: r0adkll/upload-google-play@v1.1.3\n        with:\n          serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}\n          packageName: com.keylesspalace.tusky\n          releaseFiles: ${{steps.sign_aab.outputs.signedReleaseFile}}\n          track: internal\n          whatsNewDirectory: whatsnew\n          status: completed\n          mappingFile: app/build/outputs/mapping/blueRelease/mapping.txt\n"
  },
  {
    "path": ".github/workflows/deploy-test.yml",
    "content": "# Deploy Tusky Nightly on each push to develop\n\nname: Deploy Tusky Nightly to Google Play\n\non:\n  push:\n    branches:\n      - develop\n\nconcurrency:\n  group: ${{ github.workflow }}\n  cancel-in-progress: true\n\njobs:\n  check-and-build:\n    uses: ./.github/workflows/check-and-build.yml\n  deploy:\n    runs-on: ubuntu-latest\n    needs: check-and-build\n    environment: Test\n    env:\n      BUILD_NUMBER: ${{ github.run_number }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Setup\n        uses: ./.github/actions/setup\n\n      - name: Set versionCode\n        run: |\n          export VERSION_CODE=$(( ${BUILD_NUMBER} + 11000 ))\n          sed -i'.original' -e \"s/^\\([[:space:]]*versionCode[[:space:]]*\\)[0-9]*/\\\\1$VERSION_CODE/\" app/build.gradle\n\n      - name: Build Green aab\n        run: ./gradlew app:bundleGreenRelease\n\n      - uses: r0adkll/sign-android-release@f30bdd30588842ac76044ecdbd4b6d0e3e813478\n        name: Sign Tusky Green aab\n        id: sign_aab\n        with:\n          releaseDirectory: app/build/outputs/bundle/greenRelease\n          signingKeyBase64: ${{ secrets.KEYSTORE }}\n          alias: ${{ secrets.KEY_ALIAS }}\n          keyStorePassword: ${{ secrets.KEYSTORE_PASSWORD }}\n          keyPassword: ${{ secrets.KEY_PASSWORD }}\n\n      - name: Generate whatsnew\n        id: generate-whatsnew\n        run: |\n          mkdir whatsnew\n          git log -3 --pretty=%B | head -c 500 > whatsnew/whatsnew-en-US\n\n      - name: Upload AAB to Google Play\n        id: upload-release-asset-aab\n        uses: r0adkll/upload-google-play@v1.1.3\n        with:\n          serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}\n          packageName: com.keylesspalace.tusky.test\n          releaseFiles: ${{steps.sign_aab.outputs.signedReleaseFile}}\n          track: production\n          whatsNewDirectory: whatsnew\n          status: completed\n          mappingFile: app/build/outputs/mapping/greenRelease/mapping.txt\n"
  },
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea\n.DS_Store\nbuild\n/captures\n.externalNativeBuild\napp/release\napp-release.apk\n.kotlin\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Tusky changelog\n\n## Unreleased or Tusky Nightly\n\n### New features and other improvements\n\n### Significant bug fixes\n\n## v29.0\n\n### New features and other improvements\n\n- New iconset https://github.com/tuskyapp/Tusky/pull/5012\n- The layout of polls has been improved and a \"show results\" button was added https://github.com/tuskyapp/Tusky/pull/4980 https://github.com/tuskyapp/Tusky/pull/5047 https://github.com/tuskyapp/Tusky/pull/5095\n- Support for the \"blur\" filter action (Mastodon 4.4 feature) https://github.com/tuskyapp/Tusky/pull/5038\n- The quality of the image viewer has been improved https://github.com/tuskyapp/Tusky/pull/5068 https://github.com/tuskyapp/Tusky/pull/5067\n- An additional dialog will now prevent accidentally dismissing the media caption dialog https://github.com/tuskyapp/Tusky/pull/4999\n- Tusky will now send a `delete_media` parameter when deleting a post to help servers clean up their media faster (Mastodon 4.4 feature) https://github.com/tuskyapp/Tusky/pull/5082\n- Boosts and favorites are now confirmed via a bottom sheet instead of a drop down https://github.com/tuskyapp/Tusky/pull/5084\n- All account list views now have better error handling https://github.com/tuskyapp/Tusky/pull/5028\n- Support for Android 16 https://github.com/tuskyapp/Tusky/pull/5071\n- Several internal code improvements https://github.com/tuskyapp/Tusky/pull/5036 https://github.com/tuskyapp/Tusky/pull/5094 https://github.com/tuskyapp/Tusky/pull/5055 https://github.com/tuskyapp/Tusky/pull/5024\n- Improved localizations\n\n### Significant bug fixes\n\n- caches are now correctly deleted when logging out https://github.com/tuskyapp/Tusky/pull/4997 https://github.com/tuskyapp/Tusky/pull/5004\n- several layout fixes on Android 15+ https://github.com/tuskyapp/Tusky/pull/5053 https://github.com/tuskyapp/Tusky/pull/5041 https://github.com/tuskyapp/Tusky/pull/5003\n- fixes a crash that occurs when Tusky is used on a device with two or more UnifiedPush providers https://github.com/tuskyapp/Tusky/pull/5015\n\n## v28.0\n\n### New features and other improvements\n\n- Support for Android 15 and edge-to-edge mode https://github.com/tuskyapp/Tusky/pull/4897\n- Improves the reliability of push notifications https://github.com/tuskyapp/Tusky/pull/4896 https://github.com/tuskyapp/Tusky/pull/4883\n- Replies in timeline are now clearly marked as such by a text above them https://github.com/tuskyapp/Tusky/pull/4834\n- Several improvements to how notifications are rendered in the notifications tab https://github.com/tuskyapp/Tusky/pull/4929\n  - support for the new Mastodon 4.3 notification types `severed_relationships` and `moderation_warning`\n  - The \"unknown notification type\" notification now shows the unknown type and a info dialog when you click it\n  - The account note is now shown again for follow request and follow notifications\n  - The icon for the \"<user> just posted\" notification is now a bell instead of a home\n  - Adds a text above mention notifications that indicates if it is a (private) reply or (private) mention\n  - Follow requests won't be filtered by default in the notification tab. This change will only affect new logins and not existing ones.\n- Link Preview Cards got a new design and now support the fediverse:creator feature https://github.com/tuskyapp/Tusky/pull/4782\n- The possible selections for mute durations are now 1 hour, 6 hours, 1 day, 7 days, 30 days and 180 days https://github.com/tuskyapp/Tusky/pull/4943\n- The rendering of trending tags has been improved https://github.com/tuskyapp/Tusky/pull/4889 https://github.com/tuskyapp/Tusky/pull/4924\n- The app will no longer make database queries on the main thread, which improves performance https://github.com/tuskyapp/Tusky/pull/4786\n- Wellbeing mode will no longer hide the \"follows you\" badge on profiles https://github.com/tuskyapp/Tusky/pull/4940\n- It is now possible to select boost visibility when the \"Show confirmation before boosting\" option is active https://github.com/tuskyapp/Tusky/pull/4944\n\n### Significant bug fixes\n\n- Fixes a bug where more than 4 profile fields could not be edited (on instances that allow more than 4) https://github.com/tuskyapp/Tusky/commit/1157be18cf3bbd44426f4cdaae35e69b9f3cecca\n- Fixes a bug where a dropdown was partially hidden by the keyboard https://github.com/tuskyapp/Tusky/pull/4913\n- Tusky side timeline filters apply to own posts again https://github.com/tuskyapp/Tusky/pull/4879\n- Fixes a bug where media previews would flicker when interacting with a post https://github.com/tuskyapp/Tusky/pull/4971\n- Tusky now ignores invalid publishing dates of preview cards that caused some posts not to load https://github.com/tuskyapp/Tusky/pull/4993\n\n## v27.2\n\n### Significant bug fixes\n\n- The title of a hashtag tab now shows the actual hashtags again (instead of just \"Hashtags\") https://github.com/tuskyapp/Tusky/pull/4868\n- Makes sure the background color of a dialogs is correct https://github.com/tuskyapp/Tusky/pull/4864\n- Fixes an issue where Tusky would freeze while loading a timeline gap https://github.com/tuskyapp/Tusky/pull/4865\n\n## v27.1\n\n### New features and other improvements\n\n- The width of the tab indicator has been increased https://github.com/tuskyapp/Tusky/pull/4849\n\n### Significant bug fixes\n\n- Improves rendering of some animated custom emojis https://github.com/tuskyapp/Tusky/pull/4281\n- Fixes an issue where the input field for media descriptions was too small in some cases https://github.com/tuskyapp/Tusky/pull/4831\n- Fixes an issue where hashtags at the end of posts were duplicated https://github.com/tuskyapp/Tusky/pull/4845\n- Fixes an issue that prevented lists from being edited https://github.com/tuskyapp/Tusky/pull/4851\n\n## v27.0\n\n### New features and other improvements\n\n- Tusky has been redesigned with Material 3 https://github.com/tuskyapp/Tusky/pull/4637 https://github.com/tuskyapp/Tusky/pull/4673\n- Support for Notification Policies (Mastodon 4.3 feature) https://github.com/tuskyapp/Tusky/pull/4768\n- Hashtags at the end of posts are now shown in a separate bar https://github.com/tuskyapp/Tusky/pull/4761\n- Full support for folding devices https://github.com/tuskyapp/Tusky/pull/4689\n- Improved post rendering in some edge cases https://github.com/tuskyapp/Tusky/pull/4650 https://github.com/tuskyapp/Tusky/pull/4672 https://github.com/tuskyapp/Tusky/pull/4723\n- Descriptions can now be added to audio attachments https://github.com/tuskyapp/Tusky/pull/4711\n- The screen keyboard now pops up automatically when opening a dialog that contains a textfield https://github.com/tuskyapp/Tusky/pull/4667\n\n### Significant bug fixes\n\n- fixes a bug where Tusky would drop your draft when switching apps https://github.com/tuskyapp/Tusky/pull/4685 https://github.com/tuskyapp/Tusky/pull/4813 https://github.com/tuskyapp/Tusky/pull/4818\n- fixes a bug where Tusky would drop media that is being added to a post https://github.com/tuskyapp/Tusky/pull/4662\n- fixes a bug that caused the login to fail in some cases https://github.com/tuskyapp/Tusky/pull/4704\n\n## v26.2\n\n### Significant bug fixes\n\n- Fixes a bug where Tusky would not correctly switch between accounts https://github.com/tuskyapp/Tusky/pull/4636\n- Fixes a crash when a status in a notification contains a reblog (happens when subscribed to a Friendica group) https://github.com/tuskyapp/Tusky/pull/4638\n- Long video descriptions can no longer cover the video controls https://github.com/tuskyapp/Tusky/pull/4632\n- Fixes a bug where Tusky's URL detection algorithm was different from Mastodon's https://github.com/tuskyapp/Tusky/pull/4642\n\n## v26.1\n\n### New features and other improvements\n\n- The \"Reply privacy\" account preference now has two additional options: \"Match default post privacy\" and \"Direct\". \"Match default post privacy\" is the default for new accounts. https://github.com/tuskyapp/Tusky/pull/4568\n- Tusky now includes ISRG root certificates to keep working on Android 7 and servers that use Let's Encrypt. https://github.com/tuskyapp/Tusky/pull/4609\n- The soft keyboard will now be hidden after performing a search. https://github.com/tuskyapp/Tusky/pull/4578\n\n### Significant bug fixes\n\n- Fixes a bug where Tusky sometimes mixes up timelines and/or notifications of accounts. https://github.com/tuskyapp/Tusky/pull/4577 https://github.com/tuskyapp/Tusky/pull/4599\n- Fixes two bugs where Tusky would not provide the translation option even though the server is configured correctly. https://github.com/tuskyapp/Tusky/pull/4560 https://github.com/tuskyapp/Tusky/pull/4590\n- Fixes a rare bug where Tusky would sometimes randomly crash on startup. https://github.com/tuskyapp/Tusky/pull/4569\n- Fixes a bug where the timeline would randomly jump to the position of the last clicked \"show more\" placeholder when \"Reading order\" was set to \"Oldest first\". https://github.com/tuskyapp/Tusky/pull/4619\n\n## v26.0\n\n### New features and other improvements\n\n- The blue primary color that previously was the same for all themes is now slightly lighter in the dark theme and darker in the light theme for better contrast.\n  Consequently, the color that is used on top of the primary color (e.g. on buttons) is now dark instead of white in the dark theme. [PR#3921](https://github.com/tuskyapp/Tusky/pull/3921) [PR#4507](https://github.com/tuskyapp/Tusky/pull/4507)\n- New account preference \"default reply privacy\".\n  Note that in contrast to the \"default post privacy\" this setting will not be synced with the server as Mastodon does not have this feature. [PR#4496](https://github.com/tuskyapp/Tusky/pull/4496)\n- New preference \"Show confirmation before following\" [PR#4445](https://github.com/tuskyapp/Tusky/pull/4445)\n- The notification tab is now cached on the device for better offline behavior.\n  Since it shares the cache with the home timeline, interactions with posts will now sync between those tabs more often than before. [PR#4026](https://github.com/tuskyapp/Tusky/pull/4026)\n- Tusky will now only make one call to the server to check which version of the filters api is supported and cache the result instead of everytime filters are needed. [PR#4539](https://github.com/tuskyapp/Tusky/pull/4539)\n- The \"Hide compose button while scrolling\" preference, which had the main purpose of making content behind the button accessible, has been removed and bottom padding added to all lists that could be obscured by buttons. [PR#4486](https://github.com/tuskyapp/Tusky/pull/4486)\n- When viewing media of a translated post the media descriptions will now also be translated [PR#4463](https://github.com/tuskyapp/Tusky/pull/4463)\n- The custom emojis in the emoji picker are now sorted by category [PR#4533](https://github.com/tuskyapp/Tusky/pull/4533)\n- Various internal refactorings to improve performance and maintainability.\n  [PR#4515](https://github.com/tuskyapp/Tusky/pull/4515)\n  [PR#4502](https://github.com/tuskyapp/Tusky/pull/4502)\n  [PR#4472](https://github.com/tuskyapp/Tusky/pull/4472)\n  [PR#4470](https://github.com/tuskyapp/Tusky/pull/4470)\n  [PR#4443](https://github.com/tuskyapp/Tusky/pull/4443)\n  [PR#4441](https://github.com/tuskyapp/Tusky/pull/4441)\n  [PR#4461](https://github.com/tuskyapp/Tusky/pull/4461)\n  [PR#4447](https://github.com/tuskyapp/Tusky/pull/4447)\n  [PR#4411](https://github.com/tuskyapp/Tusky/pull/4411)\n  [PR#4413](https://github.com/tuskyapp/Tusky/pull/4413)\n\n### Significant bug fixes\n\n- Posts with null media focus values will no longer cause Tusky to show an error [PR#4462](https://github.com/tuskyapp/Tusky/pull/4462)\n- A lot of other bugfixes, mostly smaller display bugs\n  [PR#4536](https://github.com/tuskyapp/Tusky/pull/4536)\n  [PR#4537](https://github.com/tuskyapp/Tusky/pull/4537)\n  [PR#4527](https://github.com/tuskyapp/Tusky/pull/4527)\n  [PR#4521](https://github.com/tuskyapp/Tusky/pull/4521)\n  [PR#4525](https://github.com/tuskyapp/Tusky/pull/4525)\n  [PR#4518](https://github.com/tuskyapp/Tusky/pull/4518)\n  [PR#4514](https://github.com/tuskyapp/Tusky/pull/4514)\n  [PR#4491](https://github.com/tuskyapp/Tusky/pull/4491)\n  [PR#4490](https://github.com/tuskyapp/Tusky/pull/4490)\n  [PR#4474](https://github.com/tuskyapp/Tusky/pull/4474)\n  [PR#4436](https://github.com/tuskyapp/Tusky/pull/4436)\n\n## v25.2\n\n### Significant bug fixes\n\n- Fixes a bug that could sometimes crash Tusky when rotating the screen while viewing an account list [PR#4430](https://github.com/tuskyapp/Tusky/pull/4430)\n- Fixes a bug that could crash Tusky at startup under certain conditions [PR#4431](https://github.com/tuskyapp/Tusky/pull/4431)\n- Fixes a bug that caused Tusky to crash when custom emojis with too large dimensions were loaded [PR#4429](https://github.com/tuskyapp/Tusky/pull/4429)\n- Makes Tusky work again with Iceshrimp by working around a quirk in their API implementation [PR#4426](https://github.com/tuskyapp/Tusky/pull/4426)\n- Fixes a bug that made translations not work on some servers [PR#4422](https://github.com/tuskyapp/Tusky/pull/4422)\n\n## v25.1\n\n### Significant bug fixes\n\n- Fixed two crashes at startup introduced in 25.0 [PR#4415](https://github.com/tuskyapp/Tusky/pull/4415) [PR#4417](https://github.com/tuskyapp/Tusky/pull/4417)\n\n## v25.0\n\n### New features and other improvements\n\n- Added support for the [Mastodon translation api](https://docs.joinmastodon.org/methods/statuses/#translate).\n  You can now find a new option \"translate\" in the three-dot-menu on posts that are not in your display language when your server supports the translation api.\n  Support is determined by checking the `configuration.translation.enabled` attribute of the `/api/v2/instance` endpoint.\n  [PR#4307](https://github.com/tuskyapp/Tusky/pull/4307)\n- The language of a post is now shown in the metadata section of the detail post view, if it is available. [PR#4127](https://github.com/tuskyapp/Tusky/pull/4127)\n- The transitions between screens have been changed to feel faster and align more with default Android transitions. [PR#4285](https://github.com/tuskyapp/Tusky/pull/4285)\n- The post statistic section below the detail post view is now always shown to prevent layout shifts on the first like or boost.\n  [PR#4205](https://github.com/tuskyapp/Tusky/pull/4205) [PR#4260](https://github.com/tuskyapp/Tusky/pull/4260)\n- The filters for boosts/replies/self-boosts in the home timeline have moved from general preferences to account specific preferences. [PR#4115](https://github.com/tuskyapp/Tusky/pull/4115)\n- The json parsing library has been migrated from Gson to Moshi. This change will make Tusky no longer crash on unexpected server responses. [PR#4309](https://github.com/tuskyapp/Tusky/pull/4309)\n- Small layout improvements to the header of the profile view [PR#4375](https://github.com/tuskyapp/Tusky/pull/4375) [PR#4371](https://github.com/tuskyapp/Tusky/pull/4371)\n- support for Android 14 Upside Down Cake [PR#4224](https://github.com/tuskyapp/Tusky/pull/4224)\n- Various internal refactorings to improve performance and maintainability.\n  [PR#4269](https://github.com/tuskyapp/Tusky/pull/4269)\n  [PR#4290](https://github.com/tuskyapp/Tusky/pull/4290)\n  [PR#4291](https://github.com/tuskyapp/Tusky/pull/4291)\n  [PR#4296](https://github.com/tuskyapp/Tusky/pull/4296)\n  [PR#4364](https://github.com/tuskyapp/Tusky/pull/4364)\n  [PR#4366](https://github.com/tuskyapp/Tusky/pull/4366)\n  [PR#4372](https://github.com/tuskyapp/Tusky/pull/4372)\n  [PR#4356](https://github.com/tuskyapp/Tusky/pull/4356)\n  [PR#4348](https://github.com/tuskyapp/Tusky/pull/4348)\n  [PR#4339](https://github.com/tuskyapp/Tusky/pull/4339)\n  [PR#4337](https://github.com/tuskyapp/Tusky/pull/4337)\n  [PR#4336](https://github.com/tuskyapp/Tusky/pull/4336)\n  [PR#4330](https://github.com/tuskyapp/Tusky/pull/4330)\n  [PR#4235](https://github.com/tuskyapp/Tusky/pull/4235)\n  [PR#4081](https://github.com/tuskyapp/Tusky/pull/4081)\n\n### Significant bug fixes\n\n- The setting to hide the notification filter bar that was accidentally removed is back. [PR#4225](https://github.com/tuskyapp/Tusky/pull/4225)\n- The profile picture in the bottom navigation bar now has the correct content description. [PR#4400](https://github.com/tuskyapp/Tusky/pull/4400)\n\n## v24.1\n\n- The screen will stay on again while a video is playing. [PR#4168](https://github.com/tuskyapp/Tusky/pull/4168)\n- A memory leak has been fixed. This should improve stability and performance. [PR#4150](https://github.com/tuskyapp/Tusky/pull/4150) [PR#4153](https://github.com/tuskyapp/Tusky/pull/4153)\n- Emojis are now correctly counted as 1 character when composing a post. [PR#4152](https://github.com/tuskyapp/Tusky/pull/4152)\n- Fixed a crash when text was selected on some devices. [PR#4166](https://github.com/tuskyapp/Tusky/pull/4166)\n- The icons in the help texts of empty timelines will now always be correctly\n  aligned. [PR#4179](https://github.com/tuskyapp/Tusky/pull/4179)\n- Fixed ANR caused by direct message badge [PR#4182](https://github.com/tuskyapp/Tusky/pull/4182)\n\n## v24.0\n\n### New features and other improvements\n\n- The number of tabs that can be configured is no longer limited. [PR#4058](https://github.com/tuskyapp/Tusky/pull/4058)\n- Blockquotes and code blocks in posts now look nicer [PR#4090](https://github.com/tuskyapp/Tusky/pull/4090) [PR#4091](https://github.com/tuskyapp/Tusky/pull/4091)\n- The old behavior of the notification tab (pre Tusky 22.0) has been restored. [PR#4015](https://github.com/tuskyapp/Tusky/pull/4015)\n- Role badges are now shown on profiles (Mastodon 4.2 feature). [PR#4029](https://github.com/tuskyapp/Tusky/pull/4029)\n- The video player has been upgraded to Google Jetpack Media3; video compatibility should be improved, and you can now adjust playback speed. [PR#3857](https://github.com/tuskyapp/Tusky/pull/3857)\n- New theme option to use the black theme when following the system design. [PR#3957](https://github.com/tuskyapp/Tusky/pull/3957)\n- Following the system design is now the default theme setting. [PR#3813](https://github.com/tuskyapp/Tusky/pull/3957)\n- A new view to see trending posts is available both in the menu and as custom tab. [PR#4007](https://github.com/tuskyapp/Tusky/pull/4007)\n- A new option to hide self boosts has been added. [PR#4101](https://github.com/tuskyapp/Tusky/pull/4101)\n- The `api/v2/instance` endpoint is now supported. [PR#4062](https://github.com/tuskyapp/Tusky/pull/4062)\n- New settings for lists:\n    - Hide from the home timeline [PR#3932](https://github.com/tuskyapp/Tusky/pull/3932)\n    - Decide which replies should be shown in the list [PR#4072](https://github.com/tuskyapp/Tusky/pull/4072)\n- The oldest supported Android version is now Android 7 Nougat [PR#4014](https://github.com/tuskyapp/Tusky/pull/4014)\n\n### Significant bug fixes\n\n- **Empty trends no longer causes Tusky to crash**, [PR#3853](https://github.com/tuskyapp/Tusky/pull/3853)\n\n\n## v23.0\n\n### New features and other improvements\n\n- **New preference to scale UI text**, [PR#3248](https://github.com/tuskyapp/Tusky/pull/3248) by [@nikclayton](https://mastodon.social/@nikclayton)\n\n### Significant bug fixes\n\n- **Save account information correctly**, [PR#3720](https://github.com/tuskyapp/Tusky/pull/3720) by [@connyduck](https://chaos.social/@ConnyDuck)\n  - If you were logged in with multiple accounts it was possible to switch accounts in a way that the UI showed the new account, but database operations were happening using the old account.\n- **\"pull\" notifications on devices running Android versions <= 11**, [PR#3649](https://github.com/tuskyapp/Tusky/pull/3649) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Pull notifications (i.e., not using ntfy.sh) could silently fail on devices running Android 11 and below\n- **Work around Android bug where text fields could \"forget\" they can copy/paste**, [PR#3707](https://github.com/tuskyapp/Tusky/pull/3707) by [@nikclayton](https://mastodon.social/@nikclayton)\n- **Viewing \"diffs\" in edit history will not extend off screen edge**, [PR#3431](https://github.com/tuskyapp/Tusky/pull/3431) by [@nikclayton](https://mastodon.social/@nikclayton)\n- **Don't crash if your server has no post edit history**, [PR#3747](https://github.com/tuskyapp/Tusky/pull/3747) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Your Mastodon server might know that a post has been edited, but not know the details of those edits. Trying to view the history of those statuses no longer crashes.\n- **Add a \"Delete\" button when editing a filter**, [PR#3553](https://github.com/tuskyapp/Tusky/pull/3553) by [@Tak](https://mastodon.gamedev.place/@Tak)\n- **Show non-square emoji correctly**, [PR#3711](https://github.com/tuskyapp/Tusky/pull/3711) by [@connyduck](https://chaos.social/@ConnyDuck)\n- **Potential crash when editing profile fields**, [PR#3808](https://github.com/tuskyapp/Tusky/pull/3808) by [@nikclayton](https://mastodon.social/@nikclayton)\n- **Oversized context menu when editing image descriptions**, [PR#3787](https://github.com/tuskyapp/Tusky/pull/3787) by [@connyduck](https://chaos.social/@ConnyDuck)\n\n## v23.0 beta 2\n\n### Significant bug fixes\n\n- **Potential crash when editing profile fields**, [PR#3808](https://github.com/tuskyapp/Tusky/pull/3808) by [@nikclayton](https://mastodon.social/@nikclayton)\n- **Oversized context menu when editing image descriptions**, [PR#3787](https://github.com/tuskyapp/Tusky/pull/3787) by [@connyduck](https://chaos.social/@ConnyDuck)\n\n## v23.0 beta 1\n\n### New features and other improvements\n\n- **New preference to scale UI text**, [PR#3248](https://github.com/tuskyapp/Tusky/pull/3248) by [@nikclayton](https://mastodon.social/@nikclayton)\n\n### Significant bug fixes\n\n- **Save account information correctly**, [PR#3720](https://github.com/tuskyapp/Tusky/pull/3720) by [@connyduck](https://chaos.social/@ConnyDuck)\n  - If you were logged in with multiple accounts it was possible to switch accounts in a way that the UI showed the new account, but database operations were happening using the old account.\n- **\"pull\" notifications on devices running Android versions <= 11**, [PR#3649](https://github.com/tuskyapp/Tusky/pull/3649) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Pull notifications (i.e., not using ntfy.sh) could silently fail on devices running Android 11 and below\n- **Work around Android bug where text fields could \"forget\" they can copy/paste**, [PR#3707](https://github.com/tuskyapp/Tusky/pull/3707) by [@nikclayton](https://mastodon.social/@nikclayton)\n- **Viewing \"diffs\" in edit history will not extend off screen edge**, [PR#3431](https://github.com/tuskyapp/Tusky/pull/3431) by [@nikclayton](https://mastodon.social/@nikclayton)\n- **Don't crash if your server has no post edit history**, [PR#3747](https://github.com/tuskyapp/Tusky/pull/3747) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Your Mastodon server might know that a post has been edited, but not know the details of those edits. Trying to view the history of those statuses no longer crashes.\n- **Add a \"Delete\" button when editing a filter**, [PR#3553](https://github.com/tuskyapp/Tusky/pull/3553) by [@Tak](https://mastodon.gamedev.place/@Tak)\n- **Show non-square emoji correctly**, [PR#3711](https://github.com/tuskyapp/Tusky/pull/3711) by [@connyduck](https://chaos.social/@ConnyDuck)\n\n## v22.0\n\n### New features and other improvements\n\n- **View trending hashtags**, [PR#3149](https://github.com/tuskyapp/Tusky/pull/3149) by [@knossos](https://fosstodon.org/@knossos)\n  - View trending hashtags from the side menu, or by adding them to a new tab.\n- **Edit image description and focus point**, [PR#3215](https://github.com/tuskyapp/Tusky/pull/3215) by [@Tak](https://mastodon.gamedev.place/@Tak)\n  - Edit image descriptions and focus points when editing posts.\n- **View profile banner images**, [PR#3274](https://github.com/tuskyapp/Tusky/pull/3274) by [@Tak](https://mastodon.gamedev.place/@Tak)\n  - Tap the banner image on any profile to view it full size, save, share, etc.\n- **Follow new hashtags**, [PR#3275](https://github.com/tuskyapp/Tusky/pull/3275) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Follow new hashtags from the \"Followed hashtags\" screen.\n- **Better ordering when selecting languages**, [PR#3293](https://github.com/tuskyapp/Tusky/pull/3293) by [@Tak](https://mastodon.gamedev.place/@Tak)\n  - Tusky will prioritise the language of the post being replied to, your default posting language, configured Tusky languages, and configured system languages when ordering the list of languages to post in.\n- **\"Load more\" break is more prominent**, [PR#3376](https://github.com/tuskyapp/Tusky/pull/3376) by [@lakoja](https://freiburg.social/@lakoja)\n  - Adjusted the design so the \"Load more\" break in a timeline is more obvious.\n- **Add \"Refresh\" menu**, [PR#3121](https://github.com/tuskyapp/Tusky/pull/3121) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Tusky timelines can now be refreshed from a menu as well as swiping, making this accessible to assistive devices.\n- **Notifications timeline improvements**, [PR#3159](https://github.com/tuskyapp/Tusky/pull/3159) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Notifications no longer need to \"Load more\", they are loaded automatically as you scroll.\n  - Errors when interacting with notifications are displayed to the user, with a \"Retry\" option.\n- **Show the difference between versions of a post**, [PR#3314](https://github.com/tuskyapp/Tusky/pull/3314) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Viewing the edits to a post highlights the differences (text that was added or deleted) between the different versions.\n- **Support Mastodon v4 filters**, [PR#3188](https://github.com/tuskyapp/Tusky/pull/3188) by [@Tak](https://mastodon.gamedev.place/@Tak)\n  - Mastodon v4 introduced additional [filtering controls](https://docs.joinmastodon.org/user/moderating/#filters).\n- **Option to show post statistics in the timeline**, [PR#3413](https://github.com/tuskyapp/Tusky/pull/3413)\n  - Tusky can now (optionally) show the number of replies, reposts, and favourites a post has received, in the timeline.\n- **Expanded tappable area for links, hashtags, and mentions in a post**, [PR#3382](https://github.com/tuskyapp/Tusky/pull/3382) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Links, hashtags, and mentions in a post now react to taps that are a little above, below, or to the side of the tappable text, making them more accessible.\n\n### Significant bug fixes\n\n- **Remember selected tab and position**, [PR#3255](https://github.com/tuskyapp/Tusky/pull/3255) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Changing your tab settings (adding, removing, re-ordering) remembers your reading position in those tabs.\n- **Show player controls during audio playback**, [PR#3286](https://github.com/tuskyapp/Tusky/pull/3286) by [@EricFrohnhoefer](https://mastodon.social/@EricFrohnhoefer)\n  - A regression from v21.0 where the media player controls could not be used.\n- **Keep notifications until read**, [PR#3312](https://github.com/tuskyapp/Tusky/pull/3312) by [@lakoja](https://freiburg.social/@lakoja)\n  - Opening Tusky would dismiss all active Tusky Android notifications.\n- **Fix copying URLs at the end of a post**, [PR#3380](https://github.com/tuskyapp/Tusky/pull/3380) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Copying a URL from the end of a post could include an extra Unicode whitespace character, making the URL unusable as is.\n- **Correctly display mixed RTL and LTR text in profiles**, [PR#3328](https://github.com/tuskyapp/Tusky/pull/3328) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Profile text that contained a mix of right-to-left and left-to-right writing directions would display incorrectly.\n- **Stop showing duplicates of edited posts in threads**, [PR#3377](https://github.com/tuskyapp/Tusky/pull/3377) by [@Tak](https://mastodon.gamedev.place/@Tak)\n  - Editing a post in thread view would show the old and new version of the post in the thread.\n- **Correct post length calculation**, [PR#3392](https://github.com/tuskyapp/Tusky/pull/3392) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - In a post that mentioned a user (e.g., `@tusky@mastodon.social`) Tusky was incorrectly including the `@mastodon.social` part when calculating the post's length, leading to incorrect \"This post is too long\" errors.\n- **Always publish image captions**, [PR#3421](https://github.com/tuskyapp/Tusky/pull/3421) by [@lakoja](https://freiburg.social/@lakoja)\n  - Finishing editing an image caption before the image had finished loading would lose the caption.\n- **Clicking \"Compose\" from a notification would set the wrong account**, [PR#3688](https://github.com/tuskyapp/Tusky/pull/3688)\n\n## v22.0 beta 7\n\n### Significant bug fixes\n\n- **Fetch all outstanding Mastodon notifications when creating Android notifications**, [PR#3700](https://github.com/tuskyapp/Tusky/pull/3700)\n- **Clicking \"Compose\" from a notification would set the wrong account**, [PR#3688](https://github.com/tuskyapp/Tusky/pull/3688)\n- **Ensure \"last read notification ID\" is saved to the correct account**, [PR#3697](https://github.com/tuskyapp/Tusky/pull/3697)\n\n## v22.0 beta 6\n\n### Significant bug fixes\n\n- **Save reading position in the Notifications tab more frequently**, [PR#3685](https://github.com/tuskyapp/Tusky/pull/3685)\n\n## v22.0 beta 5\n\n## Significant bug fixes\n\n- **Rolled back APNG library to fix broken animated emojis**, [PR#3676](https://github.com/tuskyapp/Tusky/pull/3676)\n- **Save local copy of notification marker in case server does not support the API**, [PR#3672](https://github.com/tuskyapp/Tusky/pull/3672)\n\n## v22.0 beta 4\n\n### Significant bug fixes\n\n- **Fixed repeated fetch of notifications if configured with multiple accounts**, [PR#3660](https://github.com/tuskyapp/Tusky/pull/3660)\n\n## v22.0 beta 3\n\n### Significant bug fixes\n\n- **Fixed crash when viewing a thread**, [PR#3622](https://github.com/tuskyapp/Tusky/pull/3622)\n- **Fixed crash processing Mastodon filters**, [PR#3634](https://github.com/tuskyapp/Tusky/pull/3634)\n- **Links in bios of follow/follow request notifications are clickable**, [PR#3646](https://github.com/tuskyapp/Tusky/pull/3646)\n- **Android Notifications updates**, [PR#3636](https://github.com/tuskyapp/Tusky/pull/3626)\n  - Android notification for a Mastodon notification should only be shown once\n  - Android notifications are grouped by Mastodon notification type (follow, mention, boost, etc)\n  - Potential for missing notifications has been removed\n\n## v22.0 beta 2\n\n### Significant bug fixes\n\n- **Improved notification loading speed**, [PR#3598](https://github.com/tuskyapp/Tusky/pull/3598)\n- **Restore showing 0/1/1+ for replies**, [PR#3590](https://github.com/tuskyapp/Tusky/pull/3590)\n- **Show filter titles, not filter keywords, on filtered posts**, [PR#3589](https://github.com/tuskyapp/Tusky/pull/3589)\n- **Fixed a bug where opening a status could open an unrelated link**, [PR#3600](https://github.com/tuskyapp/Tusky/pull/3600)\n- **Show \"Add\" button in correct place when there are no filters**, [PR#3561](https://github.com/tuskyapp/Tusky/pull/3561)\n- **Fixed assorted crashes**\n\n## v22.0 beta 1\n\n### New features and other improvements\n\n- **View trending hashtags**, [PR#3149](https://github.com/tuskyapp/Tusky/pull/3149) by [@knossos](https://fosstodon.org/@knossos)\n  - View trending hashtags from the side menu, or by adding them to a new tab.\n- **Edit image description and focus point**, [PR#3215](https://github.com/tuskyapp/Tusky/pull/3215) by [@Tak](https://mastodon.gamedev.place/@Tak)\n  - Edit image descriptions and focus points when editing posts.\n- **View profile banner images**, [PR#3274](https://github.com/tuskyapp/Tusky/pull/3274) by [@Tak](https://mastodon.gamedev.place/@Tak)\n  - Tap the banner image on any profile to view it full size, save, share, etc.\n- **Follow new hashtags**, [PR#3275](https://github.com/tuskyapp/Tusky/pull/3275) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Follow new hashtags from the \"Followed hashtags\" screen.\n- **Better ordering when selecting languages**, [PR#3293](https://github.com/tuskyapp/Tusky/pull/3293) by [@Tak](https://mastodon.gamedev.place/@Tak)\n  - Tusky will prioritise the language of the post being replied to, your default posting language, configured Tusky languages, and configured system languages when ordering the list of languages to post in.\n- **\"Load more\" break is more prominent**, [PR#3376](https://github.com/tuskyapp/Tusky/pull/3376) by [@lakoja](https://freiburg.social/@lakoja)\n  - Adjusted the design so the \"Load more\" break in a timeline is more obvious.\n- **Add \"Refresh\" menu**, [PR#3121](https://github.com/tuskyapp/Tusky/pull/3121) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Tusky timelines can now be refreshed from a menu as well as swiping, making this accessible to assistive devices.\n- **Notifications timeline improvements**, [PR#3159](https://github.com/tuskyapp/Tusky/pull/3159) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Notifications no longer need to \"Load more\", they are loaded automatically as you scroll.\n  - Errors when interacting with notifications are displayed to the user, with a \"Retry\" option.\n- **Show the difference between versions of a post**, [PR#3314](https://github.com/tuskyapp/Tusky/pull/3314) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Viewing the edits to a post highlights the differences (text that was added or deleted) between the different versions.\n- **Support Mastodon v4 filters**, [PR#3188](https://github.com/tuskyapp/Tusky/pull/3188) by [@Tak](https://mastodon.gamedev.place/@Tak)\n  - Mastodon v4 introduced additional [filtering controls](https://docs.joinmastodon.org/user/moderating/#filters).\n- **Option to show post statistics in the timeline**, [PR#3413](https://github.com/tuskyapp/Tusky/pull/3413)\n  - Tusky can now (optionally) show the number of replies, reposts, and favourites a post has received, in the timeline.\n- **Expanded tappable area for links, hashtags, and mentions in a post**, [PR#3382](https://github.com/tuskyapp/Tusky/pull/3382) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Links, hashtags, and mentions in a post now react to taps that are a little above, below, or to the side of the tappable text, making them more accessible.\n\n### Significant bug fixes\n\n- **Remember selected tab and position**, [PR#3255](https://github.com/tuskyapp/Tusky/pull/3255) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Changing your tab settings (adding, removing, re-ordering) remembers your reading position in those tabs.\n- **Show player controls during audio playback**, [PR#3286](https://github.com/tuskyapp/Tusky/pull/3286) by [@EricFrohnhoefer](https://mastodon.social/@EricFrohnhoefer)\n  - A regression from v21.0 where the media player controls could not be used.\n- **Keep notifications until read**, [PR#3312](https://github.com/tuskyapp/Tusky/pull/3312) by [@lakoja](https://freiburg.social/@lakoja)\n  - Opening Tusky would dismiss all active Tusky Android notifications.\n- **Fix copying URLs at the end of a post**, [PR#3380](https://github.com/tuskyapp/Tusky/pull/3380) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Copying a URL from the end of a post could include an extra Unicode whitespace character, making the URL unusable as is.\n- **Correctly display mixed RTL and LTR text in profiles**, [PR#3328](https://github.com/tuskyapp/Tusky/pull/3328) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - Profile text that contained a mix of right-to-left and left-to-right writing directions would display incorrectly.\n- **Stop showing duplicates of edited posts in threads**, [PR#3377](https://github.com/tuskyapp/Tusky/pull/3377) by [@Tak](https://mastodon.gamedev.place/@Tak)\n  - Editing a post in thread view would show the old and new version of the post in the thread.\n- **Correct post length calculation**, [PR#3392](https://github.com/tuskyapp/Tusky/pull/3392) by [@nikclayton](https://mastodon.social/@nikclayton)\n  - In a post that mentioned a user (e.g., `@tusky@mastodon.social`) Tusky was incorrectly including the `@mastodon.social` part when calculating the post's length, leading to incorrect \"This post is too long\" errors.\n- **Always publish image captions**, [PR#3421](https://github.com/tuskyapp/Tusky/pull/3421) by [@lakoja](https://freiburg.social/@lakoja)\n  - Finishing editing an image caption before the image had finished loading would lose the caption.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\nThanks for your interest in contributing to Tusky! Here are some informations to help you get started.\n\nIf you have any questions, don't hesitate to open an issue or join our [development chat on Matrix](https://riot.im/app/#/room/#Tusky:matrix.org).\n\n## Contributing translations\n\nTranslations are managed on our [Weblate](https://weblate.tusky.app/projects/tusky/tusky/). You can create an account and translate texts through the interface, no coding knowledge required.\nTo add a new language, click on the 'Start a new translation' button on at the bottom of the page.\n\n- Use gender-neutral language\n- Address users informally (e.g. in German \"du\" and never \"Sie\")\n\n## Contributing code\n\n### Prerequisites\nYou should have a general understanding of Android development and Git.\n\n### Architecture\nWe try to follow the [Guide to app architecture](https://developer.android.com/topic/architecture).\n\n### Kotlin\nTusky was originally written in Java, but is in the process of migrating to Kotlin. All new code must be written in Kotlin.\nWe try to follow the [Kotlin Style Guide](https://developer.android.com/kotlin/style-guide) and format the code according to the default [ktlint codestyle](https://github.com/pinterest/ktlint).\nYou can check the codestyle by running `./gradlew ktlintCheck lint`. This will fail if you have any errors, and produces a detailed report which also lists warnings.\nWe intentionally have very few hard linting errors, so that new contributors can focus on what they want to achieve instead of fighting the linter.\n\n### Text\nAll English text that will be visible to users must be put in `app/src/main/res/values/strings.xml` so it is translateable into other languages.\nTry to keep texts friendly and concise.\nIf there is untranslatable text that you don't want to keep as a string constant in Kotlin code, you can use the string resource file `app/src/main/res/values/donottranslate.xml`.\n\n### Viewbinding\nWe use [Viewbinding](https://developer.android.com/topic/libraries/view-binding) to reference views. No contribution using another mechanism will be accepted.\nThere are useful extensions in `src/main/java/com/keylesspalace/tusky/util/ViewExtensions.kt` that make working with viewbinding easier.\n\n### Themes\nThere are three themes in the app, so any visual changes should be checked with each of them to ensure they look appropriate no matter which theme is selected. Usually, you can use existing color attributes like `?attr/colorPrimary` and `?attr/textColorSecondary`.\n\n### Icons\nAll icons are from the rounded variant of the Material Symbols icon set with weight 400 and grade 0.\nNew icons can be found [here](https://fonts.google.com/icons?icon.style=Rounded&icon.size=24).\nUsually we prefer outlined icons, but there are cases where a filled one is a better choice.\nIf the icon needs to have an active/inactive state it is a good idea to use the outlined icon for the inactive and the filled one for the active state.\n\nIcons should be imported as vector drawables and named `ic_icon_name_sizedp_modifier.xml`, e.g. `ic_home_24dp` or `ic_notifications_24dp_filled`.\n\n### Accessibility\nWe try to make Tusky as accessible as possible for as many people as possible. Please make sure that all touch targets are at least 48dpx48dp in size, Text has sufficient contrast and images or icons have a image description. See [this guide](https://developer.android.com/guide/topics/ui/accessibility/apps) for more information.\n\n### Supported servers\nTusky is primarily a Mastodon client and aims to always support the newest Mastodon version. Other platforms implementing the Mastodon API, e.g. Akkoma, GoToSocial or Pixelfed should also work with Tusky, but no special effort is made to support their quirks or additional features.\n\n### Payment Policy\nOur payment policy may be viewed [here](https://github.com/tuskyapp/Tusky/blob/develop/doc/PaymentPolicy.md).\n\n## Troubleshooting / FAQ\n\n- Tusky should be built with the newest version of Android Studio.\n- Tusky comes with two sets of build variants, \"blue\" and \"green\", which can be installed simultaneously and are distinguished by the colors of their icons. Green is intended for local development and testing, whereas blue is for releases.\n\n## Resources\n- [Mastodon API documentation](https://docs.joinmastodon.org/api/)\n\n## AI policy\nTusky does not want any contributions, code or otherwise, created with so-called generative AI tools. Please only submit your own work.\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "This repository has moved to Codeberg: https://codeberg.org/tusky/Tusky\n\n# Tusky\n\n<img src=\"/fastlane/metadata/android/en-US/images/icon.png\" width=\"120\" height=\"120\"/>\n\n[<img src=\"/assets/fdroid_badge.png\" alt=\"Get it on F-Droid\" height=\"80\" />](https://f-droid.org/repository/browse/?fdid=com.keylesspalace.tusky)\n[<img src=\"https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png\" alt=\"Get it on Google Play\" height=\"80\" />](https://play.google.com/store/apps/details?id=com.keylesspalace.tusky&utm_source=github&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1)\n"
  },
  {
    "path": "app/build.gradle",
    "content": "import app.cash.licensee.SpdxId\n\nplugins {\n    alias(libs.plugins.android.application)\n    alias(libs.plugins.google.ksp)\n    alias(libs.plugins.hilt.android)\n    alias(libs.plugins.kotlin.android)\n    alias(libs.plugins.kotlin.parcelize)\n    alias(libs.plugins.licensee)\n}\n\napply from: 'getGitSha.gradle'\n\nfinal def gitSha = ext.getGitSha()\n\n// The app name\nfinal def APP_NAME = \"Tusky\"\n// The application id. Must be unique, e.g. based on your domain\nfinal def APP_ID = \"com.keylesspalace.tusky\"\n// url of a custom app logo. Recommended size at least 600x600. Keep empty to use the Tusky elephant friend.\nfinal def CUSTOM_LOGO_URL = \"\"\n// e.g. mastodon.social. Keep empty to not suggest any instance on the signup screen\nfinal def CUSTOM_INSTANCE = \"\"\n// link to your support account. Will be linked on the about page when not empty.\nfinal def SUPPORT_ACCOUNT_URL = \"https://mastodon.social/@Tusky\"\n\nandroid {\n    compileSdk 36\n    namespace \"com.keylesspalace.tusky\"\n    defaultConfig {\n        applicationId APP_ID\n        namespace \"com.keylesspalace.tusky\"\n        minSdk 24\n        targetSdk 36\n        versionCode 133\n        versionName \"29.0\"\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        vectorDrawables.useSupportLibrary = true\n\n        resValue \"string\", \"app_name\", APP_NAME\n\n        buildConfigField(\"String\", \"CUSTOM_LOGO_URL\", \"\\\"$CUSTOM_LOGO_URL\\\"\")\n        buildConfigField(\"String\", \"CUSTOM_INSTANCE\", \"\\\"$CUSTOM_INSTANCE\\\"\")\n        buildConfigField(\"String\", \"SUPPORT_ACCOUNT_URL\", \"\\\"$SUPPORT_ACCOUNT_URL\\\"\")\n    }\n    buildTypes {\n        debug {\n            isDefault true\n        }\n        release {\n            minifyEnabled true\n            shrinkResources true\n            proguardFiles 'proguard-rules.pro'\n\n            kotlinOptions {\n                freeCompilerArgs = [\n                    \"-Xno-param-assertions\",\n                    \"-Xno-call-assertions\",\n                    \"-Xno-receiver-assertions\"\n                ]\n            }\n        }\n    }\n\n    flavorDimensions += \"color\"\n    productFlavors {\n        blue {}\n        green {\n            resValue \"string\", \"app_name\", APP_NAME + \" Test\"\n            applicationIdSuffix \".test\"\n            versionNameSuffix \"-\" + gitSha\n            isDefault true\n        }\n    }\n\n    lint {\n        lintConfig file(\"lint.xml\")\n        // Regenerate by deleting the file and running `./gradlew app:lintGreenDebug`\n        baseline = file(\"lint-baseline.xml\")\n    }\n\n    buildFeatures {\n        buildConfig true\n        resValues true\n        viewBinding true\n    }\n\n    testOptions {\n        unitTests {\n            returnDefaultValues = true\n            includeAndroidResources = true\n        }\n        unitTests.all {\n            systemProperty 'robolectric.logging.enabled', 'true'\n            systemProperty 'robolectric.lazyload', 'ON'\n        }\n    }\n    sourceSets {\n        // workaround to have migrations available in unit tests\n        // https://github.com/robolectric/robolectric/issues/3928#issuecomment-395309991\n        debug.assets.srcDirs += files(\"$projectDir/schemas\".toString())\n    }\n\n    // Exclude unneeded files added by libraries\n    packagingOptions.resources.excludes += [\n        'LICENSE_OFL',\n        'LICENSE_UNICODE',\n        'META-INF/androidx/**',\n        'META-INF/NOTICE.md',\n        'DebugProbesKt.bin'\n    ]\n\n    bundle {\n        language {\n            // bundle all languages in every apk so the dynamic language switching works\n            enableSplit = false\n        }\n    }\n    dependenciesInfo {\n        includeInApk false\n        includeInBundle false\n    }\n    applicationVariants.configureEach { variant ->\n        variant.outputs.configureEach {\n            outputFileName = \"Tusky_${variant.versionName}_${variant.versionCode}_${gitSha}_\" +\n                \"${variant.flavorName}_${buildType.name}.apk\"\n        }\n    }\n}\n\nksp {\n    arg(\"room.schemaLocation\", \"$projectDir/schemas\")\n    arg(\"room.generateKotlin\", \"true\")\n    arg(\"room.incremental\", \"true\")\n}\n\nlicensee {\n    allow(SpdxId.Apache_20)\n    allow(SpdxId.MIT)\n    allowUrl('https://github.com/AOMediaCodec/libavif/blob/master/LICENSE')\n    allowUrl('https://www.bouncycastle.org/licence.html')\n}\n\nconfigurations {\n    // JNI-only libraries don't play nicely with Robolectric\n    // see https://github.com/tuskyapp/Tusky/pull/3367\n    testImplementation.exclude group: \"org.conscrypt\", module: \"conscrypt-android\"\n    testRuntime.exclude group: \"org.conscrypt\", module: \"conscrypt-android\"\n}\n\n// library versions are in PROJECT_ROOT/gradle/libs.versions.toml\ndependencies {\n    implementation libs.kotlinx.coroutines.android\n\n    implementation libs.bundles.androidx\n    implementation libs.bundles.room\n    ksp libs.androidx.room.compiler\n\n    implementation libs.android.material\n\n    implementation libs.bundles.moshi\n    ksp libs.moshi.kotlin.codegen\n\n    implementation libs.bundles.retrofit\n    implementation libs.networkresult.calladapter\n\n    implementation libs.bundles.okhttp\n    implementation libs.okio\n\n    implementation libs.conscrypt.android\n\n    implementation libs.bundles.glide\n    ksp libs.glide.compiler\n\n    implementation libs.hilt.android\n    ksp libs.hilt.compiler\n    implementation libs.androidx.hilt.work\n    ksp libs.androidx.hilt.compiler\n\n    implementation libs.sparkbutton\n\n    implementation libs.touchimageview\n\n    implementation libs.bundles.material.drawer\n\n    implementation libs.image.cropper\n\n    implementation libs.bundles.filemojicompat\n\n    implementation libs.bouncycastle\n    implementation libs.unified.push\n\n    implementation libs.bundles.xmldiff\n\n    testImplementation libs.androidx.test.junit\n    testImplementation libs.robolectric\n    testImplementation libs.bundles.mockito\n    testImplementation libs.mockwebserver\n    testImplementation libs.androidx.core.testing\n    testImplementation libs.androidx.room.testing\n    testImplementation libs.kotlinx.coroutines.test\n    testImplementation libs.androidx.work.testing\n    testImplementation libs.turbine\n}\n"
  },
  {
    "path": "app/getGitSha.gradle",
    "content": "import org.gradle.api.provider.ValueSourceParameters\nimport javax.inject.Inject\n\n// Must wrap this in a ValueSource in order to get well-defined fail behavior without confusing Gradle on repeat builds.\nabstract class GitShaValueSource implements ValueSource<String, ValueSourceParameters.None> {\n    @Inject abstract ExecOperations getExecOperations()\n\n    @Override String obtain() {\n        try {\n            def output = new ByteArrayOutputStream()\n\n            execOperations.exec {\n                it.commandLine 'git', 'rev-parse', '--short=8', 'HEAD'\n                it.standardOutput = output\n            }\n            return output.toString().trim()\n        } catch (GradleException ignore) {\n            // Git executable unavailable, or we are not building in a git repo. Fall through:\n        }\n        return \"unknown\"\n    }\n}\n\n// Export closure\next.getGitSha = {\n    providers.of(GitShaValueSource) {}.get()\n}\n"
  },
  {
    "path": "app/lint-baseline.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<issues format=\"6\" by=\"lint 8.9.2\" type=\"baseline\" client=\"gradle\" dependencies=\"false\" name=\"AGP (8.9.2)\" variant=\"all\" version=\"8.9.2\">\n\n    <issue\n        id=\"GestureBackNavigation\"\n        message=\"If intercepting back events, this should be handled through the registration of callbacks on the window level; Please see https://developer.android.com/about/versions/13/features/predictive-back-gesture\"\n        errorLine1=\"            if (keyCode == KeyEvent.KEYCODE_BACK) {\"\n        errorLine2=\"                           ~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt\"\n            line=\"1235\"\n            column=\"28\"/>\n    </issue>\n\n    <issue\n        id=\"DefaultLocale\"\n        message=\"Implicitly using the default locale is a common source of bugs: Use `toUpperCase(Locale)` instead. For strings meant to be internal use `Locale.ROOT`, otherwise `Locale.getDefault()`.\"\n        errorLine1=\"            sb.append(language.toUpperCase());\"\n        errorLine2=\"                               ~~~~~~~~~~~\">\n        <location\n            file=\"src/main/java/com/keylesspalace/tusky/adapter/StatusDetailedViewHolder.java\"\n            line=\"102\"\n            column=\"32\"/>\n    </issue>\n\n    <issue\n        id=\"InlinedApi\"\n        message=\"Field requires API level 29 (current min is 24): `android.text.style.DynamicDrawableSpan#ALIGN_CENTER`\"\n        errorLine1=\"            builder.setSpan(ImageSpan(drawable, DynamicDrawableSpan.ALIGN_CENTER), builder.length - 2, builder.length - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\"\n        errorLine2=\"                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/java/com/keylesspalace/tusky/viewdata/PollViewData.kt\"\n            line=\"74\"\n            column=\"49\"/>\n    </issue>\n\n    <issue\n        id=\"InlinedApi\"\n        message=\"Field requires API level 29 (current min is 24): `android.text.style.DynamicDrawableSpan#ALIGN_CENTER`\"\n        errorLine1=\"                builder.setSpan(ImageSpan(drawable, DynamicDrawableSpan.ALIGN_CENTER), index, index + iconName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\"\n        errorLine2=\"                                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/java/com/keylesspalace/tusky/util/SpanUtils.kt\"\n            line=\"122\"\n            column=\"53\"/>\n    </issue>\n\n    <issue\n        id=\"InvalidPackage\"\n        message=\"Invalid package reference in org.bouncycastle:bcprov-jdk15on; not included in Android: `javax.naming.directory`. Referenced from `org.bouncycastle.jce.provider.CrlCache`.\">\n        <location\n            file=\"$GRADLE_USER_HOME/caches/modules-2/files-2.1/org.bouncycastle/bcprov-jdk15on/1.70/4636a0d01f74acaf28082fb62b317f1080118371/bcprov-jdk15on-1.70.jar\"/>\n    </issue>\n\n    <issue\n        id=\"InvalidPackage\"\n        message=\"Invalid package reference in org.bouncycastle:bcprov-jdk15on; not included in Android: `javax.naming`. Referenced from `org.bouncycastle.jce.provider.X509LDAPCertStoreSpi`.\">\n        <location\n            file=\"$GRADLE_USER_HOME/caches/modules-2/files-2.1/org.bouncycastle/bcprov-jdk15on/1.70/4636a0d01f74acaf28082fb62b317f1080118371/bcprov-jdk15on-1.70.jar\"/>\n    </issue>\n\n    <issue\n        id=\"InvalidPackage\"\n        message=\"Invalid package reference in org.pageseeder.diffx:pso-diffx; not included in Android: `javax.xml.stream.events`. Referenced from `org.pageseeder.diffx.load.XMLEventLoader`.\">\n        <location\n            file=\"$GRADLE_USER_HOME/caches/modules-2/files-2.1/org.pageseeder.diffx/pso-diffx/1.1.2/4c1a9f04f2802b97a5ec1de2c241079b29044375/pso-diffx-1.1.2.jar\"/>\n    </issue>\n\n    <issue\n        id=\"InvalidPackage\"\n        message=\"Invalid package reference in org.pageseeder.diffx:pso-diffx; not included in Android: `javax.xml.stream`. Referenced from `org.pageseeder.diffx.format.StrictXMLDiffOutput`.\">\n        <location\n            file=\"$GRADLE_USER_HOME/caches/modules-2/files-2.1/org.pageseeder.diffx/pso-diffx/1.1.2/4c1a9f04f2802b97a5ec1de2c241079b29044375/pso-diffx-1.1.2.jar\"/>\n    </issue>\n\n    <issue\n        id=\"PrivateResource\"\n        message=\"Overriding `@layout/exo_player_control_view` which is marked as private in androidx.media3:media3-ui:1.6.1. If deliberate, use tools:override=&quot;true&quot;, otherwise pick a different name.\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"/>\n    </issue>\n\n    <issue\n        id=\"PrivateResource\"\n        message=\"The resource `@color/exo_bottom_bar_background` is marked as private in androidx.media3:media3-ui:1.6.1\"\n        errorLine1=\"        android:background=&quot;@color/exo_bottom_bar_background&quot;\"\n        errorLine2=\"                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"39\"\n            column=\"29\"/>\n    </issue>\n\n    <issue\n        id=\"PrivateResource\"\n        message=\"The resource `@dimen/exo_styled_controls_padding` is marked as private in androidx.media3:media3-ui:1.6.1\"\n        errorLine1=\"        android:padding=&quot;@dimen/exo_styled_controls_padding&quot;\"\n        errorLine2=\"                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"41\"\n            column=\"26\"/>\n    </issue>\n\n    <issue\n        id=\"PrivateResource\"\n        message=\"The resource `@layout/exo_player_control_rewind_button` is marked as private in androidx.media3:media3-ui:1.6.1\"\n        errorLine1=\"        &lt;include layout=&quot;@layout/exo_player_control_rewind_button&quot; />\"\n        errorLine2=\"                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"48\"\n            column=\"26\"/>\n    </issue>\n\n    <issue\n        id=\"PrivateResource\"\n        message=\"The resource `@layout/exo_player_control_ffwd_button` is marked as private in androidx.media3:media3-ui:1.6.1\"\n        errorLine1=\"        &lt;include layout=&quot;@layout/exo_player_control_ffwd_button&quot; />\"\n        errorLine2=\"                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"54\"\n            column=\"26\"/>\n    </issue>\n\n    <issue\n        id=\"PrivateResource\"\n        message=\"The resource `@dimen/exo_styled_bottom_bar_height` is marked as private in androidx.media3:media3-ui:1.6.1\"\n        errorLine1=\"        android:layout_height=&quot;@dimen/exo_styled_bottom_bar_height&quot;\"\n        errorLine2=\"                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"63\"\n            column=\"32\"/>\n    </issue>\n\n    <issue\n        id=\"PrivateResource\"\n        message=\"The resource `@dimen/exo_styled_bottom_bar_margin_top` is marked as private in androidx.media3:media3-ui:1.6.1\"\n        errorLine1=\"        android:layout_marginTop=&quot;@dimen/exo_styled_bottom_bar_margin_top&quot;\"\n        errorLine2=\"                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"64\"\n            column=\"35\"/>\n    </issue>\n\n    <issue\n        id=\"PrivateResource\"\n        message=\"The resource `@color/exo_bottom_bar_background` is marked as private in androidx.media3:media3-ui:1.6.1\"\n        errorLine1=\"        android:background=&quot;@color/exo_bottom_bar_background&quot;\"\n        errorLine2=\"                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"66\"\n            column=\"29\"/>\n    </issue>\n\n    <issue\n        id=\"PrivateResource\"\n        message=\"The resource `@dimen/exo_styled_bottom_bar_time_padding` is marked as private in androidx.media3:media3-ui:1.6.1\"\n        errorLine1=\"            android:paddingStart=&quot;@dimen/exo_styled_bottom_bar_time_padding&quot;\"\n        errorLine2=\"                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"72\"\n            column=\"35\"/>\n    </issue>\n\n    <issue\n        id=\"PrivateResource\"\n        message=\"The resource `@dimen/exo_styled_bottom_bar_time_padding` is marked as private in androidx.media3:media3-ui:1.6.1\"\n        errorLine1=\"            android:paddingEnd=&quot;@dimen/exo_styled_bottom_bar_time_padding&quot;\"\n        errorLine2=\"                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"73\"\n            column=\"33\"/>\n    </issue>\n\n    <issue\n        id=\"PrivateResource\"\n        message=\"The resource `@dimen/exo_styled_bottom_bar_time_padding` is marked as private in androidx.media3:media3-ui:1.6.1\"\n        errorLine1=\"            android:paddingLeft=&quot;@dimen/exo_styled_bottom_bar_time_padding&quot;\"\n        errorLine2=\"                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"74\"\n            column=\"34\"/>\n    </issue>\n\n    <issue\n        id=\"PrivateResource\"\n        message=\"The resource `@dimen/exo_styled_bottom_bar_time_padding` is marked as private in androidx.media3:media3-ui:1.6.1\"\n        errorLine1=\"            android:paddingRight=&quot;@dimen/exo_styled_bottom_bar_time_padding&quot;\"\n        errorLine2=\"                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"75\"\n            column=\"35\"/>\n    </issue>\n\n    <issue\n        id=\"PrivateResource\"\n        message=\"The resource `@dimen/exo_styled_progress_layout_height` is marked as private in androidx.media3:media3-ui:1.6.1\"\n        errorLine1=\"        android:layout_height=&quot;@dimen/exo_styled_progress_layout_height&quot;\"\n        errorLine2=\"                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"141\"\n            column=\"32\"/>\n    </issue>\n\n    <issue\n        id=\"PrivateResource\"\n        message=\"The resource `@dimen/exo_styled_progress_margin_bottom` is marked as private in androidx.media3:media3-ui:1.6.1\"\n        errorLine1=\"        android:layout_marginBottom=&quot;@dimen/exo_styled_progress_margin_bottom&quot;/>\"\n        errorLine2=\"                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"143\"\n            column=\"38\"/>\n    </issue>\n\n    <issue\n        id=\"PrivateResource\"\n        message=\"The resource `@dimen/exo_styled_minimal_controls_margin_bottom` is marked as private in androidx.media3:media3-ui:1.6.1\"\n        errorLine1=\"        android:layout_marginBottom=&quot;@dimen/exo_styled_minimal_controls_margin_bottom&quot;\"\n        errorLine2=\"                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"149\"\n            column=\"38\"/>\n    </issue>\n\n    <issue\n        id=\"PluralsCandidate\"\n        message=\"Formatting %d followed by words (&quot;posts&quot;): This should probably be a plural rather than a string\"\n        errorLine1=\"    &lt;string name=&quot;notification_summary_report_format&quot;>%1$s · %2$d posts attached&lt;/string>\"\n        errorLine2=\"    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/values/strings.xml\"\n            line=\"113\"\n            column=\"5\"/>\n    </issue>\n\n    <issue\n        id=\"PluralsCandidate\"\n        message=\"Formatting %d followed by words (&quot;and&quot;): This should probably be a plural rather than a string\"\n        errorLine1=\"    &lt;string name=&quot;pref_title_http_proxy_port_message&quot;>Port should be between %1$d and %2$d&lt;/string>\"\n        errorLine2=\"    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/values/strings.xml\"\n            line=\"326\"\n            column=\"5\"/>\n    </issue>\n\n    <issue\n        id=\"PluralsCandidate\"\n        message=\"Formatting %d followed by words (&quot;others&quot;): This should probably be a plural rather than a string\"\n        errorLine1=\"    &lt;string name=&quot;notification_summary_large&quot;>%1$s, %2$s, %3$s and %4$d others&lt;/string>\"\n        errorLine2=\"    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/values/strings.xml\"\n            line=\"397\"\n            column=\"5\"/>\n    </issue>\n\n    <issue\n        id=\"PluralsCandidate\"\n        message=\"Formatting %d followed by words (&quot;more&quot;): This should probably be a plural rather than a string\"\n        errorLine1=\"    &lt;string name=&quot;conversation_more_recipients&quot;>%1$s, %2$s and %3$d more&lt;/string>\"\n        errorLine2=\"    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/values/strings.xml\"\n            line=\"578\"\n            column=\"5\"/>\n    </issue>\n\n    <issue\n        id=\"PluralsCandidate\"\n        message=\"Formatting %d followed by words (&quot;people&quot;): This should probably be a plural rather than a string\"\n        errorLine1=\"    &lt;string name=&quot;accessibility_talking_about_tag&quot;>%1$d people are talking about hashtag %2$s&lt;/string>\"\n        errorLine2=\"    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/values/strings.xml\"\n            line=\"795\"\n            column=\"5\"/>\n    </issue>\n\n    <issue\n        id=\"PluralsCandidate\"\n        message=\"Formatting %d followed by words (&quot;people&quot;): This should probably be a plural rather than a string\"\n        errorLine1=\"    &lt;string name=&quot;notifications_from_people_you_may_know&quot;>Notifications from %1$d people you may know&lt;/string>\"\n        errorLine2=\"    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/values/strings.xml\"\n            line=\"872\"\n            column=\"5\"/>\n    </issue>\n\n    <issue\n        id=\"DataExtractionRules\"\n        message=\"The attribute `android:allowBackup` is deprecated from Android 12 and higher and may be removed in future versions. Consider adding the attribute `android:dataExtractionRules` specifying an `@xml` resource which configures cloud backups and device transfers on Android 12 and higher.\"\n        errorLine1=\"        android:allowBackup=&quot;false&quot;\"\n        errorLine2=\"                             ~~~~~\">\n        <location\n            file=\"src/main/AndroidManifest.xml\"\n            line=\"15\"\n            column=\"30\"/>\n    </issue>\n\n    <issue\n        id=\"NotifyDataSetChanged\"\n        message=\"It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort.\"\n        errorLine1=\"        accountFieldAdapter.notifyDataSetChanged()\"\n        errorLine2=\"        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/java/com/keylesspalace/tusky/components/account/AccountActivity.kt\"\n            line=\"485\"\n            column=\"9\"/>\n    </issue>\n\n    <issue\n        id=\"NotifyDataSetChanged\"\n        message=\"It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort.\"\n        errorLine1=\"        notifyDataSetChanged()\"\n        errorLine2=\"        ~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/java/com/keylesspalace/tusky/adapter/AccountFieldEditAdapter.kt\"\n            line=\"45\"\n            column=\"9\"/>\n    </issue>\n\n    <issue\n        id=\"NotifyDataSetChanged\"\n        message=\"It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort.\"\n        errorLine1=\"        notifyDataSetChanged()\"\n        errorLine2=\"        ~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/java/com/keylesspalace/tusky/adapter/AccountFieldEditAdapter.kt\"\n            line=\"51\"\n            column=\"9\"/>\n    </issue>\n\n    <issue\n        id=\"NotifyDataSetChanged\"\n        message=\"It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort.\"\n        errorLine1=\"        notifyDataSetChanged()\"\n        errorLine2=\"        ~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/java/com/keylesspalace/tusky/components/announcements/AnnouncementAdapter.kt\"\n            line=\"175\"\n            column=\"9\"/>\n    </issue>\n\n    <issue\n        id=\"NotifyDataSetChanged\"\n        message=\"It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort.\"\n        errorLine1=\"        notifyDataSetChanged()\"\n        errorLine2=\"        ~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/java/com/keylesspalace/tusky/adapter/PollAdapter.kt\"\n            line=\"64\"\n            column=\"9\"/>\n    </issue>\n\n    <issue\n        id=\"NotifyDataSetChanged\"\n        message=\"It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort.\"\n        errorLine1=\"        notifyDataSetChanged()\"\n        errorLine2=\"        ~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/java/com/keylesspalace/tusky/adapter/PreviewPollOptionsAdapter.kt\"\n            line=\"34\"\n            column=\"9\"/>\n    </issue>\n\n    <issue\n        id=\"NotifyDataSetChanged\"\n        message=\"It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort.\"\n        errorLine1=\"        notifyDataSetChanged()\"\n        errorLine2=\"        ~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/java/com/keylesspalace/tusky/adapter/TabAdapter.kt\"\n            line=\"54\"\n            column=\"9\"/>\n    </issue>\n\n    <issue\n        id=\"NotifyDataSetChanged\"\n        message=\"It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort.\"\n        errorLine1=\"            notifyDataSetChanged()\"\n        errorLine2=\"            ~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/java/com/keylesspalace/tusky/adapter/TabAdapter.kt\"\n            line=\"161\"\n            column=\"13\"/>\n    </issue>\n\n    <issue\n        id=\"NegativeMargin\"\n        message=\"Margin values should not be negative\"\n        errorLine1=\"        android:layout_marginStart=&quot;-14dp&quot;\"\n        errorLine2=\"        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/item_conversation.xml\"\n            line=\"277\"\n            column=\"9\"/>\n    </issue>\n\n    <issue\n        id=\"ReportShortcutUsage\"\n        message=\"Calling this method indicates use of dynamic shortcuts, but there are no calls to methods that track shortcut usage, such as `pushDynamicShortcut` or `reportShortcutUsed`. Calling these methods is recommended, as they track shortcut usage and allow launchers to adjust which shortcuts appear based on activation history. Please see https://developer.android.com/develop/ui/views/launch/shortcuts/managing-shortcuts#track-usage\"\n        errorLine1=\"            ShortcutManagerCompat.setDynamicShortcuts(context, shortcuts)\"\n        errorLine2=\"            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/java/com/keylesspalace/tusky/util/ShareShortcutHelper.kt\"\n            line=\"101\"\n            column=\"13\"/>\n    </issue>\n\n    <issue\n        id=\"UseKtx\"\n        message=\"Use the KTX extension function `Context.withStyledAttributes` instead?\"\n        errorLine1=\"        val a = context.obtainStyledAttributes(\"\n        errorLine2=\"                ^\">\n        <location\n            file=\"src/main/java/com/keylesspalace/tusky/view/SliderPreference.kt\"\n            line=\"99\"\n            column=\"17\"/>\n    </issue>\n\n    <issue\n        id=\"ClickableViewAccessibility\"\n        message=\"Custom view ``ImageView`` has `setOnTouchListener` called on it but does not override `performClick`\"\n        errorLine1=\"            binding.imageView.setOnTouchListener { _, event ->\"\n        errorLine2=\"            ^\">\n        <location\n            file=\"src/main/java/com/keylesspalace/tusky/adapter/TabAdapter.kt\"\n            line=\"95\"\n            column=\"13\"/>\n    </issue>\n\n    <issue\n        id=\"ClickableViewAccessibility\"\n        message=\"`onTouch` lambda should call `View#performClick` when a click is detected\"\n        errorLine1=\"            binding.imageView.setOnTouchListener { _, event ->\"\n        errorLine2=\"                                                 ^\">\n        <location\n            file=\"src/main/java/com/keylesspalace/tusky/adapter/TabAdapter.kt\"\n            line=\"95\"\n            column=\"50\"/>\n    </issue>\n\n    <issue\n        id=\"ContentDescription\"\n        message=\"Missing `contentDescription` attribute on image\"\n        errorLine1=\"        &lt;ImageButton android:id=&quot;@id/exo_prev&quot;\"\n        errorLine2=\"         ~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"45\"\n            column=\"10\"/>\n    </issue>\n\n    <issue\n        id=\"ContentDescription\"\n        message=\"Missing `contentDescription` attribute on image\"\n        errorLine1=\"        &lt;ImageButton android:id=&quot;@id/exo_play_pause&quot;\"\n        errorLine2=\"         ~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"51\"\n            column=\"10\"/>\n    </issue>\n\n    <issue\n        id=\"ContentDescription\"\n        message=\"Missing `contentDescription` attribute on image\"\n        errorLine1=\"        &lt;ImageButton android:id=&quot;@id/exo_next&quot;\"\n        errorLine2=\"         ~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"56\"\n            column=\"10\"/>\n    </issue>\n\n    <issue\n        id=\"ContentDescription\"\n        message=\"Missing `contentDescription` attribute on image\"\n        errorLine1=\"            &lt;ImageButton android:id=&quot;@id/exo_vr&quot;\"\n        errorLine2=\"             ~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"96\"\n            column=\"14\"/>\n    </issue>\n\n    <issue\n        id=\"ContentDescription\"\n        message=\"Missing `contentDescription` attribute on image\"\n        errorLine1=\"            &lt;ImageButton android:id=&quot;@id/exo_shuffle&quot;\"\n        errorLine2=\"             ~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"99\"\n            column=\"14\"/>\n    </issue>\n\n    <issue\n        id=\"ContentDescription\"\n        message=\"Missing `contentDescription` attribute on image\"\n        errorLine1=\"            &lt;ImageButton android:id=&quot;@id/exo_repeat_toggle&quot;\"\n        errorLine2=\"             ~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"102\"\n            column=\"14\"/>\n    </issue>\n\n    <issue\n        id=\"ContentDescription\"\n        message=\"Missing `contentDescription` attribute on image\"\n        errorLine1=\"            &lt;ImageButton android:id=&quot;@id/exo_subtitle&quot;\"\n        errorLine2=\"             ~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"105\"\n            column=\"14\"/>\n    </issue>\n\n    <issue\n        id=\"ContentDescription\"\n        message=\"Missing `contentDescription` attribute on image\"\n        errorLine1=\"            &lt;ImageButton android:id=&quot;@id/exo_settings&quot;\"\n        errorLine2=\"             ~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"108\"\n            column=\"14\"/>\n    </issue>\n\n    <issue\n        id=\"ContentDescription\"\n        message=\"Missing `contentDescription` attribute on image\"\n        errorLine1=\"            &lt;ImageButton android:id=&quot;@id/exo_fullscreen&quot;\"\n        errorLine2=\"             ~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"111\"\n            column=\"14\"/>\n    </issue>\n\n    <issue\n        id=\"ContentDescription\"\n        message=\"Missing `contentDescription` attribute on image\"\n        errorLine1=\"            &lt;ImageButton android:id=&quot;@id/exo_overflow_show&quot;\"\n        errorLine2=\"             ~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"114\"\n            column=\"14\"/>\n    </issue>\n\n    <issue\n        id=\"ContentDescription\"\n        message=\"Missing `contentDescription` attribute on image\"\n        errorLine1=\"                &lt;ImageButton android:id=&quot;@id/exo_overflow_hide&quot;\"\n        errorLine2=\"                 ~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"130\"\n            column=\"18\"/>\n    </issue>\n\n    <issue\n        id=\"ContentDescription\"\n        message=\"Missing `contentDescription` attribute on image\"\n        errorLine1=\"        &lt;ImageButton android:id=&quot;@id/exo_minimal_fullscreen&quot;\"\n        errorLine2=\"         ~~~~~~~~~~~\">\n        <location\n            file=\"src/main/res/layout/exo_player_control_view.xml\"\n            line=\"154\"\n            column=\"10\"/>\n    </issue>\n\n    <issue\n        id=\"SetTextI18n\"\n        message=\"Do not concatenate text displayed with `setText`. Use resource string with placeholders.\"\n        errorLine1=\"                    cardMetadata.setText(providerName + metadataJoiner + TimestampUtils.getRelativeTimeSpanString(context, card.getPublishedAt().getTime(), System.currentTimeMillis()));\"\n        errorLine2=\"                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\">\n        <location\n            file=\"src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java\"\n            line=\"1135\"\n            column=\"42\"/>\n    </issue>\n\n</issues>\n"
  },
  {
    "path": "app/lint.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2023 Tusky Contributors\n  ~\n  ~ This file is a part of Tusky.\n  ~\n  ~ This program is free software; you can redistribute it and/or modify it under the terms of the\n  ~ GNU General Public License as published by the Free Software Foundation; either version 3 of the\n  ~ License, or (at your option) any later version.\n  ~\n  ~ Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n  ~ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n  ~ Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License along with Tusky; if not,\n  ~ see <http://www.gnu.org/licenses>.\n  -->\n\n<lint>\n    <!-- Missing translations are OK -->\n    <issue id=\"MissingTranslation\" severity=\"ignore\" />\n\n    <!-- Duplicate strings are OK. This can happen when e.g., \"favourite\" appears as both\n         a noun and a verb -->\n    <issue id=\"DuplicateStrings\" severity=\"ignore\" />\n\n    <!-- Resource IDs used in viewbinding are incorrectly reported as unused,\n         https://issuetracker.google.com/issues/204797401.\n\n         Disable these for the time being. -->\n    <issue id=\"UnusedIds\" severity=\"ignore\" />\n    <issue id=\"UnusedResources\" severity=\"ignore\" />\n\n    <!-- Logs are stripped in release builds. -->\n    <issue id=\"LogConditional\" severity=\"ignore\" />\n\n    <!-- Newer dependencies are handled by Renovate, and don't need a warning -->\n    <issue id=\"GradleDependency\" severity=\"ignore\" />\n    <issue id=\"NewerVersionAvailable\" severity=\"ignore\" />\n\n    <!-- Typographical punctuation is not something we care about at the moment -->\n    <issue id=\"TypographyQuotes\" severity=\"ignore\" />\n    <issue id=\"TypographyDashes\" severity=\"ignore\" />\n    <issue id=\"TypographyEllipsis\" severity=\"ignore\" />\n\n    <!-- Translations come from external parties -->\n    <issue id=\"MissingQuantity\" severity=\"ignore\" />\n    <issue id=\"ImpliedQuantity\" severity=\"ignore\" />\n    <!-- Most alleged typos are in translations -->\n    <issue id=\"Typos\" severity=\"ignore\" />\n\n    <!-- Basically all of our vectors are external -->\n    <issue id=\"VectorPath\" severity=\"ignore\" />\n    <issue id=\"Overdraw\" severity=\"ignore\" />\n\n    <!-- Irrelevant api version warnings -->\n    <issue id=\"OldTargetApi\" severity=\"ignore\" />\n    <issue id=\"UnusedAttribute\" severity=\"ignore\" />\n\n    <!-- We do not *want* all the text in the app to be selectable -->\n    <issue id=\"SelectableText\" severity=\"ignore\" />\n\n    <!-- This is heavily used by the viewbinding helper -->\n    <issue id=\"SyntheticAccessor\" severity=\"ignore\" />\n\n    <!-- We already have Renovate reminding us of new versions -->\n    <issue id=\"AndroidGradlePluginVersion\" severity=\"ignore\" />\n\n    <!-- Things we would actually question in a code review -->\n    <issue id=\"MissingPermission\" severity=\"error\" />\n    <issue id=\"InvalidPackage\" severity=\"error\" />\n    <issue id=\"UseCompatLoadingForDrawables\" severity=\"error\" />\n    <issue id=\"UseCompatTextViewDrawableXml\" severity=\"error\" />\n    <issue id=\"Recycle\" severity=\"error\" />\n    <issue id=\"KeyboardInaccessibleWidget\" severity=\"error\" />\n    <issue id=\"UnknownNullness\" severity=\"error\" />\n\n    <!-- Mark all other lint issues as warnings -->\n    <issue id=\"all\" severity=\"warning\" />\n</lint>\n"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "# GENERAL OPTIONS\n\n-allowaccessmodification\n\n# Preserve some attributes that may be required for reflection.\n-keepattributes RuntimeVisible*Annotations, AnnotationDefault\n\n# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native\n-keepclasseswithmembernames class * {\n    native <methods>;\n}\n\n# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations\n-keepclassmembers,allowoptimization enum * {\n    public static **[] values();\n    public static ** valueOf(java.lang.String);\n}\n\n-keepclassmembers class * implements android.os.Parcelable {\n    public static final ** CREATOR;\n}\n\n# TUSKY SPECIFIC OPTIONS\n\n# preserve line numbers for crash reporting\n-keepattributes SourceFile,LineNumberTable\n-renamesourcefileattribute SourceFile\n\n# Bouncy Castle -- Keep EC\n-keep class org.bouncycastle.jcajce.provider.asymmetric.EC$* { *; }\n-keep class org.bouncycastle.jcajce.provider.asymmetric.ec.KeyPairGeneratorSpi$EC\n\n# Preference fragments can be referenced by name, ensure they remain\n# https://github.com/tuskyapp/Tusky/issues/3161\n-keep class * extends androidx.preference.PreferenceFragmentCompat\n\n# remove all logging from production apk\n-assumenosideeffects class android.util.Log {\n    public static *** getStackTraceString(...);\n    public static *** d(...);\n    public static *** w(...);\n    public static *** v(...);\n    public static *** i(...);\n}\n-assumenosideeffects class java.lang.String {\n    public static java.lang.String format(...);\n}\n\n# remove some kotlin overhead\n-assumenosideeffects class kotlin.jvm.internal.Intrinsics {\n    static void checkNotNull(java.lang.Object);\n    static void checkNotNull(java.lang.Object, java.lang.String);\n    static void checkParameterIsNotNull(java.lang.Object, java.lang.String);\n    static void checkParameterIsNotNull(java.lang.Object, java.lang.String);\n    static void checkNotNullParameter(java.lang.Object, java.lang.String);\n    static void checkExpressionValueIsNotNull(java.lang.Object, java.lang.String);\n    static void checkNotNullExpressionValue(java.lang.Object, java.lang.String);\n    static void checkReturnedValueIsNotNull(java.lang.Object, java.lang.String);\n    static void checkReturnedValueIsNotNull(java.lang.Object, java.lang.String, java.lang.String);\n    static void throwUninitializedProperty(java.lang.String);\n    static void throwUninitializedPropertyAccessException(java.lang.String);\n}\n\n# there is no need for edit mode in production builds, allow it to be pruned\n-assumenosideeffects public class * extends android.view.View {\n  boolean isInEditMode();\n}\n-assumevalues public class * extends android.view.View {\n  boolean isInEditMode() return false;\n}\n\n-checkdiscard class com.keylesspalace.tusky.usecase.DeveloperToolsUseCase\n"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/10.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 10,\n    \"identityHash\": \"69e310ef98c0f305934d25e763ee0140\",\n    \"entities\": [\n      {\n        \"tableName\": \"TootEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `text` TEXT, `urls` TEXT, `descriptions` TEXT, `contentWarning` TEXT, `inReplyToId` TEXT, `inReplyToText` TEXT, `inReplyToUsername` TEXT, `visibility` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"urls\",\n            \"columnName\": \"urls\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"descriptions\",\n            \"columnName\": \"descriptions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToText\",\n            \"columnName\": \"inReplyToText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToUsername\",\n            \"columnName\": \"inReplyToUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \\\"69e310ef98c0f305934d25e763ee0140\\\")\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/11.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 11,\n    \"identityHash\": \"f5e93302cf53d4250e455b701bea102f\",\n    \"entities\": [\n      {\n        \"tableName\": \"TootEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `text` TEXT, `urls` TEXT, `descriptions` TEXT, `contentWarning` TEXT, `inReplyToId` TEXT, `inReplyToText` TEXT, `inReplyToUsername` TEXT, `visibility` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"urls\",\n            \"columnName\": \"urls\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"descriptions\",\n            \"columnName\": \"descriptions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToText\",\n            \"columnName\": \"inReplyToText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToUsername\",\n            \"columnName\": \"inReplyToUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `instance` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT, `visibility` INTEGER, `attachments` TEXT, `mentions` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `instance` TEXT NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \\\"f5e93302cf53d4250e455b701bea102f\\\")\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/12.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 12,\n    \"identityHash\": \"d4d3d4c683ab7f681459b9edab92301c\",\n    \"entities\": [\n      {\n        \"tableName\": \"TootEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `text` TEXT, `urls` TEXT, `descriptions` TEXT, `contentWarning` TEXT, `inReplyToId` TEXT, `inReplyToText` TEXT, `inReplyToUsername` TEXT, `visibility` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"urls\",\n            \"columnName\": \"urls\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"descriptions\",\n            \"columnName\": \"descriptions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToText\",\n            \"columnName\": \"inReplyToText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToUsername\",\n            \"columnName\": \"inReplyToUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `instance` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT, `visibility` INTEGER, `attachments` TEXT, `mentions` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `instance` TEXT NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \\\"d4d3d4c683ab7f681459b9edab92301c\\\")\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/13.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 13,\n    \"identityHash\": \"9a63a3ab2c05004022c350aab0e472c0\",\n    \"entities\": [\n      {\n        \"tableName\": \"TootEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `text` TEXT, `urls` TEXT, `descriptions` TEXT, `contentWarning` TEXT, `inReplyToId` TEXT, `inReplyToText` TEXT, `inReplyToUsername` TEXT, `visibility` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"urls\",\n            \"columnName\": \"urls\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"descriptions\",\n            \"columnName\": \"descriptions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToText\",\n            \"columnName\": \"inReplyToText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToUsername\",\n            \"columnName\": \"inReplyToUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT, `visibility` INTEGER, `attachments` TEXT, `mentions` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \\\"9a63a3ab2c05004022c350aab0e472c0\\\")\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/14.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 14,\n    \"identityHash\": \"b9ca62605345d229ced2bb0c1f2db79b\",\n    \"entities\": [\n      {\n        \"tableName\": \"TootEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `text` TEXT, `urls` TEXT, `descriptions` TEXT, `contentWarning` TEXT, `inReplyToId` TEXT, `inReplyToText` TEXT, `inReplyToUsername` TEXT, `visibility` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"urls\",\n            \"columnName\": \"urls\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"descriptions\",\n            \"columnName\": \"descriptions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToText\",\n            \"columnName\": \"inReplyToText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToUsername\",\n            \"columnName\": \"inReplyToUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT, `visibility` INTEGER, `attachments` TEXT, `mentions` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \\\"b9ca62605345d229ced2bb0c1f2db79b\\\")\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/15.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 15,\n    \"identityHash\": \"6a01315ce9f7d402cb61e611140e3c0a\",\n    \"entities\": [\n      {\n        \"tableName\": \"TootEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `text` TEXT, `urls` TEXT, `descriptions` TEXT, `contentWarning` TEXT, `inReplyToId` TEXT, `inReplyToText` TEXT, `inReplyToUsername` TEXT, `visibility` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"urls\",\n            \"columnName\": \"urls\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"descriptions\",\n            \"columnName\": \"descriptions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToText\",\n            \"columnName\": \"inReplyToText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToUsername\",\n            \"columnName\": \"inReplyToUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT, `visibility` INTEGER, `attachments` TEXT, `mentions` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \\\"6a01315ce9f7d402cb61e611140e3c0a\\\")\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/16.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 16,\n    \"identityHash\": \"821df8c72aa78a288b4ae9fe2df21dda\",\n    \"entities\": [\n      {\n        \"tableName\": \"TootEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `text` TEXT, `urls` TEXT, `descriptions` TEXT, `contentWarning` TEXT, `inReplyToId` TEXT, `inReplyToText` TEXT, `inReplyToUsername` TEXT, `visibility` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"urls\",\n            \"columnName\": \"urls\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"descriptions\",\n            \"columnName\": \"descriptions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToText\",\n            \"columnName\": \"inReplyToText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToUsername\",\n            \"columnName\": \"inReplyToUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT, `visibility` INTEGER, `attachments` TEXT, `mentions` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \\\"821df8c72aa78a288b4ae9fe2df21dda\\\")\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/17.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 17,\n    \"identityHash\": \"4e6bfccf6ec0812dc0bc58d5bc8cf556\",\n    \"entities\": [\n      {\n        \"tableName\": \"TootEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `text` TEXT, `urls` TEXT, `descriptions` TEXT, `contentWarning` TEXT, `inReplyToId` TEXT, `inReplyToText` TEXT, `inReplyToUsername` TEXT, `visibility` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"urls\",\n            \"columnName\": \"urls\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"descriptions\",\n            \"columnName\": \"descriptions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToText\",\n            \"columnName\": \"inReplyToText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToUsername\",\n            \"columnName\": \"inReplyToUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT, `visibility` INTEGER, `attachments` TEXT, `mentions` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \\\"4e6bfccf6ec0812dc0bc58d5bc8cf556\\\")\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/18.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 18,\n    \"identityHash\": \"33d7d9b8ba14c87b96ce795c337bfc57\",\n    \"entities\": [\n      {\n        \"tableName\": \"TootEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `text` TEXT, `urls` TEXT, `descriptions` TEXT, `contentWarning` TEXT, `inReplyToId` TEXT, `inReplyToText` TEXT, `inReplyToUsername` TEXT, `visibility` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"urls\",\n            \"columnName\": \"urls\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"descriptions\",\n            \"columnName\": \"descriptions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToText\",\n            \"columnName\": \"inReplyToText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToUsername\",\n            \"columnName\": \"inReplyToUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT, `visibility` INTEGER, `attachments` TEXT, `mentions` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '33d7d9b8ba14c87b96ce795c337bfc57')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/19.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 19,\n    \"identityHash\": \"84ebd39cba4d6749251d330851b70e36\",\n    \"entities\": [\n      {\n        \"tableName\": \"TootEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `text` TEXT, `urls` TEXT, `descriptions` TEXT, `contentWarning` TEXT, `inReplyToId` TEXT, `inReplyToText` TEXT, `inReplyToUsername` TEXT, `visibility` INTEGER, `poll` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"urls\",\n            \"columnName\": \"urls\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"descriptions\",\n            \"columnName\": \"descriptions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToText\",\n            \"columnName\": \"inReplyToText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToUsername\",\n            \"columnName\": \"inReplyToUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT, `visibility` INTEGER, `attachments` TEXT, `mentions` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '84ebd39cba4d6749251d330851b70e36')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/20.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 20,\n    \"identityHash\": \"611700a54bdc155d6bc9d87b8b2af2aa\",\n    \"entities\": [\n      {\n        \"tableName\": \"TootEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `text` TEXT, `urls` TEXT, `descriptions` TEXT, `contentWarning` TEXT, `inReplyToId` TEXT, `inReplyToText` TEXT, `inReplyToUsername` TEXT, `visibility` INTEGER, `poll` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"urls\",\n            \"columnName\": \"urls\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"descriptions\",\n            \"columnName\": \"descriptions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToText\",\n            \"columnName\": \"inReplyToText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToUsername\",\n            \"columnName\": \"inReplyToUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT, `visibility` INTEGER, `attachments` TEXT, `mentions` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '611700a54bdc155d6bc9d87b8b2af2aa')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/21.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 21,\n    \"identityHash\": \"7570c84ffeb4f90521f91dc7ef3e7da1\",\n    \"entities\": [\n      {\n        \"tableName\": \"TootEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `text` TEXT, `urls` TEXT, `descriptions` TEXT, `contentWarning` TEXT, `inReplyToId` TEXT, `inReplyToText` TEXT, `inReplyToUsername` TEXT, `visibility` INTEGER, `poll` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"urls\",\n            \"columnName\": \"urls\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"descriptions\",\n            \"columnName\": \"descriptions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToText\",\n            \"columnName\": \"inReplyToText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToUsername\",\n            \"columnName\": \"inReplyToUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `version` TEXT, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT, `visibility` INTEGER, `attachments` TEXT, `mentions` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7570c84ffeb4f90521f91dc7ef3e7da1')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/22.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 22,\n    \"identityHash\": \"eaa3c4d012fe743948343983fe1ae493\",\n    \"entities\": [\n      {\n        \"tableName\": \"TootEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `text` TEXT, `urls` TEXT, `descriptions` TEXT, `contentWarning` TEXT, `inReplyToId` TEXT, `inReplyToText` TEXT, `inReplyToUsername` TEXT, `visibility` INTEGER, `poll` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"urls\",\n            \"columnName\": \"urls\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"descriptions\",\n            \"columnName\": \"descriptions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToText\",\n            \"columnName\": \"inReplyToText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToUsername\",\n            \"columnName\": \"inReplyToUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `version` TEXT, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT, `visibility` INTEGER, `attachments` TEXT, `mentions` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'eaa3c4d012fe743948343983fe1ae493')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/23.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 23,\n    \"identityHash\": \"03a7436643ef356198742c5f8e054f5f\",\n    \"entities\": [\n      {\n        \"tableName\": \"TootEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `text` TEXT, `urls` TEXT, `descriptions` TEXT, `contentWarning` TEXT, `inReplyToId` TEXT, `inReplyToText` TEXT, `inReplyToUsername` TEXT, `visibility` INTEGER, `poll` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"urls\",\n            \"columnName\": \"urls\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"descriptions\",\n            \"columnName\": \"descriptions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToText\",\n            \"columnName\": \"inReplyToText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToUsername\",\n            \"columnName\": \"inReplyToUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `version` TEXT, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT, `visibility` INTEGER, `attachments` TEXT, `mentions` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '03a7436643ef356198742c5f8e054f5f')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/24.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 24,\n    \"identityHash\": \"ea8559bbdf434c7b9086384a9a4cc8e6\",\n    \"entities\": [\n      {\n        \"tableName\": \"TootEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `text` TEXT, `urls` TEXT, `descriptions` TEXT, `contentWarning` TEXT, `inReplyToId` TEXT, `inReplyToText` TEXT, `inReplyToUsername` TEXT, `visibility` INTEGER, `poll` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"urls\",\n            \"columnName\": \"urls\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"descriptions\",\n            \"columnName\": \"descriptions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToText\",\n            \"columnName\": \"inReplyToText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToUsername\",\n            \"columnName\": \"inReplyToUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `version` TEXT, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT, `visibility` INTEGER, `attachments` TEXT, `mentions` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'ea8559bbdf434c7b9086384a9a4cc8e6')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/25.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 25,\n    \"identityHash\": \"e2cb844862443c2c5cc884c11f120d43\",\n    \"entities\": [\n      {\n        \"tableName\": \"TootEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `text` TEXT, `urls` TEXT, `descriptions` TEXT, `contentWarning` TEXT, `inReplyToId` TEXT, `inReplyToText` TEXT, `inReplyToUsername` TEXT, `visibility` INTEGER, `poll` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"urls\",\n            \"columnName\": \"urls\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"descriptions\",\n            \"columnName\": \"descriptions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToText\",\n            \"columnName\": \"inReplyToText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToUsername\",\n            \"columnName\": \"inReplyToUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `version` TEXT, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT, `visibility` INTEGER, `attachments` TEXT, `mentions` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e2cb844862443c2c5cc884c11f120d43')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/26.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 26,\n    \"identityHash\": \"14fb3d5743b7a89e8e62463e05f086ab\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `version` TEXT, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT, `visibility` INTEGER, `attachments` TEXT, `mentions` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '14fb3d5743b7a89e8e62463e05f086ab')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/27.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 27,\n    \"identityHash\": \"be914d4eb3f406b6970fef53a925afa1\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `version` TEXT, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT, `visibility` INTEGER, `attachments` TEXT, `mentions` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'be914d4eb3f406b6970fef53a925afa1')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/28.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 28,\n    \"identityHash\": \"867026e095d84652026e902709389c00\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `version` TEXT, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '867026e095d84652026e902709389c00')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/29.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 29,\n    \"identityHash\": \"62c289344334da2db091ad4ba0a49c6a\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `version` TEXT, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '62c289344334da2db091ad4ba0a49c6a')\"\n    ]\n  }\n}\n"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/30.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 30,\n    \"identityHash\": \"a75615171612bdfc9e3d4201ebf6071a\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'a75615171612bdfc9e3d4201ebf6071a')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/31.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 31,\n    \"identityHash\": \"a75615171612bdfc9e3d4201ebf6071a\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'a75615171612bdfc9e3d4201ebf6071a')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/32.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 32,\n    \"identityHash\": \"c92343960c9d46d9cfd49f1873cce47d\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsible\",\n            \"columnName\": \"s_collapsible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'c92343960c9d46d9cfd49f1873cce47d')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/33.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 33,\n    \"identityHash\": \"920a0e0c9a600bd236f6bf959b469c18\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '920a0e0c9a600bd236f6bf959b469c18')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/34.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 34,\n    \"identityHash\": \"7f766d68ab5d72a7988cd81c183e9a9d\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7f766d68ab5d72a7988cd81c183e9a9d')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/35.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 35,\n    \"identityHash\": \"9e6c0bb60538683a16c30fa3e1cc24f2\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '9e6c0bb60538683a16c30fa3e1cc24f2')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/36.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 36,\n    \"identityHash\": \"1b7461c291f67fe0b21f77b95de6a6be\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1b7461c291f67fe0b21f77b95de6a6be')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/37.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 37,\n    \"identityHash\": \"11033751d382aa8a1c6fc68833097d35\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '11033751d382aa8a1c6fc68833097d35')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/38.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 38,\n    \"identityHash\": \"798fc8d34064eb671c079689d4650ea5\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '798fc8d34064eb671c079689d4650ea5')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/39.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 39,\n    \"identityHash\": \"ed3b752a3faec9d092d5ac0a2823d5d5\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'ed3b752a3faec9d092d5ac0a2823d5d5')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/40.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 40,\n    \"identityHash\": \"0423fb3f7d09db5f12023f2f4e7297b5\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '0423fb3f7d09db5f12023f2f4e7297b5')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/41.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 41,\n    \"identityHash\": \"1de8f20c7f28e1f11b33e7a55137feef\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `scheduledAt` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1de8f20c7f28e1f11b33e7a55137feef')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/42.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 42,\n    \"identityHash\": \"a62399cb3859de7fcbb9bd7053f7cb1d\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'a62399cb3859de7fcbb9bd7053f7cb1d')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/43.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 43,\n    \"identityHash\": \"bf68abe55bb58765da7f9d6f7ef618e2\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'bf68abe55bb58765da7f9d6f7ef618e2')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/44.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 44,\n    \"identityHash\": \"7b5271980102f35e55438f46777e3d46\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsReports` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReports\",\n            \"columnName\": \"notificationsReports\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7b5271980102f35e55438f46777e3d46')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/45.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 45,\n    \"identityHash\": \"cb4d4c0de04e945005adbb43bc534378\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsReports` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReports\",\n            \"columnName\": \"notificationsReports\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `editedAt` INTEGER, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"editedAt\",\n            \"columnName\": \"editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_editedAt` INTEGER, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.editedAt\",\n            \"columnName\": \"s_editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'cb4d4c0de04e945005adbb43bc534378')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/46.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 46,\n    \"identityHash\": \"3cdfad61c4cf7e1ad5c70783e60e6845\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT, `statusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsReports` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReports\",\n            \"columnName\": \"notificationsReports\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `editedAt` INTEGER, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"editedAt\",\n            \"columnName\": \"editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_editedAt` INTEGER, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.editedAt\",\n            \"columnName\": \"s_editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '3cdfad61c4cf7e1ad5c70783e60e6845')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/47.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 47,\n    \"identityHash\": \"496e1f2135a296e49eef88551ecbdd2c\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `failedToSendNew` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT, `statusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"failedToSendNew\",\n            \"columnName\": \"failedToSendNew\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsReports` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReports\",\n            \"columnName\": \"notificationsReports\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"instance\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `editedAt` INTEGER, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"editedAt\",\n            \"columnName\": \"editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_editedAt` INTEGER, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.editedAt\",\n            \"columnName\": \"s_editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '496e1f2135a296e49eef88551ecbdd2c')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/48.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 48,\n    \"identityHash\": \"a394ca5b45df9358fdc4d2eaae69cce3\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `failedToSendNew` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT, `statusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"failedToSendNew\",\n            \"columnName\": \"failedToSendNew\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsReports` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReports\",\n            \"columnName\": \"notificationsReports\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"instance\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `editedAt` INTEGER, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, `filtered` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"editedAt\",\n            \"columnName\": \"editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filtered\",\n            \"columnName\": \"filtered\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_editedAt` INTEGER, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.editedAt\",\n            \"columnName\": \"s_editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'a394ca5b45df9358fdc4d2eaae69cce3')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/49.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 49,\n    \"identityHash\": \"e7085677596f03c64da3d26e05321a08\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `failedToSendNew` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT, `statusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"failedToSendNew\",\n            \"columnName\": \"failedToSendNew\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsReports` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL, `lastVisibleHomeTimelineStatusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReports\",\n            \"columnName\": \"notificationsReports\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"activeNotifications\",\n            \"columnName\": \"activeNotifications\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastVisibleHomeTimelineStatusId\",\n            \"columnName\": \"lastVisibleHomeTimelineStatusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"instance\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `editedAt` INTEGER, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, `filtered` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"editedAt\",\n            \"columnName\": \"editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filtered\",\n            \"columnName\": \"filtered\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_editedAt` INTEGER, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.editedAt\",\n            \"columnName\": \"s_editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e7085677596f03c64da3d26e05321a08')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/50.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 50,\n    \"identityHash\": \"4eaf69e915d4a15f021547b725101acd\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `failedToSendNew` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT, `statusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"failedToSendNew\",\n            \"columnName\": \"failedToSendNew\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsReports` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL, `lastVisibleHomeTimelineStatusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReports\",\n            \"columnName\": \"notificationsReports\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastVisibleHomeTimelineStatusId\",\n            \"columnName\": \"lastVisibleHomeTimelineStatusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"instance\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `editedAt` INTEGER, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, `filtered` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"editedAt\",\n            \"columnName\": \"editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filtered\",\n            \"columnName\": \"filtered\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_editedAt` INTEGER, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.editedAt\",\n            \"columnName\": \"s_editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '4eaf69e915d4a15f021547b725101acd')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/51.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 51,\n    \"identityHash\": \"446158bf571fbd08787628bb829fa3c0\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `failedToSendNew` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT, `statusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"failedToSendNew\",\n            \"columnName\": \"failedToSendNew\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsReports` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `notificationMarkerId` TEXT NOT NULL DEFAULT '0', `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL, `lastVisibleHomeTimelineStatusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReports\",\n            \"columnName\": \"notificationsReports\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationMarkerId\",\n            \"columnName\": \"notificationMarkerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'0'\"\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastVisibleHomeTimelineStatusId\",\n            \"columnName\": \"lastVisibleHomeTimelineStatusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"instance\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `editedAt` INTEGER, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, `filtered` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"editedAt\",\n            \"columnName\": \"editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filtered\",\n            \"columnName\": \"filtered\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_editedAt` INTEGER, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.editedAt\",\n            \"columnName\": \"s_editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '446158bf571fbd08787628bb829fa3c0')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/52.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 52,\n    \"identityHash\": \"233a8680f540e9a89950da21532ce85d\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `failedToSendNew` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT, `statusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"failedToSendNew\",\n            \"columnName\": \"failedToSendNew\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsReports` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `notificationMarkerId` TEXT NOT NULL DEFAULT '0', `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL, `lastVisibleHomeTimelineStatusId` TEXT, `locked` INTEGER NOT NULL DEFAULT 0)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReports\",\n            \"columnName\": \"notificationsReports\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationMarkerId\",\n            \"columnName\": \"notificationMarkerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'0'\"\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastVisibleHomeTimelineStatusId\",\n            \"columnName\": \"lastVisibleHomeTimelineStatusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"locked\",\n            \"columnName\": \"locked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"instance\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `editedAt` INTEGER, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, `filtered` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"editedAt\",\n            \"columnName\": \"editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filtered\",\n            \"columnName\": \"filtered\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_editedAt` INTEGER, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.editedAt\",\n            \"columnName\": \"s_editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '233a8680f540e9a89950da21532ce85d')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/53.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 53,\n    \"identityHash\": \"233a8680f540e9a89950da21532ce85d\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `failedToSendNew` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT, `statusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"failedToSendNew\",\n            \"columnName\": \"failedToSendNew\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsReports` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `notificationMarkerId` TEXT NOT NULL DEFAULT '0', `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL, `lastVisibleHomeTimelineStatusId` TEXT, `locked` INTEGER NOT NULL DEFAULT 0)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReports\",\n            \"columnName\": \"notificationsReports\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationMarkerId\",\n            \"columnName\": \"notificationMarkerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'0'\"\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastVisibleHomeTimelineStatusId\",\n            \"columnName\": \"lastVisibleHomeTimelineStatusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"locked\",\n            \"columnName\": \"locked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"instance\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `editedAt` INTEGER, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, `filtered` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"editedAt\",\n            \"columnName\": \"editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filtered\",\n            \"columnName\": \"filtered\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_editedAt` INTEGER, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.editedAt\",\n            \"columnName\": \"s_editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '233a8680f540e9a89950da21532ce85d')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/54.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 54,\n    \"identityHash\": \"c86c3e5ef2c1c5903657a0138b4b2520\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `failedToSendNew` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT, `statusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"failedToSendNew\",\n            \"columnName\": \"failedToSendNew\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsReports` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `notificationMarkerId` TEXT NOT NULL DEFAULT '0', `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL, `lastVisibleHomeTimelineStatusId` TEXT, `locked` INTEGER NOT NULL DEFAULT 0, `hasDirectMessageBadge` INTEGER NOT NULL DEFAULT 0)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReports\",\n            \"columnName\": \"notificationsReports\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationMarkerId\",\n            \"columnName\": \"notificationMarkerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'0'\"\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastVisibleHomeTimelineStatusId\",\n            \"columnName\": \"lastVisibleHomeTimelineStatusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"locked\",\n            \"columnName\": \"locked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"hasDirectMessageBadge\",\n            \"columnName\": \"hasDirectMessageBadge\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"instance\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `editedAt` INTEGER, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, `filtered` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"editedAt\",\n            \"columnName\": \"editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filtered\",\n            \"columnName\": \"filtered\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_editedAt` INTEGER, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.editedAt\",\n            \"columnName\": \"s_editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'c86c3e5ef2c1c5903657a0138b4b2520')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/56.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 56,\n    \"identityHash\": \"1d1eba6d905d2a6e16ae2daa81c0ab4a\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `failedToSendNew` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT, `statusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"failedToSendNew\",\n            \"columnName\": \"failedToSendNew\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsReports` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `notificationMarkerId` TEXT NOT NULL DEFAULT '0', `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL, `lastVisibleHomeTimelineStatusId` TEXT, `locked` INTEGER NOT NULL DEFAULT 0, `hasDirectMessageBadge` INTEGER NOT NULL DEFAULT 0, `isShowHomeBoosts` INTEGER NOT NULL, `isShowHomeReplies` INTEGER NOT NULL, `isShowHomeSelfBoosts` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReports\",\n            \"columnName\": \"notificationsReports\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationMarkerId\",\n            \"columnName\": \"notificationMarkerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'0'\"\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastVisibleHomeTimelineStatusId\",\n            \"columnName\": \"lastVisibleHomeTimelineStatusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"locked\",\n            \"columnName\": \"locked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"hasDirectMessageBadge\",\n            \"columnName\": \"hasDirectMessageBadge\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"isShowHomeBoosts\",\n            \"columnName\": \"isShowHomeBoosts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isShowHomeReplies\",\n            \"columnName\": \"isShowHomeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isShowHomeSelfBoosts\",\n            \"columnName\": \"isShowHomeSelfBoosts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"instance\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `editedAt` INTEGER, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, `filtered` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"editedAt\",\n            \"columnName\": \"editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filtered\",\n            \"columnName\": \"filtered\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_editedAt` INTEGER, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.editedAt\",\n            \"columnName\": \"s_editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1d1eba6d905d2a6e16ae2daa81c0ab4a')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/58.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 58,\n    \"identityHash\": \"1d0e1cdf0b4c3f787333b9abf3b2b26a\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `failedToSendNew` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT, `statusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"failedToSendNew\",\n            \"columnName\": \"failedToSendNew\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsReports` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `notificationMarkerId` TEXT NOT NULL DEFAULT '0', `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL, `lastVisibleHomeTimelineStatusId` TEXT, `locked` INTEGER NOT NULL DEFAULT 0, `hasDirectMessageBadge` INTEGER NOT NULL DEFAULT 0, `isShowHomeBoosts` INTEGER NOT NULL, `isShowHomeReplies` INTEGER NOT NULL, `isShowHomeSelfBoosts` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReports\",\n            \"columnName\": \"notificationsReports\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationMarkerId\",\n            \"columnName\": \"notificationMarkerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'0'\"\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastVisibleHomeTimelineStatusId\",\n            \"columnName\": \"lastVisibleHomeTimelineStatusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"locked\",\n            \"columnName\": \"locked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"hasDirectMessageBadge\",\n            \"columnName\": \"hasDirectMessageBadge\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"isShowHomeBoosts\",\n            \"columnName\": \"isShowHomeBoosts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isShowHomeReplies\",\n            \"columnName\": \"isShowHomeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isShowHomeSelfBoosts\",\n            \"columnName\": \"isShowHomeSelfBoosts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, `translationEnabled` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"translationEnabled\",\n            \"columnName\": \"translationEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"instance\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `editedAt` INTEGER, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, `filtered` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"editedAt\",\n            \"columnName\": \"editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogServerId\",\n            \"columnName\": \"reblogServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filtered\",\n            \"columnName\": \"filtered\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_timelineUserId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"timelineUserId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"timelineUserId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"timelineUserId\",\n            \"columnName\": \"timelineUserId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"timelineUserId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_editedAt` INTEGER, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.editedAt\",\n            \"columnName\": \"s_editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1d0e1cdf0b4c3f787333b9abf3b2b26a')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/60.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 60,\n    \"identityHash\": \"1f8ec0c172cc1cae16313d737f6f8e34\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `failedToSendNew` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT, `statusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"failedToSendNew\",\n            \"columnName\": \"failedToSendNew\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsReports` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `notificationMarkerId` TEXT NOT NULL DEFAULT '0', `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL, `lastVisibleHomeTimelineStatusId` TEXT, `locked` INTEGER NOT NULL DEFAULT 0, `hasDirectMessageBadge` INTEGER NOT NULL DEFAULT 0, `isShowHomeBoosts` INTEGER NOT NULL, `isShowHomeReplies` INTEGER NOT NULL, `isShowHomeSelfBoosts` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReports\",\n            \"columnName\": \"notificationsReports\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationMarkerId\",\n            \"columnName\": \"notificationMarkerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'0'\"\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastVisibleHomeTimelineStatusId\",\n            \"columnName\": \"lastVisibleHomeTimelineStatusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"locked\",\n            \"columnName\": \"locked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"hasDirectMessageBadge\",\n            \"columnName\": \"hasDirectMessageBadge\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"isShowHomeBoosts\",\n            \"columnName\": \"isShowHomeBoosts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isShowHomeReplies\",\n            \"columnName\": \"isShowHomeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isShowHomeSelfBoosts\",\n            \"columnName\": \"isShowHomeSelfBoosts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, `translationEnabled` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"translationEnabled\",\n            \"columnName\": \"translationEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"instance\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `tuskyAccountId` INTEGER NOT NULL, `authorServerId` TEXT NOT NULL, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `editedAt` INTEGER, `emojis` TEXT NOT NULL, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `mentions` TEXT NOT NULL, `tags` TEXT NOT NULL, `application` TEXT, `poll` TEXT, `muted` INTEGER NOT NULL, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, `filtered` TEXT NOT NULL, PRIMARY KEY(`serverId`, `tuskyAccountId`), FOREIGN KEY(`authorServerId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"editedAt\",\n            \"columnName\": \"editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filtered\",\n            \"columnName\": \"filtered\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_tuskyAccountId` ON `${TABLE_NAME}` (`authorServerId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `tuskyAccountId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `tuskyAccountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_editedAt` INTEGER, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.editedAt\",\n            \"columnName\": \"s_editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"NotificationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `type` TEXT, `id` TEXT NOT NULL, `accountId` TEXT, `statusId` TEXT, `reportId` TEXT, `loading` INTEGER NOT NULL, PRIMARY KEY(`id`, `tuskyAccountId`), FOREIGN KEY(`accountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`statusId`, `tuskyAccountId`) REFERENCES `TimelineStatusEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`reportId`, `tuskyAccountId`) REFERENCES `NotificationReportEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reportId\",\n            \"columnName\": \"reportId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"loading\",\n            \"columnName\": \"loading\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_NotificationEntity_accountId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_accountId_tuskyAccountId` ON `${TABLE_NAME}` (`accountId`, `tuskyAccountId`)\"\n          },\n          {\n            \"name\": \"index_NotificationEntity_statusId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_statusId_tuskyAccountId` ON `${TABLE_NAME}` (`statusId`, `tuskyAccountId`)\"\n          },\n          {\n            \"name\": \"index_NotificationEntity_reportId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reportId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_reportId_tuskyAccountId` ON `${TABLE_NAME}` (`reportId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          },\n          {\n            \"table\": \"TimelineStatusEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          },\n          {\n            \"table\": \"NotificationReportEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"reportId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"NotificationReportEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `serverId` TEXT NOT NULL, `category` TEXT NOT NULL, `statusIds` TEXT, `createdAt` INTEGER NOT NULL, `targetAccountId` TEXT, PRIMARY KEY(`serverId`, `tuskyAccountId`), FOREIGN KEY(`targetAccountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"statusIds\",\n            \"columnName\": \"statusIds\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"targetAccountId\",\n            \"columnName\": \"targetAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_NotificationReportEntity_targetAccountId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"targetAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationReportEntity_targetAccountId_tuskyAccountId` ON `${TABLE_NAME}` (`targetAccountId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"targetAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"HomeTimelineEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `statusId` TEXT, `reblogAccountId` TEXT, `loading` INTEGER NOT NULL, PRIMARY KEY(`id`, `tuskyAccountId`), FOREIGN KEY(`statusId`, `tuskyAccountId`) REFERENCES `TimelineStatusEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`reblogAccountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"loading\",\n            \"columnName\": \"loading\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_HomeTimelineEntity_statusId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_HomeTimelineEntity_statusId_tuskyAccountId` ON `${TABLE_NAME}` (`statusId`, `tuskyAccountId`)\"\n          },\n          {\n            \"name\": \"index_HomeTimelineEntity_reblogAccountId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reblogAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_HomeTimelineEntity_reblogAccountId_tuskyAccountId` ON `${TABLE_NAME}` (`reblogAccountId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineStatusEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          },\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"reblogAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1f8ec0c172cc1cae16313d737f6f8e34')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/62.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 62,\n    \"identityHash\": \"f50579baaea33d99c59a34671799682a\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `failedToSendNew` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT, `statusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"failedToSendNew\",\n            \"columnName\": \"failedToSendNew\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsReports` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultReplyPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `notificationMarkerId` TEXT NOT NULL DEFAULT '0', `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL, `lastVisibleHomeTimelineStatusId` TEXT, `locked` INTEGER NOT NULL DEFAULT 0, `hasDirectMessageBadge` INTEGER NOT NULL DEFAULT 0, `isShowHomeBoosts` INTEGER NOT NULL, `isShowHomeReplies` INTEGER NOT NULL, `isShowHomeSelfBoosts` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReports\",\n            \"columnName\": \"notificationsReports\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultReplyPrivacy\",\n            \"columnName\": \"defaultReplyPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationMarkerId\",\n            \"columnName\": \"notificationMarkerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'0'\"\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastVisibleHomeTimelineStatusId\",\n            \"columnName\": \"lastVisibleHomeTimelineStatusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"locked\",\n            \"columnName\": \"locked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"hasDirectMessageBadge\",\n            \"columnName\": \"hasDirectMessageBadge\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"isShowHomeBoosts\",\n            \"columnName\": \"isShowHomeBoosts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isShowHomeReplies\",\n            \"columnName\": \"isShowHomeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isShowHomeSelfBoosts\",\n            \"columnName\": \"isShowHomeSelfBoosts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, `translationEnabled` INTEGER, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"translationEnabled\",\n            \"columnName\": \"translationEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"instance\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `tuskyAccountId` INTEGER NOT NULL, `authorServerId` TEXT NOT NULL, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `editedAt` INTEGER, `emojis` TEXT NOT NULL, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `mentions` TEXT NOT NULL, `tags` TEXT NOT NULL, `application` TEXT, `poll` TEXT, `muted` INTEGER NOT NULL, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, `filtered` TEXT NOT NULL, PRIMARY KEY(`serverId`, `tuskyAccountId`), FOREIGN KEY(`authorServerId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"editedAt\",\n            \"columnName\": \"editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filtered\",\n            \"columnName\": \"filtered\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_tuskyAccountId` ON `${TABLE_NAME}` (`authorServerId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `tuskyAccountId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `tuskyAccountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_editedAt` INTEGER, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.editedAt\",\n            \"columnName\": \"s_editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"NotificationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `type` TEXT, `id` TEXT NOT NULL, `accountId` TEXT, `statusId` TEXT, `reportId` TEXT, `loading` INTEGER NOT NULL, PRIMARY KEY(`id`, `tuskyAccountId`), FOREIGN KEY(`accountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`statusId`, `tuskyAccountId`) REFERENCES `TimelineStatusEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`reportId`, `tuskyAccountId`) REFERENCES `NotificationReportEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reportId\",\n            \"columnName\": \"reportId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"loading\",\n            \"columnName\": \"loading\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_NotificationEntity_accountId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_accountId_tuskyAccountId` ON `${TABLE_NAME}` (`accountId`, `tuskyAccountId`)\"\n          },\n          {\n            \"name\": \"index_NotificationEntity_statusId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_statusId_tuskyAccountId` ON `${TABLE_NAME}` (`statusId`, `tuskyAccountId`)\"\n          },\n          {\n            \"name\": \"index_NotificationEntity_reportId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reportId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_reportId_tuskyAccountId` ON `${TABLE_NAME}` (`reportId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          },\n          {\n            \"table\": \"TimelineStatusEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          },\n          {\n            \"table\": \"NotificationReportEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"reportId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"NotificationReportEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `serverId` TEXT NOT NULL, `category` TEXT NOT NULL, `statusIds` TEXT, `createdAt` INTEGER NOT NULL, `targetAccountId` TEXT, PRIMARY KEY(`serverId`, `tuskyAccountId`), FOREIGN KEY(`targetAccountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"statusIds\",\n            \"columnName\": \"statusIds\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"targetAccountId\",\n            \"columnName\": \"targetAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_NotificationReportEntity_targetAccountId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"targetAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationReportEntity_targetAccountId_tuskyAccountId` ON `${TABLE_NAME}` (`targetAccountId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"targetAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"HomeTimelineEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `statusId` TEXT, `reblogAccountId` TEXT, `loading` INTEGER NOT NULL, PRIMARY KEY(`id`, `tuskyAccountId`), FOREIGN KEY(`statusId`, `tuskyAccountId`) REFERENCES `TimelineStatusEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`reblogAccountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"loading\",\n            \"columnName\": \"loading\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_HomeTimelineEntity_statusId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_HomeTimelineEntity_statusId_tuskyAccountId` ON `${TABLE_NAME}` (`statusId`, `tuskyAccountId`)\"\n          },\n          {\n            \"name\": \"index_HomeTimelineEntity_reblogAccountId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reblogAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_HomeTimelineEntity_reblogAccountId_tuskyAccountId` ON `${TABLE_NAME}` (`reblogAccountId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineStatusEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          },\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"reblogAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f50579baaea33d99c59a34671799682a')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/64.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 64,\n    \"identityHash\": \"12c1f266e9fb1d7fea3dde12866eb338\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `failedToSendNew` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT, `statusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"failedToSendNew\",\n            \"columnName\": \"failedToSendNew\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsReports` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultReplyPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `notificationMarkerId` TEXT NOT NULL DEFAULT '0', `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL, `lastVisibleHomeTimelineStatusId` TEXT, `locked` INTEGER NOT NULL DEFAULT 0, `hasDirectMessageBadge` INTEGER NOT NULL DEFAULT 0, `isShowHomeBoosts` INTEGER NOT NULL, `isShowHomeReplies` INTEGER NOT NULL, `isShowHomeSelfBoosts` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReports\",\n            \"columnName\": \"notificationsReports\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultReplyPrivacy\",\n            \"columnName\": \"defaultReplyPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationMarkerId\",\n            \"columnName\": \"notificationMarkerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'0'\"\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastVisibleHomeTimelineStatusId\",\n            \"columnName\": \"lastVisibleHomeTimelineStatusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"locked\",\n            \"columnName\": \"locked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"hasDirectMessageBadge\",\n            \"columnName\": \"hasDirectMessageBadge\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"isShowHomeBoosts\",\n            \"columnName\": \"isShowHomeBoosts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isShowHomeReplies\",\n            \"columnName\": \"isShowHomeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isShowHomeSelfBoosts\",\n            \"columnName\": \"isShowHomeSelfBoosts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, `translationEnabled` INTEGER, `filterV2Supported` INTEGER NOT NULL DEFAULT false, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"translationEnabled\",\n            \"columnName\": \"translationEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filterV2Supported\",\n            \"columnName\": \"filterV2Supported\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"false\"\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"instance\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `tuskyAccountId` INTEGER NOT NULL, `authorServerId` TEXT NOT NULL, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `editedAt` INTEGER, `emojis` TEXT NOT NULL, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `mentions` TEXT NOT NULL, `tags` TEXT NOT NULL, `application` TEXT, `poll` TEXT, `muted` INTEGER NOT NULL, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, `filtered` TEXT NOT NULL, PRIMARY KEY(`serverId`, `tuskyAccountId`), FOREIGN KEY(`authorServerId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"editedAt\",\n            \"columnName\": \"editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filtered\",\n            \"columnName\": \"filtered\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_tuskyAccountId` ON `${TABLE_NAME}` (`authorServerId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `tuskyAccountId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `tuskyAccountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_editedAt` INTEGER, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.editedAt\",\n            \"columnName\": \"s_editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"NotificationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `type` TEXT, `id` TEXT NOT NULL, `accountId` TEXT, `statusId` TEXT, `reportId` TEXT, `loading` INTEGER NOT NULL, PRIMARY KEY(`id`, `tuskyAccountId`), FOREIGN KEY(`accountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`statusId`, `tuskyAccountId`) REFERENCES `TimelineStatusEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`reportId`, `tuskyAccountId`) REFERENCES `NotificationReportEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reportId\",\n            \"columnName\": \"reportId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"loading\",\n            \"columnName\": \"loading\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_NotificationEntity_accountId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_accountId_tuskyAccountId` ON `${TABLE_NAME}` (`accountId`, `tuskyAccountId`)\"\n          },\n          {\n            \"name\": \"index_NotificationEntity_statusId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_statusId_tuskyAccountId` ON `${TABLE_NAME}` (`statusId`, `tuskyAccountId`)\"\n          },\n          {\n            \"name\": \"index_NotificationEntity_reportId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reportId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_reportId_tuskyAccountId` ON `${TABLE_NAME}` (`reportId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          },\n          {\n            \"table\": \"TimelineStatusEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          },\n          {\n            \"table\": \"NotificationReportEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"reportId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"NotificationReportEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `serverId` TEXT NOT NULL, `category` TEXT NOT NULL, `statusIds` TEXT, `createdAt` INTEGER NOT NULL, `targetAccountId` TEXT, PRIMARY KEY(`serverId`, `tuskyAccountId`), FOREIGN KEY(`targetAccountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"statusIds\",\n            \"columnName\": \"statusIds\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"targetAccountId\",\n            \"columnName\": \"targetAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_NotificationReportEntity_targetAccountId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"targetAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationReportEntity_targetAccountId_tuskyAccountId` ON `${TABLE_NAME}` (`targetAccountId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"targetAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"HomeTimelineEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `statusId` TEXT, `reblogAccountId` TEXT, `loading` INTEGER NOT NULL, PRIMARY KEY(`id`, `tuskyAccountId`), FOREIGN KEY(`statusId`, `tuskyAccountId`) REFERENCES `TimelineStatusEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`reblogAccountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"loading\",\n            \"columnName\": \"loading\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_HomeTimelineEntity_statusId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_HomeTimelineEntity_statusId_tuskyAccountId` ON `${TABLE_NAME}` (`statusId`, `tuskyAccountId`)\"\n          },\n          {\n            \"name\": \"index_HomeTimelineEntity_reblogAccountId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reblogAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_HomeTimelineEntity_reblogAccountId_tuskyAccountId` ON `${TABLE_NAME}` (`reblogAccountId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineStatusEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          },\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"reblogAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '12c1f266e9fb1d7fea3dde12866eb338')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/66.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 66,\n    \"identityHash\": \"a17a9b196abd59db5104b46ea19c4d10\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `failedToSendNew` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT, `statusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"failedToSendNew\",\n            \"columnName\": \"failedToSendNew\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `profileHeaderUrl` TEXT NOT NULL DEFAULT '', `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsReports` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultReplyPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL DEFAULT 0, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `notificationMarkerId` TEXT NOT NULL DEFAULT '0', `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL, `lastVisibleHomeTimelineStatusId` TEXT, `locked` INTEGER NOT NULL DEFAULT 0, `hasDirectMessageBadge` INTEGER NOT NULL DEFAULT 0, `isShowHomeBoosts` INTEGER NOT NULL, `isShowHomeReplies` INTEGER NOT NULL, `isShowHomeSelfBoosts` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profileHeaderUrl\",\n            \"columnName\": \"profileHeaderUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"''\"\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSignUps\",\n            \"columnName\": \"notificationsSignUps\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReports\",\n            \"columnName\": \"notificationsReports\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultReplyPrivacy\",\n            \"columnName\": \"defaultReplyPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationMarkerId\",\n            \"columnName\": \"notificationMarkerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'0'\"\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastVisibleHomeTimelineStatusId\",\n            \"columnName\": \"lastVisibleHomeTimelineStatusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"locked\",\n            \"columnName\": \"locked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"hasDirectMessageBadge\",\n            \"columnName\": \"hasDirectMessageBadge\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"isShowHomeBoosts\",\n            \"columnName\": \"isShowHomeBoosts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isShowHomeReplies\",\n            \"columnName\": \"isShowHomeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isShowHomeSelfBoosts\",\n            \"columnName\": \"isShowHomeSelfBoosts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, `translationEnabled` INTEGER, `filterV2Supported` INTEGER NOT NULL DEFAULT false, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"translationEnabled\",\n            \"columnName\": \"translationEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filterV2Supported\",\n            \"columnName\": \"filterV2Supported\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"false\"\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"instance\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `tuskyAccountId` INTEGER NOT NULL, `authorServerId` TEXT NOT NULL, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `editedAt` INTEGER, `emojis` TEXT NOT NULL, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `mentions` TEXT NOT NULL, `tags` TEXT NOT NULL, `application` TEXT, `poll` TEXT, `muted` INTEGER NOT NULL, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, `filtered` TEXT NOT NULL, PRIMARY KEY(`serverId`, `tuskyAccountId`), FOREIGN KEY(`authorServerId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"editedAt\",\n            \"columnName\": \"editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filtered\",\n            \"columnName\": \"filtered\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_tuskyAccountId` ON `${TABLE_NAME}` (`authorServerId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `tuskyAccountId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `tuskyAccountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_editedAt` INTEGER, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.editedAt\",\n            \"columnName\": \"s_editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"NotificationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `type` TEXT, `id` TEXT NOT NULL, `accountId` TEXT, `statusId` TEXT, `reportId` TEXT, `loading` INTEGER NOT NULL, PRIMARY KEY(`id`, `tuskyAccountId`), FOREIGN KEY(`accountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`statusId`, `tuskyAccountId`) REFERENCES `TimelineStatusEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`reportId`, `tuskyAccountId`) REFERENCES `NotificationReportEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reportId\",\n            \"columnName\": \"reportId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"loading\",\n            \"columnName\": \"loading\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_NotificationEntity_accountId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_accountId_tuskyAccountId` ON `${TABLE_NAME}` (`accountId`, `tuskyAccountId`)\"\n          },\n          {\n            \"name\": \"index_NotificationEntity_statusId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_statusId_tuskyAccountId` ON `${TABLE_NAME}` (`statusId`, `tuskyAccountId`)\"\n          },\n          {\n            \"name\": \"index_NotificationEntity_reportId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reportId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_reportId_tuskyAccountId` ON `${TABLE_NAME}` (`reportId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          },\n          {\n            \"table\": \"TimelineStatusEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          },\n          {\n            \"table\": \"NotificationReportEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"reportId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"NotificationReportEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `serverId` TEXT NOT NULL, `category` TEXT NOT NULL, `statusIds` TEXT, `createdAt` INTEGER NOT NULL, `targetAccountId` TEXT, PRIMARY KEY(`serverId`, `tuskyAccountId`), FOREIGN KEY(`targetAccountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"statusIds\",\n            \"columnName\": \"statusIds\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"targetAccountId\",\n            \"columnName\": \"targetAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_NotificationReportEntity_targetAccountId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"targetAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationReportEntity_targetAccountId_tuskyAccountId` ON `${TABLE_NAME}` (`targetAccountId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"targetAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"HomeTimelineEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `statusId` TEXT, `reblogAccountId` TEXT, `loading` INTEGER NOT NULL, PRIMARY KEY(`id`, `tuskyAccountId`), FOREIGN KEY(`statusId`, `tuskyAccountId`) REFERENCES `TimelineStatusEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`reblogAccountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"loading\",\n            \"columnName\": \"loading\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_HomeTimelineEntity_statusId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_HomeTimelineEntity_statusId_tuskyAccountId` ON `${TABLE_NAME}` (`statusId`, `tuskyAccountId`)\"\n          },\n          {\n            \"name\": \"index_HomeTimelineEntity_reblogAccountId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reblogAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_HomeTimelineEntity_reblogAccountId_tuskyAccountId` ON `${TABLE_NAME}` (`reblogAccountId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineStatusEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          },\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"reblogAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'a17a9b196abd59db5104b46ea19c4d10')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/68.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 68,\n    \"identityHash\": \"45583265bb92757d39163ee6c19dc4e5\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `failedToSendNew` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT, `statusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"failedToSendNew\",\n            \"columnName\": \"failedToSendNew\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `profileHeaderUrl` TEXT NOT NULL DEFAULT '', `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsAdmin` INTEGER NOT NULL DEFAULT true, `notificationsOther` INTEGER NOT NULL DEFAULT true, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultReplyPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL DEFAULT 0, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `notificationMarkerId` TEXT NOT NULL DEFAULT '0', `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL, `lastVisibleHomeTimelineStatusId` TEXT, `locked` INTEGER NOT NULL DEFAULT 0, `hasDirectMessageBadge` INTEGER NOT NULL DEFAULT 0, `isShowHomeBoosts` INTEGER NOT NULL, `isShowHomeReplies` INTEGER NOT NULL, `isShowHomeSelfBoosts` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profileHeaderUrl\",\n            \"columnName\": \"profileHeaderUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"''\"\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsAdmin\",\n            \"columnName\": \"notificationsAdmin\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"true\"\n          },\n          {\n            \"fieldPath\": \"notificationsOther\",\n            \"columnName\": \"notificationsOther\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"true\"\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultReplyPrivacy\",\n            \"columnName\": \"defaultReplyPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationMarkerId\",\n            \"columnName\": \"notificationMarkerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'0'\"\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastVisibleHomeTimelineStatusId\",\n            \"columnName\": \"lastVisibleHomeTimelineStatusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"locked\",\n            \"columnName\": \"locked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"hasDirectMessageBadge\",\n            \"columnName\": \"hasDirectMessageBadge\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"isShowHomeBoosts\",\n            \"columnName\": \"isShowHomeBoosts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isShowHomeReplies\",\n            \"columnName\": \"isShowHomeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isShowHomeSelfBoosts\",\n            \"columnName\": \"isShowHomeSelfBoosts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, `translationEnabled` INTEGER, `filterV2Supported` INTEGER NOT NULL DEFAULT false, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"translationEnabled\",\n            \"columnName\": \"translationEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filterV2Supported\",\n            \"columnName\": \"filterV2Supported\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"false\"\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"instance\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `tuskyAccountId` INTEGER NOT NULL, `authorServerId` TEXT NOT NULL, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `editedAt` INTEGER, `emojis` TEXT NOT NULL, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `mentions` TEXT NOT NULL, `tags` TEXT NOT NULL, `application` TEXT, `poll` TEXT, `muted` INTEGER NOT NULL, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, `filtered` TEXT NOT NULL, PRIMARY KEY(`serverId`, `tuskyAccountId`), FOREIGN KEY(`authorServerId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"editedAt\",\n            \"columnName\": \"editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filtered\",\n            \"columnName\": \"filtered\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_tuskyAccountId` ON `${TABLE_NAME}` (`authorServerId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `tuskyAccountId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `note` TEXT NOT NULL DEFAULT '', `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `tuskyAccountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"note\",\n            \"columnName\": \"note\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"''\"\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_editedAt` INTEGER, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.editedAt\",\n            \"columnName\": \"s_editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"NotificationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `type` TEXT, `id` TEXT NOT NULL, `accountId` TEXT, `statusId` TEXT, `reportId` TEXT, `event` TEXT, `moderationWarning` TEXT, `loading` INTEGER NOT NULL, PRIMARY KEY(`id`, `tuskyAccountId`), FOREIGN KEY(`accountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`statusId`, `tuskyAccountId`) REFERENCES `TimelineStatusEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`reportId`, `tuskyAccountId`) REFERENCES `NotificationReportEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reportId\",\n            \"columnName\": \"reportId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"event\",\n            \"columnName\": \"event\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"moderationWarning\",\n            \"columnName\": \"moderationWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"loading\",\n            \"columnName\": \"loading\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_NotificationEntity_accountId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_accountId_tuskyAccountId` ON `${TABLE_NAME}` (`accountId`, `tuskyAccountId`)\"\n          },\n          {\n            \"name\": \"index_NotificationEntity_statusId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_statusId_tuskyAccountId` ON `${TABLE_NAME}` (`statusId`, `tuskyAccountId`)\"\n          },\n          {\n            \"name\": \"index_NotificationEntity_reportId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reportId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_reportId_tuskyAccountId` ON `${TABLE_NAME}` (`reportId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          },\n          {\n            \"table\": \"TimelineStatusEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          },\n          {\n            \"table\": \"NotificationReportEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"reportId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"NotificationReportEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `serverId` TEXT NOT NULL, `category` TEXT NOT NULL, `statusIds` TEXT, `createdAt` INTEGER NOT NULL, `targetAccountId` TEXT, PRIMARY KEY(`serverId`, `tuskyAccountId`), FOREIGN KEY(`targetAccountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"statusIds\",\n            \"columnName\": \"statusIds\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"targetAccountId\",\n            \"columnName\": \"targetAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_NotificationReportEntity_targetAccountId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"targetAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationReportEntity_targetAccountId_tuskyAccountId` ON `${TABLE_NAME}` (`targetAccountId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"targetAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"HomeTimelineEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `statusId` TEXT, `reblogAccountId` TEXT, `loading` INTEGER NOT NULL, PRIMARY KEY(`id`, `tuskyAccountId`), FOREIGN KEY(`statusId`, `tuskyAccountId`) REFERENCES `TimelineStatusEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`reblogAccountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"loading\",\n            \"columnName\": \"loading\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_HomeTimelineEntity_statusId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_HomeTimelineEntity_statusId_tuskyAccountId` ON `${TABLE_NAME}` (`statusId`, `tuskyAccountId`)\"\n          },\n          {\n            \"name\": \"index_HomeTimelineEntity_reblogAccountId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reblogAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_HomeTimelineEntity_reblogAccountId_tuskyAccountId` ON `${TABLE_NAME}` (`reblogAccountId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineStatusEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          },\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"reblogAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"NotificationPolicyEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `pendingRequestsCount` INTEGER NOT NULL, `pendingNotificationsCount` INTEGER NOT NULL, PRIMARY KEY(`tuskyAccountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pendingRequestsCount\",\n            \"columnName\": \"pendingRequestsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pendingNotificationsCount\",\n            \"columnName\": \"pendingNotificationsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '45583265bb92757d39163ee6c19dc4e5')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.keylesspalace.tusky.db.AppDatabase/70.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 70,\n    \"identityHash\": \"f1ac7b67aa0a9a279f7f35f5817b6a17\",\n    \"entities\": [\n      {\n        \"tableName\": \"DraftEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `failedToSendNew` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT, `statusId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"contentWarning\",\n            \"columnName\": \"contentWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"failedToSend\",\n            \"columnName\": \"failedToSend\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"failedToSendNew\",\n            \"columnName\": \"failedToSendNew\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"scheduledAt\",\n            \"columnName\": \"scheduledAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"AccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `profileHeaderUrl` TEXT NOT NULL DEFAULT '', `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsAdmin` INTEGER NOT NULL DEFAULT true, `notificationsOther` INTEGER NOT NULL DEFAULT true, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultReplyPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL DEFAULT 0, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `notificationMarkerId` TEXT NOT NULL DEFAULT '0', `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL, `lastVisibleHomeTimelineStatusId` TEXT, `locked` INTEGER NOT NULL DEFAULT 0, `hasDirectMessageBadge` INTEGER NOT NULL DEFAULT 0, `isShowHomeBoosts` INTEGER NOT NULL, `isShowHomeReplies` INTEGER NOT NULL, `isShowHomeSelfBoosts` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"domain\",\n            \"columnName\": \"domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessToken\",\n            \"columnName\": \"accessToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"clientId\",\n            \"columnName\": \"clientId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientSecret\",\n            \"columnName\": \"clientSecret\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isActive\",\n            \"columnName\": \"isActive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profilePictureUrl\",\n            \"columnName\": \"profilePictureUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"profileHeaderUrl\",\n            \"columnName\": \"profileHeaderUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"''\"\n          },\n          {\n            \"fieldPath\": \"notificationsEnabled\",\n            \"columnName\": \"notificationsEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsMentioned\",\n            \"columnName\": \"notificationsMentioned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowed\",\n            \"columnName\": \"notificationsFollowed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFollowRequested\",\n            \"columnName\": \"notificationsFollowRequested\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsReblogged\",\n            \"columnName\": \"notificationsReblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFavorited\",\n            \"columnName\": \"notificationsFavorited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsPolls\",\n            \"columnName\": \"notificationsPolls\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsSubscriptions\",\n            \"columnName\": \"notificationsSubscriptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsUpdates\",\n            \"columnName\": \"notificationsUpdates\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsAdmin\",\n            \"columnName\": \"notificationsAdmin\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"true\"\n          },\n          {\n            \"fieldPath\": \"notificationsOther\",\n            \"columnName\": \"notificationsOther\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"true\"\n          },\n          {\n            \"fieldPath\": \"notificationSound\",\n            \"columnName\": \"notificationSound\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationVibration\",\n            \"columnName\": \"notificationVibration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationLight\",\n            \"columnName\": \"notificationLight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostPrivacy\",\n            \"columnName\": \"defaultPostPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultReplyPrivacy\",\n            \"columnName\": \"defaultReplyPrivacy\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultMediaSensitivity\",\n            \"columnName\": \"defaultMediaSensitivity\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"defaultPostLanguage\",\n            \"columnName\": \"defaultPostLanguage\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysShowSensitiveMedia\",\n            \"columnName\": \"alwaysShowSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"alwaysOpenSpoiler\",\n            \"columnName\": \"alwaysOpenSpoiler\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"mediaPreviewEnabled\",\n            \"columnName\": \"mediaPreviewEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastNotificationId\",\n            \"columnName\": \"lastNotificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationMarkerId\",\n            \"columnName\": \"notificationMarkerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'0'\"\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tabPreferences\",\n            \"columnName\": \"tabPreferences\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationsFilter\",\n            \"columnName\": \"notificationsFilter\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"oauthScopes\",\n            \"columnName\": \"oauthScopes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unifiedPushUrl\",\n            \"columnName\": \"unifiedPushUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPubKey\",\n            \"columnName\": \"pushPubKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushPrivKey\",\n            \"columnName\": \"pushPrivKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushAuth\",\n            \"columnName\": \"pushAuth\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pushServerKey\",\n            \"columnName\": \"pushServerKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastVisibleHomeTimelineStatusId\",\n            \"columnName\": \"lastVisibleHomeTimelineStatusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"locked\",\n            \"columnName\": \"locked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"hasDirectMessageBadge\",\n            \"columnName\": \"hasDirectMessageBadge\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"0\"\n          },\n          {\n            \"fieldPath\": \"isShowHomeBoosts\",\n            \"columnName\": \"isShowHomeBoosts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isShowHomeReplies\",\n            \"columnName\": \"isShowHomeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isShowHomeSelfBoosts\",\n            \"columnName\": \"isShowHomeSelfBoosts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_AccountEntity_domain_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"domain\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"InstanceEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, `translationEnabled` INTEGER, `mastodonApiVersion` INTEGER, `filterV2Supported` INTEGER NOT NULL DEFAULT false, PRIMARY KEY(`instance`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"instance\",\n            \"columnName\": \"instance\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiList\",\n            \"columnName\": \"emojiList\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maximumTootCharacters\",\n            \"columnName\": \"maximumTootCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptions\",\n            \"columnName\": \"maxPollOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollOptionLength\",\n            \"columnName\": \"maxPollOptionLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"minPollDuration\",\n            \"columnName\": \"minPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxPollDuration\",\n            \"columnName\": \"maxPollDuration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"charactersReservedPerUrl\",\n            \"columnName\": \"charactersReservedPerUrl\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"videoSizeLimit\",\n            \"columnName\": \"videoSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageSizeLimit\",\n            \"columnName\": \"imageSizeLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imageMatrixLimit\",\n            \"columnName\": \"imageMatrixLimit\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxMediaAttachments\",\n            \"columnName\": \"maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFields\",\n            \"columnName\": \"maxFields\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldNameLength\",\n            \"columnName\": \"maxFieldNameLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxFieldValueLength\",\n            \"columnName\": \"maxFieldValueLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"translationEnabled\",\n            \"columnName\": \"translationEnabled\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonApiVersion\",\n            \"columnName\": \"mastodonApiVersion\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filterV2Supported\",\n            \"columnName\": \"filterV2Supported\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true,\n            \"defaultValue\": \"false\"\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"instance\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TimelineStatusEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `tuskyAccountId` INTEGER NOT NULL, `authorServerId` TEXT NOT NULL, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `editedAt` INTEGER, `emojis` TEXT NOT NULL, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `mentions` TEXT NOT NULL, `tags` TEXT NOT NULL, `application` TEXT, `poll` TEXT, `muted` INTEGER NOT NULL, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, `filtered` TEXT NOT NULL, PRIMARY KEY(`serverId`, `tuskyAccountId`), FOREIGN KEY(`authorServerId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"authorServerId\",\n            \"columnName\": \"authorServerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"inReplyToId\",\n            \"columnName\": \"inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"inReplyToAccountId\",\n            \"columnName\": \"inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"content\",\n            \"columnName\": \"content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"editedAt\",\n            \"columnName\": \"editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogsCount\",\n            \"columnName\": \"reblogsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favouritesCount\",\n            \"columnName\": \"favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repliesCount\",\n            \"columnName\": \"repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reblogged\",\n            \"columnName\": \"reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bookmarked\",\n            \"columnName\": \"bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"favourited\",\n            \"columnName\": \"favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sensitive\",\n            \"columnName\": \"sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"spoilerText\",\n            \"columnName\": \"spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"attachments\",\n            \"columnName\": \"attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mentions\",\n            \"columnName\": \"mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tags\",\n            \"columnName\": \"tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"application\",\n            \"columnName\": \"application\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"muted\",\n            \"columnName\": \"muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expanded\",\n            \"columnName\": \"expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentCollapsed\",\n            \"columnName\": \"contentCollapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"contentShowing\",\n            \"columnName\": \"contentShowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pinned\",\n            \"columnName\": \"pinned\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"card\",\n            \"columnName\": \"card\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"language\",\n            \"columnName\": \"language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filtered\",\n            \"columnName\": \"filtered\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_TimelineStatusEntity_authorServerId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"authorServerId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_tuskyAccountId` ON `${TABLE_NAME}` (`authorServerId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"authorServerId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"TimelineAccountEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `tuskyAccountId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `note` TEXT NOT NULL DEFAULT '', `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `tuskyAccountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localUsername\",\n            \"columnName\": \"localUsername\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayName\",\n            \"columnName\": \"displayName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatar\",\n            \"columnName\": \"avatar\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"note\",\n            \"columnName\": \"note\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"''\"\n          },\n          {\n            \"fieldPath\": \"emojis\",\n            \"columnName\": \"emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bot\",\n            \"columnName\": \"bot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"ConversationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_editedAt` INTEGER, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"order\",\n            \"columnName\": \"order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accounts\",\n            \"columnName\": \"accounts\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"unread\",\n            \"columnName\": \"unread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.id\",\n            \"columnName\": \"s_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.url\",\n            \"columnName\": \"s_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToId\",\n            \"columnName\": \"s_inReplyToId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.inReplyToAccountId\",\n            \"columnName\": \"s_inReplyToAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.account\",\n            \"columnName\": \"s_account\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.content\",\n            \"columnName\": \"s_content\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.createdAt\",\n            \"columnName\": \"s_createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.editedAt\",\n            \"columnName\": \"s_editedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.emojis\",\n            \"columnName\": \"s_emojis\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favouritesCount\",\n            \"columnName\": \"s_favouritesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.repliesCount\",\n            \"columnName\": \"s_repliesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.favourited\",\n            \"columnName\": \"s_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.bookmarked\",\n            \"columnName\": \"s_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.sensitive\",\n            \"columnName\": \"s_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.spoilerText\",\n            \"columnName\": \"s_spoilerText\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.attachments\",\n            \"columnName\": \"s_attachments\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.mentions\",\n            \"columnName\": \"s_mentions\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.tags\",\n            \"columnName\": \"s_tags\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.showingHiddenContent\",\n            \"columnName\": \"s_showingHiddenContent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.expanded\",\n            \"columnName\": \"s_expanded\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.collapsed\",\n            \"columnName\": \"s_collapsed\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.muted\",\n            \"columnName\": \"s_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastStatus.poll\",\n            \"columnName\": \"s_poll\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"lastStatus.language\",\n            \"columnName\": \"s_language\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"NotificationEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `type` TEXT, `id` TEXT NOT NULL, `accountId` TEXT, `statusId` TEXT, `reportId` TEXT, `event` TEXT, `moderationWarning` TEXT, `loading` INTEGER NOT NULL, PRIMARY KEY(`id`, `tuskyAccountId`), FOREIGN KEY(`accountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`statusId`, `tuskyAccountId`) REFERENCES `TimelineStatusEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`reportId`, `tuskyAccountId`) REFERENCES `NotificationReportEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reportId\",\n            \"columnName\": \"reportId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"event\",\n            \"columnName\": \"event\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"moderationWarning\",\n            \"columnName\": \"moderationWarning\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"loading\",\n            \"columnName\": \"loading\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_NotificationEntity_accountId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_accountId_tuskyAccountId` ON `${TABLE_NAME}` (`accountId`, `tuskyAccountId`)\"\n          },\n          {\n            \"name\": \"index_NotificationEntity_statusId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_statusId_tuskyAccountId` ON `${TABLE_NAME}` (`statusId`, `tuskyAccountId`)\"\n          },\n          {\n            \"name\": \"index_NotificationEntity_reportId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reportId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_reportId_tuskyAccountId` ON `${TABLE_NAME}` (`reportId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          },\n          {\n            \"table\": \"TimelineStatusEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          },\n          {\n            \"table\": \"NotificationReportEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"reportId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"NotificationReportEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `serverId` TEXT NOT NULL, `category` TEXT NOT NULL, `statusIds` TEXT, `createdAt` INTEGER NOT NULL, `targetAccountId` TEXT, PRIMARY KEY(`serverId`, `tuskyAccountId`), FOREIGN KEY(`targetAccountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"statusIds\",\n            \"columnName\": \"statusIds\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"targetAccountId\",\n            \"columnName\": \"targetAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"serverId\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_NotificationReportEntity_targetAccountId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"targetAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_NotificationReportEntity_targetAccountId_tuskyAccountId` ON `${TABLE_NAME}` (`targetAccountId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"targetAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"HomeTimelineEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `statusId` TEXT, `reblogAccountId` TEXT, `loading` INTEGER NOT NULL, PRIMARY KEY(`id`, `tuskyAccountId`), FOREIGN KEY(`statusId`, `tuskyAccountId`) REFERENCES `TimelineStatusEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`reblogAccountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"statusId\",\n            \"columnName\": \"statusId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reblogAccountId\",\n            \"columnName\": \"reblogAccountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"loading\",\n            \"columnName\": \"loading\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\",\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_HomeTimelineEntity_statusId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_HomeTimelineEntity_statusId_tuskyAccountId` ON `${TABLE_NAME}` (`statusId`, `tuskyAccountId`)\"\n          },\n          {\n            \"name\": \"index_HomeTimelineEntity_reblogAccountId_tuskyAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reblogAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_HomeTimelineEntity_reblogAccountId_tuskyAccountId` ON `${TABLE_NAME}` (`reblogAccountId`, `tuskyAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"TimelineStatusEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"statusId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          },\n          {\n            \"table\": \"TimelineAccountEntity\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"reblogAccountId\",\n              \"tuskyAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"serverId\",\n              \"tuskyAccountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"NotificationPolicyEntity\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tuskyAccountId` INTEGER NOT NULL, `pendingRequestsCount` INTEGER NOT NULL, `pendingNotificationsCount` INTEGER NOT NULL, PRIMARY KEY(`tuskyAccountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"tuskyAccountId\",\n            \"columnName\": \"tuskyAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pendingRequestsCount\",\n            \"columnName\": \"pendingRequestsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pendingNotificationsCount\",\n            \"columnName\": \"pendingNotificationsCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"tuskyAccountId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f1ac7b67aa0a9a279f7f35f5817b6a17')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/src/green/res/values/flavor-colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <color name=\"notification_color\">@color/tusky_green</color>\n\n    <color name=\"icon_background\">#097b44</color>\n    <color name=\"icon_highlight\">#39ff9e</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\" >\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission android:name=\"android.permission.POST_NOTIFICATIONS\" />\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" android:maxSdkVersion=\"28\" />\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" android:maxSdkVersion=\"28\"/>\n    <uses-permission android:name=\"android.permission.VIBRATE\" /> <!-- For notifications -->\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\" />\n\n    <application\n        android:name=\".TuskyApplication\"\n        android:appCategory=\"social\"\n        android:allowBackup=\"false\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/TuskyTheme\"\n        android:usesCleartextTraffic=\"false\"\n        android:localeConfig=\"@xml/locales_config\"\n        android:enableOnBackInvokedCallback=\"true\"\n        android:networkSecurityConfig=\"@xml/network_security_config\">\n\n        <activity\n            android:name=\".components.login.LoginActivity\"\n            android:windowSoftInputMode=\"adjustResize\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n\n                <data\n                    android:host=\"${applicationId}\"\n                    android:scheme=\"@string/oauth_scheme\" />\n            </intent-filter>\n        </activity>\n        <activity android:name=\".components.login.LoginWebViewActivity\" />\n        <activity\n            android:name=\".MainActivity\"\n            android:exported=\"true\"\n            android:alwaysRetainTaskState=\"true\"\n            android:maxRecents=\"1\"\n            android:theme=\"@style/SplashTheme\">\n\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.SEND\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data android:mimeType=\"text/plain\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.SEND\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data android:mimeType=\"image/*\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.SEND\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data android:mimeType=\"video/*\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.SEND_MULTIPLE\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data android:mimeType=\"image/*\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.SEND_MULTIPLE\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data android:mimeType=\"video/*\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.SEND\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data android:mimeType=\"audio/*\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.app.shortcuts\"\n                android:resource=\"@xml/share_shortcuts\" />\n            <meta-data\n                android:name=\"android.service.chooser.chooser_target_service\"\n                android:value=\"androidx.sharetarget.ChooserTargetServiceCompat\" />\n\n        </activity>\n        <!-- When content is shared to Tusky ComposeActivity can be the only active activity,\n             so it must be excluded from recents or the sharing process can be restarted from recents\n             which would be very unexpected -->\n        <activity\n            android:name=\".components.compose.ComposeActivity\"\n            android:theme=\"@style/TuskyDialogActivityTheme\"\n            android:alwaysRetainTaskState=\"true\" />\n        <activity\n            android:name=\".components.viewthread.ViewThreadActivity\"\n            android:configChanges=\"orientation|screenSize\" />\n        <activity\n            android:name=\".ViewMediaActivity\"\n            android:theme=\"@style/TuskyBaseTheme\"\n            android:configChanges=\"orientation|screenSize|keyboardHidden|screenLayout|smallestScreenSize\" />\n        <activity android:name=\".components.account.AccountActivity\" />\n        <activity android:name=\".EditProfileActivity\"/>\n        <activity android:name=\".components.preference.PreferencesActivity\" />\n        <activity android:name=\".StatusListActivity\" />\n        <activity android:name=\".components.accountlist.AccountListActivity\" />\n        <activity android:name=\".AboutActivity\" />\n        <activity android:name=\".TabPreferenceActivity\" />\n        <activity\n            android:name=\"com.canhub.cropper.CropImageActivity\"\n            android:theme=\"@style/Base.Theme.AppCompat\" />\n        <activity\n            android:name=\".components.search.SearchActivity\"\n            android:launchMode=\"singleTask\"\n            android:exported=\"false\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.SEARCH\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.app.searchable\"\n                android:resource=\"@xml/searchable\" />\n        </activity>\n        <activity android:name=\".ListsActivity\" />\n        <activity android:name=\".LicenseActivity\" />\n        <activity android:name=\".components.filters.FiltersActivity\" />\n        <activity android:name=\".components.trending.TrendingActivity\" />\n        <activity android:name=\".components.followedtags.FollowedTagsActivity\" />\n        <activity\n            android:name=\".components.report.ReportActivity\"\n            android:windowSoftInputMode=\"stateAlwaysHidden|adjustResize\" />\n        <activity android:name=\".components.domainblocks.DomainBlocksActivity\" />\n        <activity android:name=\".components.scheduled.ScheduledStatusActivity\" />\n        <activity android:name=\".components.announcements.AnnouncementsActivity\" />\n        <activity android:name=\".components.drafts.DraftsActivity\" />\n        <activity android:name=\"com.keylesspalace.tusky.components.filters.EditFilterActivity\"\n            android:windowSoftInputMode=\"adjustResize\" />\n        <activity android:name=\".components.preference.notificationpolicies.NotificationPoliciesActivity\"/>\n        <activity android:name=\".components.notifications.requests.NotificationRequestsActivity\"/>\n        <activity android:name=\".components.notifications.requests.details.NotificationRequestDetailsActivity\"/>\n\n        <receiver\n            android:name=\".receiver.SendStatusBroadcastReceiver\"\n            android:enabled=\"true\"\n            android:exported=\"false\" />\n        <receiver\n            android:exported=\"true\"\n            android:enabled=\"true\"\n            android:name=\".receiver.UnifiedPushBroadcastReceiver\"\n            tools:ignore=\"ExportedReceiver\">\n            <intent-filter>\n                <action android:name=\"org.unifiedpush.android.connector.MESSAGE\"/>\n                <action android:name=\"org.unifiedpush.android.connector.UNREGISTERED\"/>\n                <action android:name=\"org.unifiedpush.android.connector.NEW_ENDPOINT\"/>\n                <action android:name=\"org.unifiedpush.android.connector.REGISTRATION_FAILED\"/>\n                <action android:name=\"org.unifiedpush.android.connector.REGISTRATION_REFUSED\"/>\n            </intent-filter>\n        </receiver>\n        <receiver\n            android:exported=\"true\"\n            android:enabled=\"true\"\n            android:name=\".receiver.NotificationBlockStateBroadcastReceiver\"\n            tools:ignore=\"ExportedReceiver\">\n            <intent-filter>\n                <action android:name=\"android.app.action.NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED\"/>\n                <action android:name=\"android.app.action.NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED\"/>\n            </intent-filter>\n        </receiver>\n\n        <service\n            android:name=\".service.TuskyTileService\"\n            android:icon=\"@drawable/tusky_quicksettings_icon\"\n            android:label=\"@string/tusky_compose_post_quicksetting_label\"\n            android:permission=\"android.permission.BIND_QUICK_SETTINGS_TILE\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.service.quicksettings.action.QS_TILE\" />\n            </intent-filter>\n        </service>\n\n        <service android:name=\".service.SendStatusService\"\n            android:foregroundServiceType=\"shortService\"\n            android:exported=\"false\" />\n\n        <provider\n            android:name=\"androidx.core.content.FileProvider\"\n            android:authorities=\"${applicationId}.fileprovider\"\n            android:exported=\"false\"\n            android:grantUriPermissions=\"true\">\n            <meta-data\n                android:name=\"android.support.FILE_PROVIDER_PATHS\"\n                android:resource=\"@xml/file_paths\" />\n        </provider>\n\n        <!-- disable automatic WorkManager initialization -->\n        <provider\n            android:name=\"androidx.startup.InitializationProvider\"\n            android:authorities=\"${applicationId}.androidx-startup\"\n            android:exported=\"false\"\n            tools:node=\"merge\">\n            <meta-data\n                android:name=\"androidx.work.WorkManagerInitializer\"\n                android:value=\"androidx.startup\"\n                tools:node=\"remove\" />\n        </provider>\n\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/AboutActivity.kt",
    "content": "package com.keylesspalace.tusky\n\nimport android.content.Intent\nimport android.os.Build\nimport android.os.Bundle\nimport android.text.SpannableString\nimport android.text.SpannableStringBuilder\nimport android.text.method.LinkMovementMethod\nimport android.text.style.URLSpan\nimport android.text.util.Linkify\nimport android.widget.TextView\nimport androidx.annotation.StringRes\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat.Type.systemBars\nimport androidx.core.view.updatePadding\nimport androidx.lifecycle.lifecycleScope\nimport com.keylesspalace.tusky.components.instanceinfo.InstanceInfoRepository\nimport com.keylesspalace.tusky.databinding.ActivityAboutBinding\nimport com.keylesspalace.tusky.util.NoUnderlineURLSpan\nimport com.keylesspalace.tusky.util.copyToClipboard\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass AboutActivity : BottomSheetActivity() {\n    @Inject\n    lateinit var instanceInfoRepository: InstanceInfoRepository\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        val binding = ActivityAboutBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n\n        setSupportActionBar(binding.includedToolbar.toolbar)\n        supportActionBar?.run {\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n        }\n\n        setTitle(R.string.about_title_activity)\n\n        ViewCompat.setOnApplyWindowInsetsListener(binding.scrollView) { scrollView, insets ->\n            val systemBarInsets = insets.getInsets(systemBars())\n            scrollView.updatePadding(bottom = systemBarInsets.bottom)\n\n            insets.inset(0, 0, 0, systemBarInsets.bottom)\n        }\n\n        binding.versionTextView.text = getString(R.string.about_app_version, getString(R.string.app_name), BuildConfig.VERSION_NAME)\n\n        binding.deviceInfo.text = getString(\n            R.string.about_device_info,\n            Build.MANUFACTURER,\n            Build.MODEL,\n            Build.VERSION.RELEASE,\n            Build.VERSION.SDK_INT\n        )\n\n        lifecycleScope.launch {\n            accountManager.activeAccount?.let { account ->\n                val instanceInfo = instanceInfoRepository.getUpdatedInstanceInfoOrFallback()\n                binding.accountInfo.text = getString(\n                    R.string.about_account_info,\n                    account.username,\n                    account.domain,\n                    instanceInfo.version\n                )\n                binding.accountInfoTitle.show()\n                binding.accountInfo.show()\n            }\n        }\n\n        if (BuildConfig.CUSTOM_INSTANCE.isBlank()) {\n            binding.aboutPoweredByTusky.hide()\n        }\n\n        binding.aboutLicenseInfoTextView.setClickableTextWithoutUnderlines(\n            R.string.about_tusky_license\n        )\n        binding.aboutWebsiteInfoTextView.setClickableTextWithoutUnderlines(\n            R.string.about_project_site\n        )\n        binding.aboutBugsFeaturesInfoTextView.setClickableTextWithoutUnderlines(\n            R.string.about_bug_feature_request_site\n        )\n\n        binding.tuskyProfileButton.setOnClickListener {\n            viewUrl(BuildConfig.SUPPORT_ACCOUNT_URL)\n        }\n\n        binding.aboutLicensesButton.setOnClickListener {\n            startActivityWithSlideInAnimation(Intent(this, LicenseActivity::class.java))\n        }\n\n        binding.copyDeviceInfo.setOnClickListener {\n            copyToClipboard(\n                \"${binding.versionTextView.text}\\n\\nDevice:\\n\\n${binding.deviceInfo.text}\\n\\nAccount:\\n\\n${binding.accountInfo.text}\",\n                getString(R.string.about_copied),\n                \"Tusky version information\",\n            )\n        }\n    }\n}\n\nprivate fun TextView.setClickableTextWithoutUnderlines(@StringRes textId: Int) {\n    val text = SpannableString(context.getText(textId))\n\n    Linkify.addLinks(text, Linkify.WEB_URLS)\n\n    val builder = SpannableStringBuilder(text)\n    val urlSpans = text.getSpans(0, text.length, URLSpan::class.java)\n    for (span in urlSpans) {\n        val start = builder.getSpanStart(span)\n        val end = builder.getSpanEnd(span)\n        val flags = builder.getSpanFlags(span)\n\n        val customSpan = NoUnderlineURLSpan(span.url)\n\n        builder.removeSpan(span)\n        builder.setSpan(customSpan, start, end, flags)\n    }\n\n    setText(builder)\n    linksClickable = true\n    movementMethod = LinkMovementMethod.getInstance()\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/AccountsInListFragment.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky\n\nimport android.content.SharedPreferences\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.LinearLayout\nimport androidx.appcompat.widget.SearchView\nimport androidx.fragment.app.DialogFragment\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.ListAdapter\nimport com.keylesspalace.tusky.databinding.FragmentAccountsInListBinding\nimport com.keylesspalace.tusky.databinding.ItemFollowRequestBinding\nimport com.keylesspalace.tusky.entity.TimelineAccount\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.util.BindingHolder\nimport com.keylesspalace.tusky.util.emojify\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.loadAvatar\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.unsafeLazy\nimport com.keylesspalace.tusky.util.visible\nimport com.keylesspalace.tusky.viewmodel.AccountsInListViewModel\nimport com.keylesspalace.tusky.viewmodel.State\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.launch\n\nprivate typealias AccountInfo = Pair<TimelineAccount, Boolean>\n\n@AndroidEntryPoint\nclass AccountsInListFragment : DialogFragment() {\n\n    @Inject\n    lateinit var preferences: SharedPreferences\n\n    private val viewModel: AccountsInListViewModel by viewModels()\n    private lateinit var binding: FragmentAccountsInListBinding\n\n    private lateinit var listId: String\n    private lateinit var listName: String\n\n    private val radius by unsafeLazy { resources.getDimensionPixelSize(R.dimen.avatar_radius_48dp) }\n\n    private val animateAvatar by unsafeLazy { preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false) }\n    private val animateEmojis by unsafeLazy { preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false) }\n    private val showBotOverlay by unsafeLazy { preferences.getBoolean(PrefKeys.SHOW_BOT_OVERLAY, true) }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        val args = requireArguments()\n        listId = args.getString(LIST_ID_ARG)!!\n        listName = args.getString(LIST_NAME_ARG)!!\n\n        viewModel.load(listId)\n    }\n\n    override fun getTheme() = R.style.TuskyDialogFragment\n\n    override fun onStart() {\n        super.onStart()\n        dialog?.apply {\n            // Stretch dialog to the window\n            window?.setLayout(\n                LinearLayout.LayoutParams.MATCH_PARENT,\n                LinearLayout.LayoutParams.MATCH_PARENT\n            )\n        }\n    }\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {\n        binding = FragmentAccountsInListBinding.inflate(layoutInflater)\n        val adapter = Adapter()\n        val searchAdapter = SearchAdapter()\n\n        binding.accountsRecycler.layoutManager = LinearLayoutManager(binding.root.context)\n        binding.accountsRecycler.adapter = adapter\n\n        binding.accountsSearchRecycler.layoutManager = LinearLayoutManager(binding.root.context)\n        binding.accountsSearchRecycler.adapter = searchAdapter\n\n        lifecycleScope.launch {\n            viewModel.state.collect { state ->\n                adapter.submitList(state.accounts.getOrDefault(emptyList()))\n\n                state.accounts.fold(\n                    onSuccess = { binding.messageView.hide() },\n                    onFailure = { handleError(it) }\n                )\n\n                setupSearchView(searchAdapter, state)\n            }\n        }\n\n        binding.searchView.isSubmitButtonEnabled = true\n        binding.searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {\n            override fun onQueryTextSubmit(query: String?): Boolean {\n                viewModel.search(query.orEmpty())\n                return true\n            }\n\n            override fun onQueryTextChange(newText: String?): Boolean {\n                // Close event is not sent so we use this instead\n                if (newText.isNullOrBlank()) {\n                    viewModel.search(\"\")\n                }\n                return true\n            }\n        })\n        return binding.root\n    }\n\n    private fun setupSearchView(searchAdapter: SearchAdapter, state: State) {\n        if (state.searchResult == null) {\n            searchAdapter.submitList(listOf())\n            binding.accountsSearchRecycler.hide()\n            binding.accountsRecycler.show()\n        } else {\n            val listAccounts = state.accounts.getOrDefault(emptyList())\n            val newList = state.searchResult.map { acc ->\n                acc to listAccounts.contains(acc)\n            }\n            searchAdapter.submitList(newList)\n            binding.accountsSearchRecycler.show()\n            binding.accountsRecycler.hide()\n        }\n    }\n\n    private fun handleError(error: Throwable) {\n        binding.messageView.show()\n        binding.messageView.setup(error) { _: View ->\n            binding.messageView.hide()\n            viewModel.load(listId)\n        }\n    }\n\n    private fun onRemoveFromList(accountId: String) {\n        viewModel.deleteAccountFromList(listId, accountId)\n    }\n\n    private fun onAddToList(account: TimelineAccount) {\n        viewModel.addAccountToList(listId, account)\n    }\n\n    private object AccountDiffer : DiffUtil.ItemCallback<TimelineAccount>() {\n        override fun areItemsTheSame(oldItem: TimelineAccount, newItem: TimelineAccount): Boolean {\n            return oldItem.id == newItem.id\n        }\n\n        override fun areContentsTheSame(\n            oldItem: TimelineAccount,\n            newItem: TimelineAccount\n        ): Boolean {\n            return oldItem == newItem\n        }\n    }\n\n    inner class Adapter : ListAdapter<TimelineAccount, BindingHolder<ItemFollowRequestBinding>>(\n        AccountDiffer\n    ) {\n\n        override fun onCreateViewHolder(\n            parent: ViewGroup,\n            viewType: Int\n        ): BindingHolder<ItemFollowRequestBinding> {\n            val binding = ItemFollowRequestBinding.inflate(\n                LayoutInflater.from(parent.context),\n                parent,\n                false\n            )\n            val holder = BindingHolder(binding)\n\n            binding.notificationTextView.hide()\n            binding.acceptButton.hide()\n            binding.rejectButton.setOnClickListener {\n                onRemoveFromList(getItem(holder.bindingAdapterPosition).id)\n            }\n            binding.rejectButton.contentDescription =\n                binding.root.context.getString(R.string.action_remove_from_list)\n\n            return holder\n        }\n\n        override fun onBindViewHolder(\n            holder: BindingHolder<ItemFollowRequestBinding>,\n            position: Int\n        ) {\n            val account = getItem(position)\n            holder.binding.displayNameTextView.text = account.name.emojify(account.emojis, holder.binding.displayNameTextView, animateEmojis)\n            holder.binding.usernameTextView.text = account.username\n            holder.binding.avatarBadge.visible(showBotOverlay && account.bot)\n            loadAvatar(account.avatar, holder.binding.avatar, radius, animateAvatar)\n        }\n    }\n\n    private object SearchDiffer : DiffUtil.ItemCallback<AccountInfo>() {\n        override fun areItemsTheSame(oldItem: AccountInfo, newItem: AccountInfo): Boolean {\n            return oldItem.first.id == newItem.first.id\n        }\n\n        override fun areContentsTheSame(oldItem: AccountInfo, newItem: AccountInfo): Boolean {\n            return oldItem == newItem\n        }\n    }\n\n    inner class SearchAdapter : ListAdapter<AccountInfo, BindingHolder<ItemFollowRequestBinding>>(\n        SearchDiffer\n    ) {\n\n        override fun onCreateViewHolder(\n            parent: ViewGroup,\n            viewType: Int\n        ): BindingHolder<ItemFollowRequestBinding> {\n            val binding = ItemFollowRequestBinding.inflate(\n                LayoutInflater.from(parent.context),\n                parent,\n                false\n            )\n            val holder = BindingHolder(binding)\n\n            binding.notificationTextView.hide()\n            binding.acceptButton.hide()\n            binding.rejectButton.setOnClickListener {\n                val (account, inAList) = getItem(holder.bindingAdapterPosition)\n                if (inAList) {\n                    onRemoveFromList(account.id)\n                } else {\n                    onAddToList(account)\n                }\n            }\n\n            return holder\n        }\n\n        override fun onBindViewHolder(\n            holder: BindingHolder<ItemFollowRequestBinding>,\n            position: Int\n        ) {\n            val (account, inAList) = getItem(position)\n\n            holder.binding.displayNameTextView.text = account.name.emojify(account.emojis, holder.binding.displayNameTextView, animateEmojis)\n            holder.binding.usernameTextView.text = account.username\n            holder.binding.avatarBadge.visible(showBotOverlay && account.bot)\n            loadAvatar(account.avatar, holder.binding.avatar, radius, animateAvatar)\n\n            holder.binding.rejectButton.apply {\n                contentDescription = if (inAList) {\n                    setImageResource(R.drawable.ic_close_24dp)\n                    getString(R.string.action_remove_from_list)\n                } else {\n                    setImageResource(R.drawable.ic_add_24dp)\n                    getString(R.string.action_add_to_list)\n                }\n            }\n        }\n    }\n\n    companion object {\n        private const val LIST_ID_ARG = \"listId\"\n        private const val LIST_NAME_ARG = \"listName\"\n\n        @JvmStatic\n        fun newInstance(listId: String, listName: String): AccountsInListFragment {\n            val args = Bundle().apply {\n                putString(LIST_ID_ARG, listId)\n                putString(LIST_NAME_ARG, listName)\n            }\n            return AccountsInListFragment().apply { arguments = args }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/BaseActivity.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\npackage com.keylesspalace.tusky\n\nimport android.app.ActivityManager.TaskDescription\nimport android.content.Context\nimport android.content.DialogInterface\nimport android.content.Intent\nimport android.content.SharedPreferences\nimport android.graphics.BitmapFactory\nimport android.graphics.Color\nimport android.os.Build\nimport android.os.Bundle\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.annotation.StyleRes\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.graphics.Insets\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.WindowInsetsCompat.Type.displayCutout\nimport androidx.core.view.WindowInsetsCompat.Type.systemBars\nimport androidx.core.view.updateLayoutParams\nimport androidx.core.view.updatePadding\nimport androidx.lifecycle.ViewModelProvider.Factory\nimport androidx.lifecycle.lifecycleScope\nimport com.google.android.material.R as materialR\nimport com.google.android.material.color.MaterialColors\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.keylesspalace.tusky.MainActivity.Companion.redirectIntent\nimport com.keylesspalace.tusky.adapter.AccountSelectionAdapter\nimport com.keylesspalace.tusky.components.login.LoginActivity\nimport com.keylesspalace.tusky.components.login.LoginActivity.Companion.getIntent\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.di.PreferencesEntryPoint\nimport com.keylesspalace.tusky.interfaces.AccountSelectionListener\nimport com.keylesspalace.tusky.settings.AppTheme\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.util.ActivityConstants\nimport com.keylesspalace.tusky.util.isBlack\nimport com.keylesspalace.tusky.util.overrideActivityTransitionCompat\nimport dagger.hilt.EntryPoints\nimport javax.inject.Inject\nimport kotlinx.coroutines.launch\n\n/**\n * All activities inheriting from BaseActivity must be annotated with @AndroidEntryPoint\n */\nabstract class BaseActivity : AppCompatActivity() {\n    @Inject\n    lateinit var accountManager: AccountManager\n\n    @Inject\n    lateinit var preferences: SharedPreferences\n\n    /**\n     * Allows overriding the default ViewModelProvider.Factory for testing purposes.\n     */\n    var viewModelProviderFactory: Factory? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        if (activityTransitionWasRequested()) {\n            overrideActivityTransitionCompat(\n                ActivityConstants.OVERRIDE_TRANSITION_OPEN,\n                R.anim.activity_open_enter,\n                R.anim.activity_open_exit\n            )\n            overrideActivityTransitionCompat(\n                ActivityConstants.OVERRIDE_TRANSITION_CLOSE,\n                R.anim.activity_close_enter,\n                R.anim.activity_close_exit\n            )\n        }\n\n        /* There isn't presently a way to globally change the theme of a whole application at\n         * runtime, just individual activities. So, each activity has to set its theme before any\n         * views are created. */\n        val theme = preferences.getString(PrefKeys.APP_THEME, AppTheme.DEFAULT.value)\n        if (isBlack(resources.configuration, theme)) {\n            setTheme(R.style.TuskyBlackTheme)\n        } else if (this is MainActivity) {\n            // Replace the SplashTheme of MainActivity\n            setTheme(R.style.TuskyTheme)\n        }\n\n        /* Set the taskdescription programmatically  - by default the primary color is used.\n         * On newer Android versions (or launchers?) this doesn't seem to have an effect. */\n        val appName = getString(R.string.app_name)\n        val recentsBackgroundColor = MaterialColors.getColor(\n            this,\n            materialR.attr.colorSurface,\n            Color.BLACK\n        )\n\n        val taskDescription = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {\n            TaskDescription.Builder()\n                .setLabel(appName)\n                .setIcon(R.mipmap.ic_launcher)\n                .setPrimaryColor(recentsBackgroundColor)\n                .build()\n        } else {\n            val appIcon = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher)\n            @Suppress(\"DEPRECATION\")\n            TaskDescription(appName, appIcon, recentsBackgroundColor)\n        }\n\n        setTaskDescription(taskDescription)\n\n        val style = textStyle(preferences.getString(PrefKeys.STATUS_TEXT_SIZE, \"medium\"))\n        getTheme().applyStyle(style, true)\n\n        if (requiresLogin()) {\n            redirectIfNotLoggedIn()\n        }\n    }\n\n    override fun onPostCreate(savedInstanceState: Bundle?) {\n        super.onPostCreate(savedInstanceState)\n\n        // currently only ComposeActivity on tablets is floating\n        if (!window.isFloating) {\n            window.decorView.setBackgroundColor(Color.BLACK)\n\n            val contentView: View = findViewById(android.R.id.content)\n            contentView.setBackgroundColor(MaterialColors.getColor(contentView, android.R.attr.colorBackground))\n\n            // handle left/right insets. This is relevant for edge-to-edge mode in landscape orientation\n            ViewCompat.setOnApplyWindowInsetsListener(contentView) { _, insets ->\n                val systemBarInsets = insets.getInsets(systemBars())\n                val displayCutoutInsets = insets.getInsets(displayCutout())\n                // use padding for system bar insets so they get our background color and margin for cutout insets to turn them black\n                contentView.updatePadding(left = systemBarInsets.left, right = systemBarInsets.right)\n                contentView.updateLayoutParams<ViewGroup.MarginLayoutParams> {\n                    leftMargin = displayCutoutInsets.left\n                    rightMargin = displayCutoutInsets.right\n                }\n\n                WindowInsetsCompat.Builder(insets)\n                    .setInsets(systemBars(), Insets.of(0, systemBarInsets.top, 0, systemBarInsets.bottom))\n                    .setInsets(displayCutout(), Insets.of(0, displayCutoutInsets.top, 0, displayCutoutInsets.bottom))\n                    .build()\n            }\n        }\n    }\n\n    private fun activityTransitionWasRequested(): Boolean {\n        return intent.getBooleanExtra(OPEN_WITH_SLIDE_IN, false)\n    }\n\n    override fun attachBaseContext(newBase: Context) {\n        // injected preferences not yet available at this point of the lifecycle\n        val preferences =\n            EntryPoints.get(newBase.applicationContext, PreferencesEntryPoint::class.java)\n                .preferences()\n\n        // Scale text in the UI from PrefKeys.UI_TEXT_SCALE_RATIO\n        val uiScaleRatio = preferences.getFloat(PrefKeys.UI_TEXT_SCALE_RATIO, 100f)\n\n        val configuration = newBase.resources.configuration\n\n        // Adjust `fontScale` in the configuration.\n        //\n        // You can't repeatedly adjust the `fontScale` in `newBase` because that will contain the\n        // result of previous adjustments. E.g., going from 100% to 80% to 100% does not return\n        // you to the original 100%, it leaves it at 80%.\n        //\n        // Instead, calculate the new scale from the application context. This is unaffected by\n        // changes to the base context. It does contain contain any changes to the font scale from\n        // \"Settings > Display > Font size\" in the device settings, so scaling performed here\n        // is in addition to any scaling in the device settings.\n        val appConfiguration = newBase.applicationContext.resources.configuration\n\n        // This only adjusts the fonts, anything measured in `dp` is unaffected by this.\n        // You can try to adjust `densityDpi` as shown in the commented out code below. This\n        // works, to a point. However, dialogs do not react well to this. Beyond a certain\n        // scale (~ 120%) the right hand edge of the dialog will clip off the right of the\n        // screen.\n        //\n        // So for now, just adjust the font scale\n        //\n        // val displayMetrics = appContext.resources.displayMetrics\n        // configuration.densityDpi = ((displayMetrics.densityDpi * uiScaleRatio).toInt())\n        configuration.fontScale = appConfiguration.fontScale * uiScaleRatio / 100f\n\n        val fontScaleContext = newBase.createConfigurationContext(configuration)\n\n        super.attachBaseContext(fontScaleContext)\n    }\n\n    override val defaultViewModelProviderFactory: Factory\n        get() = viewModelProviderFactory ?: super.defaultViewModelProviderFactory\n\n    protected open fun requiresLogin(): Boolean = true\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        if (item.itemId == android.R.id.home) {\n            onBackPressedDispatcher.onBackPressed()\n            return true\n        }\n        return super.onOptionsItemSelected(item)\n    }\n\n    private fun redirectIfNotLoggedIn() {\n        val currentAccounts = accountManager.accounts\n\n        if (currentAccounts.isEmpty()) {\n            val intent = getIntent(this@BaseActivity, LoginActivity.MODE_DEFAULT)\n            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)\n            startActivity(intent)\n            finish()\n        }\n    }\n\n    fun showAccountChooserDialog(\n        dialogTitle: CharSequence?,\n        showActiveAccount: Boolean,\n        listener: AccountSelectionListener\n    ) {\n        val accounts = accountManager.accounts.toMutableList()\n        val activeAccount = accountManager.activeAccount\n\n        when (accounts.size) {\n            1 -> {\n                listener.onAccountSelected(activeAccount!!)\n                return\n            }\n            2 -> if (!showActiveAccount) {\n                for (account in accounts) {\n                    if (activeAccount !== account) {\n                        listener.onAccountSelected(account)\n                        return\n                    }\n                }\n            }\n        }\n        if (!showActiveAccount && activeAccount != null) {\n            accounts.remove(activeAccount)\n        }\n        val adapter = AccountSelectionAdapter(\n            this,\n            preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false),\n            preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false)\n        )\n        adapter.addAll(accounts)\n\n        MaterialAlertDialogBuilder(this)\n            .setTitle(dialogTitle)\n            .setAdapter(adapter) { _: DialogInterface?, index: Int ->\n                listener.onAccountSelected(accounts[index])\n            }\n            .show()\n    }\n\n    val openAsText: String?\n        get() {\n            val accounts = accountManager.accounts\n            when (accounts.size) {\n                0, 1 -> return null\n                2 -> {\n                    for (account in accounts) {\n                        if (account !== accountManager.activeAccount) {\n                            return getString(R.string.action_open_as, account.fullName)\n                        }\n                    }\n                    return null\n                }\n\n                else -> return getString(R.string.action_open_as, \"…\")\n            }\n        }\n\n    fun openAsAccount(url: String, account: AccountEntity) {\n        lifecycleScope.launch {\n            accountManager.setActiveAccount(account.id)\n            val intent = redirectIntent(this@BaseActivity, account.id, url)\n\n            startActivity(intent)\n            finish()\n        }\n    }\n\n    companion object {\n        const val OPEN_WITH_SLIDE_IN = \"OPEN_WITH_SLIDE_IN\"\n\n        @StyleRes\n        private fun textStyle(name: String?): Int = when (name) {\n            \"smallest\" -> R.style.TextSizeSmallest\n            \"small\" -> R.style.TextSizeSmall\n            \"medium\" -> R.style.TextSizeMedium\n            \"large\" -> R.style.TextSizeLarge\n            \"largest\" -> R.style.TextSizeLargest\n            else -> R.style.TextSizeMedium\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/BottomSheetActivity.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.View\nimport android.widget.LinearLayout\nimport android.widget.Toast\nimport androidx.annotation.VisibleForTesting\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat.Type.ime\nimport androidx.core.view.WindowInsetsCompat.Type.systemBars\nimport androidx.core.view.updatePadding\nimport androidx.lifecycle.lifecycleScope\nimport at.connyduck.calladapter.networkresult.fold\nimport com.google.android.material.bottomsheet.BottomSheetBehavior\nimport com.keylesspalace.tusky.components.account.AccountActivity\nimport com.keylesspalace.tusky.components.viewthread.ViewThreadActivity\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.looksLikeMastodonUrl\nimport com.keylesspalace.tusky.util.openLink\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport javax.inject.Inject\nimport kotlinx.coroutines.launch\n\n/** this is the base class for all activities that open links\n *  links are checked against the api if they are mastodon links so they can be opened in Tusky\n *  Subclasses must have a bottom sheet with Id item_status_bottom_sheet in their layout hierarchy\n */\n\nabstract class BottomSheetActivity : BaseActivity() {\n\n    lateinit var bottomSheet: BottomSheetBehavior<LinearLayout>\n    var searchUrl: String? = null\n\n    @Inject\n    lateinit var mastodonApi: MastodonApi\n\n    override fun onPostCreate(savedInstanceState: Bundle?) {\n        super.onPostCreate(savedInstanceState)\n\n        val bottomSheetLayout: LinearLayout = findViewById(R.id.item_status_bottom_sheet)\n        bottomSheet = BottomSheetBehavior.from(bottomSheetLayout)\n        bottomSheet.state = BottomSheetBehavior.STATE_HIDDEN\n        bottomSheet.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {\n            override fun onStateChanged(bottomSheet: View, newState: Int) {\n                if (newState == BottomSheetBehavior.STATE_HIDDEN) {\n                    cancelActiveSearch()\n                }\n            }\n\n            override fun onSlide(bottomSheet: View, slideOffset: Float) {}\n        })\n\n        ViewCompat.setOnApplyWindowInsetsListener(bottomSheetLayout) { _, insets ->\n            val systemBarsInsets = insets.getInsets(systemBars() or ime())\n            val bottomInsets = systemBarsInsets.bottom\n\n            bottomSheetLayout.updatePadding(bottom = bottomInsets)\n            insets\n        }\n    }\n\n    open fun viewUrl(\n        url: String,\n        lookupFallbackBehavior: PostLookupFallbackBehavior = PostLookupFallbackBehavior.OPEN_IN_BROWSER\n    ) {\n        if (!looksLikeMastodonUrl(url)) {\n            openLink(url)\n            return\n        }\n\n        lifecycleScope.launch {\n            mastodonApi.search(\n                query = url,\n                resolve = true\n            ).fold(\n                onSuccess = { (accounts, statuses) ->\n                    if (getCancelSearchRequested(url)) {\n                        return@launch\n                    }\n\n                    onEndSearch(url)\n\n                    if (statuses.isNotEmpty()) {\n                        viewThread(statuses[0].id, statuses[0].url)\n                        return@launch\n                    }\n                    accounts.firstOrNull { it.url.equals(url, ignoreCase = true) }?.let { account ->\n                        // Some servers return (unrelated) accounts for url searches (#2804)\n                        // Verify that the account's url matches the query\n                        viewAccount(account.id)\n                        return@launch\n                    }\n\n                    performUrlFallbackAction(url, lookupFallbackBehavior)\n                },\n                onFailure = {\n                    if (!getCancelSearchRequested(url)) {\n                        onEndSearch(url)\n                        performUrlFallbackAction(url, lookupFallbackBehavior)\n                    }\n                }\n            )\n        }\n\n        onBeginSearch(url)\n    }\n\n    open fun viewThread(statusId: String, url: String?) {\n        if (!isSearching()) {\n            val intent = Intent(this, ViewThreadActivity::class.java)\n            intent.putExtra(\"id\", statusId)\n            intent.putExtra(\"url\", url)\n            startActivityWithSlideInAnimation(intent)\n        }\n    }\n\n    open fun viewAccount(id: String) {\n        val intent = AccountActivity.getIntent(this, id)\n        startActivityWithSlideInAnimation(intent)\n    }\n\n    protected open fun performUrlFallbackAction(\n        url: String,\n        fallbackBehavior: PostLookupFallbackBehavior\n    ) {\n        when (fallbackBehavior) {\n            PostLookupFallbackBehavior.OPEN_IN_BROWSER -> openLink(url)\n            PostLookupFallbackBehavior.DISPLAY_ERROR -> Toast.makeText(\n                this,\n                getString(R.string.post_lookup_error_format, url),\n                Toast.LENGTH_SHORT\n            ).show()\n        }\n    }\n\n    @VisibleForTesting\n    fun onBeginSearch(url: String) {\n        searchUrl = url\n        showQuerySheet()\n    }\n\n    @VisibleForTesting\n    fun getCancelSearchRequested(url: String): Boolean {\n        return url != searchUrl\n    }\n\n    @VisibleForTesting\n    fun isSearching(): Boolean {\n        return searchUrl != null\n    }\n\n    @VisibleForTesting\n    fun onEndSearch(url: String?) {\n        if (url == searchUrl) {\n            // Don't clear query if there's no match,\n            // since we might just now be getting the response for a canceled search\n            searchUrl = null\n            hideQuerySheet()\n        }\n    }\n\n    @VisibleForTesting\n    fun cancelActiveSearch() {\n        if (isSearching()) {\n            onEndSearch(searchUrl)\n        }\n    }\n\n    @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED)\n    open fun openLink(url: String) {\n        (this as Context).openLink(url)\n    }\n\n    private fun showQuerySheet() {\n        bottomSheet.state = BottomSheetBehavior.STATE_COLLAPSED\n    }\n\n    private fun hideQuerySheet() {\n        bottomSheet.state = BottomSheetBehavior.STATE_HIDDEN\n    }\n}\n\nenum class PostLookupFallbackBehavior {\n    OPEN_IN_BROWSER,\n    DISPLAY_ERROR\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/EditProfileActivity.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky\n\nimport android.content.Intent\nimport android.graphics.Bitmap\nimport android.net.Uri\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport android.widget.ImageView\nimport androidx.activity.OnBackPressedCallback\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AlertDialog\nimport androidx.core.graphics.Insets\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.WindowInsetsCompat.Type.ime\nimport androidx.core.view.WindowInsetsCompat.Type.systemBars\nimport androidx.core.view.isVisible\nimport androidx.core.view.updatePadding\nimport androidx.core.widget.doAfterTextChanged\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.load.engine.DiskCacheStrategy\nimport com.bumptech.glide.load.resource.bitmap.FitCenter\nimport com.bumptech.glide.load.resource.bitmap.RoundedCorners\nimport com.canhub.cropper.CropImage\nimport com.canhub.cropper.CropImageContract\nimport com.canhub.cropper.options\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.adapter.AccountFieldEditAdapter\nimport com.keylesspalace.tusky.components.instanceinfo.InstanceInfoRepository\nimport com.keylesspalace.tusky.databinding.ActivityEditProfileBinding\nimport com.keylesspalace.tusky.util.Error\nimport com.keylesspalace.tusky.util.Loading\nimport com.keylesspalace.tusky.util.Success\nimport com.keylesspalace.tusky.util.await\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.viewmodel.EditProfileViewModel\nimport com.keylesspalace.tusky.viewmodel.ProfileDataInUi\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass EditProfileActivity : BaseActivity() {\n\n    companion object {\n        const val AVATAR_SIZE = 400\n        const val HEADER_WIDTH = 1500\n        const val HEADER_HEIGHT = 500\n    }\n\n    private val viewModel: EditProfileViewModel by viewModels()\n\n    private val binding by viewBinding(ActivityEditProfileBinding::inflate)\n\n    private val accountFieldEditAdapter = AccountFieldEditAdapter()\n\n    private var maxAccountFields = InstanceInfoRepository.DEFAULT_MAX_ACCOUNT_FIELDS\n\n    private enum class PickType {\n        AVATAR,\n        HEADER\n    }\n\n    private val cropImage = registerForActivityResult(CropImageContract()) { result ->\n        if (result is CropImage.CancelledResult) {\n            return@registerForActivityResult\n        }\n\n        if (!result.isSuccessful) {\n            return@registerForActivityResult onPickFailure(result.error)\n        }\n\n        if (result.uriContent == viewModel.getAvatarUri()) {\n            viewModel.newAvatarPicked()\n        } else {\n            viewModel.newHeaderPicked()\n        }\n    }\n\n    private val currentProfileData\n        get() = ProfileDataInUi(\n            displayName = binding.displayNameEditText.text.toString(),\n            note = binding.noteEditText.text.toString(),\n            locked = binding.lockedCheckBox.isChecked,\n            fields = accountFieldEditAdapter.getFieldData()\n        )\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        setContentView(binding.root)\n\n        setSupportActionBar(binding.includedToolbar.toolbar)\n        supportActionBar?.run {\n            setTitle(R.string.title_edit_profile)\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n        }\n\n        ViewCompat.setOnApplyWindowInsetsListener(binding.root) { scrollView, insets ->\n            // if keyboard visible -> set inset on the root to push the scrollview up\n            // if keyboard hidden -> set inset on the scrollview so last element does not get obscured by navigation bar\n            // scrollview has clipToPadding set to false so it draws behind the navigation bar in edge-to-edge mode\n            val imeInsets = insets.getInsets(ime())\n            val systemBarsInsets = insets.getInsets(systemBars())\n            binding.root.updatePadding(bottom = imeInsets.bottom)\n            val scrollViewPadding = if (imeInsets.bottom == 0) {\n                systemBarsInsets.bottom\n            } else {\n                0\n            }\n            binding.scrollView.updatePadding(bottom = scrollViewPadding)\n            WindowInsetsCompat.Builder(insets)\n                .setInsets(ime(), Insets.of(imeInsets.left, imeInsets.top, imeInsets.right, 0))\n                .setInsets(systemBars(), Insets.of(systemBarsInsets.left, systemBarsInsets.top, imeInsets.right, 0))\n                .build()\n        }\n\n        binding.avatarButton.setOnClickListener { pickMedia(PickType.AVATAR) }\n        binding.headerButton.setOnClickListener { pickMedia(PickType.HEADER) }\n\n        binding.fieldList.layoutManager = LinearLayoutManager(this)\n        binding.fieldList.adapter = accountFieldEditAdapter\n\n        binding.addFieldButton.setOnClickListener {\n            accountFieldEditAdapter.addField()\n            if (accountFieldEditAdapter.itemCount >= maxAccountFields) {\n                it.isVisible = false\n            }\n\n            binding.scrollView.post {\n                binding.scrollView.smoothScrollTo(0, it.bottom)\n            }\n        }\n\n        viewModel.obtainProfile()\n\n        lifecycleScope.launch {\n            viewModel.profileData.collect { profileRes ->\n                if (profileRes == null) return@collect\n                when (profileRes) {\n                    is Success -> {\n                        val me = profileRes.data\n                        if (me != null) {\n                            binding.displayNameEditText.setText(me.displayName)\n                            binding.noteEditText.setText(me.source?.note)\n                            binding.lockedCheckBox.isChecked = me.locked\n\n                            accountFieldEditAdapter.setFields(me.source?.fields.orEmpty())\n                            binding.addFieldButton.isVisible =\n                                (me.source?.fields?.size ?: 0) < maxAccountFields\n\n                            if (viewModel.avatarData.value == null) {\n                                Glide.with(this@EditProfileActivity)\n                                    .load(me.avatar)\n                                    .placeholder(R.drawable.avatar_default)\n                                    .transform(\n                                        FitCenter(),\n                                        RoundedCorners(\n                                            resources.getDimensionPixelSize(R.dimen.avatar_radius_80dp)\n                                        )\n                                    )\n                                    .into(binding.avatarPreview)\n                            }\n\n                            if (viewModel.headerData.value == null) {\n                                Glide.with(this@EditProfileActivity)\n                                    .load(me.header)\n                                    .into(binding.headerPreview)\n                            }\n                        }\n                    }\n                    is Error -> {\n                        Snackbar.make(\n                            binding.avatarButton,\n                            R.string.error_generic,\n                            Snackbar.LENGTH_LONG\n                        )\n                            .setAction(R.string.action_retry) {\n                                viewModel.obtainProfile()\n                            }\n                            .show()\n                    }\n                    is Loading -> { }\n                }\n            }\n        }\n\n        lifecycleScope.launch {\n            viewModel.instanceData.collect { instanceInfo ->\n                maxAccountFields = instanceInfo.maxFields\n                accountFieldEditAdapter.setFieldLimits(\n                    instanceInfo.maxFieldNameLength,\n                    instanceInfo.maxFieldValueLength\n                )\n                binding.addFieldButton.isVisible =\n                    accountFieldEditAdapter.itemCount < maxAccountFields\n            }\n        }\n\n        observeImage(viewModel.avatarData, binding.avatarPreview, true)\n        observeImage(viewModel.headerData, binding.headerPreview, false)\n\n        lifecycleScope.launch {\n            viewModel.saveData.collect {\n                if (it == null) return@collect\n                when (it) {\n                    is Success -> {\n                        finish()\n                    }\n                    is Loading -> {\n                        binding.saveProgressBar.visibility = View.VISIBLE\n                    }\n                    is Error -> {\n                        onSaveFailure(it.errorMessage)\n                    }\n                }\n            }\n        }\n\n        binding.displayNameEditText.doAfterTextChanged {\n            viewModel.dataChanged(currentProfileData)\n        }\n\n        binding.displayNameEditText.doAfterTextChanged {\n            viewModel.dataChanged(currentProfileData)\n        }\n\n        binding.lockedCheckBox.setOnCheckedChangeListener { _, _ ->\n            viewModel.dataChanged(currentProfileData)\n        }\n\n        accountFieldEditAdapter.onFieldsChanged = {\n            viewModel.dataChanged(currentProfileData)\n        }\n\n        val onBackCallback = object : OnBackPressedCallback(enabled = false) {\n            override fun handleOnBackPressed() {\n                showUnsavedChangesDialog()\n            }\n        }\n\n        onBackPressedDispatcher.addCallback(this, onBackCallback)\n        lifecycleScope.launch {\n            viewModel.isChanged.collect { dataWasChanged ->\n                onBackCallback.isEnabled = dataWasChanged\n            }\n        }\n    }\n\n    override fun onStop() {\n        super.onStop()\n        if (!isFinishing) {\n            viewModel.updateProfile(currentProfileData)\n        }\n    }\n\n    private fun observeImage(\n        flow: StateFlow<Uri?>,\n        imageView: ImageView,\n        roundedCorners: Boolean\n    ) {\n        lifecycleScope.launch {\n            flow.collect { imageUri ->\n\n                // skipping all caches so we can always reuse the same uri\n                val glide = Glide.with(imageView)\n                    .load(imageUri)\n                    .skipMemoryCache(true)\n                    .diskCacheStrategy(DiskCacheStrategy.NONE)\n\n                if (roundedCorners) {\n                    glide.transform(\n                        FitCenter(),\n                        RoundedCorners(resources.getDimensionPixelSize(R.dimen.avatar_radius_80dp))\n                    ).into(imageView)\n                } else {\n                    glide.into(imageView)\n                }\n\n                imageView.show()\n            }\n        }\n    }\n\n    private fun pickMedia(pickType: PickType) {\n        val intent = Intent(Intent.ACTION_GET_CONTENT)\n        intent.addCategory(Intent.CATEGORY_OPENABLE)\n        intent.type = \"image/*\"\n        when (pickType) {\n            PickType.AVATAR -> {\n                cropImage.launch(\n                    options {\n                        setRequestedSize(AVATAR_SIZE, AVATAR_SIZE)\n                        setAspectRatio(AVATAR_SIZE, AVATAR_SIZE)\n                        setImageSource(includeGallery = true, includeCamera = false)\n                        setOutputUri(viewModel.getAvatarUri())\n                        setOutputCompressFormat(Bitmap.CompressFormat.PNG)\n                    }\n                )\n            }\n            PickType.HEADER -> {\n                cropImage.launch(\n                    options {\n                        setRequestedSize(HEADER_WIDTH, HEADER_HEIGHT)\n                        setAspectRatio(HEADER_WIDTH, HEADER_HEIGHT)\n                        setImageSource(includeGallery = true, includeCamera = false)\n                        setOutputUri(viewModel.getHeaderUri())\n                        setOutputCompressFormat(Bitmap.CompressFormat.PNG)\n                    }\n                )\n            }\n        }\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu): Boolean {\n        menuInflater.inflate(R.menu.edit_profile_toolbar, menu)\n        return super.onCreateOptionsMenu(menu)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            R.id.action_save -> {\n                save()\n                return true\n            }\n        }\n        return super.onOptionsItemSelected(item)\n    }\n\n    private fun save() = viewModel.save(currentProfileData)\n\n    private fun onSaveFailure(msg: String?) {\n        val errorMsg = msg ?: getString(R.string.error_media_upload_sending)\n        Snackbar.make(binding.avatarButton, errorMsg, Snackbar.LENGTH_LONG).show()\n        binding.saveProgressBar.visibility = View.GONE\n    }\n\n    private fun onPickFailure(throwable: Throwable?) {\n        Log.w(\"EditProfileActivity\", \"failed to pick media\", throwable)\n        Snackbar.make(\n            binding.avatarButton,\n            R.string.error_media_upload_sending,\n            Snackbar.LENGTH_LONG\n        ).show()\n    }\n\n    private fun showUnsavedChangesDialog() = lifecycleScope.launch {\n        when (launchSaveDialog()) {\n            AlertDialog.BUTTON_POSITIVE -> save()\n            else -> finish()\n        }\n    }\n\n    private suspend fun launchSaveDialog() = MaterialAlertDialogBuilder(this)\n        .setMessage(getString(R.string.dialog_save_profile_changes_message))\n        .create()\n        .await(R.string.action_save, R.string.action_discard)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/LicenseActivity.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky\n\nimport android.os.Bundle\nimport android.util.Log\nimport android.widget.TextView\nimport androidx.annotation.RawRes\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat.Type.systemBars\nimport androidx.core.view.updatePadding\nimport androidx.lifecycle.lifecycleScope\nimport com.keylesspalace.tusky.databinding.ActivityLicenseBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport java.io.IOException\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport okio.buffer\nimport okio.source\n\n@AndroidEntryPoint\nclass LicenseActivity : BaseActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        val binding = ActivityLicenseBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n\n        setSupportActionBar(binding.includedToolbar.toolbar)\n        supportActionBar?.run {\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n        }\n\n        setTitle(R.string.title_licenses)\n\n        ViewCompat.setOnApplyWindowInsetsListener(binding.scrollView) { scrollView, insets ->\n            val systemBarInsets = insets.getInsets(systemBars())\n            scrollView.updatePadding(bottom = systemBarInsets.bottom)\n\n            insets.inset(0, 0, 0, systemBarInsets.bottom)\n        }\n\n        loadFileIntoTextView(R.raw.apache, binding.licenseApacheTextView)\n    }\n\n    private fun loadFileIntoTextView(@RawRes fileId: Int, textView: TextView) {\n        lifecycleScope.launch {\n            textView.text = withContext(Dispatchers.IO) {\n                try {\n                    resources.openRawResource(fileId).source().buffer().use { it.readUtf8() }\n                } catch (e: IOException) {\n                    Log.w(\"LicenseActivity\", e)\n                    \"\"\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/ListsActivity.kt",
    "content": "/* Copyright Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky\n\nimport android.app.Dialog\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.WindowManager\nimport android.widget.PopupMenu\nimport androidx.activity.viewModels\nimport androidx.annotation.StringRes\nimport androidx.core.widget.doOnTextChanged\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.ListAdapter\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.databinding.ActivityListsBinding\nimport com.keylesspalace.tusky.databinding.DialogListBinding\nimport com.keylesspalace.tusky.databinding.ItemListBinding\nimport com.keylesspalace.tusky.entity.MastoList\nimport com.keylesspalace.tusky.util.BindingHolder\nimport com.keylesspalace.tusky.util.ensureBottomMargin\nimport com.keylesspalace.tusky.util.ensureBottomPadding\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.util.visible\nimport com.keylesspalace.tusky.viewmodel.ListsViewModel\nimport com.keylesspalace.tusky.viewmodel.ListsViewModel.Event\nimport com.keylesspalace.tusky.viewmodel.ListsViewModel.LoadingState.ERROR_NETWORK\nimport com.keylesspalace.tusky.viewmodel.ListsViewModel.LoadingState.ERROR_OTHER\nimport com.keylesspalace.tusky.viewmodel.ListsViewModel.LoadingState.INITIAL\nimport com.keylesspalace.tusky.viewmodel.ListsViewModel.LoadingState.LOADED\nimport com.keylesspalace.tusky.viewmodel.ListsViewModel.LoadingState.LOADING\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.launch\n\n// TODO use the ListSelectionFragment (and/or its adapter or binding) here; but keep the LoadingState from here (?)\n\n@AndroidEntryPoint\nclass ListsActivity : BaseActivity() {\n\n    private val viewModel: ListsViewModel by viewModels()\n\n    private val binding by viewBinding(ActivityListsBinding::inflate)\n\n    private val adapter = ListsAdapter()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        setContentView(binding.root)\n\n        setSupportActionBar(binding.includedToolbar.toolbar)\n        supportActionBar?.apply {\n            title = getString(R.string.title_lists)\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n        }\n\n        binding.addListButton.ensureBottomMargin()\n        binding.listsRecycler.ensureBottomPadding(fab = true)\n\n        binding.listsRecycler.adapter = adapter\n        binding.listsRecycler.layoutManager = LinearLayoutManager(this)\n        binding.listsRecycler.addItemDecoration(\n            DividerItemDecoration(this, DividerItemDecoration.VERTICAL)\n        )\n\n        binding.swipeRefreshLayout.setOnRefreshListener { viewModel.retryLoading() }\n\n        lifecycleScope.launch {\n            viewModel.state.collect(this@ListsActivity::update)\n        }\n\n        viewModel.retryLoading()\n\n        binding.addListButton.setOnClickListener {\n            showlistNameDialog(null)\n        }\n\n        lifecycleScope.launch {\n            viewModel.events.collect { event ->\n                when (event) {\n                    Event.CREATE_ERROR -> showMessage(R.string.error_create_list)\n                    Event.UPDATE_ERROR -> showMessage(R.string.error_rename_list)\n                    Event.DELETE_ERROR -> showMessage(R.string.error_delete_list)\n                }\n            }\n        }\n    }\n\n    private fun showlistNameDialog(list: MastoList?) {\n        var selectedReplyPolicyIndex = MastoList.ReplyPolicy.from(list?.repliesPolicy).ordinal\n\n        val replyPolicies = resources.getStringArray(R.array.list_reply_policies_display)\n        val binding = DialogListBinding.inflate(layoutInflater).apply {\n            replyPolicyDropDown.setText(replyPolicies[selectedReplyPolicyIndex])\n            replyPolicyDropDown.setSimpleItems(replyPolicies)\n            replyPolicyDropDown.setOnItemClickListener { _, _, position, _ ->\n                selectedReplyPolicyIndex = position\n            }\n        }\n        val inset = resources.getDimensionPixelSize(R.dimen.dialog_inset)\n        val dialog = MaterialAlertDialogBuilder(this)\n            .setView(binding.root)\n            .setBackgroundInsetTop(inset)\n            .setBackgroundInsetEnd(inset)\n            .setBackgroundInsetBottom(inset)\n            .setBackgroundInsetStart(inset)\n            .setPositiveButton(\n                if (list == null) {\n                    R.string.action_create_list\n                } else {\n                    R.string.action_rename_list\n                }\n            ) { _, _ ->\n                onPickedDialogName(\n                    binding.nameText.text.toString(),\n                    list?.id,\n                    binding.exclusiveCheckbox.isChecked,\n                    MastoList.ReplyPolicy.entries[selectedReplyPolicyIndex].policy\n                )\n            }\n            .setNegativeButton(android.R.string.cancel, null)\n            .show()\n\n        // yes, SOFT_INPUT_ADJUST_RESIZE is deprecated, but without it the dropdown can get behind the keyboard\n        dialog.window?.setSoftInputMode(\n            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE or WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE\n        )\n\n        binding.nameText.let { editText ->\n            editText.doOnTextChanged { s, _, _, _ ->\n                dialog.getButton(Dialog.BUTTON_POSITIVE).isEnabled = s?.isNotBlank() == true\n            }\n            editText.setText(list?.title)\n            editText.requestFocus()\n            editText.text?.let { editText.setSelection(it.length) }\n        }\n\n        list?.let {\n            if (it.exclusive == null) {\n                binding.exclusiveCheckbox.visible(false)\n            } else {\n                binding.exclusiveCheckbox.isChecked = it.exclusive\n            }\n        }\n    }\n\n    private fun showListDeleteDialog(list: MastoList) {\n        MaterialAlertDialogBuilder(this)\n            .setMessage(getString(R.string.dialog_delete_list_warning, list.title))\n            .setPositiveButton(R.string.action_delete) { _, _ ->\n                viewModel.deleteList(list.id)\n            }\n            .setNegativeButton(android.R.string.cancel, null)\n            .show()\n    }\n\n    private fun update(state: ListsViewModel.State) {\n        adapter.submitList(state.lists)\n        binding.progressBar.visible(state.loadingState == LOADING)\n        binding.swipeRefreshLayout.isRefreshing = state.loadingState == LOADING\n        when (state.loadingState) {\n            INITIAL, LOADING -> binding.messageView.hide()\n            ERROR_NETWORK -> {\n                binding.messageView.show()\n                binding.messageView.setup(R.drawable.errorphant_offline, R.string.error_network) {\n                    viewModel.retryLoading()\n                }\n            }\n            ERROR_OTHER -> {\n                binding.messageView.show()\n                binding.messageView.setup(R.drawable.errorphant_error, R.string.error_generic) {\n                    viewModel.retryLoading()\n                }\n            }\n            LOADED ->\n                if (state.lists.isEmpty()) {\n                    binding.messageView.show()\n                    binding.messageView.setup(\n                        R.drawable.elephant_friend_empty,\n                        R.string.message_empty,\n                        null\n                    )\n                    binding.messageView.showHelp(R.string.help_empty_lists)\n                } else {\n                    binding.messageView.hide()\n                }\n        }\n    }\n\n    private fun showMessage(@StringRes messageId: Int) {\n        Snackbar.make(\n            binding.listsRecycler,\n            messageId,\n            Snackbar.LENGTH_SHORT\n        ).show()\n    }\n\n    private fun onListSelected(list: MastoList) {\n        startActivityWithSlideInAnimation(\n            StatusListActivity.newListIntent(this, list.id, list.title)\n        )\n    }\n\n    private fun openListSettings(list: MastoList) {\n        AccountsInListFragment.newInstance(list.id, list.title).show(supportFragmentManager, null)\n    }\n\n    private fun renameListDialog(list: MastoList) {\n        showlistNameDialog(list)\n    }\n\n    private fun onMore(list: MastoList, view: View) {\n        PopupMenu(view.context, view).apply {\n            inflate(R.menu.list_actions)\n            setOnMenuItemClickListener { item ->\n                when (item.itemId) {\n                    R.id.list_edit -> openListSettings(list)\n                    R.id.list_update -> renameListDialog(list)\n                    R.id.list_delete -> showListDeleteDialog(list)\n                    else -> return@setOnMenuItemClickListener false\n                }\n                true\n            }\n            show()\n        }\n    }\n\n    private object ListsDiffer : DiffUtil.ItemCallback<MastoList>() {\n        override fun areItemsTheSame(oldItem: MastoList, newItem: MastoList): Boolean {\n            return oldItem.id == newItem.id\n        }\n\n        override fun areContentsTheSame(oldItem: MastoList, newItem: MastoList): Boolean {\n            return oldItem == newItem\n        }\n    }\n\n    private inner class ListsAdapter :\n        ListAdapter<MastoList, BindingHolder<ItemListBinding>>(ListsDiffer) {\n\n        override fun onCreateViewHolder(\n            parent: ViewGroup,\n            viewType: Int\n        ): BindingHolder<ItemListBinding> {\n            return BindingHolder(ItemListBinding.inflate(LayoutInflater.from(parent.context), parent, false))\n        }\n\n        override fun onBindViewHolder(holder: BindingHolder<ItemListBinding>, position: Int) {\n            val item = getItem(position)\n            holder.binding.listName.text = item.title\n\n            holder.binding.moreButton.apply {\n                visible(true)\n                setOnClickListener {\n                    onMore(item, holder.binding.moreButton)\n                }\n            }\n\n            holder.itemView.setOnClickListener {\n                onListSelected(item)\n            }\n        }\n    }\n\n    private fun onPickedDialogName(\n        name: String,\n        listId: String?,\n        exclusive: Boolean,\n        replyPolicy: String\n    ) {\n        if (listId == null) {\n            viewModel.createNewList(name, exclusive, replyPolicy)\n        } else {\n            viewModel.updateList(listId, name, exclusive, replyPolicy)\n        }\n    }\n\n    companion object {\n        fun newIntent(context: Context) = Intent(context, ListsActivity::class.java)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/MainActivity.kt",
    "content": "/* Copyright 2020 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky\n\nimport android.Manifest\nimport android.annotation.SuppressLint\nimport android.app.NotificationManager\nimport android.content.Context\nimport android.content.DialogInterface\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.graphics.Bitmap\nimport android.graphics.Color\nimport android.graphics.drawable.Animatable\nimport android.graphics.drawable.Drawable\nimport android.net.Uri\nimport android.os.Build\nimport android.os.Bundle\nimport android.text.TextUtils\nimport android.util.Log\nimport android.view.KeyEvent\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.MenuItem.SHOW_AS_ACTION_NEVER\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.ViewGroup.LayoutParams\nimport android.widget.ImageView\nimport androidx.activity.OnBackPressedCallback\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AlertDialog\nimport androidx.appcompat.content.res.AppCompatResources\nimport androidx.coordinatorlayout.widget.CoordinatorLayout\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.pm.ShortcutManagerCompat\nimport androidx.core.graphics.drawable.toDrawable\nimport androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen\nimport androidx.core.view.MenuProvider\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat.Type.systemBars\nimport androidx.core.view.forEach\nimport androidx.core.view.isVisible\nimport androidx.core.view.updateLayoutParams\nimport androidx.core.view.updatePadding\nimport androidx.lifecycle.lifecycleScope\nimport androidx.viewpager2.widget.MarginPageTransformer\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.load.resource.bitmap.RoundedCorners\nimport com.bumptech.glide.request.target.CustomTarget\nimport com.bumptech.glide.request.target.FixedSizeDrawable\nimport com.bumptech.glide.request.transition.Transition\nimport com.google.android.material.R as materialR\nimport com.google.android.material.color.MaterialColors\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.android.material.tabs.TabLayout\nimport com.google.android.material.tabs.TabLayout.OnTabSelectedListener\nimport com.google.android.material.tabs.TabLayoutMediator\nimport com.keylesspalace.tusky.appstore.CacheUpdater\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.components.account.AccountActivity\nimport com.keylesspalace.tusky.components.accountlist.AccountListActivity\nimport com.keylesspalace.tusky.components.announcements.AnnouncementsActivity\nimport com.keylesspalace.tusky.components.compose.ComposeActivity\nimport com.keylesspalace.tusky.components.compose.ComposeActivity.Companion.canHandleMimeType\nimport com.keylesspalace.tusky.components.drafts.DraftsActivity\nimport com.keylesspalace.tusky.components.login.LoginActivity\nimport com.keylesspalace.tusky.components.preference.PreferencesActivity\nimport com.keylesspalace.tusky.components.scheduled.ScheduledStatusActivity\nimport com.keylesspalace.tusky.components.search.SearchActivity\nimport com.keylesspalace.tusky.components.systemnotifications.NotificationService\nimport com.keylesspalace.tusky.components.trending.TrendingActivity\nimport com.keylesspalace.tusky.databinding.ActivityMainBinding\nimport com.keylesspalace.tusky.db.DraftsAlert\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.interfaces.AccountSelectionListener\nimport com.keylesspalace.tusky.interfaces.ActionButtonActivity\nimport com.keylesspalace.tusky.interfaces.ReselectableFragment\nimport com.keylesspalace.tusky.pager.MainPagerAdapter\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.usecase.DeveloperToolsUseCase\nimport com.keylesspalace.tusky.usecase.LogoutUsecase\nimport com.keylesspalace.tusky.util.emojify\nimport com.keylesspalace.tusky.util.getParcelableExtraCompat\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.reduceSwipeSensitivity\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.mikepenz.materialdrawer.holder.BadgeStyle\nimport com.mikepenz.materialdrawer.holder.ColorHolder\nimport com.mikepenz.materialdrawer.holder.StringHolder\nimport com.mikepenz.materialdrawer.model.AbstractDrawerItem\nimport com.mikepenz.materialdrawer.model.DividerDrawerItem\nimport com.mikepenz.materialdrawer.model.PrimaryDrawerItem\nimport com.mikepenz.materialdrawer.model.ProfileDrawerItem\nimport com.mikepenz.materialdrawer.model.ProfileSettingDrawerItem\nimport com.mikepenz.materialdrawer.model.SecondaryDrawerItem\nimport com.mikepenz.materialdrawer.model.interfaces.IProfile\nimport com.mikepenz.materialdrawer.model.interfaces.descriptionRes\nimport com.mikepenz.materialdrawer.model.interfaces.descriptionText\nimport com.mikepenz.materialdrawer.model.interfaces.iconRes\nimport com.mikepenz.materialdrawer.model.interfaces.iconUrl\nimport com.mikepenz.materialdrawer.model.interfaces.nameRes\nimport com.mikepenz.materialdrawer.model.interfaces.nameText\nimport com.mikepenz.materialdrawer.util.AbstractDrawerImageLoader\nimport com.mikepenz.materialdrawer.util.DrawerImageLoader\nimport com.mikepenz.materialdrawer.util.addItems\nimport com.mikepenz.materialdrawer.util.addItemsAtPosition\nimport com.mikepenz.materialdrawer.util.updateBadge\nimport com.mikepenz.materialdrawer.widget.AccountHeaderView\nimport dagger.hilt.android.AndroidEntryPoint\nimport dagger.hilt.android.migration.OptionalInject\nimport javax.inject.Inject\nimport kotlinx.coroutines.launch\n\n@OptionalInject\n@AndroidEntryPoint\nclass MainActivity : BottomSheetActivity(), ActionButtonActivity, MenuProvider {\n\n    @Inject\n    lateinit var eventHub: EventHub\n\n    @Inject\n    lateinit var notificationService: NotificationService\n\n    @Inject\n    lateinit var cacheUpdater: CacheUpdater\n\n    @Inject\n    lateinit var logoutUsecase: LogoutUsecase\n\n    @Inject\n    lateinit var draftsAlert: DraftsAlert\n\n    @Inject\n    lateinit var developerToolsUseCase: DeveloperToolsUseCase\n\n    private val viewModel: MainViewModel by viewModels()\n\n    private val binding by viewBinding(ActivityMainBinding::inflate)\n\n    private lateinit var activeAccount: AccountEntity\n\n    private lateinit var header: AccountHeaderView\n\n    private var onTabSelectedListener: OnTabSelectedListener? = null\n\n    /** Mediate between binding.viewPager and the chosen tab layout */\n    private var tabLayoutMediator: TabLayoutMediator? = null\n\n    /** Adapter for the different timeline tabs */\n    private lateinit var tabAdapter: MainPagerAdapter\n\n    private var directMessageTab: TabLayout.Tab? = null\n\n    private val onBackPressedCallback = object : OnBackPressedCallback(false) {\n        override fun handleOnBackPressed() {\n            binding.viewPager.currentItem = 0\n        }\n    }\n\n    private val requestNotificationPermissionLauncher =\n        registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->\n            if (isGranted) {\n                viewModel.setupNotifications(this)\n            }\n        }\n\n    @SuppressLint(\"RestrictedApi\")\n    override fun onCreate(savedInstanceState: Bundle?) {\n        // Newer Android versions don't need to install the compat Splash Screen\n        // and it can cause theming bugs.\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {\n            installSplashScreen()\n        }\n        super.onCreate(savedInstanceState)\n\n        // make sure MainActivity doesn't hide other activities when launcher icon is clicked again\n        if (!isTaskRoot &&\n            intent.hasCategory(Intent.CATEGORY_LAUNCHER) &&\n            intent.action == Intent.ACTION_MAIN\n        ) {\n            finish()\n            return\n        }\n\n        // will be redirected to LoginActivity by BaseActivity\n        activeAccount = accountManager.activeAccount ?: return\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&\n            ActivityCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED\n        ) {\n            requestNotificationPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)\n        } else {\n            viewModel.setupNotifications(this)\n        }\n\n        var showNotificationTab = false\n\n        // check for savedInstanceState in order to not handle intent events more than once\n        if (intent != null && savedInstanceState == null) {\n            showNotificationTab = handleIntent(intent, activeAccount)\n            if (isFinishing) {\n                // handleIntent() finished this activity and started a new one - no need to continue initialization\n                return\n            }\n        }\n\n        setContentView(binding.root)\n\n        val bottomBarHeight = if (preferences.getString(PrefKeys.MAIN_NAV_POSITION, \"top\") == \"bottom\") {\n            resources.getDimensionPixelSize(R.dimen.bottomAppBarHeight)\n        } else {\n            0\n        }\n\n        val fabMargin = resources.getDimensionPixelSize(R.dimen.fabMargin)\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {\n            ViewCompat.setOnApplyWindowInsetsListener(binding.viewPager) { _, insets ->\n                val systemBarsInsets = insets.getInsets(systemBars())\n                val bottomInsets = systemBarsInsets.bottom\n\n                binding.composeButton.updateLayoutParams<CoordinatorLayout.LayoutParams> {\n                    bottomMargin = bottomBarHeight + fabMargin + bottomInsets\n                }\n                binding.mainDrawer.recyclerView.updatePadding(bottom = bottomInsets)\n\n                if (preferences.getString(PrefKeys.MAIN_NAV_POSITION, \"top\") == \"top\") {\n                    insets\n                } else {\n                    binding.viewPager.updatePadding(bottom = bottomBarHeight + bottomInsets)\n\n                    /* BottomAppBar could handle size and insets automatically, but then it gets quite large,\n                       so we do it like this instead */\n                    binding.bottomNav.updateLayoutParams<ViewGroup.MarginLayoutParams> {\n                        height = bottomBarHeight + bottomInsets\n                    }\n                    binding.bottomTabLayout.updateLayoutParams<ViewGroup.MarginLayoutParams> {\n                        bottomMargin = bottomInsets\n                    }\n                    insets.inset(0, 0, 0, bottomInsets)\n                }\n            }\n        } else {\n            // don't draw a status bar, the DrawerLayout and the MaterialDrawerLayout have their own\n            // on Vanilla Ice Cream (API 35) and up there is no status bar color because of edge-to-edge mode\n            @Suppress(\"DEPRECATION\")\n            window.statusBarColor = Color.TRANSPARENT\n\n            binding.composeButton.updateLayoutParams<CoordinatorLayout.LayoutParams> {\n                bottomMargin = bottomBarHeight + fabMargin\n            }\n            binding.viewPager.updatePadding(bottom = bottomBarHeight)\n        }\n\n        binding.composeButton.setOnClickListener {\n            val composeIntent = Intent(applicationContext, ComposeActivity::class.java)\n            startActivity(composeIntent)\n        }\n\n        // Determine which of the three toolbars should be the supportActionBar (which hosts\n        // the options menu).\n        val hideTopToolbar = preferences.getBoolean(PrefKeys.HIDE_TOP_TOOLBAR, false)\n        if (hideTopToolbar) {\n            when (preferences.getString(PrefKeys.MAIN_NAV_POSITION, \"top\")) {\n                \"top\" -> setSupportActionBar(binding.topNav)\n                \"bottom\" -> setSupportActionBar(binding.bottomNav)\n            }\n            // this is a bit hacky, but when the mainToolbar is GONE, the toolbar size gets messed up for some reason\n            binding.mainToolbar.layoutParams.height = 0\n            binding.mainToolbar.visibility = View.INVISIBLE\n            // There's not enough space in the top/bottom bars to show the title as well.\n            supportActionBar?.setDisplayShowTitleEnabled(false)\n        } else {\n            setSupportActionBar(binding.mainToolbar)\n            binding.mainToolbar.layoutParams.height = LayoutParams.WRAP_CONTENT\n            binding.mainToolbar.show()\n        }\n\n        addMenuProvider(this)\n\n        binding.viewPager.reduceSwipeSensitivity()\n\n        setupDrawer(\n            savedInstanceState,\n            addSearchButton = hideTopToolbar,\n            addTrendingTagsButton = !activeAccount.tabPreferences.hasTab(\n                TRENDING_TAGS\n            ),\n            addTrendingStatusesButton = !activeAccount.tabPreferences.hasTab(\n                TRENDING_STATUSES\n            )\n        )\n\n        lifecycleScope.launch {\n            viewModel.accounts.collect(::updateProfiles)\n        }\n\n        lifecycleScope.launch {\n            viewModel.unreadAnnouncementsCount.collect(::updateAnnouncementsBadge)\n        }\n\n        // Initialise the tab adapter and set to viewpager. Fragments appear to be leaked if the\n        // adapter changes over the life of the viewPager (the adapter, not its contents), so set\n        // the initial list of tabs to empty, and set the full list later in setupTabs(). See\n        // https://github.com/tuskyapp/Tusky/issues/3251 for details.\n        tabAdapter = MainPagerAdapter(emptyList(), this@MainActivity)\n        binding.viewPager.adapter = tabAdapter\n        binding.viewPager.offscreenPageLimit = 2\n\n        lifecycleScope.launch {\n            viewModel.tabs.collect(::setupTabs)\n        }\n        if (showNotificationTab) {\n            val position = viewModel.tabs.value.indexOfFirst { it.id == NOTIFICATIONS }\n            if (position != -1) {\n                binding.viewPager.setCurrentItem(position, false)\n            }\n        }\n\n        lifecycleScope.launch {\n            viewModel.showDirectMessagesBadge.collect { showBadge ->\n                updateDirectMessageBadge(showBadge)\n            }\n        }\n\n        onBackPressedDispatcher.addCallback(this@MainActivity, onBackPressedCallback)\n\n        // \"Post failed\" dialog should display in this activity\n        draftsAlert.observeInContext(this@MainActivity, true)\n    }\n\n    override fun onNewIntent(intent: Intent) {\n        super.onNewIntent(intent)\n        val showNotificationTab = handleIntent(intent, activeAccount)\n        if (showNotificationTab) {\n            val tabs = activeAccount.tabPreferences\n            val position = tabs.indexOfFirst { it.id == NOTIFICATIONS }\n            if (position != -1) {\n                binding.viewPager.setCurrentItem(position, false)\n            }\n        }\n    }\n\n    override fun onDestroy() {\n        cacheUpdater.stop()\n        super.onDestroy()\n    }\n\n    /** Handle an incoming Intent,\n     * @returns true when the intent is coming from an notification and the interface should show the notification tab.\n     */\n    private fun handleIntent(intent: Intent, activeAccount: AccountEntity): Boolean {\n        val notificationId = intent.getIntExtra(NOTIFICATION_ID, -1)\n        if (notificationId != -1) {\n            // opened from a notification action, cancel the notification\n            val notificationManager = getSystemService(\n                NOTIFICATION_SERVICE\n            ) as NotificationManager\n            notificationManager.cancel(intent.getStringExtra(NOTIFICATION_TAG), notificationId)\n        }\n\n        /** there are two possibilities the accountId can be passed to MainActivity:\n         * - from our code as Long Intent Extra TUSKY_ACCOUNT_ID\n         * - from share shortcuts as String 'android.intent.extra.shortcut.ID'\n         */\n        var tuskyAccountId = intent.getLongExtra(TUSKY_ACCOUNT_ID, -1)\n        if (tuskyAccountId == -1L) {\n            val accountIdString = intent.getStringExtra(ShortcutManagerCompat.EXTRA_SHORTCUT_ID)\n            if (accountIdString != null) {\n                tuskyAccountId = accountIdString.toLong()\n            }\n        }\n        val accountRequested = tuskyAccountId != -1L\n        if (accountRequested && tuskyAccountId != activeAccount.id) {\n            changeAccount(tuskyAccountId, intent)\n            return false\n        }\n\n        val openDrafts = intent.getBooleanExtra(OPEN_DRAFTS, false)\n\n        if (canHandleMimeType(intent.type) || intent.hasExtra(COMPOSE_OPTIONS)) {\n            // Sharing to Tusky from an external app\n            if (accountRequested) {\n                // The correct account is already active\n                forwardToComposeActivity(intent)\n            } else {\n                // No account was provided, show the chooser\n                showAccountChooserDialog(\n                    getString(R.string.action_share_as),\n                    true,\n                    object : AccountSelectionListener {\n                        override fun onAccountSelected(account: AccountEntity) {\n                            val requestedId = account.id\n                            if (requestedId == activeAccount.id) {\n                                // The correct account is already active\n                                forwardToComposeActivity(intent)\n                            } else {\n                                // A different account was requested, restart the activity\n                                intent.putExtra(TUSKY_ACCOUNT_ID, requestedId)\n                                changeAccount(requestedId, intent)\n                            }\n                        }\n                    }\n                )\n            }\n        } else if (openDrafts) {\n            val draftsIntent = DraftsActivity.newIntent(this)\n            startActivity(draftsIntent)\n        } else if (accountRequested && intent.hasExtra(NOTIFICATION_TYPE)) {\n            // user clicked a notification, show follow requests for type FOLLOW_REQUEST,\n            // otherwise show notification tab\n            if (intent.getStringExtra(NOTIFICATION_TYPE) == Notification.Type.FollowRequest.name) {\n                val accountListIntent = AccountListActivity.newIntent(\n                    this,\n                    AccountListActivity.Type.FOLLOW_REQUESTS\n                )\n                startActivityWithSlideInAnimation(accountListIntent)\n            } else {\n                return true\n            }\n        }\n        return false\n    }\n\n    private fun updateDirectMessageBadge(showBadge: Boolean) {\n        directMessageTab?.badge?.isVisible = showBadge\n    }\n\n    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n        menuInflater.inflate(R.menu.activity_main, menu)\n    }\n\n    override fun onPrepareMenu(menu: Menu) {\n        super.onPrepareMenu(menu)\n\n        // If the main toolbar is hidden then there's no space in the top/bottomNav to show\n        // the menu items as icons, so forceably disable them\n        if (!binding.mainToolbar.isVisible) {\n            menu.forEach {\n                it.setShowAsAction(\n                    SHOW_AS_ACTION_NEVER\n                )\n            }\n        }\n    }\n\n    override fun onMenuItemSelected(item: MenuItem): Boolean {\n        return when (item.itemId) {\n            R.id.action_search -> {\n                startActivity(SearchActivity.getIntent(this@MainActivity))\n                true\n            }\n            else -> super.onOptionsItemSelected(item)\n        }\n    }\n\n    override fun dispatchKeyEvent(event: KeyEvent): Boolean {\n        // Allow software back press to be properly dispatched to drawer layout\n        val handled = when (event.action) {\n            KeyEvent.ACTION_DOWN -> binding.mainDrawerLayout.onKeyDown(event.keyCode, event)\n            KeyEvent.ACTION_UP -> binding.mainDrawerLayout.onKeyUp(event.keyCode, event)\n            else -> false\n        }\n        return handled || super.dispatchKeyEvent(event)\n    }\n\n    override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {\n        when (keyCode) {\n            KeyEvent.KEYCODE_MENU -> {\n                if (binding.mainDrawerLayout.isOpen) {\n                    binding.mainDrawerLayout.close()\n                } else {\n                    binding.mainDrawerLayout.open()\n                }\n                return true\n            }\n            KeyEvent.KEYCODE_SEARCH -> {\n                startActivityWithSlideInAnimation(SearchActivity.getIntent(this))\n                return true\n            }\n        }\n        if (event.isCtrlPressed || event.isShiftPressed) {\n            // FIXME: blackberry keyONE raises SHIFT key event even CTRL IS PRESSED\n            when (keyCode) {\n                KeyEvent.KEYCODE_N -> {\n                    // open compose activity by pressing SHIFT + N (or CTRL + N)\n                    val composeIntent = Intent(applicationContext, ComposeActivity::class.java)\n                    startActivity(composeIntent)\n                    return true\n                }\n            }\n        }\n        return super.onKeyDown(keyCode, event)\n    }\n\n    public override fun onPostCreate(savedInstanceState: Bundle?) {\n        super.onPostCreate(savedInstanceState)\n\n        if (intent != null) {\n            val redirectUrl = intent.getStringExtra(REDIRECT_URL)\n            if (redirectUrl != null) {\n                viewUrl(redirectUrl, PostLookupFallbackBehavior.DISPLAY_ERROR)\n            }\n        }\n    }\n\n    private fun forwardToComposeActivity(intent: Intent) {\n        val composeOptions =\n            intent.getParcelableExtraCompat<ComposeActivity.ComposeOptions>(COMPOSE_OPTIONS)\n        val composeIntent = if (composeOptions != null) {\n            ComposeActivity.startIntent(this, composeOptions)\n        } else {\n            Intent(this, ComposeActivity::class.java).apply {\n                action = intent.action\n                type = intent.type\n                putExtras(intent)\n            }\n        }\n        startActivity(composeIntent)\n    }\n\n    private fun setupDrawer(\n        savedInstanceState: Bundle?,\n        addSearchButton: Boolean,\n        addTrendingTagsButton: Boolean,\n        addTrendingStatusesButton: Boolean\n    ) {\n        val drawerOpenClickListener = View.OnClickListener { binding.mainDrawerLayout.open() }\n\n        binding.mainToolbar.setNavigationOnClickListener(drawerOpenClickListener)\n        binding.topNav.setNavigationOnClickListener(drawerOpenClickListener)\n        binding.bottomNav.setNavigationOnClickListener(drawerOpenClickListener)\n\n        header = AccountHeaderView(this).apply {\n            headerBackgroundScaleType = ImageView.ScaleType.CENTER_CROP\n            currentHiddenInList = true\n            onAccountHeaderListener = { _: View?, profile: IProfile, current: Boolean -> handleProfileClick(profile, current) }\n            addProfile(\n                ProfileSettingDrawerItem().apply {\n                    identifier = DRAWER_ITEM_ADD_ACCOUNT\n                    nameRes = R.string.add_account_name\n                    descriptionRes = R.string.add_account_description\n                    iconRes = R.drawable.ic_add_24dp\n                    isIconTinted = true\n                },\n                0\n            )\n            attachToSliderView(binding.mainDrawer)\n            dividerBelowHeader = false\n            closeDrawerOnProfileListClick = true\n        }\n\n        header.currentProfileName.maxLines = 1\n        header.currentProfileName.ellipsize = TextUtils.TruncateAt.END\n\n        header.accountHeaderBackground.setColorFilter(getColor(R.color.headerBackgroundFilter))\n        header.accountHeaderBackground.setBackgroundColor(\n            MaterialColors.getColor(header, R.attr.colorBackgroundAccent)\n        )\n        val animateAvatars = preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false)\n\n        DrawerImageLoader.init(object : AbstractDrawerImageLoader() {\n            override fun set(imageView: ImageView, uri: Uri, placeholder: Drawable, tag: String?) {\n                if (animateAvatars) {\n                    Glide.with(imageView)\n                        .load(uri)\n                        .placeholder(placeholder)\n                        .into(imageView)\n                } else {\n                    Glide.with(imageView)\n                        .asBitmap()\n                        .load(uri)\n                        .placeholder(placeholder)\n                        .into(imageView)\n                }\n            }\n\n            override fun cancel(imageView: ImageView) {\n                // nothing to do, Glide already handles cancellation automatically\n            }\n\n            override fun placeholder(ctx: Context, tag: String?): Drawable {\n                if (tag == DrawerImageLoader.Tags.PROFILE.name || tag == DrawerImageLoader.Tags.PROFILE_DRAWER_ITEM.name) {\n                    return AppCompatResources.getDrawable(ctx, R.drawable.avatar_default)!!\n                }\n\n                return super.placeholder(ctx, tag)\n            }\n        })\n\n        binding.mainDrawer.apply {\n            refreshMainDrawerItems(\n                addSearchButton = addSearchButton,\n                addTrendingTagsButton = addTrendingTagsButton,\n                addTrendingStatusesButton = addTrendingStatusesButton\n            )\n            setSavedInstance(savedInstanceState)\n        }\n    }\n\n    private fun refreshMainDrawerItems(\n        addSearchButton: Boolean,\n        addTrendingTagsButton: Boolean,\n        addTrendingStatusesButton: Boolean\n    ) {\n        binding.mainDrawer.apply {\n            itemAdapter.clear()\n            tintStatusBar = true\n            addItems(\n                primaryDrawerItem {\n                    nameRes = R.string.action_edit_profile\n                    iconRes = R.drawable.ic_person_24dp\n                    onClick = {\n                        val intent = Intent(context, EditProfileActivity::class.java)\n                        startActivityWithSlideInAnimation(intent)\n                    }\n                },\n                primaryDrawerItem {\n                    nameRes = R.string.action_view_favourites\n                    isSelectable = false\n                    iconRes = R.drawable.ic_star_24dp\n                    onClick = {\n                        val intent = StatusListActivity.newFavouritesIntent(context)\n                        startActivityWithSlideInAnimation(intent)\n                    }\n                },\n                primaryDrawerItem {\n                    nameRes = R.string.action_view_bookmarks\n                    iconRes = R.drawable.ic_bookmark_24dp\n                    onClick = {\n                        val intent = StatusListActivity.newBookmarksIntent(context)\n                        startActivityWithSlideInAnimation(intent)\n                    }\n                },\n                primaryDrawerItem {\n                    nameRes = R.string.action_view_follow_requests\n                    iconRes = R.drawable.ic_person_add_24dp_mirrored\n                    onClick = {\n                        val intent = AccountListActivity.newIntent(context, AccountListActivity.Type.FOLLOW_REQUESTS)\n                        startActivityWithSlideInAnimation(intent)\n                    }\n                },\n                primaryDrawerItem {\n                    nameRes = R.string.action_lists\n                    iconRes = R.drawable.ic_list_alt_24dp\n                    onClick = {\n                        startActivityWithSlideInAnimation(ListsActivity.newIntent(context))\n                    }\n                },\n                primaryDrawerItem {\n                    nameRes = R.string.action_access_drafts\n                    iconRes = R.drawable.ic_edit_document_24dp\n                    onClick = {\n                        val intent = DraftsActivity.newIntent(context)\n                        startActivityWithSlideInAnimation(intent)\n                    }\n                },\n                primaryDrawerItem {\n                    nameRes = R.string.action_access_scheduled_posts\n                    iconRes = R.drawable.ic_schedule_24dp\n                    onClick = {\n                        startActivityWithSlideInAnimation(ScheduledStatusActivity.newIntent(context))\n                    }\n                },\n                primaryDrawerItem {\n                    identifier = DRAWER_ITEM_ANNOUNCEMENTS\n                    nameRes = R.string.title_announcements\n                    iconRes = R.drawable.ic_campaign_24dp\n                    onClick = {\n                        startActivityWithSlideInAnimation(AnnouncementsActivity.newIntent(context))\n                    }\n                    badgeStyle = BadgeStyle().apply {\n                        textColor = ColorHolder.fromColor(MaterialColors.getColor(binding.mainDrawer, materialR.attr.colorOnPrimary))\n                        color = ColorHolder.fromColor(MaterialColors.getColor(binding.mainDrawer, materialR.attr.colorPrimary))\n                    }\n                },\n                DividerDrawerItem(),\n                secondaryDrawerItem {\n                    nameRes = R.string.action_view_account_preferences\n                    iconRes = R.drawable.ic_manage_accounts_24dp\n                    onClick = {\n                        val intent = PreferencesActivity.newIntent(context, PreferencesActivity.ACCOUNT_PREFERENCES)\n                        startActivityWithSlideInAnimation(intent)\n                    }\n                },\n                secondaryDrawerItem {\n                    nameRes = R.string.action_view_preferences\n                    iconRes = R.drawable.ic_settings_24dp\n                    onClick = {\n                        val intent = PreferencesActivity.newIntent(context, PreferencesActivity.GENERAL_PREFERENCES)\n                        startActivityWithSlideInAnimation(intent)\n                    }\n                },\n                secondaryDrawerItem {\n                    nameRes = R.string.about_title_activity\n                    iconRes = R.drawable.ic_info_24dp\n                    onClick = {\n                        val intent = Intent(context, AboutActivity::class.java)\n                        startActivityWithSlideInAnimation(intent)\n                    }\n                },\n                secondaryDrawerItem {\n                    nameRes = R.string.action_logout\n                    iconRes = R.drawable.ic_logout_24dp\n                    onClick = ::logout\n                }\n            )\n\n            if (addSearchButton) {\n                binding.mainDrawer.addItemsAtPosition(\n                    4,\n                    primaryDrawerItem {\n                        nameRes = R.string.action_search\n                        iconRes = R.drawable.ic_search_24dp\n                        onClick = {\n                            startActivityWithSlideInAnimation(SearchActivity.getIntent(context))\n                        }\n                    }\n                )\n            }\n\n            if (addTrendingTagsButton) {\n                binding.mainDrawer.addItemsAtPosition(\n                    5,\n                    primaryDrawerItem {\n                        nameRes = R.string.title_public_trending_hashtags\n                        iconRes = R.drawable.ic_whatshot_24dp\n                        onClick = {\n                            startActivityWithSlideInAnimation(TrendingActivity.getIntent(context))\n                        }\n                    }\n                )\n            }\n\n            if (addTrendingStatusesButton) {\n                binding.mainDrawer.addItemsAtPosition(\n                    6,\n                    primaryDrawerItem {\n                        nameRes = R.string.title_public_trending_statuses\n                        iconRes = R.drawable.ic_local_fire_department_24dp\n                        onClick = {\n                            startActivityWithSlideInAnimation(StatusListActivity.newTrendingIntent(context))\n                        }\n                    }\n                )\n            }\n        }\n\n        if (BuildConfig.DEBUG) {\n            // Add a \"Developer tools\" entry. Code that makes it easier to\n            // set the app state at runtime belongs here, it will never\n            // be exposed to users.\n            binding.mainDrawer.addItems(\n                DividerDrawerItem(),\n                secondaryDrawerItem {\n                    nameText = \"Developer tools\"\n                    isEnabled = true\n                    iconRes = R.drawable.ic_developer_mode_24dp\n                    onClick = {\n                        showDeveloperToolsDialog()\n                    }\n                }\n            )\n        }\n    }\n\n    private fun showDeveloperToolsDialog(): AlertDialog {\n        return MaterialAlertDialogBuilder(this)\n            .setTitle(\"Developer Tools\")\n            .setItems(\n                arrayOf(\"Create \\\"Load more\\\" gap\")\n            ) { _, which ->\n                Log.d(TAG, \"Developer tools: $which\")\n                when (which) {\n                    0 -> {\n                        Log.d(TAG, \"Creating \\\"Load more\\\" gap\")\n                        lifecycleScope.launch {\n                            developerToolsUseCase.createLoadMoreGap(\n                                activeAccount.id\n                            )\n                        }\n                    }\n                }\n            }\n            .show()\n    }\n\n    override fun onSaveInstanceState(outState: Bundle) {\n        super.onSaveInstanceState(binding.mainDrawer.saveInstanceState(outState))\n    }\n\n    private fun setupTabs(tabs: List<TabData>) {\n        val activeTabLayout = if (preferences.getString(PrefKeys.MAIN_NAV_POSITION, \"top\") == \"bottom\") {\n            binding.topNav.hide()\n            binding.bottomTabLayout\n        } else {\n            binding.bottomNav.hide()\n            binding.tabLayout\n        }\n\n        // Save the previous tab so it can be restored later\n        val previousTab = tabAdapter.tabs.getOrNull(binding.viewPager.currentItem)\n\n        // Detach any existing mediator before changing tab contents and attaching a new mediator\n        tabLayoutMediator?.detach()\n\n        directMessageTab = null\n\n        tabAdapter.tabs = tabs\n        tabAdapter.notifyItemRangeChanged(0, tabs.size)\n\n        tabLayoutMediator = TabLayoutMediator(activeTabLayout, binding.viewPager, true) {\n                tab: TabLayout.Tab, position: Int ->\n            tab.icon = AppCompatResources.getDrawable(this@MainActivity, tabs[position].icon)\n            tab.contentDescription = tabs[position].title(this)\n            if (tabs[position].id == DIRECT) {\n                val badge = tab.orCreateBadge\n                badge.isVisible = activeAccount.hasDirectMessageBadge\n                badge.backgroundColor = MaterialColors.getColor(binding.mainDrawer, materialR.attr.colorPrimary)\n                directMessageTab = tab\n            }\n        }.also { it.attach() }\n        updateDirectMessageBadge(viewModel.showDirectMessagesBadge.value)\n\n        val position = previousTab?.let { tabs.indexOfFirst { it == previousTab } }\n            .takeIf { it != -1 } ?: 0\n        binding.viewPager.setCurrentItem(position, false)\n\n        val pageMargin = resources.getDimensionPixelSize(R.dimen.tab_page_margin)\n        binding.viewPager.setPageTransformer(MarginPageTransformer(pageMargin))\n\n        val enableSwipeForTabs = preferences.getBoolean(PrefKeys.ENABLE_SWIPE_FOR_TABS, true)\n        binding.viewPager.isUserInputEnabled = enableSwipeForTabs\n\n        onTabSelectedListener?.let {\n            activeTabLayout.removeOnTabSelectedListener(it)\n        }\n\n        onTabSelectedListener = object : OnTabSelectedListener {\n            override fun onTabSelected(tab: TabLayout.Tab) {\n                onBackPressedCallback.isEnabled = tab.position > 0\n\n                binding.mainToolbar.title = tab.contentDescription\n\n                if (tab == directMessageTab) {\n                    viewModel.dismissDirectMessagesBadge()\n                }\n            }\n\n            override fun onTabUnselected(tab: TabLayout.Tab) {}\n\n            override fun onTabReselected(tab: TabLayout.Tab) {\n                val fragment = tabAdapter.getFragment(tab.position)\n                if (fragment is ReselectableFragment) {\n                    fragment.onReselect()\n                }\n            }\n        }.also {\n            activeTabLayout.addOnTabSelectedListener(it)\n        }\n\n        supportActionBar?.title = tabs[position].title(this@MainActivity)\n        binding.mainToolbar.setOnClickListener {\n            (\n                tabAdapter.getFragment(\n                    activeTabLayout.selectedTabPosition\n                ) as? ReselectableFragment\n                )?.onReselect()\n        }\n    }\n\n    private fun handleProfileClick(profile: IProfile, current: Boolean): Boolean {\n        // open profile when active image was clicked\n        if (current) {\n            val intent = AccountActivity.getIntent(this, activeAccount.accountId)\n            startActivityWithSlideInAnimation(intent)\n            return false\n        }\n        // open LoginActivity to add new account\n        if (profile.identifier == DRAWER_ITEM_ADD_ACCOUNT) {\n            startActivityWithSlideInAnimation(\n                LoginActivity.getIntent(this, LoginActivity.MODE_ADDITIONAL_LOGIN)\n            )\n            return false\n        }\n        // change Account\n        changeAccount(profile.identifier, null)\n        return false\n    }\n\n    private fun changeAccount(\n        newSelectedId: Long,\n        forward: Intent?,\n    ) = lifecycleScope.launch {\n        cacheUpdater.stop()\n        accountManager.setActiveAccount(newSelectedId)\n        val intent = Intent(this@MainActivity, MainActivity::class.java)\n        if (forward != null) {\n            intent.type = forward.type\n            intent.action = forward.action\n            intent.putExtras(forward)\n        }\n        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK\n        startActivity(intent)\n        finish()\n    }\n\n    private fun logout() {\n        MaterialAlertDialogBuilder(this)\n            .setTitle(R.string.action_logout)\n            .setMessage(getString(R.string.action_logout_confirm, activeAccount.fullName))\n            .setPositiveButton(android.R.string.ok) { _: DialogInterface?, _: Int ->\n                binding.appBar.hide()\n                binding.viewPager.hide()\n                binding.progressBar.show()\n                binding.bottomNav.hide()\n                binding.composeButton.hide()\n\n                lifecycleScope.launch {\n                    val otherAccountAvailable = logoutUsecase.logout(activeAccount)\n                    val intent = if (otherAccountAvailable) {\n                        Intent(this@MainActivity, MainActivity::class.java)\n                    } else {\n                        LoginActivity.getIntent(this@MainActivity, LoginActivity.MODE_DEFAULT)\n                    }\n                    startActivity(intent)\n                    finish()\n                }\n            }\n            .setNegativeButton(android.R.string.cancel, null)\n            .show()\n    }\n\n    @SuppressLint(\"CheckResult\")\n    private fun loadDrawerAvatar(avatarUrl: String, showPlaceholder: Boolean = true) {\n        val hideTopToolbar = preferences.getBoolean(PrefKeys.HIDE_TOP_TOOLBAR, false)\n        val animateAvatars = preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false)\n\n        val activeToolbar = if (hideTopToolbar) {\n            val navOnBottom = preferences.getString(PrefKeys.MAIN_NAV_POSITION, \"top\") == \"bottom\"\n            if (navOnBottom) {\n                binding.bottomNav\n            } else {\n                binding.topNav\n            }\n        } else {\n            binding.mainToolbar\n        }\n\n        val navIconSize = resources.getDimensionPixelSize(R.dimen.avatar_toolbar_nav_icon_size)\n\n        if (animateAvatars) {\n            Glide.with(this)\n                .asDrawable()\n                .load(avatarUrl)\n                .transform(\n                    RoundedCorners(resources.getDimensionPixelSize(R.dimen.avatar_radius_36dp))\n                )\n                .apply {\n                    if (showPlaceholder) placeholder(R.drawable.avatar_default)\n                }\n                .into(object : CustomTarget<Drawable>(navIconSize, navIconSize) {\n\n                    override fun onLoadStarted(placeholder: Drawable?) {\n                        placeholder?.let {\n                            activeToolbar.navigationIcon = FixedSizeDrawable(it, navIconSize, navIconSize)\n                        }\n                    }\n\n                    override fun onResourceReady(\n                        resource: Drawable,\n                        transition: Transition<in Drawable>?\n                    ) {\n                        if (resource is Animatable) resource.start()\n                        activeToolbar.navigationIcon = FixedSizeDrawable(resource, navIconSize, navIconSize)\n                    }\n\n                    override fun onLoadCleared(placeholder: Drawable?) {\n                        placeholder?.let {\n                            activeToolbar.navigationIcon = FixedSizeDrawable(it, navIconSize, navIconSize)\n                        }\n                    }\n                })\n        } else {\n            Glide.with(this)\n                .asBitmap()\n                .load(avatarUrl)\n                .transform(\n                    RoundedCorners(resources.getDimensionPixelSize(R.dimen.avatar_radius_36dp))\n                )\n                .apply {\n                    if (showPlaceholder) placeholder(R.drawable.avatar_default)\n                }\n                .into(object : CustomTarget<Bitmap>(navIconSize, navIconSize) {\n                    override fun onLoadStarted(placeholder: Drawable?) {\n                        placeholder?.let {\n                            activeToolbar.navigationIcon = FixedSizeDrawable(it, navIconSize, navIconSize)\n                        }\n                    }\n\n                    override fun onResourceReady(\n                        resource: Bitmap,\n                        transition: Transition<in Bitmap>?\n                    ) {\n                        activeToolbar.navigationIcon = FixedSizeDrawable(\n                            resource.toDrawable(resources),\n                            navIconSize,\n                            navIconSize\n                        )\n                    }\n\n                    override fun onLoadCleared(placeholder: Drawable?) {\n                        placeholder?.let {\n                            activeToolbar.navigationIcon = FixedSizeDrawable(it, navIconSize, navIconSize)\n                        }\n                    }\n                })\n        }\n    }\n\n    private fun updateAnnouncementsBadge(unreadAnnouncementsCount: Int) {\n        binding.mainDrawer.updateBadge(\n            DRAWER_ITEM_ANNOUNCEMENTS,\n            StringHolder(\n                if (unreadAnnouncementsCount <= 0) null else unreadAnnouncementsCount.toString()\n            )\n        )\n    }\n\n    private fun updateProfiles(accounts: List<AccountViewData>) {\n        if (accounts.isEmpty()) {\n            return\n        }\n        val activeProfile = accounts.first()\n\n        loadDrawerAvatar(activeProfile.profilePictureUrl)\n\n        Glide.with(header.accountHeaderBackground)\n            .asBitmap()\n            .load(activeProfile.profileHeaderUrl)\n            .into(header.accountHeaderBackground)\n\n        val animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false)\n        val profiles: MutableList<IProfile> =\n            accounts.map { acc ->\n                ProfileDrawerItem().apply {\n                    isSelected = acc == activeProfile\n                    nameText = acc.displayName.emojify(acc.emojis, header, animateEmojis)\n                    iconUrl = acc.profilePictureUrl\n                    isNameShown = true\n                    identifier = acc.id\n                    descriptionText = acc.fullName\n                }\n            }.toMutableList()\n\n        // reuse the already existing \"add account\" item\n        for (profile in header.profiles.orEmpty()) {\n            if (profile.identifier == DRAWER_ITEM_ADD_ACCOUNT) {\n                profiles.add(profile)\n                break\n            }\n        }\n        header.clear()\n        header.profiles = profiles\n        header.setActiveProfile(activeProfile.id)\n        binding.mainToolbar.subtitle = if (accountManager.shouldDisplaySelfUsername()) {\n            activeProfile.fullName\n        } else {\n            null\n        }\n    }\n\n    override fun getActionButton() = binding.composeButton\n\n    companion object {\n        private const val TAG = \"MainActivity\" // logging tag\n        private const val DRAWER_ITEM_ADD_ACCOUNT: Long = -13\n        private const val DRAWER_ITEM_ANNOUNCEMENTS: Long = 14\n        private const val REDIRECT_URL = \"redirectUrl\"\n        private const val OPEN_DRAFTS = \"draft\"\n        private const val TUSKY_ACCOUNT_ID = \"tuskyAccountId\"\n        private const val COMPOSE_OPTIONS = \"composeOptions\"\n        private const val NOTIFICATION_TYPE = \"notificationType\"\n        private const val NOTIFICATION_TAG = \"notificationTag\"\n        private const val NOTIFICATION_ID = \"notificationId\"\n\n        /**\n         * Switches the active account to the provided accountId and then stays on MainActivity\n         */\n        @JvmStatic\n        fun accountSwitchIntent(context: Context, tuskyAccountId: Long): Intent {\n            return Intent(context, MainActivity::class.java).apply {\n                putExtra(TUSKY_ACCOUNT_ID, tuskyAccountId)\n                flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK\n            }\n        }\n\n        /**\n         * Switches the active account to the accountId and takes the user to the correct place according to the notification they clicked\n         */\n        @JvmStatic\n        fun openNotificationIntent(\n            context: Context,\n            tuskyAccountId: Long,\n            type: Notification.Type\n        ): Intent {\n            return accountSwitchIntent(context, tuskyAccountId).apply {\n                putExtra(NOTIFICATION_TYPE, type.name)\n            }\n        }\n\n        /**\n         * Switches the active account to the accountId and then opens ComposeActivity with the provided options\n         * @param tuskyAccountId the id of the Tusky account to open the screen with. Set to -1 for current account.\n         * @param notificationId optional id of the notification that should be cancelled when this intent is opened\n         * @param notificationTag optional tag of the notification that should be cancelled when this intent is opened\n         */\n        @JvmStatic\n        fun composeIntent(\n            context: Context,\n            options: ComposeActivity.ComposeOptions,\n            tuskyAccountId: Long = -1,\n            notificationTag: String? = null,\n            notificationId: Int = -1\n        ): Intent {\n            return accountSwitchIntent(context, tuskyAccountId).apply {\n                action = Intent.ACTION_SEND // so it can be opened via shortcuts\n                putExtra(COMPOSE_OPTIONS, options)\n                putExtra(NOTIFICATION_TAG, notificationTag)\n                putExtra(NOTIFICATION_ID, notificationId)\n            }\n        }\n\n        /**\n         * switches the active account to the accountId and then tries to resolve and show the provided url\n         */\n        @JvmStatic\n        fun redirectIntent(context: Context, tuskyAccountId: Long, url: String): Intent {\n            return accountSwitchIntent(context, tuskyAccountId).apply {\n                putExtra(REDIRECT_URL, url)\n            }\n        }\n\n        /**\n         * switches the active account to the provided accountId and then opens drafts\n         */\n        fun draftIntent(context: Context, tuskyAccountId: Long): Intent {\n            return accountSwitchIntent(context, tuskyAccountId).apply {\n                putExtra(OPEN_DRAFTS, true)\n            }\n        }\n    }\n}\n\nprivate inline fun primaryDrawerItem(block: PrimaryDrawerItem.() -> Unit): PrimaryDrawerItem {\n    return PrimaryDrawerItem()\n        .apply {\n            isSelectable = false\n            isIconTinted = true\n        }\n        .apply(block)\n}\n\nprivate inline fun secondaryDrawerItem(block: SecondaryDrawerItem.() -> Unit): SecondaryDrawerItem {\n    return SecondaryDrawerItem()\n        .apply {\n            isSelectable = false\n            isIconTinted = true\n        }\n        .apply(block)\n}\n\nprivate var AbstractDrawerItem<*, *>.onClick: () -> Unit\n    get() = throw UnsupportedOperationException()\n    set(value) {\n        onDrawerItemClickListener = { _, _, _ ->\n            value()\n            false\n        }\n    }\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/MainViewModel.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky\n\nimport android.util.Log\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport at.connyduck.calladapter.networkresult.fold\nimport com.keylesspalace.tusky.appstore.AnnouncementReadEvent\nimport com.keylesspalace.tusky.appstore.ConversationsLoadingEvent\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.NewNotificationsEvent\nimport com.keylesspalace.tusky.appstore.NotificationsLoadingEvent\nimport com.keylesspalace.tusky.components.systemnotifications.NotificationService\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.ShareShortcutHelper\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.mapNotNull\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\n\n@HiltViewModel\nclass MainViewModel @Inject constructor(\n    private val api: MastodonApi,\n    private val eventHub: EventHub,\n    private val accountManager: AccountManager,\n    private val shareShortcutHelper: ShareShortcutHelper,\n    private val notificationService: NotificationService,\n) : ViewModel() {\n\n    private val activeAccount = accountManager.activeAccount!!\n\n    val accounts: StateFlow<List<AccountViewData>> = accountManager.accountsFlow\n        .map { accounts ->\n            accounts.map { account ->\n                AccountViewData(\n                    id = account.id,\n                    domain = account.domain,\n                    username = account.username,\n                    displayName = account.displayName,\n                    profilePictureUrl = account.profilePictureUrl,\n                    profileHeaderUrl = account.profileHeaderUrl,\n                    emojis = account.emojis\n                )\n            }\n        }\n        .stateIn(viewModelScope, SharingStarted.Lazily, emptyList())\n\n    val tabs: StateFlow<List<TabData>> = accountManager.activeAccount(viewModelScope)\n        .mapNotNull { account -> account?.tabPreferences }\n        .stateIn(viewModelScope, SharingStarted.Eagerly, activeAccount.tabPreferences)\n\n    private val _unreadAnnouncementsCount = MutableStateFlow(0)\n    val unreadAnnouncementsCount: StateFlow<Int> = _unreadAnnouncementsCount.asStateFlow()\n\n    val showDirectMessagesBadge: StateFlow<Boolean> = accountManager.activeAccount(viewModelScope)\n        .map { account -> account?.hasDirectMessageBadge == true }\n        .stateIn(viewModelScope, SharingStarted.Eagerly, false)\n\n    init {\n        loadAccountData()\n        fetchAnnouncements()\n        collectEvents()\n    }\n\n    private fun loadAccountData() {\n        viewModelScope.launch {\n            api.accountVerifyCredentials().fold(\n                { userInfo ->\n                    accountManager.updateAccount(activeAccount, userInfo)\n\n                    shareShortcutHelper.updateShortcuts()\n                },\n                { throwable ->\n                    Log.e(TAG, \"Failed to fetch user info.\", throwable)\n                }\n            )\n        }\n    }\n\n    private fun fetchAnnouncements() {\n        viewModelScope.launch {\n            api.announcements()\n                .fold(\n                    { announcements ->\n                        _unreadAnnouncementsCount.value = announcements.count { !it.read }\n                    },\n                    { throwable ->\n                        Log.w(TAG, \"Failed to fetch announcements.\", throwable)\n                    }\n                )\n        }\n    }\n\n    private fun collectEvents() {\n        viewModelScope.launch {\n            eventHub.events.collect { event ->\n                when (event) {\n                    is AnnouncementReadEvent -> {\n                        _unreadAnnouncementsCount.value--\n                    }\n                    is NewNotificationsEvent -> {\n                        if (event.accountId == activeAccount.accountId) {\n                            val hasDirectMessageNotification =\n                                event.notifications.any {\n                                    it.type == Notification.Type.Mention && it.status?.visibility == Status.Visibility.DIRECT\n                                }\n\n                            if (hasDirectMessageNotification) {\n                                accountManager.updateAccount(activeAccount) { copy(hasDirectMessageBadge = true) }\n                            }\n                        }\n                    }\n                    is NotificationsLoadingEvent -> {\n                        if (event.accountId == activeAccount.accountId) {\n                            accountManager.updateAccount(activeAccount) { copy(hasDirectMessageBadge = false) }\n                        }\n                    }\n                    is ConversationsLoadingEvent -> {\n                        if (event.accountId == activeAccount.accountId) {\n                            accountManager.updateAccount(activeAccount) { copy(hasDirectMessageBadge = false) }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    fun dismissDirectMessagesBadge() {\n        viewModelScope.launch {\n            accountManager.updateAccount(activeAccount) { copy(hasDirectMessageBadge = false) }\n        }\n    }\n\n    fun setupNotifications(activity: MainActivity) {\n        // TODO this is only called on full app (re) start; so changes in-between (push distributor uninstalled/subscription changed, or\n        //   notifications fully disabled) will get unnoticed; and also an app restart cannot be easily triggered by the user.\n\n        // TODO it's quite odd to separate channel creation (for an account) from the \"is enabled by channels\" question below\n        notificationService.createNotificationChannelsForAccount(activeAccount)\n\n        if (notificationService.areNotificationsEnabledBySystem()) {\n            viewModelScope.launch {\n                notificationService.setupNotifications(activity)\n            }\n        } else {\n            viewModelScope.launch {\n                notificationService.disableAllNotifications()\n            }\n        }\n    }\n\n    companion object {\n        private const val TAG = \"MainViewModel\"\n    }\n}\n\ndata class AccountViewData(\n    val id: Long,\n    val domain: String,\n    val username: String,\n    val displayName: String,\n    val profilePictureUrl: String,\n    val profileHeaderUrl: String,\n    val emojis: List<Emoji>\n) {\n    val fullName: String\n        get() = \"@$username@$domain\"\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/StatusListActivity.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <https://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.Menu\nimport android.view.MenuItem\nimport androidx.fragment.app.commit\nimport androidx.lifecycle.lifecycleScope\nimport at.connyduck.calladapter.networkresult.fold\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.FilterUpdatedEvent\nimport com.keylesspalace.tusky.components.filters.EditFilterActivity\nimport com.keylesspalace.tusky.components.filters.FilterExpiration\nimport com.keylesspalace.tusky.components.filters.FiltersActivity\nimport com.keylesspalace.tusky.components.timeline.TimelineFragment\nimport com.keylesspalace.tusky.components.timeline.viewmodel.TimelineViewModel.Kind\nimport com.keylesspalace.tusky.databinding.ActivityStatuslistBinding\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.entity.FilterV1\nimport com.keylesspalace.tusky.util.isHttpNotFound\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport com.keylesspalace.tusky.util.viewBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass StatusListActivity : BottomSheetActivity() {\n\n    @Inject\n    lateinit var eventHub: EventHub\n\n    private val binding: ActivityStatuslistBinding by viewBinding(\n        ActivityStatuslistBinding::inflate\n    )\n    private lateinit var kind: Kind\n    private var hashtag: String? = null\n    private var followTagItem: MenuItem? = null\n    private var unfollowTagItem: MenuItem? = null\n    private var muteTagItem: MenuItem? = null\n    private var unmuteTagItem: MenuItem? = null\n\n    /** The filter muting hashtag, null if unknown or hashtag is not filtered */\n    private var mutedFilterV1: FilterV1? = null\n    private var mutedFilter: Filter? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        Log.d(\"StatusListActivity\", \"onCreate\")\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n\n        setSupportActionBar(binding.includedToolbar.toolbar)\n\n        kind = Kind.valueOf(intent.getStringExtra(EXTRA_KIND)!!)\n        val listId = intent.getStringExtra(EXTRA_LIST_ID)\n        hashtag = intent.getStringExtra(EXTRA_HASHTAG)\n\n        val title = when (kind) {\n            Kind.FAVOURITES -> getString(R.string.title_favourites)\n            Kind.BOOKMARKS -> getString(R.string.title_bookmarks)\n            Kind.TAG -> getString(R.string.hashtag_format, hashtag)\n            Kind.PUBLIC_TRENDING_STATUSES -> getString(R.string.title_public_trending_statuses)\n            else -> intent.getStringExtra(EXTRA_LIST_TITLE)\n        }\n\n        supportActionBar?.run {\n            setTitle(title)\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n        }\n\n        if (supportFragmentManager.findFragmentById(R.id.fragmentContainer) == null) {\n            supportFragmentManager.commit {\n                val fragment = if (kind == Kind.TAG) {\n                    TimelineFragment.newHashtagInstance(listOf(hashtag!!))\n                } else {\n                    TimelineFragment.newInstance(kind, listId)\n                }\n                replace(R.id.fragmentContainer, fragment)\n            }\n        }\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu): Boolean {\n        val tag = hashtag\n        if (kind == Kind.TAG && tag != null) {\n            lifecycleScope.launch {\n                mastodonApi.tag(tag).fold(\n                    { tagEntity ->\n                        menuInflater.inflate(R.menu.view_hashtag_toolbar, menu)\n                        followTagItem = menu.findItem(R.id.action_follow_hashtag)\n                        unfollowTagItem = menu.findItem(R.id.action_unfollow_hashtag)\n                        muteTagItem = menu.findItem(R.id.action_mute_hashtag)\n                        unmuteTagItem = menu.findItem(R.id.action_unmute_hashtag)\n                        followTagItem?.isVisible = tagEntity.following == false\n                        unfollowTagItem?.isVisible = tagEntity.following == true\n                        followTagItem?.setOnMenuItemClickListener { followTag() }\n                        unfollowTagItem?.setOnMenuItemClickListener { unfollowTag() }\n                        muteTagItem?.setOnMenuItemClickListener { muteTag() }\n                        unmuteTagItem?.setOnMenuItemClickListener { unmuteTag() }\n                        updateMuteTagMenuItems()\n                    },\n                    {\n                        Log.w(TAG, \"Failed to query tag #$tag\", it)\n                    }\n                )\n            }\n        }\n\n        return super.onCreateOptionsMenu(menu)\n    }\n\n    private fun followTag(): Boolean {\n        val tag = hashtag\n        if (tag != null) {\n            lifecycleScope.launch {\n                mastodonApi.followTag(tag).fold(\n                    {\n                        followTagItem?.isVisible = false\n                        unfollowTagItem?.isVisible = true\n\n                        Snackbar.make(\n                            binding.root,\n                            getString(R.string.following_hashtag_success_format, tag),\n                            Snackbar.LENGTH_SHORT\n                        ).show()\n                    },\n                    {\n                        Snackbar.make(\n                            binding.root,\n                            getString(R.string.error_following_hashtag_format, tag),\n                            Snackbar.LENGTH_SHORT\n                        ).show()\n                        Log.e(TAG, \"Failed to follow #$tag\", it)\n                    }\n                )\n            }\n        }\n\n        return true\n    }\n\n    private fun unfollowTag(): Boolean {\n        val tag = hashtag\n        if (tag != null) {\n            lifecycleScope.launch {\n                mastodonApi.unfollowTag(tag).fold(\n                    {\n                        followTagItem?.isVisible = true\n                        unfollowTagItem?.isVisible = false\n\n                        Snackbar.make(\n                            binding.root,\n                            getString(R.string.unfollowing_hashtag_success_format, tag),\n                            Snackbar.LENGTH_SHORT\n                        ).show()\n                    },\n                    {\n                        Snackbar.make(\n                            binding.root,\n                            getString(R.string.error_unfollowing_hashtag_format, tag),\n                            Snackbar.LENGTH_SHORT\n                        ).show()\n                        Log.e(TAG, \"Failed to unfollow #$tag\", it)\n                    }\n                )\n            }\n        }\n\n        return true\n    }\n\n    /**\n     * Determine if the current hashtag is muted, and update the UI state accordingly.\n     */\n    private fun updateMuteTagMenuItems() {\n        val tag = hashtag ?: return\n        val hashedTag = \"#$tag\"\n\n        muteTagItem?.isVisible = true\n        muteTagItem?.isEnabled = false\n        unmuteTagItem?.isVisible = false\n\n        lifecycleScope.launch {\n            mastodonApi.getFilters().fold(\n                { filters ->\n                    mutedFilter = filters.firstOrNull { filter ->\n                        // TODO shouldn't this be an exact match (only one keyword; exactly the hashtag)?\n                        filter.context.contains(Filter.Kind.HOME) && filter.title == hashedTag\n                    }\n                    updateTagMuteState(mutedFilter != null)\n                },\n                { throwable ->\n                    if (throwable.isHttpNotFound()) {\n                        mastodonApi.getFiltersV1().fold(\n                            { filters ->\n                                mutedFilterV1 = filters.firstOrNull { filter ->\n                                    hashedTag == filter.phrase && filter.context.contains(Filter.Kind.HOME.kind)\n                                }\n                                updateTagMuteState(mutedFilterV1 != null)\n                            },\n                            { throwable2 ->\n                                Log.e(TAG, \"Error getting filters: $throwable2\")\n                            }\n                        )\n                    } else {\n                        Log.e(TAG, \"Error getting filters: $throwable\")\n                    }\n                }\n            )\n        }\n    }\n\n    private fun updateTagMuteState(muted: Boolean) {\n        if (muted) {\n            muteTagItem?.isVisible = false\n            muteTagItem?.isEnabled = false\n            unmuteTagItem?.isVisible = true\n        } else {\n            unmuteTagItem?.isVisible = false\n            muteTagItem?.isEnabled = true\n            muteTagItem?.isVisible = true\n        }\n    }\n\n    private fun muteTag(): Boolean {\n        val tag = hashtag ?: return true\n\n        lifecycleScope.launch {\n            var filterCreateSuccess = false\n            val hashedTag = \"#$tag\"\n\n            mastodonApi.createFilter(\n                title = \"#$tag\",\n                context = listOf(Filter.Kind.HOME),\n                filterAction = Filter.Action.WARN,\n                expiresIn = FilterExpiration.never\n            ).fold(\n                { filter ->\n                    if (mastodonApi.addFilterKeyword(\n                            filterId = filter.id,\n                            keyword = hashedTag,\n                            wholeWord = true\n                        ).isSuccess\n                    ) {\n                        // must be requested again; otherwise does not contain the keyword (but server does)\n                        mutedFilter = mastodonApi.getFilter(filter.id).getOrNull()\n\n                        eventHub.dispatch(FilterUpdatedEvent(filter.context))\n                        filterCreateSuccess = true\n                    } else {\n                        Snackbar.make(\n                            binding.root,\n                            getString(R.string.error_muting_hashtag_format, tag),\n                            Snackbar.LENGTH_SHORT\n                        ).show()\n                        Log.e(TAG, \"Failed to mute #$tag\")\n                    }\n                },\n                { throwable ->\n                    if (throwable.isHttpNotFound()) {\n                        mastodonApi.createFilterV1(\n                            hashedTag,\n                            listOf(Filter.Kind.HOME.kind),\n                            irreversible = false,\n                            wholeWord = true,\n                            expiresIn = FilterExpiration.never\n                        ).fold(\n                            { filter ->\n                                mutedFilterV1 = filter\n                                eventHub.dispatch(FilterUpdatedEvent(filter.context.map { Filter.Kind.valueOf(it) }))\n                                filterCreateSuccess = true\n                            },\n                            { throwable2 ->\n                                Snackbar.make(\n                                    binding.root,\n                                    getString(R.string.error_muting_hashtag_format, tag),\n                                    Snackbar.LENGTH_SHORT\n                                ).show()\n                                Log.e(TAG, \"Failed to mute #$tag\", throwable2)\n                            }\n                        )\n                    } else {\n                        Snackbar.make(\n                            binding.root,\n                            getString(R.string.error_muting_hashtag_format, tag),\n                            Snackbar.LENGTH_SHORT\n                        ).show()\n                        Log.e(TAG, \"Failed to mute #$tag\", throwable)\n                    }\n                }\n            )\n\n            if (filterCreateSuccess) {\n                updateTagMuteState(true)\n                Snackbar.make(\n                    binding.root,\n                    getString(R.string.muting_hashtag_success_format, tag),\n                    Snackbar.LENGTH_LONG\n                ).apply {\n                    setAction(R.string.action_view_filter) {\n                        val intent = if (mutedFilter != null) {\n                            Intent(this@StatusListActivity, EditFilterActivity::class.java).apply {\n                                putExtra(EditFilterActivity.FILTER_TO_EDIT, mutedFilter)\n                            }\n                        } else {\n                            Intent(this@StatusListActivity, FiltersActivity::class.java)\n                        }\n\n                        startActivityWithSlideInAnimation(intent)\n                    }\n                    show()\n                }\n            }\n        }\n\n        return true\n    }\n\n    private fun unmuteTag(): Boolean {\n        lifecycleScope.launch {\n            val tag = hashtag\n            val result = if (mutedFilter != null) {\n                val filter = mutedFilter!!\n                if (filter.context.size > 1) {\n                    // This filter exists in multiple contexts, just remove the home context\n                    mastodonApi.updateFilter(\n                        id = filter.id,\n                        context = filter.context.filterNot { it == Filter.Kind.HOME }\n                    )\n                } else {\n                    mastodonApi.deleteFilter(filter.id)\n                }\n            } else if (mutedFilterV1 != null) {\n                mutedFilterV1?.let { filter ->\n                    if (filter.context.size > 1) {\n                        // This filter exists in multiple contexts, just remove the home context\n                        mastodonApi.updateFilterV1(\n                            id = filter.id,\n                            phrase = filter.phrase,\n                            context = filter.context.filterNot { it == Filter.Kind.HOME.kind },\n                            irreversible = null,\n                            wholeWord = null,\n                            expiresIn = FilterExpiration.never\n                        )\n                    } else {\n                        mastodonApi.deleteFilterV1(filter.id)\n                    }\n                }\n            } else {\n                null\n            }\n\n            result?.fold(\n                {\n                    updateTagMuteState(false)\n                    eventHub.dispatch(FilterUpdatedEvent(listOf(Filter.Kind.HOME)))\n                    mutedFilterV1 = null\n                    mutedFilter = null\n\n                    Snackbar.make(\n                        binding.root,\n                        getString(R.string.unmuting_hashtag_success_format, tag),\n                        Snackbar.LENGTH_SHORT\n                    ).show()\n                },\n                { throwable ->\n                    Snackbar.make(\n                        binding.root,\n                        getString(R.string.error_unmuting_hashtag_format, tag),\n                        Snackbar.LENGTH_SHORT\n                    ).show()\n                    Log.e(TAG, \"Failed to unmute #$tag\", throwable)\n                }\n            )\n        }\n\n        return true\n    }\n\n    companion object {\n\n        private const val EXTRA_KIND = \"kind\"\n        private const val EXTRA_LIST_ID = \"id\"\n        private const val EXTRA_LIST_TITLE = \"title\"\n        private const val EXTRA_HASHTAG = \"tag\"\n        const val TAG = \"StatusListActivity\"\n\n        fun newFavouritesIntent(context: Context) =\n            Intent(context, StatusListActivity::class.java).apply {\n                putExtra(EXTRA_KIND, Kind.FAVOURITES.name)\n            }\n\n        fun newBookmarksIntent(context: Context) =\n            Intent(context, StatusListActivity::class.java).apply {\n                putExtra(EXTRA_KIND, Kind.BOOKMARKS.name)\n            }\n\n        fun newListIntent(context: Context, listId: String, listTitle: String) =\n            Intent(context, StatusListActivity::class.java).apply {\n                putExtra(EXTRA_KIND, Kind.LIST.name)\n                putExtra(EXTRA_LIST_ID, listId)\n                putExtra(EXTRA_LIST_TITLE, listTitle)\n            }\n\n        @JvmStatic\n        fun newHashtagIntent(context: Context, hashtag: String) =\n            Intent(context, StatusListActivity::class.java).apply {\n                putExtra(EXTRA_KIND, Kind.TAG.name)\n                putExtra(EXTRA_HASHTAG, hashtag)\n            }\n\n        fun newTrendingIntent(context: Context) =\n            Intent(context, StatusListActivity::class.java).apply {\n                putExtra(EXTRA_KIND, Kind.PUBLIC_TRENDING_STATUSES.name)\n            }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/TabData.kt",
    "content": "/* Copyright 2019 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky\n\nimport android.content.Context\nimport androidx.annotation.DrawableRes\nimport androidx.annotation.StringRes\nimport androidx.fragment.app.Fragment\nimport com.keylesspalace.tusky.components.conversation.ConversationsFragment\nimport com.keylesspalace.tusky.components.notifications.NotificationsFragment\nimport com.keylesspalace.tusky.components.timeline.TimelineFragment\nimport com.keylesspalace.tusky.components.timeline.viewmodel.TimelineViewModel\nimport com.keylesspalace.tusky.components.trending.TrendingTagsFragment\nimport java.util.Objects\n\n/** this would be a good case for a sealed class, but that does not work nice with Room */\n\nconst val HOME = \"Home\"\nconst val NOTIFICATIONS = \"Notifications\"\nconst val LOCAL = \"Local\"\nconst val FEDERATED = \"Federated\"\nconst val DIRECT = \"Direct\"\nconst val TRENDING_TAGS = \"TrendingTags\"\nconst val TRENDING_STATUSES = \"TrendingStatuses\"\nconst val HASHTAG = \"Hashtag\"\nconst val LIST = \"List\"\nconst val BOOKMARKS = \"Bookmarks\"\n\ndata class TabData(\n    val id: String,\n    @StringRes val text: Int,\n    @DrawableRes val icon: Int,\n    val fragment: (List<String>) -> Fragment,\n    val arguments: List<String> = emptyList(),\n    val title: (Context) -> String = { context -> context.getString(text) }\n) {\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (javaClass != other?.javaClass) return false\n\n        other as TabData\n\n        if (id != other.id) return false\n        return arguments == other.arguments\n    }\n\n    override fun hashCode() = Objects.hash(id, arguments)\n}\n\nfun List<TabData>.hasTab(id: String): Boolean = this.any { it.id == id }\n\nfun createTabDataFromId(id: String, arguments: List<String> = emptyList()): TabData {\n    return when (id) {\n        HOME -> TabData(\n            id = HOME,\n            text = R.string.title_home,\n            icon = R.drawable.tab_icon_home,\n            fragment = { TimelineFragment.newInstance(TimelineViewModel.Kind.HOME) }\n        )\n        NOTIFICATIONS -> TabData(\n            id = NOTIFICATIONS,\n            text = R.string.title_notifications,\n            icon = R.drawable.tab_icon_notifications,\n            fragment = { NotificationsFragment.newInstance() }\n        )\n        LOCAL -> TabData(\n            id = LOCAL,\n            text = R.string.title_public_local,\n            icon = R.drawable.tab_icon_local,\n            fragment = { TimelineFragment.newInstance(TimelineViewModel.Kind.PUBLIC_LOCAL) }\n        )\n        FEDERATED -> TabData(\n            id = FEDERATED,\n            text = R.string.title_public_federated,\n            icon = R.drawable.ic_public_24dp,\n            fragment = { TimelineFragment.newInstance(TimelineViewModel.Kind.PUBLIC_FEDERATED) }\n        )\n        DIRECT -> TabData(\n            id = DIRECT,\n            text = R.string.title_direct_messages,\n            icon = R.drawable.tab_icon_direct,\n            fragment = { ConversationsFragment.newInstance() }\n        )\n        TRENDING_TAGS -> TabData(\n            id = TRENDING_TAGS,\n            text = R.string.title_public_trending_hashtags,\n            icon = R.drawable.tab_icon_trending_tags,\n            fragment = { TrendingTagsFragment.newInstance() }\n        )\n        TRENDING_STATUSES -> TabData(\n            id = TRENDING_STATUSES,\n            text = R.string.title_public_trending_statuses,\n            icon = R.drawable.tab_icon_trending_posts,\n            fragment = {\n                TimelineFragment.newInstance(\n                    TimelineViewModel.Kind.PUBLIC_TRENDING_STATUSES\n                )\n            }\n        )\n        HASHTAG -> TabData(\n            id = HASHTAG,\n            text = R.string.hashtags,\n            icon = R.drawable.ic_tag_24dp,\n            fragment = { args -> TimelineFragment.newHashtagInstance(args) },\n            arguments = arguments,\n            title = { context ->\n                arguments.joinToString(separator = \" \") {\n                    context.getString(R.string.hashtag_format, it)\n                }\n            }\n        )\n        LIST -> TabData(\n            id = LIST,\n            text = R.string.list,\n            icon = R.drawable.tab_icon_list,\n            fragment = { args ->\n                TimelineFragment.newInstance(\n                    TimelineViewModel.Kind.LIST,\n                    args.getOrNull(0).orEmpty()\n                )\n            },\n            arguments = arguments,\n            title = { arguments.getOrNull(1).orEmpty() }\n        )\n        BOOKMARKS -> TabData(\n            id = BOOKMARKS,\n            text = R.string.title_bookmarks,\n            icon = R.drawable.tab_icon_bookmarks,\n            fragment = { TimelineFragment.newInstance(TimelineViewModel.Kind.BOOKMARKS) }\n        )\n        else -> throw IllegalArgumentException(\"unknown tab type\")\n    }\n}\n\nfun defaultTabs(): List<TabData> {\n    return listOf(\n        createTabDataFromId(HOME),\n        createTabDataFromId(NOTIFICATIONS),\n        createTabDataFromId(LOCAL),\n        createTabDataFromId(DIRECT)\n    )\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt",
    "content": "/* Copyright 2019 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky\n\nimport android.graphics.Color\nimport android.os.Bundle\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.activity.OnBackPressedCallback\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat.Type.systemBars\nimport androidx.core.view.updateLayoutParams\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.ItemTouchHelper\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.transition.TransitionManager\nimport com.google.android.material.transition.MaterialArcMotion\nimport com.google.android.material.transition.MaterialContainerTransform\nimport com.keylesspalace.tusky.adapter.ItemInteractionListener\nimport com.keylesspalace.tusky.adapter.TabAdapter\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.components.account.list.ListSelectionFragment\nimport com.keylesspalace.tusky.databinding.ActivityTabPreferenceBinding\nimport com.keylesspalace.tusky.entity.MastoList\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.ensureBottomPadding\nimport com.keylesspalace.tusky.util.unsafeLazy\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.util.visible\nimport com.keylesspalace.tusky.view.showHashtagPickerDialog\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass TabPreferenceActivity : BaseActivity(), ItemInteractionListener, ListSelectionFragment.ListSelectionListener {\n\n    @Inject\n    lateinit var mastodonApi: MastodonApi\n\n    @Inject\n    lateinit var eventHub: EventHub\n\n    private val binding by viewBinding(ActivityTabPreferenceBinding::inflate)\n\n    private lateinit var currentTabs: MutableList<TabData>\n    private lateinit var currentTabsAdapter: TabAdapter\n    private lateinit var touchHelper: ItemTouchHelper\n    private lateinit var addTabAdapter: TabAdapter\n\n    private val selectedItemElevation by unsafeLazy {\n        resources.getDimension(R.dimen.selected_drag_item_elevation)\n    }\n\n    private val onFabDismissedCallback = object : OnBackPressedCallback(false) {\n        override fun handleOnBackPressed() {\n            toggleFab(false)\n        }\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        setContentView(binding.root)\n\n        setSupportActionBar(binding.includedToolbar.toolbar)\n\n        supportActionBar?.apply {\n            setTitle(R.string.title_tab_preferences)\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n        }\n\n        binding.currentTabsRecyclerView.ensureBottomPadding(fab = true)\n        ViewCompat.setOnApplyWindowInsetsListener(binding.actionButton) { _, insets ->\n            val bottomInset = insets.getInsets(systemBars()).bottom\n            val actionButtonMargin = resources.getDimensionPixelSize(R.dimen.fabMargin)\n            binding.actionButton.updateLayoutParams<ViewGroup.MarginLayoutParams> {\n                bottomMargin = bottomInset + actionButtonMargin\n            }\n            binding.sheet.updateLayoutParams<ViewGroup.MarginLayoutParams> {\n                bottomMargin = bottomInset + actionButtonMargin\n            }\n            insets.inset(0, 0, 0, bottomInset)\n        }\n\n        currentTabs = accountManager.activeAccount?.tabPreferences.orEmpty().toMutableList()\n        currentTabsAdapter = TabAdapter(currentTabs, false, this, currentTabs.size <= MIN_TAB_COUNT)\n        binding.currentTabsRecyclerView.adapter = currentTabsAdapter\n        binding.currentTabsRecyclerView.layoutManager = LinearLayoutManager(this)\n        binding.currentTabsRecyclerView.addItemDecoration(\n            DividerItemDecoration(this, LinearLayoutManager.VERTICAL)\n        )\n\n        addTabAdapter = TabAdapter(listOf(createTabDataFromId(DIRECT)), true, this)\n        binding.addTabRecyclerView.adapter = addTabAdapter\n        binding.addTabRecyclerView.layoutManager = LinearLayoutManager(this)\n\n        touchHelper = ItemTouchHelper(object : ItemTouchHelper.Callback() {\n            override fun getMovementFlags(\n                recyclerView: RecyclerView,\n                viewHolder: RecyclerView.ViewHolder\n            ): Int {\n                return makeMovementFlags(ItemTouchHelper.UP or ItemTouchHelper.DOWN, ItemTouchHelper.END)\n            }\n\n            override fun isLongPressDragEnabled(): Boolean {\n                return true\n            }\n\n            override fun isItemViewSwipeEnabled(): Boolean {\n                return MIN_TAB_COUNT < currentTabs.size\n            }\n\n            override fun onMove(\n                recyclerView: RecyclerView,\n                viewHolder: RecyclerView.ViewHolder,\n                target: RecyclerView.ViewHolder\n            ): Boolean {\n                val temp = currentTabs[viewHolder.bindingAdapterPosition]\n                currentTabs[viewHolder.bindingAdapterPosition] = currentTabs[target.bindingAdapterPosition]\n                currentTabs[target.bindingAdapterPosition] = temp\n\n                currentTabsAdapter.notifyItemMoved(viewHolder.bindingAdapterPosition, target.bindingAdapterPosition)\n                saveTabs()\n                return true\n            }\n\n            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {\n                onTabRemoved(viewHolder.bindingAdapterPosition)\n            }\n\n            override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {\n                if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {\n                    viewHolder?.itemView?.elevation = selectedItemElevation\n                }\n            }\n\n            override fun clearView(\n                recyclerView: RecyclerView,\n                viewHolder: RecyclerView.ViewHolder\n            ) {\n                super.clearView(recyclerView, viewHolder)\n                viewHolder.itemView.elevation = 0f\n            }\n        })\n\n        touchHelper.attachToRecyclerView(binding.currentTabsRecyclerView)\n\n        binding.actionButton.setOnClickListener {\n            toggleFab(true)\n        }\n\n        binding.scrim.setOnClickListener {\n            toggleFab(false)\n        }\n\n        updateAvailableTabs()\n\n        onBackPressedDispatcher.addCallback(onFabDismissedCallback)\n    }\n\n    override fun onTabAdded(tab: TabData) {\n        toggleFab(false)\n\n        if (tab.id == HASHTAG) {\n            showAddHashtagDialog()\n            return\n        }\n\n        if (tab.id == LIST) {\n            showSelectListDialog()\n            return\n        }\n\n        currentTabs.add(tab)\n        currentTabsAdapter.notifyItemInserted(currentTabs.size - 1)\n        updateAvailableTabs()\n        saveTabs()\n    }\n\n    override fun onTabRemoved(position: Int) {\n        currentTabs.removeAt(position)\n        currentTabsAdapter.notifyItemRemoved(position)\n        updateAvailableTabs()\n        saveTabs()\n    }\n\n    override fun onActionChipClicked(tab: TabData, tabPosition: Int) {\n        showAddHashtagDialog(tab, tabPosition)\n    }\n\n    override fun onChipClicked(tab: TabData, tabPosition: Int, chipPosition: Int) {\n        val newArguments = tab.arguments.filterIndexed { i, _ -> i != chipPosition }\n        val newTab = tab.copy(arguments = newArguments)\n        currentTabs[tabPosition] = newTab\n        saveTabs()\n\n        currentTabsAdapter.notifyItemChanged(tabPosition)\n    }\n\n    private fun toggleFab(expand: Boolean) {\n        val transition = MaterialContainerTransform().apply {\n            startView = if (expand) binding.actionButton else binding.sheet\n            val endView: View = if (expand) binding.sheet else binding.actionButton\n            this.endView = endView\n            addTarget(endView)\n            scrimColor = Color.TRANSPARENT\n            setPathMotion(MaterialArcMotion())\n        }\n\n        TransitionManager.beginDelayedTransition(binding.root, transition)\n        binding.actionButton.visible(!expand)\n        binding.sheet.visible(expand)\n        binding.scrim.visible(expand)\n\n        onFabDismissedCallback.isEnabled = expand\n    }\n\n    private fun showAddHashtagDialog(tab: TabData? = null, tabPosition: Int = 0) {\n        showHashtagPickerDialog(mastodonApi, R.string.add_hashtag_title) { hashtag ->\n            if (tab == null) {\n                val newTab = createTabDataFromId(HASHTAG, listOf(hashtag))\n                currentTabs.add(newTab)\n                currentTabsAdapter.notifyItemInserted(currentTabs.size - 1)\n            } else {\n                val newTab = tab.copy(arguments = tab.arguments + hashtag)\n                currentTabs[tabPosition] = newTab\n\n                currentTabsAdapter.notifyItemChanged(tabPosition)\n            }\n\n            updateAvailableTabs()\n            saveTabs()\n        }\n    }\n\n    private var listSelectDialog: ListSelectionFragment? = null\n\n    private fun showSelectListDialog() {\n        listSelectDialog = ListSelectionFragment.newInstance(null)\n        listSelectDialog?.show(supportFragmentManager, null)\n\n        return\n    }\n\n    override fun onListSelected(list: MastoList) {\n        listSelectDialog?.dismiss()\n        listSelectDialog = null\n\n        val newTab = createTabDataFromId(LIST, listOf(list.id, list.title))\n        currentTabs.add(newTab)\n        currentTabsAdapter.notifyItemInserted(currentTabs.size - 1)\n        updateAvailableTabs()\n        saveTabs()\n    }\n\n    private fun updateAvailableTabs() {\n        val addableTabs: MutableList<TabData> = mutableListOf()\n\n        val homeTab = createTabDataFromId(HOME)\n        if (!currentTabs.contains(homeTab)) {\n            addableTabs.add(homeTab)\n        }\n        val notificationTab = createTabDataFromId(NOTIFICATIONS)\n        if (!currentTabs.contains(notificationTab)) {\n            addableTabs.add(notificationTab)\n        }\n        val localTab = createTabDataFromId(LOCAL)\n        if (!currentTabs.contains(localTab)) {\n            addableTabs.add(localTab)\n        }\n        val federatedTab = createTabDataFromId(FEDERATED)\n        if (!currentTabs.contains(federatedTab)) {\n            addableTabs.add(federatedTab)\n        }\n        val directMessagesTab = createTabDataFromId(DIRECT)\n        if (!currentTabs.contains(directMessagesTab)) {\n            addableTabs.add(directMessagesTab)\n        }\n        val trendingTagsTab = createTabDataFromId(TRENDING_TAGS)\n        if (!currentTabs.contains(trendingTagsTab)) {\n            addableTabs.add(trendingTagsTab)\n        }\n        val bookmarksTab = createTabDataFromId(BOOKMARKS)\n        if (!currentTabs.contains(bookmarksTab)) {\n            addableTabs.add(bookmarksTab)\n        }\n        val trendingStatusesTab = createTabDataFromId(TRENDING_STATUSES)\n        if (!currentTabs.contains(trendingStatusesTab)) {\n            addableTabs.add(trendingStatusesTab)\n        }\n\n        addableTabs.add(createTabDataFromId(HASHTAG))\n        addableTabs.add(createTabDataFromId(LIST))\n\n        addTabAdapter.updateData(addableTabs)\n        currentTabsAdapter.setRemoveButtonVisible(currentTabs.size > MIN_TAB_COUNT)\n    }\n\n    override fun onStartDelete(viewHolder: RecyclerView.ViewHolder) {\n        touchHelper.startSwipe(viewHolder)\n    }\n\n    override fun onStartDrag(viewHolder: RecyclerView.ViewHolder) {\n        touchHelper.startDrag(viewHolder)\n    }\n\n    private fun saveTabs() {\n        accountManager.activeAccount?.let {\n            lifecycleScope.launch {\n                accountManager.updateAccount(it) { copy(tabPreferences = currentTabs) }\n            }\n        }\n    }\n\n    companion object {\n        private const val MIN_TAB_COUNT = 2\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/TuskyApplication.kt",
    "content": "/* Copyright 2020 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky\n\nimport android.app.Application\nimport android.app.NotificationManager\nimport android.content.SharedPreferences\nimport android.os.Build\nimport android.util.Log\nimport androidx.core.content.edit\nimport androidx.hilt.work.HiltWorkerFactory\nimport androidx.work.Configuration\nimport androidx.work.Constraints\nimport androidx.work.ExistingPeriodicWorkPolicy\nimport androidx.work.PeriodicWorkRequestBuilder\nimport androidx.work.WorkManager\nimport com.keylesspalace.tusky.settings.AppTheme\nimport com.keylesspalace.tusky.settings.NEW_INSTALL_SCHEMA_VERSION\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.settings.PrefKeys.APP_THEME\nimport com.keylesspalace.tusky.settings.SCHEMA_VERSION\nimport com.keylesspalace.tusky.util.LocaleManager\nimport com.keylesspalace.tusky.util.setAppNightMode\nimport com.keylesspalace.tusky.worker.PruneCacheWorker\nimport dagger.hilt.android.HiltAndroidApp\nimport de.c1710.filemojicompat_defaults.DefaultEmojiPackList\nimport de.c1710.filemojicompat_ui.helpers.EmojiPackHelper\nimport de.c1710.filemojicompat_ui.helpers.EmojiPreference\nimport java.security.Security\nimport java.util.concurrent.TimeUnit\nimport javax.inject.Inject\nimport org.conscrypt.Conscrypt\n\n@HiltAndroidApp\nclass TuskyApplication : Application(), Configuration.Provider {\n\n    @Inject\n    lateinit var workerFactory: HiltWorkerFactory\n\n    @Inject\n    lateinit var localeManager: LocaleManager\n\n    @Inject\n    lateinit var preferences: SharedPreferences\n\n    @Inject\n    lateinit var notificationManager: NotificationManager\n\n    override fun onCreate() {\n        // Uncomment me to get StrictMode violation logs\n//        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {\n//            StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder()\n//                    .detectDiskReads()\n//                    .detectDiskWrites()\n//                    .detectNetwork()\n//                    .detectUnbufferedIo()\n//                    .penaltyLog()\n//                    .build())\n//        }\n        super.onCreate()\n\n        Security.insertProviderAt(Conscrypt.newProvider(), 1)\n\n        val workManager = WorkManager.getInstance(this)\n\n        // Migrate shared preference keys and defaults from version to version.\n        val oldVersion = preferences.getInt(\n            PrefKeys.SCHEMA_VERSION,\n            NEW_INSTALL_SCHEMA_VERSION\n        )\n        if (oldVersion != SCHEMA_VERSION) {\n            if (oldVersion < 2025021701) {\n                // A new periodic work request is enqueued by unique name (and not tag anymore): stop the old one\n                workManager.cancelAllWorkByTag(\"pullNotifications\")\n            }\n            if (oldVersion < 2025032401 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n                // delete old now unused notification channels\n                for (channel in notificationManager.notificationChannels) {\n                    if (channel.id.startsWith(\"CHANNEL_SIGN_UP\") || channel.id.startsWith(\"CHANNEL_REPORT\") || channel.id.startsWith(\"CHANNEL_BOOST\")) {\n                        notificationManager.deleteNotificationChannel(channel.id)\n                    }\n                }\n            }\n\n            upgradeSharedPreferences(oldVersion, SCHEMA_VERSION)\n        }\n\n        // In this case, we want to have the emoji preferences merged with the other ones\n        // Copied from PreferenceManager.getDefaultSharedPreferenceName\n        EmojiPreference.sharedPreferenceName = packageName + \"_preferences\"\n        EmojiPackHelper.init(this, DefaultEmojiPackList.get(this), allowPackImports = false)\n\n        // init night mode\n        val theme = preferences.getString(APP_THEME, AppTheme.DEFAULT.value)\n        setAppNightMode(theme)\n\n        localeManager.setLocale()\n\n        // Prune the database every ~ 12 hours when the device is idle.\n        val pruneCacheWorker = PeriodicWorkRequestBuilder<PruneCacheWorker>(12, TimeUnit.HOURS)\n            .setConstraints(Constraints.Builder().setRequiresDeviceIdle(true).build())\n            .build()\n        workManager.enqueueUniquePeriodicWork(\n            PruneCacheWorker.PERIODIC_WORK_TAG,\n            ExistingPeriodicWorkPolicy.KEEP,\n            pruneCacheWorker\n        )\n    }\n\n    override val workManagerConfiguration: Configuration\n        get() = Configuration.Builder()\n            .setWorkerFactory(workerFactory)\n            .build()\n\n    private fun upgradeSharedPreferences(oldVersion: Int, newVersion: Int) {\n        Log.d(TAG, \"Upgrading shared preferences: $oldVersion -> $newVersion\")\n        preferences.edit {\n            if (oldVersion < 2023022701) {\n                // These preferences are (now) handled in AccountPreferenceHandler. Remove them from shared for clarity.\n\n                remove(PrefKeys.ALWAYS_OPEN_SPOILER)\n                remove(PrefKeys.ALWAYS_SHOW_SENSITIVE_MEDIA)\n                remove(PrefKeys.MEDIA_PREVIEW_ENABLED)\n            }\n\n            if (oldVersion != NEW_INSTALL_SCHEMA_VERSION && oldVersion < 2023082301) {\n                // Default value for appTheme is now THEME_SYSTEM. If the user is upgrading and\n                // didn't have an explicit preference set use the previous default, so the\n                // theme does not unexpectedly change.\n                if (!preferences.contains(APP_THEME)) {\n                    putString(APP_THEME, AppTheme.NIGHT.value)\n                }\n            }\n\n            if (oldVersion < 2023112001) {\n                remove(PrefKeys.TAB_FILTER_HOME_REPLIES)\n                remove(PrefKeys.TAB_FILTER_HOME_BOOSTS)\n                remove(PrefKeys.TAB_SHOW_HOME_SELF_BOOSTS)\n            }\n\n            if (oldVersion < 2024060201) {\n                remove(PrefKeys.Deprecated.FAB_HIDE)\n            }\n\n            putInt(PrefKeys.SCHEMA_VERSION, newVersion)\n        }\n    }\n\n    companion object {\n        private const val TAG = \"TuskyApplication\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/ViewMediaActivity.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky\n\nimport android.Manifest\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport android.app.DownloadManager\nimport android.content.Context\nimport android.content.Intent\nimport android.graphics.Bitmap\nimport android.graphics.Color\nimport android.net.Uri\nimport android.os.Build\nimport android.os.Bundle\nimport android.os.Environment\nimport android.transition.Transition\nimport android.util.Log\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.WindowManager\nimport android.webkit.MimeTypeMap\nimport android.widget.Toast\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.core.app.ShareCompat\nimport androidx.core.content.FileProvider\nimport androidx.core.net.toUri\nimport androidx.fragment.app.FragmentActivity\nimport androidx.lifecycle.lifecycleScope\nimport androidx.viewpager2.adapter.FragmentStateAdapter\nimport androidx.viewpager2.widget.ViewPager2\nimport com.bumptech.glide.Glide\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.BuildConfig.APPLICATION_ID\nimport com.keylesspalace.tusky.components.viewthread.ViewThreadActivity\nimport com.keylesspalace.tusky.databinding.ActivityViewMediaBinding\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.fragment.ViewImageFragment\nimport com.keylesspalace.tusky.fragment.ViewVideoFragment\nimport com.keylesspalace.tusky.pager.ImagePagerAdapter\nimport com.keylesspalace.tusky.pager.SingleImagePagerAdapter\nimport com.keylesspalace.tusky.util.copyToClipboard\nimport com.keylesspalace.tusky.util.getParcelableArrayListExtraCompat\nimport com.keylesspalace.tusky.util.getTemporaryMediaFilename\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport com.keylesspalace.tusky.util.submitAsync\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.viewdata.AttachmentViewData\nimport dagger.hilt.android.AndroidEntryPoint\nimport java.io.File\nimport java.io.FileOutputStream\nimport java.io.IOException\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.launch\n\ntypealias ToolbarVisibilityListener = (isVisible: Boolean) -> Unit\n\n@AndroidEntryPoint\nclass ViewMediaActivity :\n    BaseActivity(),\n    ViewImageFragment.PhotoActionsListener,\n    ViewVideoFragment.VideoActionsListener {\n\n    private val binding by viewBinding(ActivityViewMediaBinding::inflate)\n\n    var isToolbarVisible = true\n        private set\n\n    private var attachments: ArrayList<AttachmentViewData>? = null\n    private val toolbarVisibilityListeners = mutableListOf<ToolbarVisibilityListener>()\n    private var imageUrl: String? = null\n\n    private val requestDownloadMediaPermissionLauncher =\n        registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->\n            if (isGranted) {\n                downloadMedia()\n            } else {\n                Snackbar.make(binding.toolbar, getString(R.string.error_media_download_permission), Snackbar.LENGTH_SHORT)\n                    .setAction(R.string.action_retry) { requestDownloadMedia() }\n                    .show()\n            }\n        }\n\n    fun addToolbarVisibilityListener(listener: ToolbarVisibilityListener): Function0<Boolean> {\n        this.toolbarVisibilityListeners.add(listener)\n        listener(isToolbarVisible)\n        return { toolbarVisibilityListeners.remove(listener) }\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n\n        supportPostponeEnterTransition()\n\n        // Gather the parameters.\n        attachments = intent.getParcelableArrayListExtraCompat(EXTRA_ATTACHMENTS)\n        val initialPosition = intent.getIntExtra(EXTRA_ATTACHMENT_INDEX, 0)\n\n        val adapter: ViewMediaAdapter = if (attachments != null) {\n            val realAttachs = attachments!!.map(AttachmentViewData::attachment)\n            // Setup the view pager.\n            ImagePagerAdapter(this, realAttachs, initialPosition)\n        } else {\n            imageUrl = intent.getStringExtra(EXTRA_SINGLE_IMAGE_URL)\n                ?: throw IllegalArgumentException(\"attachment list or image url has to be set\")\n\n            SingleImagePagerAdapter(this, imageUrl!!)\n        }\n\n        binding.viewPager.adapter = adapter\n        binding.viewPager.setCurrentItem(initialPosition, false)\n        binding.viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {\n            override fun onPageSelected(position: Int) {\n                binding.toolbar.title = getPageTitle(position)\n                adjustScreenWakefulness()\n            }\n        })\n\n        // Setup the toolbar.\n        setSupportActionBar(binding.toolbar)\n        supportActionBar?.run {\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n            title = getPageTitle(initialPosition)\n        }\n        binding.toolbar.setNavigationOnClickListener { supportFinishAfterTransition() }\n        binding.toolbar.setOnMenuItemClickListener { item: MenuItem ->\n            when (item.itemId) {\n                R.id.action_download -> requestDownloadMedia()\n                R.id.action_open_status -> onOpenStatus()\n                R.id.action_share_media -> shareMedia()\n                R.id.action_copy_media_link -> copyLink()\n            }\n            true\n        }\n\n        // yes it is deprecated, but it looks cool so it stays for now\n        window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LOW_PROFILE\n\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.VANILLA_ICE_CREAM) {\n            @Suppress(\"DEPRECATION\")\n            window.statusBarColor = Color.BLACK\n        }\n        window.sharedElementEnterTransition.addListener(object : NoopTransitionListener {\n            override fun onTransitionEnd(transition: Transition) {\n                adapter.onTransitionEnd(binding.viewPager.currentItem)\n                window.sharedElementEnterTransition.removeListener(this)\n            }\n        })\n\n        adjustScreenWakefulness()\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu): Boolean {\n        menuInflater.inflate(R.menu.view_media_toolbar, menu)\n        // We don't support 'open status' from single image views\n        menu.findItem(R.id.action_open_status)?.isVisible = (attachments != null)\n        return true\n    }\n\n    override fun onPrepareOptionsMenu(menu: Menu?): Boolean {\n        menu?.findItem(R.id.action_share_media)?.isEnabled = !isCreating\n        return true\n    }\n\n    override fun onBringUp() {\n        supportStartPostponedEnterTransition()\n    }\n\n    override fun onDismiss() {\n        supportFinishAfterTransition()\n    }\n\n    override fun onPhotoTap() {\n        isToolbarVisible = !isToolbarVisible\n        for (listener in toolbarVisibilityListeners) {\n            listener(isToolbarVisible)\n        }\n\n        val visibility = if (isToolbarVisible) View.VISIBLE else View.INVISIBLE\n        val alpha = if (isToolbarVisible) 1.0f else 0.0f\n        if (isToolbarVisible) {\n            // If to be visible, need to make visible immediately and animate alpha\n            binding.appBarLayout.alpha = 0.0f\n            binding.appBarLayout.visibility = visibility\n        }\n\n        binding.appBarLayout.animate().alpha(alpha)\n            .setListener(object : AnimatorListenerAdapter() {\n                override fun onAnimationEnd(animation: Animator) {\n                    binding.appBarLayout.visibility = visibility\n                    animation.removeListener(this)\n                }\n            })\n            .start()\n    }\n\n    private fun getPageTitle(position: Int): CharSequence {\n        if (attachments == null) {\n            return \"\"\n        }\n        return \"${position + 1}/${attachments?.size}\"\n    }\n\n    private fun downloadMedia() {\n        val url = imageUrl ?: attachments!![binding.viewPager.currentItem].attachment.url\n        val filename = url.toUri().lastPathSegment\n        Toast.makeText(\n            applicationContext,\n            resources.getString(R.string.download_image, filename),\n            Toast.LENGTH_SHORT\n        ).show()\n\n        val downloadManager = getSystemService(DOWNLOAD_SERVICE) as DownloadManager\n        val request = DownloadManager.Request(url.toUri())\n        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename)\n        downloadManager.enqueue(request)\n    }\n\n    private fun requestDownloadMedia() {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {\n            requestDownloadMediaPermissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)\n        } else {\n            downloadMedia()\n        }\n    }\n\n    private fun onOpenStatus() {\n        val attach = attachments!![binding.viewPager.currentItem]\n        startActivityWithSlideInAnimation(\n            ViewThreadActivity.startIntent(this, attach.statusId, attach.statusUrl)\n        )\n    }\n\n    private fun copyLink() {\n        copyToClipboard(\n            imageUrl ?: attachments!![binding.viewPager.currentItem].attachment.url,\n            getString(R.string.url_copied),\n        )\n    }\n\n    private fun shareMedia() {\n        val directory = applicationContext.getExternalFilesDir(\"Tusky\")\n        if (directory == null || !(directory.exists())) {\n            Log.e(TAG, \"Error obtaining directory to save temporary media.\")\n            return\n        }\n\n        if (imageUrl != null) {\n            shareImage(directory, imageUrl!!)\n        } else {\n            val attachment = attachments!![binding.viewPager.currentItem].attachment\n            when (attachment.type) {\n                Attachment.Type.IMAGE -> shareImage(directory, attachment.url)\n                Attachment.Type.AUDIO,\n                Attachment.Type.VIDEO,\n                Attachment.Type.GIFV -> shareMediaFile(directory, attachment.url)\n                else -> Log.e(TAG, \"Unknown media format for sharing.\")\n            }\n        }\n    }\n\n    private fun shareFile(file: File, mimeType: String?) {\n        ShareCompat.IntentBuilder(this)\n            .setType(mimeType)\n            .addStream(\n                FileProvider.getUriForFile(applicationContext, \"$APPLICATION_ID.fileprovider\", file)\n            )\n            .setChooserTitle(R.string.send_media_to)\n            .startChooser()\n    }\n\n    private var isCreating: Boolean = false\n\n    private fun shareImage(directory: File, url: String) {\n        isCreating = true\n        binding.progressBarShare.visibility = View.VISIBLE\n        invalidateOptionsMenu()\n\n        lifecycleScope.launch {\n            val file = File(directory, getTemporaryMediaFilename(\"png\"))\n            val result = try {\n                val bitmap =\n                    Glide.with(applicationContext).asBitmap().load(url.toUri()).submitAsync()\n                try {\n                    FileOutputStream(file).use { stream ->\n                        bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream)\n                    }\n                    true\n                } catch (ioe: IOException) {\n                    // FileNotFoundException is covered by IOException\n                    Log.e(TAG, \"Error writing temporary media.\")\n                    false\n                }.also { result -> Log.d(TAG, \"Download image result: $result\") }\n            } catch (error: Throwable) {\n                if (error is CancellationException) {\n                    throw error\n                }\n                Log.e(TAG, \"Failed to download image\", error)\n                false\n            }\n\n            isCreating = false\n            invalidateOptionsMenu()\n            binding.progressBarShare.visibility = View.GONE\n            if (result) {\n                shareFile(file, \"image/png\")\n            }\n        }\n    }\n\n    private fun shareMediaFile(directory: File, url: String) {\n        val uri = url.toUri()\n        val mimeTypeMap = MimeTypeMap.getSingleton()\n        val extension = MimeTypeMap.getFileExtensionFromUrl(url)\n        val mimeType = mimeTypeMap.getMimeTypeFromExtension(extension)\n        val filename = getTemporaryMediaFilename(extension)\n        val file = File(directory, filename)\n\n        val downloadManager = getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager\n        val request = DownloadManager.Request(uri)\n        request.setDestinationUri(Uri.fromFile(file))\n        request.setVisibleInDownloadsUi(false)\n        downloadManager.enqueue(request)\n\n        shareFile(file, mimeType)\n    }\n\n    // Prevent this activity from dimming or sleeping the screen if, and only if, it is playing video or audio\n    private fun adjustScreenWakefulness() {\n        attachments?.run {\n            if (get(binding.viewPager.currentItem).attachment.type == Attachment.Type.IMAGE) {\n                window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)\n            } else {\n                window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)\n            }\n        }\n    }\n\n    companion object {\n        private const val EXTRA_ATTACHMENTS = \"attachments\"\n        private const val EXTRA_ATTACHMENT_INDEX = \"index\"\n        private const val EXTRA_SINGLE_IMAGE_URL = \"single_image\"\n        private const val TAG = \"ViewMediaActivity\"\n\n        @JvmStatic\n        fun newIntent(\n            context: Context,\n            attachments: List<AttachmentViewData>,\n            index: Int\n        ): Intent {\n            val intent = Intent(context, ViewMediaActivity::class.java)\n            intent.putParcelableArrayListExtra(EXTRA_ATTACHMENTS, ArrayList(attachments))\n            intent.putExtra(EXTRA_ATTACHMENT_INDEX, index)\n            return intent\n        }\n\n        @JvmStatic\n        fun newSingleImageIntent(context: Context, url: String): Intent {\n            val intent = Intent(context, ViewMediaActivity::class.java)\n            intent.putExtra(EXTRA_SINGLE_IMAGE_URL, url)\n            return intent\n        }\n    }\n}\n\nabstract class ViewMediaAdapter(activity: FragmentActivity) : FragmentStateAdapter(activity) {\n    abstract fun onTransitionEnd(position: Int)\n}\n\ninterface NoopTransitionListener : Transition.TransitionListener {\n    override fun onTransitionEnd(transition: Transition) {\n    }\n\n    override fun onTransitionResume(transition: Transition) {\n    }\n\n    override fun onTransitionPause(transition: Transition) {\n    }\n\n    override fun onTransitionCancel(transition: Transition) {\n    }\n\n    override fun onTransitionStart(transition: Transition) {\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/adapter/AccountFieldEditAdapter.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.adapter\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.core.widget.doAfterTextChanged\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.databinding.ItemEditFieldBinding\nimport com.keylesspalace.tusky.entity.StringField\nimport com.keylesspalace.tusky.util.BindingHolder\nimport com.keylesspalace.tusky.util.fixTextSelection\n\nclass AccountFieldEditAdapter(\n    var onFieldsChanged: () -> Unit = { }\n) : RecyclerView.Adapter<BindingHolder<ItemEditFieldBinding>>() {\n\n    private val fieldData = mutableListOf<MutableStringPair>()\n    private var maxNameLength: Int? = null\n    private var maxValueLength: Int? = null\n\n    fun setFields(fields: List<StringField>) {\n        fieldData.clear()\n\n        fields.forEach { field ->\n            fieldData.add(MutableStringPair(field.name, field.value))\n        }\n        if (fieldData.isEmpty()) {\n            fieldData.add(MutableStringPair(\"\", \"\"))\n        }\n\n        notifyDataSetChanged()\n    }\n\n    fun setFieldLimits(maxNameLength: Int?, maxValueLength: Int?) {\n        this.maxNameLength = maxNameLength\n        this.maxValueLength = maxValueLength\n        notifyDataSetChanged()\n    }\n\n    fun getFieldData(): List<StringField> {\n        return fieldData.map {\n            StringField(it.first, it.second)\n        }\n    }\n\n    fun addField() {\n        fieldData.add(MutableStringPair(\"\", \"\"))\n        notifyItemInserted(fieldData.size - 1)\n    }\n\n    override fun getItemCount() = fieldData.size\n\n    override fun onCreateViewHolder(\n        parent: ViewGroup,\n        viewType: Int\n    ): BindingHolder<ItemEditFieldBinding> {\n        val binding = ItemEditFieldBinding.inflate(\n            LayoutInflater.from(parent.context),\n            parent,\n            false\n        )\n        return BindingHolder(binding)\n    }\n\n    override fun onBindViewHolder(holder: BindingHolder<ItemEditFieldBinding>, position: Int) {\n        holder.binding.accountFieldNameText.setText(fieldData[position].first)\n        holder.binding.accountFieldValueText.setText(fieldData[position].second)\n\n        holder.binding.accountFieldNameTextLayout.isCounterEnabled = maxNameLength != null\n        maxNameLength?.let {\n            holder.binding.accountFieldNameTextLayout.counterMaxLength = it\n        }\n\n        holder.binding.accountFieldValueTextLayout.isCounterEnabled = maxValueLength != null\n        maxValueLength?.let {\n            holder.binding.accountFieldValueTextLayout.counterMaxLength = it\n        }\n\n        holder.binding.accountFieldNameText.doAfterTextChanged { newText ->\n            fieldData.getOrNull(holder.bindingAdapterPosition)?.first = newText.toString()\n            onFieldsChanged()\n        }\n\n        holder.binding.accountFieldValueText.doAfterTextChanged { newText ->\n            fieldData.getOrNull(holder.bindingAdapterPosition)?.second = newText.toString()\n            onFieldsChanged()\n        }\n\n        // Ensure the textview contents are selectable\n        holder.binding.accountFieldNameText.fixTextSelection()\n        holder.binding.accountFieldValueText.fixTextSelection()\n    }\n\n    class MutableStringPair(var first: String, var second: String)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/adapter/AccountSelectionAdapter.kt",
    "content": "/* Copyright 2019 Levi Bard\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.adapter\n\nimport android.content.Context\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.ArrayAdapter\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemAutocompleteAccountBinding\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.util.emojify\nimport com.keylesspalace.tusky.util.loadAvatar\n\nclass AccountSelectionAdapter(\n    context: Context,\n    private val animateAvatars: Boolean,\n    private val animateEmojis: Boolean\n) : ArrayAdapter<AccountEntity>(\n    context,\n    R.layout.item_autocomplete_account\n) {\n\n    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {\n        val binding = if (convertView == null) {\n            ItemAutocompleteAccountBinding.inflate(LayoutInflater.from(context), parent, false)\n        } else {\n            ItemAutocompleteAccountBinding.bind(convertView)\n        }\n\n        val account = getItem(position)\n        if (account != null) {\n            binding.username.text = account.fullName\n            binding.displayName.text = account.displayName.emojify(account.emojis, binding.displayName, animateEmojis)\n            binding.avatarBadge.visibility = View.GONE // We never want to display the bot badge here\n\n            val avatarRadius = context.resources.getDimensionPixelSize(R.dimen.avatar_radius_42dp)\n\n            loadAvatar(account.profilePictureUrl, binding.avatar, avatarRadius, animateAvatars)\n        }\n\n        return binding.root\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/adapter/AccountViewHolder.kt",
    "content": "package com.keylesspalace.tusky.adapter\n\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemAccountBinding\nimport com.keylesspalace.tusky.entity.TimelineAccount\nimport com.keylesspalace.tusky.interfaces.AccountActionListener\nimport com.keylesspalace.tusky.interfaces.LinkListener\nimport com.keylesspalace.tusky.util.emojify\nimport com.keylesspalace.tusky.util.loadAvatar\nimport com.keylesspalace.tusky.util.visible\n\nclass AccountViewHolder(\n    private val binding: ItemAccountBinding\n) : RecyclerView.ViewHolder(binding.root) {\n    private lateinit var accountId: String\n\n    fun setupWithAccount(\n        account: TimelineAccount,\n        animateAvatar: Boolean,\n        animateEmojis: Boolean,\n        showBotOverlay: Boolean\n    ) {\n        accountId = account.id\n\n        binding.accountUsername.text = binding.accountUsername.context.getString(\n            R.string.post_username_format,\n            account.username\n        )\n\n        val emojifiedName = account.name.emojify(\n            account.emojis,\n            binding.accountDisplayName,\n            animateEmojis\n        )\n        binding.accountDisplayName.text = emojifiedName\n\n        val avatarRadius = binding.accountAvatar.context.resources\n            .getDimensionPixelSize(R.dimen.avatar_radius_48dp)\n        loadAvatar(account.avatar, binding.accountAvatar, avatarRadius, animateAvatar)\n\n        binding.accountBotBadge.visible(showBotOverlay && account.bot)\n    }\n\n    fun setupActionListener(listener: AccountActionListener) {\n        itemView.setOnClickListener { listener.onViewAccount(accountId) }\n    }\n\n    fun setupLinkListener(listener: LinkListener) {\n        itemView.setOnClickListener {\n            listener.onViewAccount(\n                accountId\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/adapter/EmojiAdapter.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.adapter\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.appcompat.widget.TooltipCompat\nimport androidx.recyclerview.widget.RecyclerView\nimport com.bumptech.glide.Glide\nimport com.keylesspalace.tusky.databinding.ItemEmojiButtonBinding\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.util.BindingHolder\nimport java.util.Locale\n\nclass EmojiAdapter(\n    emojiList: List<Emoji>,\n    private val onEmojiSelectedListener: OnEmojiSelectedListener,\n    private val animate: Boolean\n) : RecyclerView.Adapter<BindingHolder<ItemEmojiButtonBinding>>() {\n\n    private val emojiList: List<Emoji> = emojiList.filter { emoji -> emoji.visibleInPicker }\n        .sortedBy { it.shortcode.lowercase(Locale.ROOT) }\n        .sortedBy { it.category?.lowercase(Locale.ROOT) ?: \"\" }\n\n    override fun getItemCount() = emojiList.size\n\n    override fun onCreateViewHolder(\n        parent: ViewGroup,\n        viewType: Int\n    ): BindingHolder<ItemEmojiButtonBinding> {\n        val binding = ItemEmojiButtonBinding.inflate(\n            LayoutInflater.from(parent.context),\n            parent,\n            false\n        )\n        return BindingHolder(binding)\n    }\n\n    override fun onBindViewHolder(holder: BindingHolder<ItemEmojiButtonBinding>, position: Int) {\n        val emoji = emojiList[position]\n        val emojiImageView = holder.binding.root\n\n        if (animate) {\n            Glide.with(emojiImageView)\n                .load(emoji.url)\n                .into(emojiImageView)\n        } else {\n            Glide.with(emojiImageView)\n                .asBitmap()\n                .load(emoji.url)\n                .into(emojiImageView)\n        }\n\n        emojiImageView.setOnClickListener {\n            onEmojiSelectedListener.onEmojiSelected(emoji.shortcode)\n        }\n\n        emojiImageView.contentDescription = emoji.shortcode\n        TooltipCompat.setTooltipText(emojiImageView, emoji.shortcode)\n    }\n}\n\ninterface OnEmojiSelectedListener {\n    fun onEmojiSelected(shortcode: String)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/adapter/FilteredStatusViewHolder.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\npackage com.keylesspalace.tusky.adapter\n\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.notifications.NotificationsViewHolder\nimport com.keylesspalace.tusky.databinding.ItemStatusFilteredBinding\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.entity.FilterResult\nimport com.keylesspalace.tusky.interfaces.StatusActionListener\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.viewdata.NotificationViewData\nimport com.keylesspalace.tusky.viewdata.StatusViewData\n\nclass FilteredStatusViewHolder(\n    private val binding: ItemStatusFilteredBinding,\n    listener: StatusActionListener\n) : NotificationsViewHolder, RecyclerView.ViewHolder(binding.root) {\n\n    init {\n        binding.statusFilterShowAnyway.setOnClickListener {\n            listener.clearWarningAction(bindingAdapterPosition)\n        }\n    }\n\n    override fun bind(\n        viewData: NotificationViewData.Concrete,\n        payloads: List<*>,\n        statusDisplayOptions: StatusDisplayOptions\n    ) {\n        if (payloads.isEmpty()) {\n            bind(viewData.statusViewData!!)\n        }\n    }\n\n    fun bind(viewData: StatusViewData.Concrete) {\n        val matchedFilterResult: FilterResult? = viewData.actionable.filtered.orEmpty().find { filterResult ->\n            filterResult.filter.action == Filter.Action.WARN\n        }\n\n        val matchedFilterTitle = matchedFilterResult?.filter?.title.orEmpty()\n\n        binding.statusFilterLabel.text = itemView.context.getString(\n            R.string.status_filter_placeholder_label_format,\n            matchedFilterTitle\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/adapter/FollowRequestViewHolder.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.adapter\n\nimport android.graphics.Typeface\nimport android.text.SpannableString\nimport android.text.Spanned\nimport android.text.style.StyleSpan\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.notifications.NotificationsViewHolder\nimport com.keylesspalace.tusky.databinding.ItemFollowRequestBinding\nimport com.keylesspalace.tusky.entity.TimelineAccount\nimport com.keylesspalace.tusky.interfaces.AccountActionListener\nimport com.keylesspalace.tusky.interfaces.LinkListener\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.util.emojify\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.loadAvatar\nimport com.keylesspalace.tusky.util.parseAsMastodonHtml\nimport com.keylesspalace.tusky.util.setClickableText\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.unicodeWrap\nimport com.keylesspalace.tusky.util.visible\nimport com.keylesspalace.tusky.viewdata.NotificationViewData\n\nclass FollowRequestViewHolder(\n    private val binding: ItemFollowRequestBinding,\n    private val accountListener: AccountActionListener,\n    private val linkListener: LinkListener,\n    private val showHeader: Boolean\n) : RecyclerView.ViewHolder(binding.root), NotificationsViewHolder {\n\n    override fun bind(\n        viewData: NotificationViewData.Concrete,\n        payloads: List<*>,\n        statusDisplayOptions: StatusDisplayOptions\n    ) {\n        if (payloads.isNotEmpty()) {\n            return\n        }\n        setupWithAccount(\n            viewData.account,\n            statusDisplayOptions.animateAvatars,\n            statusDisplayOptions.animateEmojis,\n            statusDisplayOptions.showBotOverlay\n        )\n        setupActionListener(accountListener, viewData.account.id)\n    }\n\n    fun setupWithAccount(\n        account: TimelineAccount,\n        animateAvatar: Boolean,\n        animateEmojis: Boolean,\n        showBotOverlay: Boolean\n    ) {\n        val wrappedName = account.name.unicodeWrap()\n        val emojifiedName: CharSequence = wrappedName.emojify(\n            account.emojis,\n            binding.displayNameTextView,\n            animateEmojis\n        )\n        binding.displayNameTextView.text = emojifiedName\n        if (showHeader) {\n            val wholeMessage: String = itemView.context.getString(\n                R.string.notification_follow_request_format,\n                wrappedName\n            )\n            binding.notificationTextView.text = SpannableString(wholeMessage).apply {\n                setSpan(StyleSpan(Typeface.BOLD), 0, wrappedName.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)\n            }.emojify(account.emojis, binding.notificationTextView, animateEmojis)\n        }\n        binding.notificationTextView.visible(showHeader)\n        val formattedUsername = itemView.context.getString(\n            R.string.post_username_format,\n            account.username\n        )\n        binding.usernameTextView.text = formattedUsername\n        if (account.note.isEmpty()) {\n            binding.accountNote.hide()\n        } else {\n            binding.accountNote.show()\n\n            val emojifiedNote = account.note.parseAsMastodonHtml()\n                .emojify(account.emojis, binding.accountNote, animateEmojis)\n            setClickableText(binding.accountNote, emojifiedNote, emptyList(), null, linkListener)\n        }\n        val avatarRadius = binding.avatar.context.resources.getDimensionPixelSize(\n            R.dimen.avatar_radius_48dp\n        )\n        loadAvatar(account.avatar, binding.avatar, avatarRadius, animateAvatar)\n        binding.avatarBadge.visible(showBotOverlay && account.bot)\n    }\n\n    fun setupActionListener(listener: AccountActionListener, accountId: String) {\n        binding.acceptButton.setOnClickListener {\n            val position = bindingAdapterPosition\n            if (position != RecyclerView.NO_POSITION) {\n                listener.onRespondToFollowRequest(true, accountId, position)\n            }\n        }\n        binding.rejectButton.setOnClickListener {\n            val position = bindingAdapterPosition\n            if (position != RecyclerView.NO_POSITION) {\n                listener.onRespondToFollowRequest(false, accountId, position)\n            }\n        }\n        itemView.setOnClickListener { listener.onViewAccount(accountId) }\n        binding.accountNote.setOnClickListener { listener.onViewAccount(accountId) }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/adapter/LoadMoreViewHolder.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\npackage com.keylesspalace.tusky.adapter\n\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.databinding.ItemLoadMoreBinding\nimport com.keylesspalace.tusky.interfaces.StatusActionListener\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.visible\n\n/**\n * Placeholder for missing parts in timelines.\n *\n * Displays a \"Load more\" button to load the gap, or a\n * circular progress bar if the missing page is being loaded.\n */\nclass LoadMoreViewHolder(\n    private val binding: ItemLoadMoreBinding,\n    listener: StatusActionListener\n) : RecyclerView.ViewHolder(binding.root) {\n\n    init {\n        binding.loadMoreButton.setOnClickListener {\n            binding.loadMoreButton.hide()\n            binding.loadMoreProgressBar.show()\n            listener.onLoadMore(bindingAdapterPosition)\n        }\n    }\n\n    fun setup(loading: Boolean) {\n        binding.loadMoreButton.visible(!loading)\n        binding.loadMoreProgressBar.visible(loading)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/adapter/LoadStateFooterAdapter.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.adapter\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.paging.LoadState\nimport androidx.paging.LoadStateAdapter\nimport com.keylesspalace.tusky.databinding.ItemNetworkStateBinding\nimport com.keylesspalace.tusky.util.BindingHolder\nimport com.keylesspalace.tusky.util.visible\n\nclass LoadStateFooterAdapter(\n    private val retryCallback: () -> Unit\n) : LoadStateAdapter<BindingHolder<ItemNetworkStateBinding>>() {\n\n    override fun onBindViewHolder(\n        holder: BindingHolder<ItemNetworkStateBinding>,\n        loadState: LoadState\n    ) {\n        val binding = holder.binding\n        binding.progressBar.visible(loadState == LoadState.Loading)\n        binding.retryButton.visible(loadState is LoadState.Error)\n        val msg = if (loadState is LoadState.Error) {\n            loadState.error.message\n        } else {\n            null\n        }\n        binding.errorMsg.visible(msg != null)\n        binding.errorMsg.text = msg\n        binding.retryButton.setOnClickListener {\n            retryCallback()\n        }\n    }\n\n    override fun onCreateViewHolder(\n        parent: ViewGroup,\n        loadState: LoadState\n    ): BindingHolder<ItemNetworkStateBinding> {\n        val binding = ItemNetworkStateBinding.inflate(\n            LayoutInflater.from(parent.context),\n            parent,\n            false\n        )\n        return BindingHolder(binding)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/adapter/LocaleAdapter.kt",
    "content": "/* Copyright 2022 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.adapter\n\nimport android.content.Context\nimport android.graphics.Typeface\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.ArrayAdapter\nimport android.widget.TextView\nimport com.google.android.material.color.MaterialColors\nimport com.keylesspalace.tusky.util.getTuskyDisplayName\nimport com.keylesspalace.tusky.util.modernLanguageCode\nimport java.util.Locale\n\nclass LocaleAdapter(context: Context, resource: Int, locales: List<Locale>) : ArrayAdapter<Locale>(\n    context,\n    resource,\n    locales\n) {\n    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {\n        return (super.getView(position, convertView, parent) as TextView).apply {\n            setTextColor(MaterialColors.getColor(this, android.R.attr.textColorTertiary))\n            typeface = Typeface.DEFAULT_BOLD\n            text = super.getItem(position)?.modernLanguageCode?.uppercase()\n        }\n    }\n\n    override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {\n        return (super.getDropDownView(position, convertView, parent) as TextView).apply {\n            setTextColor(MaterialColors.getColor(this, android.R.attr.textColorTertiary))\n            text = super.getItem(position)?.getTuskyDisplayName(context)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/adapter/PlaceholderViewHolder.kt",
    "content": "/* Copyright 2025 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.adapter\n\nimport android.view.ViewGroup\nimport androidx.core.view.updateLayoutParams\nimport androidx.core.view.updatePaddingRelative\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemPlaceholderBinding\nimport com.keylesspalace.tusky.util.visible\n\nclass PlaceholderViewHolder(\n    binding: ItemPlaceholderBinding,\n    mode: Mode,\n) : RecyclerView.ViewHolder(binding.root) {\n    init {\n        val res = binding.root.context.resources\n        binding.topPlaceholder.visible(mode != Mode.STATUS)\n        binding.reblogButtonPlaceholder.visible(mode != Mode.CONVERSATION)\n        if (mode == Mode.NOTIFICATION) {\n            binding.topPlaceholder.updatePaddingRelative(\n                start = res.getDimensionPixelSize(R.dimen.status_info_padding_large)\n            )\n        }\n        if (mode == Mode.CONVERSATION) {\n            binding.moreButtonPlaceHolder.updateLayoutParams<ViewGroup.MarginLayoutParams> {\n                marginEnd = res.getDimensionPixelSize(R.dimen.conversation_placeholder_more_button_inset)\n            }\n        }\n    }\n\n    enum class Mode {\n        STATUS,\n        NOTIFICATION,\n        CONVERSATION\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/adapter/PollAdapter.kt",
    "content": "/* Copyright 2019 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.adapter\n\nimport android.content.res.ColorStateList\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.material.color.MaterialColors\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemPollBinding\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.util.BindingHolder\nimport com.keylesspalace.tusky.util.emojify\nimport com.keylesspalace.tusky.util.visible\nimport com.keylesspalace.tusky.viewdata.PollOptionViewData\nimport com.keylesspalace.tusky.viewdata.buildDescription\nimport com.keylesspalace.tusky.viewdata.calculatePercent\n\nclass PollAdapter : RecyclerView.Adapter<BindingHolder<ItemPollBinding>>() {\n\n    private var pollOptions: List<PollOptionViewData> = emptyList()\n    private var voteCount: Int = 0\n    private var votersCount: Int? = null\n    private var mode = RESULT\n    private var emojis: List<Emoji> = emptyList()\n    private var resultClickListener: View.OnClickListener? = null\n    private var animateEmojis = false\n    private var enabled = true\n\n    @JvmOverloads\n    fun setup(\n        options: List<PollOptionViewData>,\n        voteCount: Int,\n        votersCount: Int?,\n        emojis: List<Emoji>,\n        mode: Int,\n        resultClickListener: View.OnClickListener?,\n        animateEmojis: Boolean,\n        enabled: Boolean = true\n    ) {\n        this.pollOptions = options\n        this.voteCount = voteCount\n        this.votersCount = votersCount\n        this.emojis = emojis\n        this.mode = mode\n        this.resultClickListener = resultClickListener\n        this.animateEmojis = animateEmojis\n        this.enabled = enabled\n        notifyDataSetChanged()\n    }\n\n    fun getSelected(): List<Int> {\n        return pollOptions.filter { it.selected }\n            .map { pollOptions.indexOf(it) }\n    }\n\n    override fun onCreateViewHolder(\n        parent: ViewGroup,\n        viewType: Int\n    ): BindingHolder<ItemPollBinding> {\n        val binding = ItemPollBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n        return BindingHolder(binding)\n    }\n\n    override fun getItemCount() = pollOptions.size\n\n    override fun onBindViewHolder(holder: BindingHolder<ItemPollBinding>, position: Int) {\n        val option = pollOptions[position]\n\n        val resultTextView = holder.binding.statusPollOptionResult\n        val radioButton = holder.binding.statusPollRadioButton\n        val checkBox = holder.binding.statusPollCheckbox\n\n        resultTextView.visible(mode == RESULT)\n        radioButton.visible(mode == SINGLE)\n        checkBox.visible(mode == MULTIPLE)\n\n        radioButton.isEnabled = enabled\n        checkBox.isEnabled = enabled\n\n        if (mode == RESULT) {\n            val percent = calculatePercent(option.votesCount, votersCount, voteCount)\n            resultTextView.text = buildDescription(option.title, percent, option.voted, resultTextView.context, resultTextView)\n                .emojify(emojis, resultTextView, animateEmojis)\n\n            val level = percent * 100\n            val optionColor = if (option.voted) {\n                R.color.colorBackgroundHighlight\n            } else {\n                R.color.colorBackgroundAccent\n            }\n\n            holder.binding.pollLayout.setBackgroundResource(R.drawable.poll_option_background)\n            holder.binding.pollLayout.background.level = level\n            holder.binding.pollLayout.background.setTint(resultTextView.context.getColor(optionColor))\n            holder.binding.root.strokeColor = holder.binding.root.context.getColor(optionColor)\n            resultTextView.setOnClickListener(resultClickListener)\n        } else {\n            holder.binding.pollLayout.background = null\n\n            if (option.selected) {\n                holder.binding.root.setCardBackgroundColor(ColorStateList.valueOf(MaterialColors.getColor(holder.binding.root, com.google.android.material.R.attr.colorSurface)))\n                holder.binding.root.strokeColor = MaterialColors.getColor(holder.binding.root, com.google.android.material.R.attr.colorSurface)\n            } else {\n                holder.binding.root.setCardBackgroundColor(ColorStateList.valueOf(MaterialColors.getColor(holder.binding.root, android.R.attr.colorBackground)))\n                holder.binding.root.strokeColor = MaterialColors.getColor(holder.binding.root, R.attr.colorBackgroundAccent)\n            }\n            if (mode == SINGLE) {\n                radioButton.text = option.title.emojify(emojis, radioButton, animateEmojis)\n                radioButton.isChecked = option.selected\n                radioButton.setOnClickListener {\n                    pollOptions.forEachIndexed { index, pollOption ->\n                        pollOption.selected = index == holder.bindingAdapterPosition\n                        notifyItemChanged(index)\n                    }\n                }\n            } else { // mode == MULTIPLE\n                checkBox.text = option.title.emojify(emojis, checkBox, animateEmojis)\n                checkBox.isChecked = option.selected\n                checkBox.setOnCheckedChangeListener { _, isChecked ->\n                    pollOptions[holder.bindingAdapterPosition].selected = isChecked\n                    notifyItemChanged(holder.bindingAdapterPosition)\n                }\n            }\n        }\n    }\n\n    companion object {\n        const val RESULT = 0\n        const val SINGLE = 1\n        const val MULTIPLE = 2\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/adapter/PreviewPollOptionsAdapter.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.adapter\n\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\n\nclass PreviewPollOptionsAdapter : RecyclerView.Adapter<PreviewViewHolder>() {\n\n    private var options: List<String> = emptyList()\n    private var multiple: Boolean = false\n    private var clickListener: View.OnClickListener? = null\n\n    fun update(newOptions: List<String>, multiple: Boolean) {\n        this.options = newOptions\n        this.multiple = multiple\n        notifyDataSetChanged()\n    }\n\n    fun setOnClickListener(l: View.OnClickListener?) {\n        clickListener = l\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PreviewViewHolder {\n        return PreviewViewHolder(\n            LayoutInflater.from(\n                parent.context\n            ).inflate(R.layout.item_poll_preview_option, parent, false)\n        )\n    }\n\n    override fun getItemCount() = options.size\n\n    override fun onBindViewHolder(holder: PreviewViewHolder, position: Int) {\n        val textView = holder.itemView as TextView\n\n        val iconId = if (multiple) {\n            R.drawable.ic_check_box_outline_blank_18dp\n        } else {\n            R.drawable.ic_radio_button_unchecked_18dp\n        }\n\n        textView.setCompoundDrawablesRelativeWithIntrinsicBounds(iconId, 0, 0, 0)\n\n        textView.text = options[position]\n\n        textView.setOnClickListener(clickListener)\n    }\n}\n\nclass PreviewViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java",
    "content": "package com.keylesspalace.tusky.adapter;\n\nimport static com.keylesspalace.tusky.viewdata.PollViewDataKt.buildDescription;\n\nimport android.content.Context;\nimport android.graphics.Typeface;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.graphics.drawable.ColorDrawable;\nimport android.graphics.drawable.Drawable;\nimport android.net.Uri;\nimport android.text.Spannable;\nimport android.text.SpannableStringBuilder;\nimport android.text.Spanned;\nimport android.text.TextUtils;\nimport android.text.format.DateUtils;\nimport android.text.style.StyleSpan;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.Button;\nimport android.widget.ImageButton;\nimport android.widget.ImageView;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\n\nimport androidx.annotation.DrawableRes;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.PluralsRes;\nimport androidx.appcompat.content.res.AppCompatResources;\nimport androidx.appcompat.widget.TooltipCompat;\nimport androidx.constraintlayout.widget.ConstraintLayout;\nimport androidx.recyclerview.widget.DefaultItemAnimator;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.RequestBuilder;\nimport com.google.android.material.button.MaterialButton;\nimport com.google.android.material.card.MaterialCardView;\nimport com.google.android.material.color.MaterialColors;\nimport com.google.android.material.imageview.ShapeableImageView;\nimport com.google.android.material.shape.CornerFamily;\nimport com.google.android.material.shape.ShapeAppearanceModel;\nimport com.keylesspalace.tusky.R;\nimport com.keylesspalace.tusky.ViewMediaActivity;\nimport com.keylesspalace.tusky.entity.Attachment;\nimport com.keylesspalace.tusky.entity.Attachment.Focus;\nimport com.keylesspalace.tusky.entity.Attachment.MetaData;\nimport com.keylesspalace.tusky.entity.Emoji;\nimport com.keylesspalace.tusky.entity.Filter;\nimport com.keylesspalace.tusky.entity.HashTag;\nimport com.keylesspalace.tusky.entity.PreviewCard;\nimport com.keylesspalace.tusky.entity.Status;\nimport com.keylesspalace.tusky.entity.TimelineAccount;\nimport com.keylesspalace.tusky.entity.Translation;\nimport com.keylesspalace.tusky.interfaces.StatusActionListener;\nimport com.keylesspalace.tusky.util.AbsoluteTimeFormatter;\nimport com.keylesspalace.tusky.util.AttachmentHelper;\nimport com.keylesspalace.tusky.util.BlurhashDrawable;\nimport com.keylesspalace.tusky.util.CardViewMode;\nimport com.keylesspalace.tusky.util.CompositeWithOpaqueBackground;\nimport com.keylesspalace.tusky.util.CustomEmojiHelper;\nimport com.keylesspalace.tusky.util.ImageLoadingHelper;\nimport com.keylesspalace.tusky.util.LinkHelper;\nimport com.keylesspalace.tusky.util.LocaleUtilsKt;\nimport com.keylesspalace.tusky.util.NumberUtils;\nimport com.keylesspalace.tusky.util.StatusDisplayOptions;\nimport com.keylesspalace.tusky.util.TimestampUtils;\nimport com.keylesspalace.tusky.util.TouchDelegateHelper;\nimport com.keylesspalace.tusky.view.MediaPreviewImageView;\nimport com.keylesspalace.tusky.view.MediaPreviewLayout;\nimport com.keylesspalace.tusky.viewdata.PollOptionViewData;\nimport com.keylesspalace.tusky.viewdata.PollViewData;\nimport com.keylesspalace.tusky.viewdata.PollViewDataKt;\nimport com.keylesspalace.tusky.viewdata.StatusViewData;\nimport com.keylesspalace.tusky.viewdata.TranslationViewData;\n\nimport java.text.NumberFormat;\nimport java.util.Collections;\nimport java.util.Date;\nimport java.util.List;\n\nimport at.connyduck.sparkbutton.SparkButton;\nimport at.connyduck.sparkbutton.helpers.Utils;\nimport kotlin.collections.CollectionsKt;\n\npublic abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {\n    public static class Key {\n        public static final String KEY_CREATED = \"created\";\n    }\n\n    private final String TAG = \"StatusBaseViewHolder\";\n\n    private final TextView displayName;\n    private final TextView username;\n    private final ImageButton replyButton;\n    private final TextView replyCountLabel;\n    private final SparkButton reblogButton;\n    private final SparkButton favouriteButton;\n    private final SparkButton bookmarkButton;\n    private final ImageButton moreButton;\n    protected final ConstraintLayout mediaContainer;\n    protected final MediaPreviewLayout mediaPreview;\n    private final TextView sensitiveMediaWarning;\n    private final View sensitiveMediaShow;\n    protected final TextView[] mediaLabels;\n    protected final MaterialCardView[] mediaLabelContainers;\n    protected final CharSequence[] mediaDescriptions;\n    private final MaterialButton contentWarningButton;\n    private final ImageView avatarInset;\n\n    public final ImageView avatar;\n    public final TextView metaInfo;\n    public final TextView content;\n    public final TextView contentWarningDescription;\n\n    private final RecyclerView pollOptions;\n    private final TextView pollDescription;\n    private final Button pollButton;\n    private final Button pollResultsButton;\n\n    private final MaterialCardView cardView;\n    private final LinearLayout cardLayout;\n    private final ShapeableImageView cardImage;\n    private final TextView cardTitle;\n    private final TextView cardMetadata;\n    private final TextView cardAuthor;\n    private final TextView cardAuthorButton;\n\n    private final PollAdapter pollAdapter;\n    protected final ConstraintLayout statusContainer;\n    private final TextView translationStatusView;\n    private final Button untranslateButton;\n    private final TextView trailingHashtagView;\n\n\n    private final NumberFormat numberFormat = NumberFormat.getNumberInstance();\n    private final AbsoluteTimeFormatter absoluteTimeFormatter = new AbsoluteTimeFormatter();\n\n    protected final int avatarRadius48dp;\n    private final int avatarRadius36dp;\n    private final int avatarRadius24dp;\n\n    private final Drawable mediaPreviewUnloaded;\n\n    protected StatusBaseViewHolder(@NonNull View itemView) {\n        super(itemView);\n        displayName = itemView.findViewById(R.id.status_display_name);\n        username = itemView.findViewById(R.id.status_username);\n        metaInfo = itemView.findViewById(R.id.status_meta_info);\n        content = itemView.findViewById(R.id.status_content);\n        avatar = itemView.findViewById(R.id.status_avatar);\n        replyButton = itemView.findViewById(R.id.status_reply);\n        replyCountLabel = itemView.findViewById(R.id.status_replies);\n        reblogButton = itemView.findViewById(R.id.status_inset);\n        favouriteButton = itemView.findViewById(R.id.status_favourite);\n        bookmarkButton = itemView.findViewById(R.id.status_bookmark);\n        moreButton = itemView.findViewById(R.id.status_more);\n\n        mediaContainer = itemView.findViewById(R.id.status_media_preview_container);\n        mediaContainer.setClipToOutline(true);\n        mediaPreview = itemView.findViewById(R.id.status_media_preview);\n\n        sensitiveMediaWarning = itemView.findViewById(R.id.status_sensitive_media_warning);\n        sensitiveMediaShow = itemView.findViewById(R.id.status_sensitive_media_button);\n        mediaLabels = new TextView[]{\n            itemView.findViewById(R.id.status_media_label_0),\n            itemView.findViewById(R.id.status_media_label_1),\n            itemView.findViewById(R.id.status_media_label_2),\n            itemView.findViewById(R.id.status_media_label_3)\n        };\n        mediaLabelContainers = new MaterialCardView[]{\n            itemView.findViewById(R.id.status_media_label_container_0),\n            itemView.findViewById(R.id.status_media_label_container_1),\n            itemView.findViewById(R.id.status_media_label_container_2),\n            itemView.findViewById(R.id.status_media_label_container_3)\n        };\n        mediaDescriptions = new CharSequence[mediaLabels.length];\n        contentWarningDescription = itemView.findViewById(R.id.status_content_warning_description);\n        contentWarningButton = itemView.findViewById(R.id.status_content_warning_button);\n        avatarInset = itemView.findViewById(R.id.status_avatar_inset);\n\n        pollOptions = itemView.findViewById(R.id.status_poll_options);\n        pollDescription = itemView.findViewById(R.id.status_poll_description);\n        pollButton = itemView.findViewById(R.id.status_poll_button);\n        pollResultsButton = itemView.findViewById(R.id.status_poll_results_button);\n\n        cardView = itemView.findViewById(R.id.status_card_view);\n        cardLayout = itemView.findViewById(R.id.status_card_layout);\n        cardImage = itemView.findViewById(R.id.card_image);\n        cardTitle = itemView.findViewById(R.id.card_title);\n        cardMetadata = itemView.findViewById(R.id.card_metadata);\n        cardAuthor = itemView.findViewById(R.id.card_author);\n        cardAuthorButton = itemView.findViewById(R.id.card_author_button);\n\n        statusContainer = itemView.findViewById(R.id.status_container);\n\n        pollAdapter = new PollAdapter();\n        pollOptions.setAdapter(pollAdapter);\n        pollOptions.setLayoutManager(new LinearLayoutManager(pollOptions.getContext()));\n        ((DefaultItemAnimator) pollOptions.getItemAnimator()).setSupportsChangeAnimations(false);\n\n        translationStatusView = itemView.findViewById(R.id.status_translation_status);\n        untranslateButton = itemView.findViewById(R.id.status_button_untranslate);\n        trailingHashtagView = itemView.findViewById(R.id.status_trailing_hashtags_content);\n\n        this.avatarRadius48dp = itemView.getContext().getResources().getDimensionPixelSize(R.dimen.avatar_radius_48dp);\n        this.avatarRadius36dp = itemView.getContext().getResources().getDimensionPixelSize(R.dimen.avatar_radius_36dp);\n        this.avatarRadius24dp = itemView.getContext().getResources().getDimensionPixelSize(R.dimen.avatar_radius_24dp);\n\n        mediaPreviewUnloaded = new ColorDrawable(MaterialColors.getColor(itemView, R.attr.colorBackgroundAccent));\n\n        TouchDelegateHelper.expandTouchSizeToFillRow((ViewGroup) itemView, CollectionsKt.listOfNotNull(replyButton, reblogButton, favouriteButton, bookmarkButton, moreButton));\n    }\n\n    protected void setDisplayName(@NonNull String name, @NonNull List<Emoji> customEmojis, @NonNull StatusDisplayOptions statusDisplayOptions) {\n        CharSequence emojifiedName = CustomEmojiHelper.emojify(\n            name, customEmojis, displayName, statusDisplayOptions.animateEmojis()\n        );\n        displayName.setText(emojifiedName);\n    }\n\n    protected void setUsername(@Nullable String name) {\n        Context context = username.getContext();\n        String usernameText = context.getString(R.string.post_username_format, name);\n        username.setText(usernameText);\n    }\n\n    public void toggleContentWarning() {\n        contentWarningButton.performClick();\n    }\n\n    protected void setSpoilerAndContent(@NonNull StatusViewData.Concrete status,\n                                        @NonNull StatusDisplayOptions statusDisplayOptions,\n                                        final @NonNull StatusActionListener listener) {\n\n        Status actionable = status.getActionable();\n        String spoilerText = status.getSpoilerText();\n        List<Emoji> emojis = actionable.getEmojis();\n\n        boolean sensitive = !TextUtils.isEmpty(spoilerText);\n        boolean expanded = status.isExpanded();\n\n        if (sensitive) {\n            CharSequence emojiSpoiler = CustomEmojiHelper.emojify(\n                spoilerText, emojis, contentWarningDescription, statusDisplayOptions.animateEmojis()\n            );\n            contentWarningDescription.setText(emojiSpoiler);\n            contentWarningDescription.setVisibility(View.VISIBLE);\n            boolean hasContent = !TextUtils.isEmpty(status.getContent());\n            if (hasContent) {\n                contentWarningButton.setVisibility(View.VISIBLE);\n                setContentWarningButtonText(expanded);\n                contentWarningButton.setOnClickListener(view -> toggleExpandedState(true, !expanded, status, statusDisplayOptions, listener));\n            } else {\n                contentWarningButton.setVisibility(View.GONE);\n            }\n            this.setTextVisible(true, expanded, status, statusDisplayOptions, listener);\n        } else {\n            contentWarningDescription.setVisibility(View.GONE);\n            contentWarningButton.setVisibility(View.GONE);\n            this.setTextVisible(false, true, status, statusDisplayOptions, listener);\n        }\n    }\n\n    private void setContentWarningButtonText(boolean expanded) {\n        if (expanded) {\n            contentWarningButton.setText(R.string.post_content_warning_show_less);\n        } else {\n            contentWarningButton.setText(R.string.post_content_warning_show_more);\n        }\n    }\n\n    protected void toggleExpandedState(boolean sensitive,\n                                       boolean expanded,\n                                       @NonNull final StatusViewData.Concrete status,\n                                       @NonNull final StatusDisplayOptions statusDisplayOptions,\n                                       @NonNull final StatusActionListener listener) {\n\n        contentWarningDescription.invalidate();\n        int adapterPosition = getBindingAdapterPosition();\n        if (adapterPosition != RecyclerView.NO_POSITION) {\n            listener.onExpandedChange(expanded, adapterPosition);\n        }\n        setContentWarningButtonText(expanded);\n\n        this.setTextVisible(sensitive, expanded, status, statusDisplayOptions, listener);\n\n        setupCard(status, expanded, !status.isShowingContent(), statusDisplayOptions.cardViewMode(), statusDisplayOptions, listener);\n    }\n\n    private void setTextVisible(boolean sensitive,\n                                boolean expanded,\n                                @NonNull final StatusViewData.Concrete status,\n                                @NonNull final StatusDisplayOptions statusDisplayOptions,\n                                final StatusActionListener listener) {\n\n        Status actionable = status.getActionable();\n        Spanned content = status.getContent();\n        List<Status.Mention> mentions = actionable.getMentions();\n        List<HashTag> tags = actionable.getTags();\n        List<Emoji> emojis = actionable.getEmojis();\n        PollViewData poll = PollViewDataKt.toViewData(status.getPoll());\n\n        if (expanded) {\n            CharSequence emojifiedText = CustomEmojiHelper.emojify(content, emojis, this.content, statusDisplayOptions.animateEmojis());\n            LinkHelper.setClickableText(this.content, emojifiedText, mentions, tags, listener, this.trailingHashtagView);\n            if (trailingHashtagView != null && status.isCollapsible() && status.isCollapsed()) {\n                trailingHashtagView.setVisibility(View.GONE);\n            }\n            for (int i = 0; i < mediaLabels.length; ++i) {\n                updateMediaLabel(i, sensitive, true);\n            }\n            if (poll != null) {\n                setupPoll(poll, emojis, statusDisplayOptions, listener);\n            } else {\n                hidePoll();\n            }\n        } else {\n            hidePoll();\n            if (trailingHashtagView != null) {\n                trailingHashtagView.setVisibility(View.GONE);\n            }\n            LinkHelper.setClickableMentions(this.content, mentions, listener);\n        }\n        if (TextUtils.isEmpty(this.content.getText())) {\n            this.content.setVisibility(View.GONE);\n        } else {\n            this.content.setVisibility(View.VISIBLE);\n        }\n    }\n\n    private void hidePoll() {\n        pollButton.setVisibility(View.GONE);\n        pollResultsButton.setVisibility(View.GONE);\n        pollDescription.setVisibility(View.GONE);\n        pollOptions.setVisibility(View.GONE);\n    }\n\n    private void setAvatar(String url,\n                           @Nullable String rebloggedUrl,\n                           boolean isBot,\n                           StatusDisplayOptions statusDisplayOptions) {\n\n        int avatarRadius;\n        if (TextUtils.isEmpty(rebloggedUrl)) {\n            avatar.setPaddingRelative(0, 0, 0, 0);\n\n            if (statusDisplayOptions.showBotOverlay() && isBot) {\n                avatarInset.setVisibility(View.VISIBLE);\n                Glide.with(avatarInset)\n                    .load(R.drawable.bot_badge)\n                    .into(avatarInset);\n            } else {\n                avatarInset.setVisibility(View.GONE);\n            }\n\n            avatarRadius = avatarRadius48dp;\n\n        } else {\n            int padding = Utils.dpToPx(avatar.getContext(), 12);\n            avatar.setPaddingRelative(0, 0, padding, padding);\n\n            avatarInset.setVisibility(View.VISIBLE);\n            avatarInset.setBackground(null);\n            ImageLoadingHelper.loadAvatar(rebloggedUrl, avatarInset, avatarRadius24dp,\n                statusDisplayOptions.animateAvatars(), null);\n\n            avatarRadius = avatarRadius36dp;\n        }\n\n        ImageLoadingHelper.loadAvatar(\n            url,\n            avatar,\n            avatarRadius,\n            statusDisplayOptions.animateAvatars(),\n            Collections.singletonList(new CompositeWithOpaqueBackground(MaterialColors.getColor(avatar, android.R.attr.colorBackground)))\n        );\n    }\n\n    protected void setMetaData(@NonNull StatusViewData.Concrete statusViewData, @NonNull StatusDisplayOptions statusDisplayOptions, @NonNull StatusActionListener listener) {\n\n        Status status = statusViewData.getActionable();\n        Date createdAt = status.getCreatedAt();\n        Date editedAt = status.getEditedAt();\n\n        String timestampText;\n        if (statusDisplayOptions.useAbsoluteTime()) {\n            timestampText = absoluteTimeFormatter.format(createdAt, true);\n        } else {\n            if (createdAt == null) {\n                timestampText = \"?m\";\n            } else {\n                long then = createdAt.getTime();\n                long now = System.currentTimeMillis();\n                timestampText = TimestampUtils.getRelativeTimeSpanString(metaInfo.getContext(), then, now);\n            }\n        }\n\n        if (editedAt != null) {\n            timestampText = metaInfo.getContext().getString(R.string.post_timestamp_with_edited_indicator, timestampText);\n        }\n        metaInfo.setText(timestampText);\n    }\n\n    private CharSequence getCreatedAtDescription(Date createdAt,\n                                                 StatusDisplayOptions statusDisplayOptions) {\n        if (statusDisplayOptions.useAbsoluteTime()) {\n            return absoluteTimeFormatter.format(createdAt, true);\n        } else {\n            /* This one is for screen-readers. Frequently, they would mispronounce timestamps like \"17m\"\n             * as 17 meters instead of minutes. */\n\n            if (createdAt == null) {\n                return \"? minutes\";\n            } else {\n                long then = createdAt.getTime();\n                long now = System.currentTimeMillis();\n                return DateUtils.getRelativeTimeSpanString(then, now,\n                    DateUtils.SECOND_IN_MILLIS,\n                    DateUtils.FORMAT_ABBREV_RELATIVE);\n            }\n        }\n    }\n\n    protected void setReplyButtonImage(boolean isReply) {\n        if (isReply) {\n            replyButton.setImageResource(R.drawable.ic_reply_all_24dp);\n        } else {\n            replyButton.setImageResource(R.drawable.ic_reply_24dp);\n        }\n    }\n\n    protected void setReplyCount(int repliesCount, boolean fullStats) {\n        // This label only exists in the non-detailed view (to match the web ui)\n        if (replyCountLabel == null) return;\n\n        if (fullStats) {\n            replyCountLabel.setText(NumberUtils.formatNumber(repliesCount, 1000));\n            return;\n        }\n\n        // Show \"0\", \"1\", or \"1+\" for replies otherwise, so the user knows if there is a thread\n        // that they can click through to read.\n        replyCountLabel.setText((repliesCount > 1 ? replyCountLabel.getContext().getString(R.string.status_count_one_plus) : Integer.toString(repliesCount)));\n    }\n\n    private void setReblogged(boolean reblogged) {\n        reblogButton.setChecked(reblogged);\n    }\n\n    // This should only be called after setReblogged, in order to override the tint correctly.\n    private void setRebloggingEnabled(boolean enabled, Status.Visibility visibility) {\n        reblogButton.setEnabled(enabled && visibility != Status.Visibility.PRIVATE);\n\n        if (enabled) {\n            int inactiveId;\n            int activeId;\n            if (visibility == Status.Visibility.PRIVATE) {\n                inactiveId = R.drawable.ic_lock_24dp;\n                activeId = R.drawable.ic_lock_24dp_filled;\n            } else {\n                inactiveId = R.drawable.ic_repeat_24dp;\n                activeId = R.drawable.ic_repeat_active_24dp;\n            }\n            reblogButton.setInactiveImage(inactiveId);\n            reblogButton.setActiveImage(activeId);\n        } else {\n            int disabledId;\n            if (visibility == Status.Visibility.DIRECT) {\n                disabledId = R.drawable.ic_mail_24dp;\n            } else {\n                disabledId = R.drawable.ic_lock_24dp;\n            }\n            reblogButton.setInactiveImage(disabledId);\n            reblogButton.setActiveImage(disabledId);\n        }\n    }\n\n    protected void setFavourited(boolean favourited) {\n        favouriteButton.setChecked(favourited);\n    }\n\n    protected void setBookmarked(boolean bookmarked) {\n        bookmarkButton.setChecked(bookmarked);\n    }\n\n    private BitmapDrawable decodeBlurHash(String blurhash) {\n        return new BlurhashDrawable(this.avatar.getContext(), blurhash);\n    }\n\n    private void loadImage(MediaPreviewImageView imageView,\n                           @Nullable String previewUrl,\n                           @Nullable MetaData meta,\n                           @Nullable String blurhash) {\n\n        Drawable placeholder = blurhash != null ? decodeBlurHash(blurhash) : mediaPreviewUnloaded;\n\n        if (TextUtils.isEmpty(previewUrl)) {\n            imageView.removeFocalPoint();\n\n            Glide.with(imageView)\n                .load(placeholder)\n                .centerInside()\n                .into(imageView);\n        } else {\n            Focus focus = meta != null ? meta.getFocus() : null;\n\n            if (focus != null) { // If there is a focal point for this attachment:\n                imageView.setFocalPoint(focus);\n\n                Glide.with(imageView.getContext())\n                    .load(previewUrl)\n                    .placeholder(placeholder)\n                    .centerInside()\n                    .addListener(imageView)\n                    .into(imageView);\n            } else {\n                imageView.removeFocalPoint();\n\n                Glide.with(imageView)\n                    .load(previewUrl)\n                    .placeholder(placeholder)\n                    .centerInside()\n                    .into(imageView);\n            }\n        }\n    }\n\n    protected void setMediaPreviews(\n        final @NonNull List<Attachment> attachments,\n        boolean sensitive,\n        final @NonNull StatusActionListener listener,\n        boolean showingContent,\n        boolean useBlurhash,\n        final @NonNull Filter filter\n    ) {\n\n        mediaPreview.setVisibility(View.VISIBLE);\n        mediaPreview.setAspectRatios(AttachmentHelper.aspectRatios(attachments));\n\n        mediaPreview.forEachIndexed((i, imageView, descriptionIndicator) -> {\n            Attachment attachment = attachments.get(i);\n            String previewUrl = attachment.getPreviewUrl();\n            String description = attachment.getDescription();\n            boolean hasDescription = !TextUtils.isEmpty(description);\n\n            if (hasDescription) {\n                imageView.setContentDescription(description);\n            } else {\n                imageView.setContentDescription(imageView.getContext().getString(R.string.action_view_media));\n            }\n\n            loadImage(\n                imageView,\n                showingContent ? previewUrl : null,\n                attachment.getMeta(),\n                useBlurhash ? attachment.getBlurhash() : null\n            );\n\n            final Attachment.Type type = attachment.getType();\n            if (showingContent && (type == Attachment.Type.VIDEO || type == Attachment.Type.GIFV)) {\n                imageView.setForegroundGravity(Gravity.CENTER);\n                imageView.setForeground(AppCompatResources.getDrawable(itemView.getContext(), R.drawable.play_indicator));\n            } else {\n                imageView.setForeground(null);\n            }\n\n            final CharSequence formattedDescription = AttachmentHelper.getFormattedDescription(attachment, imageView.getContext());\n            setAttachmentClickListener(imageView, listener, i, formattedDescription, true);\n\n            if (filter != null) {\n                sensitiveMediaWarning.setText(sensitiveMediaWarning.getContext().getString(R.string.status_filter_placeholder_label_format, filter.getTitle()));\n            } else if (sensitive) {\n                sensitiveMediaWarning.setText(R.string.post_sensitive_media_title);\n            } else {\n                sensitiveMediaWarning.setText(R.string.post_media_hidden_title);\n            }\n\n            sensitiveMediaWarning.setVisibility(showingContent ? View.GONE : View.VISIBLE);\n            sensitiveMediaShow.setVisibility(showingContent ? View.VISIBLE : View.GONE);\n\n            descriptionIndicator.setVisibility(hasDescription && showingContent ? View.VISIBLE : View.GONE);\n\n            sensitiveMediaShow.setOnClickListener(v -> {\n                if (getBindingAdapterPosition() != RecyclerView.NO_POSITION) {\n                    listener.onContentHiddenChange(false, getBindingAdapterPosition());\n                }\n                v.setVisibility(View.GONE);\n                sensitiveMediaWarning.setVisibility(View.VISIBLE);\n                descriptionIndicator.setVisibility(View.GONE);\n            });\n            sensitiveMediaWarning.setOnClickListener(v -> {\n                if (getBindingAdapterPosition() != RecyclerView.NO_POSITION) {\n                    listener.onContentHiddenChange(true, getBindingAdapterPosition());\n                }\n                v.setVisibility(View.GONE);\n                sensitiveMediaShow.setVisibility(View.VISIBLE);\n                descriptionIndicator.setVisibility(hasDescription ? View.VISIBLE : View.GONE);\n            });\n\n            return null;\n        });\n    }\n\n    @DrawableRes\n    private static int getLabelIcon(Attachment.Type type) {\n        return switch (type) {\n            case IMAGE -> R.drawable.ic_image_24dp;\n            case GIFV -> R.drawable.ic_gif_box_24dp;\n            case VIDEO -> R.drawable.ic_slideshow_24dp;\n            case AUDIO -> R.drawable.ic_music_box_24dp;\n            default -> R.drawable.ic_attach_file_24dp;\n        };\n    }\n\n    private void updateMediaLabel(int index, boolean sensitive, boolean showingContent) {\n        Context context = itemView.getContext();\n        CharSequence label = (sensitive && !showingContent) ?\n            context.getString(R.string.post_sensitive_media_title) :\n            mediaDescriptions[index];\n        mediaLabels[index].setText(label);\n    }\n\n    protected void setMediaLabel(@NonNull List<Attachment> attachments, boolean sensitive,\n                                 final @NonNull StatusActionListener listener, boolean showingContent) {\n        Context context = itemView.getContext();\n        for (int i = 0; i < mediaLabels.length; i++) {\n            TextView mediaLabel = mediaLabels[i];\n            if (i < attachments.size()) {\n                Attachment attachment = attachments.get(i);\n                mediaLabelContainers[i].setVisibility(View.VISIBLE);\n                mediaDescriptions[i] = AttachmentHelper.getFormattedDescription(attachment, context);\n                updateMediaLabel(i, sensitive, showingContent);\n\n                // Set the icon next to the label.\n                int drawableId = getLabelIcon(attachments.get(0).getType());\n                mediaLabel.setCompoundDrawablesRelativeWithIntrinsicBounds(drawableId, 0, 0, 0);\n\n                setAttachmentClickListener(mediaLabel, listener, i, mediaDescriptions[i], false);\n            } else {\n                mediaLabelContainers[i].setVisibility(View.GONE);\n            }\n        }\n    }\n\n    private void setAttachmentClickListener(@NonNull View view, @NonNull StatusActionListener listener,\n                                            int index, CharSequence description, boolean animateTransition) {\n        view.setOnClickListener(v -> {\n            int position = getBindingAdapterPosition();\n            if (position != RecyclerView.NO_POSITION) {\n                if (sensitiveMediaWarning.getVisibility() == View.VISIBLE) {\n                    listener.onContentHiddenChange(true, getBindingAdapterPosition());\n                } else {\n                    listener.onViewMedia(position, index, animateTransition ? v : null);\n                }\n            }\n        });\n        TooltipCompat.setTooltipText(view, description);\n    }\n\n    protected void hideSensitiveMediaWarning() {\n        sensitiveMediaWarning.setVisibility(View.GONE);\n        sensitiveMediaShow.setVisibility(View.GONE);\n    }\n\n    protected void setupButtons(final @NonNull StatusActionListener listener,\n                                final @NonNull String accountId,\n                                final @Nullable String statusContent,\n                                @NonNull StatusDisplayOptions statusDisplayOptions) {\n        View.OnClickListener profileButtonClickListener = button -> listener.onViewAccount(accountId);\n\n        avatar.setOnClickListener(profileButtonClickListener);\n        displayName.setOnClickListener(profileButtonClickListener);\n\n        replyButton.setOnClickListener(v -> {\n            int position = getBindingAdapterPosition();\n            if (position != RecyclerView.NO_POSITION) {\n                listener.onReply(position);\n            }\n        });\n\n        if (reblogButton != null) {\n            reblogButton.setEventListener((button, buttonState) -> {\n                // return true to play animation\n                int position = getBindingAdapterPosition();\n                if (position != RecyclerView.NO_POSITION) {\n                    listener.onReblog(!buttonState, position, null, button);\n                }\n                return false;\n            });\n        }\n\n        favouriteButton.setEventListener((button, buttonState) -> {\n            // return true to play animation\n            int position = getBindingAdapterPosition();\n            if (position != RecyclerView.NO_POSITION) {\n                listener.onFavourite(!buttonState, position, button);\n            }\n            return false;\n        });\n\n        bookmarkButton.setEventListener((button, buttonState) -> {\n            int position = getBindingAdapterPosition();\n            if (position != RecyclerView.NO_POSITION) {\n                listener.onBookmark(!buttonState, position);\n            }\n            return true;\n        });\n\n        moreButton.setOnClickListener(v -> {\n            int position = getBindingAdapterPosition();\n            if (position != RecyclerView.NO_POSITION) {\n                listener.onMore(v, position);\n            }\n        });\n        /* Even though the content TextView is a child of the container, it won't respond to clicks\n         * if it contains URLSpans without also setting its listener. The surrounding spans will\n         * just eat the clicks instead of deferring to the parent listener, but WILL respond to a\n         * listener directly on the TextView, for whatever reason. */\n        View.OnClickListener viewThreadListener = v -> {\n            int position = getBindingAdapterPosition();\n            if (position != RecyclerView.NO_POSITION) {\n                listener.onViewThread(position);\n            }\n        };\n        content.setOnClickListener(viewThreadListener);\n        itemView.setOnClickListener(viewThreadListener);\n    }\n\n    public void setupWithStatus(@NonNull StatusViewData.Concrete status,\n                                @NonNull final StatusActionListener listener,\n                                @NonNull StatusDisplayOptions statusDisplayOptions,\n                                @NonNull List<Object> payloads,\n                                final boolean showStatusInfo) {\n        if (payloads.isEmpty()) {\n            Status actionable = status.getActionable();\n            setDisplayName(actionable.getAccount().getName(), actionable.getAccount().getEmojis(), statusDisplayOptions);\n            setUsername(actionable.getAccount().getUsername());\n            setMetaData(status, statusDisplayOptions, listener);\n            setReplyButtonImage(actionable.isReply());\n            setReplyCount(actionable.getRepliesCount(), statusDisplayOptions.showStatsInline());\n            setAvatar(actionable.getAccount().getAvatar(), status.getRebloggedAvatar(),\n                actionable.getAccount().getBot(), statusDisplayOptions);\n            setReblogged(actionable.getReblogged());\n            setFavourited(actionable.getFavourited());\n            setBookmarked(actionable.getBookmarked());\n            List<Attachment> attachments = status.getAttachments();\n            boolean sensitive = actionable.getSensitive();\n            if (attachments.isEmpty()) {\n                mediaContainer.setVisibility(View.GONE);\n            } else if (statusDisplayOptions.mediaPreviewEnabled() && hasPreviewableAttachment(attachments)) {\n                mediaContainer.setVisibility(View.VISIBLE);\n\n                setMediaPreviews(attachments, sensitive, listener, status.isShowingContent(), statusDisplayOptions.useBlurhash(), status.getFilter());\n\n                if (attachments.isEmpty()) {\n                    hideSensitiveMediaWarning();\n                }\n                // Hide the unused label.\n                for (MaterialCardView mediaLabelContainer : mediaLabelContainers) {\n                    mediaLabelContainer.setVisibility(View.GONE);\n                }\n            } else {\n                mediaContainer.setVisibility(View.VISIBLE);\n\n                setMediaLabel(attachments, sensitive, listener, status.isShowingContent());\n                // Hide all unused views.\n                mediaPreview.setVisibility(View.GONE);\n                hideSensitiveMediaWarning();\n            }\n\n            setupCard(status, status.isExpanded(), !status.isShowingContent(), statusDisplayOptions.cardViewMode(), statusDisplayOptions, listener);\n\n            setupButtons(listener, actionable.getAccount().getId(), status.getContent().toString(),\n                statusDisplayOptions);\n\n            setTranslationStatus(status, listener);\n\n            setRebloggingEnabled(actionable.isRebloggingAllowed(), actionable.getVisibility());\n\n            setSpoilerAndContent(status, statusDisplayOptions, listener);\n\n            setDescriptionForStatus(status, statusDisplayOptions);\n\n            // Workaround for RecyclerView 1.0.0 / androidx.core 1.0.0\n            // RecyclerView tries to set AccessibilityDelegateCompat to null\n            // but ViewCompat code replaces is with the default one. RecyclerView never\n            // fetches another one from its delegate because it checks that it's set so we remove it\n            // and let RecyclerView ask for a new delegate.\n            itemView.setAccessibilityDelegate(null);\n        } else {\n            for (Object item : payloads) {\n                if (Key.KEY_CREATED.equals(item)) {\n                    setMetaData(status, statusDisplayOptions, listener);\n                    if (status.getStatus().getCard() != null && status.getStatus().getCard().getPublishedAt() != null) {\n                        // there is a preview card showing the published time, we need to refresh it as well\n                        setupCard(status, status.isExpanded(), !status.isShowingContent(), statusDisplayOptions.cardViewMode(), statusDisplayOptions, listener);\n                    }\n                    break;\n                }\n            }\n        }\n    }\n\n    private void setTranslationStatus(StatusViewData.Concrete status, StatusActionListener listener) {\n        var translationViewData = status.getTranslation();\n        if (translationViewData != null) {\n            if (translationViewData instanceof TranslationViewData.Loaded) {\n                Translation translation = ((TranslationViewData.Loaded) translationViewData).getData();\n                translationStatusView.setVisibility(View.VISIBLE);\n                var langName = LocaleUtilsKt.localeNameForUntrustedISO639LangCode(translation.getDetectedSourceLanguage());\n                translationStatusView.setText(translationStatusView.getContext().getString(R.string.label_translated, langName, translation.getProvider()));\n                untranslateButton.setVisibility(View.VISIBLE);\n                untranslateButton.setOnClickListener((v) -> listener.onUntranslate(getBindingAdapterPosition()));\n            } else {\n                translationStatusView.setVisibility(View.VISIBLE);\n                translationStatusView.setText(R.string.label_translating);\n                untranslateButton.setVisibility(View.GONE);\n                untranslateButton.setOnClickListener(null);\n            }\n        } else {\n            translationStatusView.setVisibility(View.GONE);\n            untranslateButton.setVisibility(View.GONE);\n            untranslateButton.setOnClickListener(null);\n        }\n    }\n\n    protected static boolean hasPreviewableAttachment(@NonNull List<Attachment> attachments) {\n        for (Attachment attachment : attachments) {\n            if (attachment.getType() == Attachment.Type.AUDIO || attachment.getType() == Attachment.Type.UNKNOWN) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    private void setDescriptionForStatus(@NonNull StatusViewData.Concrete status,\n                                         StatusDisplayOptions statusDisplayOptions) {\n        Context context = itemView.getContext();\n        Status actionable = status.getActionable();\n\n        String description = context.getString(R.string.description_status,\n            // 1 display_name\n            actionable.getAccount().getDisplayName(),\n            // 2 CW?\n            getContentWarningDescription(context, status),\n            // 3 content?\n            (TextUtils.isEmpty(status.getSpoilerText()) || !actionable.getSensitive() || status.isExpanded() ? status.getContent() : \"\"),\n            // 4 date\n            getCreatedAtDescription(actionable.getCreatedAt(), statusDisplayOptions),\n            // 5 edited?\n            actionable.getEditedAt() != null ? context.getString(R.string.description_post_edited) : \"\",\n            // 6 reposted_by?\n            getReblogDescription(context, status),\n            // 7 username\n            actionable.getAccount().getUsername(),\n            // 8 reposted\n            actionable.getReblogged() ? context.getString(R.string.description_post_reblogged) : \"\",\n            // 9 favorited\n            actionable.getFavourited() ? context.getString(R.string.description_post_favourited) : \"\",\n            // 10 bookmarked\n            actionable.getBookmarked() ? context.getString(R.string.description_post_bookmarked) : \"\",\n            // 11 media\n            getMediaDescription(context, status),\n            // 12 visibility\n            getVisibilityDescription(context, actionable.getVisibility()),\n            // 13 fav_number\n            getFavsText(context, actionable.getFavouritesCount()),\n            // 14 reblog_number\n            getReblogsText(context, actionable.getReblogsCount()),\n            // 15 poll?\n            getPollDescription(status, context, statusDisplayOptions),\n            // 16 translated?\n            getTranslatedDescription(context, status.getTranslation())\n        );\n        itemView.setContentDescription(description);\n    }\n\n    private String getTranslatedDescription(Context context, TranslationViewData translationViewData) {\n        if (translationViewData == null) {\n            return \"\";\n        } else if (translationViewData instanceof TranslationViewData.Loading) {\n            return context.getString(R.string.label_translating);\n        } else {\n            Translation translation = ((TranslationViewData.Loaded) translationViewData).getData();\n            var langName = LocaleUtilsKt.localeNameForUntrustedISO639LangCode(translation.getDetectedSourceLanguage());\n            return context.getString(R.string.label_translated, langName, translation.getProvider());\n        }\n    }\n\n    private static CharSequence getReblogDescription(Context context,\n                                                     @NonNull StatusViewData.Concrete status) {\n        @Nullable\n        Status reblog = status.getRebloggingStatus();\n        if (reblog != null) {\n            return context\n                .getString(R.string.post_boosted_format, reblog.getAccount().getUsername());\n        } else {\n            return \"\";\n        }\n    }\n\n    private static CharSequence getMediaDescription(Context context,\n                                                    @NonNull StatusViewData.Concrete viewData) {\n        if (viewData.getAttachments().isEmpty()) {\n            return \"\";\n        }\n        StringBuilder mediaDescriptions = CollectionsKt.fold(\n            viewData.getAttachments(),\n            new StringBuilder(),\n            (builder, a) -> {\n                if (a.getDescription() == null) {\n                    String placeholder =\n                        context.getString(R.string.description_post_media_no_description_placeholder);\n                    return builder.append(placeholder);\n                } else {\n                    builder.append(\"; \");\n                    return builder.append(a.getDescription());\n                }\n            });\n        return context.getString(R.string.description_post_media, mediaDescriptions);\n    }\n\n    private static CharSequence getContentWarningDescription(Context context,\n                                                             @NonNull StatusViewData.Concrete status) {\n        if (!TextUtils.isEmpty(status.getSpoilerText())) {\n            return context.getString(R.string.description_post_cw, status.getSpoilerText());\n        } else {\n            return \"\";\n        }\n    }\n\n    @NonNull\n    protected static CharSequence getVisibilityDescription(@NonNull Context context, @Nullable Status.Visibility visibility) {\n\n        if (visibility == null) {\n            return \"\";\n        }\n\n        int resource;\n        switch (visibility) {\n            case PUBLIC:\n                resource = R.string.description_visibility_public;\n                break;\n            case UNLISTED:\n                resource = R.string.description_visibility_unlisted;\n                break;\n            case PRIVATE:\n                resource = R.string.description_visibility_private;\n                break;\n            case DIRECT:\n                resource = R.string.description_visibility_direct;\n                break;\n            default:\n                return \"\";\n        }\n        return context.getString(resource);\n    }\n\n    private CharSequence getPollDescription(@NonNull StatusViewData.Concrete status,\n                                            Context context,\n                                            StatusDisplayOptions statusDisplayOptions) {\n        PollViewData poll = PollViewDataKt.toViewData(status.getPoll());\n        if (poll == null) {\n            return \"\";\n        } else {\n            Object[] args = new CharSequence[5];\n            List<PollOptionViewData> options = poll.getOptions();\n            for (int i = 0; i < args.length; i++) {\n                if (i < options.size()) {\n                    int percent = PollViewDataKt.calculatePercent(options.get(i).getVotesCount(), poll.getVotersCount(), poll.getVotesCount());\n                    args[i] = buildDescription(options.get(i).getTitle(), percent, options.get(i).getVoted(), context, null);\n                } else {\n                    args[i] = \"\";\n                }\n            }\n            args[4] = getPollInfoText(System.currentTimeMillis(), poll, statusDisplayOptions,\n                context);\n            return context.getString(R.string.description_poll, args);\n        }\n    }\n\n    @NonNull\n    protected CharSequence getFavsText(@NonNull Context context, int count) {\n        return getMetaDataText(context, R.plurals.favs, count);\n    }\n\n    @NonNull\n    protected CharSequence getReblogsText(@NonNull Context context, int count) {\n        return getMetaDataText(context, R.plurals.reblogs, count);\n    }\n\n    private CharSequence getMetaDataText(@NonNull Context context, @PluralsRes int text, int count) {\n        String countString = numberFormat.format(count);\n        String textString = context.getResources().getQuantityString(text, count, countString);\n        SpannableStringBuilder sb = new SpannableStringBuilder(textString);\n        int countIndex = textString.indexOf(countString);\n        sb.setSpan(new StyleSpan(Typeface.BOLD), countIndex, countIndex + countString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);\n        return sb;\n    }\n\n    private void setupPoll(PollViewData poll, List<Emoji> emojis,\n                           StatusDisplayOptions statusDisplayOptions,\n                           StatusActionListener listener) {\n        long timestamp = System.currentTimeMillis();\n\n        boolean expired = poll.getExpired() || (poll.getExpiresAt() != null && timestamp > poll.getExpiresAt().getTime());\n\n        Context context = pollDescription.getContext();\n\n        pollOptions.setVisibility(View.VISIBLE);\n\n        if (expired || poll.getVoted()) {\n            // no voting possible\n            View.OnClickListener viewThreadListener = v -> {\n                int position = getBindingAdapterPosition();\n                if (position != RecyclerView.NO_POSITION) {\n                    listener.onViewThread(position);\n                }\n            };\n            pollAdapter.setup(\n                poll.getOptions(),\n                poll.getVotesCount(),\n                poll.getVotersCount(),\n                emojis,\n                PollAdapter.RESULT,\n                viewThreadListener,\n                statusDisplayOptions.animateEmojis()\n            );\n\n            pollButton.setVisibility(View.GONE);\n            pollResultsButton.setVisibility(View.GONE);\n        } else {\n            // voting possible\n            pollAdapter.setup(\n                poll.getOptions(),\n                poll.getVotesCount(),\n                poll.getVotersCount(),\n                emojis,\n                poll.getMultiple() ? PollAdapter.MULTIPLE : PollAdapter.SINGLE,\n                null,\n                statusDisplayOptions.animateEmojis()\n            );\n\n            pollButton.setVisibility(View.VISIBLE);\n            pollResultsButton.setVisibility(View.VISIBLE);\n\n            pollButton.setOnClickListener(v -> {\n\n                int position = getBindingAdapterPosition();\n\n                if (position != RecyclerView.NO_POSITION) {\n\n                    List<Integer> pollResult = pollAdapter.getSelected();\n\n                    if (!pollResult.isEmpty()) {\n                        listener.onVoteInPoll(position, pollResult);\n                    }\n                }\n\n            });\n\n            pollResultsButton.setOnClickListener(v -> {\n                int position = getBindingAdapterPosition();\n\n                if (position != RecyclerView.NO_POSITION) {\n                    listener.onShowPollResults(position);\n                }\n            });\n        }\n\n        pollDescription.setVisibility(View.VISIBLE);\n        pollDescription.setText(getPollInfoText(timestamp, poll, statusDisplayOptions, context));\n    }\n\n    private CharSequence getPollInfoText(long timestamp, PollViewData poll,\n                                         StatusDisplayOptions statusDisplayOptions,\n                                         Context context) {\n        String votesText;\n        if (poll.getVotersCount() == null) {\n            String voters = numberFormat.format(poll.getVotesCount());\n            votesText = context.getResources().getQuantityString(R.plurals.poll_info_votes, poll.getVotesCount(), voters);\n        } else {\n            String voters = numberFormat.format(poll.getVotersCount());\n            votesText = context.getResources().getQuantityString(R.plurals.poll_info_people, poll.getVotersCount(), voters);\n        }\n        CharSequence pollDurationInfo;\n        if (poll.getExpired()) {\n            pollDurationInfo = context.getString(R.string.poll_info_closed);\n        } else if (poll.getExpiresAt() == null) {\n            return votesText;\n        } else {\n            if (statusDisplayOptions.useAbsoluteTime()) {\n                pollDurationInfo = context.getString(R.string.poll_info_time_absolute, absoluteTimeFormatter.format(poll.getExpiresAt(), false));\n            } else {\n                pollDurationInfo = TimestampUtils.formatPollDuration(pollDescription.getContext(), poll.getExpiresAt().getTime(), timestamp);\n            }\n        }\n\n        return pollDescription.getContext().getString(R.string.poll_info_format, votesText, pollDurationInfo);\n    }\n\n    protected void setupCard(\n        final @NonNull StatusViewData.Concrete status,\n        boolean expanded,\n        boolean blurMedia,\n        final @NonNull CardViewMode cardViewMode,\n        final @NonNull StatusDisplayOptions statusDisplayOptions,\n        final @NonNull StatusActionListener listener\n    ) {\n        if (cardView == null) {\n            return;\n        }\n\n        final Context context = cardView.getContext();\n\n        final Status actionable = status.getActionable();\n        final PreviewCard card = actionable.getCard();\n\n        if (cardViewMode != CardViewMode.NONE &&\n            actionable.getAttachments().isEmpty() &&\n            actionable.getPoll() == null &&\n            card != null &&\n            !TextUtils.isEmpty(card.getUrl()) &&\n            (TextUtils.isEmpty(actionable.getSpoilerText()) || expanded) &&\n            (!status.isCollapsible() || !status.isCollapsed())) {\n\n            cardView.setVisibility(View.VISIBLE);\n            cardTitle.setText(card.getTitle());\n\n            String providerName = card.getProviderName();\n            if (TextUtils.isEmpty(providerName)) {\n                providerName = Uri.parse(card.getUrl()).getHost();\n            }\n\n            if (TextUtils.isEmpty(providerName)) {\n                cardMetadata.setVisibility(View.GONE);\n            } else {\n                cardMetadata.setVisibility(View.VISIBLE);\n                if (card.getPublishedAt() == null) {\n                    cardMetadata.setText(providerName);\n                } else {\n                    String metadataJoiner = context.getString(R.string.metadata_joiner);\n                    cardMetadata.setText(providerName + metadataJoiner + TimestampUtils.getRelativeTimeSpanString(context, card.getPublishedAt().getTime(), System.currentTimeMillis()));\n                }\n            }\n\n            String cardAuthorName;\n            final TimelineAccount cardAuthorAccount;\n            if (card.getAuthors().isEmpty()) {\n                cardAuthorAccount = null;\n                cardAuthorName = card.getAuthorName();\n            } else {\n                cardAuthorName = card.getAuthors().get(0).getName();\n                cardAuthorAccount = card.getAuthors().get(0).getAccount();\n                if (cardAuthorAccount != null) {\n                    cardAuthorName = cardAuthorAccount.getName();\n                }\n            }\n\n            final boolean hasNoAuthorName = TextUtils.isEmpty(cardAuthorName);\n\n            if (hasNoAuthorName && TextUtils.isEmpty(card.getDescription())) {\n                cardAuthor.setVisibility(View.GONE);\n                cardAuthorButton.setVisibility(View.GONE);\n            } else if (hasNoAuthorName) {\n                cardAuthor.setVisibility(View.VISIBLE);\n                cardAuthor.setText(card.getDescription());\n                cardAuthorButton.setVisibility(View.GONE);\n            } else if (cardAuthorAccount == null) {\n                cardAuthor.setVisibility(View.VISIBLE);\n                cardAuthor.setText(context.getString(R.string.preview_card_by_author, cardAuthorName));\n                cardAuthorButton.setVisibility(View.GONE);\n            } else {\n                cardAuthorButton.setVisibility(View.VISIBLE);\n                final String buttonText = context.getString(R.string.preview_card_more_by_author, cardAuthorName);\n                final CharSequence emojifiedButtonText = CustomEmojiHelper.emojify(buttonText, cardAuthorAccount.getEmojis(), cardAuthorButton, statusDisplayOptions.animateEmojis());\n                cardAuthorButton.setText(emojifiedButtonText);\n                cardAuthorButton.setOnClickListener(v-> listener.onViewAccount(cardAuthorAccount.getId()));\n                cardAuthor.setVisibility(View.GONE);\n            }\n\n            // Statuses from other activitypub sources can be marked sensitive even if there's no media,\n            // so let's blur the preview in that case\n            // If media previews are disabled, show placeholder for cards as well\n            if (statusDisplayOptions.mediaPreviewEnabled() && !blurMedia && !actionable.getSensitive() && !TextUtils.isEmpty(card.getImage())) {\n\n                int radius = context.getResources().getDimensionPixelSize(R.dimen.inner_card_radius);\n                ShapeAppearanceModel.Builder cardImageShape = ShapeAppearanceModel.builder();\n\n                if (card.getWidth() > card.getHeight()) {\n                    cardLayout.setOrientation(LinearLayout.VERTICAL);\n                    cardImage.getLayoutParams().height = cardImage.getContext().getResources()\n                        .getDimensionPixelSize(R.dimen.card_image_vertical_height);\n                    cardImage.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;\n                    cardImageShape.setTopLeftCorner(CornerFamily.ROUNDED, radius);\n                    cardImageShape.setTopRightCorner(CornerFamily.ROUNDED, radius);\n                } else {\n                    cardLayout.setOrientation(LinearLayout.HORIZONTAL);\n                    cardImage.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;\n                    cardImage.getLayoutParams().width = cardImage.getContext().getResources()\n                        .getDimensionPixelSize(R.dimen.card_image_horizontal_width);\n                    cardImageShape.setTopLeftCorner(CornerFamily.ROUNDED, radius);\n                    cardImageShape.setBottomLeftCorner(CornerFamily.ROUNDED, radius);\n                }\n\n                cardImage.setShapeAppearanceModel(cardImageShape.build());\n\n                cardImage.setScaleType(ImageView.ScaleType.CENTER_CROP);\n\n                RequestBuilder<Drawable> builder = Glide.with(cardImage.getContext())\n                    .load(card.getImage());\n                if (statusDisplayOptions.useBlurhash() && !TextUtils.isEmpty(card.getBlurhash())) {\n                    builder = builder.placeholder(decodeBlurHash(card.getBlurhash()));\n                }\n                builder.centerInside()\n                    .into(cardImage);\n            } else if (statusDisplayOptions.useBlurhash() && !TextUtils.isEmpty(card.getBlurhash())) {\n                int radius = cardImage.getContext().getResources()\n                    .getDimensionPixelSize(R.dimen.inner_card_radius);\n\n                cardLayout.setOrientation(LinearLayout.HORIZONTAL);\n                cardImage.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;\n                cardImage.getLayoutParams().width = cardImage.getContext().getResources()\n                    .getDimensionPixelSize(R.dimen.card_image_horizontal_width);\n\n                ShapeAppearanceModel cardImageShape = ShapeAppearanceModel.builder()\n                    .setTopLeftCorner(CornerFamily.ROUNDED, radius)\n                    .setBottomLeftCorner(CornerFamily.ROUNDED, radius)\n                    .build();\n                cardImage.setShapeAppearanceModel(cardImageShape);\n\n                cardImage.setScaleType(ImageView.ScaleType.CENTER_CROP);\n\n                Glide.with(cardImage.getContext())\n                    .load(decodeBlurHash(card.getBlurhash()))\n                    .into(cardImage);\n            } else {\n                cardLayout.setOrientation(LinearLayout.HORIZONTAL);\n                cardImage.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;\n                cardImage.getLayoutParams().width = cardImage.getContext().getResources()\n                    .getDimensionPixelSize(R.dimen.card_image_horizontal_width);\n\n                cardImage.setShapeAppearanceModel(new ShapeAppearanceModel());\n\n                cardImage.setScaleType(ImageView.ScaleType.CENTER);\n\n                Glide.with(cardImage.getContext())\n                    .load(R.drawable.card_image_placeholder)\n                    .into(cardImage);\n            }\n\n            View.OnClickListener visitLink = v -> listener.onViewUrl(card.getUrl());\n\n            cardView.setOnClickListener(visitLink);\n            // View embedded photos in our image viewer instead of opening the browser\n            cardImage.setOnClickListener(card.getType().equals(PreviewCard.TYPE_PHOTO) && !TextUtils.isEmpty(card.getEmbedUrl()) ?\n                v -> cardView.getContext().startActivity(ViewMediaActivity.newSingleImageIntent(cardView.getContext(), card.getEmbedUrl())) :\n                visitLink);\n        } else {\n            cardView.setVisibility(View.GONE);\n        }\n    }\n\n    public void showStatusContent(boolean show) {\n        int visibility = show ? View.VISIBLE : View.GONE;\n        avatar.setVisibility(visibility);\n        avatarInset.setVisibility(visibility);\n        displayName.setVisibility(visibility);\n        username.setVisibility(visibility);\n        metaInfo.setVisibility(visibility);\n        contentWarningDescription.setVisibility(visibility);\n        contentWarningButton.setVisibility(visibility);\n        content.setVisibility(visibility);\n        cardView.setVisibility(visibility);\n        mediaContainer.setVisibility(visibility);\n        pollOptions.setVisibility(visibility);\n        pollButton.setVisibility(visibility);\n        pollResultsButton.setVisibility(visibility);\n        pollDescription.setVisibility(visibility);\n        replyButton.setVisibility(visibility);\n        reblogButton.setVisibility(visibility);\n        favouriteButton.setVisibility(visibility);\n        bookmarkButton.setVisibility(visibility);\n        moreButton.setVisibility(visibility);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/adapter/StatusDetailedViewHolder.java",
    "content": "package com.keylesspalace.tusky.adapter;\n\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\nimport android.os.Build;\nimport android.text.SpannableStringBuilder;\nimport android.text.Spanned;\nimport android.text.method.LinkMovementMethod;\nimport android.text.style.DynamicDrawableSpan;\nimport android.text.style.ImageSpan;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.content.res.AppCompatResources;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.keylesspalace.tusky.R;\nimport com.keylesspalace.tusky.entity.Status;\nimport com.keylesspalace.tusky.interfaces.StatusActionListener;\nimport com.keylesspalace.tusky.util.CardViewMode;\nimport com.keylesspalace.tusky.util.LinkHelper;\nimport com.keylesspalace.tusky.util.NoUnderlineURLSpan;\nimport com.keylesspalace.tusky.util.StatusDisplayOptions;\nimport com.keylesspalace.tusky.viewdata.StatusViewData;\n\nimport java.text.DateFormat;\nimport java.util.Date;\nimport java.util.List;\n\npublic class StatusDetailedViewHolder extends StatusBaseViewHolder {\n    private final TextView reblogs;\n    private final TextView favourites;\n    private final View infoDivider;\n\n    private static final DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.SHORT);\n\n    public StatusDetailedViewHolder(@NonNull View view) {\n        super(view);\n        reblogs = view.findViewById(R.id.status_reblogs);\n        favourites = view.findViewById(R.id.status_favourites);\n        infoDivider = view.findViewById(R.id.status_info_divider);\n    }\n\n    @Override\n    protected void setMetaData(@NonNull StatusViewData.Concrete statusViewData, @NonNull StatusDisplayOptions statusDisplayOptions, @NonNull StatusActionListener listener) {\n\n        Status status = statusViewData.getActionable();\n\n        Status.Visibility visibility = status.getVisibility();\n        Context context = metaInfo.getContext();\n\n        Drawable visibilityIcon = getVisibilityIcon(visibility);\n        CharSequence visibilityString = getVisibilityDescription(context, visibility);\n\n        SpannableStringBuilder sb = new SpannableStringBuilder(visibilityString);\n\n        if (visibilityIcon != null) {\n            ImageSpan visibilityIconSpan = new ImageSpan(\n                visibilityIcon,\n                Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q ? DynamicDrawableSpan.ALIGN_CENTER : DynamicDrawableSpan.ALIGN_BASELINE\n            );\n            sb.setSpan(visibilityIconSpan, 0, visibilityString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);\n        }\n\n        String metadataJoiner = context.getString(R.string.metadata_joiner);\n\n        Date createdAt = status.getCreatedAt();\n        if (createdAt != null) {\n            sb.append(\" \");\n            sb.append(dateFormat.format(createdAt));\n        }\n\n        Date editedAt = status.getEditedAt();\n\n        if (editedAt != null) {\n            String editedAtString = context.getString(R.string.post_edited, dateFormat.format(editedAt));\n\n            sb.append(metadataJoiner);\n            int spanStart = sb.length();\n            int spanEnd = spanStart + editedAtString.length();\n\n            sb.append(editedAtString);\n\n            if (statusViewData.getStatus().getEditedAt() != null) {\n                NoUnderlineURLSpan editedClickSpan = new NoUnderlineURLSpan(\"\") {\n                    @Override\n                    public void onClick(@NonNull View view) {\n                        listener.onShowEdits(getBindingAdapterPosition());\n                    }\n                };\n\n                sb.setSpan(editedClickSpan, spanStart, spanEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);\n            }\n        }\n\n        String language = status.getLanguage();\n\n        if (language != null) {\n            sb.append(metadataJoiner);\n            sb.append(language.toUpperCase());\n        }\n\n        Status.Application app = status.getApplication();\n\n        if (app != null) {\n            sb.append(metadataJoiner);\n\n            if (app.getWebsite() != null) {\n                CharSequence text = LinkHelper.createClickableText(app.getName(), app.getWebsite());\n                sb.append(text);\n            } else {\n                sb.append(app.getName());\n            }\n        }\n\n        metaInfo.setMovementMethod(LinkMovementMethod.getInstance());\n        metaInfo.setText(sb);\n    }\n\n    private void setReblogAndFavCount(int reblogCount, int favCount, StatusActionListener listener) {\n        reblogs.setText(getReblogsText(reblogs.getContext(), reblogCount));\n        favourites.setText(getFavsText(favourites.getContext(), favCount));\n\n        reblogs.setOnClickListener(v -> {\n            int position = getBindingAdapterPosition();\n            if (position != RecyclerView.NO_POSITION) {\n                listener.onShowReblogs(position);\n            }\n        });\n        favourites.setOnClickListener(v -> {\n            int position = getBindingAdapterPosition();\n            if (position != RecyclerView.NO_POSITION) {\n                listener.onShowFavs(position);\n            }\n        });\n    }\n\n    @Override\n    public void setupWithStatus(@NonNull final StatusViewData.Concrete status,\n                                @NonNull final StatusActionListener listener,\n                                @NonNull StatusDisplayOptions statusDisplayOptions,\n                                @NonNull List<Object> payloads,\n                                final boolean showStatusInfo) {\n        // We never collapse statuses in the detail view\n        StatusViewData.Concrete uncollapsedStatus = (status.isCollapsible() && status.isCollapsed()) ?\n            status.copyWithCollapsed(false) :\n            status;\n\n        super.setupWithStatus(uncollapsedStatus, listener, statusDisplayOptions, payloads, showStatusInfo);\n        setupCard(uncollapsedStatus, status.isExpanded(), !status.isShowingContent(), CardViewMode.FULL_WIDTH, statusDisplayOptions, listener); // Always show card for detailed status\n        if (payloads.isEmpty()) {\n            Status actionable = uncollapsedStatus.getActionable();\n\n            if (!statusDisplayOptions.hideStats()) {\n                setReblogAndFavCount(actionable.getReblogsCount(),\n                    actionable.getFavouritesCount(), listener);\n            } else {\n                hideQuantitativeStats();\n            }\n        }\n    }\n\n    private @Nullable Drawable getVisibilityIcon(@Nullable Status.Visibility visibility) {\n\n        if (visibility == null) {\n            return null;\n        }\n\n        int visibilityIcon;\n        switch (visibility) {\n            case PUBLIC:\n                visibilityIcon = R.drawable.ic_public_24dp;\n                break;\n            case UNLISTED:\n                visibilityIcon = R.drawable.ic_lock_open_24dp;\n                break;\n            case PRIVATE:\n                visibilityIcon = R.drawable.ic_lock_24dp;\n                break;\n            case DIRECT:\n                visibilityIcon = R.drawable.ic_mail_24dp;\n                break;\n            default:\n                return null;\n        }\n\n        final Drawable visibilityDrawable = AppCompatResources.getDrawable(\n            this.metaInfo.getContext(), visibilityIcon\n        );\n        if (visibilityDrawable == null) {\n            return null;\n        }\n\n        final int size = (int) this.metaInfo.getTextSize();\n        visibilityDrawable.setBounds(\n            0,\n            0,\n            size,\n            size\n        );\n        visibilityDrawable.setTint(this.metaInfo.getCurrentTextColor());\n\n        return visibilityDrawable;\n    }\n\n    private void hideQuantitativeStats() {\n        reblogs.setVisibility(View.GONE);\n        favourites.setVisibility(View.GONE);\n        infoDivider.setVisibility(View.GONE);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/adapter/StatusViewHolder.java",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.adapter;\n\nimport android.content.Context;\nimport android.text.InputFilter;\nimport android.text.TextUtils;\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.keylesspalace.tusky.R;\nimport com.keylesspalace.tusky.entity.Filter;\nimport com.keylesspalace.tusky.entity.Status;\nimport com.keylesspalace.tusky.entity.TimelineAccount;\nimport com.keylesspalace.tusky.interfaces.StatusActionListener;\nimport com.keylesspalace.tusky.util.CustomEmojiHelper;\nimport com.keylesspalace.tusky.util.NumberUtils;\nimport com.keylesspalace.tusky.util.SmartLengthInputFilter;\nimport com.keylesspalace.tusky.util.StatusDisplayOptions;\nimport com.keylesspalace.tusky.util.StringUtils;\nimport com.keylesspalace.tusky.viewdata.StatusViewData;\n\nimport java.util.Collections;\nimport java.util.List;\n\npublic class StatusViewHolder extends StatusBaseViewHolder {\n    private static final InputFilter[] COLLAPSE_INPUT_FILTER = new InputFilter[]{SmartLengthInputFilter.INSTANCE};\n    private static final InputFilter[] NO_INPUT_FILTER = new InputFilter[0];\n\n    private final TextView statusInfo;\n    private final Button contentCollapseButton;\n    private final TextView favouritedCountLabel;\n    private final TextView reblogsCountLabel;\n\n    public StatusViewHolder(@NonNull View itemView) {\n        super(itemView);\n        statusInfo = itemView.findViewById(R.id.status_info);\n        contentCollapseButton = itemView.findViewById(R.id.button_toggle_content);\n        favouritedCountLabel = itemView.findViewById(R.id.status_favourites_count);\n        reblogsCountLabel = itemView.findViewById(R.id.status_insets);\n    }\n\n    @Override\n    public void setupWithStatus(@NonNull StatusViewData.Concrete status,\n                                @NonNull final StatusActionListener listener,\n                                @NonNull StatusDisplayOptions statusDisplayOptions,\n                                @NonNull List<Object> payloads,\n                                final boolean showStatusInfo) {\n        if (payloads.isEmpty()) {\n            boolean sensitive = !TextUtils.isEmpty(status.getActionable().getSpoilerText());\n            boolean expanded = status.isExpanded();\n\n            setupCollapsedState(sensitive, expanded, status, listener);\n\n            if (!showStatusInfo || (status.getFilter() != null && status.getFilter().getAction() == Filter.Action.WARN)) {\n                hideStatusInfo();\n            } else {\n                Status rebloggingStatus = status.getRebloggingStatus();\n                boolean isReplyOnly = rebloggingStatus == null && status.isReply();\n                boolean isReplySelf = isReplyOnly && status.isSelfReply();\n\n                boolean hasStatusInfo = rebloggingStatus != null | isReplyOnly;\n\n                TimelineAccount statusInfoAccount = rebloggingStatus != null ? rebloggingStatus.getAccount() : status.getRepliedToAccount();\n\n                if (!hasStatusInfo) {\n                    hideStatusInfo();\n                } else {\n                    setStatusInfoContent(statusInfoAccount, isReplyOnly, isReplySelf, statusDisplayOptions);\n                }\n\n                if (isReplyOnly) {\n                    statusInfo.setOnClickListener(null);\n                } else {\n                    statusInfo.setOnClickListener(v -> listener.onOpenReblog(getBindingAdapterPosition()));\n                }\n            }\n        }\n\n        reblogsCountLabel.setVisibility(statusDisplayOptions.showStatsInline() ? View.VISIBLE : View.INVISIBLE);\n        favouritedCountLabel.setVisibility(statusDisplayOptions.showStatsInline() ? View.VISIBLE : View.INVISIBLE);\n        setFavouritedCount(status.getActionable().getFavouritesCount());\n        setReblogsCount(status.getActionable().getReblogsCount());\n\n        super.setupWithStatus(status, listener, statusDisplayOptions, payloads, showStatusInfo);\n    }\n\n    private void setStatusInfoContent(final TimelineAccount account,\n                                      final boolean isReply,\n                                      final boolean isSelfReply,\n                                      final StatusDisplayOptions statusDisplayOptions) {\n        Context context = statusInfo.getContext();\n        CharSequence accountName = account != null ? account.getName() : \"\";\n        CharSequence wrappedName = StringUtils.unicodeWrap(accountName);\n        CharSequence translatedText = \"\";\n\n        if (!isReply) {\n            translatedText = context.getString(R.string.post_boosted_format, wrappedName);\n        } else if (isSelfReply) {\n            translatedText = context.getString(R.string.post_replied_self);\n        } else {\n            if (account != null && accountName.length() > 0) {\n                translatedText = context.getString(R.string.post_replied_format, wrappedName);\n            } else {\n                translatedText = context.getString(R.string.post_replied);\n            }\n        }\n\n        CharSequence emojifiedText = CustomEmojiHelper.emojify(\n            translatedText,\n            account != null ? account.getEmojis() : Collections.emptyList(),\n            statusInfo,\n            statusDisplayOptions.animateEmojis()\n        );\n        statusInfo.setText(emojifiedText);\n        statusInfo.setCompoundDrawablesWithIntrinsicBounds(isReply ? R.drawable.ic_reply_18dp : R.drawable.ic_repeat_18dp, 0, 0, 0);\n        statusInfo.setVisibility(View.VISIBLE);\n    }\n\n    protected void setReblogsCount(int reblogsCount) {\n        reblogsCountLabel.setText(NumberUtils.formatNumber(reblogsCount, 1000));\n    }\n\n    protected void setFavouritedCount(int favouritedCount) {\n        favouritedCountLabel.setText(NumberUtils.formatNumber(favouritedCount, 1000));\n    }\n\n    protected void hideStatusInfo() {\n        statusInfo.setVisibility(View.GONE);\n    }\n\n    protected @NonNull TextView getStatusInfo() {\n        return statusInfo;\n    }\n\n    private void setupCollapsedState(boolean sensitive,\n                                     boolean expanded,\n                                     final StatusViewData.Concrete status,\n                                     final StatusActionListener listener) {\n        /* input filter for TextViews have to be set before text */\n        if (status.isCollapsible() && (!sensitive || expanded)) {\n            contentCollapseButton.setOnClickListener(view -> {\n                int position = getBindingAdapterPosition();\n                if (position != RecyclerView.NO_POSITION)\n                    listener.onContentCollapsedChange(!status.isCollapsed(), position);\n            });\n\n            contentCollapseButton.setVisibility(View.VISIBLE);\n            if (status.isCollapsed()) {\n                contentCollapseButton.setText(R.string.post_content_warning_show_more);\n                content.setFilters(COLLAPSE_INPUT_FILTER);\n            } else {\n                contentCollapseButton.setText(R.string.post_content_warning_show_less);\n                content.setFilters(NO_INPUT_FILTER);\n            }\n        } else {\n            contentCollapseButton.setVisibility(View.GONE);\n            content.setFilters(NO_INPUT_FILTER);\n        }\n    }\n\n    public void showStatusContent(boolean show) {\n        super.showStatusContent(show);\n        contentCollapseButton.setVisibility(show ? View.VISIBLE : View.GONE);\n    }\n\n    @Override\n    protected void toggleExpandedState(boolean sensitive,\n                                       boolean expanded,\n                                       @NonNull StatusViewData.Concrete status,\n                                       @NonNull StatusDisplayOptions statusDisplayOptions,\n                                       @NonNull final StatusActionListener listener) {\n\n        setupCollapsedState(sensitive, expanded, status, listener);\n\n        super.toggleExpandedState(sensitive, expanded, status, statusDisplayOptions, listener);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/adapter/TabAdapter.kt",
    "content": "/* Copyright 2019 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.adapter\n\nimport android.view.LayoutInflater\nimport android.view.MotionEvent\nimport android.view.ViewGroup\nimport androidx.core.view.size\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.viewbinding.ViewBinding\nimport com.google.android.material.chip.Chip\nimport com.keylesspalace.tusky.HASHTAG\nimport com.keylesspalace.tusky.LIST\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.TabData\nimport com.keylesspalace.tusky.databinding.ItemTabPreferenceBinding\nimport com.keylesspalace.tusky.databinding.ItemTabPreferenceSmallBinding\nimport com.keylesspalace.tusky.util.BindingHolder\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.setDrawableTint\nimport com.keylesspalace.tusky.util.show\n\ninterface ItemInteractionListener {\n    fun onTabAdded(tab: TabData)\n    fun onTabRemoved(position: Int)\n    fun onStartDelete(viewHolder: RecyclerView.ViewHolder)\n    fun onStartDrag(viewHolder: RecyclerView.ViewHolder)\n    fun onActionChipClicked(tab: TabData, tabPosition: Int)\n    fun onChipClicked(tab: TabData, tabPosition: Int, chipPosition: Int)\n}\n\nclass TabAdapter(\n    private var data: List<TabData>,\n    private val small: Boolean,\n    private val listener: ItemInteractionListener,\n    private var removeButtonEnabled: Boolean = false\n) : RecyclerView.Adapter<BindingHolder<ViewBinding>>() {\n\n    fun updateData(newData: List<TabData>) {\n        this.data = newData\n        notifyDataSetChanged()\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ViewBinding> {\n        val binding = if (small) {\n            ItemTabPreferenceSmallBinding.inflate(\n                LayoutInflater.from(parent.context),\n                parent,\n                false\n            )\n        } else {\n            ItemTabPreferenceBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n        }\n        return BindingHolder(binding)\n    }\n\n    override fun onBindViewHolder(holder: BindingHolder<ViewBinding>, position: Int) {\n        val context = holder.itemView.context\n        val tab = data[position]\n\n        if (small) {\n            val binding = holder.binding as ItemTabPreferenceSmallBinding\n\n            binding.textView.setText(tab.text)\n\n            binding.textView.setCompoundDrawablesRelativeWithIntrinsicBounds(tab.icon, 0, 0, 0)\n\n            binding.textView.setOnClickListener {\n                listener.onTabAdded(tab)\n            }\n        } else {\n            val binding = holder.binding as ItemTabPreferenceBinding\n\n            if (tab.id == LIST) {\n                binding.textView.text = tab.arguments.getOrNull(1).orEmpty()\n            } else {\n                binding.textView.setText(tab.text)\n            }\n\n            binding.textView.setCompoundDrawablesRelativeWithIntrinsicBounds(tab.icon, 0, 0, 0)\n\n            binding.imageView.setOnTouchListener { _, event ->\n                if (event.action == MotionEvent.ACTION_DOWN) {\n                    listener.onStartDrag(holder)\n                    true\n                } else {\n                    false\n                }\n            }\n            binding.removeButton.setOnClickListener {\n                listener.onTabRemoved(holder.bindingAdapterPosition)\n            }\n            binding.removeButton.isEnabled = removeButtonEnabled\n            setDrawableTint(\n                holder.itemView.context,\n                binding.removeButton.drawable,\n                (if (removeButtonEnabled) android.R.attr.textColorTertiary else R.attr.textColorDisabled)\n            )\n\n            if (tab.id == HASHTAG) {\n                binding.chipGroup.show()\n\n                /*\n                 * The chip group will always contain the actionChip (it is defined in the xml layout).\n                 * The other dynamic chips are inserted in front of the actionChip.\n                 * This code tries to reuse already added chips to reduce the number of Views created.\n                 */\n                tab.arguments.forEachIndexed { i, arg ->\n\n                    val chip = binding.chipGroup.getChildAt(i).takeUnless { it.id == R.id.actionChip } as Chip?\n                        ?: Chip(context).apply {\n                            setCloseIconResource(R.drawable.ic_cancel_24dp_filled)\n                            isCheckable = false\n                            binding.chipGroup.addView(this, binding.chipGroup.size - 1)\n                        }\n\n                    chip.text = arg\n\n                    if (tab.arguments.size <= 1) {\n                        chip.isCloseIconVisible = false\n                        chip.setOnClickListener(null)\n                    } else {\n                        chip.isCloseIconVisible = true\n                        chip.setOnClickListener {\n                            listener.onChipClicked(tab, holder.bindingAdapterPosition, i)\n                        }\n                    }\n                }\n\n                while (binding.chipGroup.size - 1 > tab.arguments.size) {\n                    binding.chipGroup.removeViewAt(tab.arguments.size)\n                }\n\n                binding.actionChip.setOnClickListener {\n                    listener.onActionChipClicked(tab, holder.bindingAdapterPosition)\n                }\n            } else {\n                binding.chipGroup.hide()\n            }\n        }\n    }\n\n    override fun getItemCount() = data.size\n\n    fun setRemoveButtonVisible(enabled: Boolean) {\n        if (removeButtonEnabled != enabled) {\n            removeButtonEnabled = enabled\n            notifyDataSetChanged()\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/appstore/CacheUpdater.kt",
    "content": "package com.keylesspalace.tusky.appstore\n\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.squareup.moshi.Moshi\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.launch\n\n/**\n * Updates the database cache in response to events.\n * This is important for the home timeline and notifications to be up to date.\n */\nclass CacheUpdater @Inject constructor(\n    eventHub: EventHub,\n    accountManager: AccountManager,\n    appDatabase: AppDatabase,\n    moshi: Moshi\n) {\n\n    private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())\n\n    private val timelineDao = appDatabase.timelineDao()\n    private val statusDao = appDatabase.timelineStatusDao()\n    private val notificationsDao = appDatabase.notificationsDao()\n\n    init {\n        scope.launch {\n            eventHub.events.collect { event ->\n                val tuskyAccountId = accountManager.activeAccount?.id ?: return@collect\n                when (event) {\n                    is StatusChangedEvent -> statusDao.update(tuskyAccountId = tuskyAccountId, status = event.status)\n                    is UnfollowEvent -> timelineDao.removeStatusesAndReblogsByUser(tuskyAccountId, event.accountId)\n                    is BlockEvent -> removeAllByUser(tuskyAccountId, event.accountId)\n                    is MuteEvent -> removeAllByUser(tuskyAccountId, event.accountId)\n\n                    is DomainMuteEvent -> {\n                        timelineDao.deleteAllFromInstance(tuskyAccountId, event.instance)\n                        notificationsDao.deleteAllFromInstance(tuskyAccountId, event.instance)\n                    }\n\n                    is StatusDeletedEvent -> {\n                        timelineDao.deleteAllWithStatus(tuskyAccountId, event.statusId)\n                        notificationsDao.deleteAllWithStatus(tuskyAccountId, event.statusId)\n                    }\n\n                    is PollVoteEvent -> statusDao.setVoted(tuskyAccountId, event.statusId, event.poll)\n                    is PollShowResultsEvent -> statusDao.setShowResults(tuskyAccountId, event.statusId)\n                }\n            }\n        }\n    }\n\n    private suspend fun removeAllByUser(tuskyAccountId: Long, accountId: String) {\n        timelineDao.removeAllByUser(tuskyAccountId, accountId)\n        notificationsDao.removeAllByUser(tuskyAccountId, accountId)\n    }\n\n    fun stop() {\n        this.scope.cancel()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/appstore/Events.kt",
    "content": "package com.keylesspalace.tusky.appstore\n\nimport com.keylesspalace.tusky.entity.Account\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.entity.Poll\nimport com.keylesspalace.tusky.entity.Status\n\ndata class StatusChangedEvent(val status: Status) : Event\ndata class UnfollowEvent(val accountId: String) : Event\ndata class BlockEvent(val accountId: String) : Event\ndata class MuteEvent(val accountId: String) : Event\ndata class StatusDeletedEvent(val statusId: String) : Event\ndata class StatusComposedEvent(val status: Status) : Event\ndata class StatusScheduledEvent(val scheduledStatusId: String) : Event\ndata class ProfileEditedEvent(val newProfileData: Account) : Event\ndata class PreferenceChangedEvent(val preferenceKey: String) : Event\ndata class PollVoteEvent(val statusId: String, val poll: Poll) : Event\ndata class PollShowResultsEvent(val statusId: String) : Event\ndata class DomainMuteEvent(val instance: String) : Event\ndata class AnnouncementReadEvent(val announcementId: String) : Event\ndata class FilterUpdatedEvent(val filterContext: List<Filter.Kind>) : Event\ndata class NewNotificationsEvent(\n    val accountId: String,\n    val notifications: List<Notification>\n) : Event\ndata class ConversationsLoadingEvent(val accountId: String) : Event\ndata class NotificationsLoadingEvent(val accountId: String) : Event\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/appstore/EventsHub.kt",
    "content": "package com.keylesspalace.tusky.appstore\n\nimport javax.inject.Inject\nimport javax.inject.Singleton\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.SharedFlow\nimport kotlinx.coroutines.flow.asSharedFlow\n\ninterface Event\n\n@Singleton\nclass EventHub @Inject constructor() {\n\n    private val _events = MutableSharedFlow<Event>()\n    val events: SharedFlow<Event> = _events.asSharedFlow()\n\n    suspend fun dispatch(event: Event) {\n        _events.emit(event)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/account/AccountActivity.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.account\n\nimport android.animation.ArgbEvaluator\nimport android.content.Context\nimport android.content.Intent\nimport android.content.res.ColorStateList\nimport android.graphics.Color\nimport android.graphics.Typeface\nimport android.os.Build\nimport android.os.Bundle\nimport android.text.SpannableStringBuilder\nimport android.text.TextWatcher\nimport android.text.style.StyleSpan\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.activity.viewModels\nimport androidx.annotation.ColorInt\nimport androidx.annotation.DrawableRes\nimport androidx.annotation.Px\nimport androidx.appcompat.content.res.AppCompatResources\nimport androidx.core.app.ActivityOptionsCompat\nimport androidx.core.graphics.ColorUtils\nimport androidx.core.graphics.toColorInt\nimport androidx.core.view.MenuProvider\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowCompat\nimport androidx.core.view.WindowInsetsCompat.Type.systemBars\nimport androidx.core.view.updateLayoutParams\nimport androidx.core.view.updatePadding\nimport androidx.core.widget.doAfterTextChanged\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.viewpager2.widget.MarginPageTransformer\nimport com.bumptech.glide.Glide\nimport com.google.android.material.R as materialR\nimport com.google.android.material.appbar.AppBarLayout\nimport com.google.android.material.chip.Chip\nimport com.google.android.material.color.MaterialColors\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.android.material.floatingactionbutton.FloatingActionButton\nimport com.google.android.material.shape.MaterialShapeDrawable\nimport com.google.android.material.shape.ShapeAppearanceModel\nimport com.google.android.material.snackbar.Snackbar\nimport com.google.android.material.tabs.TabLayout\nimport com.google.android.material.tabs.TabLayoutMediator\nimport com.keylesspalace.tusky.BottomSheetActivity\nimport com.keylesspalace.tusky.EditProfileActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.StatusListActivity\nimport com.keylesspalace.tusky.ViewMediaActivity\nimport com.keylesspalace.tusky.components.account.list.ListSelectionFragment\nimport com.keylesspalace.tusky.components.accountlist.AccountListActivity\nimport com.keylesspalace.tusky.components.compose.ComposeActivity\nimport com.keylesspalace.tusky.components.report.ReportActivity\nimport com.keylesspalace.tusky.databinding.ActivityAccountBinding\nimport com.keylesspalace.tusky.db.DraftsAlert\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.entity.Account\nimport com.keylesspalace.tusky.entity.Relationship\nimport com.keylesspalace.tusky.interfaces.AccountSelectionListener\nimport com.keylesspalace.tusky.interfaces.ActionButtonActivity\nimport com.keylesspalace.tusky.interfaces.LinkListener\nimport com.keylesspalace.tusky.interfaces.ReselectableFragment\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.util.Error\nimport com.keylesspalace.tusky.util.Loading\nimport com.keylesspalace.tusky.util.Success\nimport com.keylesspalace.tusky.util.copyToClipboard\nimport com.keylesspalace.tusky.util.emojify\nimport com.keylesspalace.tusky.util.ensureBottomMargin\nimport com.keylesspalace.tusky.util.getDomain\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.loadAvatar\nimport com.keylesspalace.tusky.util.parseAsMastodonHtml\nimport com.keylesspalace.tusky.util.reduceSwipeSensitivity\nimport com.keylesspalace.tusky.util.setClickableText\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.util.visible\nimport com.keylesspalace.tusky.view.showMuteAccountDialog\nimport dagger.hilt.android.AndroidEntryPoint\nimport java.text.NumberFormat\nimport java.text.ParseException\nimport java.text.SimpleDateFormat\nimport java.util.Locale\nimport javax.inject.Inject\nimport kotlin.math.abs\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass AccountActivity : BottomSheetActivity(), ActionButtonActivity, MenuProvider, LinkListener {\n\n    @Inject\n    lateinit var draftsAlert: DraftsAlert\n\n    private val viewModel: AccountViewModel by viewModels()\n\n    private val binding: ActivityAccountBinding by viewBinding(ActivityAccountBinding::inflate)\n\n    private lateinit var accountFieldAdapter: AccountFieldAdapter\n\n    private var followState: FollowState = FollowState.NOT_FOLLOWING\n    private var blocking: Boolean = false\n    private var muting: Boolean = false\n    private var blockingDomain: Boolean = false\n    private var showingReblogs: Boolean = false\n    private var subscribing: Boolean = false\n    private var loadedAccount: Account? = null\n\n    private var animateAvatar: Boolean = false\n    private var animateEmojis: Boolean = false\n\n    // for scroll animation\n    private var oldOffset: Int = 0\n\n    @ColorInt\n    private var toolbarColor: Int = 0\n\n    @ColorInt\n    private var statusBarColorTransparent: Int = 0\n\n    @ColorInt\n    private var statusBarColorOpaque: Int = 0\n\n    private var avatarSize: Float = 0f\n\n    @Px\n    private var titleVisibleHeight: Int = 0\n    private lateinit var domain: String\n\n    private enum class FollowState {\n        NOT_FOLLOWING,\n        FOLLOWING,\n        REQUESTED\n    }\n\n    private lateinit var adapter: AccountPagerAdapter\n\n    private var noteWatcher: TextWatcher? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        loadResources()\n        makeNotificationBarTransparent()\n        setContentView(binding.root)\n        addMenuProvider(this)\n\n        // Obtain information to fill out the profile.\n        viewModel.setAccountInfo(intent.getStringExtra(KEY_ACCOUNT_ID)!!)\n\n        animateAvatar = preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false)\n        animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false)\n\n        handleWindowInsets()\n        setupToolbar()\n        setupTabs()\n        setupAccountViews()\n        setupRefreshLayout()\n        subscribeObservables()\n\n        if (viewModel.isSelf) {\n            updateButtons()\n            binding.saveNoteInfo.hide()\n        } else {\n            binding.saveNoteInfo.visibility = View.INVISIBLE\n        }\n    }\n\n    /**\n     * Load colors and dimensions from resources\n     */\n    private fun loadResources() {\n        toolbarColor = MaterialColors.getColor(binding.accountToolbar, materialR.attr.colorSurface)\n        statusBarColorTransparent = getColor(R.color.transparent_statusbar_background)\n        statusBarColorOpaque = MaterialColors.getColor(binding.accountToolbar, materialR.attr.colorPrimaryDark)\n        avatarSize = resources.getDimension(R.dimen.account_activity_avatar_size)\n        titleVisibleHeight = resources.getDimensionPixelSize(R.dimen.account_activity_scroll_title_visible_height)\n    }\n\n    /**\n     * Setup account widgets visibility and actions\n     */\n    private fun setupAccountViews() {\n        // Initialise the default UI states.\n        binding.accountFloatingActionButton.hide()\n        binding.accountFollowButton.hide()\n        binding.accountMuteButton.hide()\n        binding.accountFollowsYouTextView.hide()\n\n        // setup the RecyclerView for the account fields\n        accountFieldAdapter = AccountFieldAdapter(this, animateEmojis)\n        binding.accountFieldList.isNestedScrollingEnabled = false\n        binding.accountFieldList.layoutManager = LinearLayoutManager(this)\n        binding.accountFieldList.adapter = accountFieldAdapter\n\n        val accountListClickListener = { v: View ->\n            val type = when (v.id) {\n                R.id.accountFollowers -> AccountListActivity.Type.FOLLOWERS\n                R.id.accountFollowing -> AccountListActivity.Type.FOLLOWS\n                else -> throw AssertionError()\n            }\n            val accountListIntent = AccountListActivity.newIntent(this, type, viewModel.accountId)\n            startActivityWithSlideInAnimation(accountListIntent)\n        }\n        binding.accountFollowers.setOnClickListener(accountListClickListener)\n        binding.accountFollowing.setOnClickListener(accountListClickListener)\n\n        binding.accountStatuses.setOnClickListener {\n            // Make nice ripple effect on tab\n            binding.accountTabLayout.getTabAt(0)!!.select()\n            val poorTabView = (binding.accountTabLayout.getChildAt(0) as ViewGroup).getChildAt(0)\n            poorTabView.isPressed = true\n            binding.accountTabLayout.postDelayed({ poorTabView.isPressed = false }, 300)\n        }\n\n        // If wellbeing mode is enabled, follow stats and posts count should be hidden\n        val wellbeingEnabled = preferences.getBoolean(PrefKeys.WELLBEING_HIDE_STATS_PROFILE, false)\n\n        if (wellbeingEnabled) {\n            binding.accountStatuses.hide()\n            binding.accountFollowers.hide()\n            binding.accountFollowing.hide()\n        }\n    }\n\n    /**\n     * Init timeline tabs\n     */\n    private fun setupTabs() {\n        // Setup the tabs and timeline pager.\n        adapter = AccountPagerAdapter(this, viewModel.accountId)\n\n        binding.accountFragmentViewPager.reduceSwipeSensitivity()\n        binding.accountFragmentViewPager.adapter = adapter\n        binding.accountFragmentViewPager.offscreenPageLimit = 2\n\n        val pageTitles =\n            arrayOf(\n                getString(R.string.title_posts),\n                getString(R.string.title_posts_with_replies),\n                getString(R.string.title_posts_pinned),\n                getString(R.string.title_media)\n            )\n\n        TabLayoutMediator(\n            binding.accountTabLayout,\n            binding.accountFragmentViewPager\n        ) { tab, position ->\n            tab.text = pageTitles[position]\n        }.attach()\n\n        val pageMargin = resources.getDimensionPixelSize(R.dimen.tab_page_margin)\n        binding.accountFragmentViewPager.setPageTransformer(MarginPageTransformer(pageMargin))\n\n        val enableSwipeForTabs = preferences.getBoolean(PrefKeys.ENABLE_SWIPE_FOR_TABS, true)\n        binding.accountFragmentViewPager.isUserInputEnabled = enableSwipeForTabs\n\n        binding.accountTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {\n            override fun onTabReselected(tab: TabLayout.Tab?) {\n                tab?.position?.let { position ->\n                    (adapter.getFragment(position) as? ReselectableFragment)?.onReselect()\n                }\n            }\n\n            override fun onTabUnselected(tab: TabLayout.Tab?) {}\n\n            override fun onTabSelected(tab: TabLayout.Tab?) {}\n        })\n    }\n\n    private fun handleWindowInsets() {\n        binding.accountFloatingActionButton.ensureBottomMargin()\n        ViewCompat.setOnApplyWindowInsetsListener(binding.accountCoordinatorLayout) { _, insets ->\n            val systemBarInsets = insets.getInsets(systemBars())\n            val top = systemBarInsets.top\n\n            binding.accountToolbar.updateLayoutParams<ViewGroup.MarginLayoutParams> {\n                topMargin = top\n            }\n\n            binding.swipeToRefreshLayout.setProgressViewEndTarget(\n                false,\n                top + resources.getDimensionPixelSize(R.dimen.account_swiperefresh_distance)\n            )\n\n            insets.inset(0, top, 0, 0)\n        }\n    }\n\n    private fun setupToolbar() {\n        // Setup the toolbar.\n        setSupportActionBar(binding.accountToolbar)\n        supportActionBar?.run {\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n            setDisplayShowTitleEnabled(false)\n        }\n\n        binding.accountToolbar.setBackgroundColor(Color.TRANSPARENT)\n\n        binding.accountToolbar.setNavigationIcon(R.drawable.toolbar_icon_arrow_back_with_background)\n        binding.accountToolbar.overflowIcon = AppCompatResources.getDrawable(this, R.drawable.toolbar_icon_more_with_background)\n\n        val avatarBackground = MaterialShapeDrawable().apply {\n            fillColor = ColorStateList.valueOf(toolbarColor)\n            shapeAppearanceModel = ShapeAppearanceModel.builder()\n                .setAllCornerSizes(resources.getDimension(R.dimen.account_avatar_background_radius))\n                .build()\n        }\n        binding.accountAvatarImageView.background = avatarBackground\n\n        // Add a listener to change the toolbar icon color when it enters/exits its collapsed state.\n        binding.accountAppBarLayout.addOnOffsetChangedListener(object : AppBarLayout.OnOffsetChangedListener {\n\n            override fun onOffsetChanged(appBarLayout: AppBarLayout, verticalOffset: Int) {\n                if (verticalOffset == oldOffset) {\n                    return\n                }\n                oldOffset = verticalOffset\n\n                if (titleVisibleHeight + verticalOffset < 0) {\n                    supportActionBar?.setDisplayShowTitleEnabled(true)\n                } else {\n                    supportActionBar?.setDisplayShowTitleEnabled(false)\n                }\n\n                val scaledAvatarSize = (avatarSize + verticalOffset) / avatarSize\n\n                binding.accountAvatarImageView.scaleX = scaledAvatarSize\n                binding.accountAvatarImageView.scaleY = scaledAvatarSize\n\n                binding.accountAvatarImageView.visible(scaledAvatarSize > 0)\n\n                val transparencyPercent = (abs(verticalOffset) / titleVisibleHeight.toFloat()).coerceAtMost(\n                    1f\n                )\n\n                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.VANILLA_ICE_CREAM) {\n                    @Suppress(\"DEPRECATION\")\n                    window.statusBarColor = argbEvaluator.evaluate(transparencyPercent, statusBarColorTransparent, statusBarColorOpaque) as Int\n                }\n\n                val evaluatedToolbarColor = argbEvaluator.evaluate(\n                    transparencyPercent,\n                    Color.TRANSPARENT,\n                    toolbarColor\n                ) as Int\n\n                binding.accountToolbar.setBackgroundColor(evaluatedToolbarColor)\n                binding.accountStatusBarScrim.setBackgroundColor(evaluatedToolbarColor)\n\n                binding.swipeToRefreshLayout.isEnabled = verticalOffset == 0\n            }\n        })\n    }\n\n    private fun makeNotificationBarTransparent() {\n        WindowCompat.setDecorFitsSystemWindows(window, false)\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.VANILLA_ICE_CREAM) {\n            @Suppress(\"DEPRECATION\")\n            window.statusBarColor = statusBarColorTransparent\n        }\n    }\n\n    /**\n     * Subscribe to data loaded at the view model\n     */\n    private fun subscribeObservables() {\n        lifecycleScope.launch {\n            viewModel.accountData.collect {\n                if (it == null) return@collect\n                when (it) {\n                    is Success -> {\n                        onAccountChanged(it.data)\n                        binding.swipeToRefreshLayout.isEnabled = true\n                    }\n                    is Error -> {\n                        Snackbar.make(\n                            binding.accountCoordinatorLayout,\n                            R.string.error_generic,\n                            Snackbar.LENGTH_LONG\n                        )\n                            .setAction(R.string.action_retry) { viewModel.refresh() }\n                            .show()\n                        binding.swipeToRefreshLayout.isEnabled = true\n                    }\n                    is Loading -> { }\n                }\n            }\n        }\n        lifecycleScope.launch {\n            viewModel.relationshipData.collect {\n                val relation = it?.data\n                if (relation != null) {\n                    onRelationshipChanged(relation)\n                }\n\n                if (it is Error) {\n                    Snackbar.make(\n                        binding.accountCoordinatorLayout,\n                        R.string.error_generic,\n                        Snackbar.LENGTH_LONG\n                    )\n                        .setAction(R.string.action_retry) { viewModel.refresh() }\n                        .show()\n                }\n            }\n        }\n        lifecycleScope.launch {\n            viewModel.noteSaved.collect {\n                binding.saveNoteInfo.visible(it, View.INVISIBLE)\n            }\n        }\n\n        // \"Post failed\" dialog should display in this activity\n        draftsAlert.observeInContext(this, true)\n    }\n\n    private fun onRefresh() {\n        viewModel.refresh()\n        adapter.refreshContent()\n    }\n\n    /**\n     * Setup swipe to refresh layout\n     */\n    private fun setupRefreshLayout() {\n        binding.swipeToRefreshLayout.isEnabled = false // will only be enabled after the first load completed\n        binding.swipeToRefreshLayout.setOnRefreshListener { onRefresh() }\n        lifecycleScope.launch {\n            viewModel.isRefreshing.collect {\n                binding.swipeToRefreshLayout.isRefreshing = it\n            }\n        }\n    }\n\n    private fun onAccountChanged(account: Account?) {\n        loadedAccount = account ?: return\n\n        val usernameFormatted = getString(R.string.post_username_format, account.username)\n        binding.accountUsernameTextView.text = usernameFormatted\n        binding.accountDisplayNameTextView.text = account.name.emojify(account.emojis, binding.accountDisplayNameTextView, animateEmojis)\n\n        // Long press on username to copy it to clipboard\n        for (view in listOf(binding.accountUsernameTextView, binding.accountDisplayNameTextView)) {\n            view.setOnLongClickListener {\n                loadedAccount?.let { loadedAccount ->\n                    copyToClipboard(\n                        getFullUsername(loadedAccount),\n                        getString(R.string.account_username_copied),\n                    )\n                }\n                true\n            }\n        }\n\n        val emojifiedNote = account.note.parseAsMastodonHtml().emojify(\n            account.emojis,\n            binding.accountNoteTextView,\n            animateEmojis\n        )\n        setClickableText(binding.accountNoteTextView, emojifiedNote, emptyList(), null, this)\n\n        accountFieldAdapter.fields = account.fields\n        accountFieldAdapter.emojis = account.emojis\n        accountFieldAdapter.notifyDataSetChanged()\n\n        binding.accountLockedImageView.visible(account.locked)\n\n        updateAccountAvatar()\n        updateToolbar()\n        updateBadges()\n        updateMovedAccount()\n        updateRemoteAccount()\n        updateAccountJoinedDate()\n        updateAccountStats()\n        invalidateOptionsMenu()\n\n        binding.accountMuteButton.setOnClickListener {\n            viewModel.unmuteAccount()\n            updateMuteButton()\n        }\n    }\n\n    private fun updateBadges() {\n        binding.accountBadgeContainer.removeAllViews()\n\n        val isLight = resources.getBoolean(R.bool.lightNavigationBar)\n\n        if (loadedAccount?.bot == true) {\n            val badgeView =\n                getBadge(\n                    getColor(R.color.tusky_grey_50),\n                    R.drawable.ic_bot_24dp,\n                    getString(R.string.profile_badge_bot_text),\n                    isLight\n                )\n            binding.accountBadgeContainer.addView(badgeView)\n        }\n\n        loadedAccount?.roles?.forEach { role ->\n            val badgeColor = if (role.color.isNotBlank()) {\n                role.color.toColorInt()\n            } else {\n                // sometimes the color is not set for a role, in this case fall back to our default blue\n                getColor(R.color.tusky_blue)\n            }\n\n            val sb = SpannableStringBuilder(\"${role.name} ${viewModel.domain}\")\n            sb.setSpan(StyleSpan(Typeface.BOLD), 0, role.name.length, 0)\n\n            val badgeView = getBadge(badgeColor, R.drawable.ic_person_24dp, sb, isLight)\n\n            binding.accountBadgeContainer.addView(badgeView)\n        }\n    }\n\n    private fun updateAccountJoinedDate() {\n        loadedAccount?.let { account ->\n            try {\n                binding.accountDateJoined.text = resources.getString(\n                    R.string.account_date_joined,\n                    SimpleDateFormat(\"MMMM, yyyy\", Locale.getDefault()).format(account.createdAt)\n                )\n                binding.accountDateJoined.visibility = View.VISIBLE\n            } catch (e: ParseException) {\n                binding.accountDateJoined.visibility = View.GONE\n            }\n        }\n    }\n\n    /**\n     * Load account's avatar and header image\n     */\n    private fun updateAccountAvatar() {\n        loadedAccount?.let { account ->\n\n            loadAvatar(\n                account.avatar,\n                binding.accountAvatarImageView,\n                resources.getDimensionPixelSize(R.dimen.avatar_radius_94dp),\n                animateAvatar\n            )\n\n            Glide.with(this)\n                .asBitmap()\n                .load(account.header)\n                .centerCrop()\n                .into(binding.accountHeaderImageView)\n\n            binding.accountAvatarImageView.setOnClickListener { view ->\n                viewImage(view, account.avatar)\n            }\n            binding.accountHeaderImageView.setOnClickListener { view ->\n                viewImage(view, account.header)\n            }\n        }\n    }\n\n    private fun viewImage(view: View, uri: String) {\n        view.transitionName = uri\n        startActivity(\n            ViewMediaActivity.newSingleImageIntent(view.context, uri),\n            ActivityOptionsCompat.makeSceneTransitionAnimation(this, view, uri).toBundle()\n        )\n    }\n\n    /**\n     * Update toolbar views for loaded account\n     */\n    private fun updateToolbar() {\n        loadedAccount?.let { account ->\n            supportActionBar?.title = account.name.emojify(account.emojis, binding.accountToolbar, animateEmojis)\n            supportActionBar?.subtitle = String.format(getString(R.string.post_username_format), account.username)\n        }\n    }\n\n    /**\n     * Update moved account info\n     */\n    private fun updateMovedAccount() {\n        loadedAccount?.moved?.let { movedAccount ->\n\n            binding.accountMovedView.show()\n\n            binding.accountMovedView.setOnClickListener {\n                onViewAccount(movedAccount.id)\n            }\n\n            binding.accountMovedDisplayName.text = movedAccount.name\n            binding.accountMovedUsername.text = getString(R.string.post_username_format, movedAccount.username)\n\n            val avatarRadius = resources.getDimensionPixelSize(R.dimen.avatar_radius_48dp)\n\n            loadAvatar(movedAccount.avatar, binding.accountMovedAvatar, avatarRadius, animateAvatar)\n\n            binding.accountMovedText.text = getString(R.string.account_moved_description, movedAccount.name)\n        }\n    }\n\n    /**\n     * Check is account remote and update info if so\n     */\n    private fun updateRemoteAccount() {\n        loadedAccount?.let { account ->\n            if (account.isRemote) {\n                binding.accountRemoveView.show()\n                binding.accountRemoveView.setOnClickListener {\n                    openLink(account.url)\n                }\n            }\n        }\n    }\n\n    /**\n     * Update account stat info\n     */\n    private fun updateAccountStats() {\n        loadedAccount?.let { account ->\n            val numberFormat = NumberFormat.getNumberInstance()\n            binding.accountFollowersTextView.text = numberFormat.format(account.followersCount)\n            binding.accountFollowingTextView.text = numberFormat.format(account.followingCount)\n            binding.accountStatusesTextView.text = numberFormat.format(account.statusesCount)\n\n            binding.accountFloatingActionButton.setOnClickListener { mention() }\n\n            binding.accountFollowButton.setOnClickListener {\n                val confirmFollows = preferences.getBoolean(PrefKeys.CONFIRM_FOLLOWS, false)\n                if (viewModel.isSelf) {\n                    val intent = Intent(this@AccountActivity, EditProfileActivity::class.java)\n                    startActivity(intent)\n                    return@setOnClickListener\n                }\n\n                if (blocking) {\n                    viewModel.changeBlockState()\n                    return@setOnClickListener\n                }\n\n                when (followState) {\n                    FollowState.NOT_FOLLOWING -> {\n                        if (confirmFollows) {\n                            showFollowWarningDialog()\n                        } else {\n                            viewModel.changeFollowState()\n                        }\n                    }\n                    FollowState.REQUESTED -> {\n                        showFollowRequestPendingDialog()\n                    }\n                    FollowState.FOLLOWING -> {\n                        showUnfollowWarningDialog()\n                    }\n                }\n                updateFollowButton()\n                updateSubscribeButton()\n            }\n        }\n    }\n\n    private fun onRelationshipChanged(relation: Relationship) {\n        followState = when {\n            relation.following -> FollowState.FOLLOWING\n            relation.requested -> FollowState.REQUESTED\n            else -> FollowState.NOT_FOLLOWING\n        }\n        blocking = relation.blocking\n        muting = relation.muting\n        blockingDomain = relation.blockingDomain\n        showingReblogs = relation.showingReblogs\n\n        binding.accountFollowsYouTextView.visible(relation.followedBy)\n\n        // because subscribing is Pleroma extension, enable it __only__ when we have non-null subscribing field\n        // it's also now supported in Mastodon 3.3.0rc but called notifying and use different API call\n        if (!viewModel.isSelf && followState == FollowState.FOLLOWING &&\n            (relation.subscribing != null || relation.notifying != null)\n        ) {\n            binding.accountSubscribeButton.show()\n            binding.accountSubscribeButton.setOnClickListener {\n                viewModel.changeSubscribingState()\n            }\n            if (relation.notifying != null) {\n                subscribing = relation.notifying\n            } else if (relation.subscribing != null) {\n                subscribing = relation.subscribing\n            }\n        }\n\n        // remove the listener so it doesn't fire on non-user changes\n        binding.accountNoteTextInputLayout.editText?.removeTextChangedListener(noteWatcher)\n\n        binding.accountNoteTextInputLayout.visible(relation.note != null)\n        binding.accountNoteTextInputLayout.editText?.setText(relation.note)\n\n        noteWatcher = binding.accountNoteTextInputLayout.editText?.doAfterTextChanged { s ->\n            viewModel.noteChanged(s.toString())\n        }\n\n        updateButtons()\n    }\n\n    private fun updateFollowButton() {\n        if (viewModel.isSelf) {\n            binding.accountFollowButton.setText(R.string.action_edit_own_profile)\n            return\n        }\n        if (blocking) {\n            binding.accountFollowButton.setText(R.string.action_unblock)\n            return\n        }\n        when (followState) {\n            FollowState.NOT_FOLLOWING -> {\n                binding.accountFollowButton.setText(R.string.action_follow)\n            }\n            FollowState.REQUESTED -> {\n                binding.accountFollowButton.setText(R.string.state_follow_requested)\n            }\n            FollowState.FOLLOWING -> {\n                binding.accountFollowButton.setText(R.string.action_unfollow)\n            }\n        }\n    }\n\n    private fun updateMuteButton() {\n        if (muting) {\n            binding.accountMuteButton.setIconResource(R.drawable.ic_volume_up_24dp)\n        } else {\n            binding.accountMuteButton.hide()\n        }\n    }\n\n    private fun updateSubscribeButton() {\n        if (followState != FollowState.FOLLOWING) {\n            binding.accountSubscribeButton.hide()\n        }\n\n        if (subscribing) {\n            binding.accountSubscribeButton.setIconResource(R.drawable.ic_notifications_active_24dp)\n            binding.accountSubscribeButton.contentDescription = getString(R.string.action_unsubscribe_account)\n        } else {\n            binding.accountSubscribeButton.setIconResource(R.drawable.ic_notifications_24dp)\n            binding.accountSubscribeButton.contentDescription = getString(R.string.action_subscribe_account)\n        }\n    }\n\n    private fun updateButtons() {\n        invalidateOptionsMenu()\n\n        if (loadedAccount?.moved == null) {\n            binding.accountFollowButton.show()\n            updateFollowButton()\n            updateSubscribeButton()\n\n            if (blocking) {\n                binding.accountFloatingActionButton.hide()\n                binding.accountMuteButton.hide()\n            } else {\n                binding.accountFloatingActionButton.show()\n                binding.accountMuteButton.visible(muting)\n                updateMuteButton()\n            }\n        } else {\n            binding.accountFloatingActionButton.hide()\n            binding.accountFollowButton.hide()\n            binding.accountMuteButton.hide()\n            binding.accountSubscribeButton.hide()\n        }\n    }\n\n    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n        menuInflater.inflate(R.menu.account_toolbar, menu)\n\n        val openAsItem = menu.findItem(R.id.action_open_as)\n        val title = openAsText\n        if (title == null) {\n            openAsItem.isVisible = false\n        } else {\n            openAsItem.title = title\n        }\n\n        if (!viewModel.isSelf) {\n            val block = menu.findItem(R.id.action_block)\n            block.title = if (blocking) {\n                getString(R.string.action_unblock)\n            } else {\n                getString(R.string.action_block)\n            }\n\n            val mute = menu.findItem(R.id.action_mute)\n            mute.title = if (muting) {\n                getString(R.string.action_unmute)\n            } else {\n                getString(R.string.action_mute)\n            }\n\n            loadedAccount?.let { loadedAccount ->\n                val muteDomain = menu.findItem(R.id.action_mute_domain)\n                domain = getDomain(loadedAccount.url)\n                when {\n                    // If we can't get the domain, there's no way we can mute it anyway...\n                    // If the account is from our own domain, muting it is no-op\n                    domain.isEmpty() || viewModel.isFromOwnDomain -> {\n                        menu.removeItem(R.id.action_mute_domain)\n                    }\n                    blockingDomain -> {\n                        muteDomain.title = getString(R.string.action_unmute_domain, domain)\n                    }\n                    else -> {\n                        muteDomain.title = getString(R.string.action_mute_domain, domain)\n                    }\n                }\n            }\n\n            if (followState == FollowState.FOLLOWING) {\n                val showReblogs = menu.findItem(R.id.action_show_reblogs)\n                showReblogs.title = if (showingReblogs) {\n                    getString(R.string.action_hide_reblogs)\n                } else {\n                    getString(R.string.action_show_reblogs)\n                }\n            } else {\n                menu.removeItem(R.id.action_show_reblogs)\n            }\n        } else {\n            // It shouldn't be possible to block, mute or report yourself.\n            menu.removeItem(R.id.action_block)\n            menu.removeItem(R.id.action_mute)\n            menu.removeItem(R.id.action_mute_domain)\n            menu.removeItem(R.id.action_show_reblogs)\n            menu.removeItem(R.id.action_report)\n        }\n\n        if (!viewModel.isSelf && followState != FollowState.FOLLOWING) {\n            menu.removeItem(R.id.action_add_or_remove_from_list)\n        }\n    }\n\n    private fun showFollowRequestPendingDialog() {\n        MaterialAlertDialogBuilder(this)\n            .setMessage(R.string.dialog_message_cancel_follow_request)\n            .setPositiveButton(android.R.string.ok) { _, _ -> viewModel.changeFollowState() }\n            .setNegativeButton(android.R.string.cancel, null)\n            .show()\n    }\n\n    private fun showUnfollowWarningDialog() {\n        MaterialAlertDialogBuilder(this)\n            .setMessage(R.string.dialog_unfollow_warning)\n            .setPositiveButton(android.R.string.ok) { _, _ -> viewModel.changeFollowState() }\n            .setNegativeButton(android.R.string.cancel, null)\n            .show()\n    }\n\n    private fun showFollowWarningDialog() {\n        MaterialAlertDialogBuilder(this)\n            .setMessage(R.string.dialog_follow_warning)\n            .setPositiveButton(android.R.string.ok) { _, _ -> viewModel.changeFollowState() }\n            .setNegativeButton(android.R.string.cancel, null)\n            .show()\n    }\n\n    private fun toggleBlockDomain(instance: String) {\n        if (blockingDomain) {\n            viewModel.unblockDomain(instance)\n        } else {\n            MaterialAlertDialogBuilder(this)\n                .setMessage(getString(R.string.mute_domain_warning, instance))\n                .setPositiveButton(\n                    getString(R.string.mute_domain_warning_dialog_ok)\n                ) { _, _ -> viewModel.blockDomain(instance) }\n                .setNegativeButton(android.R.string.cancel, null)\n                .show()\n        }\n    }\n\n    private fun toggleBlock() {\n        if (viewModel.relationshipData.value?.data?.blocking != true) {\n            MaterialAlertDialogBuilder(this)\n                .setMessage(getString(R.string.dialog_block_warning, loadedAccount?.username))\n                .setPositiveButton(android.R.string.ok) { _, _ -> viewModel.changeBlockState() }\n                .setNegativeButton(android.R.string.cancel, null)\n                .show()\n        } else {\n            viewModel.changeBlockState()\n        }\n    }\n\n    private fun toggleMute() {\n        if (viewModel.relationshipData.value?.data?.muting != true) {\n            loadedAccount?.let {\n                showMuteAccountDialog(\n                    this,\n                    it.username\n                ) { notifications, duration ->\n                    viewModel.muteAccount(notifications, duration)\n                }\n            }\n        } else {\n            viewModel.unmuteAccount()\n        }\n    }\n\n    private fun mention() {\n        loadedAccount?.let {\n            val options = if (viewModel.isSelf) {\n                ComposeActivity.ComposeOptions(kind = ComposeActivity.ComposeKind.NEW)\n            } else {\n                ComposeActivity.ComposeOptions(\n                    mentionedUsernames = setOf(it.username),\n                    kind = ComposeActivity.ComposeKind.NEW\n                )\n            }\n            val intent = ComposeActivity.startIntent(this, options)\n            startActivity(intent)\n        }\n    }\n\n    override fun onViewTag(tag: String) {\n        val intent = StatusListActivity.newHashtagIntent(this, tag)\n        startActivityWithSlideInAnimation(intent)\n    }\n\n    override fun onViewAccount(id: String) {\n        val intent = Intent(this, AccountActivity::class.java)\n        intent.putExtra(\"id\", id)\n        startActivityWithSlideInAnimation(intent)\n    }\n\n    override fun onViewUrl(url: String) {\n        viewUrl(url)\n    }\n\n    override fun onMenuItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            R.id.action_open_in_web -> {\n                // If the account isn't loaded yet, eat the input.\n                loadedAccount?.let { loadedAccount ->\n                    openLink(loadedAccount.url)\n                }\n                return true\n            }\n            R.id.action_open_as -> {\n                loadedAccount?.let { loadedAccount ->\n                    showAccountChooserDialog(\n                        item.title,\n                        false,\n                        object : AccountSelectionListener {\n                            override fun onAccountSelected(account: AccountEntity) {\n                                openAsAccount(loadedAccount.url, account)\n                            }\n                        }\n                    )\n                }\n            }\n            R.id.action_share_account_link -> {\n                // If the account isn't loaded yet, eat the input.\n                loadedAccount?.let { loadedAccount ->\n                    val url = loadedAccount.url\n                    val sendIntent = Intent()\n                    sendIntent.action = Intent.ACTION_SEND\n                    sendIntent.putExtra(Intent.EXTRA_TEXT, url)\n                    sendIntent.type = \"text/plain\"\n                    startActivity(\n                        Intent.createChooser(\n                            sendIntent,\n                            resources.getText(R.string.send_account_link_to)\n                        )\n                    )\n                }\n                return true\n            }\n            R.id.action_share_account_username -> {\n                // If the account isn't loaded yet, eat the input.\n                loadedAccount?.let { loadedAccount ->\n                    val fullUsername = getFullUsername(loadedAccount)\n                    val sendIntent = Intent()\n                    sendIntent.action = Intent.ACTION_SEND\n                    sendIntent.putExtra(Intent.EXTRA_TEXT, fullUsername)\n                    sendIntent.type = \"text/plain\"\n                    startActivity(\n                        Intent.createChooser(\n                            sendIntent,\n                            resources.getText(R.string.send_account_username_to)\n                        )\n                    )\n                }\n                return true\n            }\n            R.id.action_block -> {\n                toggleBlock()\n                return true\n            }\n            R.id.action_mute -> {\n                toggleMute()\n                return true\n            }\n            R.id.action_add_or_remove_from_list -> {\n                ListSelectionFragment.newInstance(viewModel.accountId).show(supportFragmentManager, null)\n                return true\n            }\n            R.id.action_mute_domain -> {\n                toggleBlockDomain(domain)\n                return true\n            }\n            R.id.action_show_reblogs -> {\n                viewModel.changeShowReblogsState()\n                return true\n            }\n            R.id.action_refresh -> {\n                onRefresh()\n                return true\n            }\n            R.id.action_report -> {\n                loadedAccount?.let { loadedAccount ->\n                    startActivity(\n                        ReportActivity.getIntent(this, viewModel.accountId, loadedAccount.username)\n                    )\n                }\n                return true\n            }\n        }\n        return false\n    }\n\n    override fun getActionButton(): FloatingActionButton? {\n        return if (!blocking) {\n            binding.accountFloatingActionButton\n        } else {\n            null\n        }\n    }\n\n    private fun getFullUsername(account: Account): String {\n        return if (account.isRemote) {\n            \"@\" + account.username\n        } else {\n            val localUsername = account.localUsername\n            // Note: !! here will crash if this pane is ever shown to a logged-out user. With AccountActivity this is believed to be impossible.\n            val domain = accountManager.activeAccount!!.domain\n            \"@$localUsername@$domain\"\n        }\n    }\n\n    private fun getBadge(\n        @ColorInt baseColor: Int,\n        @DrawableRes icon: Int,\n        text: CharSequence,\n        isLight: Boolean\n    ): Chip {\n        val badge = Chip(this)\n\n        // text color with maximum contrast\n        val textColor = if (isLight) Color.BLACK else Color.WHITE\n        // badge color with 50% transparency so it blends in with the theme background\n        val backgroundColor = Color.argb(\n            128,\n            Color.red(baseColor),\n            Color.green(baseColor),\n            Color.blue(baseColor)\n        )\n        // a color between the text color and the badge color\n        val outlineColor = ColorUtils.blendARGB(textColor, baseColor, 0.7f)\n\n        // configure the badge\n        badge.text = text\n        badge.setTextColor(textColor)\n        badge.chipStrokeWidth = resources.getDimension(R.dimen.profile_badge_stroke_width)\n        badge.chipStrokeColor = ColorStateList.valueOf(outlineColor)\n        badge.setChipIconResource(icon)\n        badge.isChipIconVisible = true\n        badge.chipIconSize = resources.getDimension(R.dimen.profile_badge_icon_size)\n        badge.chipIconTint = ColorStateList.valueOf(outlineColor)\n        badge.chipBackgroundColor = ColorStateList.valueOf(backgroundColor)\n\n        // badge isn't clickable, so disable all related behavior\n        badge.isClickable = false\n        badge.isFocusable = false\n        badge.setEnsureMinTouchTargetSize(false)\n        badge.isCloseIconVisible = false\n\n        // reset some chip defaults so it looks better for our badge usecase\n        badge.iconStartPadding = resources.getDimension(R.dimen.profile_badge_icon_start_padding)\n        badge.iconEndPadding = resources.getDimension(R.dimen.profile_badge_icon_end_padding)\n        badge.minHeight = resources.getDimensionPixelSize(R.dimen.profile_badge_min_height)\n        badge.chipMinHeight = resources.getDimension(R.dimen.profile_badge_min_height)\n        badge.updatePadding(top = 0, bottom = 0)\n        return badge\n    }\n\n    companion object {\n\n        private const val KEY_ACCOUNT_ID = \"id\"\n        private val argbEvaluator = ArgbEvaluator()\n\n        @JvmStatic\n        fun getIntent(context: Context, accountId: String): Intent {\n            val intent = Intent(context, AccountActivity::class.java)\n            intent.putExtra(KEY_ACCOUNT_ID, accountId)\n            return intent\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/account/AccountFieldAdapter.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.account\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemAccountFieldBinding\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.entity.Field\nimport com.keylesspalace.tusky.interfaces.LinkListener\nimport com.keylesspalace.tusky.util.BindingHolder\nimport com.keylesspalace.tusky.util.emojify\nimport com.keylesspalace.tusky.util.parseAsMastodonHtml\nimport com.keylesspalace.tusky.util.setClickableText\n\nclass AccountFieldAdapter(\n    private val linkListener: LinkListener,\n    private val animateEmojis: Boolean\n) : RecyclerView.Adapter<BindingHolder<ItemAccountFieldBinding>>() {\n\n    var emojis: List<Emoji> = emptyList()\n    var fields: List<Field> = emptyList()\n\n    override fun getItemCount() = fields.size\n\n    override fun onCreateViewHolder(\n        parent: ViewGroup,\n        viewType: Int\n    ): BindingHolder<ItemAccountFieldBinding> {\n        val binding = ItemAccountFieldBinding.inflate(\n            LayoutInflater.from(parent.context),\n            parent,\n            false\n        )\n        return BindingHolder(binding)\n    }\n\n    override fun onBindViewHolder(holder: BindingHolder<ItemAccountFieldBinding>, position: Int) {\n        val field = fields[position]\n        val nameTextView = holder.binding.accountFieldName\n        val valueTextView = holder.binding.accountFieldValue\n\n        val emojifiedName = field.name.emojify(emojis, nameTextView, animateEmojis)\n        nameTextView.text = emojifiedName\n\n        val emojifiedValue = field.value.parseAsMastodonHtml().emojify(\n            emojis,\n            valueTextView,\n            animateEmojis\n        )\n        setClickableText(valueTextView, emojifiedValue, emptyList(), null, linkListener)\n\n        if (field.verifiedAt != null) {\n            valueTextView.setCompoundDrawablesRelativeWithIntrinsicBounds(\n                0,\n                0,\n                R.drawable.ic_verified_18dp,\n                0\n            )\n        } else {\n            valueTextView.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, 0, 0)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/account/AccountPagerAdapter.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.account\n\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentActivity\nimport com.keylesspalace.tusky.components.account.media.AccountMediaFragment\nimport com.keylesspalace.tusky.components.timeline.TimelineFragment\nimport com.keylesspalace.tusky.components.timeline.viewmodel.TimelineViewModel\nimport com.keylesspalace.tusky.interfaces.RefreshableFragment\nimport com.keylesspalace.tusky.util.CustomFragmentStateAdapter\n\nclass AccountPagerAdapter(\n    activity: FragmentActivity,\n    private val accountId: String\n) : CustomFragmentStateAdapter(activity) {\n\n    override fun getItemCount() = TAB_COUNT\n\n    override fun createFragment(position: Int): Fragment {\n        return when (position) {\n            0 -> TimelineFragment.newInstance(TimelineViewModel.Kind.USER, accountId, false)\n            1 -> TimelineFragment.newInstance(\n                TimelineViewModel.Kind.USER_WITH_REPLIES,\n                accountId,\n                false\n            )\n            2 -> TimelineFragment.newInstance(TimelineViewModel.Kind.USER_PINNED, accountId, false)\n            3 -> AccountMediaFragment.newInstance(accountId)\n            else -> throw AssertionError(\"Page $position is out of AccountPagerAdapter bounds\")\n        }\n    }\n\n    fun refreshContent() {\n        for (i in 0 until TAB_COUNT) {\n            val fragment = getFragment(i)\n            if (fragment != null && fragment is RefreshableFragment) {\n                (fragment as RefreshableFragment).refreshContent()\n            }\n        }\n    }\n\n    companion object {\n        private const val TAB_COUNT = 4\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/account/AccountViewModel.kt",
    "content": "package com.keylesspalace.tusky.components.account\n\nimport android.util.Log\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport at.connyduck.calladapter.networkresult.fold\nimport com.keylesspalace.tusky.appstore.BlockEvent\nimport com.keylesspalace.tusky.appstore.DomainMuteEvent\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.MuteEvent\nimport com.keylesspalace.tusky.appstore.ProfileEditedEvent\nimport com.keylesspalace.tusky.appstore.UnfollowEvent\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.entity.Account\nimport com.keylesspalace.tusky.entity.Relationship\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.Error\nimport com.keylesspalace.tusky.util.Loading\nimport com.keylesspalace.tusky.util.Resource\nimport com.keylesspalace.tusky.util.Success\nimport com.keylesspalace.tusky.util.getDomain\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport kotlinx.coroutines.launch\n\n@HiltViewModel\nclass AccountViewModel @Inject constructor(\n    private val mastodonApi: MastodonApi,\n    private val eventHub: EventHub,\n    accountManager: AccountManager\n) : ViewModel() {\n\n    private val _accountData = MutableStateFlow(null as Resource<Account>?)\n    val accountData: StateFlow<Resource<Account>?> = _accountData.asStateFlow()\n\n    private val _relationshipData = MutableStateFlow(null as Resource<Relationship>?)\n    val relationshipData: StateFlow<Resource<Relationship>?> = _relationshipData.asStateFlow()\n\n    private val _noteSaved = MutableStateFlow(false)\n    val noteSaved: StateFlow<Boolean> = _noteSaved.asStateFlow()\n\n    private val _isRefreshing = MutableStateFlow(false)\n    val isRefreshing: StateFlow<Boolean> = _isRefreshing.asStateFlow()\n\n    lateinit var accountId: String\n    var isSelf = false\n\n    /** the domain of the viewed account **/\n    var domain = \"\"\n\n    /** True if the viewed account has the same domain as the active account */\n    var isFromOwnDomain = false\n\n    private var noteUpdateJob: Job? = null\n\n    private val activeAccount = accountManager.activeAccount!!\n\n    init {\n        viewModelScope.launch {\n            eventHub.events.collect { event ->\n                if (event is ProfileEditedEvent && event.newProfileData.id == _accountData.value?.data?.id) {\n                    _accountData.value = Success(event.newProfileData)\n                }\n            }\n        }\n    }\n\n    private fun obtainAccount(reload: Boolean = false) {\n        if (_accountData.value == null || reload) {\n            if (reload) {\n                _isRefreshing.value = true\n            }\n            _accountData.value = Loading()\n\n            viewModelScope.launch {\n                mastodonApi.account(accountId)\n                    .fold(\n                        { account ->\n                            domain = getDomain(account.url)\n                            isFromOwnDomain = domain == activeAccount.domain\n\n                            _accountData.value = Success(account)\n                            _isRefreshing.value = false\n                        },\n                        { t ->\n                            Log.w(TAG, \"failed obtaining account\", t)\n                            _accountData.value = Error(cause = t)\n                            _isRefreshing.value = false\n                        }\n                    )\n            }\n        }\n    }\n\n    private fun obtainRelationship(reload: Boolean = false) {\n        if (_relationshipData.value == null || reload) {\n            _relationshipData.value = Loading()\n\n            viewModelScope.launch {\n                mastodonApi.relationships(listOf(accountId))\n                    .fold(\n                        { relationships ->\n                            _relationshipData.value =\n                                if (relationships.isNotEmpty()) {\n                                    Success(\n                                        relationships[0]\n                                    )\n                                } else {\n                                    Error()\n                                }\n                        },\n                        { t ->\n                            Log.w(TAG, \"failed obtaining relationships\", t)\n                            _relationshipData.value = Error(cause = t)\n                        }\n                    )\n            }\n        }\n    }\n\n    fun changeFollowState() {\n        val relationship = _relationshipData.value?.data\n        if (relationship?.following == true || relationship?.requested == true) {\n            changeRelationship(RelationShipAction.UNFOLLOW)\n        } else {\n            changeRelationship(RelationShipAction.FOLLOW)\n        }\n    }\n\n    fun changeBlockState() {\n        if (_relationshipData.value?.data?.blocking == true) {\n            changeRelationship(RelationShipAction.UNBLOCK)\n        } else {\n            changeRelationship(RelationShipAction.BLOCK)\n        }\n    }\n\n    fun muteAccount(notifications: Boolean, duration: Int?) {\n        changeRelationship(RelationShipAction.MUTE, notifications, duration)\n    }\n\n    fun unmuteAccount() {\n        changeRelationship(RelationShipAction.UNMUTE)\n    }\n\n    fun changeSubscribingState() {\n        val relationship = _relationshipData.value?.data\n        if (relationship?.notifying == true || // Mastodon 3.3.0rc1\n            relationship?.subscribing == true // Pleroma\n        ) {\n            changeRelationship(RelationShipAction.UNSUBSCRIBE)\n        } else {\n            changeRelationship(RelationShipAction.SUBSCRIBE)\n        }\n    }\n\n    fun blockDomain(instance: String) {\n        viewModelScope.launch {\n            mastodonApi.blockDomain(instance).fold({\n                eventHub.dispatch(DomainMuteEvent(instance))\n                val relation = _relationshipData.value?.data\n                if (relation != null) {\n                    _relationshipData.value = Success(relation.copy(blockingDomain = true))\n                }\n            }, { e ->\n                Log.e(TAG, \"Error muting $instance\", e)\n            })\n        }\n    }\n\n    fun unblockDomain(instance: String) {\n        viewModelScope.launch {\n            mastodonApi.unblockDomain(instance).fold({\n                val relation = _relationshipData.value?.data\n                if (relation != null) {\n                    _relationshipData.value = Success(relation.copy(blockingDomain = false))\n                }\n            }, { e ->\n                Log.e(TAG, \"Error unmuting $instance\", e)\n            })\n        }\n    }\n\n    fun changeShowReblogsState() {\n        if (_relationshipData.value?.data?.showingReblogs == true) {\n            changeRelationship(RelationShipAction.FOLLOW, false)\n        } else {\n            changeRelationship(RelationShipAction.FOLLOW, true)\n        }\n    }\n\n    /**\n     * @param parameter showReblogs if RelationShipAction.FOLLOW, notifications if MUTE\n     */\n    private fun changeRelationship(\n        relationshipAction: RelationShipAction,\n        parameter: Boolean? = null,\n        duration: Int? = null\n    ) = viewModelScope.launch {\n        val relation = _relationshipData.value?.data\n        val account = _accountData.value?.data\n        val isMastodon = _relationshipData.value?.data?.notifying != null\n\n        if (relation != null && account != null) {\n            // optimistically post new state for faster response\n\n            val newRelation = when (relationshipAction) {\n                RelationShipAction.FOLLOW -> {\n                    if (account.locked) {\n                        relation.copy(requested = true)\n                    } else {\n                        relation.copy(following = true)\n                    }\n                }\n                RelationShipAction.UNFOLLOW -> relation.copy(following = false)\n                RelationShipAction.BLOCK -> relation.copy(blocking = true)\n                RelationShipAction.UNBLOCK -> relation.copy(blocking = false)\n                RelationShipAction.MUTE -> relation.copy(muting = true)\n                RelationShipAction.UNMUTE -> relation.copy(muting = false)\n                RelationShipAction.SUBSCRIBE -> {\n                    if (isMastodon) {\n                        relation.copy(notifying = true)\n                    } else {\n                        relation.copy(subscribing = true)\n                    }\n                }\n                RelationShipAction.UNSUBSCRIBE -> {\n                    if (isMastodon) {\n                        relation.copy(notifying = false)\n                    } else {\n                        relation.copy(subscribing = false)\n                    }\n                }\n            }\n            _relationshipData.value = Loading(newRelation)\n        }\n\n        val relationshipCall = when (relationshipAction) {\n            RelationShipAction.FOLLOW -> mastodonApi.followAccount(\n                accountId,\n                showReblogs = parameter ?: true\n            )\n            RelationShipAction.UNFOLLOW -> mastodonApi.unfollowAccount(accountId)\n            RelationShipAction.BLOCK -> mastodonApi.blockAccount(accountId)\n            RelationShipAction.UNBLOCK -> mastodonApi.unblockAccount(accountId)\n            RelationShipAction.MUTE -> mastodonApi.muteAccount(\n                accountId,\n                parameter ?: true,\n                duration\n            )\n            RelationShipAction.UNMUTE -> mastodonApi.unmuteAccount(accountId)\n            RelationShipAction.SUBSCRIBE -> {\n                if (isMastodon) {\n                    mastodonApi.followAccount(accountId, notify = true)\n                } else {\n                    mastodonApi.subscribeAccount(accountId)\n                }\n            }\n            RelationShipAction.UNSUBSCRIBE -> {\n                if (isMastodon) {\n                    mastodonApi.followAccount(accountId, notify = false)\n                } else {\n                    mastodonApi.unsubscribeAccount(accountId)\n                }\n            }\n        }\n\n        relationshipCall.fold(\n            { relationship ->\n                _relationshipData.value = Success(relationship)\n\n                when (relationshipAction) {\n                    RelationShipAction.UNFOLLOW -> eventHub.dispatch(UnfollowEvent(accountId))\n                    RelationShipAction.BLOCK -> eventHub.dispatch(BlockEvent(accountId))\n                    RelationShipAction.MUTE -> eventHub.dispatch(MuteEvent(accountId))\n                    else -> { }\n                }\n            },\n            { t ->\n                Log.w(TAG, \"failed loading relationship\", t)\n                _relationshipData.value = Error(relation, cause = t)\n            }\n        )\n    }\n\n    fun noteChanged(newNote: String) {\n        _noteSaved.value = false\n        noteUpdateJob?.cancel()\n        noteUpdateJob = viewModelScope.launch {\n            delay(1500)\n            mastodonApi.updateAccountNote(accountId, newNote)\n                .fold(\n                    {\n                        _noteSaved.value = true\n                        delay(4000)\n                        _noteSaved.value = false\n                    },\n                    { t ->\n                        Log.w(TAG, \"Error updating note\", t)\n                    }\n                )\n        }\n    }\n\n    fun refresh() {\n        reload(true)\n    }\n\n    private fun reload(isReload: Boolean = false) {\n        if (_isRefreshing.value) {\n            return\n        }\n        accountId.let {\n            obtainAccount(isReload)\n            if (!isSelf) {\n                obtainRelationship(isReload)\n            }\n        }\n    }\n\n    fun setAccountInfo(accountId: String) {\n        this.accountId = accountId\n        this.isSelf = activeAccount.accountId == accountId\n        reload(false)\n    }\n\n    enum class RelationShipAction {\n        FOLLOW,\n        UNFOLLOW,\n        BLOCK,\n        UNBLOCK,\n        MUTE,\n        UNMUTE,\n        SUBSCRIBE,\n        UNSUBSCRIBE\n    }\n\n    companion object {\n        const val TAG = \"AccountViewModel\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/account/list/ListSelectionFragment.kt",
    "content": "/* Copyright Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.components.account.list\n\nimport android.app.Dialog\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.DialogFragment\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.ListsActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.FragmentListsListBinding\nimport com.keylesspalace.tusky.databinding.ItemListBinding\nimport com.keylesspalace.tusky.entity.MastoList\nimport com.keylesspalace.tusky.util.BindingHolder\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.visible\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.CoroutineStart\nimport kotlinx.coroutines.awaitCancellation\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass ListSelectionFragment : DialogFragment() {\n\n    interface ListSelectionListener {\n        fun onListSelected(list: MastoList)\n    }\n\n    private val viewModel: ListsForAccountViewModel by viewModels()\n\n    private var selectListener: ListSelectionListener? = null\n    private var accountId: String? = null\n\n    override fun onAttach(context: Context) {\n        super.onAttach(context)\n        selectListener = context as? ListSelectionListener\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        accountId = requireArguments().getString(ARG_ACCOUNT_ID)\n    }\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val context = requireContext()\n\n        val binding = FragmentListsListBinding.inflate(layoutInflater)\n        val adapter = Adapter()\n        binding.listsView.adapter = adapter\n\n        val dialogBuilder = MaterialAlertDialogBuilder(context)\n            .setView(binding.root)\n            .setTitle(R.string.select_list_title)\n            .setNeutralButton(R.string.select_list_manage) { _, _ ->\n                val listIntent = Intent(context, ListsActivity::class.java)\n                startActivity(listIntent)\n            }\n            .setNegativeButton(if (accountId != null) R.string.button_done else android.R.string.cancel, null)\n\n        val dialog = dialogBuilder.create()\n\n        val showProgressBarJob = getProgressBarJob(binding.progressBar, 500)\n        showProgressBarJob.start()\n\n        // TODO change this to a (single) LoadState like elsewhere?\n        lifecycleScope.launch {\n            viewModel.states.collectLatest { states ->\n                binding.progressBar.hide()\n                showProgressBarJob.cancel()\n                if (states.isEmpty()) {\n                    binding.messageView.show()\n                    binding.messageView.setup(R.drawable.elephant_friend_empty, R.string.no_lists)\n                } else {\n                    binding.listsView.show()\n                    adapter.submitList(states)\n                }\n            }\n        }\n\n        lifecycleScope.launch {\n            viewModel.loadError.collectLatest { error ->\n                Log.e(TAG, \"failed to load lists\", error)\n                binding.progressBar.hide()\n                showProgressBarJob.cancel()\n                binding.listsView.hide()\n                binding.messageView.apply {\n                    show()\n                    setup(error) { load(binding) }\n                }\n            }\n        }\n\n        lifecycleScope.launch {\n            viewModel.actionError.collectLatest { error ->\n                when (error.type) {\n                    ActionError.Type.ADD -> {\n                        Snackbar.make(\n                            binding.root,\n                            R.string.failed_to_add_to_list,\n                            Snackbar.LENGTH_LONG\n                        )\n                            .setAction(R.string.action_retry) {\n                                viewModel.addAccountToList(accountId!!, error.listId)\n                            }\n                            .show()\n                    }\n                    ActionError.Type.REMOVE -> {\n                        Snackbar.make(\n                            binding.root,\n                            R.string.failed_to_remove_from_list,\n                            Snackbar.LENGTH_LONG\n                        )\n                            .setAction(R.string.action_retry) {\n                                viewModel.removeAccountFromList(accountId!!, error.listId)\n                            }\n                            .show()\n                    }\n                }\n            }\n        }\n\n        lifecycleScope.launch {\n            load(binding)\n        }\n\n        return dialog\n    }\n\n    private fun getProgressBarJob(progressView: View, delayMs: Long) = this.lifecycleScope.launch(\n        start = CoroutineStart.LAZY\n    ) {\n        try {\n            delay(delayMs)\n            progressView.show()\n            awaitCancellation()\n        } finally {\n            progressView.hide()\n        }\n    }\n\n    private fun load(binding: FragmentListsListBinding) {\n        binding.progressBar.show()\n        binding.listsView.hide()\n        binding.messageView.hide()\n        viewModel.load(accountId)\n    }\n\n    private object Differ : DiffUtil.ItemCallback<AccountListState>() {\n        override fun areItemsTheSame(\n            oldItem: AccountListState,\n            newItem: AccountListState\n        ): Boolean {\n            return oldItem.list.id == newItem.list.id\n        }\n\n        override fun areContentsTheSame(\n            oldItem: AccountListState,\n            newItem: AccountListState\n        ): Boolean {\n            return oldItem == newItem\n        }\n    }\n\n    inner class Adapter :\n        ListAdapter<AccountListState, BindingHolder<ItemListBinding>>(Differ) {\n        override fun onCreateViewHolder(\n            parent: ViewGroup,\n            viewType: Int\n        ): BindingHolder<ItemListBinding> {\n            return BindingHolder(ItemListBinding.inflate(LayoutInflater.from(parent.context), parent, false))\n        }\n\n        override fun onBindViewHolder(holder: BindingHolder<ItemListBinding>, position: Int) {\n            val item = getItem(position)\n            holder.binding.listName.text = item.list.title\n            accountId?.let { accountId ->\n                holder.binding.addButton.apply {\n                    visible(!item.includesAccount)\n                    setOnClickListener {\n                        viewModel.addAccountToList(accountId, item.list.id)\n                    }\n                }\n                holder.binding.removeButton.apply {\n                    visible(item.includesAccount)\n                    setOnClickListener {\n                        viewModel.removeAccountFromList(accountId, item.list.id)\n                    }\n                }\n            }\n\n            holder.itemView.setOnClickListener {\n                selectListener?.onListSelected(item.list)\n\n                accountId?.let { accountId ->\n                    if (item.includesAccount) {\n                        viewModel.removeAccountFromList(accountId, item.list.id)\n                    } else {\n                        viewModel.addAccountToList(accountId, item.list.id)\n                    }\n                }\n            }\n        }\n    }\n\n    companion object {\n        private const val TAG = \"ListsListFragment\"\n        private const val ARG_ACCOUNT_ID = \"accountId\"\n\n        fun newInstance(accountId: String?): ListSelectionFragment {\n            val args = Bundle().apply {\n                putString(ARG_ACCOUNT_ID, accountId)\n            }\n            return ListSelectionFragment().apply { arguments = args }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/account/list/ListsForAccountViewModel.kt",
    "content": "/* Copyright 2022 kyori19\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.components.account.list\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport at.connyduck.calladapter.networkresult.getOrThrow\nimport at.connyduck.calladapter.networkresult.onFailure\nimport at.connyduck.calladapter.networkresult.onSuccess\nimport at.connyduck.calladapter.networkresult.runCatching\nimport com.keylesspalace.tusky.entity.MastoList\nimport com.keylesspalace.tusky.network.MastodonApi\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.SharedFlow\nimport kotlinx.coroutines.flow.asSharedFlow\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.launch\n\ndata class AccountListState(\n    val list: MastoList,\n    val includesAccount: Boolean\n)\n\ndata class ActionError(\n    val error: Throwable,\n    val type: Type,\n    val listId: String\n) : Throwable(error) {\n    enum class Type {\n        ADD,\n        REMOVE\n    }\n}\n\n@HiltViewModel\n@OptIn(ExperimentalCoroutinesApi::class)\nclass ListsForAccountViewModel @Inject constructor(\n    private val mastodonApi: MastodonApi\n) : ViewModel() {\n\n    private val _states = MutableSharedFlow<List<AccountListState>>(1)\n    val states: SharedFlow<List<AccountListState>> = _states.asSharedFlow()\n\n    private val _loadError = MutableSharedFlow<Throwable>(1)\n    val loadError: SharedFlow<Throwable> = _loadError.asSharedFlow()\n\n    private val _actionError = MutableSharedFlow<ActionError>(1)\n    val actionError: SharedFlow<ActionError> = _actionError.asSharedFlow()\n\n    fun load(accountId: String?) {\n        _loadError.resetReplayCache()\n        viewModelScope.launch {\n            runCatching {\n                val all = mastodonApi.getLists().getOrThrow()\n                var includes: List<MastoList> = emptyList()\n                if (accountId != null) {\n                    includes = mastodonApi.getListsIncludesAccount(accountId).getOrThrow()\n                }\n\n                _states.emit(\n                    all.map { listState ->\n                        AccountListState(\n                            list = listState,\n                            includesAccount = includes.any { it.id == listState.id }\n                        )\n                    }\n                )\n            }\n                .onFailure {\n                    _loadError.emit(it)\n                }\n        }\n    }\n\n    // TODO there is no \"progress\" visible for these\n\n    fun addAccountToList(accountId: String, listId: String) {\n        _actionError.resetReplayCache()\n        viewModelScope.launch {\n            mastodonApi.addAccountToList(listId, listOf(accountId))\n                .onSuccess {\n                    _states.emit(\n                        _states.first().map { state ->\n                            if (state.list.id == listId) {\n                                state.copy(includesAccount = true)\n                            } else {\n                                state\n                            }\n                        }\n                    )\n                }\n                .onFailure {\n                    _actionError.emit(ActionError(it, ActionError.Type.ADD, listId))\n                }\n        }\n    }\n\n    fun removeAccountFromList(accountId: String, listId: String) {\n        _actionError.resetReplayCache()\n        viewModelScope.launch {\n            mastodonApi.deleteAccountFromList(listId, listOf(accountId))\n                .onSuccess {\n                    _states.emit(\n                        _states.first().map { state ->\n                            if (state.list.id == listId) {\n                                state.copy(includesAccount = false)\n                            } else {\n                                state\n                            }\n                        }\n                    )\n                }\n                .onFailure {\n                    _actionError.emit(ActionError(it, ActionError.Type.REMOVE, listId))\n                }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/account/media/AccountMediaFragment.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.account.media\n\nimport android.content.SharedPreferences\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport androidx.core.app.ActivityOptionsCompat\nimport androidx.core.view.MenuProvider\nimport androidx.core.view.ViewCompat\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.paging.LoadState\nimport androidx.recyclerview.widget.GridLayoutManager\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.ViewMediaActivity\nimport com.keylesspalace.tusky.databinding.FragmentTimelineBinding\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.interfaces.ActionButtonActivity\nimport com.keylesspalace.tusky.interfaces.RefreshableFragment\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.util.ensureBottomPadding\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.openLink\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.viewdata.AttachmentViewData\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.launch\n\n/**\n * Fragment with multiple columns of media previews for the specified account.\n */\n@AndroidEntryPoint\nclass AccountMediaFragment :\n    Fragment(R.layout.fragment_timeline),\n    RefreshableFragment,\n    MenuProvider {\n\n    @Inject\n    lateinit var accountManager: AccountManager\n\n    @Inject\n    lateinit var preferences: SharedPreferences\n\n    private val binding by viewBinding(FragmentTimelineBinding::bind)\n\n    private val viewModel: AccountMediaViewModel by viewModels()\n\n    private var adapter: AccountMediaGridAdapter? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        viewModel.accountId = arguments?.getString(ACCOUNT_ID_ARG)!!\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED)\n\n        val useBlurhash = preferences.getBoolean(PrefKeys.USE_BLURHASH, true)\n\n        val hasFab = (activity as? ActionButtonActivity?)?.actionButton != null\n        binding.recyclerView.ensureBottomPadding(fab = hasFab)\n\n        val adapter = AccountMediaGridAdapter(\n            useBlurhash = useBlurhash,\n            context = view.context,\n            onAttachmentClickListener = ::onAttachmentClick\n        )\n        this.adapter = adapter\n\n        val columnCount = view.context.resources.getInteger(R.integer.profile_media_column_count)\n        val imageSpacing = view.context.resources.getDimensionPixelSize(\n            R.dimen.profile_media_spacing\n        )\n\n        binding.recyclerView.addItemDecoration(\n            GridSpacingItemDecoration(columnCount, imageSpacing, 0)\n        )\n\n        binding.recyclerView.layoutManager = GridLayoutManager(view.context, columnCount)\n        binding.recyclerView.adapter = adapter\n\n        binding.swipeRefreshLayout.isEnabled = false\n        binding.swipeRefreshLayout.setOnRefreshListener { refreshContent() }\n\n        binding.statusView.visibility = View.GONE\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.media.collectLatest { pagingData ->\n                adapter.submitData(pagingData)\n            }\n        }\n\n        adapter.addLoadStateListener { loadState ->\n            binding.statusView.hide()\n            binding.progressBar.hide()\n\n            if (loadState.refresh != LoadState.Loading && loadState.source.refresh != LoadState.Loading) {\n                binding.swipeRefreshLayout.isRefreshing = false\n            }\n\n            if (adapter.itemCount == 0) {\n                when (loadState.refresh) {\n                    is LoadState.NotLoading -> {\n                        if (loadState.append is LoadState.NotLoading && loadState.source.refresh is LoadState.NotLoading) {\n                            binding.statusView.show()\n                            binding.statusView.setup(\n                                R.drawable.elephant_friend_empty,\n                                R.string.message_empty,\n                                null\n                            )\n                        }\n                    }\n                    is LoadState.Error -> {\n                        binding.statusView.show()\n                        binding.statusView.setup((loadState.refresh as LoadState.Error).error)\n                    }\n                    is LoadState.Loading -> {\n                        binding.progressBar.show()\n                    }\n                }\n            }\n        }\n    }\n\n    override fun onDestroyView() {\n        // Clear the adapter to prevent leaking the View\n        adapter = null\n        super.onDestroyView()\n    }\n\n    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n        menuInflater.inflate(R.menu.fragment_account_media, menu)\n    }\n\n    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {\n        return when (menuItem.itemId) {\n            R.id.action_refresh -> {\n                binding.swipeRefreshLayout.isRefreshing = true\n                refreshContent()\n                true\n            }\n            else -> false\n        }\n    }\n\n    private fun onAttachmentClick(selected: AttachmentViewData, view: View) {\n        if (!selected.isRevealed) {\n            viewModel.revealAttachment(selected)\n            return\n        }\n        val attachmentsFromSameStatus = viewModel.attachmentData.filter { attachmentViewData ->\n            attachmentViewData.statusId == selected.statusId\n        }\n        val currentIndex = attachmentsFromSameStatus.indexOf(selected)\n\n        when (selected.attachment.type) {\n            Attachment.Type.IMAGE,\n            Attachment.Type.GIFV,\n            Attachment.Type.VIDEO,\n            Attachment.Type.AUDIO -> {\n                val intent = ViewMediaActivity.newIntent(\n                    view.context,\n                    attachmentsFromSameStatus,\n                    currentIndex\n                )\n                if (activity != null) {\n                    val url = selected.attachment.url\n                    ViewCompat.setTransitionName(view, url)\n                    val options = ActivityOptionsCompat.makeSceneTransitionAnimation(\n                        requireActivity(),\n                        view,\n                        url\n                    )\n                    startActivity(intent, options.toBundle())\n                } else {\n                    startActivity(intent)\n                }\n            }\n            Attachment.Type.UNKNOWN -> {\n                context?.openLink(selected.attachment.unknownUrl)\n            }\n        }\n    }\n\n    override fun refreshContent() {\n        adapter?.refresh()\n    }\n\n    companion object {\n\n        fun newInstance(accountId: String): AccountMediaFragment {\n            val fragment = AccountMediaFragment()\n            val args = Bundle(1)\n            args.putString(ACCOUNT_ID_ARG, accountId)\n            fragment.arguments = args\n            return fragment\n        }\n\n        private const val ACCOUNT_ID_ARG = \"account_id\"\n        private const val TAG = \"AccountMediaFragment\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/account/media/AccountMediaGridAdapter.kt",
    "content": "package com.keylesspalace.tusky.components.account.media\n\nimport android.content.Context\nimport android.graphics.Color\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.appcompat.content.res.AppCompatResources\nimport androidx.appcompat.widget.TooltipCompat\nimport androidx.core.view.setPadding\nimport androidx.paging.PagingDataAdapter\nimport androidx.recyclerview.widget.DiffUtil\nimport com.bumptech.glide.Glide\nimport com.google.android.material.R as materialR\nimport com.google.android.material.color.MaterialColors\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemAccountMediaBinding\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.util.BindingHolder\nimport com.keylesspalace.tusky.util.BlurhashDrawable\nimport com.keylesspalace.tusky.util.getFormattedDescription\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.viewdata.AttachmentViewData\nimport kotlin.random.Random\n\nclass AccountMediaGridAdapter(\n    private val useBlurhash: Boolean,\n    context: Context,\n    private val onAttachmentClickListener: (AttachmentViewData, View) -> Unit\n) : PagingDataAdapter<AttachmentViewData, BindingHolder<ItemAccountMediaBinding>>(\n    object : DiffUtil.ItemCallback<AttachmentViewData>() {\n        override fun areItemsTheSame(\n            oldItem: AttachmentViewData,\n            newItem: AttachmentViewData\n        ): Boolean {\n            return oldItem.attachment.id == newItem.attachment.id\n        }\n\n        override fun areContentsTheSame(\n            oldItem: AttachmentViewData,\n            newItem: AttachmentViewData\n        ): Boolean {\n            return oldItem == newItem\n        }\n    }\n) {\n\n    private val baseItemBackgroundColor = MaterialColors.getColor(\n        context,\n        materialR.attr.colorSurface,\n        Color.BLACK\n    )\n    private val videoIndicator = AppCompatResources.getDrawable(\n        context,\n        R.drawable.play_indicator\n    )\n    private val mediaHiddenDrawable = AppCompatResources.getDrawable(\n        context,\n        R.drawable.ic_visibility_off_24dp\n    )\n\n    private val itemBgBaseHSV = FloatArray(3)\n\n    override fun onCreateViewHolder(\n        parent: ViewGroup,\n        viewType: Int\n    ): BindingHolder<ItemAccountMediaBinding> {\n        val binding = ItemAccountMediaBinding.inflate(\n            LayoutInflater.from(parent.context),\n            parent,\n            false\n        )\n        Color.colorToHSV(baseItemBackgroundColor, itemBgBaseHSV)\n        itemBgBaseHSV[2] = itemBgBaseHSV[2] + Random.nextFloat() / 3f - 1f / 6f\n        binding.root.setBackgroundColor(Color.HSVToColor(itemBgBaseHSV))\n        return BindingHolder(binding)\n    }\n\n    override fun onBindViewHolder(holder: BindingHolder<ItemAccountMediaBinding>, position: Int) {\n        val context = holder.binding.root.context\n        getItem(position)?.let { item ->\n\n            val imageView = holder.binding.accountMediaImageView\n            val overlay = holder.binding.accountMediaImageViewOverlay\n\n            val blurhash = item.attachment.blurhash\n            val placeholder = if (useBlurhash && blurhash != null) {\n                BlurhashDrawable(context, blurhash)\n            } else {\n                null\n            }\n\n            if (item.attachment.type == Attachment.Type.AUDIO) {\n                overlay.hide()\n\n                imageView.setPadding(\n                    context.resources.getDimensionPixelSize(\n                        R.dimen.profile_media_audio_icon_padding\n                    )\n                )\n\n                Glide.with(imageView)\n                    .load(R.drawable.ic_music_box_24dp)\n                    .centerInside()\n                    .into(imageView)\n\n                imageView.contentDescription = item.attachment.getFormattedDescription(context)\n            } else if (item.sensitive && !item.isRevealed) {\n                overlay.show()\n                overlay.setImageDrawable(mediaHiddenDrawable)\n\n                imageView.setPadding(0)\n\n                Glide.with(imageView)\n                    .load(placeholder)\n                    .centerInside()\n                    .into(imageView)\n\n                imageView.contentDescription = imageView.context.getString(R.string.post_media_hidden_title)\n            } else {\n                if (item.attachment.type == Attachment.Type.VIDEO || item.attachment.type == Attachment.Type.GIFV) {\n                    overlay.show()\n                    overlay.setImageDrawable(videoIndicator)\n                } else {\n                    overlay.hide()\n                }\n\n                imageView.setPadding(0)\n\n                Glide.with(imageView)\n                    .asBitmap()\n                    .load(item.attachment.previewUrl)\n                    .placeholder(placeholder)\n                    .centerInside()\n                    .into(imageView)\n\n                imageView.contentDescription = item.attachment.getFormattedDescription(context)\n            }\n\n            holder.binding.root.setOnClickListener {\n                onAttachmentClickListener(item, imageView)\n            }\n\n            TooltipCompat.setTooltipText(holder.binding.root, imageView.contentDescription)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/account/media/AccountMediaPagingSource.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.account.media\n\nimport androidx.paging.PagingSource\nimport androidx.paging.PagingState\nimport com.keylesspalace.tusky.viewdata.AttachmentViewData\n\nclass AccountMediaPagingSource(\n    private val viewModel: AccountMediaViewModel\n) : PagingSource<String, AttachmentViewData>() {\n\n    override fun getRefreshKey(state: PagingState<String, AttachmentViewData>): String? = null\n\n    override suspend fun load(params: LoadParams<String>): LoadResult<String, AttachmentViewData> {\n        return if (params is LoadParams.Refresh) {\n            val list = viewModel.attachmentData.toList()\n            LoadResult.Page(list, null, list.lastOrNull()?.statusId)\n        } else {\n            LoadResult.Page(emptyList(), null, null)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/account/media/AccountMediaRemoteMediator.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.account.media\n\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.LoadType\nimport androidx.paging.PagingState\nimport androidx.paging.RemoteMediator\nimport com.keylesspalace.tusky.components.timeline.util.ifExpected\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.viewdata.AttachmentViewData\nimport retrofit2.HttpException\n\n@OptIn(ExperimentalPagingApi::class)\nclass AccountMediaRemoteMediator(\n    private val api: MastodonApi,\n    private val activeAccount: AccountEntity,\n    private val viewModel: AccountMediaViewModel\n) : RemoteMediator<String, AttachmentViewData>() {\n    override suspend fun load(\n        loadType: LoadType,\n        state: PagingState<String, AttachmentViewData>\n    ): MediatorResult {\n        try {\n            val statusResponse = when (loadType) {\n                LoadType.REFRESH -> {\n                    api.accountStatuses(viewModel.accountId, onlyMedia = true)\n                }\n                LoadType.PREPEND -> {\n                    return MediatorResult.Success(endOfPaginationReached = true)\n                }\n                LoadType.APPEND -> {\n                    val maxId = state.lastItemOrNull()?.statusId\n                    if (maxId != null) {\n                        api.accountStatuses(viewModel.accountId, maxId = maxId, onlyMedia = true)\n                    } else {\n                        return MediatorResult.Success(endOfPaginationReached = false)\n                    }\n                }\n            }\n\n            val statuses = statusResponse.body()\n            if (!statusResponse.isSuccessful || statuses == null) {\n                return MediatorResult.Error(HttpException(statusResponse))\n            }\n\n            val attachments = statuses.flatMap { status ->\n                status.attachments.map { attachment ->\n                    AttachmentViewData(\n                        attachment = attachment,\n                        statusId = status.id,\n                        statusUrl = status.url.orEmpty(),\n                        sensitive = status.sensitive,\n                        isRevealed = activeAccount.alwaysShowSensitiveMedia || !status.sensitive\n                    )\n                }\n            }\n\n            if (loadType == LoadType.REFRESH) {\n                viewModel.attachmentData.clear()\n            }\n\n            viewModel.attachmentData.addAll(attachments)\n\n            viewModel.currentSource?.invalidate()\n            return MediatorResult.Success(endOfPaginationReached = statuses.isEmpty())\n        } catch (e: Exception) {\n            return ifExpected(e) {\n                MediatorResult.Error(e)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/account/media/AccountMediaViewModel.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.account.media\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.Pager\nimport androidx.paging.PagingConfig\nimport androidx.paging.cachedIn\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.viewdata.AttachmentViewData\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\n\n@HiltViewModel\nclass AccountMediaViewModel @Inject constructor(\n    accountManager: AccountManager,\n    api: MastodonApi\n) : ViewModel() {\n\n    lateinit var accountId: String\n\n    val attachmentData: MutableList<AttachmentViewData> = mutableListOf()\n\n    var currentSource: AccountMediaPagingSource? = null\n\n    val activeAccount = accountManager.activeAccount!!\n\n    @OptIn(ExperimentalPagingApi::class)\n    val media = Pager(\n        config = PagingConfig(\n            pageSize = LOAD_AT_ONCE,\n            prefetchDistance = LOAD_AT_ONCE * 2\n        ),\n        pagingSourceFactory = {\n            AccountMediaPagingSource(\n                viewModel = this\n            ).also { source ->\n                currentSource = source\n            }\n        },\n        remoteMediator = AccountMediaRemoteMediator(api, activeAccount, this)\n    ).flow\n        .cachedIn(viewModelScope)\n\n    fun revealAttachment(viewData: AttachmentViewData) {\n        val position = attachmentData.indexOfFirst { oldViewData -> oldViewData.id == viewData.id }\n        attachmentData[position] = viewData.copy(isRevealed = true)\n        currentSource?.invalidate()\n    }\n\n    companion object {\n        private const val LOAD_AT_ONCE = 30\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/account/media/GridSpacingItemDecoration.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.account.media\n\nimport android.graphics.Rect\nimport android.view.View\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.RecyclerView.ItemDecoration\n\nclass GridSpacingItemDecoration(\n    private val spanCount: Int,\n    private val spacing: Int,\n    private val topOffset: Int\n) : ItemDecoration() {\n\n    override fun getItemOffsets(\n        outRect: Rect,\n        view: View,\n        parent: RecyclerView,\n        state: RecyclerView.State\n    ) {\n        val position = parent.getChildAdapterPosition(view) // item position\n        if (position < topOffset) return\n\n        val column = (position - topOffset) % spanCount // item column\n\n        outRect.left = column * spacing / spanCount // column * ((1f / spanCount) * spacing)\n        outRect.right =\n            spacing - (column + 1) * spacing / spanCount // spacing - (column + 1) * ((1f / spanCount) * spacing)\n        if (position - topOffset >= spanCount) {\n            outRect.top = spacing // item top\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/account/media/SquareImageView.kt",
    "content": "package com.keylesspalace.tusky.components.account.media\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport androidx.appcompat.widget.AppCompatImageView\n\n/**\n * Created by charlag on 26/10/2017.\n */\n\nclass SquareImageView : AppCompatImageView {\n    constructor(context: Context) : super(context)\n\n    constructor(context: Context, attributes: AttributeSet) : super(context, attributes)\n\n    constructor(context: Context, attributes: AttributeSet, defStyleAttr: Int) :\n        super(context, attributes, defStyleAttr)\n\n    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {\n        super.onMeasure(widthMeasureSpec, heightMeasureSpec)\n        val width = measuredWidth\n        setMeasuredDimension(width, width)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/accountlist/AccountListActivity.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.accountlist\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.fragment.app.commit\nimport com.keylesspalace.tusky.BottomSheetActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ActivityAccountListBinding\nimport com.keylesspalace.tusky.util.getSerializableExtraCompat\nimport dagger.hilt.android.AndroidEntryPoint\n\n@AndroidEntryPoint\nclass AccountListActivity : BottomSheetActivity() {\n\n    enum class Type {\n        FOLLOWS,\n        FOLLOWERS,\n        BLOCKS,\n        MUTES,\n        FOLLOW_REQUESTS,\n        REBLOGGED,\n        FAVOURITED\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        val binding = ActivityAccountListBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n\n        val type = intent.getSerializableExtraCompat<Type>(EXTRA_TYPE)!!\n        val id: String? = intent.getStringExtra(EXTRA_ID)\n\n        setSupportActionBar(binding.includedToolbar.toolbar)\n        supportActionBar?.apply {\n            when (type) {\n                Type.BLOCKS -> setTitle(R.string.title_blocks)\n                Type.MUTES -> setTitle(R.string.title_mutes)\n                Type.FOLLOW_REQUESTS -> setTitle(R.string.title_follow_requests)\n                Type.FOLLOWERS -> setTitle(R.string.title_followers)\n                Type.FOLLOWS -> setTitle(R.string.title_follows)\n                Type.REBLOGGED -> setTitle(R.string.title_reblogged_by)\n                Type.FAVOURITED -> setTitle(R.string.title_favourited_by)\n            }\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n        }\n\n        if (supportFragmentManager.findFragmentById(R.id.fragment_container) == null) {\n            supportFragmentManager.commit {\n                val fragment = AccountListFragment.newInstance(type, id)\n                replace(R.id.fragment_container, fragment)\n            }\n        }\n    }\n\n    companion object {\n        private const val EXTRA_TYPE = \"type\"\n        private const val EXTRA_ID = \"id\"\n\n        fun newIntent(context: Context, type: Type, id: String? = null): Intent {\n            return Intent(context, AccountListActivity::class.java).apply {\n                putExtra(EXTRA_TYPE, type)\n                putExtra(EXTRA_ID, id)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/accountlist/AccountListFragment.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.accountlist\n\nimport android.content.SharedPreferences\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.View\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.lifecycleScope\nimport androidx.paging.LoadState\nimport androidx.recyclerview.widget.ConcatAdapter\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.SimpleItemAnimator\nimport com.google.android.material.snackbar.BaseTransientBottomBar\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.BottomSheetActivity\nimport com.keylesspalace.tusky.PostLookupFallbackBehavior\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.StatusListActivity\nimport com.keylesspalace.tusky.adapter.LoadStateFooterAdapter\nimport com.keylesspalace.tusky.components.account.AccountActivity\nimport com.keylesspalace.tusky.components.accountlist.AccountListActivity.Type\nimport com.keylesspalace.tusky.components.accountlist.adapter.BlocksAdapter\nimport com.keylesspalace.tusky.components.accountlist.adapter.FollowAdapter\nimport com.keylesspalace.tusky.components.accountlist.adapter.FollowRequestsAdapter\nimport com.keylesspalace.tusky.components.accountlist.adapter.FollowRequestsHeaderAdapter\nimport com.keylesspalace.tusky.components.accountlist.adapter.MutesAdapter\nimport com.keylesspalace.tusky.databinding.FragmentAccountListBinding\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.interfaces.AccountActionListener\nimport com.keylesspalace.tusky.interfaces.LinkListener\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.util.ensureBottomPadding\nimport com.keylesspalace.tusky.util.getSerializableCompat\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.util.visible\nimport dagger.hilt.android.AndroidEntryPoint\nimport dagger.hilt.android.lifecycle.withCreationCallback\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass AccountListFragment :\n    Fragment(R.layout.fragment_account_list),\n    AccountActionListener,\n    LinkListener {\n\n    @Inject\n    lateinit var accountManager: AccountManager\n\n    @Inject\n    lateinit var preferences: SharedPreferences\n\n    private val binding by viewBinding(FragmentAccountListBinding::bind)\n\n    private val viewModel: AccountListViewModel by viewModels(\n        extrasProducer = {\n            defaultViewModelCreationExtras.withCreationCallback<AccountListViewModel.Factory> { factory ->\n                factory.create(\n                    type = requireArguments().getSerializableCompat(ARG_TYPE)!!,\n                    accountId = requireArguments().getString(ARG_ID)\n                )\n            }\n        }\n    )\n\n    private lateinit var type: Type\n    private var id: String? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        type = requireArguments().getSerializableCompat(ARG_TYPE)!!\n        id = requireArguments().getString(ARG_ID)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        binding.recyclerView.ensureBottomPadding()\n        binding.recyclerView.setHasFixedSize(true)\n        val layoutManager = LinearLayoutManager(view.context)\n        binding.recyclerView.layoutManager = layoutManager\n        (binding.recyclerView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false\n        binding.recyclerView.addItemDecoration(\n            DividerItemDecoration(view.context, DividerItemDecoration.VERTICAL)\n        )\n\n        val animateAvatar = preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false)\n        val animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false)\n        val showBotOverlay = preferences.getBoolean(PrefKeys.SHOW_BOT_OVERLAY, true)\n\n        val activeAccount = accountManager.activeAccount!!\n\n        val adapter = when (type) {\n            Type.BLOCKS -> BlocksAdapter(this, animateAvatar, animateEmojis, showBotOverlay)\n            Type.MUTES -> MutesAdapter(this, animateAvatar, animateEmojis, showBotOverlay)\n            Type.FOLLOW_REQUESTS -> {\n                val headerAdapter = FollowRequestsHeaderAdapter(\n                    instanceName = activeAccount.domain,\n                    accountLocked = activeAccount.locked\n                )\n                val followRequestsAdapter =\n                    FollowRequestsAdapter(this, this, animateAvatar, animateEmojis, showBotOverlay)\n                binding.recyclerView.adapter = ConcatAdapter(headerAdapter, followRequestsAdapter)\n                followRequestsAdapter\n            }\n            else -> FollowAdapter(this, animateAvatar, animateEmojis, showBotOverlay)\n        }\n\n        binding.recyclerView.adapter = adapter.withLoadStateFooter(LoadStateFooterAdapter(adapter::retry))\n\n        binding.swipeRefreshLayout.setOnRefreshListener { adapter.refresh() }\n\n        lifecycleScope.launch {\n            viewModel.accountPager.collectLatest { pagingData ->\n                adapter.submitData(pagingData)\n            }\n        }\n\n        lifecycleScope.launch {\n            viewModel.uiEvents.collect { event ->\n                val message = if (event.throwable != null) {\n                    getString(event.message, event.user, event.throwable.message ?: getString(R.string.error_generic))\n                } else {\n                    getString(event.message, event.user)\n                }\n                Snackbar.make(binding.recyclerView, message, Snackbar.LENGTH_LONG)\n                    .setAction(event.actionText, event.action)\n                    .addCallback(object : BaseTransientBottomBar.BaseCallback<Snackbar>() {\n                        override fun onDismissed(transientBottomBar: Snackbar, eventType: Int) {\n                            viewModel.consumeEvent(event)\n                        }\n                    })\n                    .show()\n            }\n        }\n\n        adapter.addLoadStateListener { loadState ->\n            binding.progressBar.visible(\n                loadState.refresh == LoadState.Loading && adapter.itemCount == 0\n            )\n\n            if (loadState.refresh != LoadState.Loading) {\n                binding.swipeRefreshLayout.isRefreshing = false\n            }\n\n            if (loadState.refresh is LoadState.Error) {\n                binding.recyclerView.hide()\n                binding.messageView.show()\n                val errorState = loadState.refresh as LoadState.Error\n                binding.messageView.setup(errorState.error) { adapter.retry() }\n                Log.w(TAG, \"error loading accounts\", errorState.error)\n            } else if (loadState.refresh is LoadState.NotLoading && adapter.itemCount == 0) {\n                binding.recyclerView.hide()\n                binding.messageView.show()\n                binding.messageView.setup(R.drawable.elephant_friend_empty, R.string.message_empty)\n            } else {\n                binding.recyclerView.show()\n                binding.messageView.hide()\n            }\n        }\n    }\n\n    override fun onViewTag(tag: String) {\n        activity?.startActivityWithSlideInAnimation(\n            StatusListActivity.newHashtagIntent(requireContext(), tag)\n        )\n    }\n\n    override fun onViewAccount(id: String) {\n        activity?.startActivityWithSlideInAnimation(AccountActivity.getIntent(requireContext(), id))\n    }\n\n    override fun onViewUrl(url: String) {\n        (activity as BottomSheetActivity?)?.viewUrl(url, PostLookupFallbackBehavior.OPEN_IN_BROWSER)\n    }\n\n    override fun onMute(mute: Boolean, id: String, position: Int, notifications: Boolean) {\n        if (mute) {\n            viewModel.mute(id, notifications)\n        } else {\n            viewModel.unmute(id)\n        }\n    }\n\n    override fun onBlock(block: Boolean, id: String, position: Int) {\n        viewModel.unblock(id)\n    }\n\n    override fun onRespondToFollowRequest(accept: Boolean, accountIdRequestingFollow: String, position: Int) {\n        viewModel.respondToFollowRequest(accept, accountIdRequestingFollow)\n    }\n\n    companion object {\n        private const val TAG = \"AccountListFragment\"\n        private const val ARG_TYPE = \"type\"\n        private const val ARG_ID = \"id\"\n\n        fun newInstance(type: Type, id: String? = null): AccountListFragment {\n            return AccountListFragment().apply {\n                arguments = Bundle(2).apply {\n                    putSerializable(ARG_TYPE, type)\n                    putString(ARG_ID, id)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/accountlist/AccountListPagingSource.kt",
    "content": "/* Copyright 2025 Tusky Contributors.\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.accountlist\n\nimport androidx.paging.PagingSource\nimport androidx.paging.PagingState\n\nclass AccountListPagingSource(\n    private val accounts: List<AccountViewData>,\n    private val nextKey: String?\n) : PagingSource<String, AccountViewData>() {\n    override fun getRefreshKey(state: PagingState<String, AccountViewData>): String? = null\n\n    override suspend fun load(params: LoadParams<String>): LoadResult<String, AccountViewData> {\n        return if (params is LoadParams.Refresh) {\n            LoadResult.Page(accounts, null, nextKey)\n        } else {\n            LoadResult.Page(emptyList(), null, null)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/accountlist/AccountListRemoteMediator.kt",
    "content": "/* Copyright 2025 Tusky Contributors.\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.accountlist\n\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.LoadType\nimport androidx.paging.PagingState\nimport androidx.paging.RemoteMediator\nimport at.connyduck.calladapter.networkresult.getOrElse\nimport com.keylesspalace.tusky.components.accountlist.AccountListActivity.Type\nimport com.keylesspalace.tusky.entity.TimelineAccount\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.HttpHeaderLink\nimport retrofit2.HttpException\nimport retrofit2.Response\n\n@OptIn(ExperimentalPagingApi::class)\nclass AccountListRemoteMediator(\n    private val api: MastodonApi,\n    private val viewModel: AccountListViewModel,\n    private val fetchRelationships: Boolean\n) : RemoteMediator<String, AccountViewData>() {\n\n    override suspend fun load(\n        loadType: LoadType,\n        state: PagingState<String, AccountViewData>\n    ): MediatorResult {\n        return try {\n            val response = request(loadType)\n                ?: return MediatorResult.Success(endOfPaginationReached = true)\n\n            return applyResponse(response)\n        } catch (e: Exception) {\n            MediatorResult.Error(e)\n        }\n    }\n\n    private suspend fun request(loadType: LoadType): Response<List<TimelineAccount>>? {\n        return when (loadType) {\n            LoadType.PREPEND -> null\n            LoadType.APPEND -> getFetchCallByListType(fromId = viewModel.nextKey)\n            LoadType.REFRESH -> {\n                viewModel.nextKey = null\n                viewModel.accounts.clear()\n                getFetchCallByListType(null)\n            }\n        }\n    }\n\n    private suspend fun applyResponse(response: Response<List<TimelineAccount>>): MediatorResult {\n        val accounts = response.body()\n        if (!response.isSuccessful || accounts == null) {\n            return MediatorResult.Error(HttpException(response))\n        }\n\n        val links = HttpHeaderLink.parse(response.headers()[\"Link\"])\n        viewModel.nextKey = HttpHeaderLink.findByRelationType(links, \"next\")?.uri?.getQueryParameter(\"max_id\")\n\n        val relationships = if (fetchRelationships) {\n            api.relationships(accounts.map { it.id }).getOrElse { e ->\n                return MediatorResult.Error(e)\n            }\n        } else {\n            emptyList()\n        }\n\n        val viewModels = accounts.map { account ->\n            account.toViewData(\n                mutingNotifications = relationships.find { it.id == account.id }?.mutingNotifications == true\n            )\n        }\n\n        viewModel.accounts.addAll(viewModels)\n        viewModel.invalidate()\n\n        return MediatorResult.Success(endOfPaginationReached = viewModel.nextKey == null)\n    }\n\n    private fun requireId(type: Type, id: String?): String {\n        return requireNotNull(id) { \"id must not be null for type \" + type.name }\n    }\n\n    private suspend fun getFetchCallByListType(fromId: String?): Response<List<TimelineAccount>> {\n        return when (viewModel.type) {\n            Type.FOLLOWS -> {\n                val accountId = requireId(viewModel.type, viewModel.accountId)\n                api.accountFollowing(accountId, fromId)\n            }\n            Type.FOLLOWERS -> {\n                val accountId = requireId(viewModel.type, viewModel.accountId)\n                api.accountFollowers(accountId, fromId)\n            }\n            Type.BLOCKS -> api.blocks(fromId)\n            Type.MUTES -> api.mutes(fromId)\n            Type.FOLLOW_REQUESTS -> api.followRequests(fromId)\n            Type.REBLOGGED -> {\n                val statusId = requireId(viewModel.type, viewModel.accountId)\n                api.statusRebloggedBy(statusId, fromId)\n            }\n            Type.FAVOURITED -> {\n                val statusId = requireId(viewModel.type, viewModel.accountId)\n                api.statusFavouritedBy(statusId, fromId)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/accountlist/AccountListViewModel.kt",
    "content": "/* Copyright 2025 Tusky Contributors.\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.accountlist\n\nimport android.view.View\nimport androidx.annotation.StringRes\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.InvalidatingPagingSourceFactory\nimport androidx.paging.Pager\nimport androidx.paging.PagingConfig\nimport androidx.paging.cachedIn\nimport at.connyduck.calladapter.networkresult.fold\nimport at.connyduck.calladapter.networkresult.onFailure\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.network.MastodonApi\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedFactory\nimport dagger.assisted.AssistedInject\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.update\nimport kotlinx.coroutines.launch\n\n@HiltViewModel(assistedFactory = AccountListViewModel.Factory::class)\nclass AccountListViewModel @AssistedInject constructor(\n    private val api: MastodonApi,\n    @Assisted(\"type\") val type: AccountListActivity.Type,\n    @Assisted(\"id\") val accountId: String?\n) : ViewModel() {\n\n    private val factory = InvalidatingPagingSourceFactory {\n        AccountListPagingSource(accounts.toList(), nextKey)\n    }\n\n    @OptIn(ExperimentalPagingApi::class)\n    val accountPager = Pager(\n        config = PagingConfig(40),\n        remoteMediator = AccountListRemoteMediator(api, this, fetchRelationships = type == AccountListActivity.Type.MUTES),\n        pagingSourceFactory = factory\n    ).flow\n        .cachedIn(viewModelScope)\n\n    val accounts: MutableList<AccountViewData> = mutableListOf()\n    var nextKey: String? = null\n\n    private val _uiEvents = MutableStateFlow<List<SnackbarEvent>>(emptyList())\n    val uiEvents: Flow<SnackbarEvent> = _uiEvents.map { it.firstOrNull() }.filterNotNull().distinctUntilChanged()\n\n    fun invalidate() {\n        factory.invalidate()\n    }\n\n    // this is called by the mute notification toggle\n    fun mute(accountId: String, notifications: Boolean) {\n        val accountViewData = accounts.find { it.id == accountId } ?: return\n        viewModelScope.launch {\n            api.muteAccount(accountId, notifications).onFailure { e ->\n                sendEvent(\n                    SnackbarEvent(\n                        message = R.string.mute_failure,\n                        user = \"@${accountViewData.account.username}\",\n                        throwable = e,\n                        actionText = R.string.action_retry,\n                        action = { mute(accountId, notifications) }\n                    )\n                )\n            }\n        }\n    }\n\n    // this is called when unmuting is undone\n    private fun remute(accountViewData: AccountViewData) {\n        viewModelScope.launch {\n            api.muteAccount(accountViewData.id).fold({\n                accounts.add(accountViewData)\n                invalidate()\n            }, { e ->\n                sendEvent(\n                    SnackbarEvent(\n                        message = R.string.mute_failure,\n                        user = \"@${accountViewData.account.username}\",\n                        throwable = e,\n                        actionText = R.string.action_retry,\n                        action = { block(accountViewData) }\n                    )\n                )\n            })\n        }\n    }\n\n    fun unmute(accountId: String) {\n        val accountViewData = accounts.find { it.id == accountId } ?: return\n        viewModelScope.launch {\n            api.unmuteAccount(accountId).fold({\n                accounts.removeIf { it.id == accountId }\n                invalidate()\n                sendEvent(\n                    SnackbarEvent(\n                        message = R.string.unmute_success,\n                        user = \"@${accountViewData.account.username}\",\n                        throwable = null,\n                        actionText = R.string.action_undo,\n                        action = { remute(accountViewData) }\n                    )\n                )\n            }, { error ->\n                sendEvent(\n                    SnackbarEvent(\n                        message = R.string.unmute_failure,\n                        user = \"@${accountViewData.account.username}\",\n                        throwable = error,\n                        actionText = R.string.action_retry,\n                        action = { unmute(accountId) }\n                    )\n                )\n            })\n        }\n    }\n\n    fun unblock(accountId: String) {\n        val accountViewData = accounts.find { it.id == accountId } ?: return\n        viewModelScope.launch {\n            api.unblockAccount(accountId).fold({\n                accounts.removeIf { it.id == accountId }\n                invalidate()\n                sendEvent(\n                    SnackbarEvent(\n                        message = R.string.unblock_success,\n                        user = \"@${accountViewData.account.username}\",\n                        throwable = null,\n                        actionText = R.string.action_undo,\n                        action = { block(accountViewData) }\n                    )\n                )\n            }, { e ->\n                sendEvent(\n                    SnackbarEvent(\n                        message = R.string.unblock_failure,\n                        user = \"@${accountViewData.account.username}\",\n                        throwable = e,\n                        actionText = R.string.action_retry,\n                        action = { unblock(accountId) }\n                    )\n                )\n            })\n        }\n    }\n\n    private fun block(accountViewData: AccountViewData) {\n        viewModelScope.launch {\n            api.blockAccount(accountViewData.id).fold({\n                accounts.add(accountViewData)\n                invalidate()\n            }, { e ->\n                sendEvent(\n                    SnackbarEvent(\n                        message = R.string.block_failure,\n                        user = \"@${accountViewData.account.username}\",\n                        throwable = e,\n                        actionText = R.string.action_retry,\n                        action = { block(accountViewData) }\n                    )\n                )\n            })\n        }\n    }\n\n    fun respondToFollowRequest(accept: Boolean, accountId: String) {\n        val accountViewData = accounts.find { it.id == accountId } ?: return\n        viewModelScope.launch {\n            if (accept) {\n                api.authorizeFollowRequest(accountId)\n            } else {\n                api.rejectFollowRequest(accountId)\n            }.fold({\n                accounts.removeIf { it.id == accountId }\n                invalidate()\n            }, { e ->\n                sendEvent(\n                    SnackbarEvent(\n                        message = if (accept) R.string.accept_follow_request_failure else R.string.reject_follow_request_failure,\n                        user = \"@${accountViewData.account.username}\",\n                        throwable = e,\n                        actionText = R.string.action_retry,\n                        action = { respondToFollowRequest(accept, accountId) }\n                    )\n                )\n            })\n        }\n    }\n\n    fun consumeEvent(event: SnackbarEvent) {\n        println(\"event consumed $event\")\n        _uiEvents.update { uiEvents ->\n            uiEvents - event\n        }\n    }\n\n    private fun sendEvent(event: SnackbarEvent) {\n        println(\"event sent $event\")\n        _uiEvents.update { uiEvents ->\n            uiEvents + event\n        }\n    }\n\n    @AssistedFactory\n    interface Factory {\n        fun create(\n            @Assisted(\"type\") type: AccountListActivity.Type,\n            @Assisted(\"id\") accountId: String?\n        ): AccountListViewModel\n    }\n}\n\nclass SnackbarEvent(\n    @StringRes val message: Int,\n    val user: String,\n    @StringRes val actionText: Int,\n    val action: (View) -> Unit,\n    val throwable: Throwable? = null\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/accountlist/AccountViewData.kt",
    "content": "/* Copyright 2025 Tusky Contributors.\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.accountlist\n\nimport com.keylesspalace.tusky.entity.TimelineAccount\n\ndata class AccountViewData(\n    val account: TimelineAccount,\n    val mutingNotifications: Boolean\n) {\n    val id: String\n        get() = account.id\n}\n\nfun TimelineAccount.toViewData(\n    mutingNotifications: Boolean\n) = AccountViewData(\n    account = this,\n    mutingNotifications = mutingNotifications\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/accountlist/adapter/AccountAdapter.kt",
    "content": "/* Copyright 2021 Tusky Contributors.\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\npackage com.keylesspalace.tusky.components.accountlist.adapter\n\nimport androidx.paging.PagingDataAdapter\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.components.accountlist.AccountViewData\nimport com.keylesspalace.tusky.interfaces.AccountActionListener\n\nabstract class AccountAdapter<AVH : RecyclerView.ViewHolder>(\n    protected val accountActionListener: AccountActionListener,\n    protected val animateAvatar: Boolean,\n    protected val animateEmojis: Boolean,\n    protected val showBotOverlay: Boolean\n) : PagingDataAdapter<AccountViewData, AVH>(AccountViewDataDifferCallback) {\n\n    companion object {\n        private val AccountViewDataDifferCallback = object : DiffUtil.ItemCallback<AccountViewData>() {\n            override fun areItemsTheSame(\n                oldItem: AccountViewData,\n                newItem: AccountViewData\n            ): Boolean {\n                return oldItem.id == newItem.id\n            }\n\n            override fun areContentsTheSame(\n                oldItem: AccountViewData,\n                newItem: AccountViewData\n            ): Boolean {\n                return oldItem == newItem\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/accountlist/adapter/BlocksAdapter.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.accountlist.adapter\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemBlockedUserBinding\nimport com.keylesspalace.tusky.interfaces.AccountActionListener\nimport com.keylesspalace.tusky.util.BindingHolder\nimport com.keylesspalace.tusky.util.emojify\nimport com.keylesspalace.tusky.util.loadAvatar\nimport com.keylesspalace.tusky.util.visible\n\n/** Displays a list of blocked accounts. */\nclass BlocksAdapter(\n    accountActionListener: AccountActionListener,\n    animateAvatar: Boolean,\n    animateEmojis: Boolean,\n    showBotOverlay: Boolean\n) : AccountAdapter<BindingHolder<ItemBlockedUserBinding>>(\n    accountActionListener = accountActionListener,\n    animateAvatar = animateAvatar,\n    animateEmojis = animateEmojis,\n    showBotOverlay = showBotOverlay\n) {\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemBlockedUserBinding> {\n        return BindingHolder(\n            ItemBlockedUserBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n        )\n    }\n\n    override fun onBindViewHolder(viewHolder: BindingHolder<ItemBlockedUserBinding>, position: Int) {\n        getItem(position)?.let { viewData ->\n            val account = viewData.account\n            val binding = viewHolder.binding\n            val context = binding.root.context\n\n            val emojifiedName = account.name.emojify(\n                account.emojis,\n                binding.blockedUserDisplayName,\n                animateEmojis\n            )\n            binding.blockedUserDisplayName.text = emojifiedName\n            val formattedUsername = context.getString(R.string.post_username_format, account.username)\n            binding.blockedUserUsername.text = formattedUsername\n\n            val avatarRadius = context.resources.getDimensionPixelSize(R.dimen.avatar_radius_48dp)\n            loadAvatar(account.avatar, binding.blockedUserAvatar, avatarRadius, animateAvatar)\n\n            binding.blockedUserBotBadge.visible(showBotOverlay && account.bot)\n\n            binding.blockedUserUnblock.setOnClickListener {\n                accountActionListener.onBlock(false, account.id, position)\n            }\n            binding.root.setOnClickListener {\n                accountActionListener.onViewAccount(account.id)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/accountlist/adapter/FollowAdapter.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.accountlist.adapter\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport com.keylesspalace.tusky.adapter.AccountViewHolder\nimport com.keylesspalace.tusky.databinding.ItemAccountBinding\nimport com.keylesspalace.tusky.interfaces.AccountActionListener\n\n/** Displays either a follows or following list.  */\nclass FollowAdapter(\n    accountActionListener: AccountActionListener,\n    animateAvatar: Boolean,\n    animateEmojis: Boolean,\n    showBotOverlay: Boolean\n) : AccountAdapter<AccountViewHolder>(\n    accountActionListener = accountActionListener,\n    animateAvatar = animateAvatar,\n    animateEmojis = animateEmojis,\n    showBotOverlay = showBotOverlay\n) {\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AccountViewHolder {\n        val binding = ItemAccountBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n        return AccountViewHolder(binding)\n    }\n\n    override fun onBindViewHolder(viewHolder: AccountViewHolder, position: Int) {\n        getItem(position)?.let { viewData ->\n            viewHolder.setupWithAccount(\n                viewData.account,\n                animateAvatar,\n                animateEmojis,\n                showBotOverlay\n            )\n            viewHolder.setupActionListener(accountActionListener)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/accountlist/adapter/FollowRequestsAdapter.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.accountlist.adapter\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport com.keylesspalace.tusky.adapter.FollowRequestViewHolder\nimport com.keylesspalace.tusky.databinding.ItemFollowRequestBinding\nimport com.keylesspalace.tusky.interfaces.AccountActionListener\nimport com.keylesspalace.tusky.interfaces.LinkListener\n\n/** Displays a list of follow requests with accept/reject buttons. */\nclass FollowRequestsAdapter(\n    accountActionListener: AccountActionListener,\n    private val linkListener: LinkListener,\n    animateAvatar: Boolean,\n    animateEmojis: Boolean,\n    showBotOverlay: Boolean\n) : AccountAdapter<FollowRequestViewHolder>(\n    accountActionListener = accountActionListener,\n    animateAvatar = animateAvatar,\n    animateEmojis = animateEmojis,\n    showBotOverlay = showBotOverlay\n) {\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FollowRequestViewHolder {\n        val binding = ItemFollowRequestBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n        return FollowRequestViewHolder(binding, accountActionListener, linkListener, showHeader = false)\n    }\n\n    override fun onBindViewHolder(viewHolder: FollowRequestViewHolder, position: Int) {\n        getItem(position)?.let { viewData ->\n            viewHolder.setupWithAccount(\n                account = viewData.account,\n                animateAvatar = animateAvatar,\n                animateEmojis = animateEmojis,\n                showBotOverlay = showBotOverlay\n            )\n            viewHolder.setupActionListener(accountActionListener, viewData.account.id)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/accountlist/adapter/FollowRequestsHeaderAdapter.kt",
    "content": "/* Copyright 2020 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.accountlist.adapter\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemFollowRequestsHeaderBinding\nimport com.keylesspalace.tusky.util.BindingHolder\n\nclass FollowRequestsHeaderAdapter(\n    private val instanceName: String,\n    private val accountLocked: Boolean\n) : RecyclerView.Adapter<BindingHolder<ItemFollowRequestsHeaderBinding>>() {\n\n    override fun onCreateViewHolder(\n        parent: ViewGroup,\n        viewType: Int\n    ): BindingHolder<ItemFollowRequestsHeaderBinding> {\n        val binding = ItemFollowRequestsHeaderBinding.inflate(\n            LayoutInflater.from(parent.context),\n            parent,\n            false\n        )\n        return BindingHolder(binding)\n    }\n\n    override fun onBindViewHolder(\n        viewHolder: BindingHolder<ItemFollowRequestsHeaderBinding>,\n        position: Int\n    ) {\n        viewHolder.binding.root.text = viewHolder.binding.root.context.getString(R.string.follow_requests_info, instanceName)\n    }\n\n    override fun getItemCount() = if (accountLocked) 0 else 1\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/accountlist/adapter/MutesAdapter.kt",
    "content": "/* Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.accountlist.adapter\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.core.view.ViewCompat\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemMutedUserBinding\nimport com.keylesspalace.tusky.interfaces.AccountActionListener\nimport com.keylesspalace.tusky.util.BindingHolder\nimport com.keylesspalace.tusky.util.emojify\nimport com.keylesspalace.tusky.util.loadAvatar\nimport com.keylesspalace.tusky.util.visible\n\n/** Displays a list of muted accounts with mute/unmute account button and mute/unmute notifications switch */\nclass MutesAdapter(\n    accountActionListener: AccountActionListener,\n    animateAvatar: Boolean,\n    animateEmojis: Boolean,\n    showBotOverlay: Boolean\n) : AccountAdapter<BindingHolder<ItemMutedUserBinding>>(\n    accountActionListener = accountActionListener,\n    animateAvatar = animateAvatar,\n    animateEmojis = animateEmojis,\n    showBotOverlay = showBotOverlay\n) {\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemMutedUserBinding> {\n        return BindingHolder(\n            ItemMutedUserBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n        )\n    }\n\n    override fun onBindViewHolder(viewHolder: BindingHolder<ItemMutedUserBinding>, position: Int) {\n        getItem(position)?.let { viewData ->\n            val account = viewData.account\n            val binding = viewHolder.binding\n            val context = binding.root.context\n\n            val emojifiedName = account.name.emojify(\n                account.emojis,\n                binding.mutedUserDisplayName,\n                animateEmojis\n            )\n            binding.mutedUserDisplayName.text = emojifiedName\n\n            val formattedUsername = context.getString(R.string.post_username_format, account.username)\n            binding.mutedUserUsername.text = formattedUsername\n\n            val avatarRadius = context.resources.getDimensionPixelSize(R.dimen.avatar_radius_48dp)\n            loadAvatar(account.avatar, binding.mutedUserAvatar, avatarRadius, animateAvatar)\n\n            binding.mutedUserBotBadge.visible(showBotOverlay && account.bot)\n\n            val unmuteString = context.getString(R.string.action_unmute_desc, formattedUsername)\n            binding.mutedUserUnmute.contentDescription = unmuteString\n            ViewCompat.setTooltipText(binding.mutedUserUnmute, unmuteString)\n\n            binding.mutedUserMuteNotifications.setOnCheckedChangeListener(null)\n\n            binding.mutedUserMuteNotifications.isChecked = viewData.mutingNotifications\n\n            binding.mutedUserUnmute.setOnClickListener {\n                accountActionListener.onMute(\n                    false,\n                    account.id,\n                    viewHolder.bindingAdapterPosition,\n                    false\n                )\n            }\n            binding.mutedUserMuteNotifications.setOnCheckedChangeListener { _, isChecked ->\n                accountActionListener.onMute(\n                    true,\n                    account.id,\n                    viewHolder.bindingAdapterPosition,\n                    isChecked\n                )\n            }\n            binding.root.setOnClickListener { accountActionListener.onViewAccount(account.id) }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/announcements/AnnouncementAdapter.kt",
    "content": "/* Copyright 2020 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.announcements\n\nimport android.annotation.SuppressLint\nimport android.graphics.drawable.Drawable\nimport android.os.Build\nimport android.text.SpannableString\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.size\nimport androidx.recyclerview.widget.RecyclerView\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.request.target.Target\nimport com.google.android.material.chip.Chip\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemAnnouncementBinding\nimport com.keylesspalace.tusky.entity.Announcement\nimport com.keylesspalace.tusky.interfaces.LinkListener\nimport com.keylesspalace.tusky.util.AbsoluteTimeFormatter\nimport com.keylesspalace.tusky.util.BindingHolder\nimport com.keylesspalace.tusky.util.EmojiSpan\nimport com.keylesspalace.tusky.util.clearEmojiTargets\nimport com.keylesspalace.tusky.util.emojify\nimport com.keylesspalace.tusky.util.parseAsMastodonHtml\nimport com.keylesspalace.tusky.util.setClickableText\nimport com.keylesspalace.tusky.util.setEmojiTargets\nimport com.keylesspalace.tusky.util.visible\n\ninterface AnnouncementActionListener : LinkListener {\n    fun openReactionPicker(announcementId: String, target: View)\n    fun addReaction(announcementId: String, name: String)\n    fun removeReaction(announcementId: String, name: String)\n}\n\nclass AnnouncementAdapter(\n    private var items: List<Announcement> = emptyList(),\n    private val listener: AnnouncementActionListener,\n    private val wellbeingEnabled: Boolean = false,\n    private val animateEmojis: Boolean = false\n) : RecyclerView.Adapter<BindingHolder<ItemAnnouncementBinding>>() {\n\n    private val absoluteTimeFormatter = AbsoluteTimeFormatter()\n\n    override fun onCreateViewHolder(\n        parent: ViewGroup,\n        viewType: Int\n    ): BindingHolder<ItemAnnouncementBinding> {\n        val binding = ItemAnnouncementBinding.inflate(\n            LayoutInflater.from(parent.context),\n            parent,\n            false\n        )\n        return BindingHolder(binding)\n    }\n\n    @SuppressLint(\"SetTextI18n\")\n    override fun onBindViewHolder(holder: BindingHolder<ItemAnnouncementBinding>, position: Int) {\n        val item = items[position]\n\n        holder.binding.announcementDate.text = absoluteTimeFormatter.format(item.publishedAt, false)\n\n        val text = holder.binding.text\n        val chips = holder.binding.chipGroup\n        val addReactionChip = holder.binding.addReactionChip\n\n        val emojifiedText: CharSequence = item.content.parseAsMastodonHtml().emojify(\n            item.emojis,\n            text,\n            animateEmojis\n        )\n\n        setClickableText(text, emojifiedText, item.mentions, item.tags, listener)\n\n        // If wellbeing mode is enabled, announcement badge counts should not be shown.\n        if (wellbeingEnabled) {\n            // Since reactions are not visible in wellbeing mode,\n            // we shouldn't be able to add any ourselves.\n            addReactionChip.visibility = View.GONE\n            return\n        }\n\n        // hide button if announcement badge limit is already reached\n        addReactionChip.visible(item.reactions.size < 8)\n\n        val requestManager = Glide.with(chips)\n\n        chips.clearEmojiTargets()\n        val targets = ArrayList<Target<Drawable>>(item.reactions.size)\n\n        item.reactions.forEachIndexed { i, reaction ->\n            (\n                chips.getChildAt(i)?.takeUnless { it.id == R.id.addReactionChip } as Chip?\n                    ?: Chip(chips.context).apply {\n                        isCheckable = true\n                        checkedIcon = null\n                        isCloseIconVisible = false\n                        setChipBackgroundColorResource(R.color.selectable_chip_background)\n                        chips.addView(this, i)\n                    }\n                )\n                .apply {\n                    if (reaction.url == null) {\n                        this.text = \"${reaction.name} ${reaction.count}\"\n                    } else {\n                        // we set the EmojiSpan on a space, because otherwise the Chip won't have the right size\n                        // https://github.com/tuskyapp/Tusky/issues/2308\n                        val spannable = SpannableString(\"  ${reaction.count}\")\n                        val span = EmojiSpan(this)\n                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {\n                            span.contentDescription = reaction.name\n                        }\n                        val target = span.createGlideTarget(this, animateEmojis)\n                        spannable.setSpan(span, 0, 1, 0)\n                        requestManager\n                            .asDrawable()\n                            .load(\n                                if (animateEmojis) {\n                                    reaction.url\n                                } else {\n                                    reaction.staticUrl\n                                }\n                            )\n                            .into(target)\n                        targets.add(target)\n                        this.text = spannable\n                    }\n\n                    isChecked = reaction.me\n\n                    setOnClickListener {\n                        if (reaction.me) {\n                            listener.removeReaction(item.id, reaction.name)\n                        } else {\n                            listener.addReaction(item.id, reaction.name)\n                        }\n                    }\n                }\n        }\n\n        while (chips.size - 1 > item.reactions.size) {\n            chips.removeViewAt(item.reactions.size)\n        }\n\n        // Store Glide targets for later cancellation\n        chips.setEmojiTargets(targets)\n\n        addReactionChip.setOnClickListener {\n            listener.openReactionPicker(item.id, it)\n        }\n    }\n\n    override fun onViewRecycled(holder: BindingHolder<ItemAnnouncementBinding>) {\n        holder.binding.chipGroup.clearEmojiTargets()\n    }\n\n    override fun getItemCount() = items.size\n\n    fun updateList(items: List<Announcement>) {\n        this.items = items\n        notifyDataSetChanged()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/announcements/AnnouncementsActivity.kt",
    "content": "/* Copyright 2020 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.announcements\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.widget.PopupWindow\nimport androidx.activity.viewModels\nimport androidx.core.view.MenuProvider\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.keylesspalace.tusky.BottomSheetActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.StatusListActivity\nimport com.keylesspalace.tusky.adapter.EmojiAdapter\nimport com.keylesspalace.tusky.adapter.OnEmojiSelectedListener\nimport com.keylesspalace.tusky.databinding.ActivityAnnouncementsBinding\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.util.Error\nimport com.keylesspalace.tusky.util.Loading\nimport com.keylesspalace.tusky.util.Success\nimport com.keylesspalace.tusky.util.ensureBottomPadding\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport com.keylesspalace.tusky.util.unsafeLazy\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.view.EmojiPicker\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass AnnouncementsActivity :\n    BottomSheetActivity(),\n    AnnouncementActionListener,\n    OnEmojiSelectedListener,\n    MenuProvider {\n\n    private val viewModel: AnnouncementsViewModel by viewModels()\n\n    private val binding by viewBinding(ActivityAnnouncementsBinding::inflate)\n\n    private lateinit var adapter: AnnouncementAdapter\n\n    private val picker by unsafeLazy { EmojiPicker(this) }\n    private val pickerDialog by unsafeLazy {\n        PopupWindow(this)\n            .apply {\n                contentView = picker\n                isFocusable = true\n                setOnDismissListener {\n                    currentAnnouncementId = null\n                }\n            }\n    }\n    private var currentAnnouncementId: String? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        addMenuProvider(this)\n\n        setSupportActionBar(binding.includedToolbar.toolbar)\n        supportActionBar?.apply {\n            title = getString(R.string.title_announcements)\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n        }\n\n        binding.swipeRefreshLayout.setOnRefreshListener(this::refreshAnnouncements)\n\n        binding.announcementsList.ensureBottomPadding()\n        binding.announcementsList.setHasFixedSize(true)\n        binding.announcementsList.layoutManager = LinearLayoutManager(this)\n        val divider = DividerItemDecoration(this, DividerItemDecoration.VERTICAL)\n        binding.announcementsList.addItemDecoration(divider)\n\n        val wellbeingEnabled = preferences.getBoolean(PrefKeys.WELLBEING_HIDE_STATS_POSTS, false)\n        val animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false)\n\n        adapter = AnnouncementAdapter(emptyList(), this, wellbeingEnabled, animateEmojis)\n\n        binding.announcementsList.adapter = adapter\n\n        lifecycleScope.launch {\n            viewModel.announcements.collect {\n                if (it == null) return@collect\n                when (it) {\n                    is Success -> {\n                        binding.progressBar.hide()\n                        binding.swipeRefreshLayout.isRefreshing = false\n                        if (it.data.isNullOrEmpty()) {\n                            binding.errorMessageView.setup(\n                                R.drawable.elephant_friend_empty,\n                                R.string.no_announcements\n                            )\n                            binding.errorMessageView.show()\n                        } else {\n                            binding.errorMessageView.hide()\n                        }\n                        adapter.updateList(it.data ?: listOf())\n                    }\n                    is Loading -> {\n                        binding.errorMessageView.hide()\n                    }\n                    is Error -> {\n                        binding.progressBar.hide()\n                        binding.swipeRefreshLayout.isRefreshing = false\n                        binding.errorMessageView.setup(\n                            R.drawable.errorphant_error,\n                            R.string.error_generic\n                        ) {\n                            refreshAnnouncements()\n                        }\n                        binding.errorMessageView.show()\n                    }\n                }\n            }\n        }\n\n        lifecycleScope.launch {\n            viewModel.emoji.collect {\n                picker.adapter = EmojiAdapter(it, this@AnnouncementsActivity, animateEmojis)\n            }\n        }\n\n        viewModel.load()\n        binding.progressBar.show()\n    }\n\n    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n        menuInflater.inflate(R.menu.activity_announcements, menu)\n    }\n\n    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {\n        return when (menuItem.itemId) {\n            R.id.action_refresh -> {\n                binding.swipeRefreshLayout.isRefreshing = true\n                refreshAnnouncements()\n                true\n            }\n            else -> false\n        }\n    }\n\n    private fun refreshAnnouncements() {\n        viewModel.load()\n        binding.swipeRefreshLayout.isRefreshing = true\n    }\n\n    override fun openReactionPicker(announcementId: String, target: View) {\n        currentAnnouncementId = announcementId\n        pickerDialog.showAsDropDown(target)\n    }\n\n    override fun onEmojiSelected(shortcode: String) {\n        viewModel.addReaction(currentAnnouncementId!!, shortcode)\n        pickerDialog.dismiss()\n    }\n\n    override fun addReaction(announcementId: String, name: String) {\n        viewModel.addReaction(announcementId, name)\n    }\n\n    override fun removeReaction(announcementId: String, name: String) {\n        viewModel.removeReaction(announcementId, name)\n    }\n\n    override fun onViewTag(tag: String) {\n        val intent = StatusListActivity.newHashtagIntent(this, tag)\n        startActivityWithSlideInAnimation(intent)\n    }\n\n    override fun onViewAccount(id: String) {\n        viewAccount(id)\n    }\n\n    override fun onViewUrl(url: String) {\n        viewUrl(url)\n    }\n\n    companion object {\n        fun newIntent(context: Context) = Intent(context, AnnouncementsActivity::class.java)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/announcements/AnnouncementsViewModel.kt",
    "content": "/* Copyright 2020 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.announcements\n\nimport android.util.Log\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport at.connyduck.calladapter.networkresult.fold\nimport com.keylesspalace.tusky.appstore.AnnouncementReadEvent\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.components.instanceinfo.InstanceInfoRepository\nimport com.keylesspalace.tusky.entity.Announcement\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.Error\nimport com.keylesspalace.tusky.util.Loading\nimport com.keylesspalace.tusky.util.Resource\nimport com.keylesspalace.tusky.util.Success\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport kotlinx.coroutines.launch\n\n@HiltViewModel\nclass AnnouncementsViewModel @Inject constructor(\n    private val instanceInfoRepo: InstanceInfoRepository,\n    private val mastodonApi: MastodonApi,\n    private val eventHub: EventHub\n) : ViewModel() {\n\n    private val _announcements = MutableStateFlow(null as Resource<List<Announcement>>?)\n    val announcements: StateFlow<Resource<List<Announcement>>?> = _announcements.asStateFlow()\n\n    private val _emoji = MutableStateFlow(emptyList<Emoji>())\n    val emoji: StateFlow<List<Emoji>> = _emoji.asStateFlow()\n\n    init {\n        viewModelScope.launch {\n            _emoji.value = instanceInfoRepo.getEmojis()\n        }\n    }\n\n    fun load() {\n        viewModelScope.launch {\n            _announcements.value = Loading()\n            mastodonApi.announcements()\n                .fold(\n                    {\n                        _announcements.value = Success(it)\n                        it.filter { announcement -> !announcement.read }\n                            .forEach { announcement ->\n                                mastodonApi.dismissAnnouncement(announcement.id)\n                                    .fold(\n                                        {\n                                            eventHub.dispatch(\n                                                AnnouncementReadEvent(announcement.id)\n                                            )\n                                        },\n                                        { throwable ->\n                                            Log.d(\n                                                TAG,\n                                                \"Failed to mark announcement as read.\",\n                                                throwable\n                                            )\n                                        }\n                                    )\n                            }\n                    },\n                    {\n                        _announcements.value = Error(cause = it)\n                    }\n                )\n        }\n    }\n\n    fun addReaction(announcementId: String, name: String) {\n        viewModelScope.launch {\n            mastodonApi.addAnnouncementReaction(announcementId, name)\n                .fold(\n                    {\n                        _announcements.value =\n                            Success(\n                                announcements.value?.data?.map { announcement ->\n                                    if (announcement.id == announcementId) {\n                                        announcement.copy(\n                                            reactions = if (announcement.reactions.find { reaction -> reaction.name == name } != null) {\n                                                announcement.reactions.map { reaction ->\n                                                    if (reaction.name == name) {\n                                                        reaction.copy(\n                                                            count = reaction.count + 1,\n                                                            me = true\n                                                        )\n                                                    } else {\n                                                        reaction\n                                                    }\n                                                }\n                                            } else {\n                                                listOf(\n                                                    *announcement.reactions.toTypedArray(),\n                                                    emoji.value.find { emoji -> emoji.shortcode == name }!!.run {\n                                                        Announcement.Reaction(\n                                                            name,\n                                                            1,\n                                                            true,\n                                                            url,\n                                                            staticUrl\n                                                        )\n                                                    }\n                                                )\n                                            }\n                                        )\n                                    } else {\n                                        announcement\n                                    }\n                                }\n                            )\n                    },\n                    {\n                        Log.w(TAG, \"Failed to add reaction to the announcement.\", it)\n                    }\n                )\n        }\n    }\n\n    fun removeReaction(announcementId: String, name: String) {\n        viewModelScope.launch {\n            mastodonApi.removeAnnouncementReaction(announcementId, name)\n                .fold(\n                    {\n                        _announcements.value =\n                            Success(\n                                announcements.value!!.data!!.map { announcement ->\n                                    if (announcement.id == announcementId) {\n                                        announcement.copy(\n                                            reactions = announcement.reactions.mapNotNull { reaction ->\n                                                if (reaction.name == name) {\n                                                    if (reaction.count > 1) {\n                                                        reaction.copy(\n                                                            count = reaction.count - 1,\n                                                            me = false\n                                                        )\n                                                    } else {\n                                                        null\n                                                    }\n                                                } else {\n                                                    reaction\n                                                }\n                                            }\n                                        )\n                                    } else {\n                                        announcement\n                                    }\n                                }\n                            )\n                    },\n                    {\n                        Log.w(TAG, \"Failed to remove reaction from the announcement.\", it)\n                    }\n                )\n        }\n    }\n\n    companion object {\n        private const val TAG = \"AnnouncementsViewModel\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.compose\n\nimport android.Manifest\nimport android.content.ClipData\nimport android.content.Context\nimport android.content.Intent\nimport android.content.SharedPreferences\nimport android.graphics.Bitmap\nimport android.icu.text.BreakIterator\nimport android.net.Uri\nimport android.os.Build\nimport android.os.Bundle\nimport android.os.Parcelable\nimport android.provider.MediaStore\nimport android.text.Spanned\nimport android.text.style.URLSpan\nimport android.util.Log\nimport android.view.KeyEvent\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.AdapterView\nimport android.widget.ImageButton\nimport android.widget.LinearLayout\nimport android.widget.PopupMenu\nimport android.widget.Toast\nimport androidx.activity.OnBackPressedCallback\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.activity.viewModels\nimport androidx.annotation.AttrRes\nimport androidx.annotation.ColorInt\nimport androidx.annotation.StringRes\nimport androidx.annotation.VisibleForTesting\nimport androidx.appcompat.content.res.AppCompatResources\nimport androidx.core.content.FileProvider\nimport androidx.core.content.res.use\nimport androidx.core.view.ContentInfoCompat\nimport androidx.core.view.OnReceiveContentListener\nimport androidx.core.view.WindowInsetsCompat.Type.ime\nimport androidx.core.view.WindowInsetsCompat.Type.systemBars\nimport androidx.core.view.isGone\nimport androidx.core.view.isVisible\nimport androidx.core.view.updateLayoutParams\nimport androidx.core.view.updatePadding\nimport androidx.core.widget.doAfterTextChanged\nimport androidx.core.widget.doOnTextChanged\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.transition.TransitionManager\nimport com.canhub.cropper.CropImage\nimport com.canhub.cropper.CropImageContract\nimport com.canhub.cropper.options\nimport com.google.android.material.R as materialR\nimport com.google.android.material.bottomsheet.BottomSheetBehavior\nimport com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback\nimport com.google.android.material.color.MaterialColors\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.BaseActivity\nimport com.keylesspalace.tusky.BuildConfig\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.adapter.EmojiAdapter\nimport com.keylesspalace.tusky.adapter.LocaleAdapter\nimport com.keylesspalace.tusky.adapter.OnEmojiSelectedListener\nimport com.keylesspalace.tusky.components.compose.ComposeViewModel.ConfirmationKind\nimport com.keylesspalace.tusky.components.compose.ComposeViewModel.QueuedMedia\nimport com.keylesspalace.tusky.components.compose.dialog.CaptionDialog\nimport com.keylesspalace.tusky.components.compose.dialog.makeFocusDialog\nimport com.keylesspalace.tusky.components.compose.dialog.showAddPollDialog\nimport com.keylesspalace.tusky.components.compose.view.ComposeOptionsListener\nimport com.keylesspalace.tusky.components.compose.view.ComposeScheduleView\nimport com.keylesspalace.tusky.components.instanceinfo.InstanceInfoRepository\nimport com.keylesspalace.tusky.databinding.ActivityComposeBinding\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.db.entity.DraftAttachment\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.entity.NewPoll\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.settings.AppTheme\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.settings.PrefKeys.APP_THEME\nimport com.keylesspalace.tusky.util.MentionSpan\nimport com.keylesspalace.tusky.util.PickMediaFiles\nimport com.keylesspalace.tusky.util.defaultFinders\nimport com.keylesspalace.tusky.util.getInitialLanguages\nimport com.keylesspalace.tusky.util.getLocaleList\nimport com.keylesspalace.tusky.util.getMediaSize\nimport com.keylesspalace.tusky.util.getParcelableArrayListExtraCompat\nimport com.keylesspalace.tusky.util.getParcelableCompat\nimport com.keylesspalace.tusky.util.getParcelableExtraCompat\nimport com.keylesspalace.tusky.util.getSerializableCompat\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.highlightSpans\nimport com.keylesspalace.tusky.util.loadAvatar\nimport com.keylesspalace.tusky.util.map\nimport com.keylesspalace.tusky.util.modernLanguageCode\nimport com.keylesspalace.tusky.util.setDrawableTint\nimport com.keylesspalace.tusky.util.setOnWindowInsetsChangeListener\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.util.visible\nimport dagger.hilt.android.AndroidEntryPoint\nimport dagger.hilt.android.migration.OptionalInject\nimport java.io.File\nimport java.io.IOException\nimport java.text.DecimalFormat\nimport java.util.Locale\nimport kotlin.math.max\nimport kotlin.math.min\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.launch\nimport kotlinx.parcelize.Parcelize\n\n@OptionalInject\n@AndroidEntryPoint\nclass ComposeActivity :\n    BaseActivity(),\n    ComposeOptionsListener,\n    ComposeAutoCompleteAdapter.AutocompletionProvider,\n    OnEmojiSelectedListener,\n    OnReceiveContentListener,\n    ComposeScheduleView.OnTimeSetListener,\n    CaptionDialog.Listener {\n\n    private lateinit var composeOptionsBehavior: BottomSheetBehavior<*>\n    private lateinit var addMediaBehavior: BottomSheetBehavior<*>\n    private lateinit var emojiBehavior: BottomSheetBehavior<*>\n    private lateinit var scheduleBehavior: BottomSheetBehavior<*>\n\n    /** The account that is being used to compose the status */\n    private lateinit var activeAccount: AccountEntity\n\n    private var photoUploadUri: Uri? = null\n\n    @VisibleForTesting\n    var highlightFinders = defaultFinders\n\n    @VisibleForTesting\n    var maximumTootCharacters = InstanceInfoRepository.DEFAULT_CHARACTER_LIMIT\n    var charactersReservedPerUrl = InstanceInfoRepository.DEFAULT_CHARACTERS_RESERVED_PER_URL\n\n    private val viewModel: ComposeViewModel by viewModels()\n\n    private val binding by viewBinding(ActivityComposeBinding::inflate)\n\n    private var maxUploadMediaNumber = InstanceInfoRepository.DEFAULT_MAX_MEDIA_ATTACHMENTS\n\n    private val takePictureLauncher =\n        registerForActivityResult(ActivityResultContracts.TakePicture()) { success ->\n            if (success) {\n                viewModel.pickMedia(photoUploadUri!!)\n            }\n        }\n    private val pickMediaFilePermissionLauncher =\n        registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->\n            if (isGranted) {\n                pickMediaFileLauncher.launch(true)\n            } else {\n                Snackbar.make(\n                    binding.activityCompose,\n                    R.string.error_media_upload_permission,\n                    Snackbar.LENGTH_SHORT\n                ).apply {\n                    setAction(R.string.action_retry) { onMediaPick() }\n                    // necessary so snackbar is shown over everything\n                    view.elevation = resources.getDimension(R.dimen.compose_activity_snackbar_elevation)\n                    show()\n                }\n            }\n        }\n    private val pickMediaFileLauncher = registerForActivityResult(PickMediaFiles()) { uris ->\n        if (viewModel.media.value.size + uris.size > maxUploadMediaNumber) {\n            Toast.makeText(\n                this,\n                resources.getQuantityString(\n                    R.plurals.error_upload_max_media_reached,\n                    maxUploadMediaNumber,\n                    maxUploadMediaNumber\n                ),\n                Toast.LENGTH_SHORT\n            ).show()\n        } else {\n            viewModel.pickMedia(\n                uris.map { uri ->\n                    ComposeViewModel.MediaData(uri)\n                }\n            )\n        }\n    }\n\n    // Contract kicked off by editImageInQueue; expects viewModel.cropImageItemOld set\n    private val cropImage = registerForActivityResult(CropImageContract()) { result ->\n        val uriNew = result.uriContent\n        if (result.isSuccessful && uriNew != null) {\n            viewModel.cropImageItemOld?.let { itemOld ->\n                val size = getMediaSize(contentResolver, uriNew)\n\n                viewModel.addMediaToQueue(\n                    type = itemOld.type,\n                    uri = uriNew,\n                    mediaSize = size,\n                    description = itemOld.description,\n                    // Intentionally reset focus when cropping\n                    focus = null,\n                    replaceItem = itemOld\n                )\n            }\n        } else if (result == CropImage.CancelledResult) {\n            Log.w(TAG, \"Edit image cancelled by user\")\n        } else {\n            Log.w(TAG, \"Edit image failed: \" + result.error)\n            displayTransientMessage(R.string.error_image_edit_failed)\n        }\n        viewModel.cropImageItemOld = null\n    }\n\n    private val onBackPressedCallback = object : OnBackPressedCallback(false) {\n        override fun handleOnBackPressed() {\n            if (composeOptionsBehavior.state == BottomSheetBehavior.STATE_EXPANDED ||\n                addMediaBehavior.state == BottomSheetBehavior.STATE_EXPANDED ||\n                emojiBehavior.state == BottomSheetBehavior.STATE_EXPANDED ||\n                scheduleBehavior.state == BottomSheetBehavior.STATE_EXPANDED\n            ) {\n                composeOptionsBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n                addMediaBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n                emojiBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n                scheduleBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n                return\n            }\n\n            handleCloseButton()\n        }\n    }\n\n    public override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        activeAccount = accountManager.activeAccount ?: return\n\n        val theme = preferences.getString(APP_THEME, AppTheme.DEFAULT.value)\n        if (theme == \"black\") {\n            setTheme(R.style.TuskyDialogActivityBlackTheme)\n        }\n        setContentView(binding.root)\n\n        binding.composeBottomBar.setOnWindowInsetsChangeListener { windowInsets ->\n            val insets = windowInsets.getInsets(systemBars() or ime())\n            val bottomBarHeight = resources.getDimensionPixelSize(R.dimen.compose_bottom_bar_height)\n            val bottomBarPadding = resources.getDimensionPixelSize(R.dimen.compose_bottom_bar_padding_vertical)\n            binding.composeBottomBar.updatePadding(bottom = insets.bottom + bottomBarPadding)\n            binding.addMediaBottomSheet.updatePadding(bottom = insets.bottom + bottomBarHeight)\n            binding.emojiView.updatePadding(bottom = insets.bottom + bottomBarHeight)\n            binding.composeOptionsBottomSheet.updatePadding(bottom = insets.bottom + bottomBarHeight)\n            binding.composeScheduleView.updatePadding(bottom = insets.bottom + bottomBarHeight)\n            binding.composeMainScrollView.updateLayoutParams<ViewGroup.MarginLayoutParams> { bottomMargin = insets.bottom + bottomBarHeight }\n        }\n\n        setupActionBar()\n\n        setupAvatar(activeAccount)\n        val mediaAdapter = MediaPreviewAdapter(\n            this,\n            onAddCaption = { item ->\n                CaptionDialog.newInstance(\n                    item.localId,\n                    item.description,\n                    item.uri\n                ).show(supportFragmentManager, \"caption_dialog\")\n            },\n            onAddFocus = { item ->\n                makeFocusDialog(item.focus, item.uri) { newFocus ->\n                    viewModel.updateFocus(item.localId, newFocus)\n                }\n                // TODO this is inconsistent to CaptionDialog (device rotation)?\n            },\n            onEditImage = this::editImageInQueue,\n            onRemove = this::removeMediaFromQueue\n        )\n        binding.composeMediaPreviewBar.layoutManager =\n            LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)\n        binding.composeMediaPreviewBar.adapter = mediaAdapter\n        binding.composeMediaPreviewBar.itemAnimator = null\n\n        /* If the composer is started up as a reply to another post, override the \"starting\" state\n         * based on what the intent from the reply request passes. */\n        val composeOptions: ComposeOptions? = intent.getParcelableExtraCompat(COMPOSE_OPTIONS_EXTRA)\n        viewModel.setup(composeOptions)\n\n        setupButtons()\n        subscribeToUpdates(mediaAdapter)\n\n        if (accountManager.shouldDisplaySelfUsername()) {\n            binding.composeUsernameView.text = getString(\n                R.string.compose_active_account_description,\n                activeAccount.fullName\n            )\n            binding.composeUsernameView.show()\n        } else {\n            binding.composeUsernameView.hide()\n        }\n\n        setupReplyViews(composeOptions?.replyingStatusAuthor, composeOptions?.replyingStatusContent)\n        val statusContent = composeOptions?.content\n        if (!statusContent.isNullOrEmpty()) {\n            binding.composeEditField.setText(statusContent)\n        }\n\n        if (!composeOptions?.scheduledAt.isNullOrEmpty()) {\n            binding.composeScheduleView.setDateTime(composeOptions.scheduledAt)\n        }\n\n        setupLanguageSpinner(getInitialLanguages(composeOptions?.language, activeAccount))\n        setupComposeField(preferences, viewModel.startingText)\n        setupContentWarningField(composeOptions?.contentWarning)\n        setupPollView()\n        applyShareIntent(intent, savedInstanceState)\n\n        /* Finally, overwrite state with data from saved instance state. */\n        savedInstanceState?.let {\n            photoUploadUri = it.getParcelableCompat(PHOTO_UPLOAD_URI_KEY)\n\n            setStatusVisibility(it.getSerializableCompat(VISIBILITY_KEY)!!)\n\n            it.getBoolean(CONTENT_WARNING_VISIBLE_KEY).apply {\n                viewModel.contentWarningChanged(this)\n            }\n\n            it.getString(SCHEDULED_TIME_KEY)?.let { time ->\n                viewModel.updateScheduledAt(time)\n            }\n        }\n\n        binding.composeEditField.post {\n            binding.composeEditField.requestFocus()\n        }\n    }\n\n    private fun applyShareIntent(intent: Intent, savedInstanceState: Bundle?) {\n        if (savedInstanceState == null) {\n            /* Get incoming images being sent through a share action from another app. Only do this\n             * when savedInstanceState is null, otherwise both the images from the intent and the\n             * instance state will be re-queued. */\n            intent.type?.also { type ->\n                if (type.startsWith(\"image/\") || type.startsWith(\"video/\") || type.startsWith(\"audio/\")) {\n                    when (intent.action) {\n                        Intent.ACTION_SEND -> {\n                            intent.getParcelableExtraCompat<Uri>(Intent.EXTRA_STREAM)?.let { uri ->\n                                viewModel.pickMedia(uri)\n                            }\n                        }\n                        Intent.ACTION_SEND_MULTIPLE -> {\n                            intent.getParcelableArrayListExtraCompat<Uri>(Intent.EXTRA_STREAM)\n                                ?.map { uri ->\n                                    ComposeViewModel.MediaData(uri)\n                                }?.let(viewModel::pickMedia)\n                        }\n                    }\n                }\n\n                val subject = intent.getStringExtra(Intent.EXTRA_SUBJECT)\n                val text = intent.getStringExtra(Intent.EXTRA_TEXT).orEmpty()\n                val shareBody = if (!subject.isNullOrBlank() && subject !in text) {\n                    subject + '\\n' + text\n                } else {\n                    text\n                }\n\n                if (shareBody.isNotBlank()) {\n                    val start = binding.composeEditField.selectionStart.coerceAtLeast(0)\n                    val end = binding.composeEditField.selectionEnd.coerceAtLeast(0)\n                    val left = min(start, end)\n                    val right = max(start, end)\n                    binding.composeEditField.text.replace(\n                        left,\n                        right,\n                        shareBody,\n                        0,\n                        shareBody.length\n                    )\n                    // move edittext cursor to first when shareBody parsed\n                    binding.composeEditField.text.insert(0, \"\\n\")\n                    binding.composeEditField.setSelection(0)\n                }\n            }\n        }\n    }\n\n    private fun setupReplyViews(replyingStatusAuthor: String?, replyingStatusContent: String?) {\n        if (replyingStatusAuthor != null) {\n            binding.composeReplyView.show()\n            binding.composeReplyView.text = getString(R.string.replying_to, replyingStatusAuthor)\n            val arrowDownIcon = AppCompatResources.getDrawable(this, R.drawable.ic_arrow_drop_down_24dp)!!\n\n            setDrawableTint(this, arrowDownIcon, android.R.attr.textColorTertiary)\n            binding.composeReplyView.setCompoundDrawablesRelativeWithIntrinsicBounds(\n                null,\n                null,\n                arrowDownIcon,\n                null\n            )\n\n            binding.composeReplyView.setOnClickListener {\n                TransitionManager.beginDelayedTransition(\n                    binding.composeReplyContentView.parent as ViewGroup\n                )\n\n                if (binding.composeReplyContentView.isVisible) {\n                    binding.composeReplyContentView.hide()\n                    binding.composeReplyView.setCompoundDrawablesRelativeWithIntrinsicBounds(\n                        null,\n                        null,\n                        arrowDownIcon,\n                        null\n                    )\n                } else {\n                    binding.composeReplyContentView.show()\n                    val arrowUpIcon = AppCompatResources.getDrawable(this, R.drawable.ic_arrow_drop_up_24dp)!!\n\n                    setDrawableTint(this, arrowUpIcon, android.R.attr.textColorTertiary)\n                    binding.composeReplyView.setCompoundDrawablesRelativeWithIntrinsicBounds(\n                        null,\n                        null,\n                        arrowUpIcon,\n                        null\n                    )\n                }\n            }\n        }\n        replyingStatusContent?.let { binding.composeReplyContentView.text = it }\n    }\n\n    private fun setupContentWarningField(startingContentWarning: String?) {\n        if (startingContentWarning != null) {\n            binding.composeContentWarningField.setText(startingContentWarning)\n        }\n        binding.composeContentWarningField.doOnTextChanged { newContentWarning, _, _, _ ->\n            updateVisibleCharactersLeft()\n            viewModel.updateContentWarning(newContentWarning?.toString())\n        }\n    }\n\n    private fun setupComposeField(preferences: SharedPreferences, startingText: String?) {\n        binding.composeEditField.setOnReceiveContentListener(this)\n\n        binding.composeEditField.setOnKeyListener { _, keyCode, event ->\n            this.onKeyDown(\n                keyCode,\n                event\n            )\n        }\n\n        binding.composeEditField.setAdapter(\n            ComposeAutoCompleteAdapter(\n                this,\n                animateAvatar = preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false),\n                animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false),\n                showBotBadge = preferences.getBoolean(PrefKeys.SHOW_BOT_OVERLAY, true)\n            )\n        )\n        binding.composeEditField.setTokenizer(ComposeTokenizer())\n\n        binding.composeEditField.setText(startingText)\n        binding.composeEditField.setSelection(binding.composeEditField.length())\n\n        val mentionColour = binding.composeEditField.linkTextColors.defaultColor\n        binding.composeEditField.text.highlightSpans(mentionColour, highlightFinders)\n        binding.composeEditField.doAfterTextChanged { editable ->\n            editable!!.highlightSpans(mentionColour, highlightFinders)\n            updateVisibleCharactersLeft()\n            viewModel.updateContent(editable.toString())\n        }\n\n        // work around Android platform bug -> https://issuetracker.google.com/issues/67102093\n        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O ||\n            Build.VERSION.SDK_INT == Build.VERSION_CODES.O_MR1\n        ) {\n            binding.composeEditField.setLayerType(View.LAYER_TYPE_SOFTWARE, null)\n        }\n    }\n\n    private fun subscribeToUpdates(mediaAdapter: MediaPreviewAdapter) {\n        lifecycleScope.launch {\n            viewModel.instanceInfo.collect { instanceData ->\n                maximumTootCharacters = instanceData.maxChars\n                charactersReservedPerUrl = instanceData.charactersReservedPerUrl\n                maxUploadMediaNumber = instanceData.maxMediaAttachments\n                updateVisibleCharactersLeft()\n            }\n        }\n\n        lifecycleScope.launch {\n            viewModel.emoji.collect(::setEmojiList)\n        }\n\n        lifecycleScope.launch {\n            viewModel.showContentWarning.combine(\n                viewModel.markMediaAsSensitive\n            ) { showContentWarning, markSensitive ->\n                updateSensitiveMediaToggle(markSensitive, showContentWarning)\n                showContentWarning(showContentWarning)\n            }.collect()\n        }\n\n        lifecycleScope.launch {\n            viewModel.statusVisibility.collect(::setStatusVisibility)\n        }\n\n        lifecycleScope.launch {\n            viewModel.media.collect { media ->\n                mediaAdapter.submitList(media)\n\n                binding.composeMediaPreviewBar.visible(media.isNotEmpty())\n                updateSensitiveMediaToggle(\n                    viewModel.markMediaAsSensitive.value,\n                    viewModel.showContentWarning.value\n                )\n            }\n        }\n\n        lifecycleScope.launch {\n            viewModel.poll.collect { poll ->\n                binding.pollPreview.visible(poll != null)\n                poll?.let(binding.pollPreview::setPoll)\n            }\n        }\n\n        lifecycleScope.launch {\n            viewModel.scheduledAt.collect { scheduledAt ->\n                if (scheduledAt == null) {\n                    binding.composeScheduleView.resetSchedule()\n                } else {\n                    binding.composeScheduleView.setDateTime(scheduledAt)\n                }\n                updateScheduleButton()\n            }\n        }\n\n        lifecycleScope.launch {\n            viewModel.media.combine(viewModel.poll) { media, poll ->\n                val active = poll == null &&\n                    media.size < maxUploadMediaNumber &&\n                    (media.isEmpty() || media.first().type == QueuedMedia.Type.IMAGE)\n                enableButton(binding.composeAddMediaButton, active, active)\n                enablePollButton(media.isEmpty())\n            }.collect()\n        }\n\n        lifecycleScope.launch {\n            viewModel.uploadError.collect { throwable ->\n                val errorString = when (throwable) {\n                    is UploadServerError -> throwable.errorMessage\n                    is FileSizeException -> {\n                        val decimalFormat = DecimalFormat(\"0.##\")\n                        val allowedSizeInMb = throwable.allowedSizeInBytes.toDouble() / (1024 * 1024)\n                        val formattedSize = decimalFormat.format(allowedSizeInMb)\n                        getString(R.string.error_multimedia_size_limit, formattedSize)\n                    }\n                    is VideoOrImageException -> getString(\n                        R.string.error_media_upload_image_or_video\n                    )\n                    is CouldNotOpenFileException -> getString(R.string.error_media_upload_opening)\n                    is MediaTypeException -> getString(R.string.error_media_upload_opening)\n                    else -> getString(\n                        R.string.error_media_upload_sending_fmt,\n                        throwable.message\n                    )\n                }\n                displayTransientMessage(errorString)\n            }\n        }\n\n        lifecycleScope.launch {\n            viewModel.closeConfirmation.collect {\n                updateOnBackPressedCallbackState()\n            }\n        }\n    }\n\n    private fun setupButtons() {\n        binding.composeOptionsBottomSheet.listener = this\n\n        composeOptionsBehavior = BottomSheetBehavior.from(binding.composeOptionsBottomSheet)\n        addMediaBehavior = BottomSheetBehavior.from(binding.addMediaBottomSheet)\n        scheduleBehavior = BottomSheetBehavior.from(binding.composeScheduleView)\n        emojiBehavior = BottomSheetBehavior.from(binding.emojiView)\n\n        composeOptionsBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n        addMediaBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n        scheduleBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n        emojiBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n\n        val bottomSheetCallback = object : BottomSheetCallback() {\n            override fun onStateChanged(bottomSheet: View, newState: Int) {\n                updateOnBackPressedCallbackState()\n            }\n            override fun onSlide(bottomSheet: View, slideOffset: Float) { }\n        }\n        composeOptionsBehavior.addBottomSheetCallback(bottomSheetCallback)\n        addMediaBehavior.addBottomSheetCallback(bottomSheetCallback)\n        scheduleBehavior.addBottomSheetCallback(bottomSheetCallback)\n        emojiBehavior.addBottomSheetCallback(bottomSheetCallback)\n\n        enableButton(binding.composeEmojiButton, clickable = false, colorActive = false)\n\n        // Setup the interface buttons.\n        binding.composeTootButton.setOnClickListener { onSendClicked() }\n        binding.composeAddMediaButton.setOnClickListener { openPickDialog() }\n        binding.composeToggleVisibilityButton.setOnClickListener { showComposeOptions() }\n        binding.composeContentWarningButton.setOnClickListener { onContentWarningChanged() }\n        binding.composeEmojiButton.setOnClickListener { showEmojis() }\n        binding.composeHideMediaButton.setOnClickListener { toggleHideMedia() }\n        binding.composeScheduleButton.setOnClickListener { onScheduleClick() }\n        binding.composeScheduleView.setResetOnClickListener { resetSchedule() }\n        binding.composeScheduleView.setListener(this)\n        binding.atButton.setOnClickListener { atButtonClicked() }\n        binding.hashButton.setOnClickListener { hashButtonClicked() }\n        binding.descriptionMissingWarningButton.setOnClickListener {\n            displayTransientMessage(R.string.hint_media_description_missing)\n        }\n\n        binding.actionPhotoTake.visible(\n            Intent(MediaStore.ACTION_IMAGE_CAPTURE).resolveActivity(packageManager) != null\n        )\n\n        binding.actionPhotoTake.setOnClickListener { initiateCameraApp() }\n        binding.actionPhotoPick.setOnClickListener { onMediaPick() }\n        binding.addPollTextActionTextView.setOnClickListener { openPollDialog() }\n\n        onBackPressedDispatcher.addCallback(this, onBackPressedCallback)\n    }\n\n    private fun setupLanguageSpinner(initialLanguages: List<String>) {\n        binding.composePostLanguageButton.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {\n            override fun onItemSelected(\n                parent: AdapterView<*>,\n                view: View?,\n                position: Int,\n                id: Long\n            ) {\n                viewModel.postLanguage = (parent.adapter.getItem(position) as Locale).modernLanguageCode\n            }\n\n            override fun onNothingSelected(parent: AdapterView<*>) {\n                parent.setSelection(0)\n            }\n        }\n        binding.composePostLanguageButton.apply {\n            adapter = LocaleAdapter(context, android.R.layout.simple_spinner_dropdown_item, getLocaleList(initialLanguages))\n            setSelection(0)\n        }\n    }\n\n    private fun setupActionBar() {\n        setSupportActionBar(binding.toolbar)\n        supportActionBar?.run {\n            title = null\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n            setHomeAsUpIndicator(R.drawable.ic_close_24dp)\n        }\n    }\n\n    private fun setupAvatar(activeAccount: AccountEntity) {\n        val actionBarSizeAttr = intArrayOf(androidx.appcompat.R.attr.actionBarSize)\n        val avatarSize = obtainStyledAttributes(null, actionBarSizeAttr).use { a ->\n            a.getDimensionPixelSize(0, 1)\n        }\n\n        val animateAvatars = preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false)\n        loadAvatar(\n            activeAccount.profilePictureUrl,\n            binding.composeAvatar,\n            avatarSize / 8,\n            animateAvatars\n        )\n        binding.composeAvatar.contentDescription = getString(\n            R.string.compose_active_account_description,\n            activeAccount.fullName\n        )\n    }\n\n    private fun updateOnBackPressedCallbackState() {\n        val confirmation = viewModel.closeConfirmation.value\n        onBackPressedCallback.isEnabled = confirmation != ConfirmationKind.NONE ||\n            composeOptionsBehavior.state != BottomSheetBehavior.STATE_HIDDEN ||\n            addMediaBehavior.state != BottomSheetBehavior.STATE_HIDDEN ||\n            emojiBehavior.state != BottomSheetBehavior.STATE_HIDDEN ||\n            scheduleBehavior.state != BottomSheetBehavior.STATE_HIDDEN\n    }\n\n    private fun replaceTextAtCaret(text: CharSequence) {\n        // If you select \"backward\" in an editable, you get SelectionStart > SelectionEnd\n        val start = binding.composeEditField.selectionStart.coerceAtMost(\n            binding.composeEditField.selectionEnd\n        )\n        val end = binding.composeEditField.selectionStart.coerceAtLeast(\n            binding.composeEditField.selectionEnd\n        )\n        val textToInsert = if (start > 0 && !binding.composeEditField.text[start - 1].isWhitespace()) {\n            \" $text\"\n        } else {\n            text\n        }\n        binding.composeEditField.text.replace(start, end, textToInsert)\n\n        // Set the cursor after the inserted text\n        binding.composeEditField.setSelection(start + text.length)\n    }\n\n    fun prependSelectedWordsWith(text: CharSequence) {\n        // If you select \"backward\" in an editable, you get SelectionStart > SelectionEnd\n        val start = binding.composeEditField.selectionStart.coerceAtMost(\n            binding.composeEditField.selectionEnd\n        )\n        val end = binding.composeEditField.selectionStart.coerceAtLeast(\n            binding.composeEditField.selectionEnd\n        )\n        val editorText = binding.composeEditField.text\n\n        if (start == end) {\n            // No selection, just insert text at caret\n            editorText.insert(start, text)\n            // Set the cursor after the inserted text\n            binding.composeEditField.setSelection(start + text.length)\n        } else {\n            var wasWord: Boolean\n            var isWord = end < editorText.length && !Character.isWhitespace(editorText[end])\n            var newEnd = end\n\n            // Iterate the selection backward so we don't have to juggle indices on insertion\n            var index = end - 1\n            while (index >= start - 1 && index >= 0) {\n                wasWord = isWord\n                isWord = !Character.isWhitespace(editorText[index])\n                if (wasWord && !isWord) {\n                    // We've reached the beginning of a word, perform insert\n                    editorText.insert(index + 1, text)\n                    newEnd += text.length\n                }\n                --index\n            }\n\n            if (start == 0 && isWord) {\n                // Special case when the selection includes the start of the text\n                editorText.insert(0, text)\n                newEnd += text.length\n            }\n\n            // Keep the same text (including insertions) selected\n            binding.composeEditField.setSelection(start, newEnd)\n        }\n    }\n\n    private fun atButtonClicked() {\n        prependSelectedWordsWith(\"@\")\n    }\n\n    private fun hashButtonClicked() {\n        prependSelectedWordsWith(\"#\")\n    }\n\n    override fun onSaveInstanceState(outState: Bundle) {\n        outState.putParcelable(PHOTO_UPLOAD_URI_KEY, photoUploadUri)\n        outState.putSerializable(VISIBILITY_KEY, viewModel.statusVisibility.value)\n        outState.putBoolean(CONTENT_WARNING_VISIBLE_KEY, viewModel.showContentWarning.value)\n        outState.putString(SCHEDULED_TIME_KEY, viewModel.scheduledAt.value)\n        super.onSaveInstanceState(outState)\n    }\n\n    private fun displayTransientMessage(message: String) {\n        val bar = Snackbar.make(binding.activityCompose, message, Snackbar.LENGTH_LONG)\n        // necessary so snackbar is shown over everything\n        bar.view.elevation = resources.getDimension(R.dimen.compose_activity_snackbar_elevation)\n        bar.setAnchorView(R.id.composeBottomBar)\n        bar.show()\n    }\n    private fun displayTransientMessage(@StringRes stringId: Int) {\n        displayTransientMessage(getString(stringId))\n    }\n\n    private fun toggleHideMedia() {\n        this.viewModel.toggleMarkSensitive()\n    }\n\n    private fun updateSensitiveMediaToggle(\n        markMediaSensitive: Boolean,\n        contentWarningShown: Boolean\n    ) {\n        if (viewModel.media.value.isEmpty()) {\n            binding.composeHideMediaButton.hide()\n            binding.descriptionMissingWarningButton.hide()\n        } else {\n            binding.composeHideMediaButton.show()\n            @AttrRes val color = if (contentWarningShown) {\n                binding.composeHideMediaButton.setImageResource(R.drawable.ic_visibility_off_24dp)\n                binding.composeHideMediaButton.isClickable = false\n                materialR.attr.colorPrimary\n            } else {\n                binding.composeHideMediaButton.isClickable = true\n                if (markMediaSensitive) {\n                    binding.composeHideMediaButton.setImageResource(R.drawable.ic_visibility_off_24dp)\n                    materialR.attr.colorPrimary\n                } else {\n                    binding.composeHideMediaButton.setImageResource(R.drawable.ic_visibility_24dp)\n                    android.R.attr.textColorTertiary\n                }\n            }\n            binding.composeHideMediaButton.drawable.setTint(\n                MaterialColors.getColor(\n                    binding.composeHideMediaButton,\n                    color\n                )\n            )\n\n            val oneMediaWithoutDescription = viewModel.media.value.any { media ->\n                media.description.isNullOrEmpty()\n            }\n            binding.descriptionMissingWarningButton.visibility = if (oneMediaWithoutDescription) View.VISIBLE else View.GONE\n        }\n    }\n\n    private fun updateScheduleButton() {\n        if (viewModel.editing) {\n            // Can't reschedule a published status\n            enableButton(binding.composeScheduleButton, clickable = false, colorActive = false)\n        } else {\n            @ColorInt val color =\n                MaterialColors.getColor(\n                    binding.composeScheduleButton,\n                    if (binding.composeScheduleView.time == null) {\n                        android.R.attr.textColorTertiary\n                    } else {\n                        materialR.attr.colorPrimary\n                    }\n                )\n            binding.composeScheduleButton.drawable.setTint(color)\n        }\n    }\n\n    private fun enableButtons(enable: Boolean, editing: Boolean) {\n        binding.composeAddMediaButton.isClickable = enable\n        binding.composeToggleVisibilityButton.isClickable = enable && !editing\n        binding.composeEmojiButton.isClickable = enable\n        binding.composeHideMediaButton.isClickable = enable\n        binding.composeScheduleButton.isClickable = enable && !editing\n        binding.composeTootButton.isEnabled = enable\n    }\n\n    private fun setStatusVisibility(visibility: Status.Visibility) {\n        binding.composeOptionsBottomSheet.setStatusVisibility(visibility)\n        binding.composeTootButton.setStatusVisibility(visibility)\n\n        val iconRes = when (visibility) {\n            Status.Visibility.PUBLIC -> R.drawable.ic_public_24dp\n            Status.Visibility.PRIVATE -> R.drawable.ic_lock_24dp\n            Status.Visibility.DIRECT -> R.drawable.ic_mail_24dp\n            Status.Visibility.UNLISTED -> R.drawable.ic_lock_open_24dp\n            else -> R.drawable.ic_lock_open_24dp\n        }\n        binding.composeToggleVisibilityButton.setImageResource(iconRes)\n        if (viewModel.editing) {\n            // Can't update visibility on published status\n            enableButton(\n                binding.composeToggleVisibilityButton,\n                clickable = false,\n                colorActive = false\n            )\n        }\n    }\n\n    private fun showComposeOptions() {\n        if (composeOptionsBehavior.state == BottomSheetBehavior.STATE_HIDDEN || composeOptionsBehavior.state == BottomSheetBehavior.STATE_COLLAPSED) {\n            composeOptionsBehavior.state = BottomSheetBehavior.STATE_EXPANDED\n            addMediaBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n            emojiBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n            scheduleBehavior.setState(BottomSheetBehavior.STATE_HIDDEN)\n        } else {\n            composeOptionsBehavior.setState(BottomSheetBehavior.STATE_HIDDEN)\n        }\n    }\n\n    private fun onScheduleClick() {\n        if (viewModel.scheduledAt.value == null) {\n            binding.composeScheduleView.openPickDateDialog()\n        } else {\n            showScheduleView()\n        }\n    }\n\n    private fun showScheduleView() {\n        if (scheduleBehavior.state == BottomSheetBehavior.STATE_HIDDEN || scheduleBehavior.state == BottomSheetBehavior.STATE_COLLAPSED) {\n            scheduleBehavior.state = BottomSheetBehavior.STATE_EXPANDED\n            composeOptionsBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n            addMediaBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n            emojiBehavior.setState(BottomSheetBehavior.STATE_HIDDEN)\n        } else {\n            scheduleBehavior.setState(BottomSheetBehavior.STATE_HIDDEN)\n        }\n    }\n\n    private fun showEmojis() {\n        binding.emojiView.adapter?.let {\n            if (it.itemCount == 0) {\n                val errorMessage =\n                    getString(\n                        R.string.error_no_custom_emojis,\n                        activeAccount\n                    )\n                displayTransientMessage(errorMessage)\n            } else {\n                if (emojiBehavior.state == BottomSheetBehavior.STATE_HIDDEN || emojiBehavior.state == BottomSheetBehavior.STATE_COLLAPSED) {\n                    emojiBehavior.state = BottomSheetBehavior.STATE_EXPANDED\n                    composeOptionsBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n                    addMediaBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n                    scheduleBehavior.setState(BottomSheetBehavior.STATE_HIDDEN)\n                } else {\n                    emojiBehavior.setState(BottomSheetBehavior.STATE_HIDDEN)\n                }\n            }\n        }\n    }\n\n    private fun openPickDialog() {\n        if (addMediaBehavior.state == BottomSheetBehavior.STATE_HIDDEN || addMediaBehavior.state == BottomSheetBehavior.STATE_COLLAPSED) {\n            addMediaBehavior.state = BottomSheetBehavior.STATE_EXPANDED\n            composeOptionsBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n            emojiBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n            scheduleBehavior.setState(BottomSheetBehavior.STATE_HIDDEN)\n        } else {\n            addMediaBehavior.setState(BottomSheetBehavior.STATE_HIDDEN)\n        }\n    }\n\n    private fun onMediaPick() {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {\n            pickMediaFilePermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)\n        } else {\n            pickMediaFileLauncher.launch(true)\n        }\n        addMediaBehavior.setState(BottomSheetBehavior.STATE_HIDDEN)\n    }\n\n    private fun openPollDialog() = lifecycleScope.launch {\n        addMediaBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n        val instanceParams = viewModel.instanceInfo.first()\n        showAddPollDialog(\n            context = this@ComposeActivity,\n            poll = viewModel.poll.value,\n            maxOptionCount = instanceParams.pollMaxOptions,\n            maxOptionLength = instanceParams.pollMaxLength,\n            minDuration = instanceParams.pollMinDuration,\n            maxDuration = instanceParams.pollMaxDuration,\n            onUpdatePoll = viewModel::updatePoll\n        )\n    }\n\n    private fun setupPollView() {\n        val margin = resources.getDimensionPixelSize(R.dimen.compose_media_preview_margin)\n        val marginBottom = resources.getDimensionPixelSize(\n            R.dimen.compose_media_preview_margin_bottom\n        )\n\n        val layoutParams = LinearLayout.LayoutParams(\n            ViewGroup.LayoutParams.WRAP_CONTENT,\n            ViewGroup.LayoutParams.WRAP_CONTENT\n        )\n        layoutParams.setMargins(margin, margin, margin, marginBottom)\n        binding.pollPreview.layoutParams = layoutParams\n\n        binding.pollPreview.setOnClickListener {\n            val popup = PopupMenu(this, binding.pollPreview)\n            val editId = 1\n            val removeId = 2\n            popup.menu.add(0, editId, 0, R.string.edit_poll)\n            popup.menu.add(0, removeId, 0, R.string.action_remove)\n            popup.setOnMenuItemClickListener { menuItem ->\n                when (menuItem.itemId) {\n                    editId -> openPollDialog()\n                    removeId -> removePoll()\n                }\n                true\n            }\n            popup.show()\n        }\n    }\n\n    private fun removePoll() {\n        viewModel.updatePoll(null)\n        binding.pollPreview.hide()\n    }\n\n    override fun onVisibilityChanged(visibility: Status.Visibility) {\n        composeOptionsBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n        viewModel.changeStatusVisibility(visibility)\n    }\n\n    @VisibleForTesting\n    fun calculateTextLength(): Int {\n        return statusLength(\n            binding.composeEditField.text,\n            binding.composeContentWarningField.text,\n            charactersReservedPerUrl\n        )\n    }\n\n    @VisibleForTesting\n    val selectedLanguage: String?\n        get() = viewModel.postLanguage\n\n    private fun updateVisibleCharactersLeft() {\n        val remainingLength = maximumTootCharacters - calculateTextLength()\n        binding.composeCharactersLeftView.text = String.format(Locale.getDefault(), \"%d\", remainingLength)\n\n        val textColor = if (remainingLength < 0) {\n            getColor(R.color.warning_color)\n        } else {\n            MaterialColors.getColor(\n                binding.composeCharactersLeftView,\n                android.R.attr.textColorTertiary\n            )\n        }\n        binding.composeCharactersLeftView.setTextColor(textColor)\n    }\n\n    private fun onContentWarningChanged() {\n        val showWarning = binding.composeContentWarningBar.isGone\n        viewModel.contentWarningChanged(showWarning)\n        updateVisibleCharactersLeft()\n    }\n\n    private fun verifyScheduledTime(): Boolean {\n        return binding.composeScheduleView.verifyScheduledTime(\n            binding.composeScheduleView.getDateTime(viewModel.scheduledAt.value)\n        )\n    }\n\n    private fun onSendClicked() {\n        if (verifyScheduledTime()) {\n            sendStatus()\n        } else {\n            showScheduleView()\n        }\n    }\n\n    /** This is for the fancy keyboards which can insert images and stuff, and drag&drop etc */\n    override fun onReceiveContent(view: View, contentInfo: ContentInfoCompat): ContentInfoCompat? {\n        if (contentInfo.clip.description.hasMimeType(\"image/*\")) {\n            val split = contentInfo.partition { item: ClipData.Item -> item.uri != null }\n            split.first?.let { content ->\n                val description = (contentInfo.clip.description.label as String?)?.let {\n                    // The Gboard android keyboard attaches this text whenever the user\n                    // pastes something from the keyboard's suggestion bar.\n                    // Due to different end user locales, the exact text may vary, but at\n                    // least in version 13.4.08, all of the translations contained the\n                    // string \"Gboard\".\n                    if (\"Gboard\" in it) {\n                        null\n                    } else {\n                        it\n                    }\n                }\n\n                viewModel.pickMedia(\n                    content.clip.map { clipItem ->\n                        ComposeViewModel.MediaData(\n                            uri = clipItem.uri,\n                            description = description\n                        )\n                    }\n                )\n            }\n            return split.second\n        }\n        return contentInfo\n    }\n\n    private fun sendStatus() {\n        enableButtons(false, viewModel.editing)\n        val contentText = binding.composeEditField.text.toString()\n        var spoilerText = \"\"\n        if (viewModel.showContentWarning.value) {\n            spoilerText = binding.composeContentWarningField.text.toString()\n        }\n        val characterCount = calculateTextLength()\n        if ((characterCount <= 0 || contentText.isBlank()) && viewModel.media.value.isEmpty()) {\n            binding.composeEditField.error = getString(R.string.error_empty)\n            enableButtons(true, viewModel.editing)\n        } else if (characterCount <= maximumTootCharacters) {\n            lifecycleScope.launch {\n                viewModel.sendStatus(contentText, spoilerText, activeAccount.id)\n                deleteDraftAndFinish()\n            }\n        } else {\n            binding.composeEditField.error = getString(R.string.error_compose_character_limit)\n            enableButtons(true, viewModel.editing)\n        }\n    }\n\n    private fun initiateCameraApp() {\n        addMediaBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n\n        val photoFile: File = try {\n            createNewImageFile(this)\n        } catch (ex: IOException) {\n            displayTransientMessage(R.string.error_media_upload_opening)\n            return\n        }\n\n        // Continue only if the File was successfully created\n        photoUploadUri = FileProvider.getUriForFile(\n            this,\n            BuildConfig.APPLICATION_ID + \".fileprovider\",\n            photoFile\n        ).also { uri -> takePictureLauncher.launch(uri) }\n    }\n\n    private fun enableButton(button: ImageButton, clickable: Boolean, colorActive: Boolean) {\n        button.isEnabled = clickable\n        setDrawableTint(\n            this,\n            button.drawable,\n            if (colorActive) {\n                android.R.attr.textColorTertiary\n            } else {\n                R.attr.textColorDisabled\n            }\n        )\n    }\n\n    private fun enablePollButton(enable: Boolean) {\n        binding.addPollTextActionTextView.isEnabled = enable\n        val textColor = MaterialColors.getColor(\n            binding.addPollTextActionTextView,\n            if (enable) {\n                android.R.attr.textColorTertiary\n            } else {\n                R.attr.textColorDisabled\n            }\n        )\n        binding.addPollTextActionTextView.setTextColor(textColor)\n        binding.addPollTextActionTextView.compoundDrawablesRelative[0].setTint(textColor)\n    }\n\n    private fun editImageInQueue(item: QueuedMedia) {\n        // If input image is lossless, output image should be lossless.\n        // Currently the only supported lossless format is png.\n        val mimeType: String? = contentResolver.getType(item.uri)\n        val isPng: Boolean = mimeType != null && mimeType.endsWith(\"/png\")\n        val tempFile = createNewImageFile(this, if (isPng) \".png\" else \".jpg\")\n\n        // \"Authority\" must be the same as the android:authorities string in AndroidManifest.xml\n        val uriNew = FileProvider.getUriForFile(\n            this,\n            BuildConfig.APPLICATION_ID + \".fileprovider\",\n            tempFile\n        )\n\n        viewModel.cropImageItemOld = item\n\n        cropImage.launch(\n            options(uri = item.uri) {\n                setOutputUri(uriNew)\n                setOutputCompressFormat(\n                    if (isPng) Bitmap.CompressFormat.PNG else Bitmap.CompressFormat.JPEG\n                )\n            }\n        )\n    }\n\n    private fun removeMediaFromQueue(item: QueuedMedia) {\n        viewModel.removeMediaFromQueue(item)\n    }\n\n    private fun showContentWarning(show: Boolean) {\n        TransitionManager.beginDelayedTransition(\n            binding.composeContentWarningBar.parent as ViewGroup\n        )\n        @AttrRes val color = if (show) {\n            binding.composeContentWarningBar.show()\n            binding.composeContentWarningField.setSelection(\n                binding.composeContentWarningField.text.length\n            )\n            binding.composeContentWarningField.requestFocus()\n            materialR.attr.colorPrimary\n        } else {\n            binding.composeContentWarningBar.hide()\n            binding.composeEditField.requestFocus()\n            android.R.attr.textColorTertiary\n        }\n        binding.composeContentWarningButton.drawable.setTint(\n            MaterialColors.getColor(\n                binding.composeHideMediaButton,\n                color\n            )\n        )\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        if (item.itemId == android.R.id.home) {\n            handleCloseButton()\n            return true\n        }\n\n        return super.onOptionsItemSelected(item)\n    }\n\n    override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {\n        if (event.action == KeyEvent.ACTION_DOWN) {\n            if (event.isCtrlPressed) {\n                if (keyCode == KeyEvent.KEYCODE_ENTER) {\n                    // send toot by pressing CTRL + ENTER\n                    this.onSendClicked()\n                    return true\n                }\n            }\n\n            if (keyCode == KeyEvent.KEYCODE_BACK) {\n                onBackPressedDispatcher.onBackPressed()\n                return true\n            }\n        }\n        return super.onKeyDown(keyCode, event)\n    }\n\n    private fun handleCloseButton() {\n        val contentText = binding.composeEditField.text.toString()\n        val contentWarning = binding.composeContentWarningField.text.toString()\n        when (viewModel.closeConfirmation.value) {\n            ConfirmationKind.NONE -> {\n                viewModel.stopUploads()\n                finish()\n            }\n            ConfirmationKind.SAVE_OR_DISCARD ->\n                getSaveAsDraftOrDiscardDialog(contentText, contentWarning).show()\n            ConfirmationKind.UPDATE_OR_DISCARD ->\n                getUpdateDraftOrDiscardDialog(contentText, contentWarning).show()\n            ConfirmationKind.CONTINUE_EDITING_OR_DISCARD_CHANGES ->\n                getContinueEditingOrDiscardDialog().show()\n            ConfirmationKind.CONTINUE_EDITING_OR_DISCARD_DRAFT ->\n                getDeleteEmptyDraftOrContinueEditing().show()\n        }\n    }\n\n    /**\n     * User is editing a new post, and can either save the changes as a draft or discard them.\n     */\n    private fun getSaveAsDraftOrDiscardDialog(\n        contentText: String,\n        contentWarning: String\n    ): MaterialAlertDialogBuilder {\n        val warning = if (viewModel.media.value.isNotEmpty()) {\n            R.string.compose_save_draft_loses_media\n        } else {\n            R.string.compose_save_draft\n        }\n\n        return MaterialAlertDialogBuilder(this)\n            .setMessage(warning)\n            .setPositiveButton(R.string.action_save) { _, _ ->\n                viewModel.stopUploads()\n                saveDraftAndFinish(contentText, contentWarning)\n            }\n            .setNegativeButton(R.string.action_delete) { _, _ ->\n                viewModel.stopUploads()\n                deleteDraftAndFinish()\n            }\n    }\n\n    /**\n     * User is editing an existing draft, and can either update the draft with the new changes or\n     * discard them.\n     */\n    private fun getUpdateDraftOrDiscardDialog(\n        contentText: String,\n        contentWarning: String\n    ): MaterialAlertDialogBuilder {\n        val warning = if (viewModel.media.value.isNotEmpty()) {\n            R.string.compose_save_draft_loses_media\n        } else {\n            R.string.compose_save_draft\n        }\n\n        return MaterialAlertDialogBuilder(this)\n            .setMessage(warning)\n            .setPositiveButton(R.string.action_save) { _, _ ->\n                viewModel.stopUploads()\n                saveDraftAndFinish(contentText, contentWarning)\n            }\n            .setNegativeButton(R.string.action_discard) { _, _ ->\n                viewModel.stopUploads()\n                finish()\n            }\n    }\n\n    /**\n     * User is editing a post (scheduled, or posted), and can either go back to editing, or\n     * discard the changes.\n     */\n    private fun getContinueEditingOrDiscardDialog(): MaterialAlertDialogBuilder {\n        return MaterialAlertDialogBuilder(this)\n            .setMessage(R.string.compose_unsaved_changes)\n            .setPositiveButton(R.string.action_continue_edit) { _, _ ->\n                // Do nothing, dialog will dismiss, user can continue editing\n            }\n            .setNegativeButton(R.string.action_discard) { _, _ ->\n                viewModel.stopUploads()\n                finish()\n            }\n    }\n\n    /**\n     * User is editing an existing draft and making it empty.\n     * The user can either delete the empty draft or go back to editing.\n     */\n    private fun getDeleteEmptyDraftOrContinueEditing(): MaterialAlertDialogBuilder {\n        return MaterialAlertDialogBuilder(this)\n            .setMessage(R.string.compose_delete_draft)\n            .setPositiveButton(R.string.action_delete) { _, _ ->\n                viewModel.deleteDraft()\n                viewModel.stopUploads()\n                finish()\n            }\n            .setNegativeButton(R.string.action_continue_edit) { _, _ ->\n                // Do nothing, dialog will dismiss, user can continue editing\n            }\n    }\n\n    private fun deleteDraftAndFinish() {\n        viewModel.deleteDraft()\n        finish()\n    }\n\n    private fun saveDraftAndFinish(contentText: String, contentWarning: String) {\n        lifecycleScope.launch {\n            viewModel.saveDraft(contentText, contentWarning)\n            finish()\n        }\n    }\n\n    override fun search(token: String): List<ComposeAutoCompleteAdapter.AutocompleteResult> {\n        return viewModel.searchAutocompleteSuggestions(token)\n    }\n\n    override fun onEmojiSelected(shortcode: String) {\n        replaceTextAtCaret(\":$shortcode: \")\n    }\n\n    private fun setEmojiList(emojiList: List<Emoji>?) {\n        if (emojiList != null) {\n            val animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false)\n            binding.emojiView.adapter = EmojiAdapter(emojiList, this@ComposeActivity, animateEmojis)\n            enableButton(binding.composeEmojiButton, true, emojiList.isNotEmpty())\n        }\n    }\n\n    override fun onTimeSet(time: String?) {\n        viewModel.updateScheduledAt(time)\n        if (verifyScheduledTime()) {\n            scheduleBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n        } else {\n            showScheduleView()\n        }\n    }\n\n    private fun resetSchedule() {\n        viewModel.updateScheduledAt(null)\n        scheduleBehavior.state = BottomSheetBehavior.STATE_HIDDEN\n    }\n\n    override fun onUpdateDescription(localId: Int, description: String) {\n        viewModel.updateDescription(localId, description)\n    }\n\n    /**\n     * Status' kind. This particularly affects how the status is handled if the user\n     * backs out of the edit.\n     */\n    enum class ComposeKind {\n        /** Status is new */\n        NEW,\n\n        /** Editing a posted status */\n        EDIT_POSTED,\n\n        /** Editing a status started as an existing draft */\n        EDIT_DRAFT,\n\n        /** Editing an an existing scheduled status */\n        EDIT_SCHEDULED\n    }\n\n    @Parcelize\n    data class ComposeOptions(\n        // Let's keep fields var until all consumers are Kotlin\n        var scheduledTootId: String? = null,\n        var draftId: Int? = null,\n        var content: String? = null,\n        var mediaUrls: List<String>? = null,\n        var mediaDescriptions: List<String>? = null,\n        var mentionedUsernames: Set<String>? = null,\n        var inReplyToId: String? = null,\n        var replyVisibility: Status.Visibility? = null,\n        var visibility: Status.Visibility? = null,\n        var contentWarning: String? = null,\n        var replyingStatusAuthor: String? = null,\n        var replyingStatusContent: String? = null,\n        var mediaAttachments: List<Attachment>? = null,\n        var draftAttachments: List<DraftAttachment>? = null,\n        var scheduledAt: String? = null,\n        var sensitive: Boolean? = null,\n        var poll: NewPoll? = null,\n        var modifiedInitialState: Boolean? = null,\n        var language: String? = null,\n        var statusId: String? = null,\n        var kind: ComposeKind? = null\n    ) : Parcelable\n\n    companion object {\n        private const val TAG = \"ComposeActivity\" // logging tag\n\n        internal const val COMPOSE_OPTIONS_EXTRA = \"COMPOSE_OPTIONS\"\n        private const val PHOTO_UPLOAD_URI_KEY = \"PHOTO_UPLOAD_URI\"\n        private const val VISIBILITY_KEY = \"VISIBILITY\"\n        private const val SCHEDULED_TIME_KEY = \"SCHEDULE\"\n        private const val CONTENT_WARNING_VISIBLE_KEY = \"CONTENT_WARNING_VISIBLE\"\n\n        /**\n         * @param options ComposeOptions to configure the ComposeActivity\n         * @return an Intent to start the ComposeActivity\n         */\n        @JvmStatic\n        fun startIntent(context: Context, options: ComposeOptions): Intent {\n            return Intent(context, ComposeActivity::class.java).apply {\n                putExtra(COMPOSE_OPTIONS_EXTRA, options)\n            }\n        }\n\n        fun canHandleMimeType(mimeType: String?): Boolean {\n            return mimeType != null && (mimeType.startsWith(\"image/\") || mimeType.startsWith(\"video/\") || mimeType.startsWith(\"audio/\") || mimeType == \"text/plain\")\n        }\n\n        /**\n         * Calculate the effective status length.\n         *\n         * Some text is counted differently:\n         *\n         * In the status body:\n         *\n         * - URLs always count for [urlLength] characters irrespective of their actual length\n         *   (https://docs.joinmastodon.org/user/posting/#links)\n         * - Mentions (\"@user@some.instance\") only count the \"@user\" part\n         *   (https://docs.joinmastodon.org/user/posting/#mentions)\n         * - Hashtags are always treated as their actual length, including the \"#\"\n         *   (https://docs.joinmastodon.org/user/posting/#hashtags)\n         *\n         * Content warning text is always treated as its full length, URLs and other entities\n         * are not treated differently.\n         *\n         * @param body status body text\n         * @param contentWarning optional content warning text\n         * @param urlLength the number of characters attributed to URLs\n         * @return the effective status length\n         */\n        @JvmStatic\n        fun statusLength(body: Spanned, contentWarning: Spanned?, urlLength: Int): Int {\n            var length = body.toString().perceivedCharacterLength() - body.getSpans(0, body.length, URLSpan::class.java)\n                .fold(0) { acc, span ->\n                    // Accumulate a count of characters to be *ignored* in the final length\n                    acc + when (span) {\n                        is MentionSpan -> {\n                            // Ignore everything from the second \"@\" (if present)\n                            span.url.length - (\n                                span.url.indexOf(\"@\", 1).takeIf { it >= 0 }\n                                    ?: span.url.length\n                                )\n                        }\n                        else -> {\n                            // Expected to be negative if the URL length < maxUrlLength\n                            span.url.perceivedCharacterLength() - urlLength\n                        }\n                    }\n                }\n\n            // Content warning text is treated as is, URLs or mentions there are not special\n            contentWarning?.let { length += it.toString().perceivedCharacterLength() }\n            return length\n        }\n\n        // String.length would count emojis as multiple characters but Mastodon counts them as 1, so we need this workaround\n        private fun String.perceivedCharacterLength(): Int {\n            val breakIterator = BreakIterator.getCharacterInstance()\n            breakIterator.setText(this)\n            var count = 0\n            while (breakIterator.next() != BreakIterator.DONE) {\n                count++\n            }\n            return count\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeAutoCompleteAdapter.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.compose\n\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.BaseAdapter\nimport android.widget.Filter\nimport android.widget.Filterable\nimport androidx.annotation.WorkerThread\nimport com.bumptech.glide.Glide\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemAutocompleteAccountBinding\nimport com.keylesspalace.tusky.databinding.ItemAutocompleteEmojiBinding\nimport com.keylesspalace.tusky.databinding.ItemAutocompleteHashtagBinding\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.entity.TimelineAccount\nimport com.keylesspalace.tusky.util.emojify\nimport com.keylesspalace.tusky.util.loadAvatar\nimport com.keylesspalace.tusky.util.visible\n\nclass ComposeAutoCompleteAdapter(\n    private val autocompletionProvider: AutocompletionProvider,\n    private val animateAvatar: Boolean,\n    private val animateEmojis: Boolean,\n    private val showBotBadge: Boolean,\n    // if true, @ # : are returned in the result, otherwise only the raw value\n    private val withDecoration: Boolean = true,\n) : BaseAdapter(), Filterable {\n\n    private var resultList: List<AutocompleteResult> = emptyList()\n\n    override fun getCount() = resultList.size\n\n    override fun getItem(index: Int): AutocompleteResult {\n        return resultList[index]\n    }\n\n    override fun getItemId(position: Int): Long {\n        return position.toLong()\n    }\n\n    override fun getFilter() = object : Filter() {\n\n        override fun convertResultToString(resultValue: Any): CharSequence {\n            return when (resultValue) {\n                is AutocompleteResult.AccountResult -> if (withDecoration) \"@${resultValue.account.username}\" else resultValue.account.username\n                is AutocompleteResult.HashtagResult -> if (withDecoration) \"#${resultValue.hashtag}\" else resultValue.hashtag\n                is AutocompleteResult.EmojiResult -> if (withDecoration) \":${resultValue.emoji.shortcode}:\" else resultValue.emoji.shortcode\n                else -> \"\"\n            }\n        }\n\n        @WorkerThread\n        override fun performFiltering(constraint: CharSequence?): FilterResults {\n            val filterResults = FilterResults()\n            if (constraint != null) {\n                val results = autocompletionProvider.search(constraint.toString())\n                filterResults.values = results\n                filterResults.count = results.size\n            }\n            return filterResults\n        }\n\n        @Suppress(\"UNCHECKED_CAST\")\n        override fun publishResults(constraint: CharSequence?, results: FilterResults) {\n            if (results.count > 0) {\n                resultList = results.values as List<AutocompleteResult>\n                notifyDataSetChanged()\n            } else {\n                notifyDataSetInvalidated()\n            }\n        }\n    }\n\n    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {\n        val itemViewType = getItemViewType(position)\n        val context = parent.context\n\n        val view: View = convertView ?: run {\n            val layoutInflater = LayoutInflater.from(context)\n            val binding = when (itemViewType) {\n                ACCOUNT_VIEW_TYPE -> ItemAutocompleteAccountBinding.inflate(layoutInflater)\n                HASHTAG_VIEW_TYPE -> ItemAutocompleteHashtagBinding.inflate(layoutInflater)\n                EMOJI_VIEW_TYPE -> ItemAutocompleteEmojiBinding.inflate(layoutInflater)\n                else -> throw AssertionError(\"unknown view type\")\n            }\n            binding.root.tag = binding\n            binding.root\n        }\n\n        when (val binding = view.tag) {\n            is ItemAutocompleteAccountBinding -> {\n                val accountResult = getItem(position) as AutocompleteResult.AccountResult\n                val account = accountResult.account\n                binding.username.text = context.getString(R.string.post_username_format, account.username)\n                binding.displayName.text = account.name.emojify(account.emojis, binding.displayName, animateEmojis)\n                val avatarRadius = context.resources.getDimensionPixelSize(\n                    R.dimen.avatar_radius_42dp\n                )\n                loadAvatar(\n                    account.avatar,\n                    binding.avatar,\n                    avatarRadius,\n                    animateAvatar\n                )\n                binding.avatarBadge.visible(showBotBadge && account.bot)\n            }\n            is ItemAutocompleteHashtagBinding -> {\n                val result = getItem(position) as AutocompleteResult.HashtagResult\n                binding.root.text = context.getString(R.string.hashtag_format, result.hashtag)\n            }\n            is ItemAutocompleteEmojiBinding -> {\n                val emojiResult = getItem(position) as AutocompleteResult.EmojiResult\n                val (shortcode, url) = emojiResult.emoji\n                binding.shortcode.text = context.getString(R.string.emoji_shortcode_format, shortcode)\n                Glide.with(binding.preview)\n                    .load(url)\n                    .into(binding.preview)\n            }\n        }\n        return view\n    }\n\n    override fun getViewTypeCount() = 3\n\n    override fun getItemViewType(position: Int): Int {\n        return when (getItem(position)) {\n            is AutocompleteResult.AccountResult -> ACCOUNT_VIEW_TYPE\n            is AutocompleteResult.HashtagResult -> HASHTAG_VIEW_TYPE\n            is AutocompleteResult.EmojiResult -> EMOJI_VIEW_TYPE\n        }\n    }\n\n    sealed interface AutocompleteResult {\n        class AccountResult(val account: TimelineAccount) : AutocompleteResult\n\n        class HashtagResult(val hashtag: String) : AutocompleteResult\n\n        class EmojiResult(val emoji: Emoji) : AutocompleteResult\n    }\n\n    interface AutocompletionProvider {\n        fun search(token: String): List<AutocompleteResult>\n    }\n\n    companion object {\n        private const val ACCOUNT_VIEW_TYPE = 0\n        private const val HASHTAG_VIEW_TYPE = 1\n        private const val EMOJI_VIEW_TYPE = 2\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeTokenizer.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.compose\n\nimport android.text.SpannableString\nimport android.text.Spanned\nimport android.text.TextUtils\nimport android.widget.MultiAutoCompleteTextView\n\nclass ComposeTokenizer : MultiAutoCompleteTextView.Tokenizer {\n\n    private fun isMentionOrHashtagAllowedCharacter(character: Char): Boolean {\n        return Character.isLetterOrDigit(character) || character == '_' || // simple usernames\n            character == '-' || // extended usernames\n            character == '.' // domain dot\n    }\n\n    override fun findTokenStart(text: CharSequence, cursor: Int): Int {\n        if (cursor == 0) {\n            return cursor\n        }\n        var i = cursor\n        var character = text[i - 1]\n\n        // go up to first illegal character or character we're looking for (@, # or :)\n        while (i > 0 && !(character == '@' || character == '#' || character == ':')) {\n            if (!isMentionOrHashtagAllowedCharacter(character)) {\n                return cursor\n            }\n\n            i--\n            character = if (i == 0) ' ' else text[i - 1]\n        }\n\n        // maybe caught domain name? try search username\n        if (i > 2 && character == '@') {\n            var j = i - 1\n            var character2 = text[i - 2]\n\n            // again go up to first illegal character or tag \"@\"\n            while (j > 0 && character2 != '@') {\n                if (!isMentionOrHashtagAllowedCharacter(character2)) {\n                    break\n                }\n\n                j--\n                character2 = if (j == 0) ' ' else text[j - 1]\n            }\n\n            // found mention symbol, override cursor\n            if (character2 == '@') {\n                i = j\n                character = character2\n            }\n        }\n\n        if (i < 1 ||\n            (character != '@' && character != '#' && character != ':') ||\n            i > 1 && !Character.isWhitespace(text[i - 2])\n        ) {\n            return cursor\n        }\n        return i - 1\n    }\n\n    override fun findTokenEnd(text: CharSequence, cursor: Int): Int {\n        var i = cursor\n        val length = text.length\n        while (i < length) {\n            if (text[i] == ' ') {\n                return i\n            } else {\n                i++\n            }\n        }\n        return length\n    }\n\n    override fun terminateToken(text: CharSequence): CharSequence {\n        var i = text.length\n        while (i > 0 && text[i - 1] == ' ') {\n            i--\n        }\n        return if (i > 0 && text[i - 1] == ' ') {\n            text\n        } else if (text is Spanned) {\n            val s = SpannableString(\"$text \")\n            TextUtils.copySpansFrom(text, 0, text.length, Object::class.java, s, 0)\n            s\n        } else {\n            \"$text \"\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeViewModel.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.compose\n\nimport android.net.Uri\nimport android.util.Log\nimport androidx.core.net.toUri\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport at.connyduck.calladapter.networkresult.fold\nimport com.keylesspalace.tusky.components.compose.ComposeActivity.ComposeKind\nimport com.keylesspalace.tusky.components.compose.ComposeAutoCompleteAdapter.AutocompleteResult\nimport com.keylesspalace.tusky.components.drafts.DraftHelper\nimport com.keylesspalace.tusky.components.instanceinfo.InstanceInfo\nimport com.keylesspalace.tusky.components.instanceinfo.InstanceInfoRepository\nimport com.keylesspalace.tusky.components.search.SearchType\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.entity.NewPoll\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.service.MediaToSend\nimport com.keylesspalace.tusky.service.ServiceClient\nimport com.keylesspalace.tusky.service.StatusToSend\nimport com.keylesspalace.tusky.util.randomAlphanumericString\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharedFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.asFlow\nimport kotlinx.coroutines.flow.asSharedFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.flow.shareIn\nimport kotlinx.coroutines.flow.update\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.runBlocking\n\n@HiltViewModel\nclass ComposeViewModel @Inject constructor(\n    private val api: MastodonApi,\n    private val accountManager: AccountManager,\n    private val mediaUploader: MediaUploader,\n    private val serviceClient: ServiceClient,\n    private val draftHelper: DraftHelper,\n    instanceInfoRepo: InstanceInfoRepository\n) : ViewModel() {\n\n    private var replyingStatusAuthor: String? = null\n    private var replyingStatusContent: String? = null\n    internal var startingText: String? = null\n    internal var postLanguage: String? = null\n    private var draftId: Int = 0\n    private var scheduledTootId: String? = null\n    private var startingContentWarning: String = \"\"\n    private var inReplyToId: String? = null\n    private var originalStatusId: String? = null\n    private var startingVisibility: Status.Visibility = Status.Visibility.UNKNOWN\n\n    private var contentWarningStateChanged: Boolean = false\n    private var modifiedInitialState: Boolean = false\n    private var hasScheduledTimeChanged: Boolean = false\n\n    private var currentContent: String? = \"\"\n    private var currentContentWarning: String? = \"\"\n\n    val instanceInfo: SharedFlow<InstanceInfo> = instanceInfoRepo::getUpdatedInstanceInfoOrFallback.asFlow()\n        .shareIn(viewModelScope, SharingStarted.Eagerly, replay = 1)\n\n    val emoji: SharedFlow<List<Emoji>> = instanceInfoRepo::getEmojis.asFlow()\n        .shareIn(viewModelScope, SharingStarted.Eagerly, replay = 1)\n\n    private val _markMediaAsSensitive =\n        MutableStateFlow(accountManager.activeAccount?.defaultMediaSensitivity == true)\n    val markMediaAsSensitive: StateFlow<Boolean> = _markMediaAsSensitive.asStateFlow()\n\n    private val _statusVisibility = MutableStateFlow(Status.Visibility.UNKNOWN)\n    val statusVisibility: StateFlow<Status.Visibility> = _statusVisibility.asStateFlow()\n\n    private val _showContentWarning = MutableStateFlow(false)\n    val showContentWarning: StateFlow<Boolean> = _showContentWarning.asStateFlow()\n\n    private val _poll = MutableStateFlow(null as NewPoll?)\n    val poll: StateFlow<NewPoll?> = _poll.asStateFlow()\n\n    private val _scheduledAt = MutableStateFlow(null as String?)\n    val scheduledAt: StateFlow<String?> = _scheduledAt.asStateFlow()\n\n    private val _media = MutableStateFlow(emptyList<QueuedMedia>())\n    val media: StateFlow<List<QueuedMedia>> = _media.asStateFlow()\n\n    private val _uploadError = MutableSharedFlow<Throwable>(\n        replay = 0,\n        extraBufferCapacity = 1,\n        onBufferOverflow = BufferOverflow.DROP_OLDEST\n    )\n    val uploadError: SharedFlow<Throwable> = _uploadError.asSharedFlow()\n\n    private val _closeConfirmation = MutableStateFlow(ConfirmationKind.NONE)\n    val closeConfirmation: StateFlow<ConfirmationKind> = _closeConfirmation.asStateFlow()\n\n    private lateinit var composeKind: ComposeKind\n\n    // Used in ComposeActivity to pass state to result function when cropImage contract inflight\n    var cropImageItemOld: QueuedMedia? = null\n\n    private var setupComplete = false\n\n    fun pickMedia(uri: Uri) {\n        pickMedia(listOf(MediaData(uri)))\n    }\n\n    fun pickMedia(mediaList: List<MediaData>) = viewModelScope.launch(Dispatchers.IO) {\n        val instanceInfo = instanceInfo.first()\n        mediaList.map { m ->\n            async { mediaUploader.prepareMedia(m.uri, instanceInfo) }\n        }.forEachIndexed { index, preparedMedia ->\n            preparedMedia.await().fold({ (type, uri, size) ->\n                if (type != QueuedMedia.Type.IMAGE &&\n                    _media.value.firstOrNull()?.type == QueuedMedia.Type.IMAGE\n                ) {\n                    _uploadError.emit(VideoOrImageException())\n                } else {\n                    val pickedMedia = mediaList[index]\n                    addMediaToQueue(type, uri, size, pickedMedia.description, pickedMedia.focus)\n                }\n            }, { error ->\n                _uploadError.emit(error)\n            })\n        }\n    }\n\n    fun addMediaToQueue(\n        type: QueuedMedia.Type,\n        uri: Uri,\n        mediaSize: Long,\n        description: String? = null,\n        focus: Attachment.Focus? = null,\n        replaceItem: QueuedMedia? = null\n    ): QueuedMedia {\n        val mediaItem = QueuedMedia(\n            localId = mediaUploader.getNewLocalMediaId(),\n            uri = uri,\n            type = type,\n            mediaSize = mediaSize,\n            description = description,\n            focus = focus,\n            state = QueuedMedia.State.UPLOADING\n        )\n\n        _media.update { mediaList ->\n            if (replaceItem != null) {\n                mediaUploader.cancelUploadScope(replaceItem.localId)\n                mediaList.map {\n                    if (it.localId == replaceItem.localId) mediaItem else it\n                }\n            } else { // Append\n                mediaList + mediaItem\n            }\n        }\n\n        viewModelScope.launch {\n            mediaUploader\n                .uploadMedia(mediaItem, instanceInfo.first())\n                .collect { event ->\n                    val item = _media.value.find { it.localId == mediaItem.localId }\n                        ?: return@collect\n                    val newMediaItem = when (event) {\n                        is UploadEvent.ProgressEvent ->\n                            item.copy(uploadPercent = event.percentage)\n\n                        is UploadEvent.FinishedEvent ->\n                            item.copy(\n                                id = event.mediaId,\n                                uploadPercent = -1,\n                                state = if (event.processed) {\n                                    QueuedMedia.State.PROCESSED\n                                } else {\n                                    QueuedMedia.State.UNPROCESSED\n                                }\n                            )\n                        is UploadEvent.ErrorEvent -> {\n                            _media.update { mediaList -> mediaList.filter { it.localId != mediaItem.localId } }\n                            _uploadError.emit(event.error)\n                            return@collect\n                        }\n                    }\n                    _media.update { mediaList ->\n                        mediaList.map { mediaItem ->\n                            if (mediaItem.localId == newMediaItem.localId) {\n                                newMediaItem\n                            } else {\n                                mediaItem\n                            }\n                        }\n                    }\n                }\n        }\n        updateCloseConfirmation()\n        return mediaItem\n    }\n\n    fun changeStatusVisibility(visibility: Status.Visibility) {\n        _statusVisibility.value = visibility\n    }\n\n    private fun addUploadedMedia(\n        id: String,\n        type: QueuedMedia.Type,\n        uri: Uri,\n        description: String?,\n        focus: Attachment.Focus?\n    ) {\n        _media.update { mediaList ->\n            val mediaItem = QueuedMedia(\n                localId = mediaUploader.getNewLocalMediaId(),\n                uri = uri,\n                type = type,\n                mediaSize = 0,\n                uploadPercent = -1,\n                id = id,\n                description = description,\n                focus = focus,\n                state = QueuedMedia.State.PUBLISHED\n            )\n            mediaList + mediaItem\n        }\n    }\n\n    fun removeMediaFromQueue(item: QueuedMedia) {\n        mediaUploader.cancelUploadScope(item.localId)\n        _media.update { mediaList -> mediaList.filter { it.localId != item.localId } }\n        updateCloseConfirmation()\n    }\n\n    fun toggleMarkSensitive() {\n        this._markMediaAsSensitive.value = this._markMediaAsSensitive.value != true\n    }\n\n    fun updateContent(newContent: String?) {\n        currentContent = newContent\n        updateCloseConfirmation()\n    }\n\n    fun updateContentWarning(newContentWarning: String?) {\n        currentContentWarning = newContentWarning\n        updateCloseConfirmation()\n    }\n\n    private fun updateCloseConfirmation() {\n        val contentWarning = if (_showContentWarning.value) {\n            currentContentWarning\n        } else {\n            \"\"\n        }\n        this._closeConfirmation.value = if (didChange(currentContent, contentWarning)) {\n            when (composeKind) {\n                ComposeKind.NEW -> if (isEmpty(currentContent, contentWarning)) {\n                    ConfirmationKind.NONE\n                } else {\n                    ConfirmationKind.SAVE_OR_DISCARD\n                }\n                ComposeKind.EDIT_DRAFT -> if (isEmpty(currentContent, contentWarning)) {\n                    ConfirmationKind.CONTINUE_EDITING_OR_DISCARD_DRAFT\n                } else {\n                    ConfirmationKind.UPDATE_OR_DISCARD\n                }\n                ComposeKind.EDIT_POSTED -> ConfirmationKind.CONTINUE_EDITING_OR_DISCARD_CHANGES\n                ComposeKind.EDIT_SCHEDULED -> ConfirmationKind.CONTINUE_EDITING_OR_DISCARD_CHANGES\n            }\n        } else {\n            ConfirmationKind.NONE\n        }\n    }\n\n    private fun didChange(content: String?, contentWarning: String?): Boolean {\n        val textChanged = content.orEmpty() != startingText.orEmpty()\n        val contentWarningChanged = contentWarning.orEmpty() != startingContentWarning\n        val mediaChanged = _media.value.isNotEmpty()\n        val pollChanged = _poll.value != null\n        val didScheduledTimeChange = hasScheduledTimeChanged\n\n        return modifiedInitialState || textChanged || contentWarningChanged || mediaChanged || pollChanged || didScheduledTimeChange\n    }\n\n    private fun isEmpty(content: String?, contentWarning: String?): Boolean {\n        return !modifiedInitialState && (content.isNullOrBlank() && contentWarning.isNullOrBlank() && _media.value.isEmpty() && _poll.value == null)\n    }\n\n    fun contentWarningChanged(value: Boolean) {\n        _showContentWarning.value = value\n        contentWarningStateChanged = true\n        updateCloseConfirmation()\n    }\n\n    fun deleteDraft() {\n        viewModelScope.launch {\n            if (draftId != 0) {\n                draftHelper.deleteDraftAndAttachments(draftId)\n            }\n        }\n    }\n\n    fun stopUploads() {\n        mediaUploader.cancelUploadScope(*_media.value.map { it.localId }.toIntArray())\n    }\n\n    suspend fun saveDraft(content: String, contentWarning: String) {\n        val mediaUris: MutableList<String> = mutableListOf()\n        val mediaDescriptions: MutableList<String?> = mutableListOf()\n        val mediaFocus: MutableList<Attachment.Focus?> = mutableListOf()\n        for (item in _media.value) {\n            mediaUris.add(item.uri.toString())\n            mediaDescriptions.add(item.description)\n            mediaFocus.add(item.focus)\n        }\n\n        draftHelper.saveDraft(\n            draftId = draftId,\n            accountId = accountManager.activeAccount?.id!!,\n            inReplyToId = inReplyToId,\n            content = content,\n            contentWarning = contentWarning,\n            sensitive = _markMediaAsSensitive.value,\n            visibility = _statusVisibility.value,\n            mediaUris = mediaUris,\n            mediaDescriptions = mediaDescriptions,\n            mediaFocus = mediaFocus,\n            poll = _poll.value,\n            failedToSend = false,\n            failedToSendAlert = false,\n            scheduledAt = _scheduledAt.value,\n            language = postLanguage,\n            statusId = originalStatusId\n        )\n    }\n\n    /**\n     * Send status to the server.\n     * Uses current state plus provided arguments.\n     */\n    suspend fun sendStatus(content: String, spoilerText: String, accountId: Long) {\n        if (!scheduledTootId.isNullOrEmpty()) {\n            api.deleteScheduledStatus(scheduledTootId!!)\n        }\n\n        val attachedMedia = _media.value.map { item ->\n            MediaToSend(\n                localId = item.localId,\n                id = item.id,\n                uri = item.uri.toString(),\n                description = item.description,\n                focus = item.focus,\n                processed = item.state == QueuedMedia.State.PROCESSED || item.state == QueuedMedia.State.PUBLISHED\n            )\n        }\n        val tootToSend = StatusToSend(\n            text = content,\n            warningText = spoilerText,\n            visibility = _statusVisibility.value.stringValue,\n            sensitive = attachedMedia.isNotEmpty() && (_markMediaAsSensitive.value || _showContentWarning.value),\n            media = attachedMedia,\n            scheduledAt = _scheduledAt.value,\n            inReplyToId = inReplyToId,\n            poll = _poll.value,\n            replyingStatusContent = null,\n            replyingStatusAuthorUsername = null,\n            accountId = accountId,\n            draftId = draftId,\n            idempotencyKey = randomAlphanumericString(16),\n            retries = 0,\n            language = postLanguage,\n            statusId = originalStatusId\n        )\n\n        serviceClient.sendToot(tootToSend)\n    }\n\n    private fun updateMediaItem(localId: Int, mutator: (QueuedMedia) -> QueuedMedia) {\n        _media.update { mediaList ->\n            mediaList.map { mediaItem ->\n                if (mediaItem.localId == localId) {\n                    mutator(mediaItem)\n                } else {\n                    mediaItem\n                }\n            }\n        }\n    }\n\n    fun updateDescription(localId: Int, description: String) {\n        updateMediaItem(localId) { mediaItem ->\n            mediaItem.copy(description = description)\n        }\n    }\n\n    fun updateFocus(localId: Int, focus: Attachment.Focus) {\n        updateMediaItem(localId) { mediaItem ->\n            mediaItem.copy(focus = focus)\n        }\n    }\n\n    fun searchAutocompleteSuggestions(token: String): List<AutocompleteResult> {\n        return when (token[0]) {\n            '@' -> runBlocking {\n                api.searchAccounts(query = token.substring(1), limit = 10)\n                    .fold({ accounts ->\n                        accounts.map { AutocompleteResult.AccountResult(it) }\n                    }, { e ->\n                        Log.e(TAG, \"Autocomplete search for $token failed.\", e)\n                        emptyList()\n                    })\n            }\n            '#' -> runBlocking {\n                api.search(\n                    query = token,\n                    type = SearchType.Hashtag.apiParameter,\n                    limit = 10\n                )\n                    .fold({ searchResult ->\n                        searchResult.hashtags.map { AutocompleteResult.HashtagResult(it.name) }\n                    }, { e ->\n                        Log.e(TAG, \"Autocomplete search for $token failed.\", e)\n                        emptyList()\n                    })\n            }\n\n            ':' -> {\n                val emojiList = emoji.replayCache.firstOrNull() ?: return emptyList()\n                val incomplete = token.substring(1)\n\n                emojiList.filter { emoji ->\n                    emoji.shortcode.contains(incomplete, ignoreCase = true)\n                }.sortedBy { emoji ->\n                    emoji.shortcode.indexOf(incomplete, ignoreCase = true)\n                }.map { emoji ->\n                    AutocompleteResult.EmojiResult(emoji)\n                }\n            }\n\n            else -> {\n                Log.w(TAG, \"Unexpected autocompletion token: $token\")\n                emptyList()\n            }\n        }\n    }\n\n    fun setup(composeOptions: ComposeActivity.ComposeOptions?) {\n        if (setupComplete) {\n            return\n        }\n\n        composeKind = composeOptions?.kind ?: ComposeKind.NEW\n        inReplyToId = composeOptions?.inReplyToId\n\n        val activeAccount = accountManager.activeAccount!!\n        val preferredVisibility = if (inReplyToId != null) {\n            activeAccount.defaultReplyPrivacy.toVisibilityOr(activeAccount.defaultPostPrivacy)\n        } else {\n            activeAccount.defaultPostPrivacy\n        }\n\n        val replyVisibility = composeOptions?.replyVisibility ?: Status.Visibility.UNKNOWN\n        startingVisibility = Status.Visibility.fromInt(\n            preferredVisibility.int.coerceAtLeast(replyVisibility.int)\n        )\n\n        modifiedInitialState = composeOptions?.modifiedInitialState == true\n\n        val contentWarning = composeOptions?.contentWarning\n        if (contentWarning != null) {\n            startingContentWarning = contentWarning\n        }\n        if (!contentWarningStateChanged) {\n            _showContentWarning.value = !contentWarning.isNullOrBlank()\n        }\n\n        // recreate media list\n        val draftAttachments = composeOptions?.draftAttachments\n        if (draftAttachments != null) {\n            // when coming from DraftActivity\n            draftAttachments.map { attachment ->\n                MediaData(attachment.uri, attachment.description, attachment.focus)\n            }.let(::pickMedia)\n        } else {\n            composeOptions?.mediaAttachments?.forEach { a ->\n                // when coming from redraft or ScheduledTootActivity\n                val mediaType = when (a.type) {\n                    Attachment.Type.VIDEO, Attachment.Type.GIFV -> QueuedMedia.Type.VIDEO\n                    Attachment.Type.UNKNOWN, Attachment.Type.IMAGE -> QueuedMedia.Type.IMAGE\n                    Attachment.Type.AUDIO -> QueuedMedia.Type.AUDIO\n                }\n                addUploadedMedia(a.id, mediaType, a.url.toUri(), a.description, a.meta?.focus)\n            }\n        }\n\n        draftId = composeOptions?.draftId ?: 0\n        scheduledTootId = composeOptions?.scheduledTootId\n        originalStatusId = composeOptions?.statusId\n        startingText = composeOptions?.content\n        currentContent = composeOptions?.content\n        postLanguage = composeOptions?.language\n\n        val tootVisibility = composeOptions?.visibility ?: Status.Visibility.UNKNOWN\n        if (tootVisibility.int != Status.Visibility.UNKNOWN.int) {\n            startingVisibility = tootVisibility\n        }\n        _statusVisibility.value = startingVisibility\n        val mentionedUsernames = composeOptions?.mentionedUsernames\n        if (mentionedUsernames != null) {\n            val builder = StringBuilder()\n            for (name in mentionedUsernames) {\n                builder.append('@')\n                builder.append(name)\n                builder.append(' ')\n            }\n            startingText = builder.toString()\n        }\n\n        _scheduledAt.value = composeOptions?.scheduledAt\n\n        composeOptions?.sensitive?.let { _markMediaAsSensitive.value = it }\n\n        val poll = composeOptions?.poll\n        if (poll != null && composeOptions.mediaAttachments.isNullOrEmpty()) {\n            this._poll.value = poll\n        }\n        replyingStatusContent = composeOptions?.replyingStatusContent\n        replyingStatusAuthor = composeOptions?.replyingStatusAuthor\n\n        updateCloseConfirmation()\n\n        setupComplete = true\n    }\n\n    fun updatePoll(newPoll: NewPoll?) {\n        _poll.value = newPoll\n        updateCloseConfirmation()\n    }\n\n    fun updateScheduledAt(newScheduledAt: String?) {\n        if (newScheduledAt != _scheduledAt.value) {\n            hasScheduledTimeChanged = true\n        }\n\n        _scheduledAt.value = newScheduledAt\n    }\n\n    val editing: Boolean\n        get() = !originalStatusId.isNullOrEmpty()\n\n    private companion object {\n        const val TAG = \"ComposeViewModel\"\n    }\n\n    enum class ConfirmationKind {\n        NONE, // just close\n        SAVE_OR_DISCARD,\n        UPDATE_OR_DISCARD,\n        CONTINUE_EDITING_OR_DISCARD_CHANGES, // editing post\n        CONTINUE_EDITING_OR_DISCARD_DRAFT // edit draft\n    }\n\n    data class QueuedMedia(\n        val localId: Int,\n        val uri: Uri,\n        val type: Type,\n        val mediaSize: Long,\n        val uploadPercent: Int = 0,\n        val id: String? = null,\n        val description: String? = null,\n        val focus: Attachment.Focus? = null,\n        val state: State\n    ) {\n        enum class Type {\n            IMAGE,\n            VIDEO,\n            AUDIO\n        }\n        enum class State {\n            UPLOADING,\n            UNPROCESSED,\n            PROCESSED,\n            PUBLISHED\n        }\n    }\n\n    data class MediaData(\n        val uri: Uri,\n        val description: String? = null,\n        val focus: Attachment.Focus? = null\n    )\n}\n\n/**\n * Thrown when trying to add an image when video is already present or the other way around\n */\nclass VideoOrImageException : Exception()\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/compose/ImageDownsizer.kt",
    "content": "/* Copyright 2022 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.compose\n\nimport android.content.ContentResolver\nimport android.graphics.Bitmap\nimport android.graphics.Bitmap.CompressFormat\nimport android.graphics.BitmapFactory\nimport android.net.Uri\nimport com.keylesspalace.tusky.util.calculateInSampleSize\nimport com.keylesspalace.tusky.util.closeQuietly\nimport com.keylesspalace.tusky.util.getImageOrientation\nimport com.keylesspalace.tusky.util.reorientBitmap\nimport java.io.File\nimport java.io.FileNotFoundException\nimport java.io.FileOutputStream\n\n/**\n * @param uri             the uri pointing to the input file\n * @param sizeLimit       the maximum number of bytes the output image is allowed to have\n * @param contentResolver to resolve the specified input uri\n * @param tempFile        the file where the result will be stored\n * @return true when the image was successfully resized, false otherwise\n */\nfun downsizeImage(\n    uri: Uri,\n    sizeLimit: Int,\n    contentResolver: ContentResolver,\n    tempFile: File\n): Boolean {\n    val decodeBoundsInputStream = try {\n        contentResolver.openInputStream(uri) ?: return false\n    } catch (e: FileNotFoundException) {\n        return false\n    }\n    // Initially, just get the image dimensions.\n    val options = BitmapFactory.Options()\n    options.inJustDecodeBounds = true\n    BitmapFactory.decodeStream(decodeBoundsInputStream, null, options)\n    decodeBoundsInputStream.closeQuietly()\n    // Get EXIF data, for orientation info.\n    val orientation = getImageOrientation(uri, contentResolver)\n    /* Unfortunately, there isn't a determined worst case compression ratio for image\n     * formats. So, the only way to tell if they're too big is to compress them and\n     * test, and keep trying at smaller sizes. The initial estimate should be good for\n     * many cases, so it should only iterate once, but the loop is used to be absolutely\n     * sure it gets downsized to below the limit. */\n    var scaledImageSize = 1024\n    do {\n        val outputStream = try {\n            FileOutputStream(tempFile)\n        } catch (e: FileNotFoundException) {\n            return false\n        }\n        val decodeBitmapInputStream = try {\n            contentResolver.openInputStream(uri) ?: return false\n        } catch (e: FileNotFoundException) {\n            return false\n        }\n        options.inSampleSize = calculateInSampleSize(options, scaledImageSize, scaledImageSize)\n        options.inJustDecodeBounds = false\n        val scaledBitmap: Bitmap = try {\n            BitmapFactory.decodeStream(decodeBitmapInputStream, null, options)\n        } catch (error: OutOfMemoryError) {\n            return false\n        } finally {\n            decodeBitmapInputStream.closeQuietly()\n        } ?: return false\n\n        val reorientedBitmap = reorientBitmap(scaledBitmap, orientation)\n        if (reorientedBitmap == null) {\n            scaledBitmap.recycle()\n            return false\n        }\n        /* Retain transparency if there is any by encoding as png */\n        val format: CompressFormat = if (!reorientedBitmap.hasAlpha()) {\n            CompressFormat.JPEG\n        } else {\n            CompressFormat.PNG\n        }\n        reorientedBitmap.compress(format, 85, outputStream)\n        reorientedBitmap.recycle()\n        scaledImageSize /= 2\n    } while (tempFile.length() > sizeLimit)\n\n    return true\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/compose/MediaPreviewAdapter.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.compose\n\nimport android.content.Context\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.ImageView\nimport android.widget.PopupMenu\nimport androidx.constraintlayout.widget.ConstraintLayout\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.load.engine.DiskCacheStrategy\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.compose.view.ProgressImageView\n\nclass MediaPreviewAdapter(\n    context: Context,\n    private val onAddCaption: (ComposeViewModel.QueuedMedia) -> Unit,\n    private val onAddFocus: (ComposeViewModel.QueuedMedia) -> Unit,\n    private val onEditImage: (ComposeViewModel.QueuedMedia) -> Unit,\n    private val onRemove: (ComposeViewModel.QueuedMedia) -> Unit\n) : ListAdapter<ComposeViewModel.QueuedMedia, MediaPreviewAdapter.PreviewViewHolder>(\n    object : DiffUtil.ItemCallback<ComposeViewModel.QueuedMedia>() {\n        override fun areItemsTheSame(\n            oldItem: ComposeViewModel.QueuedMedia,\n            newItem: ComposeViewModel.QueuedMedia\n        ) = oldItem.localId == newItem.localId\n\n        override fun areContentsTheSame(\n            oldItem: ComposeViewModel.QueuedMedia,\n            newItem: ComposeViewModel.QueuedMedia\n        ) = oldItem == newItem\n    }\n) {\n\n    private fun onMediaClick(item: ComposeViewModel.QueuedMedia, view: View) {\n        val popup = PopupMenu(view.context, view)\n        val addCaptionId = 1\n        val addFocusId = 2\n        val editImageId = 3\n        val removeId = 4\n\n        popup.menu.add(0, addCaptionId, 0, R.string.action_set_caption)\n        if (item.type == ComposeViewModel.QueuedMedia.Type.IMAGE) {\n            popup.menu.add(0, addFocusId, 0, R.string.action_set_focus)\n            if (item.state != ComposeViewModel.QueuedMedia.State.PUBLISHED) {\n                // Already-published items can't be edited\n                popup.menu.add(0, editImageId, 0, R.string.action_edit_image)\n            }\n        }\n        popup.menu.add(0, removeId, 0, R.string.action_remove)\n        popup.setOnMenuItemClickListener { menuItem ->\n            when (menuItem.itemId) {\n                addCaptionId -> onAddCaption(item)\n                addFocusId -> onAddFocus(item)\n                editImageId -> onEditImage(item)\n                removeId -> onRemove(item)\n            }\n            true\n        }\n        popup.show()\n    }\n\n    private val thumbnailViewSize =\n        context.resources.getDimensionPixelSize(R.dimen.compose_media_preview_size)\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PreviewViewHolder {\n        return PreviewViewHolder(ProgressImageView(parent.context))\n    }\n\n    override fun onBindViewHolder(holder: PreviewViewHolder, position: Int) {\n        val item = getItem(position)\n        holder.progressImageView.setChecked(!item.description.isNullOrEmpty())\n        holder.progressImageView.setProgress(item.uploadPercent)\n        if (item.type == ComposeViewModel.QueuedMedia.Type.AUDIO) {\n            // TODO: Fancy waveform display?\n            holder.progressImageView.setImageResource(R.drawable.audio_file_preview)\n        } else {\n            val imageView = holder.progressImageView\n            val focus = item.focus\n\n            if (focus != null) {\n                imageView.setFocalPoint(focus)\n            } else {\n                imageView.removeFocalPoint() // Probably unnecessary since we have no UI for removal once added.\n            }\n\n            var glide = Glide.with(holder.itemView.context)\n                .load(item.uri)\n                .diskCacheStrategy(DiskCacheStrategy.NONE)\n                .dontAnimate()\n                .centerInside()\n\n            if (focus != null) {\n                glide = glide.addListener(imageView)\n            }\n\n            glide.into(imageView)\n        }\n\n        holder.progressImageView.setOnClickListener {\n            onMediaClick(item, holder.progressImageView)\n        }\n    }\n\n    inner class PreviewViewHolder(val progressImageView: ProgressImageView) :\n        RecyclerView.ViewHolder(progressImageView) {\n        init {\n            val layoutParams = ConstraintLayout.LayoutParams(thumbnailViewSize, thumbnailViewSize)\n            val margin = itemView.context.resources\n                .getDimensionPixelSize(R.dimen.compose_media_preview_margin)\n            val marginBottom = itemView.context.resources\n                .getDimensionPixelSize(R.dimen.compose_media_preview_margin_bottom)\n            layoutParams.setMargins(margin, 0, margin, marginBottom)\n            progressImageView.layoutParams = layoutParams\n            progressImageView.scaleType = ImageView.ScaleType.CENTER_CROP\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/compose/MediaUploader.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.compose\n\nimport android.content.ContentResolver\nimport android.content.Context\nimport android.media.MediaMetadataRetriever\nimport android.media.MediaMetadataRetriever.METADATA_KEY_MIMETYPE\nimport android.net.Uri\nimport android.os.Environment\nimport android.util.Log\nimport android.webkit.MimeTypeMap\nimport androidx.core.content.FileProvider\nimport androidx.core.net.toUri\nimport com.keylesspalace.tusky.BuildConfig\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.compose.ComposeViewModel.QueuedMedia\nimport com.keylesspalace.tusky.components.instanceinfo.InstanceInfo\nimport com.keylesspalace.tusky.network.MediaUploadApi\nimport com.keylesspalace.tusky.network.asRequestBody\nimport com.keylesspalace.tusky.util.MEDIA_SIZE_UNKNOWN\nimport com.keylesspalace.tusky.util.getImageSquarePixels\nimport com.keylesspalace.tusky.util.getMediaSize\nimport com.keylesspalace.tusky.util.getServerErrorMessage\nimport com.keylesspalace.tusky.util.randomAlphanumericString\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport java.io.File\nimport java.io.IOException\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.channels.awaitClose\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.callbackFlow\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.filterIsInstance\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.shareIn\nimport okhttp3.MediaType.Companion.toMediaTypeOrNull\nimport okhttp3.MultipartBody\nimport okio.buffer\nimport okio.sink\nimport okio.source\nimport retrofit2.HttpException\n\nsealed interface FinalUploadEvent\n\nsealed interface UploadEvent {\n    data class ProgressEvent(val percentage: Int) : UploadEvent\n    data class FinishedEvent(\n        val mediaId: String,\n        val processed: Boolean\n    ) : UploadEvent, FinalUploadEvent\n    data class ErrorEvent(val error: Throwable) : UploadEvent, FinalUploadEvent\n}\n\ndata class UploadData(\n    val flow: Flow<UploadEvent>,\n    val scope: CoroutineScope\n)\n\nfun createNewImageFile(context: Context, suffix: String = \".jpg\"): File {\n    // Create an image file name\n    val randomId = randomAlphanumericString(12)\n    val imageFileName = \"Tusky_${randomId}_\"\n    val storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)\n    return File.createTempFile(imageFileName, suffix, storageDir)\n}\n\ndata class PreparedMedia(val type: QueuedMedia.Type, val uri: Uri, val size: Long)\n\nclass FileSizeException(val allowedSizeInBytes: Int) : Exception()\nclass MediaTypeException : Exception()\nclass CouldNotOpenFileException : Exception()\nclass UploadServerError(val errorMessage: String) : Exception()\n\nclass MediaUploader @Inject constructor(\n    @ApplicationContext private val context: Context,\n    private val mediaUploadApi: MediaUploadApi\n) {\n\n    private companion object {\n        private const val TAG = \"MediaUploader\"\n        private val uploads = mutableMapOf<Int, UploadData>()\n        private var mostRecentId: Int = 0\n    }\n\n    fun getNewLocalMediaId(): Int {\n        return mostRecentId++\n    }\n\n    suspend fun getMediaUploadState(localId: Int): FinalUploadEvent {\n        return uploads[localId]?.flow\n            ?.filterIsInstance<FinalUploadEvent>()\n            ?.first()\n            ?: UploadEvent.ErrorEvent(IllegalStateException(\"media upload with id $localId not found\"))\n    }\n\n    /**\n     * Uploads media.\n     * @param media the media to upload\n     * @param instanceInfo info about the current media to make sure the media gets resized correctly\n     * @return A Flow emitting upload events.\n     * The Flow is hot, in order to cancel upload or clear resources call [cancelUploadScope].\n     */\n    @OptIn(ExperimentalCoroutinesApi::class)\n    fun uploadMedia(media: QueuedMedia, instanceInfo: InstanceInfo): Flow<UploadEvent> {\n        val uploadScope = CoroutineScope(Dispatchers.IO)\n        val uploadFlow = flow {\n            if (shouldResizeMedia(media, instanceInfo)) {\n                emit(downsize(media, instanceInfo))\n            } else {\n                emit(media)\n            }\n        }\n            .flatMapLatest { upload(it) }\n            .catch { exception ->\n                emit(UploadEvent.ErrorEvent(exception))\n            }\n            .shareIn(uploadScope, SharingStarted.Lazily, 1)\n\n        uploads[media.localId] = UploadData(uploadFlow, uploadScope)\n        return uploadFlow\n    }\n\n    /**\n     * Cancels the CoroutineScope of a media upload.\n     * Call this when to abort the upload or to clean up resources after upload info is no longer needed\n     */\n    fun cancelUploadScope(vararg localMediaIds: Int) {\n        localMediaIds.forEach { localId ->\n            uploads.remove(localId)?.scope?.cancel()\n        }\n    }\n\n    fun prepareMedia(inUri: Uri, instanceInfo: InstanceInfo): Result<PreparedMedia> = runCatching {\n        var mediaSize = MEDIA_SIZE_UNKNOWN\n        var uri = inUri\n        val mimeType: String?\n\n        try {\n            when (inUri.scheme) {\n                ContentResolver.SCHEME_CONTENT -> {\n                    mimeType = contentResolver.getType(uri)\n\n                    val suffix = \".\" + MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType ?: \"tmp\")\n\n                    contentResolver.openInputStream(inUri)?.source().use { input ->\n                        if (input == null) {\n                            Log.w(TAG, \"Media input is null\")\n                            uri = inUri\n                            return@use\n                        }\n                        val file = File.createTempFile(\"randomTemp1\", suffix, context.cacheDir)\n                        file.absoluteFile.sink().buffer().use { out ->\n                            out.writeAll(input)\n                        }\n                        uri = FileProvider.getUriForFile(\n                            context,\n                            BuildConfig.APPLICATION_ID + \".fileprovider\",\n                            file\n                        )\n                        mediaSize = getMediaSize(contentResolver, uri)\n                    }\n                }\n                ContentResolver.SCHEME_FILE -> {\n                    val path = uri.path\n                    if (path == null) {\n                        Log.w(TAG, \"empty uri path $uri\")\n                        throw CouldNotOpenFileException()\n                    }\n                    val inputFile = File(path)\n                    val suffix = inputFile.name.substringAfterLast('.', \"tmp\")\n                    mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(suffix)\n                    val file = File.createTempFile(\"randomTemp1\", \".$suffix\", context.cacheDir)\n\n                    inputFile.source().use { input ->\n                        file.absoluteFile.sink().buffer().use { out ->\n                            out.writeAll(input)\n                        }\n                    }\n                    uri = FileProvider.getUriForFile(\n                        context,\n                        BuildConfig.APPLICATION_ID + \".fileprovider\",\n                        file\n                    )\n                    mediaSize = getMediaSize(contentResolver, uri)\n                }\n                else -> {\n                    Log.w(TAG, \"Unknown uri scheme $uri\")\n                    throw CouldNotOpenFileException()\n                }\n            }\n        } catch (e: IOException) {\n            Log.w(TAG, e)\n            throw CouldNotOpenFileException()\n        }\n        if (mediaSize == MEDIA_SIZE_UNKNOWN) {\n            Log.w(TAG, \"Could not determine file size of upload\")\n            throw MediaTypeException()\n        }\n        if (mimeType != null) {\n            when (mimeType.substring(0, mimeType.indexOf('/'))) {\n                \"video\" -> {\n                    if (mediaSize > instanceInfo.videoSizeLimit) {\n                        throw FileSizeException(instanceInfo.videoSizeLimit)\n                    }\n                    PreparedMedia(QueuedMedia.Type.VIDEO, uri, mediaSize)\n                }\n                \"image\" -> {\n                    PreparedMedia(QueuedMedia.Type.IMAGE, uri, mediaSize)\n                }\n                \"audio\" -> {\n                    if (mediaSize > instanceInfo.videoSizeLimit) {\n                        throw FileSizeException(instanceInfo.videoSizeLimit)\n                    }\n                    PreparedMedia(QueuedMedia.Type.AUDIO, uri, mediaSize)\n                }\n                else -> {\n                    throw MediaTypeException()\n                }\n            }\n        } else {\n            Log.w(TAG, \"Could not determine mime type of upload\")\n            throw MediaTypeException()\n        }\n    }\n\n    private val contentResolver = context.contentResolver\n\n    private fun upload(media: QueuedMedia): Flow<UploadEvent> {\n        return callbackFlow {\n            var mimeType = contentResolver.getType(media.uri)\n\n            // Android's MIME type suggestions from file extensions is broken for at least\n            // .m4a files. See https://github.com/tuskyapp/Tusky/issues/3189 for details.\n            // Sniff the content of the file to determine the actual type.\n            if (mimeType != null && (\n                    mimeType.startsWith(\"audio/\", ignoreCase = true) ||\n                        mimeType.startsWith(\"video/\", ignoreCase = true)\n                    )\n            ) {\n                val retriever = MediaMetadataRetriever()\n                retriever.setDataSource(context, media.uri)\n                mimeType = retriever.extractMetadata(METADATA_KEY_MIMETYPE)\n            }\n            val map = MimeTypeMap.getSingleton()\n            val fileExtension = map.getExtensionFromMimeType(mimeType)\n            val filename =\n                \"${context.getString(R.string.app_name)}_${System.currentTimeMillis()}_${randomAlphanumericString(10)}.$fileExtension\"\n\n            if (mimeType == null) mimeType = \"multipart/form-data\"\n\n            var lastProgress = -1\n            val fileBody = media.uri.asRequestBody(\n                contentResolver,\n                requireNotNull(mimeType.toMediaTypeOrNull()) { \"Invalid Content Type\" },\n                media.mediaSize\n            ) { percentage ->\n                if (percentage != lastProgress) {\n                    trySend(UploadEvent.ProgressEvent(percentage))\n                }\n                lastProgress = percentage\n            }\n\n            val body = MultipartBody.Part.createFormData(\"file\", filename, fileBody)\n\n            val description = if (media.description != null) {\n                MultipartBody.Part.createFormData(\"description\", media.description)\n            } else {\n                null\n            }\n\n            val focus = if (media.focus != null) {\n                MultipartBody.Part.createFormData(\"focus\", \"${media.focus.x},${media.focus.y}\")\n            } else {\n                null\n            }\n\n            val uploadResponse = mediaUploadApi.uploadMedia(body, description, focus)\n            val responseBody = uploadResponse.body()\n            if (uploadResponse.isSuccessful && responseBody != null) {\n                send(UploadEvent.FinishedEvent(responseBody.id, uploadResponse.code() == 200))\n            } else {\n                val error = HttpException(uploadResponse)\n                val errorMessage = error.getServerErrorMessage()\n                if (errorMessage == null) {\n                    throw error\n                } else {\n                    throw UploadServerError(errorMessage)\n                }\n            }\n\n            awaitClose()\n        }\n    }\n\n    private fun downsize(media: QueuedMedia, instanceInfo: InstanceInfo): QueuedMedia {\n        val file = createNewImageFile(context)\n        downsizeImage(media.uri, instanceInfo.imageSizeLimit, contentResolver, file)\n        return media.copy(uri = file.toUri(), mediaSize = file.length())\n    }\n\n    private fun shouldResizeMedia(media: QueuedMedia, instanceInfo: InstanceInfo): Boolean {\n        return media.type == QueuedMedia.Type.IMAGE &&\n            (media.mediaSize > instanceInfo.imageSizeLimit || getImageSquarePixels(context.contentResolver, media.uri) > instanceInfo.imageMatrixLimit)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/compose/dialog/AddPollDialog.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\n@file:JvmName(\"AddPollDialog\")\n\npackage com.keylesspalace.tusky.components.compose.dialog\n\nimport android.content.Context\nimport android.view.LayoutInflater\nimport android.view.WindowManager\nimport androidx.appcompat.app.AlertDialog\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.android.material.textfield.TextInputEditText\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.DialogAddPollBinding\nimport com.keylesspalace.tusky.entity.NewPoll\n\nfun showAddPollDialog(\n    context: Context,\n    poll: NewPoll?,\n    maxOptionCount: Int,\n    maxOptionLength: Int,\n    minDuration: Int,\n    maxDuration: Int,\n    onUpdatePoll: (NewPoll) -> Unit\n) {\n    val binding = DialogAddPollBinding.inflate(LayoutInflater.from(context))\n\n    val inset = context.resources.getDimensionPixelSize(R.dimen.dialog_inset)\n\n    val dialog = MaterialAlertDialogBuilder(context)\n        .setIcon(R.drawable.ic_insert_chart_24dp_filled)\n        .setTitle(R.string.create_poll_title)\n        .setView(binding.root)\n        .setBackgroundInsetTop(inset)\n        .setBackgroundInsetEnd(inset)\n        .setBackgroundInsetBottom(inset)\n        .setBackgroundInsetStart(inset)\n        .setNegativeButton(android.R.string.cancel, null)\n        .setPositiveButton(android.R.string.ok, null)\n        .create()\n\n    val adapter = AddPollOptionsAdapter(\n        options = poll?.options?.toMutableList() ?: mutableListOf(\"\", \"\"),\n        maxOptionLength = maxOptionLength,\n        onOptionRemoved = { valid ->\n            binding.addChoiceButton.isEnabled = true\n            dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = valid\n        },\n        onOptionChanged = { valid ->\n            dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = valid\n        }\n    )\n\n    binding.pollChoices.adapter = adapter\n\n    var durations = context.resources.getIntArray(R.array.poll_duration_values).toList()\n    val durationLabels = context.resources.getStringArray(\n        R.array.poll_duration_names\n    ).filterIndexed { index, _ -> durations[index] in minDuration..maxDuration }\n\n    binding.pollDurationDropDown.setSimpleItems(durationLabels.toTypedArray())\n    durations = durations.filter { it in minDuration..maxDuration }\n\n    binding.addChoiceButton.setOnClickListener {\n        if (adapter.itemCount < maxOptionCount) {\n            adapter.addChoice()\n        }\n        if (adapter.itemCount >= maxOptionCount) {\n            it.isEnabled = false\n        }\n    }\n\n    val secondsInADay = 60 * 60 * 24\n    val desiredDuration = poll?.expiresIn ?: secondsInADay\n    var selectedDurationIndex = durations.indexOfLast {\n        it <= desiredDuration\n    }\n\n    binding.pollDurationDropDown.setText(durationLabels[selectedDurationIndex], false)\n    binding.pollDurationDropDown.setOnItemClickListener { _, _, position, _ ->\n        selectedDurationIndex = position\n    }\n\n    binding.multipleChoicesCheckBox.isChecked = poll?.multiple == true\n\n    dialog.setOnShowListener {\n        val button = dialog.getButton(AlertDialog.BUTTON_POSITIVE)\n        button.setOnClickListener {\n            onUpdatePoll(\n                NewPoll(\n                    options = adapter.pollOptions,\n                    expiresIn = durations[selectedDurationIndex],\n                    multiple = binding.multipleChoicesCheckBox.isChecked\n                )\n            )\n\n            dialog.dismiss()\n        }\n    }\n\n    dialog.show()\n\n    // yes, SOFT_INPUT_ADJUST_RESIZE is deprecated, but without it the dropdown can get behind the keyboard\n    dialog.window?.setSoftInputMode(\n        WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE or WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE\n    )\n\n    binding.pollChoices.post {\n        val firstItemView = binding.pollChoices.layoutManager?.findViewByPosition(0)\n        val editText = firstItemView?.findViewById<TextInputEditText>(R.id.optionEditText)\n        editText?.requestFocus()\n        editText?.setSelection(editText.length())\n    }\n\n    // make the dialog focusable so the keyboard does not stay behind it\n    dialog.window?.clearFlags(\n        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM\n    )\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/compose/dialog/AddPollOptionsAdapter.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.compose.dialog\n\nimport android.text.InputFilter\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.widget.doOnTextChanged\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemAddPollOptionBinding\nimport com.keylesspalace.tusky.util.BindingHolder\nimport com.keylesspalace.tusky.util.visible\n\nclass AddPollOptionsAdapter(\n    private var options: MutableList<String>,\n    private val maxOptionLength: Int,\n    private val onOptionRemoved: (Boolean) -> Unit,\n    private val onOptionChanged: (Boolean) -> Unit\n) : RecyclerView.Adapter<BindingHolder<ItemAddPollOptionBinding>>() {\n\n    val pollOptions: List<String>\n        get() = options.toList()\n\n    fun addChoice() {\n        options.add(\"\")\n        notifyItemInserted(options.size - 1)\n    }\n\n    override fun onCreateViewHolder(\n        parent: ViewGroup,\n        viewType: Int\n    ): BindingHolder<ItemAddPollOptionBinding> {\n        val binding = ItemAddPollOptionBinding.inflate(\n            LayoutInflater.from(parent.context),\n            parent,\n            false\n        )\n        val holder = BindingHolder(binding)\n        binding.optionEditText.filters = arrayOf(InputFilter.LengthFilter(maxOptionLength))\n\n        binding.optionEditText.doOnTextChanged { s, _, _, _ ->\n            val pos = holder.bindingAdapterPosition\n            if (pos != RecyclerView.NO_POSITION) {\n                options[pos] = s.toString()\n                onOptionChanged(validateInput())\n            }\n        }\n\n        return holder\n    }\n\n    override fun getItemCount() = options.size\n\n    override fun onBindViewHolder(holder: BindingHolder<ItemAddPollOptionBinding>, position: Int) {\n        holder.binding.optionEditText.setText(options[position])\n\n        holder.binding.optionTextInputLayout.hint = holder.binding.root.context.getString(R.string.poll_new_choice_hint, position + 1)\n\n        holder.binding.deleteButton.visible(position > 1, View.INVISIBLE)\n\n        holder.binding.deleteButton.setOnClickListener {\n            holder.binding.optionEditText.clearFocus()\n            options.removeAt(holder.bindingAdapterPosition)\n            notifyItemRemoved(holder.bindingAdapterPosition)\n            onOptionRemoved(validateInput())\n        }\n    }\n\n    private fun validateInput(): Boolean {\n        return !(options.contains(\"\") || options.distinct().size != options.size)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/compose/dialog/CaptionDialog.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.compose.dialog\n\nimport android.app.Dialog\nimport android.content.Context\nimport android.graphics.drawable.Animatable\nimport android.graphics.drawable.Drawable\nimport android.net.Uri\nimport android.os.Bundle\nimport android.text.InputFilter\nimport android.view.View\nimport android.view.WindowManager\nimport android.widget.LinearLayout\nimport androidx.appcompat.app.AlertDialog\nimport androidx.core.os.bundleOf\nimport androidx.fragment.app.DialogFragment\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.load.resource.bitmap.DownsampleStrategy\nimport com.bumptech.glide.request.target.CustomTarget\nimport com.bumptech.glide.request.transition.Transition\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.DialogImageDescriptionBinding\nimport com.keylesspalace.tusky.util.getParcelableCompat\nimport com.keylesspalace.tusky.util.hide\n\n// https://github.com/tootsuite/mastodon/blob/c6904c0d3766a2ea8a81ab025c127169ecb51373/app/models/media_attachment.rb#L32\nprivate const val MEDIA_DESCRIPTION_CHARACTER_LIMIT = 1500\n\nclass CaptionDialog : DialogFragment() {\n    private lateinit var listener: Listener\n\n    private lateinit var binding: DialogImageDescriptionBinding\n\n    private var animatable: Animatable? = null\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val localId = arguments?.getInt(LOCAL_ID_ARG) ?: error(\"Missing localId\")\n        val inset = requireContext().resources.getDimensionPixelSize(R.dimen.dialog_inset)\n        return MaterialAlertDialogBuilder(requireContext())\n            .setView(createView(savedInstanceState))\n            .setBackgroundInsetTop(inset)\n            .setBackgroundInsetEnd(inset)\n            .setBackgroundInsetBottom(inset)\n            .setBackgroundInsetStart(inset)\n            .setPositiveButton(android.R.string.ok) { _, _ ->\n                listener.onUpdateDescription(localId, binding.imageDescriptionText.text.toString())\n            }\n            .setNegativeButton(android.R.string.cancel, null)\n            .create()\n    }\n\n    private fun createView(savedInstanceState: Bundle?): View {\n        binding = DialogImageDescriptionBinding.inflate(layoutInflater)\n        val imageView = binding.imageDescriptionView\n        imageView.maxZoom = 6f\n        val imageDescriptionText = binding.imageDescriptionText\n        imageDescriptionText.post {\n            imageDescriptionText.requestFocus()\n            imageDescriptionText.setSelection(imageDescriptionText.length())\n        }\n\n        binding.imageDescriptionText.hint = resources.getQuantityString(\n            R.plurals.hint_describe_for_visually_impaired,\n            MEDIA_DESCRIPTION_CHARACTER_LIMIT,\n            MEDIA_DESCRIPTION_CHARACTER_LIMIT\n        )\n        binding.imageDescriptionText.filters = arrayOf(InputFilter.LengthFilter(MEDIA_DESCRIPTION_CHARACTER_LIMIT))\n        binding.imageDescriptionText.setText(arguments?.getString(EXISTING_DESCRIPTION_ARG))\n        savedInstanceState?.getCharSequence(DESCRIPTION_KEY)?.let {\n            binding.imageDescriptionText.setText(it)\n        }\n\n        isCancelable = false\n        dialog?.setCanceledOnTouchOutside(false) // Dialog is full screen anyway. But without this, taps in navbar while keyboard is up can dismiss the dialog.\n\n        val previewUri = arguments?.getParcelableCompat<Uri>(PREVIEW_URI_ARG) ?: error(\"Preview Uri is null\")\n\n        // Load the image and manually set it into the ImageView because it doesn't have a fixed size.\n        Glide.with(this)\n            .load(previewUri)\n            .downsample(DownsampleStrategy.CENTER_INSIDE)\n            .into(object : CustomTarget<Drawable>(4096, 4096) {\n                override fun onLoadCleared(placeholder: Drawable?) {\n                    imageView.setImageDrawable(placeholder)\n                }\n\n                override fun onResourceReady(\n                    resource: Drawable,\n                    transition: Transition<in Drawable>?\n                ) {\n                    if (resource is Animatable) {\n                        resource.callback = object : Drawable.Callback {\n                            override fun invalidateDrawable(who: Drawable) {\n                                imageView.invalidate()\n                            }\n\n                            override fun scheduleDrawable(who: Drawable, what: Runnable, `when`: Long) {\n                                imageView.postDelayed(what, `when`)\n                            }\n\n                            override fun unscheduleDrawable(who: Drawable, what: Runnable) {\n                                imageView.removeCallbacks(what)\n                            }\n                        }\n                        resource.start()\n                        animatable = resource\n                    }\n                    imageView.setImageDrawable(resource)\n                }\n\n                override fun onLoadFailed(errorDrawable: Drawable?) {\n                    super.onLoadFailed(errorDrawable)\n                    imageView.hide()\n                }\n            })\n        return binding.root\n    }\n\n    override fun onStart() {\n        super.onStart()\n        dialog?.apply {\n            window?.setLayout(\n                LinearLayout.LayoutParams.MATCH_PARENT,\n                LinearLayout.LayoutParams.WRAP_CONTENT\n            )\n            window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)\n        }\n        (dialog as AlertDialog?)?.getButton(AlertDialog.BUTTON_NEGATIVE)?.setOnClickListener {\n            if (arguments?.getString(EXISTING_DESCRIPTION_ARG).orEmpty() != binding.imageDescriptionText.text.toString()) {\n                MaterialAlertDialogBuilder(requireContext())\n                    .setMessage(R.string.confirm_dismiss_caption)\n                    .setPositiveButton(R.string.yes) { _, _ ->\n                        dialog?.dismiss()\n                    }\n                    .setNegativeButton(R.string.no, null)\n                    .show()\n            } else {\n                dialog?.dismiss()\n            }\n        }\n    }\n\n    override fun onSaveInstanceState(outState: Bundle) {\n        outState.putCharSequence(DESCRIPTION_KEY, binding.imageDescriptionText.text)\n        super.onSaveInstanceState(outState)\n    }\n\n    override fun onAttach(context: Context) {\n        super.onAttach(context)\n        listener = context as? Listener ?: error(\"Activity is not ComposeCaptionDialog.Listener\")\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        animatable?.stop()\n        (animatable as? Drawable?)?.callback = null\n    }\n\n    interface Listener {\n        fun onUpdateDescription(localId: Int, description: String)\n    }\n\n    companion object {\n        fun newInstance(localId: Int, existingDescription: String?, previewUri: Uri) =\n            CaptionDialog().apply {\n                arguments = bundleOf(\n                    LOCAL_ID_ARG to localId,\n                    EXISTING_DESCRIPTION_ARG to existingDescription,\n                    PREVIEW_URI_ARG to previewUri\n                )\n            }\n\n        private const val DESCRIPTION_KEY = \"description\"\n        private const val EXISTING_DESCRIPTION_ARG = \"existing_description\"\n        private const val PREVIEW_URI_ARG = \"preview_uri\"\n        private const val LOCAL_ID_ARG = \"local_id\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/compose/dialog/FocusDialog.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.compose.dialog\n\nimport android.content.DialogInterface\nimport android.graphics.drawable.Drawable\nimport android.net.Uri\nimport android.view.WindowManager\nimport android.widget.FrameLayout\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.lifecycleScope\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.load.DataSource\nimport com.bumptech.glide.load.engine.GlideException\nimport com.bumptech.glide.load.resource.bitmap.DownsampleStrategy\nimport com.bumptech.glide.request.RequestListener\nimport com.bumptech.glide.request.target.Target\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.keylesspalace.tusky.databinding.DialogFocusBinding\nimport com.keylesspalace.tusky.entity.Attachment.Focus\nimport kotlinx.coroutines.launch\n\nfun <T> T.makeFocusDialog(\n    existingFocus: Focus?,\n    previewUri: Uri,\n    onUpdateFocus: suspend (Focus) -> Unit\n) where T : AppCompatActivity, T : LifecycleOwner {\n    val focus = existingFocus ?: Focus(0.0f, 0.0f) // Default to center\n\n    val dialogBinding = DialogFocusBinding.inflate(layoutInflater)\n\n    dialogBinding.focusIndicator.setFocus(focus)\n\n    Glide.with(this)\n        .load(previewUri)\n        .downsample(DownsampleStrategy.CENTER_INSIDE)\n        .listener(object : RequestListener<Drawable> {\n            override fun onLoadFailed(\n                error: GlideException?,\n                model: Any?,\n                target: Target<Drawable?>,\n                isFirstResource: Boolean\n            ): Boolean {\n                return false\n            }\n\n            override fun onResourceReady(\n                resource: Drawable,\n                model: Any,\n                target: Target<Drawable?>?,\n                dataSource: DataSource,\n                isFirstResource: Boolean\n            ): Boolean {\n                val width = resource.intrinsicWidth\n                val height = resource.intrinsicHeight\n\n                val viewWidth = dialogBinding.imageView.width\n                val viewHeight = dialogBinding.imageView.height\n\n                val scaledHeight = (viewWidth.toFloat() / width.toFloat()) * height\n\n                dialogBinding.focusIndicator.setImageSize(viewWidth, scaledHeight.toInt())\n\n                // We want the dialog to be a little taller than the image, so you can slide your thumb past the image border,\n                // but if it's *too* much taller that looks weird. See if a threshold has been crossed:\n                if (width > height) {\n                    val maxHeight = dialogBinding.focusIndicator.maxAttractiveHeight()\n\n                    if (viewHeight > maxHeight) {\n                        val verticalShrinkLayout = FrameLayout.LayoutParams(viewWidth, maxHeight)\n                        dialogBinding.imageView.layoutParams = verticalShrinkLayout\n                        dialogBinding.focusIndicator.layoutParams = verticalShrinkLayout\n                    }\n                }\n                return false // Pass through\n            }\n        })\n        .into(dialogBinding.imageView)\n\n    val okListener = { dialog: DialogInterface, _: Int ->\n        lifecycleScope.launch {\n            onUpdateFocus(dialogBinding.focusIndicator.getFocus())\n        }\n        dialog.dismiss()\n    }\n\n    val dialog = MaterialAlertDialogBuilder(this)\n        .setView(dialogBinding.root)\n        .setPositiveButton(android.R.string.ok, okListener)\n        .setNegativeButton(android.R.string.cancel, null)\n        .create()\n\n    val window = dialog.window\n    window?.setSoftInputMode(\n        WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE\n    )\n\n    dialog.show()\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/compose/view/ComposeOptionsView.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.compose.view\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.widget.RadioGroup\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.entity.Status\n\nclass ComposeOptionsView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : RadioGroup(\n    context,\n    attrs\n) {\n\n    var listener: ComposeOptionsListener? = null\n\n    init {\n        inflate(context, R.layout.view_compose_options, this)\n\n        setOnCheckedChangeListener { _, checkedId ->\n            val visibility = when (checkedId) {\n                R.id.publicRadioButton ->\n                    Status.Visibility.PUBLIC\n                R.id.unlistedRadioButton ->\n                    Status.Visibility.UNLISTED\n                R.id.privateRadioButton ->\n                    Status.Visibility.PRIVATE\n                R.id.directRadioButton ->\n                    Status.Visibility.DIRECT\n                else ->\n                    Status.Visibility.PUBLIC\n            }\n            listener?.onVisibilityChanged(visibility)\n        }\n    }\n\n    fun setStatusVisibility(visibility: Status.Visibility) {\n        val selectedButton = when (visibility) {\n            Status.Visibility.PUBLIC ->\n                R.id.publicRadioButton\n            Status.Visibility.UNLISTED ->\n                R.id.unlistedRadioButton\n            Status.Visibility.PRIVATE ->\n                R.id.privateRadioButton\n            Status.Visibility.DIRECT ->\n                R.id.directRadioButton\n            else ->\n                R.id.directRadioButton\n        }\n\n        check(selectedButton)\n    }\n}\n\ninterface ComposeOptionsListener {\n    fun onVisibilityChanged(visibility: Status.Visibility)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/compose/view/ComposeScheduleView.kt",
    "content": "/* Copyright 2019 kyori19\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\npackage com.keylesspalace.tusky.components.compose.view\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.appcompat.content.res.AppCompatResources\nimport androidx.constraintlayout.widget.ConstraintLayout\nimport com.google.android.material.datepicker.CalendarConstraints\nimport com.google.android.material.datepicker.DateValidatorPointForward\nimport com.google.android.material.datepicker.MaterialDatePicker\nimport com.google.android.material.timepicker.MaterialTimePicker\nimport com.google.android.material.timepicker.TimeFormat\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ViewComposeScheduleBinding\nimport java.text.ParseException\nimport java.text.SimpleDateFormat\nimport java.util.Calendar\nimport java.util.Date\nimport java.util.Locale\nimport java.util.TimeZone\n\nclass ComposeScheduleView\n@JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = 0\n) : ConstraintLayout(context, attrs, defStyleAttr) {\n    interface OnTimeSetListener {\n        fun onTimeSet(time: String?)\n    }\n\n    private var binding = ViewComposeScheduleBinding.inflate(\n        (context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater),\n        this\n    )\n    private var listener: OnTimeSetListener? = null\n    private var dateFormat = SimpleDateFormat.getDateInstance()\n    private var timeFormat = SimpleDateFormat.getTimeInstance()\n    private var iso8601 = SimpleDateFormat(\n        \"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'\",\n        Locale.getDefault()\n    ).apply {\n        timeZone = TimeZone.getTimeZone(\"UTC\")\n    }\n\n    /** The date/time the user has chosen to schedule the status, in UTC */\n    private var scheduleDateTimeUtc: Calendar? = null\n\n    init {\n        binding.scheduledDateTime.setOnClickListener { openPickDateDialog() }\n        binding.invalidScheduleWarning.setText(R.string.warning_scheduling_interval)\n        updateScheduleUi()\n        setEditIcons()\n    }\n\n    fun setListener(listener: OnTimeSetListener?) {\n        this.listener = listener\n    }\n\n    private fun updateScheduleUi() {\n        if (scheduleDateTimeUtc == null) {\n            binding.scheduledDateTime.text = \"\"\n            binding.invalidScheduleWarning.visibility = GONE\n            return\n        }\n\n        val scheduled = scheduleDateTimeUtc!!.time\n        @SuppressLint(\"SetTextI18n\")\n        binding.scheduledDateTime.text = \"${dateFormat.format(scheduled)} ${timeFormat.format(scheduled)}\"\n        verifyScheduledTime(scheduled)\n    }\n\n    private fun setEditIcons() {\n        val icon = AppCompatResources.getDrawable(context, R.drawable.ic_edit_24dp_filled) ?: return\n        val size = binding.scheduledDateTime.lineHeight\n        icon.setBounds(0, 0, size, size)\n        binding.scheduledDateTime.setCompoundDrawablesRelative(null, null, icon, null)\n    }\n\n    fun setResetOnClickListener(listener: OnClickListener?) {\n        binding.resetScheduleButton.setOnClickListener(listener)\n    }\n\n    fun resetSchedule() {\n        scheduleDateTimeUtc = null\n        updateScheduleUi()\n    }\n\n    fun openPickDateDialog() {\n        // The earliest point in time the calendar should display. Start with current date/time\n        val earliest = calendar().apply {\n            // Add the minimum scheduling interval. This may roll the calendar over to the\n            // next day (e.g. if the current time is 23:57).\n            add(Calendar.SECOND, MINIMUM_SCHEDULED_SECONDS)\n            // Clear out the time components, so it's midnight\n            set(Calendar.HOUR_OF_DAY, 0)\n            set(Calendar.MINUTE, 0)\n            set(Calendar.SECOND, 0)\n            set(Calendar.MILLISECOND, 0)\n        }\n        val calendarConstraints = CalendarConstraints.Builder()\n            .setValidator(DateValidatorPointForward.from(earliest.timeInMillis))\n            .build()\n        initializeSuggestedTime()\n\n        // Work around a misfeature in MaterialDatePicker. The `selection` is treated as\n        // millis-from-epoch, in UTC, which is good. However, it is also *displayed* in UTC\n        // instead of converting to the user's local timezone.\n        //\n        // So we have to add the TZ offset before setting it in the picker\n        val tzOffset = TimeZone.getDefault().getOffset(scheduleDateTimeUtc!!.timeInMillis)\n\n        val picker = MaterialDatePicker.Builder\n            .datePicker()\n            .setSelection(scheduleDateTimeUtc!!.timeInMillis + tzOffset)\n            .setCalendarConstraints(calendarConstraints)\n            .build()\n        picker.addOnPositiveButtonClickListener { selection: Long -> onDateSet(selection) }\n        picker.show((context as AppCompatActivity).supportFragmentManager, \"date_picker\")\n    }\n\n    private fun getTimeFormat(context: Context): Int {\n        return if (android.text.format.DateFormat.is24HourFormat(context)) {\n            TimeFormat.CLOCK_24H\n        } else {\n            TimeFormat.CLOCK_12H\n        }\n    }\n\n    private fun openPickTimeDialog() {\n        val pickerBuilder = MaterialTimePicker.Builder()\n        scheduleDateTimeUtc?.let {\n            pickerBuilder.setHour(it[Calendar.HOUR_OF_DAY])\n                .setMinute(it[Calendar.MINUTE])\n        }\n\n        pickerBuilder.setTitleText(dateFormat.format(scheduleDateTimeUtc!!.timeInMillis))\n        pickerBuilder.setTimeFormat(getTimeFormat(context))\n\n        val picker = pickerBuilder.build()\n        picker.addOnPositiveButtonClickListener { onTimeSet(picker.hour, picker.minute) }\n        picker.show((context as AppCompatActivity).supportFragmentManager, \"time_picker\")\n    }\n\n    fun getDateTime(scheduledAt: String?): Date? {\n        scheduledAt?.let {\n            try {\n                return iso8601.parse(it)\n            } catch (_: ParseException) {\n            }\n        }\n        return null\n    }\n\n    fun setDateTime(scheduledAt: String?) {\n        val date = getDateTime(scheduledAt) ?: return\n        initializeSuggestedTime()\n        scheduleDateTimeUtc!!.time = date\n        updateScheduleUi()\n    }\n\n    fun verifyScheduledTime(scheduledTime: Date?): Boolean {\n        val valid: Boolean = if (scheduledTime != null) {\n            val minimumScheduledTime = calendar()\n            minimumScheduledTime.add(\n                Calendar.SECOND,\n                MINIMUM_SCHEDULED_SECONDS\n            )\n            scheduledTime.after(minimumScheduledTime.time)\n        } else {\n            true\n        }\n        binding.invalidScheduleWarning.visibility = if (valid) GONE else VISIBLE\n        return valid\n    }\n\n    private fun onDateSet(selection: Long) {\n        initializeSuggestedTime()\n        val newDate = calendar()\n        // working around bug in DatePicker where date is UTC #1720\n        // see https://github.com/material-components/material-components-android/issues/882\n        newDate.timeZone = TimeZone.getTimeZone(\"UTC\")\n        newDate.timeInMillis = selection\n        scheduleDateTimeUtc!![newDate[Calendar.YEAR], newDate[Calendar.MONTH]] = newDate[Calendar.DATE]\n        openPickTimeDialog()\n    }\n\n    private fun onTimeSet(hourOfDay: Int, minute: Int) {\n        initializeSuggestedTime()\n        scheduleDateTimeUtc?.set(Calendar.HOUR_OF_DAY, hourOfDay)\n        scheduleDateTimeUtc?.set(Calendar.MINUTE, minute)\n        updateScheduleUi()\n        listener?.onTimeSet(time)\n    }\n\n    val time: String?\n        get() = scheduleDateTimeUtc?.time?.let { iso8601.format(it) }\n\n    private fun initializeSuggestedTime() {\n        if (scheduleDateTimeUtc == null) {\n            scheduleDateTimeUtc = calendar().apply {\n                add(Calendar.MINUTE, 15)\n            }\n        }\n    }\n\n    companion object {\n        // Minimum is 5 minutes, pad 30 seconds for posting\n        private const val MINIMUM_SCHEDULED_SECONDS = 330\n        fun calendar(): Calendar = Calendar.getInstance(TimeZone.getDefault())\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/compose/view/EditTextTyped.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.compose.view\n\nimport android.content.Context\nimport android.text.InputType\nimport android.text.method.KeyListener\nimport android.util.AttributeSet\nimport android.view.inputmethod.EditorInfo\nimport android.view.inputmethod.InputConnection\nimport androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView\nimport androidx.core.view.OnReceiveContentListener\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.inputmethod.EditorInfoCompat\nimport androidx.core.view.inputmethod.InputConnectionCompat\nimport androidx.emoji2.viewsintegration.EmojiEditTextHelper\n\nclass EditTextTyped @JvmOverloads constructor(\n    context: Context,\n    attributeSet: AttributeSet? = null\n) :\n    AppCompatMultiAutoCompleteTextView(context, attributeSet) {\n\n    private val emojiEditTextHelper: EmojiEditTextHelper = EmojiEditTextHelper(this)\n\n    init {\n        // fix a bug with autocomplete and some keyboards\n        val newInputType = inputType and (inputType xor InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE)\n        inputType = newInputType\n        super.setKeyListener(emojiEditTextHelper.getKeyListener(keyListener))\n    }\n\n    override fun setKeyListener(input: KeyListener?) {\n        if (input != null) {\n            super.setKeyListener(emojiEditTextHelper.getKeyListener(input))\n        } else {\n            super.setKeyListener(input)\n        }\n    }\n\n    fun setOnReceiveContentListener(listener: OnReceiveContentListener) {\n        ViewCompat.setOnReceiveContentListener(this, arrayOf(\"image/*\"), listener)\n    }\n\n    override fun onCreateInputConnection(editorInfo: EditorInfo): InputConnection {\n        val connection = super.onCreateInputConnection(editorInfo)\n        EditorInfoCompat.setContentMimeTypes(editorInfo, arrayOf(\"image/*\"))\n        return emojiEditTextHelper.onCreateInputConnection(\n            InputConnectionCompat.createWrapper(this, connection, editorInfo),\n            editorInfo\n        )!!\n    }\n\n    /**\n     * Override pasting to ensure that formatted content is always pasted as\n     * plain text.\n     */\n    override fun onTextContextMenuItem(id: Int): Boolean {\n        if (id == android.R.id.paste) {\n            return super.onTextContextMenuItem(android.R.id.pasteAsPlainText)\n        }\n\n        return super.onTextContextMenuItem(id)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/compose/view/FocusIndicatorView.kt",
    "content": "package com.keylesspalace.tusky.components.compose.view\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.graphics.Canvas\nimport android.graphics.Color\nimport android.graphics.Paint\nimport android.graphics.Path\nimport android.graphics.Point\nimport android.util.AttributeSet\nimport android.view.MotionEvent\nimport android.view.View\nimport com.keylesspalace.tusky.entity.Attachment\nimport kotlin.math.ceil\nimport kotlin.math.max\nimport kotlin.math.min\n\nclass FocusIndicatorView\n@JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = 0\n) : View(context, attrs, defStyleAttr) {\n    private var focus: Attachment.Focus? = null\n    private var imageSize: Point? = null\n    private var circleRadius: Float? = null\n\n    fun setImageSize(width: Int, height: Int) {\n        this.imageSize = Point(width, height)\n        if (focus != null) {\n            invalidate()\n        }\n    }\n\n    fun setFocus(focus: Attachment.Focus) {\n        this.focus = focus\n        if (imageSize != null) {\n            invalidate()\n        }\n    }\n\n    // Assumes setFocus called first\n    fun getFocus(): Attachment.Focus {\n        return focus!!\n    }\n\n    // This needs to be consistent every time it is consulted over the lifetime of the object,\n    // so base it on the view width/height whenever the first access occurs.\n    private fun getCircleRadius(): Float {\n        val circleRadius = this.circleRadius\n        if (circleRadius != null) {\n            return circleRadius\n        }\n        val newCircleRadius = min(this.width, this.height).toFloat() / 4.0f\n        this.circleRadius = newCircleRadius\n        return newCircleRadius\n    }\n\n    // Remember focus uses -1..1 y-down coordinates (so focus value should be negated for y)\n    private fun axisToFocus(value: Float, innerLimit: Int, outerLimit: Int): Float {\n        val offset = (outerLimit - innerLimit) / 2 // Assume image is centered in widget frame\n        val result = (value - offset) / innerLimit.toFloat() * 2.0f - 1.0f // To range -1..1\n        return min(1.0f, max(-1.0f, result)) // Clamp\n    }\n\n    private fun axisFromFocus(value: Float, innerLimit: Int, outerLimit: Int): Float {\n        val offset = (outerLimit - innerLimit) / 2\n        return offset.toFloat() + ((value + 1.0f) / 2.0f) * innerLimit.toFloat() // From range -1..1\n    }\n\n    @SuppressLint(\n        \"ClickableViewAccessibility\"\n    ) // Android Studio wants us to implement PerformClick for accessibility, but that unfortunately cannot be made meaningful for this widget.\n    override fun onTouchEvent(event: MotionEvent): Boolean {\n        if (event.actionMasked == MotionEvent.ACTION_CANCEL) {\n            return false\n        }\n\n        val imageSize = this.imageSize ?: return false\n\n        // Convert touch xy to point inside image\n        focus = Attachment.Focus(axisToFocus(event.x, imageSize.x, this.width), -axisToFocus(event.y, imageSize.y, this.height))\n        invalidate()\n        return true\n    }\n\n    private val transparentDarkGray = 0x40000000\n    private val strokeWidth = 4.0f * this.resources.displayMetrics.density\n\n    private val curtainPaint = Paint(Paint.ANTI_ALIAS_FLAG)\n    private val strokePaint = Paint(Paint.ANTI_ALIAS_FLAG)\n\n    private val curtainPath = Path()\n\n    init {\n        curtainPaint.color = transparentDarkGray\n        curtainPaint.style = Paint.Style.FILL\n\n        strokePaint.style = Paint.Style.STROKE\n        strokePaint.strokeWidth = strokeWidth\n        strokePaint.color = Color.WHITE\n    }\n\n    override fun onDraw(canvas: Canvas) {\n        super.onDraw(canvas)\n\n        val imageSize = this.imageSize\n        val focus = this.focus\n\n        if (imageSize != null && focus?.x != null && focus.y != null) {\n            val x = axisFromFocus(focus.x, imageSize.x, this.width)\n            val y = axisFromFocus(-focus.y, imageSize.y, this.height)\n            val circleRadius = getCircleRadius()\n\n            curtainPath.reset() // Draw a flood fill with a hole cut out of it\n            curtainPath.fillType = Path.FillType.WINDING\n            curtainPath.addRect(\n                0.0f,\n                0.0f,\n                this.width.toFloat(),\n                this.height.toFloat(),\n                Path.Direction.CW\n            )\n            curtainPath.addCircle(x, y, circleRadius, Path.Direction.CCW)\n            canvas.drawPath(curtainPath, curtainPaint)\n\n            canvas.drawCircle(x, y, circleRadius, strokePaint) // Draw white circle\n            canvas.drawCircle(x, y, strokeWidth / 2.0f, strokePaint) // Draw white dot\n        }\n    }\n\n    // Give a \"safe\" height based on currently set image size. Assume imageSize is set and height>width already checked\n    fun maxAttractiveHeight(): Int {\n        val height = this.imageSize!!.y\n        val circleRadius = getCircleRadius()\n\n        // Give us enough space for the image, plus on each side half a focus indicator circle, plus a strokeWidth\n        return ceil(height.toFloat() + circleRadius * 2.0f + strokeWidth).toInt()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/compose/view/PollPreviewView.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.compose.view\n\nimport android.content.Context\nimport android.content.res.ColorStateList\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport com.google.android.material.R as materialR\nimport com.google.android.material.card.MaterialCardView\nimport com.google.android.material.color.MaterialColors\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.adapter.PreviewPollOptionsAdapter\nimport com.keylesspalace.tusky.databinding.ViewPollPreviewBinding\nimport com.keylesspalace.tusky.entity.NewPoll\n\nclass PollPreviewView @JvmOverloads constructor(\n    context: Context?,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = materialR.attr.materialCardViewOutlinedStyle\n) :\n    MaterialCardView(context, attrs, defStyleAttr) {\n\n    private val adapter = PreviewPollOptionsAdapter()\n\n    private val binding = ViewPollPreviewBinding.inflate(LayoutInflater.from(context), this)\n\n    init {\n        setStrokeColor(ColorStateList.valueOf(MaterialColors.getColor(this, materialR.attr.colorOutline)))\n        strokeWidth\n        elevation = 0f\n        binding.pollPreviewOptions.adapter = adapter\n    }\n\n    fun setPoll(poll: NewPoll) {\n        adapter.update(poll.options, poll.multiple)\n\n        val pollDurationId = resources.getIntArray(R.array.poll_duration_values).indexOfLast {\n            it <= poll.expiresIn\n        }\n        binding.pollDurationPreview.text = resources.getStringArray(R.array.poll_duration_names)[pollDurationId]\n    }\n\n    override fun setOnClickListener(l: OnClickListener?) {\n        super.setOnClickListener(l)\n        adapter.setOnClickListener(l)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/compose/view/ProgressImageView.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\npackage com.keylesspalace.tusky.components.compose.view\n\nimport android.content.Context\nimport android.graphics.Canvas\nimport android.graphics.Color\nimport android.graphics.Paint\nimport android.graphics.PorterDuff\nimport android.graphics.PorterDuffXfermode\nimport android.graphics.RectF\nimport android.util.AttributeSet\nimport androidx.appcompat.content.res.AppCompatResources\nimport at.connyduck.sparkbutton.helpers.Utils\nimport com.google.android.material.R as materialR\nimport com.google.android.material.color.MaterialColors\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.view.MediaPreviewImageView\n\nclass ProgressImageView\n@JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = 0\n) : MediaPreviewImageView(context, attrs, defStyleAttr) {\n    private var progress = -1\n    private val progressRect = RectF()\n    private val biggerRect = RectF()\n    private val circlePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {\n        color = MaterialColors.getColor(this@ProgressImageView, materialR.attr.colorPrimary)\n        strokeWidth = Utils.dpToPx(context, 4).toFloat()\n        style = Paint.Style.STROKE\n    }\n    private val clearPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {\n        xfermode = PorterDuffXfermode(PorterDuff.Mode.DST_OUT)\n    }\n    private val markBgPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {\n        style = Paint.Style.FILL\n        color = MaterialColors.getColor(this@ProgressImageView, android.R.attr.colorBackground)\n    }\n    private val captionDrawable = AppCompatResources.getDrawable(\n        context,\n        R.drawable.ic_spellcheck_24dp\n    )!!\n    private val circleRadius = Utils.dpToPx(context, 14)\n    private val circleMargin = Utils.dpToPx(context, 14)\n\n    fun setProgress(progress: Int) {\n        this.progress = progress\n        if (progress != -1) {\n            setColorFilter(Color.rgb(123, 123, 123), PorterDuff.Mode.MULTIPLY)\n        } else {\n            clearColorFilter()\n        }\n        invalidate()\n    }\n\n    fun setChecked(checked: Boolean) {\n        val backgroundColor = if (checked) materialR.attr.colorPrimary else android.R.attr.colorBackground\n        val foregroundColor = if (checked) materialR.attr.colorOnPrimary else android.R.attr.textColorTertiary\n        markBgPaint.color = MaterialColors.getColor(this, backgroundColor)\n        captionDrawable.setTint(MaterialColors.getColor(this, foregroundColor))\n        invalidate()\n    }\n\n    override fun onDraw(canvas: Canvas) {\n        super.onDraw(canvas)\n        val angle = progress / 100f * 360 - 90\n        val halfWidth = width / 2f\n        val halfHeight = height / 2f\n        progressRect[halfWidth * 0.75f, halfHeight * 0.75f, halfWidth * 1.25f] = halfHeight * 1.25f\n        biggerRect.set(progressRect)\n        val margin = 8\n        biggerRect[progressRect.left - margin, progressRect.top - margin, progressRect.right + margin] =\n            progressRect.bottom + margin\n        canvas.saveLayer(biggerRect, null)\n        if (progress != -1) {\n            canvas.drawOval(progressRect, circlePaint)\n            canvas.drawArc(biggerRect, angle, 360 - angle - 90, true, clearPaint)\n        }\n        canvas.restore()\n        val circleY = height - circleMargin - circleRadius / 2\n        val circleX = width - circleMargin - circleRadius / 2\n        canvas.drawCircle(circleX.toFloat(), circleY.toFloat(), circleRadius.toFloat(), markBgPaint)\n        captionDrawable.setBounds(\n            width - circleMargin - circleRadius,\n            height - circleMargin - circleRadius,\n            width - circleMargin,\n            height - circleMargin\n        )\n        captionDrawable.draw(canvas)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/compose/view/TootButton.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.compose.view\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport androidx.appcompat.content.res.AppCompatResources\nimport com.google.android.material.button.MaterialButton\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.entity.Status\n\nclass TootButton\n@JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = 0\n) : MaterialButton(context, attrs, defStyleAttr) {\n\n    private val smallStyle: Boolean = context.resources.getBoolean(R.bool.show_small_toot_button)\n\n    init {\n        if (smallStyle) {\n            setIconResource(R.drawable.ic_send_24dp)\n            iconPadding = 0\n        } else {\n            setText(R.string.action_send)\n        }\n        val padding = resources.getDimensionPixelSize(R.dimen.toot_button_horizontal_padding)\n        setPadding(padding, 0, padding, 0)\n    }\n\n    fun setStatusVisibility(visibility: Status.Visibility) {\n        if (!smallStyle) {\n            icon = when (visibility) {\n                Status.Visibility.PUBLIC -> {\n                    setText(R.string.action_send_public)\n                    null\n                }\n                Status.Visibility.UNLISTED -> {\n                    setText(R.string.action_send)\n                    null\n                }\n                Status.Visibility.PRIVATE,\n                Status.Visibility.DIRECT -> {\n                    setText(R.string.action_send)\n                    AppCompatResources.getDrawable(context, R.drawable.ic_lock_24dp)\n                }\n                else -> {\n                    null\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationEntity.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.conversation\n\nimport androidx.room.Embedded\nimport androidx.room.Entity\nimport androidx.room.TypeConverters\nimport com.keylesspalace.tusky.db.Converters\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.entity.Conversation\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.entity.HashTag\nimport com.keylesspalace.tusky.entity.Poll\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.entity.TimelineAccount\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport com.squareup.moshi.JsonClass\nimport java.util.Date\n\n@Entity(primaryKeys = [\"id\", \"accountId\"])\n@TypeConverters(Converters::class)\ndata class ConversationEntity(\n    val accountId: Long,\n    val id: String,\n    val order: Int,\n    val accounts: List<ConversationAccountEntity>,\n    val unread: Boolean,\n    @Embedded(prefix = \"s_\") val lastStatus: ConversationStatusEntity\n) {\n    fun toViewData(): ConversationViewData {\n        return ConversationViewData(\n            id = id,\n            order = order,\n            accounts = accounts,\n            unread = unread,\n            lastStatus = lastStatus.toViewData()\n        )\n    }\n}\n\n@JsonClass(generateAdapter = true)\ndata class ConversationAccountEntity(\n    val id: String,\n    val localUsername: String,\n    val username: String,\n    val displayName: String,\n    val avatar: String,\n    val emojis: List<Emoji>\n) {\n    fun toAccount(): TimelineAccount {\n        return TimelineAccount(\n            id = id,\n            localUsername = localUsername,\n            username = username,\n            displayName = displayName,\n            note = \"\",\n            url = \"\",\n            avatar = avatar,\n            emojis = emojis\n        )\n    }\n}\n\n@TypeConverters(Converters::class)\ndata class ConversationStatusEntity(\n    val id: String,\n    val url: String?,\n    val inReplyToId: String?,\n    val inReplyToAccountId: String?,\n    val account: ConversationAccountEntity,\n    val content: String,\n    val createdAt: Date,\n    val editedAt: Date?,\n    val emojis: List<Emoji>,\n    val favouritesCount: Int,\n    val repliesCount: Int,\n    val favourited: Boolean,\n    val bookmarked: Boolean,\n    val sensitive: Boolean,\n    val spoilerText: String,\n    val attachments: List<Attachment>,\n    val mentions: List<Status.Mention>,\n    val tags: List<HashTag>?,\n    val showingHiddenContent: Boolean,\n    val expanded: Boolean,\n    val collapsed: Boolean,\n    val muted: Boolean,\n    val poll: Poll?,\n    val language: String?\n) {\n\n    fun toViewData(): StatusViewData.Concrete {\n        return StatusViewData.Concrete(\n            status = Status(\n                id = id,\n                url = url,\n                account = account.toAccount(),\n                inReplyToId = inReplyToId,\n                inReplyToAccountId = inReplyToAccountId,\n                content = content,\n                reblog = null,\n                createdAt = createdAt,\n                editedAt = editedAt,\n                emojis = emojis,\n                reblogsCount = 0,\n                favouritesCount = favouritesCount,\n                repliesCount = repliesCount,\n                reblogged = false,\n                favourited = favourited,\n                bookmarked = bookmarked,\n                sensitive = sensitive,\n                spoilerText = spoilerText,\n                visibility = Status.Visibility.DIRECT,\n                attachments = attachments,\n                mentions = mentions,\n                tags = tags.orEmpty(),\n                application = null,\n                pinned = false,\n                muted = muted,\n                poll = poll,\n                card = null,\n                language = language,\n                filtered = emptyList()\n            ),\n            isExpanded = expanded,\n            isShowingContent = showingHiddenContent,\n            isCollapsed = collapsed\n        )\n    }\n}\n\nfun TimelineAccount.toEntity() = ConversationAccountEntity(\n    id = id,\n    localUsername = localUsername,\n    username = username,\n    displayName = name,\n    avatar = avatar,\n    emojis = emojis\n)\n\nfun Status.toEntity(expanded: Boolean, contentShowing: Boolean, contentCollapsed: Boolean) =\n    ConversationStatusEntity(\n        id = id,\n        url = url,\n        inReplyToId = inReplyToId,\n        inReplyToAccountId = inReplyToAccountId,\n        account = account.toEntity(),\n        content = content,\n        createdAt = createdAt,\n        editedAt = editedAt,\n        emojis = emojis,\n        favouritesCount = favouritesCount,\n        repliesCount = repliesCount,\n        favourited = favourited,\n        bookmarked = bookmarked,\n        sensitive = sensitive,\n        spoilerText = spoilerText,\n        attachments = attachments,\n        mentions = mentions,\n        tags = tags,\n        showingHiddenContent = contentShowing,\n        expanded = expanded,\n        collapsed = contentCollapsed,\n        muted = muted,\n        poll = poll,\n        language = language\n    )\n\nfun Conversation.toEntity(\n    accountId: Long,\n    order: Int,\n    expanded: Boolean,\n    contentShowing: Boolean,\n    contentCollapsed: Boolean\n) = ConversationEntity(\n    accountId = accountId,\n    id = id,\n    order = order,\n    accounts = accounts.map { it.toEntity() },\n    unread = unread,\n    lastStatus = lastStatus!!.toEntity(\n        expanded = expanded,\n        contentShowing = contentShowing,\n        contentCollapsed = contentCollapsed\n    )\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationPagingAdapter.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.conversation\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.paging.PagingDataAdapter\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.adapter.PlaceholderViewHolder\nimport com.keylesspalace.tusky.adapter.StatusBaseViewHolder\nimport com.keylesspalace.tusky.databinding.ItemPlaceholderBinding\nimport com.keylesspalace.tusky.interfaces.StatusActionListener\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\n\nclass ConversationPagingAdapter(\n    private var statusDisplayOptions: StatusDisplayOptions,\n    private val listener: StatusActionListener\n) : PagingDataAdapter<ConversationViewData, RecyclerView.ViewHolder>(CONVERSATION_COMPARATOR) {\n\n    var mediaPreviewEnabled: Boolean\n        get() = statusDisplayOptions.mediaPreviewEnabled\n        set(mediaPreviewEnabled) {\n            statusDisplayOptions = statusDisplayOptions.copy(\n                mediaPreviewEnabled = mediaPreviewEnabled\n            )\n        }\n\n    override fun getItemViewType(position: Int): Int {\n        return if (getItem(position) == null) {\n            VIEW_TYPE_PLACEHOLDER\n        } else {\n            VIEW_TYPE_CONVERSATION\n        }\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {\n        val layoutInflater = LayoutInflater.from(parent.context)\n        return if (viewType == VIEW_TYPE_CONVERSATION) {\n            ConversationViewHolder(layoutInflater.inflate(R.layout.item_conversation, parent, false), statusDisplayOptions, listener)\n        } else {\n            PlaceholderViewHolder(\n                ItemPlaceholderBinding.inflate(layoutInflater, parent, false),\n                mode = PlaceholderViewHolder.Mode.CONVERSATION\n            )\n        }\n    }\n\n    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {\n        onBindViewHolder(holder, position, emptyList())\n    }\n\n    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int, payloads: List<Any>) {\n        val conversationViewData = getItem(position)\n        if (holder is ConversationViewHolder && conversationViewData != null) {\n            holder.setupWithConversation(conversationViewData, payloads)\n        }\n    }\n\n    companion object {\n        private const val VIEW_TYPE_PLACEHOLDER = 0\n        private const val VIEW_TYPE_CONVERSATION = 1\n\n        private val CONVERSATION_COMPARATOR = object : DiffUtil.ItemCallback<ConversationViewData>() {\n            override fun areItemsTheSame(\n                oldItem: ConversationViewData,\n                newItem: ConversationViewData\n            ): Boolean {\n                return oldItem.id == newItem.id\n            }\n\n            override fun areContentsTheSame(\n                oldItem: ConversationViewData,\n                newItem: ConversationViewData\n            ): Boolean {\n                return false // Items are different always. It allows to refresh timestamp on every view holder update\n            }\n\n            override fun getChangePayload(\n                oldItem: ConversationViewData,\n                newItem: ConversationViewData\n            ): Any? {\n                return if (oldItem == newItem) {\n                    // If items are equal - update timestamp only\n                    StatusBaseViewHolder.Key.KEY_CREATED\n                } else {\n                    // If items are different - update the whole view holder\n                    null\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationViewData.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.conversation\n\nimport com.keylesspalace.tusky.entity.Poll\nimport com.keylesspalace.tusky.viewdata.StatusViewData\n\ndata class ConversationViewData(\n    val id: String,\n    val order: Int,\n    val accounts: List<ConversationAccountEntity>,\n    val unread: Boolean,\n    val lastStatus: StatusViewData.Concrete\n) {\n    fun toEntity(\n        accountId: Long,\n        favourited: Boolean = lastStatus.status.favourited,\n        bookmarked: Boolean = lastStatus.status.bookmarked,\n        muted: Boolean = lastStatus.status.muted,\n        poll: Poll? = lastStatus.status.poll,\n        expanded: Boolean = lastStatus.isExpanded,\n        collapsed: Boolean = lastStatus.isCollapsed,\n        showingHiddenContent: Boolean = lastStatus.isShowingContent\n    ): ConversationEntity {\n        return ConversationEntity(\n            accountId = accountId,\n            id = id,\n            order = order,\n            accounts = accounts,\n            unread = unread,\n            lastStatus = lastStatus.toConversationStatusEntity(\n                favourited = favourited,\n                bookmarked = bookmarked,\n                muted = muted,\n                poll = poll,\n                expanded = expanded,\n                collapsed = collapsed,\n                showingHiddenContent = showingHiddenContent\n            )\n        )\n    }\n}\n\nfun StatusViewData.Concrete.toConversationStatusEntity(\n    favourited: Boolean = status.favourited,\n    bookmarked: Boolean = status.bookmarked,\n    muted: Boolean = status.muted,\n    poll: Poll? = status.poll,\n    expanded: Boolean = isExpanded,\n    collapsed: Boolean = isCollapsed,\n    showingHiddenContent: Boolean = isShowingContent\n): ConversationStatusEntity {\n    return ConversationStatusEntity(\n        id = id,\n        url = status.url,\n        inReplyToId = status.inReplyToId,\n        inReplyToAccountId = status.inReplyToAccountId,\n        account = status.account.toEntity(),\n        content = status.content,\n        createdAt = status.createdAt,\n        editedAt = status.editedAt,\n        emojis = status.emojis,\n        favouritesCount = status.favouritesCount,\n        repliesCount = status.repliesCount,\n        favourited = favourited,\n        bookmarked = bookmarked,\n        sensitive = status.sensitive,\n        spoilerText = status.spoilerText,\n        attachments = status.attachments,\n        mentions = status.mentions,\n        tags = status.tags,\n        showingHiddenContent = showingHiddenContent,\n        expanded = expanded,\n        collapsed = collapsed,\n        muted = muted,\n        poll = poll,\n        language = status.language\n    )\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationViewHolder.java",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.conversation;\n\nimport android.content.Context;\nimport android.text.InputFilter;\nimport android.text.TextUtils;\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.keylesspalace.tusky.R;\nimport com.keylesspalace.tusky.adapter.StatusBaseViewHolder;\nimport com.keylesspalace.tusky.entity.Attachment;\nimport com.keylesspalace.tusky.entity.Status;\nimport com.keylesspalace.tusky.entity.TimelineAccount;\nimport com.keylesspalace.tusky.interfaces.StatusActionListener;\nimport com.keylesspalace.tusky.util.ImageLoadingHelper;\nimport com.keylesspalace.tusky.util.SmartLengthInputFilter;\nimport com.keylesspalace.tusky.util.StatusDisplayOptions;\nimport com.keylesspalace.tusky.viewdata.StatusViewData;\n\nimport java.util.List;\n\npublic class ConversationViewHolder extends StatusBaseViewHolder {\n    private static final InputFilter[] COLLAPSE_INPUT_FILTER = new InputFilter[]{SmartLengthInputFilter.INSTANCE};\n    private static final InputFilter[] NO_INPUT_FILTER = new InputFilter[0];\n\n    private final TextView conversationNameTextView;\n    private final Button contentCollapseButton;\n    private final ImageView[] avatars;\n\n    private final StatusDisplayOptions statusDisplayOptions;\n    private final StatusActionListener listener;\n\n    ConversationViewHolder(View itemView,\n                           StatusDisplayOptions statusDisplayOptions,\n                           StatusActionListener listener) {\n        super(itemView);\n        conversationNameTextView = itemView.findViewById(R.id.conversation_name);\n        contentCollapseButton = itemView.findViewById(R.id.button_toggle_content);\n        avatars = new ImageView[]{\n                avatar,\n                itemView.findViewById(R.id.status_avatar_1),\n                itemView.findViewById(R.id.status_avatar_2)\n        };\n        this.statusDisplayOptions = statusDisplayOptions;\n\n        this.listener = listener;\n    }\n\n    void setupWithConversation(\n            @NonNull ConversationViewData conversation,\n            @NonNull List<Object> payloads\n    ) {\n\n        StatusViewData.Concrete statusViewData = conversation.getLastStatus();\n        Status status = statusViewData.getStatus();\n\n        if (payloads.isEmpty()) {\n            TimelineAccount account = status.getAccount();\n\n            setupCollapsedState(statusViewData.isCollapsible(), statusViewData.isCollapsed(), statusViewData.isExpanded(), status.getSpoilerText(), listener);\n\n            String displayName = account.getDisplayName();\n            if (displayName == null) {\n                displayName = \"\";\n            }\n            setDisplayName(displayName, account.getEmojis(), statusDisplayOptions);\n            setUsername(account.getUsername());\n            setMetaData(statusViewData, statusDisplayOptions, listener);\n            setFavourited(status.getFavourited());\n            setBookmarked(status.getBookmarked());\n            List<Attachment> attachments = status.getAttachments();\n            boolean sensitive = status.getSensitive();\n            if (attachments.isEmpty()) {\n                mediaContainer.setVisibility(View.GONE);\n            } else if (statusDisplayOptions.mediaPreviewEnabled() && hasPreviewableAttachment(attachments)) {\n                mediaContainer.setVisibility(View.VISIBLE);\n\n                setMediaPreviews(attachments, sensitive, listener, statusViewData.isShowingContent(),\n                        statusDisplayOptions.useBlurhash(), statusViewData.getFilter());\n\n                if (attachments.isEmpty()) {\n                    hideSensitiveMediaWarning();\n                }\n                // Hide the unused label.\n                for (TextView mediaLabel : mediaLabels) {\n                    mediaLabel.setVisibility(View.GONE);\n                }\n            } else {\n                mediaContainer.setVisibility(View.VISIBLE);\n\n                setMediaLabel(attachments, sensitive, listener, statusViewData.isShowingContent());\n                // Hide all unused views.\n                mediaPreview.setVisibility(View.GONE);\n                hideSensitiveMediaWarning();\n            }\n\n            setupButtons(listener, account.getId(), statusViewData.getContent().toString(),\n                    statusDisplayOptions);\n\n            setSpoilerAndContent(statusViewData, statusDisplayOptions, listener);\n\n            setConversationName(conversation.getAccounts());\n\n            setAvatars(conversation.getAccounts());\n        } else {\n            for (Object item : payloads) {\n                if (Key.KEY_CREATED.equals(item)) {\n                    setMetaData(statusViewData, statusDisplayOptions, listener);\n                }\n            }\n        }\n    }\n\n    private void setConversationName(List<ConversationAccountEntity> accounts) {\n        Context context = conversationNameTextView.getContext();\n        String conversationName = \"\";\n        if (accounts.size() == 1) {\n            conversationName = context.getString(R.string.conversation_1_recipients, accounts.get(0).getUsername());\n        } else if (accounts.size() == 2) {\n            conversationName = context.getString(R.string.conversation_2_recipients, accounts.get(0).getUsername(), accounts.get(1).getUsername());\n        } else if (accounts.size() > 2) {\n            conversationName = context.getString(R.string.conversation_more_recipients, accounts.get(0).getUsername(), accounts.get(1).getUsername(), accounts.size() - 2);\n        }\n\n        conversationNameTextView.setText(conversationName);\n    }\n\n    private void setAvatars(List<ConversationAccountEntity> accounts) {\n        for (int i = 0; i < avatars.length; i++) {\n            ImageView avatarView = avatars[i];\n            if (i < accounts.size()) {\n                ImageLoadingHelper.loadAvatar(accounts.get(i).getAvatar(), avatarView,\n                        avatarRadius48dp, statusDisplayOptions.animateAvatars(), null);\n                avatarView.setVisibility(View.VISIBLE);\n            } else {\n                avatarView.setVisibility(View.GONE);\n            }\n        }\n    }\n\n    private void setupCollapsedState(boolean collapsible, boolean collapsed, boolean expanded, String spoilerText, final StatusActionListener listener) {\n        /* input filter for TextViews have to be set before text */\n        if (collapsible && (expanded || TextUtils.isEmpty(spoilerText))) {\n            contentCollapseButton.setOnClickListener(view -> {\n                int position = getBindingAdapterPosition();\n                if (position != RecyclerView.NO_POSITION)\n                    listener.onContentCollapsedChange(!collapsed, position);\n            });\n\n            contentCollapseButton.setVisibility(View.VISIBLE);\n            if (collapsed) {\n                contentCollapseButton.setText(R.string.post_content_warning_show_more);\n                content.setFilters(COLLAPSE_INPUT_FILTER);\n            } else {\n                contentCollapseButton.setText(R.string.post_content_warning_show_less);\n                content.setFilters(NO_INPUT_FILTER);\n            }\n        } else {\n            contentCollapseButton.setVisibility(View.GONE);\n            content.setFilters(NO_INPUT_FILTER);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationsFragment.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.conversation\n\nimport android.content.SharedPreferences\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport androidx.appcompat.widget.PopupMenu\nimport androidx.core.view.MenuProvider\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.paging.LoadState\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.SimpleItemAnimator\nimport at.connyduck.sparkbutton.SparkButton\nimport at.connyduck.sparkbutton.helpers.Utils\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.StatusListActivity\nimport com.keylesspalace.tusky.adapter.LoadStateFooterAdapter\nimport com.keylesspalace.tusky.appstore.ConversationsLoadingEvent\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.PreferenceChangedEvent\nimport com.keylesspalace.tusky.components.account.AccountActivity\nimport com.keylesspalace.tusky.databinding.FragmentTimelineBinding\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.fragment.SFragment\nimport com.keylesspalace.tusky.interfaces.ReselectableFragment\nimport com.keylesspalace.tusky.interfaces.StatusActionListener\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.util.CardViewMode\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.util.ensureBottomPadding\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.isAnyLoading\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.updateRelativeTimePeriodically\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.view.ConfirmationBottomSheet.Companion.confirmFavourite\nimport com.keylesspalace.tusky.viewdata.AttachmentViewData\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass ConversationsFragment :\n    SFragment(R.layout.fragment_timeline),\n    StatusActionListener,\n    ReselectableFragment,\n    MenuProvider {\n\n    @Inject\n    lateinit var eventHub: EventHub\n\n    @Inject\n    lateinit var preferences: SharedPreferences\n\n    private val viewModel: ConversationsViewModel by viewModels()\n\n    private val binding by viewBinding(FragmentTimelineBinding::bind)\n\n    private var adapter: ConversationPagingAdapter? = null\n\n    private var buttonToAnimate: SparkButton? = null\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED)\n\n        val statusDisplayOptions = StatusDisplayOptions(\n            animateAvatars = preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false),\n            mediaPreviewEnabled = accountManager.activeAccount?.mediaPreviewEnabled != false,\n            useAbsoluteTime = preferences.getBoolean(PrefKeys.ABSOLUTE_TIME_VIEW, false),\n            showBotOverlay = preferences.getBoolean(PrefKeys.SHOW_BOT_OVERLAY, true),\n            useBlurhash = preferences.getBoolean(PrefKeys.USE_BLURHASH, true),\n            cardViewMode = CardViewMode.NONE,\n            hideStats = preferences.getBoolean(PrefKeys.WELLBEING_HIDE_STATS_POSTS, false),\n            animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false),\n            showStatsInline = preferences.getBoolean(PrefKeys.SHOW_STATS_INLINE, false),\n            showSensitiveMedia = accountManager.activeAccount!!.alwaysShowSensitiveMedia,\n            openSpoiler = accountManager.activeAccount!!.alwaysOpenSpoiler\n        )\n\n        val adapter = ConversationPagingAdapter(statusDisplayOptions, this)\n        this.adapter = adapter\n\n        setupRecyclerView(adapter)\n\n        binding.swipeRefreshLayout.setOnRefreshListener { refreshContent() }\n\n        adapter.addLoadStateListener { loadState ->\n            if (loadState.refresh != LoadState.Loading && loadState.source.refresh != LoadState.Loading) {\n                binding.swipeRefreshLayout.isRefreshing = false\n            }\n\n            binding.statusView.hide()\n            binding.progressBar.hide()\n\n            if (loadState.isAnyLoading()) {\n                viewLifecycleOwner.lifecycleScope.launch {\n                    eventHub.dispatch(\n                        ConversationsLoadingEvent(\n                            accountManager.activeAccount?.accountId ?: \"\"\n                        )\n                    )\n                }\n            }\n\n            if (adapter.itemCount == 0) {\n                when (loadState.refresh) {\n                    is LoadState.NotLoading -> {\n                        if (loadState.append is LoadState.NotLoading && loadState.source.refresh is LoadState.NotLoading) {\n                            binding.statusView.show()\n                            binding.statusView.setup(\n                                R.drawable.elephant_friend_empty,\n                                R.string.message_empty,\n                                null\n                            )\n                            binding.statusView.showHelp(R.string.help_empty_conversations)\n                        }\n                    }\n\n                    is LoadState.Error -> {\n                        binding.statusView.show()\n                        binding.statusView.setup(\n                            (loadState.refresh as LoadState.Error).error\n                        ) { refreshContent() }\n                    }\n\n                    is LoadState.Loading -> {\n                        binding.progressBar.show()\n                    }\n                }\n            }\n        }\n\n        adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {\n            override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {\n                val firstPos = (binding.recyclerView.layoutManager as LinearLayoutManager).findFirstCompletelyVisibleItemPosition()\n                if (firstPos == 0 && positionStart == 0 && adapter.itemCount != itemCount) {\n                    binding.recyclerView.post {\n                        if (getView() != null) {\n                            binding.recyclerView.scrollBy(0, Utils.dpToPx(requireContext(), -30))\n                        }\n                    }\n                }\n            }\n        })\n\n        // Workaround RecyclerView jumping to bottom on first load because of the load state footer\n        // https://issuetracker.google.com/issues/184874613#comment7\n        var firstLoad = true\n        adapter.addOnPagesUpdatedListener {\n            if (adapter.itemCount > 0 && firstLoad) {\n                (binding.recyclerView.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(0, 0)\n                firstLoad = false\n            }\n        }\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.conversationFlow.collectLatest { pagingData ->\n                adapter.submitData(pagingData)\n            }\n        }\n\n        updateRelativeTimePeriodically(preferences, adapter)\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            eventHub.events.collect { event ->\n                if (event is PreferenceChangedEvent) {\n                    onPreferenceChanged(adapter, event.preferenceKey)\n                }\n            }\n        }\n    }\n\n    override fun onDestroyView() {\n        // Clear the adapter to prevent leaking the View\n        adapter = null\n        buttonToAnimate = null\n        super.onDestroyView()\n    }\n\n    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n        menuInflater.inflate(R.menu.fragment_conversations, menu)\n    }\n\n    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {\n        return when (menuItem.itemId) {\n            R.id.action_refresh -> {\n                binding.swipeRefreshLayout.isRefreshing = true\n                refreshContent()\n                true\n            }\n\n            else -> false\n        }\n    }\n\n    private fun setupRecyclerView(adapter: ConversationPagingAdapter) {\n        binding.recyclerView.ensureBottomPadding(fab = true)\n        binding.recyclerView.setHasFixedSize(true)\n        binding.recyclerView.layoutManager = LinearLayoutManager(context)\n\n        binding.recyclerView.addItemDecoration(\n            DividerItemDecoration(context, DividerItemDecoration.VERTICAL)\n        )\n\n        (binding.recyclerView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false\n\n        binding.recyclerView.adapter =\n            adapter.withLoadStateFooter(LoadStateFooterAdapter(adapter::retry))\n    }\n\n    private fun refreshContent() {\n        adapter?.refresh()\n    }\n\n    override fun onReblog(reblog: Boolean, position: Int, visibility: Status.Visibility?, button: SparkButton?) {\n        // its impossible to reblog private messages\n    }\n\n    override fun onFavourite(favourite: Boolean, position: Int, button: SparkButton?) {\n        adapter?.peek(position)?.let { conversation ->\n            buttonToAnimate = button\n\n            if (favourite) {\n                confirmFavourite(preferences) {\n                    viewModel.favourite(true, conversation)\n                    buttonToAnimate?.playAnimation()\n                    buttonToAnimate?.isChecked = true\n                }\n            } else {\n                viewModel.favourite(false, conversation)\n                buttonToAnimate?.isChecked = false\n            }\n        }\n    }\n\n    override fun onBookmark(bookmark: Boolean, position: Int) {\n        adapter?.peek(position)?.let { conversation ->\n            viewModel.bookmark(bookmark, conversation)\n        }\n    }\n\n    override val onMoreTranslate: ((translate: Boolean, position: Int) -> Unit)? = null\n\n    override fun onMore(view: View, position: Int) {\n        adapter?.peek(position)?.let { conversation ->\n\n            val popup = PopupMenu(requireContext(), view)\n            popup.inflate(R.menu.conversation_more)\n\n            if (conversation.lastStatus.status.muted) {\n                popup.menu.removeItem(R.id.status_mute_conversation)\n            } else {\n                popup.menu.removeItem(R.id.status_unmute_conversation)\n            }\n\n            popup.setOnMenuItemClickListener { item ->\n                when (item.itemId) {\n                    R.id.status_mute_conversation -> viewModel.muteConversation(conversation)\n                    R.id.status_unmute_conversation -> viewModel.muteConversation(conversation)\n                    R.id.conversation_delete -> deleteConversation(conversation)\n                }\n                true\n            }\n            popup.show()\n        }\n    }\n\n    override fun onViewMedia(position: Int, attachmentIndex: Int, view: View?) {\n        adapter?.peek(position)?.let { conversation ->\n            viewMedia(\n                attachmentIndex,\n                AttachmentViewData.list(conversation.lastStatus),\n                view\n            )\n        }\n    }\n\n    override fun onViewThread(position: Int) {\n        adapter?.peek(position)?.let { conversation ->\n            viewThread(conversation.lastStatus.id, conversation.lastStatus.status.url)\n        }\n    }\n\n    override fun onOpenReblog(position: Int) {\n        // there are no reblogs in conversations\n    }\n\n    override fun onExpandedChange(expanded: Boolean, position: Int) {\n        adapter?.peek(position)?.let { conversation ->\n            viewModel.expandHiddenStatus(expanded, conversation)\n        }\n    }\n\n    override fun onContentHiddenChange(isShowing: Boolean, position: Int) {\n        adapter?.peek(position)?.let { conversation ->\n            viewModel.showContent(isShowing, conversation)\n        }\n    }\n\n    override fun onLoadMore(position: Int) {\n        // not using the old way of pagination\n    }\n\n    override fun onContentCollapsedChange(isCollapsed: Boolean, position: Int) {\n        adapter?.peek(position)?.let { conversation ->\n            viewModel.collapseLongStatus(isCollapsed, conversation)\n        }\n    }\n\n    override fun onViewAccount(id: String) {\n        val intent = AccountActivity.getIntent(requireContext(), id)\n        startActivity(intent)\n    }\n\n    override fun onViewTag(tag: String) {\n        val intent = StatusListActivity.newHashtagIntent(requireContext(), tag)\n        startActivity(intent)\n    }\n\n    override fun removeItem(position: Int) {\n        // not needed\n    }\n\n    override fun onReply(position: Int) {\n        adapter?.peek(position)?.let { conversation ->\n            reply(conversation.lastStatus.status)\n        }\n    }\n\n    override fun onVoteInPoll(position: Int, choices: List<Int>) {\n        adapter?.peek(position)?.let { conversation ->\n            viewModel.voteInPoll(choices, conversation)\n        }\n    }\n\n    override fun onShowPollResults(position: Int) {\n        adapter?.peek(position)?.let { conversation ->\n            viewModel.showPollResults(conversation)\n        }\n    }\n\n    override fun clearWarningAction(position: Int) {\n    }\n\n    override fun onReselect() {\n        if (view != null) {\n            binding.recyclerView.layoutManager?.scrollToPosition(0)\n            binding.recyclerView.stopScroll()\n        }\n    }\n\n    override fun onUntranslate(position: Int) {\n        // not needed\n    }\n\n    private fun deleteConversation(conversation: ConversationViewData) {\n        MaterialAlertDialogBuilder(requireContext())\n            .setMessage(R.string.dialog_delete_conversation_warning)\n            .setNegativeButton(android.R.string.cancel, null)\n            .setPositiveButton(android.R.string.ok) { _, _ ->\n                viewModel.remove(conversation)\n            }\n            .show()\n    }\n\n    private fun onPreferenceChanged(adapter: ConversationPagingAdapter, key: String) {\n        when (key) {\n            PrefKeys.MEDIA_PREVIEW_ENABLED -> {\n                val enabled = accountManager.activeAccount!!.mediaPreviewEnabled\n                val oldMediaPreviewEnabled = adapter.mediaPreviewEnabled\n                if (enabled != oldMediaPreviewEnabled) {\n                    adapter.mediaPreviewEnabled = enabled\n                    adapter.notifyItemRangeChanged(0, adapter.itemCount)\n                }\n            }\n        }\n    }\n\n    companion object {\n        fun newInstance() = ConversationsFragment()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationsRemoteMediator.kt",
    "content": "package com.keylesspalace.tusky.components.conversation\n\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.LoadType\nimport androidx.paging.PagingState\nimport androidx.paging.RemoteMediator\nimport androidx.room.withTransaction\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.HttpHeaderLink\nimport retrofit2.HttpException\n\n@OptIn(ExperimentalPagingApi::class)\nclass ConversationsRemoteMediator(\n    private val api: MastodonApi,\n    private val db: AppDatabase,\n    private val viewModel: ConversationsViewModel\n) : RemoteMediator<Int, ConversationEntity>() {\n\n    private var nextKey: String? = null\n\n    private var order: Int = 0\n\n    override suspend fun load(\n        loadType: LoadType,\n        state: PagingState<Int, ConversationEntity>\n    ): MediatorResult {\n        val activeAccount = viewModel.activeAccountFlow.value\n        if (activeAccount == null) {\n            return MediatorResult.Success(endOfPaginationReached = true)\n        }\n\n        if (loadType == LoadType.PREPEND) {\n            return MediatorResult.Success(endOfPaginationReached = true)\n        }\n\n        if (loadType == LoadType.REFRESH) {\n            nextKey = null\n            order = 0\n        }\n\n        try {\n            val conversationsResponse = api.getConversations(\n                maxId = nextKey,\n                limit = state.config.pageSize\n            )\n\n            val conversations = conversationsResponse.body()\n            if (!conversationsResponse.isSuccessful || conversations == null) {\n                return MediatorResult.Error(HttpException(conversationsResponse))\n            }\n\n            db.withTransaction {\n                if (loadType == LoadType.REFRESH) {\n                    db.conversationDao().deleteForAccount(activeAccount.id)\n                }\n\n                val linkHeader = conversationsResponse.headers()[\"Link\"]\n                val links = HttpHeaderLink.parse(linkHeader)\n                nextKey = HttpHeaderLink.findByRelationType(links, \"next\")?.uri?.getQueryParameter(\"max_id\")\n\n                db.conversationDao().insert(\n                    conversations\n                        .filterNot { it.lastStatus == null }\n                        .map { conversation ->\n\n                            val expanded = activeAccount.alwaysOpenSpoiler\n                            val contentShowing = activeAccount.alwaysShowSensitiveMedia || !conversation.lastStatus!!.sensitive\n                            val contentCollapsed = true\n\n                            conversation.toEntity(\n                                accountId = activeAccount.id,\n                                order = order++,\n                                expanded = expanded,\n                                contentShowing = contentShowing,\n                                contentCollapsed = contentCollapsed\n                            )\n                        }\n                )\n            }\n            return MediatorResult.Success(endOfPaginationReached = nextKey == null)\n        } catch (e: Exception) {\n            return MediatorResult.Error(e)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationsViewModel.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.conversation\n\nimport android.util.Log\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.Pager\nimport androidx.paging.PagingConfig\nimport androidx.paging.cachedIn\nimport androidx.paging.map\nimport at.connyduck.calladapter.networkresult.fold\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.usecase.TimelineCases\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.launch\n\n@HiltViewModel\nclass ConversationsViewModel @Inject constructor(\n    private val timelineCases: TimelineCases,\n    private val database: AppDatabase,\n    private val api: MastodonApi,\n    accountManager: AccountManager\n) : ViewModel() {\n\n    val activeAccountFlow = accountManager.activeAccount(viewModelScope)\n    private val accountId: Long = activeAccountFlow.value!!.id\n\n    @OptIn(ExperimentalPagingApi::class)\n    val conversationFlow = Pager(\n        config = PagingConfig(\n            pageSize = 30\n        ),\n        remoteMediator = ConversationsRemoteMediator(api, database, this),\n        pagingSourceFactory = {\n            database.conversationDao().conversationsForAccount(accountId)\n        }\n    )\n        .flow\n        .map { pagingData ->\n            pagingData.map { conversation -> conversation.toViewData() }\n        }\n        .cachedIn(viewModelScope)\n\n    fun favourite(favourite: Boolean, conversation: ConversationViewData) {\n        viewModelScope.launch {\n            timelineCases.favourite(conversation.lastStatus.id, favourite).fold({\n                val newConversation = conversation.toEntity(\n                    accountId = accountId,\n                    favourited = favourite\n                )\n\n                saveConversationToDb(newConversation)\n            }, { e ->\n                Log.w(TAG, \"failed to favourite status\", e)\n            })\n        }\n    }\n\n    fun bookmark(bookmark: Boolean, conversation: ConversationViewData) {\n        viewModelScope.launch {\n            timelineCases.bookmark(conversation.lastStatus.id, bookmark).fold({\n                val newConversation = conversation.toEntity(\n                    accountId = accountId,\n                    bookmarked = bookmark\n                )\n\n                saveConversationToDb(newConversation)\n            }, { e ->\n                Log.w(TAG, \"failed to bookmark status\", e)\n            })\n        }\n    }\n\n    fun voteInPoll(choices: List<Int>, conversation: ConversationViewData) {\n        viewModelScope.launch {\n            timelineCases.voteInPoll(\n                conversation.lastStatus.id,\n                conversation.lastStatus.status.poll?.id!!,\n                choices\n            )\n                .fold({ poll ->\n                    val newConversation = conversation.toEntity(\n                        accountId = accountId,\n                        poll = poll\n                    )\n\n                    saveConversationToDb(newConversation)\n                }, { e ->\n                    Log.w(TAG, \"failed to vote in poll\", e)\n                })\n        }\n    }\n\n    fun showPollResults(conversation: ConversationViewData) = viewModelScope.launch {\n        conversation.lastStatus.status.poll?.let { poll ->\n            saveConversationToDb(\n                conversation.toEntity(accountId = accountId, poll = poll.copy(voted = true))\n            )\n        }\n    }\n\n    fun expandHiddenStatus(expanded: Boolean, conversation: ConversationViewData) {\n        viewModelScope.launch {\n            val newConversation = conversation.toEntity(\n                accountId = accountId,\n                expanded = expanded\n            )\n            saveConversationToDb(newConversation)\n        }\n    }\n\n    fun collapseLongStatus(collapsed: Boolean, conversation: ConversationViewData) {\n        viewModelScope.launch {\n            val newConversation = conversation.toEntity(\n                accountId = accountId,\n                collapsed = collapsed\n            )\n            saveConversationToDb(newConversation)\n        }\n    }\n\n    fun showContent(showing: Boolean, conversation: ConversationViewData) {\n        viewModelScope.launch {\n            val newConversation = conversation.toEntity(\n                accountId = accountId,\n                showingHiddenContent = showing\n            )\n            saveConversationToDb(newConversation)\n        }\n    }\n\n    fun remove(conversation: ConversationViewData) {\n        viewModelScope.launch {\n            try {\n                api.deleteConversation(conversationId = conversation.id)\n\n                database.conversationDao().delete(\n                    id = conversation.id,\n                    accountId = accountId\n                )\n            } catch (e: Exception) {\n                Log.w(TAG, \"failed to delete conversation\", e)\n            }\n        }\n    }\n\n    fun muteConversation(conversation: ConversationViewData) {\n        viewModelScope.launch {\n            try {\n                timelineCases.muteConversation(\n                    conversation.lastStatus.id,\n                    !conversation.lastStatus.status.muted\n                )\n\n                val newConversation = conversation.toEntity(\n                    accountId = accountId,\n                    muted = !conversation.lastStatus.status.muted\n                )\n\n                database.conversationDao().insert(newConversation)\n            } catch (e: Exception) {\n                Log.w(TAG, \"failed to mute conversation\", e)\n            }\n        }\n    }\n\n    private suspend fun saveConversationToDb(conversation: ConversationEntity) {\n        database.conversationDao().insert(conversation)\n    }\n\n    companion object {\n        private const val TAG = \"ConversationsViewModel\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksActivity.kt",
    "content": "package com.keylesspalace.tusky.components.domainblocks\n\nimport android.os.Bundle\nimport com.keylesspalace.tusky.BaseActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ActivityAccountListBinding\nimport dagger.hilt.android.AndroidEntryPoint\n\n@AndroidEntryPoint\nclass DomainBlocksActivity : BaseActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        val binding = ActivityAccountListBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n\n        setSupportActionBar(binding.includedToolbar.toolbar)\n        supportActionBar?.apply {\n            setTitle(R.string.title_domain_mutes)\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n        }\n\n        supportFragmentManager\n            .beginTransaction()\n            .replace(R.id.fragment_container, DomainBlocksFragment())\n            .commit()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksAdapter.kt",
    "content": "package com.keylesspalace.tusky.components.domainblocks\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.paging.PagingDataAdapter\nimport com.keylesspalace.tusky.components.followedtags.FollowedTagsAdapter.Companion.STRING_COMPARATOR\nimport com.keylesspalace.tusky.databinding.ItemBlockedDomainBinding\nimport com.keylesspalace.tusky.util.BindingHolder\n\nclass DomainBlocksAdapter(\n    private val onUnmute: (String) -> Unit\n) : PagingDataAdapter<String, BindingHolder<ItemBlockedDomainBinding>>(STRING_COMPARATOR) {\n\n    override fun onCreateViewHolder(\n        parent: ViewGroup,\n        viewType: Int\n    ): BindingHolder<ItemBlockedDomainBinding> {\n        val binding = ItemBlockedDomainBinding.inflate(\n            LayoutInflater.from(parent.context),\n            parent,\n            false\n        )\n        return BindingHolder(binding)\n    }\n\n    override fun onBindViewHolder(holder: BindingHolder<ItemBlockedDomainBinding>, position: Int) {\n        getItem(position)?.let { instance ->\n            holder.binding.blockedDomain.text = instance\n            holder.binding.blockedDomainUnblock.setOnClickListener {\n                onUnmute(instance)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksFragment.kt",
    "content": "package com.keylesspalace.tusky.components.domainblocks\n\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.View\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.lifecycleScope\nimport androidx.paging.LoadState\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.FragmentDomainBlocksBinding\nimport com.keylesspalace.tusky.util.ensureBottomPadding\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.util.visible\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass DomainBlocksFragment : Fragment(R.layout.fragment_domain_blocks) {\n\n    private val binding by viewBinding(FragmentDomainBlocksBinding::bind)\n\n    private val viewModel: DomainBlocksViewModel by viewModels()\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        val adapter = DomainBlocksAdapter(viewModel::unblock)\n\n        binding.recyclerView.ensureBottomPadding()\n\n        binding.recyclerView.setHasFixedSize(true)\n        binding.recyclerView.addItemDecoration(\n            DividerItemDecoration(view.context, DividerItemDecoration.VERTICAL)\n        )\n        binding.recyclerView.adapter = adapter\n        binding.recyclerView.layoutManager = LinearLayoutManager(view.context)\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.uiEvents.collect { event ->\n                showSnackbar(event)\n            }\n        }\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.domainPager.collectLatest { pagingData ->\n                adapter.submitData(pagingData)\n            }\n        }\n\n        adapter.addLoadStateListener { loadState ->\n            binding.progressBar.visible(\n                loadState.refresh == LoadState.Loading && adapter.itemCount == 0\n            )\n\n            if (loadState.refresh is LoadState.Error) {\n                binding.recyclerView.hide()\n                binding.messageView.show()\n                val errorState = loadState.refresh as LoadState.Error\n                binding.messageView.setup(errorState.error) { adapter.retry() }\n                Log.w(TAG, \"error loading blocked domains\", errorState.error)\n            } else if (loadState.refresh is LoadState.NotLoading && adapter.itemCount == 0) {\n                binding.recyclerView.hide()\n                binding.messageView.show()\n                binding.messageView.setup(R.drawable.elephant_friend_empty, R.string.message_empty)\n            } else {\n                binding.recyclerView.show()\n                binding.messageView.hide()\n            }\n        }\n    }\n\n    private fun showSnackbar(event: SnackbarEvent) {\n        val message = if (event.throwable == null) {\n            getString(event.message, event.domain)\n        } else {\n            Log.w(TAG, event.throwable)\n            val error = event.throwable.localizedMessage ?: getString(R.string.ui_error_unknown)\n            getString(event.message, event.domain, error)\n        }\n\n        Snackbar.make(binding.recyclerView, message, Snackbar.LENGTH_LONG)\n            .setTextMaxLines(5)\n            .setAction(event.actionText, event.action)\n            .show()\n    }\n\n    companion object {\n        private const val TAG = \"DomainBlocksFragment\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksPagingSource.kt",
    "content": "package com.keylesspalace.tusky.components.domainblocks\n\nimport androidx.paging.PagingSource\nimport androidx.paging.PagingState\n\nclass DomainBlocksPagingSource(\n    private val domains: List<String>,\n    private val nextKey: String?\n) : PagingSource<String, String>() {\n    override fun getRefreshKey(state: PagingState<String, String>): String? = null\n\n    override suspend fun load(params: LoadParams<String>): LoadResult<String, String> {\n        return if (params is LoadParams.Refresh) {\n            LoadResult.Page(domains, null, nextKey)\n        } else {\n            LoadResult.Page(emptyList(), null, null)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksRemoteMediator.kt",
    "content": "package com.keylesspalace.tusky.components.domainblocks\n\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.LoadType\nimport androidx.paging.PagingState\nimport androidx.paging.RemoteMediator\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.HttpHeaderLink\nimport retrofit2.HttpException\nimport retrofit2.Response\n\n@OptIn(ExperimentalPagingApi::class)\nclass DomainBlocksRemoteMediator(\n    private val api: MastodonApi,\n    private val repository: DomainBlocksRepository\n) : RemoteMediator<String, String>() {\n\n    override suspend fun load(\n        loadType: LoadType,\n        state: PagingState<String, String>\n    ): MediatorResult {\n        return try {\n            val response = request(loadType)\n                ?: return MediatorResult.Success(endOfPaginationReached = true)\n\n            return applyResponse(response)\n        } catch (e: Exception) {\n            MediatorResult.Error(e)\n        }\n    }\n\n    private suspend fun request(loadType: LoadType): Response<List<String>>? {\n        return when (loadType) {\n            LoadType.PREPEND -> null\n            LoadType.APPEND -> api.domainBlocks(maxId = repository.nextKey)\n            LoadType.REFRESH -> {\n                repository.nextKey = null\n                repository.domains.clear()\n                api.domainBlocks()\n            }\n        }\n    }\n\n    private fun applyResponse(response: Response<List<String>>): MediatorResult {\n        val tags = response.body()\n        if (!response.isSuccessful || tags == null) {\n            return MediatorResult.Error(HttpException(response))\n        }\n\n        val links = HttpHeaderLink.parse(response.headers()[\"Link\"])\n        repository.nextKey = HttpHeaderLink.findByRelationType(links, \"next\")?.uri?.getQueryParameter(\"max_id\")\n        repository.domains.addAll(tags)\n        repository.invalidate()\n\n        return MediatorResult.Success(endOfPaginationReached = repository.nextKey == null)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksRepository.kt",
    "content": "/*\n * Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.components.domainblocks\n\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.InvalidatingPagingSourceFactory\nimport androidx.paging.Pager\nimport androidx.paging.PagingConfig\nimport androidx.paging.PagingSource\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport at.connyduck.calladapter.networkresult.onSuccess\nimport com.keylesspalace.tusky.network.MastodonApi\nimport javax.inject.Inject\n\nclass DomainBlocksRepository @Inject constructor(\n    private val api: MastodonApi\n) {\n    val domains: MutableList<String> = mutableListOf()\n    var nextKey: String? = null\n\n    private var factory = InvalidatingPagingSourceFactory {\n        DomainBlocksPagingSource(domains.toList(), nextKey)\n    }\n\n    @OptIn(ExperimentalPagingApi::class)\n    val domainPager = Pager(\n        config = PagingConfig(\n            pageSize = PAGE_SIZE,\n            initialLoadSize = PAGE_SIZE\n        ),\n        remoteMediator = DomainBlocksRemoteMediator(api, this),\n        pagingSourceFactory = factory\n    ).flow\n\n    /** Invalidate the active paging source, see [PagingSource.invalidate] */\n    fun invalidate() {\n        factory.invalidate()\n    }\n\n    suspend fun block(domain: String): NetworkResult<Unit> {\n        return api.blockDomain(domain).onSuccess {\n            domains.add(domain)\n            factory.invalidate()\n        }\n    }\n\n    suspend fun unblock(domain: String): NetworkResult<Unit> {\n        return api.unblockDomain(domain).onSuccess {\n            domains.remove(domain)\n            factory.invalidate()\n        }\n    }\n\n    companion object {\n        private const val PAGE_SIZE = 20\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksViewModel.kt",
    "content": "package com.keylesspalace.tusky.components.domainblocks\n\nimport android.view.View\nimport androidx.annotation.StringRes\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport androidx.paging.cachedIn\nimport at.connyduck.calladapter.networkresult.fold\nimport at.connyduck.calladapter.networkresult.onFailure\nimport com.keylesspalace.tusky.R\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.SharedFlow\nimport kotlinx.coroutines.flow.asSharedFlow\nimport kotlinx.coroutines.launch\n\n@HiltViewModel\nclass DomainBlocksViewModel @Inject constructor(\n    private val repo: DomainBlocksRepository\n) : ViewModel() {\n\n    val domainPager = repo.domainPager.cachedIn(viewModelScope)\n\n    private val _uiEvents = MutableSharedFlow<SnackbarEvent>()\n    val uiEvents: SharedFlow<SnackbarEvent> = _uiEvents.asSharedFlow()\n\n    fun block(domain: String) {\n        viewModelScope.launch {\n            repo.block(domain).onFailure { e ->\n                _uiEvents.emit(\n                    SnackbarEvent(\n                        message = R.string.error_blocking_domain,\n                        domain = domain,\n                        throwable = e,\n                        actionText = R.string.action_retry,\n                        action = { block(domain) }\n                    )\n                )\n            }\n        }\n    }\n\n    fun unblock(domain: String) {\n        viewModelScope.launch {\n            repo.unblock(domain).fold({\n                _uiEvents.emit(\n                    SnackbarEvent(\n                        message = R.string.confirmation_domain_unmuted,\n                        domain = domain,\n                        throwable = null,\n                        actionText = R.string.action_undo,\n                        action = { block(domain) }\n                    )\n                )\n            }, { e ->\n                _uiEvents.emit(\n                    SnackbarEvent(\n                        message = R.string.error_unblocking_domain,\n                        domain = domain,\n                        throwable = e,\n                        actionText = R.string.action_retry,\n                        action = { unblock(domain) }\n                    )\n                )\n            })\n        }\n    }\n}\n\nclass SnackbarEvent(\n    @StringRes val message: Int,\n    val domain: String,\n    val throwable: Throwable?,\n    @StringRes val actionText: Int,\n    val action: (View) -> Unit\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftHelper.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.drafts\n\nimport android.content.Context\nimport android.net.Uri\nimport android.util.Log\nimport android.webkit.MimeTypeMap\nimport androidx.core.content.FileProvider\nimport androidx.core.net.toUri\nimport com.keylesspalace.tusky.BuildConfig\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.entity.DraftAttachment\nimport com.keylesspalace.tusky.db.entity.DraftEntity\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.entity.NewPoll\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.util.copyToFile\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport java.io.File\nimport java.io.IOException\nimport java.text.SimpleDateFormat\nimport java.util.Date\nimport java.util.Locale\nimport javax.inject.Inject\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.withContext\nimport okhttp3.OkHttpClient\nimport okhttp3.Request\nimport okio.buffer\nimport okio.sink\n\nclass DraftHelper @Inject constructor(\n    @ApplicationContext val context: Context,\n    private val okHttpClient: OkHttpClient,\n    db: AppDatabase\n) {\n\n    private val draftDao = db.draftDao()\n\n    suspend fun saveDraft(\n        draftId: Int,\n        accountId: Long,\n        inReplyToId: String?,\n        content: String?,\n        contentWarning: String?,\n        sensitive: Boolean,\n        visibility: Status.Visibility,\n        mediaUris: List<String>,\n        mediaDescriptions: List<String?>,\n        mediaFocus: List<Attachment.Focus?>,\n        poll: NewPoll?,\n        failedToSend: Boolean,\n        failedToSendAlert: Boolean,\n        scheduledAt: String?,\n        language: String?,\n        statusId: String?\n    ) = withContext(Dispatchers.IO) {\n        val externalFilesDir = context.getExternalFilesDir(\"Tusky\")\n\n        if (externalFilesDir == null || !(externalFilesDir.exists())) {\n            Log.e(\"DraftHelper\", \"Error obtaining directory to save media.\")\n            throw Exception()\n        }\n\n        val draftDirectory = File(externalFilesDir, \"Drafts\")\n\n        if (!draftDirectory.exists()) {\n            draftDirectory.mkdir()\n        }\n\n        val uris = mediaUris.map { uriString ->\n            uriString.toUri()\n        }.mapIndexedNotNull { index, uri ->\n            if (uri.isInFolder(draftDirectory)) {\n                uri\n            } else {\n                uri.copyToFolder(draftDirectory, index)\n            }\n        }\n\n        val types = uris.map { uri ->\n            val mimeType = context.contentResolver.getType(uri)\n            when (mimeType?.substring(0, mimeType.indexOf('/'))) {\n                \"video\" -> DraftAttachment.Type.VIDEO\n                \"image\" -> DraftAttachment.Type.IMAGE\n                \"audio\" -> DraftAttachment.Type.AUDIO\n                else -> throw IllegalStateException(\"unknown media type\")\n            }\n        }\n\n        val attachments: List<DraftAttachment> = buildList(mediaUris.size) {\n            for (i in mediaUris.indices) {\n                add(\n                    DraftAttachment(\n                        uriString = uris[i].toString(),\n                        description = mediaDescriptions[i],\n                        focus = mediaFocus[i],\n                        type = types[i]\n                    )\n                )\n            }\n        }\n\n        val draft = DraftEntity(\n            id = draftId,\n            accountId = accountId,\n            inReplyToId = inReplyToId,\n            content = content,\n            contentWarning = contentWarning,\n            sensitive = sensitive,\n            visibility = visibility,\n            attachments = attachments,\n            poll = poll,\n            failedToSend = failedToSend,\n            failedToSendNew = failedToSendAlert,\n            scheduledAt = scheduledAt,\n            language = language,\n            statusId = statusId\n        )\n\n        draftDao.insertOrReplace(draft)\n        Log.d(\"DraftHelper\", \"saved draft to db\")\n    }\n\n    suspend fun deleteDraftAndAttachments(draftId: Int) {\n        draftDao.find(draftId)?.let { draft ->\n            deleteDraftAndAttachments(draft)\n        }\n    }\n\n    private suspend fun deleteDraftAndAttachments(draft: DraftEntity) {\n        deleteAttachments(draft)\n        draftDao.delete(draft.id)\n    }\n\n    suspend fun deleteAllDraftsAndAttachmentsForAccount(accountId: Long) {\n        draftDao.loadDrafts(accountId).forEach { draft ->\n            deleteDraftAndAttachments(draft)\n        }\n    }\n\n    suspend fun deleteAttachments(draft: DraftEntity) = withContext(Dispatchers.IO) {\n        draft.attachments.forEach { attachment ->\n            if (context.contentResolver.delete(attachment.uri, null, null) == 0) {\n                Log.e(\"DraftHelper\", \"Did not delete file ${attachment.uriString}\")\n            }\n        }\n    }\n\n    private fun Uri.isInFolder(folder: File): Boolean {\n        val filePath = path ?: return true\n        return File(filePath).parentFile == folder\n    }\n\n    private fun Uri.copyToFolder(folder: File, index: Int): Uri? {\n        val contentResolver = context.contentResolver\n        val timeStamp: String = SimpleDateFormat(\"yyyyMMdd_HHmmss\", Locale.US).format(Date())\n\n        val fileExtension = if (scheme == \"https\") {\n            lastPathSegment?.substringAfterLast('.', \"tmp\")\n        } else {\n            val mimeType = contentResolver.getType(this)\n            val map = MimeTypeMap.getSingleton()\n            map.getExtensionFromMimeType(mimeType)\n        }\n\n        val filename = \"Tusky_Draft_Media_${timeStamp}_$index.$fileExtension\"\n        val file = File(folder, filename)\n\n        if (scheme == \"https\") {\n            // saving redrafted media\n            try {\n                val request = Request.Builder().url(toString()).build()\n\n                val response = okHttpClient.newCall(request).execute()\n\n                file.sink().buffer().use { output ->\n                    response.body?.source()?.use { input ->\n                        output.writeAll(input)\n                    }\n                }\n            } catch (ex: IOException) {\n                Log.w(\"DraftHelper\", \"failed to save media\", ex)\n                return null\n            }\n        } else {\n            this.copyToFile(contentResolver, file)\n        }\n        return FileProvider.getUriForFile(\n            context,\n            BuildConfig.APPLICATION_ID + \".fileprovider\",\n            file\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftMediaAdapter.kt",
    "content": "/* Copyright 2020 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.drafts\n\nimport android.view.ViewGroup\nimport android.widget.ImageView\nimport androidx.constraintlayout.widget.ConstraintLayout\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.load.engine.DiskCacheStrategy\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.db.entity.DraftAttachment\nimport com.keylesspalace.tusky.view.MediaPreviewImageView\n\nclass DraftMediaAdapter(\n    private val attachmentClick: () -> Unit\n) : ListAdapter<DraftAttachment, DraftMediaAdapter.DraftMediaViewHolder>(\n    object : DiffUtil.ItemCallback<DraftAttachment>() {\n        override fun areItemsTheSame(oldItem: DraftAttachment, newItem: DraftAttachment): Boolean {\n            return oldItem == newItem\n        }\n\n        override fun areContentsTheSame(\n            oldItem: DraftAttachment,\n            newItem: DraftAttachment\n        ): Boolean {\n            return oldItem == newItem\n        }\n    }\n) {\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DraftMediaViewHolder {\n        return DraftMediaViewHolder(MediaPreviewImageView(parent.context))\n    }\n\n    override fun onBindViewHolder(holder: DraftMediaViewHolder, position: Int) {\n        getItem(position)?.let { attachment ->\n            if (attachment.type == DraftAttachment.Type.AUDIO) {\n                holder.imageView.clearFocus()\n                holder.imageView.setImageResource(R.drawable.audio_file_preview)\n            } else {\n                if (attachment.focus != null) {\n                    holder.imageView.setFocalPoint(attachment.focus)\n                } else {\n                    holder.imageView.clearFocus()\n                }\n                var glide = Glide.with(holder.itemView.context)\n                    .load(attachment.uri)\n                    .diskCacheStrategy(DiskCacheStrategy.NONE)\n                    .dontAnimate()\n                    .centerInside()\n\n                if (attachment.focus != null) {\n                    glide = glide.addListener(holder.imageView)\n                }\n\n                glide.into(holder.imageView)\n            }\n        }\n    }\n\n    inner class DraftMediaViewHolder(val imageView: MediaPreviewImageView) :\n        RecyclerView.ViewHolder(imageView) {\n        init {\n            val thumbnailViewSize =\n                imageView.context.resources.getDimensionPixelSize(\n                    R.dimen.compose_media_preview_size\n                )\n            val layoutParams = ConstraintLayout.LayoutParams(thumbnailViewSize, thumbnailViewSize)\n            val margin = itemView.context.resources\n                .getDimensionPixelSize(R.dimen.compose_media_preview_margin)\n            val marginBottom = itemView.context.resources\n                .getDimensionPixelSize(R.dimen.compose_media_preview_margin_bottom)\n            layoutParams.setMargins(margin, 0, margin, marginBottom)\n            imageView.layoutParams = layoutParams\n            imageView.scaleType = ImageView.ScaleType.CENTER_CROP\n            imageView.setOnClickListener {\n                attachmentClick()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftsActivity.kt",
    "content": "/* Copyright 2020 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.drafts\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.util.Log\nimport android.widget.LinearLayout\nimport android.widget.Toast\nimport androidx.activity.viewModels\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport at.connyduck.calladapter.networkresult.fold\nimport com.google.android.material.bottomsheet.BottomSheetBehavior\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.BaseActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.compose.ComposeActivity\nimport com.keylesspalace.tusky.databinding.ActivityDraftsBinding\nimport com.keylesspalace.tusky.db.DraftsAlert\nimport com.keylesspalace.tusky.db.entity.DraftEntity\nimport com.keylesspalace.tusky.util.ensureBottomPadding\nimport com.keylesspalace.tusky.util.isHttpNotFound\nimport com.keylesspalace.tusky.util.parseAsMastodonHtml\nimport com.keylesspalace.tusky.util.visible\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass DraftsActivity : BaseActivity(), DraftActionListener {\n\n    @Inject\n    lateinit var draftsAlert: DraftsAlert\n\n    private val viewModel: DraftsViewModel by viewModels()\n\n    private lateinit var binding: ActivityDraftsBinding\n    private lateinit var bottomSheet: BottomSheetBehavior<LinearLayout>\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        binding = ActivityDraftsBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n\n        setSupportActionBar(binding.includedToolbar.toolbar)\n        supportActionBar?.apply {\n            title = getString(R.string.title_drafts)\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n        }\n\n        binding.draftsRecyclerView.ensureBottomPadding()\n\n        binding.draftsErrorMessageView.setup(R.drawable.elephant_friend_empty, R.string.no_drafts)\n\n        val adapter = DraftsAdapter(this)\n\n        binding.draftsRecyclerView.adapter = adapter\n        binding.draftsRecyclerView.layoutManager = LinearLayoutManager(this)\n        binding.draftsRecyclerView.addItemDecoration(\n            DividerItemDecoration(this, DividerItemDecoration.VERTICAL)\n        )\n\n        bottomSheet = BottomSheetBehavior.from(binding.bottomSheet.root)\n\n        lifecycleScope.launch {\n            viewModel.drafts.collectLatest { draftData ->\n                adapter.submitData(draftData)\n            }\n        }\n\n        adapter.addLoadStateListener {\n            binding.draftsErrorMessageView.visible(adapter.itemCount == 0)\n        }\n\n        // If a failed post is saved to drafts while this activity is up, do nothing; the user is already in the drafts view.\n        draftsAlert.observeInContext(this, false)\n    }\n\n    override fun onOpenDraft(draft: DraftEntity) {\n        if (draft.inReplyToId == null) {\n            openDraftWithoutReply(draft)\n            return\n        }\n\n        val context = this as Context\n\n        lifecycleScope.launch {\n            bottomSheet.state = BottomSheetBehavior.STATE_COLLAPSED\n            viewModel.getStatus(draft.inReplyToId)\n                .fold(\n                    { status ->\n                        val composeOptions = ComposeActivity.ComposeOptions(\n                            draftId = draft.id,\n                            content = draft.content,\n                            contentWarning = draft.contentWarning,\n                            inReplyToId = draft.inReplyToId,\n                            replyingStatusContent = status.content.parseAsMastodonHtml().toString(),\n                            replyingStatusAuthor = status.account.localUsername,\n                            draftAttachments = draft.attachments,\n                            poll = draft.poll,\n                            sensitive = draft.sensitive,\n                            visibility = draft.visibility,\n                            scheduledAt = draft.scheduledAt,\n                            language = draft.language,\n                            statusId = draft.statusId,\n                            kind = ComposeActivity.ComposeKind.EDIT_DRAFT\n                        )\n\n                        bottomSheet.state = BottomSheetBehavior.STATE_HIDDEN\n\n                        startActivity(ComposeActivity.startIntent(context, composeOptions))\n                    },\n                    { throwable ->\n                        bottomSheet.state = BottomSheetBehavior.STATE_HIDDEN\n\n                        Log.w(TAG, \"failed loading reply information\", throwable)\n\n                        if (throwable.isHttpNotFound()) {\n                            // the original status to which a reply was drafted has been deleted\n                            // let's open the ComposeActivity without reply information\n                            Toast.makeText(\n                                context,\n                                getString(R.string.drafts_post_reply_removed),\n                                Toast.LENGTH_LONG\n                            ).show()\n                            openDraftWithoutReply(draft)\n                        } else {\n                            Snackbar.make(\n                                binding.root,\n                                getString(R.string.drafts_failed_loading_reply),\n                                Snackbar.LENGTH_SHORT\n                            )\n                                .show()\n                        }\n                    }\n                )\n        }\n    }\n\n    private fun openDraftWithoutReply(draft: DraftEntity) {\n        val composeOptions = ComposeActivity.ComposeOptions(\n            draftId = draft.id,\n            content = draft.content,\n            contentWarning = draft.contentWarning,\n            draftAttachments = draft.attachments,\n            poll = draft.poll,\n            sensitive = draft.sensitive,\n            visibility = draft.visibility,\n            scheduledAt = draft.scheduledAt,\n            language = draft.language,\n            statusId = draft.statusId,\n            kind = ComposeActivity.ComposeKind.EDIT_DRAFT\n        )\n\n        startActivity(ComposeActivity.startIntent(this, composeOptions))\n    }\n\n    override fun onDeleteDraft(draft: DraftEntity) {\n        viewModel.deleteDraft(draft)\n        Snackbar.make(binding.root, getString(R.string.draft_deleted), Snackbar.LENGTH_LONG)\n            .setAction(R.string.action_undo) {\n                viewModel.restoreDraft(draft)\n            }\n            .show()\n    }\n\n    companion object {\n        const val TAG = \"DraftsActivity\"\n\n        fun newIntent(context: Context) = Intent(context, DraftsActivity::class.java)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftsAdapter.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.drafts\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.paging.PagingDataAdapter\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.databinding.ItemDraftBinding\nimport com.keylesspalace.tusky.db.entity.DraftEntity\nimport com.keylesspalace.tusky.util.BindingHolder\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.visible\n\ninterface DraftActionListener {\n    fun onOpenDraft(draft: DraftEntity)\n    fun onDeleteDraft(draft: DraftEntity)\n}\n\nclass DraftsAdapter(\n    private val listener: DraftActionListener\n) : PagingDataAdapter<DraftEntity, BindingHolder<ItemDraftBinding>>(\n    object : DiffUtil.ItemCallback<DraftEntity>() {\n        override fun areItemsTheSame(oldItem: DraftEntity, newItem: DraftEntity): Boolean {\n            return oldItem.id == newItem.id\n        }\n\n        override fun areContentsTheSame(oldItem: DraftEntity, newItem: DraftEntity): Boolean {\n            return oldItem == newItem\n        }\n    }\n) {\n\n    override fun onCreateViewHolder(\n        parent: ViewGroup,\n        viewType: Int\n    ): BindingHolder<ItemDraftBinding> {\n        val binding = ItemDraftBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n\n        val viewHolder = BindingHolder(binding)\n\n        binding.draftMediaPreview.layoutManager = LinearLayoutManager(binding.root.context, RecyclerView.HORIZONTAL, false)\n        binding.draftMediaPreview.adapter = DraftMediaAdapter {\n            getItem(viewHolder.bindingAdapterPosition)?.let { draft ->\n                listener.onOpenDraft(draft)\n            }\n        }\n\n        return viewHolder\n    }\n\n    override fun onBindViewHolder(holder: BindingHolder<ItemDraftBinding>, position: Int) {\n        getItem(position)?.let { draft ->\n            holder.binding.root.setOnClickListener {\n                listener.onOpenDraft(draft)\n            }\n            holder.binding.deleteButton.setOnClickListener {\n                listener.onDeleteDraft(draft)\n            }\n            holder.binding.draftSendingInfo.visible(draft.failedToSend)\n\n            holder.binding.contentWarning.visible(!draft.contentWarning.isNullOrEmpty())\n            holder.binding.contentWarning.text = draft.contentWarning\n            holder.binding.content.text = draft.content\n\n            holder.binding.draftMediaPreview.visible(draft.attachments.isNotEmpty())\n            (holder.binding.draftMediaPreview.adapter as DraftMediaAdapter).submitList(\n                draft.attachments\n            )\n\n            if (draft.poll != null) {\n                holder.binding.draftPoll.show()\n                holder.binding.draftPoll.setPoll(draft.poll)\n            } else {\n                holder.binding.draftPoll.hide()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftsViewModel.kt",
    "content": "/* Copyright 2020 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.drafts\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport androidx.paging.Pager\nimport androidx.paging.PagingConfig\nimport androidx.paging.cachedIn\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.entity.DraftEntity\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.network.MastodonApi\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.launch\n\n@HiltViewModel\nclass DraftsViewModel @Inject constructor(\n    val database: AppDatabase,\n    val accountManager: AccountManager,\n    val api: MastodonApi,\n    private val draftHelper: DraftHelper\n) : ViewModel() {\n\n    val drafts = Pager(\n        config = PagingConfig(\n            pageSize = 20\n        ),\n        pagingSourceFactory = {\n            database.draftDao().draftsPagingSource(\n                accountManager.activeAccount?.id!!\n            )\n        }\n    ).flow\n        .cachedIn(viewModelScope)\n\n    private val deletedDrafts: MutableList<DraftEntity> = mutableListOf()\n\n    fun deleteDraft(draft: DraftEntity) {\n        // this does not immediately delete media files to avoid unnecessary file operations\n        // in case the user decides to restore the draft\n        viewModelScope.launch {\n            database.draftDao().delete(draft.id)\n            deletedDrafts.add(draft)\n        }\n    }\n\n    fun restoreDraft(draft: DraftEntity) {\n        viewModelScope.launch {\n            database.draftDao().insertOrReplace(draft)\n            deletedDrafts.remove(draft)\n        }\n    }\n\n    suspend fun getStatus(statusId: String): NetworkResult<Status> {\n        return api.status(statusId)\n    }\n\n    override fun onCleared() {\n        viewModelScope.launch {\n            deletedDrafts.forEach {\n                draftHelper.deleteAttachments(it)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/filters/EditFilterActivity.kt",
    "content": "/* Copyright 2024 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.filters\n\nimport android.content.DialogInterface.BUTTON_POSITIVE\nimport android.os.Bundle\nimport android.view.WindowManager\nimport android.widget.AdapterView\nimport androidx.activity.viewModels\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat.Type.systemBars\nimport androidx.core.view.size\nimport androidx.core.view.updatePadding\nimport androidx.core.widget.doAfterTextChanged\nimport androidx.lifecycle.lifecycleScope\nimport at.connyduck.calladapter.networkresult.fold\nimport com.google.android.material.chip.Chip\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.android.material.materialswitch.MaterialSwitch\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.BaseActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.FilterUpdatedEvent\nimport com.keylesspalace.tusky.components.instanceinfo.InstanceInfoRepository\nimport com.keylesspalace.tusky.databinding.ActivityEditFilterBinding\nimport com.keylesspalace.tusky.databinding.DialogFilterBinding\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.entity.FilterKeyword\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.getParcelableExtraCompat\nimport com.keylesspalace.tusky.util.isHttpNotFound\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.util.visible\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass EditFilterActivity : BaseActivity() {\n    @Inject\n    lateinit var api: MastodonApi\n\n    @Inject\n    lateinit var eventHub: EventHub\n\n    @Inject\n    lateinit var instanceInfoRepository: InstanceInfoRepository\n\n    private val binding by viewBinding(ActivityEditFilterBinding::inflate)\n    private val viewModel: EditFilterViewModel by viewModels()\n\n    private lateinit var filter: Filter\n    private var originalFilter: Filter? = null\n    private lateinit var contextSwitches: Map<MaterialSwitch, Filter.Kind>\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        originalFilter = intent.getParcelableExtraCompat(FILTER_TO_EDIT)\n        filter = originalFilter ?: Filter(context = emptyList(), action = Filter.Action.WARN)\n        binding.apply {\n            contextSwitches = mapOf(\n                filterContextHome to Filter.Kind.HOME,\n                filterContextNotifications to Filter.Kind.NOTIFICATIONS,\n                filterContextPublic to Filter.Kind.PUBLIC,\n                filterContextThread to Filter.Kind.THREAD,\n                filterContextAccount to Filter.Kind.ACCOUNT\n            )\n        }\n\n        setContentView(binding.root)\n        setSupportActionBar(binding.includedToolbar.toolbar)\n        supportActionBar?.run {\n            // Back button\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n        }\n\n        setTitle(\n            if (originalFilter == null) {\n                R.string.filter_addition_title\n            } else {\n                R.string.filter_edit_title\n            }\n        )\n\n        ViewCompat.setOnApplyWindowInsetsListener(binding.scrollView) { scrollView, insets ->\n            val systemBarsInsets = insets.getInsets(systemBars())\n            scrollView.updatePadding(bottom = systemBarsInsets.bottom)\n            insets.inset(0, 0, 0, systemBarsInsets.bottom)\n        }\n\n        binding.actionChip.setOnClickListener { showAddKeywordDialog() }\n        binding.filterSaveButton.setOnClickListener { saveChanges() }\n        binding.filterDeleteButton.setOnClickListener {\n            lifecycleScope.launch {\n                if (showDeleteFilterDialog(filter.title) == BUTTON_POSITIVE) deleteFilter()\n            }\n        }\n        binding.filterDeleteButton.visible(originalFilter != null)\n\n        for (switch in contextSwitches.keys) {\n            switch.setOnCheckedChangeListener { _, isChecked ->\n                val context = contextSwitches[switch]!!\n                if (isChecked) {\n                    viewModel.addContext(context)\n                } else {\n                    viewModel.removeContext(context)\n                }\n                validateSaveButton()\n            }\n        }\n        binding.filterTitle.doAfterTextChanged { editable ->\n            viewModel.setTitle(editable.toString())\n            validateSaveButton()\n        }\n\n        // blur filter is supported in mastodon api version 5+\n        val blurFilterSupported = instanceInfoRepository.cachedInstanceInfoOrFallback.mastodonApiVersion?.let { it >= 5 } == true\n        binding.filterActionBlur.visible(blurFilterSupported)\n        binding.filterActionGroup.setOnCheckedChangeListener { _, checkedId ->\n            val action = when (checkedId) {\n                R.id.filter_action_blur -> Filter.Action.BLUR\n                R.id.filter_action_hide -> Filter.Action.HIDE\n                else -> Filter.Action.WARN\n            }\n            viewModel.setAction(action)\n        }\n        binding.filterDurationDropDown.onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ ->\n            viewModel.setDuration(\n                if (originalFilter?.expiresAt == null) {\n                    position\n                } else {\n                    position - 1\n                }\n            )\n        }\n        validateSaveButton()\n\n        if (originalFilter == null) {\n            binding.filterActionWarn.isChecked = true\n            initializeDurationDropDown(false)\n        } else {\n            loadFilter()\n        }\n        observeModel()\n    }\n\n    private fun observeModel() {\n        lifecycleScope.launch {\n            viewModel.title.collect { title ->\n                if (title != binding.filterTitle.text.toString()) {\n                    // We also get this callback when typing in the field,\n                    // which messes with the cursor focus\n                    binding.filterTitle.setText(title)\n                }\n            }\n        }\n        lifecycleScope.launch {\n            viewModel.keywords.collect { keywords ->\n                updateKeywords(keywords)\n            }\n        }\n        lifecycleScope.launch {\n            viewModel.contexts.collect { contexts ->\n                for (entry in contextSwitches) {\n                    entry.key.isChecked = contexts.contains(entry.value)\n                }\n            }\n        }\n        lifecycleScope.launch {\n            viewModel.action.collect { action ->\n                when (action) {\n                    Filter.Action.BLUR -> binding.filterActionBlur.isChecked = true\n                    Filter.Action.HIDE -> binding.filterActionHide.isChecked = true\n                    else -> binding.filterActionWarn.isChecked = true\n                }\n            }\n        }\n    }\n\n    // Populate the UI from the filter's members\n    private fun loadFilter() {\n        viewModel.load(filter)\n        initializeDurationDropDown(withNoChange = filter.expiresAt != null)\n    }\n\n    private fun initializeDurationDropDown(withNoChange: Boolean) {\n        val durationNames = if (withNoChange) {\n            arrayOf(getString(R.string.duration_no_change)) + resources.getStringArray(R.array.filter_duration_names)\n        } else {\n            resources.getStringArray(R.array.filter_duration_names)\n        }\n        binding.filterDurationDropDown.setSimpleItems(durationNames)\n        binding.filterDurationDropDown.setText(durationNames[0], false)\n    }\n\n    private fun updateKeywords(newKeywords: List<FilterKeyword>) {\n        newKeywords.forEachIndexed { index, filterKeyword ->\n            val chip = binding.keywordChips.getChildAt(index).takeUnless {\n                it.id == R.id.actionChip\n            } as Chip? ?: Chip(this).apply {\n                setCloseIconResource(R.drawable.ic_cancel_24dp_filled)\n                isCheckable = false\n                binding.keywordChips.addView(this, binding.keywordChips.size - 1)\n            }\n\n            chip.text = if (filterKeyword.wholeWord) {\n                binding.root.context.getString(\n                    R.string.filter_keyword_display_format,\n                    filterKeyword.keyword\n                )\n            } else {\n                filterKeyword.keyword\n            }\n            chip.isCloseIconVisible = true\n            chip.setOnClickListener {\n                showEditKeywordDialog(newKeywords[index])\n            }\n            chip.setOnCloseIconClickListener {\n                viewModel.deleteKeyword(newKeywords[index])\n            }\n        }\n\n        while (binding.keywordChips.size - 1 > newKeywords.size) {\n            binding.keywordChips.removeViewAt(newKeywords.size)\n        }\n\n        filter = filter.copy(keywords = newKeywords)\n        validateSaveButton()\n    }\n\n    private fun showAddKeywordDialog() {\n        val binding = DialogFilterBinding.inflate(layoutInflater)\n        binding.phraseWholeWord.isChecked = true\n        val dialog = MaterialAlertDialogBuilder(this)\n            .setTitle(R.string.filter_keyword_addition_title)\n            .setView(binding.root)\n            .setPositiveButton(android.R.string.ok) { _, _ ->\n                viewModel.addKeyword(\n                    FilterKeyword(\n                        \"\",\n                        binding.phraseEditText.text.toString(),\n                        binding.phraseWholeWord.isChecked\n                    )\n                )\n            }\n            .setNegativeButton(android.R.string.cancel, null)\n            .show()\n\n        dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)\n\n        val editText = binding.phraseEditText\n        editText.requestFocus()\n        editText.setSelection(editText.length())\n    }\n\n    private fun showEditKeywordDialog(keyword: FilterKeyword) {\n        val binding = DialogFilterBinding.inflate(layoutInflater)\n        binding.phraseEditText.setText(keyword.keyword)\n        binding.phraseWholeWord.isChecked = keyword.wholeWord\n\n        val dialog = MaterialAlertDialogBuilder(this)\n            .setTitle(R.string.filter_edit_keyword_title)\n            .setView(binding.root)\n            .setPositiveButton(R.string.filter_dialog_update_button) { _, _ ->\n                viewModel.modifyKeyword(\n                    keyword,\n                    keyword.copy(\n                        keyword = binding.phraseEditText.text.toString(),\n                        wholeWord = binding.phraseWholeWord.isChecked\n                    )\n                )\n            }\n            .setNegativeButton(android.R.string.cancel, null)\n            .show()\n\n        dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)\n\n        val editText = binding.phraseEditText\n        editText.requestFocus()\n        editText.setSelection(editText.length())\n    }\n\n    private fun validateSaveButton() {\n        binding.filterSaveButton.isEnabled = viewModel.validate()\n    }\n\n    private fun saveChanges() {\n        // TODO use a progress bar here (see EditProfileActivity/activity_edit_profile.xml for example)?\n\n        lifecycleScope.launch {\n            if (viewModel.saveChanges(this@EditFilterActivity)) {\n                finish()\n                // Possibly affected contexts: any context affected by the original filter OR any context affected by the updated filter\n                val affectedContexts = viewModel.contexts.value\n                    .union(originalFilter?.context.orEmpty())\n                    .distinct()\n                eventHub.dispatch(FilterUpdatedEvent(affectedContexts))\n            } else {\n                Snackbar.make(\n                    binding.root,\n                    getString(R.string.error_saving_filter, viewModel.title.value),\n                    Snackbar.LENGTH_SHORT\n                ).show()\n            }\n        }\n    }\n\n    private fun deleteFilter() {\n        originalFilter?.let { filter ->\n            lifecycleScope.launch {\n                api.deleteFilter(filter.id).fold(\n                    {\n                        finish()\n                    },\n                    { throwable ->\n                        if (throwable.isHttpNotFound()) {\n                            api.deleteFilterV1(filter.id).fold(\n                                {\n                                    finish()\n                                },\n                                {\n                                    Snackbar.make(\n                                        binding.root,\n                                        getString(R.string.error_deleting_filter, filter.title),\n                                        Snackbar.LENGTH_SHORT\n                                    ).show()\n                                }\n                            )\n                        } else {\n                            Snackbar.make(\n                                binding.root,\n                                getString(R.string.error_deleting_filter, filter.title),\n                                Snackbar.LENGTH_SHORT\n                            ).show()\n                        }\n                    }\n                )\n            }\n        }\n    }\n\n    companion object {\n        const val FILTER_TO_EDIT = \"FilterToEdit\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/filters/EditFilterViewModel.kt",
    "content": "/* Copyright 2024 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.filters\n\nimport android.content.Context\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport at.connyduck.calladapter.networkresult.fold\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.entity.FilterKeyword\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.isHttpNotFound\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport kotlinx.coroutines.withContext\n\n@HiltViewModel\nclass EditFilterViewModel @Inject constructor(val api: MastodonApi) : ViewModel() {\n    private var originalFilter: Filter? = null\n\n    private val _title = MutableStateFlow(\"\")\n    val title: StateFlow<String> = _title.asStateFlow()\n\n    private val _keywords = MutableStateFlow(listOf<FilterKeyword>())\n    val keywords: StateFlow<List<FilterKeyword>> = _keywords.asStateFlow()\n\n    private val _action = MutableStateFlow(Filter.Action.WARN)\n    val action: StateFlow<Filter.Action> = _action.asStateFlow()\n\n    private val _duration = MutableStateFlow(0)\n    val duration: StateFlow<Int> = _duration.asStateFlow()\n\n    private val _contexts = MutableStateFlow(listOf<Filter.Kind>())\n    val contexts: StateFlow<List<Filter.Kind>> = _contexts.asStateFlow()\n\n    fun load(filter: Filter) {\n        originalFilter = filter\n        _title.value = filter.title\n        _keywords.value = filter.keywords\n        _action.value = filter.action\n        _duration.value = if (filter.expiresAt == null) {\n            0\n        } else {\n            -1\n        }\n        _contexts.value = filter.context\n    }\n\n    fun addKeyword(keyword: FilterKeyword) {\n        _keywords.value += keyword\n    }\n\n    fun deleteKeyword(keyword: FilterKeyword) {\n        _keywords.value = _keywords.value.filterNot { it == keyword }\n    }\n\n    fun modifyKeyword(original: FilterKeyword, updated: FilterKeyword) {\n        val index = _keywords.value.indexOf(original)\n        if (index >= 0) {\n            _keywords.value = _keywords.value.toMutableList().apply {\n                set(index, updated)\n            }\n        }\n    }\n\n    fun setTitle(title: String) {\n        this._title.value = title\n    }\n\n    fun setDuration(index: Int) {\n        _duration.value = index\n    }\n\n    fun setAction(action: Filter.Action) {\n        this._action.value = action\n    }\n\n    fun addContext(context: Filter.Kind) {\n        if (!_contexts.value.contains(context)) {\n            _contexts.value += context\n        }\n    }\n\n    fun removeContext(context: Filter.Kind) {\n        _contexts.value = _contexts.value.filter { it != context }\n    }\n\n    fun validate(): Boolean {\n        return _title.value.isNotBlank() &&\n            _keywords.value.isNotEmpty() &&\n            _contexts.value.isNotEmpty()\n    }\n\n    suspend fun saveChanges(context: Context): Boolean {\n        val contexts = _contexts.value\n        val title = _title.value\n        val durationIndex = _duration.value\n        val action = _action.value\n\n        return withContext(viewModelScope.coroutineContext) {\n            originalFilter?.let { filter ->\n                updateFilter(filter, title, contexts, action, durationIndex, context)\n            } ?: createFilter(title, contexts, action, durationIndex, context)\n        }\n    }\n\n    private suspend fun createFilter(\n        title: String,\n        contexts: List<Filter.Kind>,\n        action: Filter.Action,\n        durationIndex: Int,\n        context: Context\n    ): Boolean {\n        val expiration = getExpirationForDurationIndex(durationIndex, context)\n        api.createFilter(\n            title = title,\n            context = contexts,\n            filterAction = action,\n            expiresIn = expiration\n        ).fold(\n            { newFilter ->\n                // This is _terrible_, but the all-in-one update filter api Just Doesn't Work\n                return _keywords.value.map { keyword ->\n                    api.addFilterKeyword(\n                        filterId = newFilter.id,\n                        keyword = keyword.keyword,\n                        wholeWord = keyword.wholeWord\n                    )\n                }.none { it.isFailure }\n            },\n            { throwable ->\n                return (\n                    throwable.isHttpNotFound() &&\n                        // Endpoint not found, fall back to v1 api\n                        createFilterV1(contexts.map(Filter.Kind::kind), expiration)\n                    )\n            }\n        )\n    }\n\n    private suspend fun updateFilter(\n        originalFilter: Filter,\n        title: String,\n        contexts: List<Filter.Kind>,\n        action: Filter.Action,\n        durationIndex: Int,\n        context: Context\n    ): Boolean {\n        val expiration = getExpirationForDurationIndex(durationIndex, context)\n        api.updateFilter(\n            id = originalFilter.id,\n            title = title,\n            context = contexts,\n            filterAction = action,\n            expires = expiration\n        ).fold(\n            {\n                // This is _terrible_, but the all-in-one update filter api Just Doesn't Work\n                val results = _keywords.value.map { keyword ->\n                    if (keyword.id.isEmpty()) {\n                        api.addFilterKeyword(filterId = originalFilter.id, keyword = keyword.keyword, wholeWord = keyword.wholeWord)\n                    } else {\n                        api.updateFilterKeyword(keywordId = keyword.id, keyword = keyword.keyword, wholeWord = keyword.wholeWord)\n                    }\n                } + originalFilter.keywords.filter { keyword ->\n                    // Deleted keywords\n                    _keywords.value.none { it.id == keyword.id }\n                }.map { api.deleteFilterKeyword(it.id) }\n\n                return results.none { it.isFailure }\n            },\n            { throwable ->\n                if (throwable.isHttpNotFound()) {\n                    // Endpoint not found, fall back to v1 api\n                    if (updateFilterV1(contexts.map(Filter.Kind::kind), expiration)) {\n                        return true\n                    }\n                }\n                return false\n            }\n        )\n    }\n\n    private suspend fun createFilterV1(context: List<String>, expiration: FilterExpiration?): Boolean {\n        return _keywords.value.map { keyword ->\n            api.createFilterV1(keyword.keyword, context, false, keyword.wholeWord, expiration)\n        }.none { it.isFailure }\n    }\n\n    private suspend fun updateFilterV1(context: List<String>, expiration: FilterExpiration?): Boolean {\n        val results = _keywords.value.map { keyword ->\n            if (originalFilter == null) {\n                api.createFilterV1(\n                    phrase = keyword.keyword,\n                    context = context,\n                    irreversible = false,\n                    wholeWord = keyword.wholeWord,\n                    expiresIn = expiration\n                )\n            } else {\n                api.updateFilterV1(\n                    id = originalFilter!!.id,\n                    phrase = keyword.keyword,\n                    context = context,\n                    irreversible = false,\n                    wholeWord = keyword.wholeWord,\n                    expiresIn = expiration\n                )\n            }\n        }\n        // Don't handle deleted keywords here because there's only one keyword per v1 filter anyway\n\n        return results.none { it.isFailure }\n    }\n\n    companion object {\n        // Mastodon *stores* the absolute date in the filter,\n        // but create/edit take a number of seconds (relative to the time the operation is posted)\n        private fun getExpirationForDurationIndex(index: Int, context: Context): FilterExpiration? {\n            return when (index) {\n                -1 -> FilterExpiration.unchanged\n                0 -> FilterExpiration.never\n                else -> FilterExpiration.seconds(\n                    context.resources.getIntArray(R.array.filter_duration_values)[index]\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/filters/FilterExpiration.kt",
    "content": "/* Copyright 2024 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.filters\n\nimport kotlin.jvm.JvmInline\n\n/**\n * Custom class to have typesafety for filter expirations.\n * Retrofit will call toString when sending this class as part of a form-urlencoded body.\n */\n@JvmInline\nvalue class FilterExpiration private constructor(val seconds: Int) {\n\n    override fun toString(): String {\n        return if (seconds < 0) \"\" else seconds.toString()\n    }\n\n    companion object {\n        val unchanged: FilterExpiration? = null\n        val never: FilterExpiration = FilterExpiration(-1)\n\n        fun seconds(seconds: Int): FilterExpiration = FilterExpiration(seconds)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/filters/FilterExtensions.kt",
    "content": "/*\n * Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.components.filters\n\nimport android.app.Activity\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.util.await\n\ninternal suspend fun Activity.showDeleteFilterDialog(filterTitle: String): Int {\n    return MaterialAlertDialogBuilder(this)\n        .setMessage(getString(R.string.dialog_delete_filter_text, filterTitle))\n        .setCancelable(true)\n        .create()\n        .await(R.string.dialog_delete_filter_positive_action, android.R.string.cancel)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/filters/FiltersActivity.kt",
    "content": "package com.keylesspalace.tusky.components.filters\n\nimport android.content.DialogInterface.BUTTON_POSITIVE\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.activity.viewModels\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport com.keylesspalace.tusky.BaseActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ActivityFiltersBinding\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.util.ensureBottomMargin\nimport com.keylesspalace.tusky.util.ensureBottomPadding\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.launchAndRepeatOnLifecycle\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.util.visible\nimport com.keylesspalace.tusky.util.withSlideInAnimation\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass FiltersActivity : BaseActivity(), FiltersListener {\n\n    private val binding by viewBinding(ActivityFiltersBinding::inflate)\n    private val viewModel: FiltersViewModel by viewModels()\n\n    private val editFilterLauncher =\n        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {\n            // refresh the filters upon returning from EditFilterActivity\n            reloadFilters()\n        }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        setContentView(binding.root)\n        setSupportActionBar(binding.includedToolbar.toolbar)\n        supportActionBar?.run {\n            // Back button\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n        }\n\n        binding.filtersList.ensureBottomPadding(fab = true)\n        binding.addFilterButton.ensureBottomMargin()\n\n        binding.addFilterButton.setOnClickListener {\n            launchEditFilterActivity()\n        }\n\n        binding.swipeRefreshLayout.setOnRefreshListener { reloadFilters() }\n\n        setTitle(R.string.pref_title_timeline_filters)\n\n        binding.filtersList.addItemDecoration(\n            DividerItemDecoration(this, DividerItemDecoration.VERTICAL)\n        )\n\n        observeViewModel()\n    }\n\n    private fun observeViewModel() {\n        launchAndRepeatOnLifecycle {\n            viewModel.state.collect { state ->\n                binding.progressBar.visible(\n                    state.loadingState == FiltersViewModel.LoadingState.LOADING\n                )\n                binding.swipeRefreshLayout.isRefreshing = state.loadingState == FiltersViewModel.LoadingState.LOADING\n                binding.addFilterButton.visible(\n                    state.loadingState == FiltersViewModel.LoadingState.LOADED\n                )\n\n                when (state.loadingState) {\n                    FiltersViewModel.LoadingState.INITIAL, FiltersViewModel.LoadingState.LOADING -> binding.messageView.hide()\n                    FiltersViewModel.LoadingState.ERROR_NETWORK -> {\n                        binding.messageView.setup(\n                            R.drawable.errorphant_offline,\n                            R.string.error_network\n                        ) {\n                            reloadFilters()\n                        }\n                        binding.messageView.show()\n                    }\n                    FiltersViewModel.LoadingState.ERROR_OTHER -> {\n                        binding.messageView.setup(\n                            R.drawable.errorphant_error,\n                            R.string.error_generic\n                        ) {\n                            reloadFilters()\n                        }\n                        binding.messageView.show()\n                    }\n                    FiltersViewModel.LoadingState.LOADED -> {\n                        binding.filtersList.adapter = FiltersAdapter(this@FiltersActivity, state.filters)\n                        if (state.filters.isEmpty()) {\n                            binding.messageView.setup(\n                                R.drawable.elephant_friend_empty,\n                                R.string.message_empty,\n                                null\n                            )\n                            binding.messageView.show()\n                        } else {\n                            binding.messageView.hide()\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    private fun reloadFilters() {\n        viewModel.reload()\n    }\n\n    private fun launchEditFilterActivity(filter: Filter? = null) {\n        val intent = Intent(this, EditFilterActivity::class.java).apply {\n            if (filter != null) {\n                putExtra(EditFilterActivity.FILTER_TO_EDIT, filter)\n            }\n        }.withSlideInAnimation()\n        editFilterLauncher.launch(intent)\n    }\n\n    override fun deleteFilter(filter: Filter) {\n        lifecycleScope.launch {\n            if (showDeleteFilterDialog(filter.title) == BUTTON_POSITIVE) {\n                viewModel.deleteFilter(filter, binding.root)\n            }\n        }\n    }\n\n    override fun updateFilter(updatedFilter: Filter) {\n        launchEditFilterActivity(updatedFilter)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/filters/FiltersAdapter.kt",
    "content": "package com.keylesspalace.tusky.components.filters\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemRemovableBinding\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.util.BindingHolder\nimport com.keylesspalace.tusky.util.getRelativeTimeSpanString\n\nclass FiltersAdapter(val listener: FiltersListener, val filters: List<Filter>) :\n    RecyclerView.Adapter<BindingHolder<ItemRemovableBinding>>() {\n\n    override fun getItemCount(): Int = filters.size\n\n    override fun onCreateViewHolder(\n        parent: ViewGroup,\n        viewType: Int\n    ): BindingHolder<ItemRemovableBinding> {\n        return BindingHolder(\n            ItemRemovableBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n        )\n    }\n\n    override fun onBindViewHolder(holder: BindingHolder<ItemRemovableBinding>, position: Int) {\n        val binding = holder.binding\n        val resources = binding.root.resources\n        val actions = resources.getStringArray(R.array.filter_actions)\n        val contexts = resources.getStringArray(R.array.filter_contexts)\n\n        val filter = filters[position]\n        val context = binding.root.context\n        binding.textPrimary.text = if (filter.expiresAt == null) {\n            filter.title\n        } else {\n            context.getString(\n                R.string.filter_expiration_format,\n                filter.title,\n                getRelativeTimeSpanString(binding.root.context, filter.expiresAt.time, System.currentTimeMillis())\n            )\n        }\n        binding.textSecondary.text = context.getString(\n            R.string.filter_description_format,\n            actions.getOrNull(filter.action.ordinal - 1),\n            filter.context.map { contexts.getOrNull(it.ordinal) }.joinToString(\"/\")\n        )\n\n        binding.delete.setOnClickListener {\n            listener.deleteFilter(filter)\n        }\n\n        binding.root.setOnClickListener {\n            listener.updateFilter(filter)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/filters/FiltersListener.kt",
    "content": "package com.keylesspalace.tusky.components.filters\n\nimport com.keylesspalace.tusky.entity.Filter\n\ninterface FiltersListener {\n    fun deleteFilter(filter: Filter)\n    fun updateFilter(updatedFilter: Filter)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/filters/FiltersViewModel.kt",
    "content": "package com.keylesspalace.tusky.components.filters\n\nimport android.util.Log\nimport android.view.View\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport at.connyduck.calladapter.networkresult.fold\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.FilterUpdatedEvent\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.isHttpNotFound\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.flow.update\nimport kotlinx.coroutines.launch\n\n@HiltViewModel\nclass FiltersViewModel @Inject constructor(\n    private val api: MastodonApi,\n    private val eventHub: EventHub\n) : ViewModel() {\n\n    enum class LoadingState {\n        INITIAL,\n        LOADING,\n        LOADED,\n        ERROR_NETWORK,\n        ERROR_OTHER\n    }\n\n    data class State(val filters: List<Filter>, val loadingState: LoadingState)\n\n    private val _state = MutableStateFlow(State(emptyList(), LoadingState.INITIAL))\n    val state: StateFlow<State> = _state.asStateFlow()\n\n    private val loadTrigger = MutableStateFlow(0)\n\n    init {\n        viewModelScope.launch {\n            observeLoad()\n        }\n    }\n\n    private suspend fun observeLoad() {\n        loadTrigger.collectLatest {\n            _state.update { it.copy(loadingState = LoadingState.LOADING) }\n\n            api.getFilters().fold(\n                { filters ->\n                    _state.value = State(filters, LoadingState.LOADED)\n                },\n                { throwable ->\n                    if (throwable.isHttpNotFound()) {\n                        Log.i(TAG, \"failed loading filters v2, falling back to v1\", throwable)\n\n                        api.getFiltersV1().fold(\n                            { filters ->\n                                _state.value = State(filters.map { it.toFilter() }, LoadingState.LOADED)\n                            },\n                            { t ->\n                                Log.w(TAG, \"failed loading filters v1\", t)\n                                _state.value = State(emptyList(), LoadingState.ERROR_OTHER)\n                            }\n                        )\n                    } else {\n                        Log.w(TAG, \"failed loading filters v2\", throwable)\n                        _state.update { it.copy(loadingState = LoadingState.ERROR_NETWORK) }\n                    }\n                }\n            )\n        }\n    }\n\n    fun reload() {\n        loadTrigger.update { it + 1 }\n    }\n\n    suspend fun deleteFilter(filter: Filter, parent: View) {\n        // First wait for a pending loading operation to complete\n        _state.first { it.loadingState > LoadingState.LOADING }\n\n        api.deleteFilter(filter.id).fold(\n            {\n                _state.update { currentState ->\n                    State(\n                        currentState.filters.filter { it.id != filter.id },\n                        LoadingState.LOADED\n                    )\n                }\n                eventHub.dispatch(FilterUpdatedEvent(filter.context))\n            },\n            { throwable ->\n                if (throwable.isHttpNotFound()) {\n                    api.deleteFilterV1(filter.id).fold(\n                        {\n                            _state.update { currentState ->\n                                State(\n                                    currentState.filters.filter { it.id != filter.id },\n                                    LoadingState.LOADED\n                                )\n                            }\n                        },\n                        {\n                            Snackbar.make(\n                                parent,\n                                parent.context.getString(R.string.error_deleting_filter, filter.title),\n                                Snackbar.LENGTH_SHORT\n                            ).show()\n                        }\n                    )\n                } else {\n                    Snackbar.make(\n                        parent,\n                        parent.context.getString(R.string.error_deleting_filter, filter.title),\n                        Snackbar.LENGTH_SHORT\n                    ).show()\n                }\n            }\n        )\n    }\n\n    companion object {\n        private const val TAG = \"FiltersViewModel\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/followedtags/FollowedTagsActivity.kt",
    "content": "package com.keylesspalace.tusky.components.followedtags\n\nimport android.content.SharedPreferences\nimport android.os.Bundle\nimport android.util.Log\nimport androidx.activity.viewModels\nimport androidx.lifecycle.lifecycleScope\nimport androidx.paging.LoadState\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.SimpleItemAnimator\nimport at.connyduck.calladapter.networkresult.fold\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.BaseActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.StatusListActivity\nimport com.keylesspalace.tusky.databinding.ActivityFollowedTagsBinding\nimport com.keylesspalace.tusky.interfaces.HashtagActionListener\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.copyToClipboard\nimport com.keylesspalace.tusky.util.ensureBottomMargin\nimport com.keylesspalace.tusky.util.ensureBottomPadding\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.util.visible\nimport com.keylesspalace.tusky.view.showHashtagPickerDialog\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass FollowedTagsActivity :\n    BaseActivity(),\n    HashtagActionListener {\n\n    @Inject\n    lateinit var api: MastodonApi\n\n    @Inject\n    lateinit var sharedPreferences: SharedPreferences\n\n    private val binding by viewBinding(ActivityFollowedTagsBinding::inflate)\n    private val viewModel: FollowedTagsViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        setContentView(binding.root)\n        setSupportActionBar(binding.includedToolbar.toolbar)\n        supportActionBar?.run {\n            setTitle(R.string.title_followed_hashtags)\n            // Back button\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n        }\n\n        binding.fab.ensureBottomMargin()\n        binding.followedTagsView.ensureBottomPadding(fab = true)\n\n        binding.fab.setOnClickListener {\n            showDialog()\n        }\n\n        setupAdapter().let { adapter ->\n            setupRecyclerView(adapter)\n\n            lifecycleScope.launch {\n                viewModel.pager.collectLatest { pagingData ->\n                    adapter.submitData(pagingData)\n                }\n            }\n        }\n    }\n\n    private fun setupRecyclerView(adapter: FollowedTagsAdapter) {\n        binding.followedTagsView.adapter = adapter\n        binding.followedTagsView.setHasFixedSize(true)\n        binding.followedTagsView.layoutManager = LinearLayoutManager(this)\n        binding.followedTagsView.addItemDecoration(\n            DividerItemDecoration(this, DividerItemDecoration.VERTICAL)\n        )\n        (binding.followedTagsView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false\n    }\n\n    private fun setupAdapter(): FollowedTagsAdapter {\n        return FollowedTagsAdapter(this, viewModel).apply {\n            addLoadStateListener { loadState ->\n                binding.followedTagsProgressBar.visible(\n                    loadState.refresh == LoadState.Loading && itemCount == 0\n                )\n\n                if (loadState.refresh is LoadState.Error) {\n                    binding.followedTagsView.hide()\n                    binding.followedTagsMessageView.show()\n                    val errorState = loadState.refresh as LoadState.Error\n                    binding.followedTagsMessageView.setup(errorState.error) { retry() }\n                    Log.w(TAG, \"error loading followed hashtags\", errorState.error)\n                } else {\n                    binding.followedTagsView.show()\n                    binding.followedTagsMessageView.hide()\n                }\n            }\n        }\n    }\n\n    private fun follow(tagName: String, position: Int = -1) {\n        lifecycleScope.launch {\n            val snackbarText = api.followTag(tagName).fold(\n                {\n                    if (position == -1) {\n                        viewModel.tags.add(it)\n                    } else {\n                        viewModel.tags.add(position, it)\n                    }\n                    viewModel.currentSource?.invalidate()\n                    getString(R.string.follow_hashtag_success, tagName)\n                },\n                { t ->\n                    Log.w(TAG, \"failed to follow hashtag $tagName\", t)\n                    getString(R.string.error_following_hashtag_format, tagName)\n                }\n            )\n            Snackbar.make(\n                this@FollowedTagsActivity,\n                binding.followedTagsView,\n                snackbarText,\n                Snackbar.LENGTH_SHORT\n            )\n                .show()\n        }\n    }\n\n    override fun unfollow(tagName: String, position: Int) {\n        lifecycleScope.launch {\n            api.unfollowTag(tagName).fold(\n                {\n                    viewModel.tags.removeIf { tag -> tag.name == tagName }\n                    Snackbar.make(\n                        this@FollowedTagsActivity,\n                        binding.followedTagsView,\n                        getString(R.string.confirmation_hashtag_unfollowed, tagName),\n                        Snackbar.LENGTH_LONG\n                    )\n                        .setAction(R.string.action_undo) {\n                            follow(tagName, position)\n                        }\n                        .show()\n                    viewModel.currentSource?.invalidate()\n                },\n                {\n                    Snackbar.make(\n                        this@FollowedTagsActivity,\n                        binding.followedTagsView,\n                        getString(\n                            R.string.error_unfollowing_hashtag_format,\n                            tagName\n                        ),\n                        Snackbar.LENGTH_SHORT\n                    )\n                        .show()\n                }\n            )\n        }\n    }\n\n    override fun viewTag(tagName: String) {\n        startActivity(StatusListActivity.newHashtagIntent(this, tagName))\n    }\n\n    override fun copyTagName(tagName: String) {\n        copyToClipboard(\n            \"#$tagName\",\n            getString(R.string.confirmation_hashtag_copied, tagName),\n        )\n    }\n\n    private fun showDialog() {\n        showHashtagPickerDialog(api, R.string.dialog_follow_hashtag_title) { hashtag ->\n            follow(hashtag)\n        }\n    }\n\n    companion object {\n        const val TAG = \"FollowedTagsActivity\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/followedtags/FollowedTagsAdapter.kt",
    "content": "package com.keylesspalace.tusky.components.followedtags\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport android.widget.ImageButton\nimport android.widget.TextView\nimport androidx.paging.PagingDataAdapter\nimport androidx.recyclerview.widget.DiffUtil\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemFollowedHashtagBinding\nimport com.keylesspalace.tusky.interfaces.HashtagActionListener\nimport com.keylesspalace.tusky.util.BindingHolder\n\nclass FollowedTagsAdapter(\n    private val actionListener: HashtagActionListener,\n    private val viewModel: FollowedTagsViewModel\n) : PagingDataAdapter<String, BindingHolder<ItemFollowedHashtagBinding>>(STRING_COMPARATOR) {\n    override fun onCreateViewHolder(\n        parent: ViewGroup,\n        viewType: Int\n    ): BindingHolder<ItemFollowedHashtagBinding> = BindingHolder(\n        ItemFollowedHashtagBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n    )\n\n    override fun onBindViewHolder(\n        holder: BindingHolder<ItemFollowedHashtagBinding>,\n        position: Int\n    ) {\n        viewModel.tags[position].let { tag ->\n            holder.itemView.findViewById<TextView>(R.id.followed_tag).apply {\n                text = tag.name\n                setOnClickListener {\n                    actionListener.viewTag(tag.name)\n                }\n                setOnLongClickListener {\n                    actionListener.copyTagName(tag.name)\n                    true\n                }\n            }\n\n            holder.itemView.findViewById<ImageButton>(\n                R.id.followed_tag_unfollow\n            ).setOnClickListener {\n                actionListener.unfollow(tag.name, holder.bindingAdapterPosition)\n            }\n        }\n    }\n\n    override fun getItemCount(): Int = viewModel.tags.size\n\n    companion object {\n        val STRING_COMPARATOR = object : DiffUtil.ItemCallback<String>() {\n            override fun areItemsTheSame(oldItem: String, newItem: String): Boolean =\n                oldItem == newItem\n            override fun areContentsTheSame(oldItem: String, newItem: String): Boolean =\n                oldItem == newItem\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/followedtags/FollowedTagsPagingSource.kt",
    "content": "package com.keylesspalace.tusky.components.followedtags\n\nimport androidx.paging.PagingSource\nimport androidx.paging.PagingState\n\nclass FollowedTagsPagingSource(private val viewModel: FollowedTagsViewModel) : PagingSource<String, String>() {\n    override fun getRefreshKey(state: PagingState<String, String>): String? = null\n\n    override suspend fun load(params: LoadParams<String>): LoadResult<String, String> {\n        return if (params is LoadParams.Refresh) {\n            LoadResult.Page(viewModel.tags.map { it.name }, null, viewModel.nextKey)\n        } else {\n            LoadResult.Page(emptyList(), null, null)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/followedtags/FollowedTagsRemoteMediator.kt",
    "content": "package com.keylesspalace.tusky.components.followedtags\n\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.LoadType\nimport androidx.paging.PagingState\nimport androidx.paging.RemoteMediator\nimport com.keylesspalace.tusky.entity.HashTag\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.HttpHeaderLink\nimport retrofit2.HttpException\nimport retrofit2.Response\n\n@OptIn(ExperimentalPagingApi::class)\nclass FollowedTagsRemoteMediator(\n    private val api: MastodonApi,\n    private val viewModel: FollowedTagsViewModel\n) : RemoteMediator<String, String>() {\n    override suspend fun load(\n        loadType: LoadType,\n        state: PagingState<String, String>\n    ): MediatorResult {\n        return try {\n            val response = request(loadType)\n                ?: return MediatorResult.Success(endOfPaginationReached = true)\n\n            return applyResponse(response)\n        } catch (e: Exception) {\n            MediatorResult.Error(e)\n        }\n    }\n\n    private suspend fun request(loadType: LoadType): Response<List<HashTag>>? {\n        return when (loadType) {\n            LoadType.PREPEND -> null\n            LoadType.APPEND -> api.followedTags(maxId = viewModel.nextKey)\n            LoadType.REFRESH -> {\n                viewModel.nextKey = null\n                viewModel.tags.clear()\n                api.followedTags()\n            }\n        }\n    }\n\n    private fun applyResponse(response: Response<List<HashTag>>): MediatorResult {\n        val tags = response.body()\n        if (!response.isSuccessful || tags == null) {\n            return MediatorResult.Error(HttpException(response))\n        }\n\n        val links = HttpHeaderLink.parse(response.headers()[\"Link\"])\n        viewModel.nextKey = HttpHeaderLink.findByRelationType(links, \"next\")?.uri?.getQueryParameter(\"max_id\")\n        viewModel.tags.addAll(tags)\n        viewModel.currentSource?.invalidate()\n\n        return MediatorResult.Success(endOfPaginationReached = viewModel.nextKey == null)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/followedtags/FollowedTagsViewModel.kt",
    "content": "package com.keylesspalace.tusky.components.followedtags\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.Pager\nimport androidx.paging.PagingConfig\nimport androidx.paging.cachedIn\nimport com.keylesspalace.tusky.entity.HashTag\nimport com.keylesspalace.tusky.network.MastodonApi\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\n\n@HiltViewModel\nclass FollowedTagsViewModel @Inject constructor(\n    val api: MastodonApi\n) : ViewModel() {\n    val tags: MutableList<HashTag> = mutableListOf()\n    var nextKey: String? = null\n    var currentSource: FollowedTagsPagingSource? = null\n\n    @OptIn(ExperimentalPagingApi::class)\n    val pager = Pager(\n        config = PagingConfig(\n            pageSize = 100\n        ),\n        remoteMediator = FollowedTagsRemoteMediator(api, this),\n        pagingSourceFactory = {\n            FollowedTagsPagingSource(\n                viewModel = this\n            ).also { source ->\n                currentSource = source\n            }\n        }\n    ).flow.cachedIn(viewModelScope)\n\n    companion object {\n        private const val TAG = \"FollowedTagsViewModel\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/instanceinfo/InstanceInfo.kt",
    "content": "/* Copyright 2022 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.instanceinfo\n\ndata class InstanceInfo(\n    val maxChars: Int,\n    val pollMaxOptions: Int,\n    val pollMaxLength: Int,\n    val pollMinDuration: Int,\n    val pollMaxDuration: Int,\n    val charactersReservedPerUrl: Int,\n    val videoSizeLimit: Int,\n    val imageSizeLimit: Int,\n    val imageMatrixLimit: Int,\n    val maxMediaAttachments: Int,\n    val maxFields: Int,\n    val maxFieldNameLength: Int?,\n    val maxFieldValueLength: Int?,\n    val version: String?,\n    val translationEnabled: Boolean?,\n    val mastodonApiVersion: Int?,\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/instanceinfo/InstanceInfoRepository.kt",
    "content": "/* Copyright 2022 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.instanceinfo\n\nimport android.util.Log\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport at.connyduck.calladapter.networkresult.fold\nimport at.connyduck.calladapter.networkresult.getOrElse\nimport at.connyduck.calladapter.networkresult.getOrThrow\nimport at.connyduck.calladapter.networkresult.map\nimport at.connyduck.calladapter.networkresult.onSuccess\nimport at.connyduck.calladapter.networkresult.recoverCatching\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.entity.EmojisEntity\nimport com.keylesspalace.tusky.db.entity.InstanceInfoEntity\nimport com.keylesspalace.tusky.di.ApplicationScope\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.entity.Instance\nimport com.keylesspalace.tusky.entity.InstanceV1\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.isHttpNotFound\nimport java.util.concurrent.ConcurrentHashMap\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\n\nclass InstanceInfoRepository @Inject constructor(\n    private val api: MastodonApi,\n    db: AppDatabase,\n    private val accountManager: AccountManager,\n    @ApplicationScope\n    private val externalScope: CoroutineScope\n) {\n    private val dao = db.instanceDao()\n    private val instanceName\n        get() = accountManager.activeAccount!!.domain\n\n    fun precache() {\n        // We are avoiding some duplicate work but we are not trying too hard.\n        // We might request it multiple times in parallel which is not a big problem.\n        // We might also get the results in random order or write them twice but it's also\n        // not a problem.\n        // We are just trying to avoid 2 things:\n        //  - fetching it when we already have it\n        //  - caching default value (we want to rather re-fetch if it fails)\n        if (instanceInfoCache[instanceName] == null) {\n            externalScope.launch {\n                fetchAndPersistInstanceInfo().fold({ fetched ->\n                    instanceInfoCache[instanceName] = fetched.toInfoOrDefault()\n                }, { e ->\n                    Log.w(TAG, \"failed to precache instance info\", e)\n                })\n            }\n        }\n    }\n\n    val cachedInstanceInfoOrFallback: InstanceInfo\n        get() = instanceInfoCache[instanceName] ?: null.toInfoOrDefault()\n\n    /**\n     * Returns the custom emojis of the instance.\n     * Will always try to fetch them from the api, falls back to cached Emojis in case it is not available.\n     * Never throws, returns empty list in case of error.\n     */\n    suspend fun getEmojis(): List<Emoji> = withContext(Dispatchers.IO) {\n        api.getCustomEmojis()\n            .onSuccess { emojiList -> dao.upsert(EmojisEntity(instanceName, emojiList)) }\n            .getOrElse { throwable ->\n                Log.w(TAG, \"failed to load custom emojis, falling back to cache\", throwable)\n                dao.getEmojiInfo(instanceName)?.emojiList.orEmpty()\n            }\n    }\n\n    /**\n     * Returns information about the instance.\n     * Will always try to fetch the most up-to-date data from the api, falls back to cache in case it is not available.\n     * Never throws, returns defaults of vanilla Mastodon in case of error.\n     */\n    suspend fun getUpdatedInstanceInfoOrFallback(): InstanceInfo =\n        withContext(Dispatchers.IO) {\n            fetchAndPersistInstanceInfo()\n                .getOrElse { throwable ->\n                    Log.w(\n                        TAG,\n                        \"failed to load instance, falling back to cache and default values\",\n                        throwable\n                    )\n                    dao.getInstanceInfo(instanceName)\n                }\n        }.toInfoOrDefault()\n\n    suspend fun saveFilterV2Support(filterV2Supported: Boolean) = dao.setFilterV2Support(instanceName, filterV2Supported)\n\n    suspend fun isFilterV2Supported(): Boolean = dao.getFilterV2Support(instanceName)\n\n    private suspend fun InstanceInfoRepository.fetchAndPersistInstanceInfo(): NetworkResult<InstanceInfoEntity> =\n        fetchRemoteInstanceInfo()\n            .onSuccess { instanceInfoEntity ->\n                dao.upsert(instanceInfoEntity)\n            }\n\n    private suspend fun fetchRemoteInstanceInfo(): NetworkResult<InstanceInfoEntity> {\n        val instance = this.instanceName\n        return api.getInstance()\n            .map { it.toEntity() }\n            .recoverCatching { t ->\n                if (t.isHttpNotFound()) {\n                    api.getInstanceV1().map { it.toEntity(instance) }.getOrThrow()\n                } else {\n                    throw t\n                }\n            }\n    }\n\n    private fun InstanceInfoEntity?.toInfoOrDefault() = InstanceInfo(\n        maxChars = this?.maximumTootCharacters ?: DEFAULT_CHARACTER_LIMIT,\n        pollMaxOptions = this?.maxPollOptions ?: DEFAULT_MAX_OPTION_COUNT,\n        pollMaxLength = this?.maxPollOptionLength ?: DEFAULT_MAX_OPTION_LENGTH,\n        pollMinDuration = this?.minPollDuration ?: DEFAULT_MIN_POLL_DURATION,\n        pollMaxDuration = this?.maxPollDuration ?: DEFAULT_MAX_POLL_DURATION,\n        charactersReservedPerUrl = this?.charactersReservedPerUrl\n            ?: DEFAULT_CHARACTERS_RESERVED_PER_URL,\n        videoSizeLimit = this?.videoSizeLimit ?: DEFAULT_VIDEO_SIZE_LIMIT,\n        imageSizeLimit = this?.imageSizeLimit ?: DEFAULT_IMAGE_SIZE_LIMIT,\n        imageMatrixLimit = this?.imageMatrixLimit ?: DEFAULT_IMAGE_MATRIX_LIMIT,\n        maxMediaAttachments = this?.maxMediaAttachments\n            ?: DEFAULT_MAX_MEDIA_ATTACHMENTS,\n        maxFields = this?.maxFields ?: DEFAULT_MAX_ACCOUNT_FIELDS,\n        maxFieldNameLength = this?.maxFieldNameLength,\n        maxFieldValueLength = this?.maxFieldValueLength,\n        version = this?.version,\n        translationEnabled = this?.translationEnabled,\n        mastodonApiVersion = this?.mastodonApiVersion,\n    )\n\n    private fun Instance.toEntity() = InstanceInfoEntity(\n        instance = domain,\n        maximumTootCharacters = this.configuration?.statuses?.maxCharacters\n            ?: DEFAULT_CHARACTER_LIMIT,\n        maxPollOptions = this.configuration?.polls?.maxOptions ?: DEFAULT_MAX_OPTION_COUNT,\n        maxPollOptionLength = this.configuration?.polls?.maxCharactersPerOption\n            ?: DEFAULT_MAX_OPTION_LENGTH,\n        minPollDuration = this.configuration?.polls?.minExpirationSeconds\n            ?: DEFAULT_MIN_POLL_DURATION,\n        maxPollDuration = this.configuration?.polls?.maxExpirationSeconds\n            ?: DEFAULT_MAX_POLL_DURATION,\n        charactersReservedPerUrl = this.configuration?.statuses?.charactersReservedPerUrl\n            ?: DEFAULT_CHARACTERS_RESERVED_PER_URL,\n        version = this.version,\n        videoSizeLimit = this.configuration?.mediaAttachments?.videoSizeLimitBytes?.toInt()\n            ?: DEFAULT_VIDEO_SIZE_LIMIT,\n        imageSizeLimit = this.configuration?.mediaAttachments?.imageSizeLimitBytes?.toInt()\n            ?: DEFAULT_IMAGE_SIZE_LIMIT,\n        imageMatrixLimit = this.configuration?.mediaAttachments?.imagePixelCountLimit?.toInt()\n            ?: DEFAULT_IMAGE_MATRIX_LIMIT,\n        maxMediaAttachments = this.configuration?.statuses?.maxMediaAttachments\n            ?: DEFAULT_MAX_MEDIA_ATTACHMENTS,\n        maxFields = this.configuration?.accounts?.maxProfileFields ?: this.pleroma?.metadata?.fieldLimits?.maxFields,\n        maxFieldNameLength = this.pleroma?.metadata?.fieldLimits?.nameLength,\n        maxFieldValueLength = this.pleroma?.metadata?.fieldLimits?.valueLength,\n        translationEnabled = this.configuration?.translation?.enabled,\n        mastodonApiVersion = this.apiVersions?.mastodon,\n    )\n\n    private fun InstanceV1.toEntity(instanceName: String) =\n        InstanceInfoEntity(\n            instance = instanceName,\n            maximumTootCharacters = this.configuration?.statuses?.maxCharacters\n                ?: this.maxTootChars,\n            maxPollOptions = this.configuration?.polls?.maxOptions\n                ?: this.pollConfiguration?.maxOptions,\n            maxPollOptionLength = this.configuration?.polls?.maxCharactersPerOption\n                ?: this.pollConfiguration?.maxOptionChars,\n            minPollDuration = this.configuration?.polls?.minExpiration\n                ?: this.pollConfiguration?.minExpiration,\n            maxPollDuration = this.configuration?.polls?.maxExpiration\n                ?: this.pollConfiguration?.maxExpiration,\n            charactersReservedPerUrl = this.configuration?.statuses?.charactersReservedPerUrl,\n            version = this.version,\n            videoSizeLimit = this.configuration?.mediaAttachments?.videoSizeLimit\n                ?: this.uploadLimit,\n            imageSizeLimit = this.configuration?.mediaAttachments?.imageSizeLimit\n                ?: this.uploadLimit,\n            imageMatrixLimit = this.configuration?.mediaAttachments?.imageMatrixLimit,\n            maxMediaAttachments = this.configuration?.statuses?.maxMediaAttachments\n                ?: this.maxMediaAttachments,\n            maxFields = this.pleroma?.metadata?.fieldLimits?.maxFields,\n            maxFieldNameLength = this.pleroma?.metadata?.fieldLimits?.nameLength,\n            maxFieldValueLength = this.pleroma?.metadata?.fieldLimits?.valueLength,\n            translationEnabled = null,\n            mastodonApiVersion = null,\n        )\n\n    companion object {\n        private const val TAG = \"InstanceInfoRepo\"\n\n        /** In-memory cache for instance data, per instance domain.  */\n        private var instanceInfoCache = ConcurrentHashMap<String, InstanceInfo>()\n\n        const val DEFAULT_CHARACTER_LIMIT = 500\n        private const val DEFAULT_MAX_OPTION_COUNT = 4\n        private const val DEFAULT_MAX_OPTION_LENGTH = 50\n        private const val DEFAULT_MIN_POLL_DURATION = 300\n        private const val DEFAULT_MAX_POLL_DURATION = 604800\n\n        private const val DEFAULT_VIDEO_SIZE_LIMIT = 41943040 // 40MiB\n        private const val DEFAULT_IMAGE_SIZE_LIMIT = 10485760 // 10MiB\n        private const val DEFAULT_IMAGE_MATRIX_LIMIT = 16777216 // 4096^2 Pixels\n\n        // Mastodon only counts URLs as this long in terms of status character limits\n        const val DEFAULT_CHARACTERS_RESERVED_PER_URL = 23\n\n        const val DEFAULT_MAX_MEDIA_ATTACHMENTS = 4\n        const val DEFAULT_MAX_ACCOUNT_FIELDS = 4\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/login/LoginActivity.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.login\n\nimport android.content.Context\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Bundle\nimport android.text.method.LinkMovementMethod\nimport android.util.Log\nimport android.view.Menu\nimport android.view.View\nimport android.widget.TextView\nimport androidx.core.content.edit\nimport androidx.core.net.toUri\nimport androidx.core.view.WindowInsetsCompat.Type.ime\nimport androidx.core.view.WindowInsetsCompat.Type.systemBars\nimport androidx.core.view.updatePadding\nimport androidx.lifecycle.lifecycleScope\nimport at.connyduck.calladapter.networkresult.fold\nimport com.bumptech.glide.Glide\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.keylesspalace.tusky.BaseActivity\nimport com.keylesspalace.tusky.BuildConfig\nimport com.keylesspalace.tusky.MainActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ActivityLoginBinding\nimport com.keylesspalace.tusky.entity.AccessToken\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.getNonNullString\nimport com.keylesspalace.tusky.util.openLinkInCustomTab\nimport com.keylesspalace.tusky.util.rickRoll\nimport com.keylesspalace.tusky.util.setOnWindowInsetsChangeListener\nimport com.keylesspalace.tusky.util.shouldRickRoll\nimport com.keylesspalace.tusky.util.viewBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.launch\nimport okhttp3.HttpUrl\n\n/** Main login page, the first thing that users see. Has prompt for instance and login button. */\n@AndroidEntryPoint\nclass LoginActivity : BaseActivity() {\n\n    @Inject\n    lateinit var mastodonApi: MastodonApi\n\n    private val binding by viewBinding(ActivityLoginBinding::inflate)\n\n    private val oauthRedirectUri: String\n        get() {\n            val scheme = getString(R.string.oauth_scheme)\n            val host = BuildConfig.APPLICATION_ID\n            return \"$scheme://$host/\"\n        }\n\n    private val doWebViewAuth = registerForActivityResult(OauthLogin()) { result ->\n        when (result) {\n            is LoginResult.Ok -> fetchOauthToken(result.code)\n            is LoginResult.Err -> displayError(result.errorMessage)\n            is LoginResult.Cancel -> setLoading(false)\n        }\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        setContentView(binding.root)\n\n        binding.loginScrollView.setOnWindowInsetsChangeListener { windowInsets ->\n            val insets = windowInsets.getInsets(systemBars() or ime())\n            binding.loginScrollView.updatePadding(bottom = insets.bottom)\n        }\n\n        if (savedInstanceState == null &&\n            BuildConfig.CUSTOM_INSTANCE.isNotBlank() &&\n            !isAdditionalLogin()\n        ) {\n            binding.domainEditText.setText(BuildConfig.CUSTOM_INSTANCE)\n            binding.domainEditText.setSelection(BuildConfig.CUSTOM_INSTANCE.length)\n        }\n\n        if (BuildConfig.CUSTOM_LOGO_URL.isNotBlank()) {\n            Glide.with(binding.loginLogo)\n                .load(BuildConfig.CUSTOM_LOGO_URL)\n                .placeholder(null)\n                .into(binding.loginLogo)\n        }\n\n        binding.loginButton.setOnClickListener { onLoginClick(true) }\n\n        binding.whatsAnInstanceTextView.setOnClickListener {\n            val dialog = MaterialAlertDialogBuilder(this)\n                .setMessage(R.string.dialog_whats_an_instance)\n                .setPositiveButton(R.string.action_close, null)\n                .show()\n            val textView = dialog.findViewById<TextView>(android.R.id.message)\n            textView?.movementMethod = LinkMovementMethod.getInstance()\n        }\n\n        setSupportActionBar(binding.toolbar)\n        supportActionBar?.setDisplayHomeAsUpEnabled(isAdditionalLogin())\n        supportActionBar?.setDisplayShowTitleEnabled(false)\n    }\n\n    override fun requiresLogin(): Boolean {\n        return false\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu?): Boolean {\n        menu?.add(R.string.action_browser_login)?.apply {\n            setOnMenuItemClickListener {\n                onLoginClick(false)\n                true\n            }\n        }\n\n        return super.onCreateOptionsMenu(menu)\n    }\n\n    private fun onLoginClick(openInWebView: Boolean) {\n        binding.loginButton.isEnabled = false\n        binding.domainTextInputLayout.error = null\n\n        val domain = canonicalizeDomain(binding.domainEditText.text.toString())\n\n        try {\n            HttpUrl.Builder().host(domain).scheme(\"https\").build()\n        } catch (_: IllegalArgumentException) {\n            setLoading(false)\n            binding.domainTextInputLayout.error = getString(R.string.error_invalid_domain)\n            return\n        }\n\n        if (shouldRickRoll(this, domain)) {\n            rickRoll(this)\n            return\n        }\n\n        setLoading(true)\n\n        lifecycleScope.launch {\n            mastodonApi.authenticateApp(\n                domain,\n                getString(R.string.app_name),\n                oauthRedirectUri,\n                OAUTH_SCOPES,\n                getString(R.string.tusky_website)\n            ).fold(\n                { credentials ->\n                    // Save credentials so we can access them after we opened another activity for auth.\n                    preferences.edit {\n                        putString(DOMAIN, domain)\n                        putString(CLIENT_ID, credentials.clientId)\n                        putString(CLIENT_SECRET, credentials.clientSecret)\n                    }\n\n                    redirectUserToAuthorizeAndLogin(domain, credentials.clientId, openInWebView)\n                },\n                { e ->\n                    binding.loginButton.isEnabled = true\n                    binding.domainTextInputLayout.error =\n                        getString(R.string.error_failed_app_registration)\n                    setLoading(false)\n                    Log.e(TAG, Log.getStackTraceString(e))\n                    return@launch\n                }\n            )\n        }\n    }\n\n    private fun redirectUserToAuthorizeAndLogin(\n        domain: String,\n        clientId: String,\n        openInWebView: Boolean\n    ) {\n        // To authorize this app and log in it's necessary to redirect to the domain given,\n        // login there, and the server will redirect back to the app with its response.\n        val uri = Uri.Builder()\n            .scheme(\"https\")\n            .authority(domain)\n            .path(MastodonApi.ENDPOINT_AUTHORIZE)\n            .appendQueryParameter(\"client_id\", clientId)\n            .appendQueryParameter(\"redirect_uri\", oauthRedirectUri)\n            .appendQueryParameter(\"response_type\", \"code\")\n            .appendQueryParameter(\"scope\", OAUTH_SCOPES)\n            .build()\n\n        if (openInWebView) {\n            doWebViewAuth.launch(LoginData(domain, uri, oauthRedirectUri.toUri()))\n        } else {\n            openLinkInCustomTab(uri, this)\n        }\n    }\n\n    override fun onStart() {\n        super.onStart()\n\n        /* Check if we are resuming during authorization by seeing if the intent contains the\n         * redirect that was given to the server. If so, its response is here! */\n        val uri = intent.data\n\n        if (uri?.toString()?.startsWith(oauthRedirectUri) == true) {\n            // This should either have returned an authorization code or an error.\n            val code = uri.getQueryParameter(\"code\")\n            val error = uri.getQueryParameter(\"error\")\n\n            if (code != null) {\n                fetchOauthToken(code)\n            } else {\n                displayError(error)\n            }\n        } else {\n            // first show or user cancelled login\n            setLoading(false)\n        }\n    }\n\n    private fun displayError(error: String?) {\n        // Authorization failed. Put the error response where the user can read it and they\n        // can try again.\n        setLoading(false)\n\n        binding.domainTextInputLayout.error = if (error == null) {\n            // This case means a junk response was received somehow.\n            getString(R.string.error_authorization_unknown)\n        } else {\n            // Use error returned by the server or fall back to the generic message\n            Log.e(TAG, getString(R.string.error_authorization_denied) + \" \" + error)\n            error.ifBlank { getString(R.string.error_authorization_denied) }\n        }\n    }\n\n    private fun fetchOauthToken(code: String) {\n        setLoading(true)\n\n        /* restore variables from SharedPreferences */\n        val domain = preferences.getNonNullString(DOMAIN, \"\")\n        val clientId = preferences.getNonNullString(CLIENT_ID, \"\")\n        val clientSecret = preferences.getNonNullString(CLIENT_SECRET, \"\")\n\n        lifecycleScope.launch {\n            mastodonApi.fetchOAuthToken(\n                domain,\n                clientId,\n                clientSecret,\n                oauthRedirectUri,\n                code,\n                \"authorization_code\"\n            ).fold(\n                { accessToken ->\n                    fetchAccountDetails(accessToken, domain, clientId, clientSecret)\n                },\n                { e ->\n                    setLoading(false)\n                    binding.domainTextInputLayout.error =\n                        getString(R.string.error_retrieving_oauth_token)\n                    Log.e(TAG, getString(R.string.error_retrieving_oauth_token), e)\n                }\n            )\n        }\n    }\n\n    private suspend fun fetchAccountDetails(\n        accessToken: AccessToken,\n        domain: String,\n        clientId: String,\n        clientSecret: String\n    ) {\n        mastodonApi.accountVerifyCredentials(\n            domain = domain,\n            auth = \"Bearer ${accessToken.accessToken}\"\n        ).fold({ newAccount ->\n            accountManager.addAccount(\n                accessToken = accessToken.accessToken,\n                domain = domain,\n                clientId = clientId,\n                clientSecret = clientSecret,\n                oauthScopes = OAUTH_SCOPES,\n                newAccount = newAccount\n            )\n            val intent = Intent(this, MainActivity::class.java)\n            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)\n            startActivity(intent)\n        }, { e ->\n            setLoading(false)\n            binding.domainTextInputLayout.error =\n                getString(R.string.error_loading_account_details)\n            Log.e(TAG, getString(R.string.error_loading_account_details), e)\n        })\n    }\n\n    private fun setLoading(loadingState: Boolean) {\n        if (loadingState) {\n            binding.loginLoadingLayout.visibility = View.VISIBLE\n            binding.loginInputLayout.visibility = View.GONE\n        } else {\n            binding.loginLoadingLayout.visibility = View.GONE\n            binding.loginInputLayout.visibility = View.VISIBLE\n            binding.loginButton.isEnabled = true\n        }\n    }\n\n    private fun isAdditionalLogin(): Boolean {\n        return intent.getIntExtra(LOGIN_MODE, MODE_DEFAULT) == MODE_ADDITIONAL_LOGIN\n    }\n\n    companion object {\n        private const val TAG = \"LoginActivity\" // logging tag\n        private const val OAUTH_SCOPES = \"read write follow push\"\n        private const val LOGIN_MODE = \"LOGIN_MODE\"\n        private const val DOMAIN = \"domain\"\n        private const val CLIENT_ID = \"clientId\"\n        private const val CLIENT_SECRET = \"clientSecret\"\n\n        const val MODE_DEFAULT = 0\n        const val MODE_ADDITIONAL_LOGIN = 1\n\n        @JvmStatic\n        fun getIntent(context: Context, mode: Int): Intent {\n            val loginIntent = Intent(context, LoginActivity::class.java)\n            loginIntent.putExtra(LOGIN_MODE, mode)\n            return loginIntent\n        }\n\n        /** Make sure the user-entered text is just a fully-qualified domain name.  */\n        private fun canonicalizeDomain(domain: String): String {\n            // Strip any schemes out.\n            var s = domain.replaceFirst(\"http://\", \"\")\n            s = s.replaceFirst(\"https://\", \"\")\n            // If a username was included (e.g. username@example.com), just take what's after the '@'.\n            val at = s.lastIndexOf('@')\n            if (at != -1) {\n                s = s.substring(at + 1)\n            }\n            return s.trim { it <= ' ' }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/login/LoginWebViewActivity.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.login\n\nimport android.annotation.SuppressLint\nimport android.app.Activity\nimport android.content.Context\nimport android.content.Intent\nimport android.graphics.Color\nimport android.net.Uri\nimport android.os.Bundle\nimport android.os.Parcelable\nimport android.util.Log\nimport android.webkit.CookieManager\nimport android.webkit.WebResourceError\nimport android.webkit.WebResourceRequest\nimport android.webkit.WebStorage\nimport android.webkit.WebView\nimport android.webkit.WebViewClient\nimport androidx.activity.result.contract.ActivityResultContract\nimport androidx.activity.viewModels\nimport androidx.core.net.toUri\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.WindowInsetsCompat.Type.ime\nimport androidx.core.view.WindowInsetsCompat.Type.systemBars\nimport androidx.core.view.updatePadding\nimport androidx.lifecycle.lifecycleScope\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.keylesspalace.tusky.BaseActivity\nimport com.keylesspalace.tusky.BuildConfig\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ActivityLoginWebviewBinding\nimport com.keylesspalace.tusky.util.getParcelableExtraCompat\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.util.visible\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.launch\nimport kotlinx.parcelize.Parcelize\n\n/** Contract for starting [LoginWebViewActivity]. */\nclass OauthLogin : ActivityResultContract<LoginData, LoginResult>() {\n    override fun createIntent(context: Context, input: LoginData): Intent {\n        val intent = Intent(context, LoginWebViewActivity::class.java)\n        intent.putExtra(DATA_EXTRA, input)\n        return intent\n    }\n\n    override fun parseResult(resultCode: Int, intent: Intent?): LoginResult {\n        // Can happen automatically on up or back press\n        return if (resultCode == Activity.RESULT_CANCELED) {\n            LoginResult.Cancel\n        } else {\n            intent?.getParcelableExtraCompat(RESULT_EXTRA)\n                ?: LoginResult.Err(\"failed parsing LoginWebViewActivity result\")\n        }\n    }\n\n    companion object {\n        private const val RESULT_EXTRA = \"result\"\n        private const val DATA_EXTRA = \"data\"\n\n        fun parseData(intent: Intent): LoginData {\n            return intent.getParcelableExtraCompat(DATA_EXTRA)!!\n        }\n\n        fun makeResultIntent(result: LoginResult): Intent {\n            val intent = Intent()\n            intent.putExtra(RESULT_EXTRA, result)\n            return intent\n        }\n    }\n}\n\n@Parcelize\ndata class LoginData(\n    val domain: String,\n    val url: Uri,\n    val oauthRedirectUrl: Uri\n) : Parcelable\n\nsealed interface LoginResult : Parcelable {\n    @Parcelize\n    data class Ok(val code: String) : LoginResult\n\n    @Parcelize\n    data class Err(val errorMessage: String) : LoginResult\n\n    @Parcelize\n    data object Cancel : LoginResult\n}\n\n/** Activity to do Oauth process using WebView. */\n@AndroidEntryPoint\nclass LoginWebViewActivity : BaseActivity() {\n    private val binding by viewBinding(ActivityLoginWebviewBinding::inflate)\n\n    private val viewModel: LoginWebViewViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        if (BuildConfig.DEBUG) {\n            WebView.setWebContentsDebuggingEnabled(true)\n        }\n\n        val data = OauthLogin.parseData(intent)\n\n        setContentView(binding.root)\n\n        setSupportActionBar(binding.loginToolbar)\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n        supportActionBar?.setDisplayShowTitleEnabled(true)\n\n        setTitle(R.string.title_login)\n\n        ViewCompat.setOnApplyWindowInsetsListener(binding.loginWebView) { _, insets ->\n            val bottomInsets = insets.getInsets(systemBars() or ime()).bottom\n            binding.root.updatePadding(bottom = bottomInsets)\n            WindowInsetsCompat.CONSUMED\n        }\n\n        val webView = binding.loginWebView\n        webView.settings.allowContentAccess = false\n        webView.settings.allowFileAccess = false\n        webView.settings.displayZoomControls = false\n        webView.settings.javaScriptCanOpenWindowsAutomatically = false\n        // JavaScript needs to be enabled because otherwise 2FA does not work in some instances\n        @SuppressLint(\"SetJavaScriptEnabled\")\n        webView.settings.javaScriptEnabled = true\n        webView.settings.userAgentString += \" Tusky/${BuildConfig.VERSION_NAME}\"\n\n        val oauthUrl = data.oauthRedirectUrl\n\n        webView.webViewClient = object : WebViewClient() {\n            override fun onPageFinished(view: WebView?, url: String?) {\n                binding.loginProgress.hide()\n            }\n\n            override fun onReceivedError(\n                view: WebView,\n                request: WebResourceRequest,\n                error: WebResourceError\n            ) {\n                Log.d(\"LoginWeb\", \"Failed to load ${data.url}: $error\")\n                sendResult(LoginResult.Err(getString(R.string.error_could_not_load_login_page)))\n            }\n\n            override fun shouldOverrideUrlLoading(\n                view: WebView,\n                request: WebResourceRequest\n            ): Boolean {\n                return shouldOverrideUrlLoading(request.url)\n            }\n\n            /* overriding this deprecated method is necessary for it to work on api levels < 24 */\n            @Suppress(\"OVERRIDE_DEPRECATION\")\n            override fun shouldOverrideUrlLoading(view: WebView?, urlString: String?): Boolean {\n                val url = urlString?.toUri() ?: return false\n                return shouldOverrideUrlLoading(url)\n            }\n\n            fun shouldOverrideUrlLoading(url: Uri): Boolean {\n                return if (url.scheme == oauthUrl.scheme && url.host == oauthUrl.host) {\n                    val error = url.getQueryParameter(\"error\")\n                    if (error != null) {\n                        sendResult(LoginResult.Err(error))\n                    } else {\n                        val code = url.getQueryParameter(\"code\").orEmpty()\n                        sendResult(LoginResult.Ok(code))\n                    }\n                    true\n                } else {\n                    false\n                }\n            }\n        }\n\n        webView.setBackgroundColor(Color.TRANSPARENT)\n\n        if (savedInstanceState == null) {\n            webView.loadUrl(data.url.toString())\n        } else {\n            webView.restoreState(savedInstanceState)\n        }\n\n        binding.loginRules.text = getString(R.string.instance_rule_info, data.domain)\n\n        viewModel.init(data.domain)\n\n        lifecycleScope.launch {\n            viewModel.instanceRules.collect { instanceRules ->\n                binding.loginRules.visible(instanceRules.isNotEmpty())\n                binding.loginRules.setOnClickListener {\n                    MaterialAlertDialogBuilder(this@LoginWebViewActivity)\n                        .setTitle(getString(R.string.instance_rule_title, data.domain))\n                        .setMessage(\n                            instanceRules.joinToString(separator = \"\\n\\n\") { \"• $it\" }\n                        )\n                        .setPositiveButton(android.R.string.ok, null)\n                        .show()\n                }\n            }\n        }\n    }\n\n    override fun onSaveInstanceState(outState: Bundle) {\n        super.onSaveInstanceState(outState)\n        binding.loginWebView.saveState(outState)\n    }\n\n    override fun onDestroy() {\n        if (isFinishing) {\n            // We don't want to keep user session in WebView, we just want our own accessToken\n            WebStorage.getInstance().deleteAllData()\n            CookieManager.getInstance().removeAllCookies(null)\n        }\n        super.onDestroy()\n    }\n\n    override fun requiresLogin() = false\n\n    private fun sendResult(result: LoginResult) {\n        setResult(Activity.RESULT_OK, OauthLogin.makeResultIntent(result))\n        finish()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/login/LoginWebViewViewModel.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.login\n\nimport android.util.Log\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport at.connyduck.calladapter.networkresult.fold\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.isHttpNotFound\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport kotlinx.coroutines.launch\n\n@HiltViewModel\nclass LoginWebViewViewModel @Inject constructor(\n    private val api: MastodonApi\n) : ViewModel() {\n\n    private val _instanceRules = MutableStateFlow(emptyList<String>())\n    val instanceRules = _instanceRules.asStateFlow()\n\n    private var domain: String? = null\n\n    fun init(domain: String) {\n        if (this.domain == null) {\n            this.domain = domain\n            viewModelScope.launch {\n                api.getInstance(domain).fold(\n                    { instance ->\n                        _instanceRules.value = instance.rules.map { rule -> rule.text }\n                    },\n                    { throwable ->\n                        if (throwable.isHttpNotFound()) {\n                            api.getInstanceV1(domain).fold(\n                                { instance ->\n                                    _instanceRules.value = instance.rules.map { rule -> rule.text }\n                                },\n                                { throwable2 ->\n                                    Log.w(\n                                        \"LoginWebViewViewModel\",\n                                        \"failed to load instance info\",\n                                        throwable2\n                                    )\n                                }\n                            )\n                        } else {\n                            Log.w(\n                                \"LoginWebViewViewModel\",\n                                \"failed to load instance info\",\n                                throwable\n                            )\n                        }\n                    }\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/FollowViewHolder.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications\n\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemFollowBinding\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.interfaces.AccountActionListener\nimport com.keylesspalace.tusky.interfaces.LinkListener\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.util.emojify\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.loadAvatar\nimport com.keylesspalace.tusky.util.parseAsMastodonHtml\nimport com.keylesspalace.tusky.util.setClickableText\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.unicodeWrap\nimport com.keylesspalace.tusky.util.visible\nimport com.keylesspalace.tusky.viewdata.NotificationViewData\n\nclass FollowViewHolder(\n    private val binding: ItemFollowBinding,\n    private val listener: AccountActionListener,\n    private val linkListener: LinkListener\n) : RecyclerView.ViewHolder(binding.root), NotificationsViewHolder {\n\n    override fun bind(\n        viewData: NotificationViewData.Concrete,\n        payloads: List<*>,\n        statusDisplayOptions: StatusDisplayOptions\n    ) {\n        if (payloads.isNotEmpty()) {\n            return\n        }\n        val context = itemView.context\n        val account = viewData.account\n        val messageTemplate =\n            context.getString(if (viewData.type == Notification.Type.SignUp) R.string.notification_sign_up_format else R.string.notification_follow_format)\n        val wrappedDisplayName = account.name.unicodeWrap()\n\n        binding.notificationText.text = messageTemplate.format(wrappedDisplayName)\n            .emojify(account.emojis, binding.notificationText, statusDisplayOptions.animateEmojis)\n\n        binding.notificationUsername.text = context.getString(R.string.post_username_format, viewData.account.username)\n\n        val emojifiedDisplayName = wrappedDisplayName.emojify(\n            account.emojis,\n            binding.notificationDisplayName,\n            statusDisplayOptions.animateEmojis\n        )\n        binding.notificationDisplayName.text = emojifiedDisplayName\n\n        if (account.note.isEmpty()) {\n            binding.accountNote.hide()\n        } else {\n            binding.accountNote.show()\n\n            val emojifiedNote = account.note.parseAsMastodonHtml()\n                .emojify(account.emojis, binding.accountNote, statusDisplayOptions.animateEmojis)\n            setClickableText(binding.accountNote, emojifiedNote, emptyList(), null, linkListener)\n        }\n\n        val avatarRadius = context.resources\n            .getDimensionPixelSize(R.dimen.avatar_radius_42dp)\n        loadAvatar(\n            account.avatar,\n            binding.notificationAvatar,\n            avatarRadius,\n            statusDisplayOptions.animateAvatars\n        )\n\n        binding.avatarBadge.visible(statusDisplayOptions.showBotOverlay && account.bot)\n\n        itemView.setOnClickListener { listener.onViewAccount(account.id) }\n        binding.accountNote.setOnClickListener { listener.onViewAccount(account.id) }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/ModerationWarningViewHolder.kt",
    "content": "/* Copyright 2025 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications\n\nimport android.content.Intent\nimport androidx.core.net.toUri\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.databinding.ItemModerationWarningNotificationBinding\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.viewdata.NotificationViewData\n\nclass ModerationWarningViewHolder(\n    private val binding: ItemModerationWarningNotificationBinding,\n    private val instanceDomain: String\n) : RecyclerView.ViewHolder(binding.root), NotificationsViewHolder {\n\n    override fun bind(\n        viewData: NotificationViewData.Concrete,\n        payloads: List<*>,\n        statusDisplayOptions: StatusDisplayOptions\n    ) {\n        if (payloads.isNotEmpty()) {\n            return\n        }\n        val warning = viewData.moderationWarning!!\n\n        binding.moderationWarningDescription.setText(warning.action.text)\n\n        binding.root.setOnClickListener {\n            val intent = Intent(Intent.ACTION_VIEW, \"https://$instanceDomain/disputes/strikes/${warning.id}\".toUri())\n            binding.root.context.startActivity(intent)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationPolicySummaryAdapter.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemFilteredNotificationsInfoBinding\nimport com.keylesspalace.tusky.db.entity.NotificationPolicyEntity\nimport com.keylesspalace.tusky.util.BindingHolder\nimport java.text.NumberFormat\n\nclass NotificationPolicySummaryAdapter(\n    private val onOpenDetails: () -> Unit\n) : RecyclerView.Adapter<BindingHolder<ItemFilteredNotificationsInfoBinding>>() {\n\n    private var state: NotificationPolicyEntity? = null\n\n    fun updateState(newState: NotificationPolicyEntity?) {\n        val oldShowInfo = state.shouldShowInfo()\n        val newShowInfo = newState.shouldShowInfo()\n        state = newState\n        if (oldShowInfo && !newShowInfo) {\n            notifyItemRemoved(0)\n        } else if (!oldShowInfo && newShowInfo) {\n            notifyItemInserted(0)\n        } else if (oldShowInfo && newShowInfo) {\n            notifyItemChanged(0)\n        }\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemFilteredNotificationsInfoBinding> {\n        val binding = ItemFilteredNotificationsInfoBinding.inflate(\n            LayoutInflater.from(parent.context),\n            parent,\n            false\n        )\n        binding.root.setOnClickListener {\n            onOpenDetails()\n        }\n        return BindingHolder(binding)\n    }\n\n    override fun getItemCount() = if (state.shouldShowInfo()) 1 else 0\n\n    override fun onBindViewHolder(holder: BindingHolder<ItemFilteredNotificationsInfoBinding>, position: Int) {\n        state?.let { policyState ->\n            val binding = holder.binding\n            val context = holder.binding.root.context\n            binding.notificationPolicySummaryDescription.text = context.getString(R.string.notifications_from_people_you_may_know, policyState.pendingRequestsCount)\n            binding.notificationPolicySummaryBadge.text = NumberFormat.getInstance().format(policyState.pendingNotificationsCount)\n        }\n    }\n\n    private fun NotificationPolicyEntity?.shouldShowInfo(): Boolean {\n        return this != null && this.pendingNotificationsCount > 0\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationTypeMappers.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications\n\nimport com.keylesspalace.tusky.components.timeline.LoadMorePlaceholder\nimport com.keylesspalace.tusky.components.timeline.toAccount\nimport com.keylesspalace.tusky.components.timeline.toStatus\nimport com.keylesspalace.tusky.db.entity.NotificationDataEntity\nimport com.keylesspalace.tusky.db.entity.NotificationEntity\nimport com.keylesspalace.tusky.db.entity.NotificationReportEntity\nimport com.keylesspalace.tusky.db.entity.TimelineAccountEntity\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.entity.Report\nimport com.keylesspalace.tusky.util.toViewData\nimport com.keylesspalace.tusky.viewdata.NotificationViewData\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport com.keylesspalace.tusky.viewdata.TranslationViewData\n\nfun LoadMorePlaceholder.toNotificationEntity(\n    tuskyAccountId: Long\n) = NotificationEntity(\n    id = this.id,\n    tuskyAccountId = tuskyAccountId,\n    type = null,\n    accountId = null,\n    statusId = null,\n    reportId = null,\n    event = null,\n    moderationWarning = null,\n    loading = loading\n)\n\nfun Notification.toEntity(\n    tuskyAccountId: Long\n) = NotificationEntity(\n    tuskyAccountId = tuskyAccountId,\n    type = type,\n    id = id,\n    accountId = account.id,\n    statusId = status?.reblog?.id ?: status?.id,\n    reportId = report?.id,\n    event = event,\n    moderationWarning = moderationWarning,\n    loading = false\n)\n\nfun Notification.toViewData(\n    isShowingContent: Boolean,\n    isExpanded: Boolean,\n    isCollapsed: Boolean,\n    filter: Filter?,\n): NotificationViewData.Concrete = NotificationViewData.Concrete(\n    id = id,\n    type = type,\n    account = account,\n    statusViewData = status?.toViewData(\n        isShowingContent = isShowingContent,\n        isExpanded = isExpanded,\n        isCollapsed = isCollapsed,\n        filter = filter,\n    ),\n    report = report,\n    moderationWarning = moderationWarning,\n    event = event\n)\n\nfun Report.toEntity(\n    tuskyAccountId: Long\n) = NotificationReportEntity(\n    tuskyAccountId = tuskyAccountId,\n    serverId = id,\n    category = category,\n    statusIds = statusIds,\n    createdAt = createdAt,\n    targetAccountId = targetAccount.id\n)\n\nfun NotificationDataEntity.toViewData(\n    translation: TranslationViewData? = null\n): NotificationViewData {\n    if (type == null || account == null) {\n        return NotificationViewData.LoadMore(id = id, isLoading = loading)\n    }\n\n    return NotificationViewData.Concrete(\n        id = id,\n        type = type,\n        account = account.toAccount(),\n        statusViewData = if (status != null && statusAccount != null) {\n            StatusViewData.Concrete(\n                status = status.toStatus(statusAccount),\n                isExpanded = this.status.expanded,\n                isShowingContent = this.status.contentShowing,\n                isCollapsed = this.status.contentCollapsed,\n                translation = translation\n            )\n        } else {\n            null\n        },\n        report = if (report != null && reportTargetAccount != null) {\n            report.toReport(reportTargetAccount)\n        } else {\n            null\n        },\n        event = event,\n        moderationWarning = moderationWarning\n    )\n}\n\nfun NotificationReportEntity.toReport(\n    account: TimelineAccountEntity\n) = Report(\n    id = serverId,\n    category = category,\n    statusIds = statusIds,\n    createdAt = createdAt,\n    targetAccount = account.toAccount()\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsFragment.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications\n\nimport android.content.DialogInterface\nimport android.content.SharedPreferences\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.ArrayAdapter\nimport android.widget.ListView\nimport android.widget.PopupWindow\nimport androidx.coordinatorlayout.widget.CoordinatorLayout\nimport androidx.core.view.MenuProvider\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport androidx.paging.LoadState\nimport androidx.recyclerview.widget.ConcatAdapter\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.SimpleItemAnimator\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout\nimport at.connyduck.calladapter.networkresult.onFailure\nimport at.connyduck.sparkbutton.SparkButton\nimport at.connyduck.sparkbutton.helpers.Utils\nimport com.google.android.material.appbar.AppBarLayout\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.BaseActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.PreferenceChangedEvent\nimport com.keylesspalace.tusky.components.notifications.requests.NotificationRequestsActivity\nimport com.keylesspalace.tusky.components.preference.PreferencesFragment.ReadingOrder\nimport com.keylesspalace.tusky.components.systemnotifications.NotificationChannelData\nimport com.keylesspalace.tusky.components.systemnotifications.NotificationService\nimport com.keylesspalace.tusky.databinding.FragmentTimelineNotificationsBinding\nimport com.keylesspalace.tusky.databinding.NotificationsFilterBinding\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.fragment.SFragment\nimport com.keylesspalace.tusky.interfaces.AccountActionListener\nimport com.keylesspalace.tusky.interfaces.ReselectableFragment\nimport com.keylesspalace.tusky.interfaces.StatusActionListener\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.util.CardViewMode\nimport com.keylesspalace.tusky.util.ListStatusAccessibilityDelegate\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.util.StatusProvider\nimport com.keylesspalace.tusky.util.ensureBottomPadding\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.openLink\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport com.keylesspalace.tusky.util.updateRelativeTimePeriodically\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.view.ConfirmationBottomSheet.Companion.confirmFavourite\nimport com.keylesspalace.tusky.view.ConfirmationBottomSheet.Companion.confirmReblog\nimport com.keylesspalace.tusky.viewdata.AttachmentViewData\nimport com.keylesspalace.tusky.viewdata.NotificationViewData\nimport com.keylesspalace.tusky.viewdata.TranslationViewData\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass NotificationsFragment :\n    SFragment(R.layout.fragment_timeline_notifications),\n    SwipeRefreshLayout.OnRefreshListener,\n    StatusActionListener,\n    NotificationActionListener,\n    AccountActionListener,\n    MenuProvider,\n    ReselectableFragment {\n\n    @Inject\n    lateinit var preferences: SharedPreferences\n\n    @Inject\n    lateinit var eventHub: EventHub\n\n    @Inject\n    lateinit var notificationService: NotificationService\n\n    private val binding by viewBinding(FragmentTimelineNotificationsBinding::bind)\n\n    private val viewModel: NotificationsViewModel by viewModels()\n\n    private var notificationsAdapter: NotificationsPagingAdapter? = null\n    private var notificationsPolicyAdapter: NotificationPolicySummaryAdapter? = null\n\n    private var showNotificationsFilterBar: Boolean = true\n    private var readingOrder: ReadingOrder = ReadingOrder.NEWEST_FIRST\n\n    /** see [com.keylesspalace.tusky.components.timeline.TimelineFragment] for explanation of the load more mechanism */\n    private var loadMorePosition: Int? = null\n    private var statusIdBelowLoadMore: String? = null\n\n    private var buttonToAnimate: SparkButton? = null\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED)\n\n        val activeAccount = accountManager.activeAccount ?: return\n\n        val statusDisplayOptions = StatusDisplayOptions(\n            animateAvatars = preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false),\n            mediaPreviewEnabled = activeAccount.mediaPreviewEnabled,\n            useAbsoluteTime = preferences.getBoolean(PrefKeys.ABSOLUTE_TIME_VIEW, false),\n            showBotOverlay = preferences.getBoolean(PrefKeys.SHOW_BOT_OVERLAY, true),\n            useBlurhash = preferences.getBoolean(PrefKeys.USE_BLURHASH, true),\n            cardViewMode = if (preferences.getBoolean(PrefKeys.SHOW_CARDS_IN_TIMELINES, false)) {\n                CardViewMode.INDENTED\n            } else {\n                CardViewMode.NONE\n            },\n            hideStats = preferences.getBoolean(PrefKeys.WELLBEING_HIDE_STATS_POSTS, false),\n            animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false),\n            showStatsInline = preferences.getBoolean(PrefKeys.SHOW_STATS_INLINE, false),\n            showSensitiveMedia = activeAccount.alwaysShowSensitiveMedia,\n            openSpoiler = activeAccount.alwaysOpenSpoiler\n        )\n\n        binding.recyclerView.ensureBottomPadding(fab = true)\n\n        // setup the notifications filter bar\n        showNotificationsFilterBar = preferences.getBoolean(PrefKeys.SHOW_NOTIFICATIONS_FILTER, true)\n        updateFilterBarVisibility()\n        binding.buttonClear.setOnClickListener { confirmClearNotifications() }\n        binding.buttonFilter.setOnClickListener { showFilterMenu() }\n\n        // Setup the SwipeRefreshLayout.\n        binding.swipeRefreshLayout.setOnRefreshListener(this)\n\n        // Setup the RecyclerView.\n        binding.recyclerView.setHasFixedSize(true)\n        val adapter = NotificationsPagingAdapter(\n            accountId = activeAccount.accountId,\n            statusListener = this,\n            notificationActionListener = this,\n            accountActionListener = this,\n            statusDisplayOptions = statusDisplayOptions,\n            instanceName = activeAccount.domain\n        )\n        this.notificationsAdapter = adapter\n        binding.recyclerView.layoutManager = LinearLayoutManager(context)\n        binding.recyclerView.setAccessibilityDelegateCompat(\n            ListStatusAccessibilityDelegate(\n                binding.recyclerView,\n                this,\n                StatusProvider { pos: Int ->\n                    if (pos in 0 until adapter.itemCount) {\n                        val notification = adapter.peek(pos)\n                        // We support replies only for now\n                        if (notification is NotificationViewData.Concrete) {\n                            return@StatusProvider notification.statusViewData\n                        } else {\n                            return@StatusProvider null\n                        }\n                    } else {\n                        null\n                    }\n                }\n            )\n        )\n\n        val notificationsPolicyAdapter = NotificationPolicySummaryAdapter {\n            (activity as BaseActivity).startActivityWithSlideInAnimation(NotificationRequestsActivity.newIntent(requireContext()))\n        }\n        this.notificationsPolicyAdapter = notificationsPolicyAdapter\n\n        binding.recyclerView.adapter = ConcatAdapter(notificationsPolicyAdapter, notificationsAdapter)\n\n        (binding.recyclerView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false\n\n        binding.recyclerView.addItemDecoration(\n            DividerItemDecoration(context, DividerItemDecoration.VERTICAL)\n        )\n\n        readingOrder = ReadingOrder.from(preferences.getString(PrefKeys.READING_ORDER, null))\n\n        notificationsPolicyAdapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {\n            override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {\n                binding.recyclerView.scrollToPosition(0)\n            }\n        })\n\n        adapter.addLoadStateListener { loadState ->\n            if (loadState.refresh != LoadState.Loading && loadState.source.refresh != LoadState.Loading) {\n                binding.swipeRefreshLayout.isRefreshing = false\n            }\n\n            binding.statusView.hide()\n            binding.progressBar.hide()\n\n            if (adapter.itemCount == 0) {\n                when (loadState.refresh) {\n                    is LoadState.NotLoading -> {\n                        if (loadState.append is LoadState.NotLoading && loadState.source.refresh is LoadState.NotLoading) {\n                            binding.statusView.show()\n                            binding.statusView.setup(R.drawable.elephant_friend_empty, R.string.message_empty)\n                        }\n                    }\n                    is LoadState.Error -> {\n                        binding.statusView.show()\n                        binding.statusView.setup((loadState.refresh as LoadState.Error).error) { onRefresh() }\n                    }\n                    is LoadState.Loading -> {\n                        binding.progressBar.show()\n                    }\n                }\n            }\n        }\n\n        adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {\n            override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {\n                val firstPos = (binding.recyclerView.layoutManager as LinearLayoutManager).findFirstCompletelyVisibleItemPosition()\n                if (firstPos == 0 && positionStart == 0 && adapter.itemCount != itemCount) {\n                    binding.recyclerView.post {\n                        if (getView() != null) {\n                            binding.recyclerView.scrollBy(\n                                0,\n                                Utils.dpToPx(binding.recyclerView.context, -30)\n                            )\n                        }\n                    }\n                    loadMorePosition = null\n                }\n                if (readingOrder == ReadingOrder.OLDEST_FIRST) {\n                    updateReadingPositionForOldestFirst(adapter)\n                }\n            }\n        })\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.notifications.collectLatest { pagingData ->\n                adapter.submitData(pagingData)\n            }\n        }\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            eventHub.events.collect { event ->\n                if (event is PreferenceChangedEvent) {\n                    onPreferenceChanged(adapter, event.preferenceKey)\n                }\n            }\n        }\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                accountManager.activeAccount?.let { account ->\n                    notificationService.clearNotificationsForAccount(account)\n                }\n            }\n        }\n\n        updateRelativeTimePeriodically(preferences, adapter)\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.notificationPolicy.collect {\n                notificationsPolicyAdapter.updateState(it)\n            }\n        }\n    }\n\n    override fun onDestroyView() {\n        // Clear the adapters to prevent leaking the View\n        notificationsAdapter = null\n        notificationsPolicyAdapter = null\n        buttonToAnimate = null\n        super.onDestroyView()\n    }\n\n    override fun onReselect() {\n        if (view != null) {\n            binding.recyclerView.layoutManager?.scrollToPosition(0)\n            binding.recyclerView.stopScroll()\n        }\n    }\n\n    override fun onRefresh() {\n        notificationsAdapter?.refresh()\n        viewModel.loadNotificationPolicy()\n    }\n\n    override fun onViewAccount(id: String) {\n        super.viewAccount(id)\n    }\n\n    override fun onMute(mute: Boolean, id: String, position: Int, notifications: Boolean) {\n        // not needed, muting via the more menu on statuses is handled in SFragment\n    }\n\n    override fun onBlock(block: Boolean, id: String, position: Int) {\n        // not needed, blocking via the more menu on statuses is handled in SFragment\n    }\n\n    override fun onRespondToFollowRequest(accept: Boolean, accountIdRequestingFollow: String, position: Int) {\n        val notification = notificationsAdapter?.peek(position) ?: return\n        viewModel.respondToFollowRequest(accept, accountIdRequestingFollow = accountIdRequestingFollow, notificationId = notification.id)\n    }\n\n    override fun onViewReport(reportId: String) {\n        requireContext().openLink(\n            \"https://${accountManager.activeAccount!!.domain}/admin/reports/$reportId\"\n        )\n    }\n\n    override fun onViewTag(tag: String) {\n        super.viewTag(tag)\n    }\n\n    override fun onReply(position: Int) {\n        val status = notificationsAdapter?.peek(position)?.asStatusOrNull() ?: return\n        super.reply(status.status)\n    }\n\n    override fun removeItem(position: Int) {\n        val notification = notificationsAdapter?.peek(position) ?: return\n        viewModel.remove(notification.id)\n    }\n\n    override fun onReblog(reblog: Boolean, position: Int, visibility: Status.Visibility?, button: SparkButton?) {\n        val status = notificationsAdapter?.peek(position)?.asStatusOrNull() ?: return\n        buttonToAnimate = button\n\n        if (reblog && visibility == null) {\n            confirmReblog(preferences) { visibility ->\n                viewModel.reblog(true, status, visibility)\n                buttonToAnimate?.playAnimation()\n                buttonToAnimate?.isChecked = true\n            }\n        } else {\n            viewModel.reblog(reblog, status, visibility ?: Status.Visibility.PUBLIC)\n            if (reblog) {\n                buttonToAnimate?.playAnimation()\n            }\n            buttonToAnimate?.isChecked = reblog\n        }\n    }\n\n    override val onMoreTranslate: (translate: Boolean, position: Int) -> Unit\n        get() = { translate: Boolean, position: Int ->\n            if (translate) {\n                onTranslate(position)\n            } else {\n                onUntranslate(position)\n            }\n        }\n\n    private fun onTranslate(position: Int) {\n        val status = notificationsAdapter?.peek(position)?.asStatusOrNull() ?: return\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.translate(status)\n                .onFailure {\n                    Snackbar.make(\n                        requireView(),\n                        getString(R.string.ui_error_translate, it.message),\n                        Snackbar.LENGTH_LONG\n                    ).show()\n                }\n        }\n    }\n\n    override fun onUntranslate(position: Int) {\n        val status = notificationsAdapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.untranslate(status)\n    }\n\n    override fun onFavourite(favourite: Boolean, position: Int, button: SparkButton?) {\n        val status = notificationsAdapter?.peek(position)?.asStatusOrNull() ?: return\n        buttonToAnimate = button\n\n        if (favourite) {\n            confirmFavourite(preferences) {\n                viewModel.favorite(true, status)\n                buttonToAnimate?.playAnimation()\n                buttonToAnimate?.isChecked = true\n            }\n        } else {\n            viewModel.favorite(false, status)\n            buttonToAnimate?.isChecked = false\n        }\n    }\n\n    override fun onBookmark(bookmark: Boolean, position: Int) {\n        val status = notificationsAdapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.bookmark(bookmark, status)\n    }\n\n    override fun onVoteInPoll(position: Int, choices: List<Int>) {\n        val status = notificationsAdapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.voteInPoll(choices, status)\n    }\n\n    override fun onShowPollResults(position: Int) {\n        notificationsAdapter?.peek(position)?.asStatusOrNull()?.let { status ->\n            viewModel.showPollResults(status)\n        }\n    }\n\n    override fun clearWarningAction(position: Int) {\n        val status = notificationsAdapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.clearWarning(status)\n    }\n\n    override fun onMore(view: View, position: Int) {\n        val status = notificationsAdapter?.peek(position)?.asStatusOrNull() ?: return\n        super.more(\n            status.status,\n            view,\n            position,\n            (status.translation as? TranslationViewData.Loaded)?.data\n        )\n    }\n\n    override fun onViewMedia(position: Int, attachmentIndex: Int, view: View?) {\n        val status = notificationsAdapter?.peek(position)?.asStatusOrNull() ?: return\n        super.viewMedia(attachmentIndex, AttachmentViewData.list(status), view)\n    }\n\n    override fun onViewThread(position: Int) {\n        val status = notificationsAdapter?.peek(position)?.asStatusOrNull()?.status ?: return\n        super.viewThread(status.id, status.url)\n    }\n\n    override fun onOpenReblog(position: Int) {\n        val status = notificationsAdapter?.peek(position)?.asStatusOrNull() ?: return\n        super.openReblog(status.status)\n    }\n\n    override fun onExpandedChange(expanded: Boolean, position: Int) {\n        val status = notificationsAdapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.changeExpanded(expanded, status)\n    }\n\n    override fun onContentHiddenChange(isShowing: Boolean, position: Int) {\n        val status = notificationsAdapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.changeContentShowing(isShowing, status)\n    }\n\n    override fun onLoadMore(position: Int) {\n        val adapter = this.notificationsAdapter\n        val placeholder = adapter?.peek(position)?.asPlaceholderOrNull() ?: return\n        loadMorePosition = position\n        statusIdBelowLoadMore =\n            if (position + 1 < adapter.itemCount) adapter.peek(position + 1)?.id else null\n        viewModel.loadMore(placeholder.id)\n    }\n\n    override fun onContentCollapsedChange(isCollapsed: Boolean, position: Int) {\n        val status = notificationsAdapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.changeContentCollapsed(isCollapsed, status)\n    }\n\n    private fun confirmClearNotifications() {\n        MaterialAlertDialogBuilder(requireContext())\n            .setMessage(R.string.notification_clear_text)\n            .setPositiveButton(android.R.string.ok) { _: DialogInterface?, _: Int -> clearNotifications() }\n            .setNegativeButton(android.R.string.cancel, null)\n            .show()\n    }\n\n    private fun clearNotifications() {\n        viewModel.clearNotifications()\n    }\n\n    private fun showFilterMenu() {\n        val notificationTypeList = NotificationChannelData.entries.map { type ->\n            getString(type.title)\n        }\n\n        val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_list_item_multiple_choice, notificationTypeList)\n        val window = PopupWindow(requireContext(), null, com.google.android.material.R.attr.listPopupWindowStyle)\n        val menuBinding = NotificationsFilterBinding.inflate(LayoutInflater.from(requireContext()), binding.root as ViewGroup, false)\n\n        menuBinding.buttonApply.setOnClickListener {\n            val checkedItems = menuBinding.listView.getCheckedItemPositions()\n            val excludes = NotificationChannelData.entries.filterIndexed { index, _ ->\n                !checkedItems[index, false]\n            }\n            window.dismiss()\n            viewModel.updateNotificationFilters(excludes.toSet())\n        }\n\n        menuBinding.listView.setAdapter(adapter)\n        menuBinding.listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE)\n\n        NotificationChannelData.entries.forEachIndexed { index, type ->\n            menuBinding.listView.setItemChecked(index, !viewModel.excludes.value.contains(type))\n        }\n\n        window.setContentView(menuBinding.root)\n        window.isFocusable = true\n        window.width = ViewGroup.LayoutParams.WRAP_CONTENT\n        window.height = ViewGroup.LayoutParams.WRAP_CONTENT\n        window.showAsDropDown(binding.buttonFilter)\n    }\n\n    private fun onPreferenceChanged(adapter: NotificationsPagingAdapter, key: String) {\n        when (key) {\n            PrefKeys.MEDIA_PREVIEW_ENABLED -> {\n                val enabled = accountManager.activeAccount!!.mediaPreviewEnabled\n                val oldMediaPreviewEnabled = adapter.mediaPreviewEnabled\n                if (enabled != oldMediaPreviewEnabled) {\n                    adapter.mediaPreviewEnabled = enabled\n                }\n            }\n\n            PrefKeys.SHOW_NOTIFICATIONS_FILTER -> {\n                if (view != null) {\n                    showNotificationsFilterBar = preferences.getBoolean(PrefKeys.SHOW_NOTIFICATIONS_FILTER, true)\n                    updateFilterBarVisibility()\n                }\n            }\n\n            PrefKeys.READING_ORDER -> {\n                readingOrder = ReadingOrder.from(\n                    preferences.getString(PrefKeys.READING_ORDER, null)\n                )\n            }\n        }\n    }\n\n    private fun updateFilterBarVisibility() {\n        val params = binding.swipeRefreshLayout.layoutParams as CoordinatorLayout.LayoutParams\n        if (showNotificationsFilterBar) {\n            binding.appBarOptions.setExpanded(true, false)\n            binding.appBarOptions.show()\n            // Set content behaviour to hide filter on scroll\n            params.behavior = AppBarLayout.ScrollingViewBehavior()\n        } else {\n            binding.appBarOptions.setExpanded(false, false)\n            binding.appBarOptions.hide()\n            // Clear behaviour to hide app bar\n            params.behavior = null\n        }\n    }\n\n    private fun updateReadingPositionForOldestFirst(adapter: NotificationsPagingAdapter) {\n        var position = loadMorePosition ?: return\n        val notificationIdBelowLoadMore = statusIdBelowLoadMore ?: return\n\n        var notification: NotificationViewData?\n        while (adapter.peek(position).let {\n                notification = it\n                it != null\n            }\n        ) {\n            if (notification?.id == notificationIdBelowLoadMore) {\n                val lastVisiblePosition =\n                    (binding.recyclerView.layoutManager as LinearLayoutManager).findLastVisibleItemPosition()\n                if (position > lastVisiblePosition) {\n                    binding.recyclerView.scrollToPosition(position)\n                }\n                break\n            }\n            position++\n        }\n        loadMorePosition = null\n    }\n\n    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n        menuInflater.inflate(R.menu.fragment_notifications, menu)\n    }\n\n    override fun onMenuItemSelected(menuItem: MenuItem) = when (menuItem.itemId) {\n        R.id.action_refresh -> {\n            binding.swipeRefreshLayout.isRefreshing = true\n            onRefresh()\n            true\n        }\n        R.id.action_edit_notification_filter -> {\n            showFilterMenu()\n            true\n        }\n        R.id.action_clear_notifications -> {\n            confirmClearNotifications()\n            true\n        }\n        else -> false\n    }\n\n    companion object {\n        fun newInstance() = NotificationsFragment()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsPagingAdapter.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.paging.PagingDataAdapter\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.adapter.FilteredStatusViewHolder\nimport com.keylesspalace.tusky.adapter.FollowRequestViewHolder\nimport com.keylesspalace.tusky.adapter.LoadMoreViewHolder\nimport com.keylesspalace.tusky.adapter.PlaceholderViewHolder\nimport com.keylesspalace.tusky.adapter.StatusBaseViewHolder\nimport com.keylesspalace.tusky.databinding.ItemFollowBinding\nimport com.keylesspalace.tusky.databinding.ItemFollowRequestBinding\nimport com.keylesspalace.tusky.databinding.ItemLoadMoreBinding\nimport com.keylesspalace.tusky.databinding.ItemModerationWarningNotificationBinding\nimport com.keylesspalace.tusky.databinding.ItemPlaceholderBinding\nimport com.keylesspalace.tusky.databinding.ItemReportNotificationBinding\nimport com.keylesspalace.tusky.databinding.ItemSeveredRelationshipNotificationBinding\nimport com.keylesspalace.tusky.databinding.ItemStatusFilteredBinding\nimport com.keylesspalace.tusky.databinding.ItemStatusNotificationBinding\nimport com.keylesspalace.tusky.databinding.ItemUnknownNotificationBinding\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.interfaces.AccountActionListener\nimport com.keylesspalace.tusky.interfaces.StatusActionListener\nimport com.keylesspalace.tusky.util.AbsoluteTimeFormatter\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.viewdata.NotificationViewData\n\ninterface NotificationActionListener {\n    fun onViewReport(reportId: String)\n}\n\ninterface NotificationsViewHolder {\n    fun bind(\n        viewData: NotificationViewData.Concrete,\n        payloads: List<*>,\n        statusDisplayOptions: StatusDisplayOptions\n    )\n}\n\nclass NotificationsPagingAdapter(\n    private val accountId: String,\n    private var statusDisplayOptions: StatusDisplayOptions,\n    private val statusListener: StatusActionListener,\n    private val notificationActionListener: NotificationActionListener,\n    private val accountActionListener: AccountActionListener,\n    private val instanceName: String\n) : PagingDataAdapter<NotificationViewData, RecyclerView.ViewHolder>(NotificationsDifferCallback) {\n\n    var mediaPreviewEnabled: Boolean\n        get() = statusDisplayOptions.mediaPreviewEnabled\n        set(mediaPreviewEnabled) {\n            statusDisplayOptions = statusDisplayOptions.copy(\n                mediaPreviewEnabled = mediaPreviewEnabled\n            )\n            notifyItemRangeChanged(0, itemCount)\n        }\n\n    private val absoluteTimeFormatter = AbsoluteTimeFormatter()\n\n    init {\n        stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY\n    }\n\n    override fun getItemViewType(position: Int): Int {\n        return when (val notification = getItem(position)) {\n            is NotificationViewData.LoadMore -> VIEW_TYPE_LOAD_MORE\n            is NotificationViewData.Concrete -> {\n                when (notification.type) {\n                    Notification.Type.Mention,\n                    Notification.Type.Poll -> if (notification.statusViewData?.filter?.action == Filter.Action.WARN) {\n                        VIEW_TYPE_STATUS_FILTERED\n                    } else {\n                        VIEW_TYPE_STATUS\n                    }\n                    Notification.Type.Status,\n                    Notification.Type.Update -> if (notification.statusViewData?.filter?.action == Filter.Action.WARN) {\n                        VIEW_TYPE_STATUS_FILTERED\n                    } else {\n                        VIEW_TYPE_STATUS_NOTIFICATION\n                    }\n                    Notification.Type.Favourite,\n                    Notification.Type.Reblog -> VIEW_TYPE_STATUS_NOTIFICATION\n                    Notification.Type.Follow,\n                    Notification.Type.SignUp -> VIEW_TYPE_FOLLOW\n                    Notification.Type.FollowRequest -> VIEW_TYPE_FOLLOW_REQUEST\n                    Notification.Type.Report -> VIEW_TYPE_REPORT\n                    Notification.Type.SeveredRelationship -> VIEW_TYPE_SEVERED_RELATIONSHIP\n                    Notification.Type.ModerationWarning -> VIEW_TYPE_MODERATION_WARNING\n                    else -> VIEW_TYPE_UNKNOWN\n                }\n            }\n            null -> VIEW_TYPE_PLACEHOLDER\n        }\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {\n        val inflater = LayoutInflater.from(parent.context)\n        return when (viewType) {\n            VIEW_TYPE_PLACEHOLDER -> PlaceholderViewHolder(\n                ItemPlaceholderBinding.inflate(inflater, parent, false),\n                mode = PlaceholderViewHolder.Mode.NOTIFICATION\n            )\n            VIEW_TYPE_STATUS -> StatusViewHolder(\n                inflater.inflate(R.layout.item_status, parent, false),\n                statusListener,\n                accountId\n            )\n            VIEW_TYPE_STATUS_FILTERED -> FilteredStatusViewHolder(\n                ItemStatusFilteredBinding.inflate(inflater, parent, false),\n                statusListener\n            )\n            VIEW_TYPE_STATUS_NOTIFICATION -> StatusNotificationViewHolder(\n                ItemStatusNotificationBinding.inflate(inflater, parent, false),\n                statusListener,\n                absoluteTimeFormatter\n            )\n            VIEW_TYPE_FOLLOW -> FollowViewHolder(\n                ItemFollowBinding.inflate(inflater, parent, false),\n                accountActionListener,\n                statusListener\n            )\n            VIEW_TYPE_FOLLOW_REQUEST -> FollowRequestViewHolder(\n                ItemFollowRequestBinding.inflate(inflater, parent, false),\n                accountActionListener,\n                statusListener,\n                true\n            )\n            VIEW_TYPE_LOAD_MORE -> LoadMoreViewHolder(\n                ItemLoadMoreBinding.inflate(inflater, parent, false),\n                statusListener\n            )\n            VIEW_TYPE_REPORT -> ReportNotificationViewHolder(\n                ItemReportNotificationBinding.inflate(inflater, parent, false),\n                notificationActionListener,\n                accountActionListener\n            )\n            VIEW_TYPE_SEVERED_RELATIONSHIP -> SeveredRelationshipNotificationViewHolder(\n                ItemSeveredRelationshipNotificationBinding.inflate(inflater, parent, false),\n                instanceName\n            )\n            VIEW_TYPE_MODERATION_WARNING -> ModerationWarningViewHolder(\n                ItemModerationWarningNotificationBinding.inflate(inflater, parent, false),\n                instanceName\n            )\n            else -> UnknownNotificationViewHolder(\n                ItemUnknownNotificationBinding.inflate(inflater, parent, false)\n            )\n        }\n    }\n\n    override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) {\n        onBindViewHolder(viewHolder, position, emptyList())\n    }\n\n    override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int, payloads: List<Any>) {\n        getItem(position)?.let { notification ->\n            when (notification) {\n                is NotificationViewData.Concrete ->\n                    (viewHolder as NotificationsViewHolder).bind(notification, payloads, statusDisplayOptions)\n                is NotificationViewData.LoadMore -> {\n                    (viewHolder as LoadMoreViewHolder).setup(notification.isLoading)\n                }\n            }\n        }\n    }\n\n    companion object {\n        private const val VIEW_TYPE_PLACEHOLDER = 0\n        private const val VIEW_TYPE_STATUS = 1\n        private const val VIEW_TYPE_STATUS_FILTERED = 2\n        private const val VIEW_TYPE_STATUS_NOTIFICATION = 3\n        private const val VIEW_TYPE_FOLLOW = 4\n        private const val VIEW_TYPE_FOLLOW_REQUEST = 5\n        private const val VIEW_TYPE_LOAD_MORE = 6\n        private const val VIEW_TYPE_REPORT = 7\n        private const val VIEW_TYPE_SEVERED_RELATIONSHIP = 8\n        private const val VIEW_TYPE_MODERATION_WARNING = 9\n        private const val VIEW_TYPE_UNKNOWN = 10\n\n        val NotificationsDifferCallback = object : DiffUtil.ItemCallback<NotificationViewData>() {\n            override fun areItemsTheSame(\n                oldItem: NotificationViewData,\n                newItem: NotificationViewData\n            ): Boolean {\n                return oldItem.id == newItem.id\n            }\n\n            override fun areContentsTheSame(\n                oldItem: NotificationViewData,\n                newItem: NotificationViewData\n            ): Boolean {\n                return false // Items are different always. It allows to refresh timestamp on every view holder update\n            }\n\n            override fun getChangePayload(\n                oldItem: NotificationViewData,\n                newItem: NotificationViewData\n            ): Any? {\n                return if (oldItem == newItem) {\n                    // If items are equal - update timestamp only\n                    StatusBaseViewHolder.Key.KEY_CREATED\n                } else {\n                    // If items are different - update the whole view holder\n                    null\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsRemoteMediator.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications\n\nimport android.util.Log\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.LoadType\nimport androidx.paging.PagingState\nimport androidx.paging.RemoteMediator\nimport androidx.room.withTransaction\nimport com.keylesspalace.tusky.components.systemnotifications.toTypes\nimport com.keylesspalace.tusky.components.timeline.LoadMorePlaceholder\nimport com.keylesspalace.tusky.components.timeline.toEntity\nimport com.keylesspalace.tusky.components.timeline.util.ifExpected\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.db.entity.NotificationDataEntity\nimport com.keylesspalace.tusky.db.entity.TimelineStatusEntity\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.isLessThan\nimport retrofit2.HttpException\n\n@OptIn(ExperimentalPagingApi::class)\nclass NotificationsRemoteMediator(\n    private val viewModel: NotificationsViewModel,\n    private val accountManager: AccountManager,\n    private val api: MastodonApi,\n    private val db: AppDatabase\n) : RemoteMediator<Int, NotificationDataEntity>() {\n\n    private var initialRefresh = false\n\n    private val notificationsDao = db.notificationsDao()\n    private val accountDao = db.timelineAccountDao()\n    private val statusDao = db.timelineStatusDao()\n\n    override suspend fun load(\n        loadType: LoadType,\n        state: PagingState<Int, NotificationDataEntity>\n    ): MediatorResult {\n        val activeAccount = viewModel.activeAccountFlow.value\n        if (activeAccount == null) {\n            return MediatorResult.Success(endOfPaginationReached = true)\n        }\n\n        val excludes = viewModel.excludes.value.toTypes()\n\n        try {\n            var dbEmpty = false\n\n            val topPlaceholderId = if (loadType == LoadType.REFRESH) {\n                notificationsDao.getTopPlaceholderId(activeAccount.id)\n            } else {\n                null // don't execute the query if it is not needed\n            }\n\n            if (!initialRefresh && loadType == LoadType.REFRESH) {\n                val topId = notificationsDao.getTopId(activeAccount.id)\n                topId?.let { cachedTopId ->\n                    val notificationResponse = api.notifications(\n                        maxId = cachedTopId,\n                        // so already existing placeholders don't get accidentally overwritten\n                        sinceId = topPlaceholderId,\n                        limit = state.config.pageSize,\n                        excludes = excludes\n                    )\n\n                    val notifications = notificationResponse.body()\n                    if (notificationResponse.isSuccessful && notifications != null) {\n                        db.withTransaction {\n                            replaceNotificationRange(notifications, state, activeAccount)\n                        }\n                    }\n                }\n                initialRefresh = true\n                dbEmpty = topId == null\n            }\n\n            val notificationResponse = when (loadType) {\n                LoadType.REFRESH -> {\n                    api.notifications(sinceId = topPlaceholderId, limit = state.config.pageSize, excludes = excludes)\n                }\n                LoadType.PREPEND -> {\n                    return MediatorResult.Success(endOfPaginationReached = true)\n                }\n                LoadType.APPEND -> {\n                    val maxId = state.pages.findLast { it.data.isNotEmpty() }?.data?.lastOrNull()?.id\n                    api.notifications(maxId = maxId, limit = state.config.pageSize, excludes = excludes)\n                }\n            }\n\n            val notifications = notificationResponse.body()\n            if (!notificationResponse.isSuccessful || notifications == null) {\n                return MediatorResult.Error(HttpException(notificationResponse))\n            }\n\n            db.withTransaction {\n                val overlappedNotifications = replaceNotificationRange(notifications, state, activeAccount)\n\n                /* In case we loaded a whole page and there was no overlap with existing statuses,\n                   we insert a placeholder because there might be even more unknown statuses */\n                if (loadType == LoadType.REFRESH && overlappedNotifications == 0 && notifications.size == state.config.pageSize && !dbEmpty) {\n                    /* This overrides the last of the newly loaded statuses with a placeholder\n                       to guarantee the placeholder has an id that exists on the server as not all\n                       servers handle client generated ids as expected */\n                    notificationsDao.insertNotification(\n                        LoadMorePlaceholder(notifications.last().id, loading = false).toNotificationEntity(activeAccount.id)\n                    )\n                }\n            }\n            return MediatorResult.Success(endOfPaginationReached = notifications.isEmpty())\n        } catch (e: Exception) {\n            return ifExpected(e) {\n                Log.w(TAG, \"Failed to load notifications\", e)\n                MediatorResult.Error(e)\n            }\n        }\n    }\n\n    /**\n     * Deletes all notifications in a given range and inserts new notifications.\n     * This is necessary so notifications that have been deleted on the server are cleaned up.\n     * Should be run in a transaction as it executes multiple db updates\n     * @param notifications the new notifications\n     * @return the number of old notifications that have been cleared from the database\n     */\n    private suspend fun replaceNotificationRange(\n        notifications: List<Notification>,\n        state: PagingState<Int, NotificationDataEntity>,\n        activeAccount: AccountEntity\n    ): Int {\n        val overlappedNotifications = if (notifications.isNotEmpty()) {\n            notificationsDao.deleteRange(activeAccount.id, notifications.last().id, notifications.first().id)\n        } else {\n            0\n        }\n\n        for (notification in notifications) {\n            accountDao.insert(notification.account.toEntity(activeAccount.id))\n            notification.report?.let { report ->\n                accountDao.insert(report.targetAccount.toEntity(activeAccount.id))\n                notificationsDao.insertReport(report.toEntity(activeAccount.id))\n            }\n\n            // check if we already have one of the newly loaded statuses cached locally\n            // in case we do, copy the local state (expanded, contentShowing, contentCollapsed) over so it doesn't get lost\n            var oldStatus: TimelineStatusEntity? = null\n            for (page in state.pages) {\n                oldStatus = page.data.find { s ->\n                    s.id == notification.id\n                }?.status\n                if (oldStatus != null) break\n            }\n\n            notification.status?.let { status ->\n                val expanded = oldStatus?.expanded ?: activeAccount.alwaysOpenSpoiler\n                val contentShowing = oldStatus?.contentShowing ?: (activeAccount.alwaysShowSensitiveMedia || !status.sensitive)\n                val contentCollapsed = oldStatus?.contentCollapsed ?: true\n\n                val statusToInsert = status.reblog ?: status\n                accountDao.insert(statusToInsert.account.toEntity(activeAccount.id))\n                statusDao.insert(\n                    statusToInsert.toEntity(\n                        tuskyAccountId = activeAccount.id,\n                        expanded = expanded,\n                        contentShowing = contentShowing,\n                        contentCollapsed = contentCollapsed\n                    )\n                )\n            }\n\n            notificationsDao.insertNotification(\n                notification.toEntity(\n                    activeAccount.id\n                )\n            )\n        }\n        notifications.firstOrNull()?.let { notification ->\n            saveNewestNotificationId(notification)\n        }\n        return overlappedNotifications\n    }\n\n    private suspend fun saveNewestNotificationId(notification: Notification) {\n        viewModel.activeAccountFlow.value?.let { activeAccount ->\n            val lastNotificationId: String = activeAccount.lastNotificationId\n            val newestNotificationId = notification.id\n            if (lastNotificationId.isLessThan(newestNotificationId)) {\n                Log.d(TAG, \"saving newest noti id: $lastNotificationId for account ${activeAccount.id}\")\n                accountManager.updateAccount(activeAccount) { copy(lastNotificationId = newestNotificationId) }\n            }\n        }\n    }\n\n    companion object {\n        private const val TAG = \"NotificationsRM\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications\n\nimport android.content.SharedPreferences\nimport android.util.Log\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.Pager\nimport androidx.paging.PagingConfig\nimport androidx.paging.cachedIn\nimport androidx.paging.filter\nimport androidx.paging.map\nimport androidx.room.withTransaction\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport at.connyduck.calladapter.networkresult.fold\nimport at.connyduck.calladapter.networkresult.map\nimport at.connyduck.calladapter.networkresult.onFailure\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.FilterUpdatedEvent\nimport com.keylesspalace.tusky.appstore.PreferenceChangedEvent\nimport com.keylesspalace.tusky.components.preference.PreferencesFragment.ReadingOrder\nimport com.keylesspalace.tusky.components.systemnotifications.NotificationChannelData\nimport com.keylesspalace.tusky.components.systemnotifications.toTypes\nimport com.keylesspalace.tusky.components.timeline.LoadMorePlaceholder\nimport com.keylesspalace.tusky.components.timeline.toEntity\nimport com.keylesspalace.tusky.components.timeline.util.ifExpected\nimport com.keylesspalace.tusky.components.timeline.viewmodel.TimelineViewModel\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.entity.NotificationPolicyEntity\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.network.FilterModel\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.usecase.NotificationPolicyUsecase\nimport com.keylesspalace.tusky.usecase.TimelineCases\nimport com.keylesspalace.tusky.viewdata.NotificationViewData\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport com.keylesspalace.tusky.viewdata.TranslationViewData\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport retrofit2.HttpException\n\n@HiltViewModel\nclass NotificationsViewModel @Inject constructor(\n    private val timelineCases: TimelineCases,\n    private val api: MastodonApi,\n    eventHub: EventHub,\n    private val accountManager: AccountManager,\n    private val preferences: SharedPreferences,\n    private val filterModel: FilterModel,\n    private val db: AppDatabase,\n    private val notificationPolicyUsecase: NotificationPolicyUsecase\n) : ViewModel() {\n\n    val activeAccountFlow = accountManager.activeAccount(viewModelScope)\n    private val accountId: Long = activeAccountFlow.value!!.id\n\n    private val refreshTrigger = MutableStateFlow(0L)\n\n    val excludes: StateFlow<Set<NotificationChannelData>> = activeAccountFlow\n        .map { account -> account?.notificationsFilter.orEmpty() }\n        .stateIn(viewModelScope, SharingStarted.Eagerly, activeAccountFlow.value?.notificationsFilter.orEmpty())\n\n    /** Map from notification id to translation. */\n    private val translations = MutableStateFlow(mapOf<String, TranslationViewData>())\n\n    private var remoteMediator = NotificationsRemoteMediator(this, accountManager, api, db)\n\n    private var readingOrder: ReadingOrder =\n        ReadingOrder.from(preferences.getString(PrefKeys.READING_ORDER, null))\n\n    @OptIn(ExperimentalPagingApi::class, ExperimentalCoroutinesApi::class)\n    val notifications = refreshTrigger.flatMapLatest {\n        Pager(\n            config = PagingConfig(\n                pageSize = LOAD_AT_ONCE\n            ),\n            remoteMediator = remoteMediator,\n            pagingSourceFactory = {\n                db.notificationsDao().getNotifications(accountId)\n            }\n        ).flow\n            .cachedIn(viewModelScope)\n            .combine(translations) { pagingData, translations ->\n                pagingData.map { notification ->\n                    val translation = translations[notification.status?.serverId]\n                    notification.toViewData(translation = translation)\n                }.filter { notificationViewData ->\n                    shouldFilterStatus(notificationViewData)?.action != Filter.Action.HIDE\n                }\n            }\n    }\n        .flowOn(Dispatchers.Default)\n\n    val notificationPolicy: Flow<NotificationPolicyEntity?> = notificationPolicyUsecase.info\n\n    init {\n        viewModelScope.launch {\n            eventHub.events.collect { event ->\n                if (event is PreferenceChangedEvent) {\n                    onPreferenceChanged(event.preferenceKey)\n                }\n                if (event is FilterUpdatedEvent && event.filterContext.contains(Filter.Kind.NOTIFICATIONS)) {\n                    filterModel.init(Filter.Kind.NOTIFICATIONS)\n                    refreshTrigger.value += 1\n                }\n            }\n        }\n        viewModelScope.launch {\n            val needsRefresh = filterModel.init(Filter.Kind.NOTIFICATIONS)\n            if (needsRefresh) {\n                refreshTrigger.value++\n            }\n        }\n        loadNotificationPolicy()\n    }\n\n    fun loadNotificationPolicy() {\n        viewModelScope.launch {\n            notificationPolicyUsecase.getNotificationPolicy()\n        }\n    }\n\n    fun updateNotificationFilters(newFilters: Set<NotificationChannelData>) {\n        val account = activeAccountFlow.value\n        if (newFilters != excludes.value && account != null) {\n            viewModelScope.launch {\n                accountManager.updateAccount(account) {\n                    copy(notificationsFilter = newFilters)\n                }\n                db.notificationsDao().cleanupNotifications(accountId, 0)\n                refreshTrigger.value++\n            }\n        }\n    }\n\n    private fun shouldFilterStatus(notificationViewData: NotificationViewData): Filter? {\n        return when ((notificationViewData as? NotificationViewData.Concrete)?.type) {\n            Notification.Type.Mention, Notification.Type.Poll, Notification.Type.Status, Notification.Type.Update -> {\n                val account = activeAccountFlow.value\n                notificationViewData.statusViewData?.let { statusViewData ->\n                    if (statusViewData.status.account.id == account?.accountId) {\n                        return null\n                    }\n                    statusViewData.filter = filterModel.shouldFilterStatus(statusViewData.actionable)\n                    return statusViewData.filter\n                }\n                null\n            }\n\n            else -> null\n        }\n    }\n\n    fun respondToFollowRequest(accept: Boolean, accountIdRequestingFollow: String, notificationId: String) {\n        viewModelScope.launch {\n            if (accept) {\n                api.authorizeFollowRequest(accountIdRequestingFollow)\n            } else {\n                api.rejectFollowRequest(accountIdRequestingFollow)\n            }.fold(\n                onSuccess = {\n                    // since the follow request has been responded, the notification can be deleted. The Ui will update automatically.\n                    db.notificationsDao().delete(accountId, notificationId)\n                    if (accept) {\n                        // refresh the notifications so the new follow notification will be loaded\n                        refreshTrigger.value++\n                    }\n                },\n                onFailure = { t ->\n                    Log.e(TAG, \"Failed to to respond to follow request from account id $accountIdRequestingFollow.\", t)\n                }\n            )\n        }\n    }\n\n    fun reblog(reblog: Boolean, status: StatusViewData.Concrete, visibility: Status.Visibility = Status.Visibility.PUBLIC): Job = viewModelScope.launch {\n        timelineCases.reblog(status.actionableId, reblog, visibility).onFailure { t ->\n            ifExpected(t) {\n                Log.w(TAG, \"Failed to reblog status \" + status.actionableId, t)\n            }\n        }\n    }\n\n    fun favorite(favorite: Boolean, status: StatusViewData.Concrete): Job = viewModelScope.launch {\n        timelineCases.favourite(status.actionableId, favorite).onFailure { t ->\n            ifExpected(t) {\n                Log.d(TAG, \"Failed to favourite status \" + status.actionableId, t)\n            }\n        }\n    }\n\n    fun bookmark(bookmark: Boolean, status: StatusViewData.Concrete): Job = viewModelScope.launch {\n        timelineCases.bookmark(status.actionableId, bookmark).onFailure { t ->\n            ifExpected(t) {\n                Log.d(TAG, \"Failed to bookmark status \" + status.actionableId, t)\n            }\n        }\n    }\n\n    fun voteInPoll(choices: List<Int>, status: StatusViewData.Concrete) = viewModelScope.launch {\n        val poll = status.status.actionableStatus.poll ?: run {\n            Log.d(TAG, \"No poll on status ${status.id}\")\n            return@launch\n        }\n        timelineCases.voteInPoll(status.actionableId, poll.id, choices).onFailure { t ->\n            ifExpected(t) {\n                Log.d(TAG, \"Failed to vote in poll: \" + status.actionableId, t)\n            }\n        }\n    }\n\n    fun showPollResults(status: StatusViewData.Concrete) = viewModelScope.launch {\n        timelineCases.showPollResults(status.actionableId)\n    }\n\n    fun changeExpanded(expanded: Boolean, status: StatusViewData.Concrete) {\n        viewModelScope.launch {\n            db.timelineStatusDao()\n                .setExpanded(accountId, status.id, expanded)\n        }\n    }\n\n    fun changeContentShowing(isShowing: Boolean, status: StatusViewData.Concrete) {\n        viewModelScope.launch {\n            db.timelineStatusDao()\n                .setContentShowing(accountId, status.id, isShowing)\n        }\n    }\n\n    fun changeContentCollapsed(isCollapsed: Boolean, status: StatusViewData.Concrete) {\n        viewModelScope.launch {\n            db.timelineStatusDao()\n                .setContentCollapsed(accountId, status.id, isCollapsed)\n        }\n    }\n\n    fun remove(notificationId: String) {\n        viewModelScope.launch {\n            db.notificationsDao().delete(accountId, notificationId)\n        }\n    }\n\n    fun clearWarning(status: StatusViewData.Concrete) {\n        viewModelScope.launch {\n            db.timelineStatusDao().clearWarning(accountId, status.actionableId)\n        }\n    }\n\n    fun clearNotifications() {\n        viewModelScope.launch {\n            api.clearNotifications().fold(\n                {\n                    db.notificationsDao().cleanupNotifications(accountId, 0)\n                },\n                { t ->\n                    Log.w(TAG, \"failed to clear notifications\", t)\n                }\n            )\n        }\n    }\n\n    suspend fun translate(status: StatusViewData.Concrete): NetworkResult<Unit> {\n        translations.value += (status.id to TranslationViewData.Loading)\n        return timelineCases.translate(status.actionableId)\n            .map { translation ->\n                translations.value += (status.id to TranslationViewData.Loaded(translation))\n            }\n            .onFailure {\n                translations.value -= status.id\n            }\n    }\n\n    fun untranslate(status: StatusViewData.Concrete) {\n        translations.value -= status.id\n    }\n\n    fun loadMore(placeholderId: String) {\n        viewModelScope.launch {\n            try {\n                val notificationsDao = db.notificationsDao()\n\n                notificationsDao.insertNotification(\n                    LoadMorePlaceholder(placeholderId, loading = true).toNotificationEntity(\n                        accountId\n                    )\n                )\n\n                val (idAbovePlaceholder, idBelowPlaceholder) = db.withTransaction {\n                    notificationsDao.getIdAbove(accountId, placeholderId) to\n                        notificationsDao.getIdBelow(accountId, placeholderId)\n                }\n                val response = when (readingOrder) {\n                    // Using minId, loads up to LOAD_AT_ONCE statuses with IDs immediately\n                    // after minId and no larger than maxId\n                    ReadingOrder.OLDEST_FIRST -> api.notifications(\n                        maxId = idAbovePlaceholder,\n                        minId = idBelowPlaceholder,\n                        limit = TimelineViewModel.LOAD_AT_ONCE,\n                        excludes = excludes.value.toTypes()\n                    )\n                    // Using sinceId, loads up to LOAD_AT_ONCE statuses immediately before\n                    // maxId, and no smaller than minId.\n                    ReadingOrder.NEWEST_FIRST -> api.notifications(\n                        maxId = idAbovePlaceholder,\n                        sinceId = idBelowPlaceholder,\n                        limit = TimelineViewModel.LOAD_AT_ONCE,\n                        excludes = excludes.value.toTypes()\n                    )\n                }\n\n                val notifications = response.body()\n                if (!response.isSuccessful || notifications == null) {\n                    loadMoreFailed(placeholderId, HttpException(response))\n                    return@launch\n                }\n\n                val account = activeAccountFlow.value ?: return@launch\n\n                val statusDao = db.timelineStatusDao()\n                val accountDao = db.timelineAccountDao()\n\n                db.withTransaction {\n                    notificationsDao.delete(accountId, placeholderId)\n\n                    val overlappedNotifications = if (notifications.isNotEmpty()) {\n                        notificationsDao.deleteRange(\n                            accountId,\n                            notifications.last().id,\n                            notifications.first().id\n                        )\n                    } else {\n                        0\n                    }\n\n                    for (notification in notifications) {\n                        accountDao.insert(notification.account.toEntity(accountId))\n                        notification.report?.let { report ->\n                            accountDao.insert(report.targetAccount.toEntity(accountId))\n                            notificationsDao.insertReport(report.toEntity(accountId))\n                        }\n                        notification.status?.let { status ->\n                            val statusToInsert = status.reblog ?: status\n                            accountDao.insert(statusToInsert.account.toEntity(accountId))\n\n                            statusDao.insert(\n                                statusToInsert.toEntity(\n                                    tuskyAccountId = accountId,\n                                    expanded = account.alwaysOpenSpoiler,\n                                    contentShowing = account.alwaysShowSensitiveMedia || !status.sensitive,\n                                    contentCollapsed = true\n                                )\n                            )\n                        }\n                        notificationsDao.insertNotification(\n                            notification.toEntity(\n                                accountId\n                            )\n                        )\n                    }\n\n                    /* In case we loaded a whole page and there was no overlap with existing notifications,\n                       we insert a placeholder because there might be even more unknown notifications */\n                    if (overlappedNotifications == 0 && notifications.size == TimelineViewModel.LOAD_AT_ONCE) {\n                        /* This overrides the first/last of the newly loaded notifications with a placeholder\n                           to guarantee the placeholder has an id that exists on the server as not all\n                           servers handle client generated ids as expected */\n                        val idToConvert = when (readingOrder) {\n                            ReadingOrder.OLDEST_FIRST -> notifications.first().id\n                            ReadingOrder.NEWEST_FIRST -> notifications.last().id\n                        }\n                        notificationsDao.insertNotification(\n                            LoadMorePlaceholder(\n                                idToConvert,\n                                loading = false\n                            ).toNotificationEntity(accountId)\n                        )\n                    }\n                }\n            } catch (e: Exception) {\n                ifExpected(e) {\n                    loadMoreFailed(placeholderId, e)\n                }\n            }\n        }\n    }\n\n    private suspend fun loadMoreFailed(placeholderId: String, e: Exception) {\n        Log.w(TAG, \"failed loading notifications\", e)\n        val activeAccount = accountManager.activeAccount!!\n        db.notificationsDao()\n            .insertNotification(\n                LoadMorePlaceholder(placeholderId, loading = false).toNotificationEntity(activeAccount.id)\n            )\n    }\n\n    private fun onPreferenceChanged(key: String) {\n        when (key) {\n            PrefKeys.READING_ORDER -> {\n                readingOrder = ReadingOrder.from(\n                    preferences.getString(PrefKeys.READING_ORDER, null)\n                )\n            }\n        }\n    }\n\n    companion object {\n        private const val LOAD_AT_ONCE = 30\n        private const val TAG = \"NotificationsViewModel\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/ReportNotificationViewHolder.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications\n\nimport android.content.Context\nimport android.text.TextUtils\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemReportNotificationBinding\nimport com.keylesspalace.tusky.interfaces.AccountActionListener\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.util.getRelativeTimeSpanString\nimport com.keylesspalace.tusky.util.loadAvatar\nimport com.keylesspalace.tusky.util.unicodeWrap\nimport com.keylesspalace.tusky.util.updateEmojiTargets\nimport com.keylesspalace.tusky.viewdata.NotificationViewData\n\nclass ReportNotificationViewHolder(\n    private val binding: ItemReportNotificationBinding,\n    private val listener: NotificationActionListener,\n    private val accountActionListener: AccountActionListener\n) : RecyclerView.ViewHolder(binding.root), NotificationsViewHolder {\n\n    override fun bind(\n        viewData: NotificationViewData.Concrete,\n        payloads: List<*>,\n        statusDisplayOptions: StatusDisplayOptions\n    ) {\n        if (payloads.isNotEmpty()) {\n            return\n        }\n        val report = viewData.report!!\n        val reporter = viewData.account\n\n        binding.notificationTopText.updateEmojiTargets {\n            val reporterName = reporter.name.unicodeWrap().emojify(reporter.emojis, statusDisplayOptions.animateEmojis)\n            val reporteeName = report.targetAccount.name.unicodeWrap().emojify(report.targetAccount.emojis, statusDisplayOptions.animateEmojis)\n\n            // Context.getString() returns a String and doesn't support Spannable.\n            // Convert the placeholders to the format used by TextUtils.expandTemplate which does.\n            val topText =\n                view.context.getString(R.string.notification_header_report_format, \"^1\", \"^2\")\n            view.text = TextUtils.expandTemplate(topText, reporterName, reporteeName)\n        }\n        binding.notificationSummary.text = itemView.context.getString(R.string.notification_summary_report_format, getRelativeTimeSpanString(itemView.context, report.createdAt.time, System.currentTimeMillis()), report.statusIds?.size ?: 0)\n        binding.notificationCategory.text = getTranslatedCategory(itemView.context, report.category)\n\n        loadAvatar(\n            report.targetAccount.avatar,\n            binding.notificationReporteeAvatar,\n            itemView.context.resources.getDimensionPixelSize(R.dimen.avatar_radius_36dp),\n            statusDisplayOptions.animateAvatars,\n        )\n        loadAvatar(\n            reporter.avatar,\n            binding.notificationReporterAvatar,\n            itemView.context.resources.getDimensionPixelSize(R.dimen.avatar_radius_24dp),\n            statusDisplayOptions.animateAvatars,\n        )\n\n        binding.notificationReporteeAvatar.setOnClickListener {\n            val position = bindingAdapterPosition\n            if (position != RecyclerView.NO_POSITION) {\n                accountActionListener.onViewAccount(report.targetAccount.id)\n            }\n        }\n        binding.notificationReporterAvatar.setOnClickListener {\n            val position = bindingAdapterPosition\n            if (position != RecyclerView.NO_POSITION) {\n                accountActionListener.onViewAccount(reporter.id)\n            }\n        }\n\n        itemView.setOnClickListener { listener.onViewReport(report.id) }\n    }\n\n    private fun getTranslatedCategory(context: Context, rawCategory: String): String {\n        return when (rawCategory) {\n            \"violation\" -> context.getString(R.string.report_category_violation)\n            \"spam\" -> context.getString(R.string.report_category_spam)\n            \"legal\" -> context.getString(R.string.report_category_legal)\n            \"other\" -> context.getString(R.string.report_category_other)\n            else -> rawCategory\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/SeveredRelationshipNotificationViewHolder.kt",
    "content": "/* Copyright 2025 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications\n\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.components.systemnotifications.NotificationService\nimport com.keylesspalace.tusky.databinding.ItemSeveredRelationshipNotificationBinding\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.viewdata.NotificationViewData\n\nclass SeveredRelationshipNotificationViewHolder(\n    private val binding: ItemSeveredRelationshipNotificationBinding,\n    private val instanceName: String\n) : RecyclerView.ViewHolder(binding.root), NotificationsViewHolder {\n\n    override fun bind(\n        viewData: NotificationViewData.Concrete,\n        payloads: List<*>,\n        statusDisplayOptions: StatusDisplayOptions\n    ) {\n        if (payloads.isNotEmpty()) {\n            return\n        }\n        val event = viewData.event!!\n        val context = binding.root.context\n\n        binding.severedRelationshipText.text = NotificationService.severedRelationShipText(\n            context,\n            event,\n            instanceName\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/StatusNotificationViewHolder.kt",
    "content": "/*\n * Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.components.notifications\n\nimport android.annotation.SuppressLint\nimport android.content.res.ColorStateList\nimport android.graphics.Typeface\nimport android.text.InputFilter\nimport android.text.Spanned\nimport android.text.format.DateUtils\nimport android.text.style.StyleSpan\nimport android.view.View\nimport androidx.core.text.toSpannable\nimport androidx.recyclerview.widget.RecyclerView\nimport at.connyduck.sparkbutton.helpers.Utils\nimport com.bumptech.glide.Glide\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.adapter.StatusBaseViewHolder\nimport com.keylesspalace.tusky.databinding.ItemStatusNotificationBinding\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.interfaces.LinkListener\nimport com.keylesspalace.tusky.interfaces.StatusActionListener\nimport com.keylesspalace.tusky.util.AbsoluteTimeFormatter\nimport com.keylesspalace.tusky.util.SmartLengthInputFilter\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.util.emojify\nimport com.keylesspalace.tusky.util.getRelativeTimeSpanString\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.loadAvatar\nimport com.keylesspalace.tusky.util.setClickableText\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.unicodeWrap\nimport com.keylesspalace.tusky.util.visible\nimport com.keylesspalace.tusky.viewdata.NotificationViewData\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport java.util.Date\n\ninternal class StatusNotificationViewHolder(\n    private val binding: ItemStatusNotificationBinding,\n    private val statusActionListener: StatusActionListener,\n    private val absoluteTimeFormatter: AbsoluteTimeFormatter\n) : NotificationsViewHolder, RecyclerView.ViewHolder(binding.root) {\n    private val avatarRadius48dp = itemView.context.resources.getDimensionPixelSize(\n        R.dimen.avatar_radius_48dp\n    )\n    private val avatarRadius36dp = itemView.context.resources.getDimensionPixelSize(\n        R.dimen.avatar_radius_36dp\n    )\n    private val avatarRadius24dp = itemView.context.resources.getDimensionPixelSize(\n        R.dimen.avatar_radius_24dp\n    )\n\n    override fun bind(\n        viewData: NotificationViewData.Concrete,\n        payloads: List<*>,\n        statusDisplayOptions: StatusDisplayOptions\n    ) {\n        val statusViewData = viewData.statusViewData\n        if (payloads.isEmpty()) {\n            /* in some very rare cases servers sends null status even though they should not */\n            if (statusViewData == null) {\n                showNotificationContent(false)\n            } else {\n                showNotificationContent(true)\n                val account = statusViewData.actionable.account\n                val createdAt = statusViewData.actionable.createdAt\n                setDisplayName(account.name, account.emojis, statusDisplayOptions.animateEmojis)\n                setUsername(account.username)\n                setCreatedAt(createdAt, statusDisplayOptions.useAbsoluteTime)\n                if (viewData.type == Notification.Type.Status ||\n                    viewData.type == Notification.Type.Update\n                ) {\n                    setAvatar(\n                        account.avatar,\n                        account.bot,\n                        statusDisplayOptions.animateAvatars,\n                        statusDisplayOptions.showBotOverlay\n                    )\n                } else {\n                    setAvatars(\n                        account.avatar,\n                        viewData.account.avatar,\n                        statusDisplayOptions.animateAvatars\n                    )\n                }\n\n                val viewThreadListener = View.OnClickListener {\n                    val position = bindingAdapterPosition\n                    if (position != RecyclerView.NO_POSITION) {\n                        statusActionListener.onViewThread(position)\n                    }\n                }\n\n                binding.notificationContainer.setOnClickListener(viewThreadListener)\n                binding.notificationContent.setOnClickListener(viewThreadListener)\n                binding.notificationTopText.setOnClickListener {\n                    statusActionListener.onViewAccount(viewData.account.id)\n                }\n            }\n            setMessage(viewData, statusActionListener, statusDisplayOptions.animateEmojis)\n        } else {\n            for (item in payloads) {\n                if (StatusBaseViewHolder.Key.KEY_CREATED == item && statusViewData != null) {\n                    setCreatedAt(\n                        statusViewData.status.actionableStatus.createdAt,\n                        statusDisplayOptions.useAbsoluteTime\n                    )\n                }\n            }\n        }\n    }\n\n    private fun showNotificationContent(show: Boolean) {\n        binding.statusDisplayName.visible(show)\n        binding.statusUsername.visible(show)\n        binding.statusMetaInfo.visible(show)\n        binding.notificationContentWarningDescription.visible(show)\n        binding.notificationContentWarningButton.visible(show)\n        binding.notificationContent.visible(show)\n        binding.notificationStatusAvatar.visible(show)\n        binding.notificationNotificationAvatar.visible(show)\n        binding.notificationAttachmentInfo.visible(show)\n    }\n\n    private fun setDisplayName(name: String, emojis: List<Emoji>, animateEmojis: Boolean) {\n        val emojifiedName = name.emojify(emojis, binding.statusDisplayName, animateEmojis)\n        binding.statusDisplayName.text = emojifiedName\n    }\n\n    private fun setUsername(name: String) {\n        val context = binding.statusUsername.context\n        val format = context.getString(R.string.post_username_format)\n        val usernameText = String.format(format, name)\n        binding.statusUsername.text = usernameText\n    }\n\n    private fun setCreatedAt(createdAt: Date, useAbsoluteTime: Boolean) {\n        if (useAbsoluteTime) {\n            binding.statusMetaInfo.text = absoluteTimeFormatter.format(createdAt, true)\n        } else {\n            val readout: String // visible timestamp\n            val readoutAloud: CharSequence // for screenreaders so they don't mispronounce timestamps like \"17m\" as 17 meters\n\n            val then = createdAt.time\n            val now = System.currentTimeMillis()\n            readout = getRelativeTimeSpanString(binding.statusMetaInfo.context, then, now)\n            readoutAloud = DateUtils.getRelativeTimeSpanString(\n                then,\n                now,\n                DateUtils.SECOND_IN_MILLIS,\n                DateUtils.FORMAT_ABBREV_RELATIVE\n            )\n\n            binding.statusMetaInfo.text = readout\n            binding.statusMetaInfo.contentDescription = readoutAloud\n        }\n    }\n\n    private fun setAvatar(statusAvatarUrl: String?, isBot: Boolean, animateAvatars: Boolean, showBotOverlay: Boolean) {\n        binding.notificationStatusAvatar.setPaddingRelative(0, 0, 0, 0)\n        loadAvatar(\n            statusAvatarUrl,\n            binding.notificationStatusAvatar,\n            avatarRadius48dp,\n            animateAvatars\n        )\n        if (showBotOverlay && isBot) {\n            binding.notificationNotificationAvatar.visibility = View.VISIBLE\n            Glide.with(binding.notificationNotificationAvatar)\n                .load(R.drawable.bot_badge)\n                .into(binding.notificationNotificationAvatar)\n        } else {\n            binding.notificationNotificationAvatar.visibility = View.GONE\n        }\n    }\n\n    private fun setAvatars(statusAvatarUrl: String?, notificationAvatarUrl: String?, animateAvatars: Boolean) {\n        val padding = Utils.dpToPx(binding.notificationStatusAvatar.context, 12)\n        binding.notificationStatusAvatar.setPaddingRelative(0, 0, padding, padding)\n        loadAvatar(\n            statusAvatarUrl,\n            binding.notificationStatusAvatar,\n            avatarRadius36dp,\n            animateAvatars\n        )\n        binding.notificationNotificationAvatar.visibility = View.VISIBLE\n        loadAvatar(\n            notificationAvatarUrl,\n            binding.notificationNotificationAvatar,\n            avatarRadius24dp,\n            animateAvatars\n        )\n    }\n\n    @SuppressLint(\"UseCompatTextViewDrawableApis\")\n    fun setMessage(\n        notificationViewData: NotificationViewData.Concrete,\n        listener: LinkListener,\n        animateEmojis: Boolean\n    ) {\n        val statusViewData = notificationViewData.statusViewData\n        val displayName = notificationViewData.account.name.unicodeWrap()\n        val type = notificationViewData.type\n        val context = binding.notificationTopText.context\n        val format: String\n        val icon: Int\n        val iconColor: Int\n        when (type) {\n            Notification.Type.Favourite -> {\n                icon = R.drawable.ic_star_24dp_filled\n                iconColor = R.color.favoriteButtonActiveColor\n                format = context.getString(R.string.notification_favourite_format)\n            }\n            Notification.Type.Reblog -> {\n                icon = R.drawable.ic_repeat_24dp\n                iconColor = R.color.colorPrimary\n                format = context.getString(R.string.notification_reblog_format)\n            }\n            Notification.Type.Status -> {\n                icon = R.drawable.ic_notifications_active_24dp\n                iconColor = R.color.colorPrimary\n                format = context.getString(R.string.notification_subscription_format)\n            }\n            Notification.Type.Update -> {\n                icon = R.drawable.ic_edit_24dp_filled\n                iconColor = R.color.colorPrimary\n                format = context.getString(R.string.notification_update_format)\n            }\n            else -> {\n                icon = R.drawable.ic_star_24dp_filled\n                iconColor = R.color.favoriteButtonActiveColor\n                format = context.getString(R.string.notification_favourite_format)\n            }\n        }\n        binding.notificationTopText.setCompoundDrawablesRelativeWithIntrinsicBounds(icon, 0, 0, 0)\n        binding.notificationTopText.compoundDrawableTintList = ColorStateList.valueOf(context.getColor(iconColor))\n        val wholeMessage = String.format(format, displayName).toSpannable()\n        val displayNameIndex = format.indexOf(\"%1\\$s\")\n        wholeMessage.setSpan(\n            StyleSpan(Typeface.BOLD),\n            displayNameIndex,\n            displayNameIndex + displayName.length,\n            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE\n        )\n        val emojifiedText = wholeMessage.emojify(\n            notificationViewData.account.emojis,\n            binding.notificationTopText,\n            animateEmojis\n        )\n        binding.notificationTopText.text = emojifiedText\n        if (statusViewData != null) {\n            val hasSpoiler = statusViewData.status.spoilerText.isNotEmpty()\n            binding.notificationContentWarningDescription.visibility =\n                if (hasSpoiler) View.VISIBLE else View.GONE\n            binding.notificationContentWarningButton.visibility =\n                if (hasSpoiler) View.VISIBLE else View.GONE\n            if (statusViewData.isExpanded) {\n                binding.notificationContentWarningButton.setText(\n                    R.string.post_content_warning_show_less\n                )\n            } else {\n                binding.notificationContentWarningButton.setText(\n                    R.string.post_content_warning_show_more\n                )\n            }\n            binding.notificationContentWarningButton.setOnClickListener {\n                if (bindingAdapterPosition != RecyclerView.NO_POSITION) {\n                    statusActionListener.onExpandedChange(\n                        !statusViewData.isExpanded,\n                        bindingAdapterPosition\n                    )\n                }\n                binding.notificationContent.visibility =\n                    if (statusViewData.isExpanded) View.GONE else View.VISIBLE\n            }\n            setupContentAndSpoiler(listener, statusViewData, animateEmojis)\n        }\n    }\n\n    private fun setupContentAndSpoiler(\n        listener: LinkListener,\n        statusViewData: StatusViewData.Concrete,\n        animateEmojis: Boolean\n    ) {\n        val shouldShowContentIfSpoiler = statusViewData.isExpanded\n        val hasSpoiler = statusViewData.status.spoilerText.isNotEmpty()\n        if (!shouldShowContentIfSpoiler && hasSpoiler) {\n            binding.notificationContent.visibility = View.GONE\n        } else {\n            binding.notificationContent.visibility = View.VISIBLE\n        }\n        val content = statusViewData.content\n        val emojis = statusViewData.actionable.emojis\n        if (statusViewData.isCollapsible && (statusViewData.isExpanded || !hasSpoiler)) {\n            binding.buttonToggleNotificationContent.setOnClickListener {\n                val position = bindingAdapterPosition\n                if (position != RecyclerView.NO_POSITION) {\n                    statusActionListener.onContentCollapsedChange(\n                        !statusViewData.isCollapsed,\n                        position\n                    )\n                }\n            }\n            binding.buttonToggleNotificationContent.visibility = View.VISIBLE\n            if (statusViewData.isCollapsed) {\n                binding.buttonToggleNotificationContent.setText(\n                    R.string.post_content_warning_show_more\n                )\n                binding.notificationContent.filters = COLLAPSE_INPUT_FILTER\n                binding.notificationAttachmentInfo.hide()\n            } else {\n                binding.buttonToggleNotificationContent.setText(\n                    R.string.post_content_warning_show_less\n                )\n                binding.notificationContent.filters = NO_INPUT_FILTER\n                setupAttachmentInfo(statusViewData.status)\n            }\n        } else {\n            binding.buttonToggleNotificationContent.visibility = View.GONE\n            binding.notificationContent.filters = NO_INPUT_FILTER\n            setupAttachmentInfo(statusViewData.status)\n        }\n        val emojifiedText = content.emojify(\n            emojis = emojis,\n            view = binding.notificationContent,\n            animate = animateEmojis\n        )\n        setClickableText(\n            binding.notificationContent,\n            emojifiedText,\n            statusViewData.actionable.mentions,\n            statusViewData.actionable.tags,\n            listener,\n        )\n        val emojifiedContentWarning: CharSequence = statusViewData.status.spoilerText.emojify(\n            statusViewData.actionable.emojis,\n            binding.notificationContentWarningDescription,\n            animateEmojis\n        )\n        binding.notificationContentWarningDescription.text = emojifiedContentWarning\n    }\n\n    private fun setupAttachmentInfo(status: Status) {\n        if (status.attachments.isNotEmpty()) {\n            binding.notificationAttachmentInfo.show()\n            binding.notificationAttachmentInfo.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_attach_file_24dp, 0, 0, 0)\n            val attachmentCount = status.attachments.size\n            val attachmentText = binding.root.context.resources.getQuantityString(R.plurals.media_attachments, attachmentCount, attachmentCount)\n            binding.notificationAttachmentInfo.text = attachmentText\n        } else if (status.poll != null) {\n            binding.notificationAttachmentInfo.show()\n            binding.notificationAttachmentInfo.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_insert_chart_24dp, 0, 0, 0)\n            binding.notificationAttachmentInfo.setText(R.string.poll)\n        } else {\n            binding.notificationAttachmentInfo.hide()\n        }\n    }\n\n    companion object {\n        private val COLLAPSE_INPUT_FILTER: Array<InputFilter> = arrayOf(SmartLengthInputFilter)\n        private val NO_INPUT_FILTER: Array<InputFilter> = arrayOf()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/StatusViewHolder.kt",
    "content": "/*\n * Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.components.notifications\n\nimport android.view.View\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.adapter.StatusViewHolder\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.interfaces.StatusActionListener\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.viewdata.NotificationViewData\n\ninternal class StatusViewHolder(\n    itemView: View,\n    private val statusActionListener: StatusActionListener,\n    private val accountId: String\n) : NotificationsViewHolder, StatusViewHolder(itemView) {\n\n    override fun bind(\n        viewData: NotificationViewData.Concrete,\n        payloads: List<*>,\n        statusDisplayOptions: StatusDisplayOptions\n    ) {\n        val statusViewData = viewData.statusViewData\n        if (statusViewData == null) {\n            /* in some very rare cases servers sends null status even though they should not */\n            showStatusContent(false)\n        } else {\n            if (payloads.isEmpty()) {\n                showStatusContent(true)\n            }\n            setupWithStatus(\n                statusViewData,\n                statusActionListener,\n                statusDisplayOptions,\n                payloads,\n                false\n            )\n            if (payloads.isNotEmpty()) {\n                return\n            }\n            val res = itemView.resources\n            if (viewData.type == Notification.Type.Poll) {\n                statusInfo.setText(if (accountId == viewData.account.id) R.string.poll_ended_created else R.string.poll_ended_voted)\n                statusInfo.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_insert_chart_24dp_filled, 0, 0, 0)\n                statusInfo.setCompoundDrawablePadding(res.getDimensionPixelSize(R.dimen.status_info_drawable_padding_large))\n                statusInfo.setPadding(res.getDimensionPixelSize(R.dimen.status_info_padding_large), 0, 0, 0)\n                statusInfo.show()\n            } else if (viewData.type == Notification.Type.Mention) {\n                statusInfo.setCompoundDrawablePadding(res.getDimensionPixelSize(R.dimen.status_info_drawable_padding_small))\n                statusInfo.setPaddingRelative(res.getDimensionPixelSize(R.dimen.status_info_padding_small), 0, 0, 0)\n                statusInfo.show()\n                if (viewData.statusViewData.status.inReplyToAccountId == accountId) {\n                    statusInfo.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_reply_18dp, 0, 0, 0)\n\n                    if (viewData.statusViewData.status.visibility == Status.Visibility.DIRECT) {\n                        statusInfo.setText(R.string.notification_info_private_reply)\n                    } else {\n                        statusInfo.setText(R.string.notification_info_reply)\n                    }\n                } else {\n                    statusInfo.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_email_alternate_18dp, 0, 0, 0)\n\n                    if (viewData.statusViewData.status.visibility == Status.Visibility.DIRECT) {\n                        statusInfo.setText(R.string.notification_info_private_mention)\n                    } else {\n                        statusInfo.setText(R.string.notification_info_mention)\n                    }\n                }\n            } else {\n                hideStatusInfo()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/UnknownNotificationViewHolder.kt",
    "content": "/*\n * Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.components.notifications\n\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemUnknownNotificationBinding\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.viewdata.NotificationViewData\n\ninternal class UnknownNotificationViewHolder(\n    private val binding: ItemUnknownNotificationBinding,\n) : NotificationsViewHolder, RecyclerView.ViewHolder(binding.root) {\n\n    override fun bind(\n        viewData: NotificationViewData.Concrete,\n        payloads: List<*>,\n        statusDisplayOptions: StatusDisplayOptions\n    ) {\n        binding.unknownNotificationType.text = viewData.type.name\n\n        binding.root.setOnClickListener {\n            MaterialAlertDialogBuilder(binding.root.context)\n                .setMessage(R.string.unknown_notification_type_explanation)\n                .setPositiveButton(android.R.string.ok, null)\n                .show()\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/requests/NotificationRequestsActivity.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications.requests\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport androidx.activity.result.contract.ActivityResultContract\nimport androidx.activity.viewModels\nimport androidx.core.view.MenuProvider\nimport androidx.lifecycle.lifecycleScope\nimport androidx.paging.LoadState\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.SimpleItemAnimator\nimport com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_LONG\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.BaseActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.notifications.requests.details.NotificationRequestDetailsActivity\nimport com.keylesspalace.tusky.components.preference.notificationpolicies.NotificationPoliciesActivity\nimport com.keylesspalace.tusky.databinding.ActivityNotificationRequestsBinding\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.entity.NotificationRequest\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.util.getErrorString\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.util.visible\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass NotificationRequestsActivity : BaseActivity(), MenuProvider {\n\n    private val viewModel: NotificationRequestsViewModel by viewModels()\n\n    private val binding by viewBinding(ActivityNotificationRequestsBinding::inflate)\n\n    private val notificationRequestDetails = registerForActivityResult(NotificationRequestDetailsResultContract()) { id ->\n        if (id != null) {\n            viewModel.removeNotificationRequest(id)\n        }\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        setContentView(binding.root)\n\n        addMenuProvider(this)\n\n        setSupportActionBar(binding.includedToolbar.toolbar)\n        supportActionBar?.run {\n            setTitle(R.string.filtered_notifications_title)\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n        }\n\n        setupAdapter().let { adapter ->\n            setupRecyclerView(adapter)\n\n            lifecycleScope.launch {\n                viewModel.pager.collectLatest { pagingData ->\n                    adapter.submitData(pagingData)\n                }\n            }\n        }\n\n        lifecycleScope.launch {\n            viewModel.error.collect { error ->\n                Snackbar.make(\n                    binding.root,\n                    error.getErrorString(this@NotificationRequestsActivity),\n                    LENGTH_LONG\n                ).show()\n            }\n        }\n    }\n\n    private fun setupRecyclerView(adapter: NotificationRequestsAdapter) {\n        binding.notificationRequestsView.adapter = adapter\n        binding.notificationRequestsView.setHasFixedSize(true)\n        binding.notificationRequestsView.layoutManager = LinearLayoutManager(this)\n        binding.notificationRequestsView.addItemDecoration(\n            DividerItemDecoration(this, DividerItemDecoration.VERTICAL)\n        )\n        (binding.notificationRequestsView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false\n    }\n\n    private fun setupAdapter(): NotificationRequestsAdapter {\n        return NotificationRequestsAdapter(\n            onAcceptRequest = viewModel::acceptNotificationRequest,\n            onDismissRequest = viewModel::dismissNotificationRequest,\n            onOpenDetails = ::onOpenRequestDetails,\n            animateAvatar = preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false),\n            animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false)\n        ).apply {\n            addLoadStateListener { loadState ->\n                binding.notificationRequestsProgressBar.visible(\n                    loadState.refresh == LoadState.Loading && itemCount == 0\n                )\n\n                if (loadState.refresh is LoadState.Error) {\n                    binding.notificationRequestsView.hide()\n                    binding.notificationRequestsMessageView.show()\n                    val errorState = loadState.refresh as LoadState.Error\n                    binding.notificationRequestsMessageView.setup(errorState.error) { retry() }\n                    Log.w(TAG, \"error loading notification requests\", errorState.error)\n                } else {\n                    binding.notificationRequestsView.show()\n                    binding.notificationRequestsMessageView.hide()\n                }\n            }\n        }\n    }\n\n    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n        menuInflater.inflate(R.menu.activity_notification_requests, menu)\n    }\n\n    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {\n        return when (menuItem.itemId) {\n            R.id.open_settings -> {\n                val intent = NotificationPoliciesActivity.newIntent(this)\n                startActivityWithSlideInAnimation(intent)\n                true\n            }\n            else -> false\n        }\n    }\n\n    private fun onOpenRequestDetails(reqeuest: NotificationRequest) {\n        notificationRequestDetails.launch(\n            NotificationRequestDetailsResultContractInput(\n                notificationRequestId = reqeuest.id,\n                accountId = reqeuest.account.id,\n                accountName = reqeuest.account.name,\n                accountEmojis = reqeuest.account.emojis\n            )\n        )\n    }\n\n    class NotificationRequestDetailsResultContractInput(\n        val notificationRequestId: String,\n        val accountId: String,\n        val accountName: String,\n        val accountEmojis: List<Emoji>\n    )\n\n    class NotificationRequestDetailsResultContract : ActivityResultContract<NotificationRequestDetailsResultContractInput, String?>() {\n        override fun createIntent(context: Context, input: NotificationRequestDetailsResultContractInput): Intent {\n            return NotificationRequestDetailsActivity.newIntent(\n                notificationRequestId = input.notificationRequestId,\n                accountId = input.accountId,\n                accountName = input.accountName,\n                accountEmojis = input.accountEmojis,\n                context = context\n            )\n        }\n\n        override fun parseResult(resultCode: Int, intent: Intent?): String? {\n            return intent?.getStringExtra(NotificationRequestDetailsActivity.EXTRA_NOTIFICATION_REQUEST_ID)\n        }\n    }\n\n    companion object {\n        private const val TAG = \"NotificationRequestsActivity\"\n        fun newIntent(context: Context) = Intent(context, NotificationRequestsActivity::class.java)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/requests/NotificationRequestsAdapter.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications.requests\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.annotation.OptIn\nimport androidx.paging.PagingDataAdapter\nimport androidx.recyclerview.widget.DiffUtil\nimport com.google.android.material.badge.ExperimentalBadgeUtils\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemNotificationRequestBinding\nimport com.keylesspalace.tusky.entity.NotificationRequest\nimport com.keylesspalace.tusky.util.BindingHolder\nimport com.keylesspalace.tusky.util.emojify\nimport com.keylesspalace.tusky.util.loadAvatar\nimport java.text.NumberFormat\n\nclass NotificationRequestsAdapter(\n    private val onAcceptRequest: (notificationRequestId: String) -> Unit,\n    private val onDismissRequest: (notificationRequestId: String) -> Unit,\n    private val onOpenDetails: (notificationRequest: NotificationRequest) -> Unit,\n    private val animateAvatar: Boolean,\n    private val animateEmojis: Boolean,\n) : PagingDataAdapter<NotificationRequest, BindingHolder<ItemNotificationRequestBinding>>(NOTIFICATION_REQUEST_COMPARATOR) {\n\n    private val numberFormat: NumberFormat = NumberFormat.getNumberInstance()\n\n    override fun onCreateViewHolder(\n        parent: ViewGroup,\n        viewType: Int\n    ): BindingHolder<ItemNotificationRequestBinding> {\n        val binding = ItemNotificationRequestBinding.inflate(\n            LayoutInflater.from(parent.context),\n            parent,\n            false\n        )\n        return BindingHolder(binding)\n    }\n\n    @OptIn(ExperimentalBadgeUtils::class)\n    override fun onBindViewHolder(holder: BindingHolder<ItemNotificationRequestBinding>, position: Int) {\n        getItem(position)?.let { notificationRequest ->\n            val binding = holder.binding\n            val context = binding.root.context\n            val account = notificationRequest.account\n\n            val avatarRadius = context.resources.getDimensionPixelSize(R.dimen.avatar_radius_48dp)\n            loadAvatar(account.avatar, binding.notificationRequestAvatar, avatarRadius, animateAvatar)\n\n            binding.notificationRequestBadge.text = numberFormat.format(notificationRequest.notificationsCount)\n\n            val emojifiedName = account.name.emojify(\n                account.emojis,\n                binding.notificationRequestDisplayName,\n                animateEmojis\n            )\n            binding.notificationRequestDisplayName.text = emojifiedName\n            val formattedUsername = context.getString(R.string.post_username_format, account.username)\n            binding.notificationRequestUsername.text = formattedUsername\n\n            binding.notificationRequestAccept.setOnClickListener {\n                onAcceptRequest(notificationRequest.id)\n            }\n            binding.notificationRequestDismiss.setOnClickListener {\n                onDismissRequest(notificationRequest.id)\n            }\n            binding.root.setOnClickListener {\n                onOpenDetails(notificationRequest)\n            }\n        }\n    }\n\n    companion object {\n        val NOTIFICATION_REQUEST_COMPARATOR = object : DiffUtil.ItemCallback<NotificationRequest>() {\n            override fun areItemsTheSame(oldItem: NotificationRequest, newItem: NotificationRequest): Boolean =\n                oldItem.id == newItem.id\n            override fun areContentsTheSame(oldItem: NotificationRequest, newItem: NotificationRequest): Boolean =\n                oldItem == newItem\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/requests/NotificationRequestsPagingSource.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications.requests\n\nimport androidx.paging.PagingSource\nimport androidx.paging.PagingState\nimport com.keylesspalace.tusky.entity.NotificationRequest\n\nclass NotificationRequestsPagingSource(\n    private val requests: List<NotificationRequest>,\n    private val nextKey: String?\n) : PagingSource<String, NotificationRequest>() {\n    override fun getRefreshKey(state: PagingState<String, NotificationRequest>): String? = null\n\n    override suspend fun load(params: LoadParams<String>): LoadResult<String, NotificationRequest> {\n        return if (params is LoadParams.Refresh) {\n            LoadResult.Page(requests.toList(), null, nextKey)\n        } else {\n            LoadResult.Page(emptyList(), null, null)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/requests/NotificationRequestsRemoteMediator.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications.requests\n\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.LoadType\nimport androidx.paging.PagingState\nimport androidx.paging.RemoteMediator\nimport com.keylesspalace.tusky.entity.NotificationRequest\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.HttpHeaderLink\nimport retrofit2.HttpException\nimport retrofit2.Response\n\n@OptIn(ExperimentalPagingApi::class)\nclass NotificationRequestsRemoteMediator(\n    private val api: MastodonApi,\n    private val viewModel: NotificationRequestsViewModel\n) : RemoteMediator<String, NotificationRequest>() {\n\n    override suspend fun load(\n        loadType: LoadType,\n        state: PagingState<String, NotificationRequest>\n    ): MediatorResult {\n        return try {\n            val response = request(loadType)\n                ?: return MediatorResult.Success(endOfPaginationReached = true)\n\n            return applyResponse(response)\n        } catch (e: Exception) {\n            MediatorResult.Error(e)\n        }\n    }\n\n    private suspend fun request(loadType: LoadType): Response<List<NotificationRequest>>? {\n        return when (loadType) {\n            LoadType.PREPEND -> null\n            LoadType.APPEND -> api.getNotificationRequests(maxId = viewModel.nextKey)\n            LoadType.REFRESH -> {\n                viewModel.nextKey = null\n                viewModel.requestData.clear()\n                api.getNotificationRequests()\n            }\n        }\n    }\n\n    private fun applyResponse(response: Response<List<NotificationRequest>>): MediatorResult {\n        val notificationRequests = response.body()\n        if (!response.isSuccessful || notificationRequests == null) {\n            return MediatorResult.Error(HttpException(response))\n        }\n\n        val links = HttpHeaderLink.parse(response.headers()[\"Link\"])\n        viewModel.nextKey = HttpHeaderLink.findByRelationType(links, \"next\")?.uri?.getQueryParameter(\"max_id\")\n        viewModel.requestData.addAll(notificationRequests)\n        viewModel.currentSource?.invalidate()\n\n        return MediatorResult.Success(endOfPaginationReached = viewModel.nextKey == null)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/requests/NotificationRequestsViewModel.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications.requests\n\nimport android.util.Log\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.Pager\nimport androidx.paging.PagingConfig\nimport androidx.paging.cachedIn\nimport at.connyduck.calladapter.networkresult.fold\nimport com.keylesspalace.tusky.appstore.BlockEvent\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.MuteEvent\nimport com.keylesspalace.tusky.entity.NotificationRequest\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.usecase.NotificationPolicyUsecase\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.SharedFlow\nimport kotlinx.coroutines.flow.asSharedFlow\nimport kotlinx.coroutines.launch\n\n@HiltViewModel\nclass NotificationRequestsViewModel @Inject constructor(\n    private val api: MastodonApi,\n    private val eventHub: EventHub,\n    private val notificationPolicyUsecase: NotificationPolicyUsecase\n) : ViewModel() {\n\n    var currentSource: NotificationRequestsPagingSource? = null\n\n    val requestData: MutableList<NotificationRequest> = mutableListOf()\n\n    var nextKey: String? = null\n\n    @OptIn(ExperimentalPagingApi::class)\n    val pager = Pager(\n        config = PagingConfig(\n            pageSize = 20,\n            initialLoadSize = 20\n        ),\n        remoteMediator = NotificationRequestsRemoteMediator(api, this),\n        pagingSourceFactory = {\n            NotificationRequestsPagingSource(\n                requests = requestData,\n                nextKey = nextKey\n            ).also { source ->\n                currentSource = source\n            }\n        }\n    ).flow\n        .cachedIn(viewModelScope)\n\n    private val _error = MutableSharedFlow<Throwable>(\n        replay = 0,\n        extraBufferCapacity = 1,\n        onBufferOverflow = BufferOverflow.DROP_OLDEST\n    )\n    val error: SharedFlow<Throwable> = _error.asSharedFlow()\n\n    init {\n        viewModelScope.launch {\n            eventHub.events\n                .collect { event ->\n                    when (event) {\n                        is BlockEvent -> removeAllByAccount(event.accountId)\n                        is MuteEvent -> removeAllByAccount(event.accountId)\n                    }\n                }\n        }\n    }\n\n    fun acceptNotificationRequest(id: String) {\n        viewModelScope.launch {\n            api.acceptNotificationRequest(id).fold({\n                removeNotificationRequest(id)\n            }, { error ->\n                Log.w(TAG, \"failed to dismiss notifications request\", error)\n                _error.emit(error)\n            })\n        }\n    }\n\n    fun dismissNotificationRequest(id: String) {\n        viewModelScope.launch {\n            api.dismissNotificationRequest(id).fold({\n                removeNotificationRequest(id)\n            }, { error ->\n                Log.w(TAG, \"failed to dismiss notifications request\", error)\n                _error.emit(error)\n            })\n        }\n    }\n\n    fun removeNotificationRequest(id: String) {\n        requestData.forEach { request ->\n            if (request.id == id) {\n                viewModelScope.launch {\n                    notificationPolicyUsecase.updateCounts(request.notificationsCount)\n                }\n            }\n        }\n        requestData.removeAll { request -> request.id == id }\n        currentSource?.invalidate()\n    }\n\n    private fun removeAllByAccount(accountId: String) {\n        requestData.removeAll { request -> request.account.id == accountId }\n        currentSource?.invalidate()\n    }\n\n    companion object {\n        private const val TAG = \"NotificationRequestsViewModel\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/requests/details/NotificationRequestDetailsActivity.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications.requests.details\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat.Type.systemBars\nimport androidx.core.view.updatePadding\nimport androidx.lifecycle.lifecycleScope\nimport com.keylesspalace.tusky.BottomSheetActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ActivityNotificationRequestDetailsBinding\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.util.emojify\nimport com.keylesspalace.tusky.util.getParcelableArrayListExtraCompat\nimport com.keylesspalace.tusky.util.viewBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport dagger.hilt.android.lifecycle.withCreationCallback\nimport kotlin.getValue\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass NotificationRequestDetailsActivity : BottomSheetActivity() {\n\n    private val viewModel: NotificationRequestDetailsViewModel by viewModels(\n        extrasProducer = {\n            defaultViewModelCreationExtras.withCreationCallback<NotificationRequestDetailsViewModel.Factory> { factory ->\n                factory.create(\n                    notificationRequestId = intent.getStringExtra(EXTRA_NOTIFICATION_REQUEST_ID)!!,\n                    accountId = intent.getStringExtra(EXTRA_ACCOUNT_ID)!!\n                )\n            }\n        }\n    )\n\n    private val binding by viewBinding(ActivityNotificationRequestDetailsBinding::inflate)\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        setContentView(binding.root)\n\n        setSupportActionBar(binding.includedToolbar.toolbar)\n\n        val animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false)\n\n        val emojis: List<Emoji> = intent.getParcelableArrayListExtraCompat(EXTRA_ACCOUNT_EMOJIS)!!\n\n        val title = getString(R.string.notifications_from, intent.getStringExtra(EXTRA_ACCOUNT_NAME))\n            .emojify(emojis, binding.includedToolbar.toolbar, animateEmojis)\n\n        supportActionBar?.run {\n            setTitle(title)\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n        }\n\n        ViewCompat.setOnApplyWindowInsetsListener(binding.bottomBar) { view, insets ->\n            val bottomInsets = insets.getInsets(systemBars()).bottom\n            view.updatePadding(bottom = bottomInsets)\n            insets.inset(0, 0, 0, bottomInsets)\n        }\n\n        lifecycleScope.launch {\n            viewModel.finish.collect { finishMode ->\n                setResult(RESULT_OK, Intent().apply { putExtra(EXTRA_NOTIFICATION_REQUEST_ID, intent.getStringExtra(EXTRA_NOTIFICATION_REQUEST_ID)!!) })\n                finish()\n            }\n        }\n\n        binding.acceptButton.setOnClickListener {\n            viewModel.acceptNotificationRequest()\n        }\n        binding.dismissButton.setOnClickListener {\n            viewModel.dismissNotificationRequest()\n        }\n    }\n\n    companion object {\n        const val EXTRA_NOTIFICATION_REQUEST_ID = \"notificationRequestId\"\n        private const val EXTRA_ACCOUNT_ID = \"accountId\"\n        private const val EXTRA_ACCOUNT_NAME = \"accountName\"\n        private const val EXTRA_ACCOUNT_EMOJIS = \"accountEmojis\"\n        fun newIntent(\n            notificationRequestId: String,\n            accountId: String,\n            accountName: String,\n            accountEmojis: List<Emoji>,\n            context: Context\n        ) = Intent(context, NotificationRequestDetailsActivity::class.java).apply {\n            putExtra(EXTRA_NOTIFICATION_REQUEST_ID, notificationRequestId)\n            putExtra(EXTRA_ACCOUNT_ID, accountId)\n            putExtra(EXTRA_ACCOUNT_NAME, accountName)\n            putExtra(EXTRA_ACCOUNT_EMOJIS, ArrayList(accountEmojis))\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/requests/details/NotificationRequestDetailsFragment.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications.requests.details\n\nimport android.content.Context\nimport android.content.Intent\nimport android.content.SharedPreferences\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.View\nimport androidx.fragment.app.activityViewModels\nimport androidx.lifecycle.lifecycleScope\nimport androidx.paging.LoadState\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.SimpleItemAnimator\nimport at.connyduck.calladapter.networkresult.onFailure\nimport at.connyduck.sparkbutton.SparkButton\nimport com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_LONG\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.notifications.NotificationActionListener\nimport com.keylesspalace.tusky.components.notifications.NotificationsPagingAdapter\nimport com.keylesspalace.tusky.databinding.FragmentNotificationRequestDetailsBinding\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.fragment.SFragment\nimport com.keylesspalace.tusky.interfaces.AccountActionListener\nimport com.keylesspalace.tusky.interfaces.StatusActionListener\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.util.CardViewMode\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.util.getErrorString\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.openLink\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.util.visible\nimport com.keylesspalace.tusky.view.ConfirmationBottomSheet.Companion.confirmFavourite\nimport com.keylesspalace.tusky.view.ConfirmationBottomSheet.Companion.confirmReblog\nimport com.keylesspalace.tusky.viewdata.AttachmentViewData\nimport com.keylesspalace.tusky.viewdata.TranslationViewData\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlin.getValue\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass NotificationRequestDetailsFragment : SFragment(R.layout.fragment_notification_request_details), StatusActionListener, NotificationActionListener, AccountActionListener {\n\n    @Inject\n    lateinit var preferences: SharedPreferences\n\n    private val viewModel: NotificationRequestDetailsViewModel by activityViewModels()\n\n    private val binding by viewBinding(FragmentNotificationRequestDetailsBinding::bind)\n\n    private var adapter: NotificationsPagingAdapter? = null\n\n    private var buttonToAnimate: SparkButton? = null\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        setupAdapter().let { adapter ->\n            this.adapter = adapter\n            setupRecyclerView(adapter)\n\n            lifecycleScope.launch {\n                viewModel.pager.collectLatest { pagingData ->\n                    adapter.submitData(pagingData)\n                }\n            }\n        }\n\n        lifecycleScope.launch {\n            viewModel.error.collect { error ->\n                Snackbar.make(\n                    binding.root,\n                    error.getErrorString(requireContext()),\n                    LENGTH_LONG\n                ).show()\n            }\n        }\n    }\n\n    private fun setupRecyclerView(adapter: NotificationsPagingAdapter) {\n        binding.recyclerView.adapter = adapter\n        binding.recyclerView.setHasFixedSize(true)\n        binding.recyclerView.layoutManager = LinearLayoutManager(requireContext())\n        binding.recyclerView.addItemDecoration(\n            DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL)\n        )\n        (binding.recyclerView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false\n    }\n\n    private fun setupAdapter(): NotificationsPagingAdapter {\n        val activeAccount = accountManager.activeAccount!!\n        val statusDisplayOptions = StatusDisplayOptions(\n            animateAvatars = preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false),\n            mediaPreviewEnabled = activeAccount.mediaPreviewEnabled,\n            useAbsoluteTime = preferences.getBoolean(PrefKeys.ABSOLUTE_TIME_VIEW, false),\n            showBotOverlay = preferences.getBoolean(PrefKeys.SHOW_BOT_OVERLAY, true),\n            useBlurhash = preferences.getBoolean(PrefKeys.USE_BLURHASH, true),\n            cardViewMode = if (preferences.getBoolean(PrefKeys.SHOW_CARDS_IN_TIMELINES, false)) {\n                CardViewMode.INDENTED\n            } else {\n                CardViewMode.NONE\n            },\n            hideStats = preferences.getBoolean(PrefKeys.WELLBEING_HIDE_STATS_POSTS, false),\n            animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false),\n            showStatsInline = preferences.getBoolean(PrefKeys.SHOW_STATS_INLINE, false),\n            showSensitiveMedia = activeAccount.alwaysShowSensitiveMedia,\n            openSpoiler = activeAccount.alwaysOpenSpoiler\n        )\n\n        return NotificationsPagingAdapter(\n            accountId = activeAccount.accountId,\n            statusDisplayOptions = statusDisplayOptions,\n            statusListener = this,\n            notificationActionListener = this,\n            accountActionListener = this,\n            instanceName = activeAccount.domain\n        ).apply {\n            addLoadStateListener { loadState ->\n                binding.progressBar.visible(\n                    loadState.refresh == LoadState.Loading && itemCount == 0\n                )\n\n                if (loadState.refresh is LoadState.Error) {\n                    binding.recyclerView.hide()\n                    binding.statusView.show()\n                    val errorState = loadState.refresh as LoadState.Error\n                    binding.statusView.setup(errorState.error) { retry() }\n                    Log.w(TAG, \"error loading notifications for user ${viewModel.accountId}\", errorState.error)\n                } else {\n                    binding.recyclerView.show()\n                    binding.statusView.hide()\n                }\n            }\n        }\n    }\n\n    override fun onReply(position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        super.reply(status.status)\n    }\n\n    override fun removeItem(position: Int) {\n        val notification = adapter?.peek(position) ?: return\n        viewModel.remove(notification)\n    }\n\n    override fun onReblog(reblog: Boolean, position: Int, visibility: Status.Visibility?, button: SparkButton?) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        buttonToAnimate = button\n\n        if (reblog && visibility == null) {\n            confirmReblog(preferences) { visibility ->\n                viewModel.reblog(true, status, visibility)\n                buttonToAnimate?.playAnimation()\n                buttonToAnimate?.isChecked = true\n            }\n        } else {\n            viewModel.reblog(reblog, status, visibility ?: Status.Visibility.PUBLIC)\n            if (reblog) {\n                buttonToAnimate?.playAnimation()\n            }\n            buttonToAnimate?.isChecked = reblog\n        }\n    }\n\n    override val onMoreTranslate: ((Boolean, Int) -> Unit)?\n        get() = { translate: Boolean, position: Int ->\n            if (translate) {\n                onTranslate(position)\n            } else {\n                onUntranslate(position)\n            }\n        }\n\n    override fun onFavourite(favourite: Boolean, position: Int, button: SparkButton?) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        buttonToAnimate = button\n\n        if (favourite) {\n            confirmFavourite(preferences) {\n                viewModel.favorite(true, status)\n                buttonToAnimate?.playAnimation()\n                buttonToAnimate?.isChecked = true\n            }\n        } else {\n            viewModel.favorite(false, status)\n            buttonToAnimate?.isChecked = false\n        }\n    }\n\n    override fun onBookmark(bookmark: Boolean, position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.bookmark(bookmark, status)\n    }\n\n    override fun onMore(view: View, position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        super.more(\n            status.status,\n            view,\n            position,\n            (status.translation as? TranslationViewData.Loaded)?.data\n        )\n    }\n\n    override fun onViewMedia(position: Int, attachmentIndex: Int, view: View?) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        super.viewMedia(attachmentIndex, AttachmentViewData.list(status), view)\n    }\n\n    override fun onViewThread(position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull()?.status ?: return\n        super.viewThread(status.id, status.url)\n    }\n\n    override fun onOpenReblog(position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        super.openReblog(status.status)\n    }\n\n    override fun onExpandedChange(expanded: Boolean, position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.changeExpanded(expanded, status)\n    }\n\n    override fun onContentHiddenChange(isShowing: Boolean, position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.changeContentShowing(isShowing, status)\n    }\n\n    override fun onLoadMore(position: Int) {\n        // not applicable here\n    }\n\n    override fun onContentCollapsedChange(isCollapsed: Boolean, position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.changeContentCollapsed(isCollapsed, status)\n    }\n\n    override fun onVoteInPoll(position: Int, choices: List<Int>) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.voteInPoll(choices, status)\n    }\n\n    override fun onShowPollResults(position: Int) {\n        adapter?.peek(position)?.asStatusOrNull()?.let { status ->\n            viewModel.showPollResults(status)\n        }\n    }\n\n    override fun clearWarningAction(position: Int) {\n        // not applicable here\n    }\n\n    private fun onTranslate(position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.translate(status)\n                .onFailure {\n                    Snackbar.make(\n                        requireView(),\n                        getString(R.string.ui_error_translate, it.message),\n                        LENGTH_LONG\n                    ).show()\n                }\n        }\n    }\n\n    override fun onUntranslate(position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.untranslate(status)\n    }\n\n    override fun onViewTag(tag: String) {\n        super.viewTag(tag)\n    }\n\n    override fun onViewAccount(id: String) {\n        super.viewAccount(id)\n    }\n\n    override fun onViewReport(reportId: String) {\n        requireContext().openLink(\n            \"https://${accountManager.activeAccount!!.domain}/admin/reports/$reportId\"\n        )\n    }\n\n    override fun onMute(mute: Boolean, id: String, position: Int, notifications: Boolean) {\n        // not needed, muting via the more menu on statuses is handled in SFragment\n    }\n\n    override fun onBlock(block: Boolean, id: String, position: Int) {\n        // not needed, blocking via the more menu on statuses is handled in SFragment\n    }\n\n    override fun onRespondToFollowRequest(accept: Boolean, accountIdRequestingFollow: String, position: Int) {\n        val notification = adapter?.peek(position) ?: return\n        viewModel.respondToFollowRequest(accept, accountId = accountIdRequestingFollow, notification = notification)\n    }\n\n    override fun onDestroyView() {\n        adapter = null\n        buttonToAnimate = null\n        super.onDestroyView()\n    }\n\n    companion object {\n        private const val TAG = \"NotificationRequestsDetailsFragment\"\n        private const val EXTRA_ACCOUNT_ID = \"accountId\"\n        fun newIntent(accountId: String, context: Context) = Intent(context, NotificationRequestDetailsActivity::class.java).apply {\n            putExtra(EXTRA_ACCOUNT_ID, accountId)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/requests/details/NotificationRequestDetailsPagingSource.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications.requests.details\n\nimport androidx.paging.PagingSource\nimport androidx.paging.PagingState\nimport com.keylesspalace.tusky.viewdata.NotificationViewData\n\nclass NotificationRequestDetailsPagingSource(\n    private val notifications: List<NotificationViewData>,\n    private val nextKey: String?\n) : PagingSource<String, NotificationViewData>() {\n    override fun getRefreshKey(state: PagingState<String, NotificationViewData>): String? = null\n\n    override suspend fun load(params: LoadParams<String>): LoadResult<String, NotificationViewData> {\n        return if (params is LoadParams.Refresh) {\n            LoadResult.Page(notifications.toList(), null, nextKey)\n        } else {\n            LoadResult.Page(emptyList(), null, null)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/requests/details/NotificationRequestDetailsRemoteMediator.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications.requests.details\n\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.LoadType\nimport androidx.paging.PagingState\nimport androidx.paging.RemoteMediator\nimport com.keylesspalace.tusky.components.notifications.toViewData\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.util.HttpHeaderLink\nimport com.keylesspalace.tusky.viewdata.NotificationViewData\nimport retrofit2.HttpException\nimport retrofit2.Response\n\n@OptIn(ExperimentalPagingApi::class)\nclass NotificationRequestDetailsRemoteMediator(\n    private val viewModel: NotificationRequestDetailsViewModel\n) : RemoteMediator<String, NotificationViewData>() {\n\n    override suspend fun load(\n        loadType: LoadType,\n        state: PagingState<String, NotificationViewData>\n    ): MediatorResult {\n        return try {\n            val response = request(loadType)\n                ?: return MediatorResult.Success(endOfPaginationReached = true)\n\n            return applyResponse(response)\n        } catch (e: Exception) {\n            MediatorResult.Error(e)\n        }\n    }\n\n    private suspend fun request(loadType: LoadType): Response<List<Notification>>? {\n        return when (loadType) {\n            LoadType.PREPEND -> null\n            LoadType.APPEND -> viewModel.api.notifications(maxId = viewModel.nextKey, accountId = viewModel.accountId)\n            LoadType.REFRESH -> {\n                viewModel.nextKey = null\n                viewModel.notificationData.clear()\n                viewModel.api.notifications(accountId = viewModel.accountId)\n            }\n        }\n    }\n\n    private fun applyResponse(response: Response<List<Notification>>): MediatorResult {\n        val notifications = response.body()\n        if (!response.isSuccessful || notifications == null) {\n            return MediatorResult.Error(HttpException(response))\n        }\n\n        val links = HttpHeaderLink.parse(response.headers()[\"Link\"])\n        viewModel.nextKey = HttpHeaderLink.findByRelationType(links, \"next\")?.uri?.getQueryParameter(\"max_id\")\n\n        val alwaysShowSensitiveMedia = viewModel.accountManager.activeAccount?.alwaysShowSensitiveMedia == true\n        val alwaysOpenSpoiler = viewModel.accountManager.activeAccount?.alwaysOpenSpoiler == false\n        val notificationData = notifications.map { notification ->\n            notification.toViewData(\n                isShowingContent = notification.status?.shouldShowContent(alwaysShowSensitiveMedia, Filter.Kind.NOTIFICATIONS) ?: true,\n                isExpanded = alwaysOpenSpoiler,\n                isCollapsed = true,\n                filter = notification.status?.getApplicableFilter(Filter.Kind.NOTIFICATIONS),\n            )\n        }\n\n        viewModel.notificationData.addAll(notificationData)\n        viewModel.currentSource?.invalidate()\n\n        return MediatorResult.Success(endOfPaginationReached = viewModel.nextKey == null)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/notifications/requests/details/NotificationRequestDetailsViewModel.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.notifications.requests.details\n\nimport android.util.Log\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.Pager\nimport androidx.paging.PagingConfig\nimport androidx.paging.cachedIn\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport at.connyduck.calladapter.networkresult.fold\nimport at.connyduck.calladapter.networkresult.map\nimport at.connyduck.calladapter.networkresult.onFailure\nimport com.keylesspalace.tusky.appstore.BlockEvent\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.MuteEvent\nimport com.keylesspalace.tusky.appstore.StatusChangedEvent\nimport com.keylesspalace.tusky.components.timeline.util.ifExpected\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.usecase.TimelineCases\nimport com.keylesspalace.tusky.viewdata.NotificationViewData\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport com.keylesspalace.tusky.viewdata.TranslationViewData\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedFactory\nimport dagger.assisted.AssistedInject\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.SharedFlow\nimport kotlinx.coroutines.flow.asSharedFlow\nimport kotlinx.coroutines.launch\n\n@HiltViewModel(assistedFactory = NotificationRequestDetailsViewModel.Factory::class)\nclass NotificationRequestDetailsViewModel @AssistedInject constructor(\n    val api: MastodonApi,\n    val accountManager: AccountManager,\n    val timelineCases: TimelineCases,\n    val eventHub: EventHub,\n    @Assisted(\"notificationRequestId\") val notificationRequestId: String,\n    @Assisted(\"accountId\") val accountId: String\n) : ViewModel() {\n\n    var currentSource: NotificationRequestDetailsPagingSource? = null\n\n    val notificationData: MutableList<NotificationViewData.Concrete> = mutableListOf()\n\n    var nextKey: String? = null\n\n    @OptIn(ExperimentalPagingApi::class)\n    val pager = Pager(\n        config = PagingConfig(\n            pageSize = 20,\n            initialLoadSize = 20\n        ),\n        remoteMediator = NotificationRequestDetailsRemoteMediator(this),\n        pagingSourceFactory = {\n            NotificationRequestDetailsPagingSource(\n                notifications = notificationData,\n                nextKey = nextKey\n            ).also { source ->\n                currentSource = source\n            }\n        }\n    ).flow\n        .cachedIn(viewModelScope)\n\n    private val _error = MutableSharedFlow<Throwable>(\n        replay = 0,\n        extraBufferCapacity = 1,\n        onBufferOverflow = BufferOverflow.DROP_OLDEST\n    )\n    val error: SharedFlow<Throwable> = _error.asSharedFlow()\n\n    private val _finish = MutableSharedFlow<Unit>(\n        replay = 0,\n        extraBufferCapacity = 1,\n        onBufferOverflow = BufferOverflow.DROP_OLDEST\n    )\n    val finish: SharedFlow<Unit> = _finish.asSharedFlow()\n\n    init {\n        viewModelScope.launch {\n            eventHub.events\n                .collect { event ->\n                    when (event) {\n                        is StatusChangedEvent -> updateStatus(event.status)\n                        is BlockEvent -> removeIfAccount(event.accountId)\n                        is MuteEvent -> removeIfAccount(event.accountId)\n                    }\n                }\n        }\n    }\n\n    fun acceptNotificationRequest() {\n        viewModelScope.launch {\n            api.acceptNotificationRequest(notificationRequestId).fold(\n                {\n                    _finish.emit(Unit)\n                },\n                { error ->\n                    Log.w(TAG, \"failed to dismiss notifications request\", error)\n                    _error.emit(error)\n                }\n            )\n        }\n    }\n\n    fun dismissNotificationRequest() {\n        viewModelScope.launch {\n            api.dismissNotificationRequest(notificationRequestId).fold({\n                _finish.emit(Unit)\n            }, { error ->\n                Log.w(TAG, \"failed to dismiss notifications request\", error)\n                _error.emit(error)\n            })\n        }\n    }\n\n    private fun updateStatus(status: Status) {\n        val position = notificationData.indexOfFirst { it.asStatusOrNull()?.id == status.id }\n        if (position == -1) {\n            return\n        }\n        val viewData = notificationData[position].statusViewData?.copy(status = status)\n        notificationData[position] = notificationData[position].copy(statusViewData = viewData)\n        currentSource?.invalidate()\n    }\n\n    private fun removeIfAccount(accountId: String) {\n        // if the account we are displaying notifications from got blocked or muted, we can exit\n        if (accountId == this.accountId) {\n            viewModelScope.launch {\n                _finish.emit(Unit)\n            }\n        }\n    }\n\n    fun remove(notification: NotificationViewData) {\n        notificationData.remove(notification)\n        currentSource?.invalidate()\n    }\n\n    fun reblog(reblog: Boolean, status: StatusViewData.Concrete, visibility: Status.Visibility = Status.Visibility.PUBLIC) = viewModelScope.launch {\n        timelineCases.reblog(status.actionableId, reblog, visibility).onFailure { t ->\n            ifExpected(t) {\n                Log.w(TAG, \"Failed to reblog status \" + status.actionableId, t)\n            }\n        }\n    }\n\n    fun favorite(favorite: Boolean, status: StatusViewData.Concrete) = viewModelScope.launch {\n        timelineCases.favourite(status.actionableId, favorite).onFailure { t ->\n            ifExpected(t) {\n                Log.w(TAG, \"Failed to favourite status \" + status.actionableId, t)\n            }\n        }\n    }\n\n    fun bookmark(bookmark: Boolean, status: StatusViewData.Concrete) = viewModelScope.launch {\n        timelineCases.bookmark(status.actionableId, bookmark).onFailure { t ->\n            ifExpected(t) {\n                Log.w(TAG, \"Failed to favourite status \" + status.actionableId, t)\n            }\n        }\n    }\n\n    fun changeExpanded(expanded: Boolean, status: StatusViewData.Concrete) {\n        updateStatusViewData(status.id) { it.copy(isExpanded = expanded) }\n    }\n\n    fun changeContentShowing(isShowing: Boolean, status: StatusViewData.Concrete) {\n        updateStatusViewData(status.id) { it.copy(isShowingContent = isShowing) }\n    }\n\n    fun changeContentCollapsed(isCollapsed: Boolean, status: StatusViewData.Concrete) {\n        updateStatusViewData(status.id) { it.copy(isCollapsed = isCollapsed) }\n    }\n\n    fun voteInPoll(choices: List<Int>, status: StatusViewData.Concrete) = viewModelScope.launch {\n        val poll = status.status.actionableStatus.poll ?: run {\n            Log.w(TAG, \"No poll on status ${status.id}\")\n            return@launch\n        }\n        timelineCases.voteInPoll(status.actionableId, poll.id, choices).onFailure { t ->\n            ifExpected(t) {\n                Log.w(TAG, \"Failed to vote in poll: \" + status.actionableId, t)\n            }\n        }\n    }\n\n    fun showPollResults(status: StatusViewData.Concrete) = viewModelScope.launch {\n        timelineCases.showPollResults(status.actionableId)\n    }\n\n    suspend fun translate(status: StatusViewData.Concrete): NetworkResult<Unit> {\n        updateStatusViewData(status.id) { viewData ->\n            viewData.copy(translation = TranslationViewData.Loading)\n        }\n        return timelineCases.translate(status.actionableId)\n            .map { translation ->\n                updateStatusViewData(status.id) { viewData ->\n                    viewData.copy(translation = TranslationViewData.Loaded(translation))\n                }\n            }\n            .onFailure {\n                updateStatusViewData(status.id) { viewData ->\n                    viewData.copy(translation = null)\n                }\n            }\n    }\n\n    fun untranslate(status: StatusViewData.Concrete) {\n        updateStatusViewData(status.id) { it.copy(translation = null) }\n    }\n\n    fun respondToFollowRequest(accept: Boolean, accountId: String, notification: NotificationViewData) {\n        viewModelScope.launch {\n            if (accept) {\n                api.authorizeFollowRequest(accountId)\n            } else {\n                api.rejectFollowRequest(accountId)\n            }.fold(\n                onSuccess = {\n                    // since the follow request has been responded, the notification can be deleted\n                    remove(notification)\n                },\n                onFailure = { t ->\n                    Log.w(TAG, \"Failed to to respond to follow request from account id $accountId.\", t)\n                }\n            )\n        }\n    }\n\n    private fun updateStatusViewData(\n        statusId: String,\n        updater: (StatusViewData.Concrete) -> StatusViewData.Concrete\n    ) {\n        val position = notificationData.indexOfFirst { it.asStatusOrNull()?.id == statusId }\n        val statusViewData = notificationData.getOrNull(position)?.statusViewData ?: return\n        notificationData[position] = notificationData[position].copy(statusViewData = updater(statusViewData))\n        currentSource?.invalidate()\n    }\n\n    companion object {\n        private const val TAG = \"NotificationRequestsViewModel\"\n    }\n\n    @AssistedFactory interface Factory {\n        fun create(\n            @Assisted(\"notificationRequestId\") notificationRequestId: String,\n            @Assisted(\"accountId\") accountId: String\n        ): NotificationRequestDetailsViewModel\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/preference/AccountPreferencesFragment.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.preference\n\nimport android.content.Intent\nimport android.graphics.drawable.Drawable\nimport android.os.Build\nimport android.os.Bundle\nimport android.util.Log\nimport androidx.lifecycle.lifecycleScope\nimport androidx.preference.ListPreference\nimport at.connyduck.calladapter.networkresult.fold\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.BaseActivity\nimport com.keylesspalace.tusky.BuildConfig\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.TabPreferenceActivity\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.PreferenceChangedEvent\nimport com.keylesspalace.tusky.components.accountlist.AccountListActivity\nimport com.keylesspalace.tusky.components.domainblocks.DomainBlocksActivity\nimport com.keylesspalace.tusky.components.filters.FiltersActivity\nimport com.keylesspalace.tusky.components.followedtags.FollowedTagsActivity\nimport com.keylesspalace.tusky.components.preference.notificationpolicies.NotificationPoliciesActivity\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.entity.Account\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.settings.AccountPreferenceDataStore\nimport com.keylesspalace.tusky.settings.DefaultReplyVisibility\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.settings.listPreference\nimport com.keylesspalace.tusky.settings.makePreferenceScreen\nimport com.keylesspalace.tusky.settings.preference\nimport com.keylesspalace.tusky.settings.preferenceCategory\nimport com.keylesspalace.tusky.settings.switchPreference\nimport com.keylesspalace.tusky.util.getInitialLanguages\nimport com.keylesspalace.tusky.util.getLocaleList\nimport com.keylesspalace.tusky.util.getTuskyDisplayName\nimport com.keylesspalace.tusky.util.icon\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass AccountPreferencesFragment : BasePreferencesFragment() {\n    @Inject\n    lateinit var accountManager: AccountManager\n\n    @Inject\n    lateinit var mastodonApi: MastodonApi\n\n    @Inject\n    lateinit var eventHub: EventHub\n\n    @Inject\n    lateinit var accountPreferenceDataStore: AccountPreferenceDataStore\n\n    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {\n        val context = requireContext()\n        makePreferenceScreen {\n            preference {\n                setTitle(R.string.pref_title_edit_notification_settings)\n                icon = icon(R.drawable.ic_notifications_24dp)\n                setOnPreferenceClickListener {\n                    openNotificationSystemPrefs()\n                    true\n                }\n            }\n\n            preference {\n                setTitle(R.string.title_tab_preferences)\n                icon = icon(R.drawable.ic_tabs_24dp)\n                setOnPreferenceClickListener {\n                    val intent = Intent(context, TabPreferenceActivity::class.java)\n                    activity?.startActivityWithSlideInAnimation(intent)\n                    true\n                }\n            }\n\n            preference {\n                setTitle(R.string.title_followed_hashtags)\n                icon = icon(R.drawable.ic_tag_24dp)\n                setOnPreferenceClickListener {\n                    val intent = Intent(context, FollowedTagsActivity::class.java)\n                    activity?.startActivityWithSlideInAnimation(intent)\n                    true\n                }\n            }\n\n            preference {\n                setTitle(R.string.action_view_mutes)\n                icon = icon(R.drawable.ic_volume_off_24dp)\n                setOnPreferenceClickListener {\n                    val intent = Intent(context, AccountListActivity::class.java)\n                    intent.putExtra(\"type\", AccountListActivity.Type.MUTES)\n                    activity?.startActivityWithSlideInAnimation(intent)\n                    true\n                }\n            }\n\n            preference {\n                setTitle(R.string.action_view_blocks)\n                icon = icon(R.drawable.ic_block_24dp)\n                setOnPreferenceClickListener {\n                    val intent = Intent(context, AccountListActivity::class.java)\n                    intent.putExtra(\"type\", AccountListActivity.Type.BLOCKS)\n                    activity?.startActivityWithSlideInAnimation(intent)\n                    true\n                }\n            }\n\n            preference {\n                setTitle(R.string.title_domain_mutes)\n                icon = icon(R.drawable.ic_volume_off_24dp)\n                setOnPreferenceClickListener {\n                    val intent = Intent(context, DomainBlocksActivity::class.java)\n                    activity?.startActivityWithSlideInAnimation(intent)\n                    true\n                }\n            }\n\n            preference {\n                setTitle(R.string.pref_title_timeline_filters)\n                icon = icon(R.drawable.ic_filter_alt_24dp)\n                setOnPreferenceClickListener {\n                    launchFilterActivity()\n                    true\n                }\n            }\n\n            preferenceCategory(R.string.pref_publishing) {\n                listPreference {\n                    setTitle(R.string.pref_default_post_privacy)\n                    setEntries(R.array.post_privacy_names)\n                    setEntryValues(R.array.post_privacy_values)\n                    key = PrefKeys.DEFAULT_POST_PRIVACY\n                    setSummaryProvider { entry }\n                    val visibility = accountManager.activeAccount?.defaultPostPrivacy ?: Status.Visibility.PUBLIC\n                    value = visibility.stringValue\n                    icon = getIconForVisibility(visibility)\n                    isPersistent = false // its saved to the account and shouldn't be in shared preferences\n                    setOnPreferenceChangeListener { _, newValue ->\n                        icon = getIconForVisibility(Status.Visibility.fromStringValue(newValue as String))\n                        if (accountManager.activeAccount?.defaultReplyPrivacy == DefaultReplyVisibility.MATCH_DEFAULT_POST_VISIBILITY) {\n                            findPreference<ListPreference>(PrefKeys.DEFAULT_REPLY_PRIVACY)?.icon = icon\n                        }\n                        syncWithServer(visibility = newValue)\n                        true\n                    }\n                }\n\n                val activeAccount = accountManager.activeAccount\n                if (activeAccount != null) {\n                    listPreference {\n                        setTitle(R.string.pref_default_reply_privacy)\n                        setEntries(R.array.reply_privacy_names)\n                        setEntryValues(R.array.reply_privacy_values)\n                        key = PrefKeys.DEFAULT_REPLY_PRIVACY\n                        setSummaryProvider { entry }\n                        val visibility = activeAccount.defaultReplyPrivacy\n                        value = visibility.stringValue\n                        icon = getIconForVisibility(visibility.toVisibilityOr(activeAccount.defaultPostPrivacy))\n                        isPersistent = false // its saved to the account and shouldn't be in shared preferences\n                        setOnPreferenceChangeListener { _, newValue ->\n                            val newVisibility = DefaultReplyVisibility.fromStringValue(newValue as String)\n\n                            icon = getIconForVisibility(newVisibility.toVisibilityOr(activeAccount.defaultPostPrivacy))\n\n                            viewLifecycleOwner.lifecycleScope.launch {\n                                accountManager.updateAccount(activeAccount) { copy(defaultReplyPrivacy = newVisibility) }\n                                eventHub.dispatch(PreferenceChangedEvent(key))\n                            }\n                            true\n                        }\n                    }\n                    preference {\n                        setSummary(R.string.pref_default_reply_privacy_explanation)\n                        shouldDisableView = false\n                        isEnabled = false\n                    }\n                }\n\n                listPreference {\n                    val locales =\n                        getLocaleList(getInitialLanguages(null, accountManager.activeAccount))\n                    setTitle(R.string.pref_default_post_language)\n                    // Explicitly add \"System default\" to the start of the list\n                    entries = (\n                        listOf(context.getString(R.string.system_default)) + locales.map {\n                            it.getTuskyDisplayName(context)\n                        }\n                        ).toTypedArray()\n                    entryValues = (listOf(\"\") + locales.map { it.language }).toTypedArray()\n                    key = PrefKeys.DEFAULT_POST_LANGUAGE\n                    icon = icon(R.drawable.ic_translate_24dp)\n                    value = accountManager.activeAccount?.defaultPostLanguage.orEmpty()\n                    isPersistent = false // This will be entirely server-driven\n                    setSummaryProvider { entry }\n\n                    setOnPreferenceChangeListener { _, newValue ->\n                        syncWithServer(language = (newValue as String))\n                        true\n                    }\n                }\n\n                switchPreference {\n                    setTitle(R.string.pref_default_media_sensitivity)\n                    icon = icon(R.drawable.ic_visibility_24dp)\n                    key = PrefKeys.DEFAULT_MEDIA_SENSITIVITY\n                    val sensitivity = accountManager.activeAccount?.defaultMediaSensitivity == true\n                    setDefaultValue(sensitivity)\n                    icon = getIconForSensitivity(sensitivity)\n                    setOnPreferenceChangeListener { _, newValue ->\n                        icon = getIconForSensitivity(newValue as Boolean)\n                        syncWithServer(sensitive = newValue)\n                        true\n                    }\n                }\n            }\n\n            preferenceCategory(R.string.pref_title_timelines) {\n                // TODO having no activeAccount in this fragment does not really make sense, enforce it?\n                //   All other locations here make it optional, however.\n\n                switchPreference {\n                    key = PrefKeys.MEDIA_PREVIEW_ENABLED\n                    setTitle(R.string.pref_title_show_media_preview)\n                    preferenceDataStore = accountPreferenceDataStore\n                }\n\n                switchPreference {\n                    key = PrefKeys.ALWAYS_SHOW_SENSITIVE_MEDIA\n                    setTitle(R.string.pref_title_alway_show_sensitive_media)\n                    preferenceDataStore = accountPreferenceDataStore\n                }\n\n                switchPreference {\n                    key = PrefKeys.ALWAYS_OPEN_SPOILER\n                    setTitle(R.string.pref_title_alway_open_spoiler)\n                    preferenceDataStore = accountPreferenceDataStore\n                }\n            }\n            preferenceCategory(R.string.pref_title_per_timeline_preferences) {\n                preference {\n                    setTitle(R.string.pref_title_post_tabs)\n                    fragment = TabFilterPreferencesFragment::class.qualifiedName\n                }\n            }\n            preference {\n                setTitle(R.string.notification_policies_title)\n                setOnPreferenceClickListener {\n                    activity?.let {\n                        val intent = NotificationPoliciesActivity.newIntent(it)\n                        it.startActivityWithSlideInAnimation(intent)\n                    }\n                    true\n                }\n            }\n        }\n    }\n\n    override fun onResume() {\n        super.onResume()\n        requireActivity().setTitle(R.string.action_view_account_preferences)\n    }\n\n    private fun openNotificationSystemPrefs() {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            val intent = Intent()\n            intent.action = \"android.settings.APP_NOTIFICATION_SETTINGS\"\n            intent.putExtra(\"android.provider.extra.APP_PACKAGE\", BuildConfig.APPLICATION_ID)\n            startActivity(intent)\n        } else {\n            activity?.let {\n                val intent = PreferencesActivity.newIntent(\n                    it,\n                    PreferencesActivity.NOTIFICATION_PREFERENCES\n                )\n                it.startActivityWithSlideInAnimation(intent)\n            }\n        }\n    }\n\n    private fun syncWithServer(\n        visibility: String? = null,\n        sensitive: Boolean? = null,\n        language: String? = null\n    ) {\n        // TODO these could also be \"datastore backed\" preferences (a ServerPreferenceDataStore); follow-up of issue #3204\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            mastodonApi.accountUpdateSource(visibility, sensitive, language)\n                .fold({ account: Account ->\n                    accountManager.activeAccount?.let {\n                        accountManager.updateAccount(it) {\n                            copy(\n                                defaultPostPrivacy = account.source?.privacy\n                                    ?: Status.Visibility.PUBLIC,\n                                defaultMediaSensitivity = account.source?.sensitive == true,\n                                defaultPostLanguage = language.orEmpty()\n                            )\n                        }\n                    }\n                }, { t ->\n                    Log.e(\"AccountPreferences\", \"failed updating settings on server\", t)\n                    showErrorSnackbar(visibility, sensitive)\n                })\n        }\n    }\n\n    private fun showErrorSnackbar(visibility: String?, sensitive: Boolean?) {\n        view?.let { view ->\n            Snackbar.make(view, R.string.pref_failed_to_sync, Snackbar.LENGTH_LONG)\n                .setAction(R.string.action_retry) { syncWithServer(visibility, sensitive) }\n                .show()\n        }\n    }\n\n    private fun getIconForVisibility(visibility: Status.Visibility): Drawable? {\n        val iconRes = when (visibility) {\n            Status.Visibility.PRIVATE -> R.drawable.ic_lock_24dp\n            Status.Visibility.UNLISTED -> R.drawable.ic_lock_open_24dp\n            Status.Visibility.DIRECT -> R.drawable.ic_mail_24dp\n            else -> R.drawable.ic_public_24dp\n        }\n        return icon(iconRes)\n    }\n\n    private fun getIconForSensitivity(sensitive: Boolean): Drawable? {\n        return if (sensitive) {\n            icon(R.drawable.ic_visibility_off_24dp)\n        } else {\n            icon(R.drawable.ic_visibility_24dp)\n        }\n    }\n\n    private fun launchFilterActivity() {\n        val intent = Intent(context, FiltersActivity::class.java)\n        (activity as? BaseActivity)?.startActivityWithSlideInAnimation(intent)\n    }\n\n    companion object {\n        fun newInstance() = AccountPreferencesFragment()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/preference/BasePreferencesFragment.kt",
    "content": "package com.keylesspalace.tusky.components.preference\n\nimport android.os.Bundle\nimport android.view.View\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat.Type.systemBars\nimport androidx.core.view.updatePadding\nimport androidx.preference.PreferenceFragmentCompat\n\nabstract class BasePreferencesFragment : PreferenceFragmentCompat() {\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        ViewCompat.setOnApplyWindowInsetsListener(listView) { listView, insets ->\n            val systemBarsInsets = insets.getInsets(systemBars())\n            listView.updatePadding(bottom = systemBarsInsets.bottom)\n            insets.inset(0, 0, 0, systemBarsInsets.bottom)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/preference/NotificationPreferencesFragment.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.preference\n\nimport android.os.Bundle\nimport androidx.lifecycle.lifecycleScope\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.systemnotifications.NotificationService\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.settings.makePreferenceScreen\nimport com.keylesspalace.tusky.settings.preferenceCategory\nimport com.keylesspalace.tusky.settings.switchPreference\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass NotificationPreferencesFragment : BasePreferencesFragment() {\n\n    @Inject\n    lateinit var accountManager: AccountManager\n\n    @Inject\n    lateinit var notificationService: NotificationService\n\n    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {\n        val activeAccount = accountManager.activeAccount ?: return\n        makePreferenceScreen {\n            switchPreference {\n                setTitle(R.string.pref_title_notifications_enabled)\n                key = PrefKeys.NOTIFICATIONS_ENABLED\n                isIconSpaceReserved = false\n                isChecked = activeAccount.notificationsEnabled\n                setOnPreferenceChangeListener { _, newValue ->\n                    updateAccount { copy(notificationsEnabled = newValue as Boolean) }\n                    if (notificationService.areNotificationsEnabledBySystem()) {\n                        notificationService.enablePullNotifications()\n                    } else {\n                        notificationService.disablePullNotifications()\n                    }\n                    true\n                }\n            }\n\n            preferenceCategory(R.string.pref_title_notification_filters) { category ->\n                category.dependency = PrefKeys.NOTIFICATIONS_ENABLED\n                category.isIconSpaceReserved = false\n\n                switchPreference {\n                    setTitle(R.string.notification_follow_name)\n                    setSummary(R.string.notification_follow_description)\n                    isIconSpaceReserved = false\n                    isChecked = activeAccount.notificationsFollowed\n                    setOnPreferenceChangeListener { _, newValue ->\n                        updateAccount { copy(notificationsFollowed = newValue as Boolean) }\n                        true\n                    }\n                }\n\n                switchPreference {\n                    setTitle(R.string.notification_follow_request_name)\n                    setSummary(R.string.notification_follow_request_description)\n                    isIconSpaceReserved = false\n                    isChecked = activeAccount.notificationsFollowRequested\n                    setOnPreferenceChangeListener { _, newValue ->\n                        updateAccount { copy(notificationsFollowRequested = newValue as Boolean) }\n                        true\n                    }\n                }\n\n                switchPreference {\n                    setTitle(R.string.notification_boost_name)\n                    setSummary(R.string.notification_boost_description)\n                    isIconSpaceReserved = false\n                    isChecked = activeAccount.notificationsReblogged\n                    setOnPreferenceChangeListener { _, newValue ->\n                        updateAccount { copy(notificationsReblogged = newValue as Boolean) }\n                        true\n                    }\n                }\n\n                switchPreference {\n                    setTitle(R.string.notification_favourite_name)\n                    setSummary(R.string.notification_favourite_description)\n                    isIconSpaceReserved = false\n                    isChecked = activeAccount.notificationsFavorited\n                    setOnPreferenceChangeListener { _, newValue ->\n                        updateAccount { copy(notificationsFavorited = newValue as Boolean) }\n                        true\n                    }\n                }\n\n                switchPreference {\n                    setTitle(R.string.notification_poll_name)\n                    setSummary(R.string.notification_poll_description)\n                    isIconSpaceReserved = false\n                    isChecked = activeAccount.notificationsPolls\n                    setOnPreferenceChangeListener { _, newValue ->\n                        updateAccount { copy(notificationsPolls = newValue as Boolean) }\n                        true\n                    }\n                }\n\n                switchPreference {\n                    setTitle(R.string.notification_subscription_name)\n                    setSummary(R.string.notification_subscription_description)\n                    isIconSpaceReserved = false\n                    isChecked = activeAccount.notificationsSubscriptions\n                    setOnPreferenceChangeListener { _, newValue ->\n                        updateAccount { copy(notificationsSubscriptions = newValue as Boolean) }\n                        true\n                    }\n                }\n\n                switchPreference {\n                    setTitle(R.string.notification_update_name)\n                    setSummary(R.string.notification_update_description)\n                    isIconSpaceReserved = false\n                    isChecked = activeAccount.notificationsUpdates\n                    setOnPreferenceChangeListener { _, newValue ->\n                        updateAccount { copy(notificationsUpdates = newValue as Boolean) }\n                        true\n                    }\n                }\n\n                switchPreference {\n                    setTitle(R.string.notification_channel_admin)\n                    setSummary(R.string.notification_channel_admin_description)\n                    isIconSpaceReserved = false\n                    isChecked = activeAccount.notificationsAdmin\n                    setOnPreferenceChangeListener { _, newValue ->\n                        updateAccount { copy(notificationsAdmin = newValue as Boolean) }\n                        true\n                    }\n                }\n\n                switchPreference {\n                    setTitle(R.string.notification_channel_other)\n                    setSummary(R.string.notification_channel_other_description)\n                    isIconSpaceReserved = false\n                    isChecked = activeAccount.notificationsOther\n                    setOnPreferenceChangeListener { _, newValue ->\n                        updateAccount { copy(notificationsOther = newValue as Boolean) }\n                        true\n                    }\n                }\n            }\n\n            preferenceCategory(R.string.pref_title_notification_alerts) { category ->\n                category.dependency = PrefKeys.NOTIFICATIONS_ENABLED\n                category.isIconSpaceReserved = false\n\n                switchPreference {\n                    setTitle(R.string.pref_title_notification_alert_sound)\n                    key = PrefKeys.NOTIFICATION_ALERT_SOUND\n                    isIconSpaceReserved = false\n                    isChecked = activeAccount.notificationSound\n                    setOnPreferenceChangeListener { _, newValue ->\n                        updateAccount { copy(notificationSound = newValue as Boolean) }\n                        true\n                    }\n                }\n\n                switchPreference {\n                    setTitle(R.string.pref_title_notification_alert_vibrate)\n                    key = PrefKeys.NOTIFICATION_ALERT_VIBRATE\n                    isIconSpaceReserved = false\n                    isChecked = activeAccount.notificationVibration\n                    setOnPreferenceChangeListener { _, newValue ->\n                        updateAccount { copy(notificationVibration = newValue as Boolean) }\n                        true\n                    }\n                }\n\n                switchPreference {\n                    setTitle(R.string.pref_title_notification_alert_light)\n                    key = PrefKeys.NOTIFICATION_ALERT_LIGHT\n                    isIconSpaceReserved = false\n                    isChecked = activeAccount.notificationLight\n                    setOnPreferenceChangeListener { _, newValue ->\n                        updateAccount { copy(notificationLight = newValue as Boolean) }\n                        true\n                    }\n                }\n            }\n        }\n    }\n\n    private fun updateAccount(changer: AccountEntity.() -> AccountEntity) {\n        viewLifecycleOwner.lifecycleScope.launch {\n            accountManager.activeAccount?.let { account ->\n                accountManager.updateAccount(account, changer)\n            }\n        }\n    }\n\n    override fun onResume() {\n        super.onResume()\n        requireActivity().setTitle(R.string.pref_title_edit_notification_settings)\n    }\n\n    companion object {\n        fun newInstance(): NotificationPreferencesFragment {\n            return NotificationPreferencesFragment()\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesActivity.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.preference\n\nimport android.content.Context\nimport android.content.Intent\nimport android.content.SharedPreferences\nimport android.os.Build\nimport android.os.Bundle\nimport android.util.Log\nimport androidx.activity.OnBackPressedCallback\nimport androidx.core.view.WindowCompat\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.commit\nimport androidx.lifecycle.lifecycleScope\nimport androidx.preference.Preference\nimport androidx.preference.PreferenceFragmentCompat\nimport com.keylesspalace.tusky.BaseActivity\nimport com.keylesspalace.tusky.MainActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.PreferenceChangedEvent\nimport com.keylesspalace.tusky.databinding.ActivityPreferencesBinding\nimport com.keylesspalace.tusky.settings.AppTheme\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.settings.PrefKeys.APP_THEME\nimport com.keylesspalace.tusky.util.getNonNullString\nimport com.keylesspalace.tusky.util.setAppNightMode\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport dagger.hilt.android.AndroidEntryPoint\nimport de.c1710.filemojicompat_ui.helpers.EMOJI_PREFERENCE\nimport javax.inject.Inject\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass PreferencesActivity :\n    BaseActivity(),\n    SharedPreferences.OnSharedPreferenceChangeListener,\n    PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {\n\n    @Inject\n    lateinit var eventHub: EventHub\n\n    private val restartActivitiesOnBackPressedCallback = object : OnBackPressedCallback(false) {\n        override fun handleOnBackPressed() {\n            /* Switching themes won't actually change the theme of activities on the back stack.\n             * Either the back stack activities need to all be recreated, or do the easier thing, which\n             * is hijack the back button press and use it to launch a new MainActivity and clear the\n             * back stack. */\n            val intent = Intent(this@PreferencesActivity, MainActivity::class.java)\n            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK\n            startActivityWithSlideInAnimation(intent)\n        }\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        // Workaround for edge-to-edge mode not working when an activity is recreated\n        // https://stackoverflow.com/questions/79319740/edge-to-edge-doesnt-work-when-activity-recreated-or-appcompatdelegate-setdefaul\n        if (savedInstanceState != null && Build.VERSION.SDK_INT >= 35) {\n            WindowCompat.setDecorFitsSystemWindows(window, false)\n        }\n\n        val binding = ActivityPreferencesBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n\n        setSupportActionBar(binding.includedToolbar.toolbar)\n        supportActionBar?.run {\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n        }\n\n        val preferenceType = intent.getIntExtra(EXTRA_PREFERENCE_TYPE, 0)\n\n        val fragmentTag = \"preference_fragment_$preferenceType\"\n\n        val fragment: Fragment = supportFragmentManager.findFragmentByTag(fragmentTag)\n            ?: when (preferenceType) {\n                GENERAL_PREFERENCES -> PreferencesFragment.newInstance()\n                ACCOUNT_PREFERENCES -> AccountPreferencesFragment.newInstance()\n                NOTIFICATION_PREFERENCES -> NotificationPreferencesFragment.newInstance()\n                else -> throw IllegalArgumentException(\"preferenceType not known\")\n            }\n\n        supportFragmentManager.commit {\n            replace(R.id.fragment_container, fragment, fragmentTag)\n        }\n\n        onBackPressedDispatcher.addCallback(this, restartActivitiesOnBackPressedCallback)\n        restartActivitiesOnBackPressedCallback.isEnabled = savedInstanceState?.getBoolean(EXTRA_RESTART_ON_BACK, false) == true\n    }\n\n    override fun onPreferenceStartFragment(\n        caller: PreferenceFragmentCompat,\n        pref: Preference\n    ): Boolean {\n        val args = pref.extras\n        val fragment = supportFragmentManager.fragmentFactory.instantiate(\n            classLoader,\n            pref.fragment!!\n        )\n        fragment.arguments = args\n        supportFragmentManager.commit {\n            setCustomAnimations(\n                R.anim.activity_open_enter,\n                R.anim.activity_open_exit,\n                R.anim.activity_close_enter,\n                R.anim.activity_close_exit\n            )\n            replace(R.id.fragment_container, fragment)\n            addToBackStack(null)\n        }\n        return true\n    }\n\n    override fun onResume() {\n        super.onResume()\n        preferences.registerOnSharedPreferenceChangeListener(this)\n    }\n\n    override fun onPause() {\n        super.onPause()\n        preferences.unregisterOnSharedPreferenceChangeListener(this)\n    }\n\n    override fun onSaveInstanceState(outState: Bundle) {\n        outState.putBoolean(EXTRA_RESTART_ON_BACK, restartActivitiesOnBackPressedCallback.isEnabled)\n        super.onSaveInstanceState(outState)\n    }\n\n    override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {\n        sharedPreferences ?: return\n        key ?: return\n        when (key) {\n            APP_THEME -> {\n                val theme = sharedPreferences.getNonNullString(APP_THEME, AppTheme.DEFAULT.value)\n                Log.d(\"activeTheme\", theme)\n                setAppNightMode(theme)\n\n                restartActivitiesOnBackPressedCallback.isEnabled = true\n                this.recreate()\n            }\n            PrefKeys.UI_TEXT_SCALE_RATIO -> {\n                restartActivitiesOnBackPressedCallback.isEnabled = true\n                this.recreate()\n            }\n            PrefKeys.STATUS_TEXT_SIZE, PrefKeys.ABSOLUTE_TIME_VIEW, PrefKeys.SHOW_BOT_OVERLAY, PrefKeys.ANIMATE_GIF_AVATARS, PrefKeys.USE_BLURHASH,\n            PrefKeys.SHOW_SELF_USERNAME, PrefKeys.SHOW_CARDS_IN_TIMELINES, EMOJI_PREFERENCE, PrefKeys.ENABLE_SWIPE_FOR_TABS,\n            PrefKeys.MAIN_NAV_POSITION, PrefKeys.HIDE_TOP_TOOLBAR, PrefKeys.SHOW_STATS_INLINE -> {\n                restartActivitiesOnBackPressedCallback.isEnabled = true\n            }\n        }\n        lifecycleScope.launch {\n            eventHub.dispatch(PreferenceChangedEvent(key))\n        }\n    }\n\n    companion object {\n        @Suppress(\"unused\")\n        private const val TAG = \"PreferencesActivity\"\n        const val GENERAL_PREFERENCES = 0\n        const val ACCOUNT_PREFERENCES = 1\n        const val NOTIFICATION_PREFERENCES = 2\n        private const val EXTRA_PREFERENCE_TYPE = \"EXTRA_PREFERENCE_TYPE\"\n        private const val EXTRA_RESTART_ON_BACK = \"restart\"\n\n        @JvmStatic\n        fun newIntent(context: Context, preferenceType: Int): Intent {\n            val intent = Intent(context, PreferencesActivity::class.java)\n            intent.putExtra(EXTRA_PREFERENCE_TYPE, preferenceType)\n            return intent\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.preference\n\nimport android.content.SharedPreferences\nimport android.os.Bundle\nimport androidx.annotation.DrawableRes\nimport androidx.lifecycle.lifecycleScope\nimport androidx.preference.Preference\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.systemnotifications.NotificationChannelData\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.settings.AppTheme\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.settings.emojiPreference\nimport com.keylesspalace.tusky.settings.listPreference\nimport com.keylesspalace.tusky.settings.makePreferenceScreen\nimport com.keylesspalace.tusky.settings.preference\nimport com.keylesspalace.tusky.settings.preferenceCategory\nimport com.keylesspalace.tusky.settings.sliderPreference\nimport com.keylesspalace.tusky.settings.switchPreference\nimport com.keylesspalace.tusky.util.LocaleManager\nimport com.keylesspalace.tusky.util.icon\nimport dagger.hilt.android.AndroidEntryPoint\nimport de.c1710.filemojicompat_ui.views.picker.preference.EmojiPickerPreference\nimport javax.inject.Inject\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass PreferencesFragment : BasePreferencesFragment() {\n\n    @Inject\n    lateinit var accountManager: AccountManager\n\n    @Inject\n    lateinit var localeManager: LocaleManager\n\n    @Inject\n    lateinit var sharedPrefs: SharedPreferences\n\n    enum class ReadingOrder {\n        /** User scrolls up, reading statuses oldest to newest */\n        OLDEST_FIRST,\n\n        /** User scrolls down, reading statuses newest to oldest. Default behaviour. */\n        NEWEST_FIRST;\n\n        companion object {\n            fun from(s: String?): ReadingOrder {\n                s ?: return NEWEST_FIRST\n\n                return try {\n                    valueOf(s.uppercase())\n                } catch (_: Throwable) {\n                    NEWEST_FIRST\n                }\n            }\n        }\n    }\n\n    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {\n        makePreferenceScreen {\n            preferenceCategory(R.string.pref_title_appearance_settings) {\n                listPreference {\n                    setDefaultValue(AppTheme.DEFAULT.value)\n                    setEntries(R.array.app_theme_names)\n                    entryValues = AppTheme.stringValues()\n                    key = PrefKeys.APP_THEME\n                    setSummaryProvider { entry }\n                    setTitle(R.string.pref_title_app_theme)\n                    icon = icon(R.drawable.ic_palette_24dp)\n                }\n\n                emojiPreference(requireActivity()) {\n                    setTitle(R.string.emoji_style)\n                    icon = icon(R.drawable.ic_mood_24dp)\n                }\n\n                listPreference {\n                    setDefaultValue(\"default\")\n                    setEntries(R.array.language_entries)\n                    setEntryValues(R.array.language_values)\n                    key = PrefKeys.LANGUAGE + \"_\" // deliberately not the actual key, the real handling happens in LocaleManager\n                    setSummaryProvider { entry }\n                    setTitle(R.string.pref_title_language)\n                    icon = icon(R.drawable.ic_translate_24dp)\n                    preferenceDataStore = localeManager\n                }\n\n                sliderPreference {\n                    key = PrefKeys.UI_TEXT_SCALE_RATIO\n                    setDefaultValue(100F)\n                    valueTo = 150F\n                    valueFrom = 50F\n                    stepSize = 5F\n                    setTitle(R.string.pref_ui_text_size)\n                    format = \"%.0f%%\"\n                    decrementIcon = icon(R.drawable.ic_zoom_out_24dp)\n                    incrementIcon = icon(R.drawable.ic_zoom_in_24dp)\n                    icon = icon(R.drawable.ic_format_size_24dp)\n                }\n\n                listPreference {\n                    setDefaultValue(\"medium\")\n                    setEntries(R.array.post_text_size_names)\n                    setEntryValues(R.array.post_text_size_values)\n                    key = PrefKeys.STATUS_TEXT_SIZE\n                    setSummaryProvider { entry }\n                    setTitle(R.string.pref_post_text_size)\n                    icon = icon(R.drawable.ic_format_size_24dp)\n                }\n\n                listPreference {\n                    setDefaultValue(ReadingOrder.NEWEST_FIRST.name)\n                    setEntries(R.array.reading_order_names)\n                    setEntryValues(R.array.reading_order_values)\n                    key = PrefKeys.READING_ORDER\n                    setSummaryProvider { entry }\n                    setTitle(R.string.pref_title_reading_order)\n                    icon = icon(R.drawable.ic_sort_24dp)\n                }\n\n                listPreference {\n                    setDefaultValue(\"top\")\n                    setEntries(R.array.pref_main_nav_position_options)\n                    setEntryValues(R.array.pref_main_nav_position_values)\n                    key = PrefKeys.MAIN_NAV_POSITION\n                    setSummaryProvider { entry }\n                    setTitle(R.string.pref_main_nav_position)\n                    icon = icon(\n                        navigationPositionIcon(\n                            sharedPrefs.getString(PrefKeys.MAIN_NAV_POSITION, \"top\").orEmpty()\n                        )\n                    )\n                    setOnPreferenceChangeListener { _, newValue ->\n                        icon = icon(navigationPositionIcon(newValue.toString()))\n                        true\n                    }\n                }\n\n                listPreference {\n                    setDefaultValue(\"disambiguate\")\n                    setEntries(R.array.pref_show_self_username_names)\n                    setEntryValues(R.array.pref_show_self_username_values)\n                    key = PrefKeys.SHOW_SELF_USERNAME\n                    setSummaryProvider { entry }\n                    setTitle(R.string.pref_title_show_self_username)\n                }\n\n                switchPreference {\n                    setDefaultValue(false)\n                    key = PrefKeys.HIDE_TOP_TOOLBAR\n                    setTitle(R.string.pref_title_hide_top_toolbar)\n                }\n\n                switchPreference {\n                    setDefaultValue(true)\n                    key = PrefKeys.SHOW_NOTIFICATIONS_FILTER\n                    setTitle(R.string.pref_title_show_notifications_filter)\n                }\n\n                switchPreference {\n                    setDefaultValue(false)\n                    key = PrefKeys.ABSOLUTE_TIME_VIEW\n                    setTitle(R.string.pref_title_absolute_time)\n                }\n\n                switchPreference {\n                    setDefaultValue(true)\n                    key = PrefKeys.SHOW_BOT_OVERLAY\n                    setTitle(R.string.pref_title_bot_overlay)\n                    icon = icon(R.drawable.ic_bot_24dp)\n                }\n\n                switchPreference {\n                    setDefaultValue(false)\n                    key = PrefKeys.ANIMATE_GIF_AVATARS\n                    setTitle(R.string.pref_title_animate_gif_avatars)\n                }\n\n                switchPreference {\n                    setDefaultValue(false)\n                    key = PrefKeys.ANIMATE_CUSTOM_EMOJIS\n                    setTitle(R.string.pref_title_animate_custom_emojis)\n                }\n\n                switchPreference {\n                    setDefaultValue(true)\n                    key = PrefKeys.USE_BLURHASH\n                    setTitle(R.string.pref_title_gradient_for_media)\n                }\n\n                switchPreference {\n                    setDefaultValue(false)\n                    key = PrefKeys.SHOW_CARDS_IN_TIMELINES\n                    setTitle(R.string.pref_title_show_cards_in_timelines)\n                }\n\n                switchPreference {\n                    setDefaultValue(true)\n                    key = PrefKeys.CONFIRM_REBLOGS\n                    setTitle(R.string.pref_title_confirm_reblogs)\n                }\n\n                switchPreference {\n                    setDefaultValue(false)\n                    key = PrefKeys.CONFIRM_FAVOURITES\n                    setTitle(R.string.pref_title_confirm_favourites)\n                }\n\n                switchPreference {\n                    setDefaultValue(false)\n                    key = PrefKeys.CONFIRM_FOLLOWS\n                    setTitle(R.string.pref_title_confirm_follows)\n                }\n\n                switchPreference {\n                    setDefaultValue(true)\n                    key = PrefKeys.ENABLE_SWIPE_FOR_TABS\n                    setTitle(R.string.pref_title_enable_swipe_for_tabs)\n                }\n\n                switchPreference {\n                    setDefaultValue(false)\n                    key = PrefKeys.SHOW_STATS_INLINE\n                    setTitle(R.string.pref_title_show_stat_inline)\n                }\n            }\n\n            preferenceCategory(R.string.pref_title_browser_settings) {\n                switchPreference {\n                    setDefaultValue(false)\n                    key = PrefKeys.CUSTOM_TABS\n                    setTitle(R.string.pref_title_custom_tabs)\n                }\n            }\n\n            preferenceCategory(R.string.pref_title_wellbeing_mode) {\n                switchPreference {\n                    title = getString(R.string.limit_notifications)\n                    setDefaultValue(false)\n                    key = PrefKeys.WELLBEING_LIMITED_NOTIFICATIONS\n                    setOnPreferenceChangeListener { _, value ->\n                        for (account in accountManager.accounts) {\n                            val notificationFilter = account.notificationsFilter.toMutableSet()\n\n                            if (value == true) {\n                                notificationFilter.add(NotificationChannelData.FAVOURITE)\n                                notificationFilter.add(NotificationChannelData.FOLLOW)\n                                notificationFilter.add(NotificationChannelData.REBLOG)\n                            } else {\n                                notificationFilter.remove(NotificationChannelData.FAVOURITE)\n                                notificationFilter.remove(NotificationChannelData.FOLLOW)\n                                notificationFilter.remove(NotificationChannelData.REBLOG)\n                            }\n\n                            lifecycleScope.launch {\n                                accountManager.updateAccount(account) { copy(notificationsFilter = notificationFilter) }\n                            }\n                        }\n                        true\n                    }\n                }\n\n                switchPreference {\n                    title = getString(R.string.wellbeing_hide_stats_posts)\n                    setDefaultValue(false)\n                    key = PrefKeys.WELLBEING_HIDE_STATS_POSTS\n                }\n\n                switchPreference {\n                    title = getString(R.string.wellbeing_hide_stats_profile)\n                    setDefaultValue(false)\n                    key = PrefKeys.WELLBEING_HIDE_STATS_PROFILE\n                }\n            }\n\n            preferenceCategory(R.string.pref_title_proxy_settings) {\n                preference {\n                    setTitle(R.string.pref_title_http_proxy_settings)\n                    fragment = ProxyPreferencesFragment::class.qualifiedName\n                    summaryProvider = ProxyPreferencesFragment.SummaryProvider\n                }\n            }\n        }\n    }\n\n    @DrawableRes private fun navigationPositionIcon(position: String): Int {\n        return if (position == \"bottom\") {\n            R.drawable.ic_bottom_navigation_24dp\n        } else {\n            R.drawable.ic_bottom_navigation_24dp_mirrored\n        }\n    }\n\n    override fun onResume() {\n        super.onResume()\n        requireActivity().setTitle(R.string.action_view_preferences)\n    }\n\n    override fun onDisplayPreferenceDialog(preference: Preference) {\n        if (!EmojiPickerPreference.onDisplayPreferenceDialog(this, preference)) {\n            super.onDisplayPreferenceDialog(preference)\n        }\n    }\n\n    companion object {\n        fun newInstance(): PreferencesFragment {\n            return PreferencesFragment()\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/preference/ProxyPreferencesFragment.kt",
    "content": "/* Copyright 2018 Conny Duck\n\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.preference\n\nimport android.os.Bundle\nimport androidx.preference.Preference\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.settings.ProxyConfiguration\nimport com.keylesspalace.tusky.settings.ProxyConfiguration.Companion.MAX_PROXY_PORT\nimport com.keylesspalace.tusky.settings.ProxyConfiguration.Companion.MIN_PROXY_PORT\nimport com.keylesspalace.tusky.settings.makePreferenceScreen\nimport com.keylesspalace.tusky.settings.preferenceCategory\nimport com.keylesspalace.tusky.settings.switchPreference\nimport com.keylesspalace.tusky.settings.validatedEditTextPreference\nimport com.keylesspalace.tusky.util.getNonNullString\nimport kotlin.system.exitProcess\n\nclass ProxyPreferencesFragment : BasePreferencesFragment() {\n    private var pendingRestart = false\n\n    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {\n        makePreferenceScreen {\n            switchPreference {\n                setTitle(R.string.pref_title_http_proxy_enable)\n                isIconSpaceReserved = false\n                key = PrefKeys.HTTP_PROXY_ENABLED\n                setDefaultValue(false)\n            }\n\n            preferenceCategory { category ->\n                category.dependency = PrefKeys.HTTP_PROXY_ENABLED\n                category.isIconSpaceReserved = false\n\n                validatedEditTextPreference(null, ProxyConfiguration::isValidHostname) {\n                    setTitle(R.string.pref_title_http_proxy_server)\n                    key = PrefKeys.HTTP_PROXY_SERVER\n                    isIconSpaceReserved = false\n                    setSummaryProvider { text }\n                }\n\n                val portErrorMessage = getString(\n                    R.string.pref_title_http_proxy_port_message,\n                    MIN_PROXY_PORT,\n                    MAX_PROXY_PORT\n                )\n\n                validatedEditTextPreference(\n                    portErrorMessage,\n                    ProxyConfiguration::isValidProxyPort\n                ) {\n                    setTitle(R.string.pref_title_http_proxy_port)\n                    key = PrefKeys.HTTP_PROXY_PORT\n                    isIconSpaceReserved = false\n                    setSummaryProvider { text }\n                }\n            }\n        }\n    }\n\n    override fun onResume() {\n        super.onResume()\n        requireActivity().setTitle(R.string.pref_title_http_proxy_settings)\n    }\n\n    override fun onPause() {\n        super.onPause()\n        if (pendingRestart) {\n            pendingRestart = false\n            exitProcess(0)\n        }\n    }\n\n    object SummaryProvider : Preference.SummaryProvider<Preference> {\n        override fun provideSummary(preference: Preference): CharSequence {\n            val sharedPreferences = preference.sharedPreferences\n            sharedPreferences ?: return \"\"\n\n            if (!sharedPreferences.getBoolean(PrefKeys.HTTP_PROXY_ENABLED, false)) {\n                return preference.context.getString(R.string.pref_summary_http_proxy_disabled)\n            }\n\n            val missing = preference.context.getString(R.string.pref_summary_http_proxy_missing)\n\n            val server = sharedPreferences.getNonNullString(PrefKeys.HTTP_PROXY_SERVER, missing)\n            val port = try {\n                sharedPreferences.getNonNullString(PrefKeys.HTTP_PROXY_PORT, \"-1\").toInt()\n            } catch (e: NumberFormatException) {\n                -1\n            }\n\n            if (port < MIN_PROXY_PORT || port > MAX_PROXY_PORT) {\n                val invalid = preference.context.getString(R.string.pref_summary_http_proxy_invalid)\n                return \"$server:$invalid\"\n            }\n\n            return \"$server:$port\"\n        }\n    }\n\n    companion object {\n        fun newInstance(): ProxyPreferencesFragment {\n            return ProxyPreferencesFragment()\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/preference/TabFilterPreferencesFragment.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.preference\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport com.google.android.material.color.MaterialColors\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.settings.AccountPreferenceDataStore\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.settings.makePreferenceScreen\nimport com.keylesspalace.tusky.settings.preferenceCategory\nimport com.keylesspalace.tusky.settings.switchPreference\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass TabFilterPreferencesFragment : BasePreferencesFragment() {\n\n    @Inject\n    lateinit var accountPreferenceDataStore: AccountPreferenceDataStore\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        // Give view a background color so transitions show up correctly\n        return super.onCreateView(inflater, container, savedInstanceState).also { view ->\n            view.setBackgroundColor(MaterialColors.getColor(view, android.R.attr.colorBackground))\n        }\n    }\n\n    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {\n        makePreferenceScreen {\n            preferenceCategory(R.string.title_home) { category ->\n                category.isIconSpaceReserved = false\n\n                switchPreference {\n                    setTitle(R.string.pref_title_show_boosts)\n                    key = PrefKeys.TAB_FILTER_HOME_BOOSTS\n                    preferenceDataStore = accountPreferenceDataStore\n                    isIconSpaceReserved = false\n                }\n\n                switchPreference {\n                    setTitle(R.string.pref_title_show_replies)\n                    key = PrefKeys.TAB_FILTER_HOME_REPLIES\n                    preferenceDataStore = accountPreferenceDataStore\n                    isIconSpaceReserved = false\n                }\n\n                switchPreference {\n                    setTitle(R.string.pref_title_show_self_boosts)\n                    setSummary(R.string.pref_title_show_self_boosts_description)\n                    key = PrefKeys.TAB_SHOW_HOME_SELF_BOOSTS\n                    preferenceDataStore = accountPreferenceDataStore\n                    isIconSpaceReserved = false\n                }.apply { dependency = PrefKeys.TAB_FILTER_HOME_BOOSTS }\n            }\n        }\n    }\n\n    override fun onResume() {\n        super.onResume()\n        requireActivity().setTitle(R.string.pref_title_post_tabs)\n    }\n\n    companion object {\n        fun newInstance(): TabFilterPreferencesFragment {\n            return TabFilterPreferencesFragment()\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/preference/notificationpolicies/NotificationPoliciesActivity.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.preference.notificationpolicies\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.lifecycleScope\nimport com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_LONG\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.BaseActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ActivityNotificationPolicyBinding\nimport com.keylesspalace.tusky.usecase.NotificationPolicyState\nimport com.keylesspalace.tusky.util.getErrorString\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.util.visible\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlin.getValue\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass NotificationPoliciesActivity : BaseActivity() {\n\n    private val viewModel: NotificationPoliciesViewModel by viewModels()\n\n    private val binding by viewBinding(ActivityNotificationPolicyBinding::inflate)\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        setContentView(binding.root)\n\n        setSupportActionBar(binding.includedToolbar.toolbar)\n        supportActionBar?.run {\n            setTitle(R.string.notification_policies_title)\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n        }\n\n        lifecycleScope.launch {\n            viewModel.state.collect { state ->\n                binding.progressBar.visible(state is NotificationPolicyState.Loading)\n                binding.preferenceFragment.visible(state is NotificationPolicyState.Loaded)\n                binding.messageView.visible(state !is NotificationPolicyState.Loading && state !is NotificationPolicyState.Loaded)\n                when (state) {\n                    is NotificationPolicyState.Loading -> { }\n\n                    is NotificationPolicyState.Error ->\n                        binding.messageView.setup(state.throwable) { viewModel.loadPolicy() }\n\n                    is NotificationPolicyState.Loaded -> { }\n\n                    NotificationPolicyState.Unsupported ->\n                        binding.messageView.setup(R.drawable.errorphant_error, R.string.notification_policies_not_supported) { viewModel.loadPolicy() }\n                }\n            }\n        }\n        lifecycleScope.launch {\n            viewModel.error.collect { error ->\n                Snackbar.make(\n                    binding.root,\n                    error.getErrorString(this@NotificationPoliciesActivity),\n                    LENGTH_LONG\n                ).show()\n            }\n        }\n    }\n\n    companion object {\n        fun newIntent(context: Context) = Intent(context, NotificationPoliciesActivity::class.java)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/preference/notificationpolicies/NotificationPoliciesFragment.kt",
    "content": "/* Copyright 2024 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.preference.notificationpolicies\n\nimport android.os.Bundle\nimport android.view.View\nimport androidx.fragment.app.activityViewModels\nimport androidx.lifecycle.lifecycleScope\nimport androidx.preference.PreferenceFragmentCompat\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.settings.makePreferenceScreen\nimport com.keylesspalace.tusky.settings.preferenceCategory\nimport com.keylesspalace.tusky.usecase.NotificationPolicyState\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass NotificationPoliciesFragment : PreferenceFragmentCompat() {\n\n    val viewModel: NotificationPoliciesViewModel by activityViewModels()\n\n    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {\n        makePreferenceScreen {\n            preferenceCategory(title = R.string.notification_policies_filter_out) { category ->\n                category.isIconSpaceReserved = false\n\n                notificationPolicyPreference {\n                    setTitle(R.string.notification_policies_filter_dont_follow_title)\n                    setSummary(R.string.notification_policies_filter_dont_follow_description)\n                    key = KEY_NOT_FOLLOWING\n                    setOnPreferenceChangeListener { _, newValue ->\n                        viewModel.updatePolicy(forNotFollowing = newValue as String)\n                        true\n                    }\n                }\n\n                notificationPolicyPreference {\n                    setTitle(R.string.notification_policies_filter_not_following_title)\n                    setSummary(R.string.notification_policies_filter_not_following_description)\n                    key = KEY_NOT_FOLLOWERS\n                    setOnPreferenceChangeListener { _, newValue ->\n                        viewModel.updatePolicy(forNotFollowers = newValue as String)\n                        true\n                    }\n                }\n\n                notificationPolicyPreference {\n                    setTitle(R.string.unknown_notification_filter_new_accounts_title)\n                    setSummary(R.string.unknown_notification_filter_new_accounts_description)\n                    key = KEY_NEW_ACCOUNTS\n                    setOnPreferenceChangeListener { _, newValue ->\n                        viewModel.updatePolicy(forNewAccounts = newValue as String)\n                        true\n                    }\n                }\n\n                notificationPolicyPreference {\n                    setTitle(R.string.unknown_notification_filter_unsolicited_private_mentions_title)\n                    setSummary(R.string.unknown_notification_filter_unsolicited_private_mentions_description)\n                    key = KEY_PRIVATE_MENTIONS\n                    setOnPreferenceChangeListener { _, newValue ->\n                        viewModel.updatePolicy(forPrivateMentions = newValue as String)\n                        true\n                    }\n                }\n\n                notificationPolicyPreference {\n                    setTitle(R.string.unknown_notification_filter_moderated_accounts)\n                    setSummary(R.string.unknown_notification_filter_moderated_accounts_description)\n                    key = KEY_LIMITED_ACCOUNTS\n                    setOnPreferenceChangeListener { _, newValue ->\n                        viewModel.updatePolicy(forLimitedAccounts = newValue as String)\n                        true\n                    }\n                }\n            }\n        }\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.state.collect { state ->\n                if (state is NotificationPolicyState.Loaded) {\n                    findPreference<NotificationPolicyPreference>(KEY_NOT_FOLLOWING)?.value = state.policy.forNotFollowing.name.lowercase()\n                    findPreference<NotificationPolicyPreference>(KEY_NOT_FOLLOWERS)?.value = state.policy.forNotFollowers.name.lowercase()\n                    findPreference<NotificationPolicyPreference>(KEY_NEW_ACCOUNTS)?.value = state.policy.forNewAccounts.name.lowercase()\n                    findPreference<NotificationPolicyPreference>(KEY_PRIVATE_MENTIONS)?.value = state.policy.forPrivateMentions.name.lowercase()\n                    findPreference<NotificationPolicyPreference>(KEY_LIMITED_ACCOUNTS)?.value = state.policy.forLimitedAccounts.name.lowercase()\n                }\n            }\n        }\n    }\n\n    companion object {\n        fun newInstance(): NotificationPoliciesFragment {\n            return NotificationPoliciesFragment()\n        }\n\n        private const val KEY_NOT_FOLLOWING = \"NOT_FOLLOWING\"\n        private const val KEY_NOT_FOLLOWERS = \"NOT_FOLLOWERS\"\n        private const val KEY_NEW_ACCOUNTS = \"NEW_ACCOUNTS\"\n        private const val KEY_PRIVATE_MENTIONS = \"PRIVATE MENTIONS\"\n        private const val KEY_LIMITED_ACCOUNTS = \"LIMITED_ACCOUNTS\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/preference/notificationpolicies/NotificationPoliciesViewModel.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.preference.notificationpolicies\n\nimport android.util.Log\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport at.connyduck.calladapter.networkresult.onFailure\nimport com.keylesspalace.tusky.usecase.NotificationPolicyState\nimport com.keylesspalace.tusky.usecase.NotificationPolicyUsecase\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.SharedFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.asSharedFlow\nimport kotlinx.coroutines.launch\n\n@HiltViewModel\nclass NotificationPoliciesViewModel @Inject constructor(\n    private val usecase: NotificationPolicyUsecase\n) : ViewModel() {\n\n    val state: StateFlow<NotificationPolicyState> = usecase.state\n\n    private val _error = MutableSharedFlow<Throwable>(\n        replay = 0,\n        extraBufferCapacity = 1,\n        onBufferOverflow = BufferOverflow.DROP_OLDEST\n    )\n    val error: SharedFlow<Throwable> = _error.asSharedFlow()\n\n    init {\n        loadPolicy()\n    }\n\n    fun loadPolicy() {\n        viewModelScope.launch {\n            usecase.getNotificationPolicy()\n        }\n    }\n\n    fun updatePolicy(\n        forNotFollowing: String? = null,\n        forNotFollowers: String? = null,\n        forNewAccounts: String? = null,\n        forPrivateMentions: String? = null,\n        forLimitedAccounts: String? = null\n    ) {\n        viewModelScope.launch {\n            usecase.updatePolicy(\n                forNotFollowing = forNotFollowing,\n                forNotFollowers = forNotFollowers,\n                forNewAccounts = forNewAccounts,\n                forPrivateMentions = forPrivateMentions,\n                forLimitedAccounts = forLimitedAccounts\n            ).onFailure { error ->\n                Log.w(TAG, \"failed to update notifications policy\", error)\n                _error.emit(error)\n            }\n        }\n    }\n\n    companion object {\n        private const val TAG = \"NotificationPoliciesViewModel\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/preference/notificationpolicies/NotificationPolicyPreference.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.preference.notificationpolicies\n\nimport android.content.Context\nimport android.widget.TextView\nimport androidx.preference.ListPreference\nimport androidx.preference.PreferenceViewHolder\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.settings.PreferenceParent\n\nclass NotificationPolicyPreference(\n    context: Context\n) : ListPreference(context) {\n\n    init {\n        widgetLayoutResource = R.layout.preference_notification_policy\n        setEntries(R.array.notification_policy_options)\n        setEntryValues(R.array.notification_policy_value)\n        isIconSpaceReserved = false\n    }\n\n    override fun onBindViewHolder(holder: PreferenceViewHolder) {\n        super.onBindViewHolder(holder)\n        val switchView: TextView = holder.findViewById(R.id.notification_policy_value) as TextView\n        switchView.text = entries.getOrNull(findIndexOfValue(value))\n    }\n}\n\ninline fun PreferenceParent.notificationPolicyPreference(builder: NotificationPolicyPreference.() -> Unit): NotificationPolicyPreference {\n    val pref = NotificationPolicyPreference(context)\n    builder(pref)\n    addPref(pref)\n    return pref\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/report/ReportActivity.kt",
    "content": "/* Copyright 2019 Joel Pyska\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.report\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat.Type.systemBars\nimport androidx.core.view.updatePadding\nimport androidx.lifecycle.lifecycleScope\nimport com.keylesspalace.tusky.BottomSheetActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.report.adapter.ReportPagerAdapter\nimport com.keylesspalace.tusky.databinding.ActivityReportBinding\nimport com.keylesspalace.tusky.util.viewBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass ReportActivity : BottomSheetActivity() {\n\n    private val viewModel: ReportViewModel by viewModels()\n\n    private val binding by viewBinding(ActivityReportBinding::inflate)\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        val accountId = intent?.getStringExtra(ACCOUNT_ID)\n        val accountUserName = intent?.getStringExtra(ACCOUNT_USERNAME)\n        if (accountId.isNullOrBlank() || accountUserName.isNullOrBlank()) {\n            throw IllegalStateException(\n                \"accountId ($accountId) or accountUserName ($accountUserName) is null\"\n            )\n        }\n\n        viewModel.init(accountId, accountUserName, intent?.getStringExtra(STATUS_ID))\n\n        setContentView(binding.root)\n\n        setSupportActionBar(binding.includedToolbar.toolbar)\n\n        supportActionBar?.apply {\n            title = getString(R.string.report_username_format, viewModel.accountUserName)\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n            setHomeAsUpIndicator(R.drawable.ic_close_24dp)\n        }\n\n        ViewCompat.setOnApplyWindowInsetsListener(binding.wizard) { wizard, insets ->\n            val systemBarInsets = insets.getInsets(systemBars())\n            wizard.updatePadding(bottom = systemBarInsets.bottom)\n\n            insets.inset(0, 0, 0, systemBarInsets.bottom)\n        }\n\n        initViewPager()\n        if (savedInstanceState == null) {\n            viewModel.navigateTo(Screen.Statuses)\n        }\n        subscribeObservables()\n    }\n\n    private fun initViewPager() {\n        binding.wizard.isUserInputEnabled = false\n\n        // Odd workaround for text field losing focus on first focus\n        //   (unfixed old bug: https://github.com/material-components/material-components-android/issues/500)\n        binding.wizard.offscreenPageLimit = 1\n\n        binding.wizard.adapter = ReportPagerAdapter(this)\n    }\n\n    private fun subscribeObservables() {\n        lifecycleScope.launch {\n            viewModel.navigation.collect { screen ->\n                if (screen == null) return@collect\n                viewModel.navigated()\n                when (screen) {\n                    Screen.Statuses -> showStatusesPage()\n                    Screen.Note -> showNotesPage()\n                    Screen.Done -> showDonePage()\n                    Screen.Back -> showPreviousScreen()\n                    Screen.Finish -> closeScreen()\n                }\n            }\n        }\n\n        lifecycleScope.launch {\n            viewModel.checkUrl.collect {\n                if (!it.isNullOrBlank()) {\n                    viewModel.urlChecked()\n                    viewUrl(it)\n                }\n            }\n        }\n    }\n\n    private fun showPreviousScreen() {\n        when (binding.wizard.currentItem) {\n            0 -> closeScreen()\n            1 -> showStatusesPage()\n        }\n    }\n\n    private fun showDonePage() {\n        binding.wizard.currentItem = 2\n    }\n\n    private fun showNotesPage() {\n        binding.wizard.currentItem = 1\n    }\n\n    private fun closeScreen() {\n        finish()\n    }\n\n    private fun showStatusesPage() {\n        binding.wizard.currentItem = 0\n    }\n\n    companion object {\n        private const val ACCOUNT_ID = \"account_id\"\n        private const val ACCOUNT_USERNAME = \"account_username\"\n        private const val STATUS_ID = \"status_id\"\n\n        @JvmStatic\n        fun getIntent(\n            context: Context,\n            accountId: String,\n            userName: String,\n            statusId: String? = null\n        ) = Intent(context, ReportActivity::class.java)\n            .apply {\n                putExtra(ACCOUNT_ID, accountId)\n                putExtra(ACCOUNT_USERNAME, userName)\n                putExtra(STATUS_ID, statusId)\n            }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/report/ReportViewModel.kt",
    "content": "/* Copyright 2019 Joel Pyska\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.report\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport androidx.paging.Pager\nimport androidx.paging.PagingConfig\nimport androidx.paging.cachedIn\nimport androidx.paging.map\nimport at.connyduck.calladapter.networkresult.fold\nimport com.keylesspalace.tusky.appstore.BlockEvent\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.MuteEvent\nimport com.keylesspalace.tusky.components.report.adapter.StatusesPagingSource\nimport com.keylesspalace.tusky.components.report.model.StatusViewState\nimport com.keylesspalace.tusky.entity.Relationship\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.Error\nimport com.keylesspalace.tusky.util.Loading\nimport com.keylesspalace.tusky.util.Resource\nimport com.keylesspalace.tusky.util.Success\nimport com.keylesspalace.tusky.util.toViewData\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.launch\n\n@HiltViewModel\n@OptIn(ExperimentalCoroutinesApi::class)\nclass ReportViewModel @Inject constructor(\n    private val mastodonApi: MastodonApi,\n    private val eventHub: EventHub\n) : ViewModel() {\n\n    private val navigationMutable = MutableStateFlow(null as Screen?)\n    val navigation: StateFlow<Screen?> = navigationMutable.asStateFlow()\n\n    private val muteStateMutable = MutableStateFlow(null as Resource<Boolean>?)\n    val muteState: StateFlow<Resource<Boolean>?> = muteStateMutable.asStateFlow()\n\n    private val blockStateMutable = MutableStateFlow(null as Resource<Boolean>?)\n    val blockState: StateFlow<Resource<Boolean>?> = blockStateMutable.asStateFlow()\n\n    private val reportingStateMutable = MutableStateFlow(null as Resource<Boolean>?)\n    var reportingState: StateFlow<Resource<Boolean>?> = reportingStateMutable.asStateFlow()\n\n    private val checkUrlMutable = MutableStateFlow(null as String?)\n    val checkUrl: StateFlow<String?> = checkUrlMutable.asStateFlow()\n\n    private val accountIdFlow = MutableSharedFlow<String>(\n        replay = 1,\n        onBufferOverflow = BufferOverflow.DROP_OLDEST\n    )\n\n    val statusesFlow = accountIdFlow.flatMapLatest { accountId ->\n        Pager(\n            initialKey = statusId,\n            config = PagingConfig(\n                pageSize = 20,\n                initialLoadSize = 20\n            ),\n            pagingSourceFactory = { StatusesPagingSource(accountId, mastodonApi) }\n        ).flow\n    }\n        .map { pagingData ->\n            /* TODO: refactor reports to use the isShowingContent / isExpanded / isCollapsed attributes from StatusViewData.Concrete\n             instead of StatusViewState */\n            pagingData.map { status -> status.toViewData(false, false, false, filter = null) }\n        }\n        .cachedIn(viewModelScope)\n\n    private val selectedIds = HashSet<String>()\n    val statusViewState = StatusViewState()\n\n    var reportNote: String = \"\"\n    var isRemoteNotify = false\n\n    private var statusId: String? = null\n    lateinit var accountUserName: String\n    lateinit var accountId: String\n    var isRemoteAccount: Boolean = false\n    var remoteServer: String? = null\n\n    fun init(accountId: String, userName: String, statusId: String?) {\n        this.accountId = accountId\n        this.accountUserName = userName\n        this.statusId = statusId\n        statusId?.let {\n            selectedIds.add(it)\n        }\n\n        isRemoteAccount = userName.contains('@')\n        if (isRemoteAccount) {\n            remoteServer = userName.substring(userName.indexOf('@') + 1)\n        }\n\n        obtainRelationship()\n\n        viewModelScope.launch {\n            accountIdFlow.emit(accountId)\n        }\n    }\n\n    fun navigateTo(screen: Screen) {\n        navigationMutable.value = screen\n    }\n\n    fun navigated() {\n        navigationMutable.value = null\n    }\n\n    private fun obtainRelationship() {\n        val ids = listOf(accountId)\n        muteStateMutable.value = Loading()\n        blockStateMutable.value = Loading()\n        viewModelScope.launch {\n            mastodonApi.relationships(ids).fold(\n                { data ->\n                    updateRelationship(data.getOrNull(0))\n                },\n                {\n                    updateRelationship(null)\n                }\n            )\n        }\n    }\n\n    private fun updateRelationship(relationship: Relationship?) {\n        if (relationship != null) {\n            muteStateMutable.value = Success(relationship.muting)\n            blockStateMutable.value = Success(relationship.blocking)\n        } else {\n            muteStateMutable.value = Error(false)\n            blockStateMutable.value = Error(false)\n        }\n    }\n\n    fun toggleMute() {\n        val alreadyMuted = muteStateMutable.value?.data == true\n        viewModelScope.launch {\n            if (alreadyMuted) {\n                mastodonApi.unmuteAccount(accountId)\n            } else {\n                mastodonApi.muteAccount(accountId)\n            }.fold(\n                { relationship ->\n                    val muting = relationship.muting\n                    muteStateMutable.value = Success(muting)\n                    if (muting) {\n                        eventHub.dispatch(MuteEvent(accountId))\n                    }\n                },\n                { t ->\n                    muteStateMutable.value = Error(false, t.message)\n                }\n            )\n        }\n\n        muteStateMutable.value = Loading()\n    }\n\n    fun toggleBlock() {\n        val alreadyBlocked = blockStateMutable.value?.data == true\n        viewModelScope.launch {\n            if (alreadyBlocked) {\n                mastodonApi.unblockAccount(accountId)\n            } else {\n                mastodonApi.blockAccount(accountId)\n            }.fold({ relationship ->\n                val blocking = relationship.blocking\n                blockStateMutable.value = Success(blocking)\n                if (blocking) {\n                    eventHub.dispatch(BlockEvent(accountId))\n                }\n            }, { t ->\n                blockStateMutable.value = Error(false, t.message)\n            })\n        }\n        blockStateMutable.value = Loading()\n    }\n\n    fun doReport() {\n        reportingStateMutable.value = Loading()\n        viewModelScope.launch {\n            mastodonApi.report(\n                accountId,\n                selectedIds.toList(),\n                reportNote,\n                if (isRemoteAccount) isRemoteNotify else null\n            )\n                .fold({\n                    reportingStateMutable.value = Success(true)\n                }, { error ->\n                    reportingStateMutable.value = Error(cause = error)\n                })\n        }\n    }\n\n    fun checkClickedUrl(url: String?) {\n        checkUrlMutable.value = url\n    }\n\n    fun urlChecked() {\n        checkUrlMutable.value = null\n    }\n\n    fun setStatusChecked(status: Status, checked: Boolean) {\n        if (checked) {\n            selectedIds.add(status.id)\n        } else {\n            selectedIds.remove(status.id)\n        }\n    }\n\n    fun isStatusChecked(id: String): Boolean {\n        return selectedIds.contains(id)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/report/Screen.kt",
    "content": "/* Copyright 2019 Joel Pyska\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.report\n\nenum class Screen {\n    Statuses,\n    Note,\n    Done,\n    Back,\n    Finish\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/report/adapter/AdapterHandler.kt",
    "content": "/* Copyright 2019 Joel Pyska\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.report.adapter\n\nimport android.view.View\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.interfaces.LinkListener\nimport com.keylesspalace.tusky.viewdata.StatusViewData\n\ninterface AdapterHandler : LinkListener {\n    fun showMedia(v: View?, status: StatusViewData.Concrete, idx: Int)\n    fun setStatusChecked(status: Status, isChecked: Boolean)\n    fun isStatusChecked(id: String): Boolean\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/report/adapter/ReportPagerAdapter.kt",
    "content": "/* Copyright 2019 Joel Pyska\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.report.adapter\n\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentActivity\nimport androidx.viewpager2.adapter.FragmentStateAdapter\nimport com.keylesspalace.tusky.components.report.fragments.ReportDoneFragment\nimport com.keylesspalace.tusky.components.report.fragments.ReportNoteFragment\nimport com.keylesspalace.tusky.components.report.fragments.ReportStatusesFragment\n\nclass ReportPagerAdapter(activity: FragmentActivity) : FragmentStateAdapter(activity) {\n    override fun createFragment(position: Int): Fragment {\n        return when (position) {\n            0 -> ReportStatusesFragment.newInstance()\n            1 -> ReportNoteFragment.newInstance()\n            2 -> ReportDoneFragment.newInstance()\n            else -> throw IllegalArgumentException(\"Unknown page index: $position\")\n        }\n    }\n\n    override fun getItemCount() = 3\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/report/adapter/StatusViewHolder.kt",
    "content": "/* Copyright 2019 Joel Pyska\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.report.adapter\n\nimport android.text.Spanned\nimport android.text.TextUtils\nimport android.view.View\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.report.model.StatusViewState\nimport com.keylesspalace.tusky.databinding.ItemReportStatusBinding\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.entity.HashTag\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.interfaces.LinkListener\nimport com.keylesspalace.tusky.util.AbsoluteTimeFormatter\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.util.StatusViewHelper\nimport com.keylesspalace.tusky.util.StatusViewHelper.Companion.COLLAPSE_INPUT_FILTER\nimport com.keylesspalace.tusky.util.StatusViewHelper.Companion.NO_INPUT_FILTER\nimport com.keylesspalace.tusky.util.emojify\nimport com.keylesspalace.tusky.util.getRelativeTimeSpanString\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.setClickableMentions\nimport com.keylesspalace.tusky.util.setClickableText\nimport com.keylesspalace.tusky.util.shouldTrimStatus\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport com.keylesspalace.tusky.viewdata.toViewData\nimport java.util.Date\n\nclass StatusViewHolder(\n    private val binding: ItemReportStatusBinding,\n    private val statusDisplayOptions: StatusDisplayOptions,\n    private val viewState: StatusViewState,\n    private val adapterHandler: AdapterHandler,\n    private val getStatusForPosition: (Int) -> StatusViewData.Concrete?\n) : RecyclerView.ViewHolder(binding.root) {\n\n    private val mediaViewHeight = itemView.context.resources.getDimensionPixelSize(\n        R.dimen.status_media_preview_height\n    )\n    private val statusViewHelper = StatusViewHelper(itemView)\n    private val absoluteTimeFormatter = AbsoluteTimeFormatter()\n\n    private val previewListener = object : StatusViewHelper.MediaPreviewListener {\n        override fun onViewMedia(v: View?, idx: Int) {\n            viewdata()?.let { viewdata ->\n                adapterHandler.showMedia(v, viewdata, idx)\n            }\n        }\n\n        override fun onContentHiddenChange(isShowing: Boolean) {\n            viewdata()?.id?.let { id ->\n                viewState.setMediaShow(id, isShowing)\n            }\n        }\n    }\n\n    init {\n        binding.statusSelection.setOnCheckedChangeListener { _, isChecked ->\n            viewdata()?.let { viewdata ->\n                adapterHandler.setStatusChecked(viewdata.status, isChecked)\n            }\n        }\n        binding.statusMediaPreviewContainer.clipToOutline = true\n    }\n\n    fun bind(viewData: StatusViewData.Concrete) {\n        binding.statusSelection.isChecked = adapterHandler.isStatusChecked(viewData.id)\n\n        updateTextView()\n\n        val sensitive = viewData.status.sensitive\n\n        statusViewHelper.setMediasPreview(\n            statusDisplayOptions,\n            viewData.status.attachments,\n            sensitive,\n            previewListener,\n            viewState.isMediaShow(viewData.id, viewData.status.sensitive),\n            mediaViewHeight\n        )\n\n        statusViewHelper.setupPollReadonly(\n            viewData.status.poll.toViewData(),\n            viewData.status.emojis,\n            statusDisplayOptions\n        )\n        setCreatedAt(viewData.status.createdAt)\n    }\n\n    private fun updateTextView() {\n        viewdata()?.let { viewdata ->\n            setupCollapsedState(\n                shouldTrimStatus(viewdata.content),\n                viewState.isCollapsed(viewdata.id, true),\n                viewState.isContentShow(viewdata.id, viewdata.status.sensitive),\n                viewdata.status.spoilerText\n            )\n\n            if (viewdata.status.spoilerText.isBlank()) {\n                setTextVisible(\n                    true,\n                    viewdata.content,\n                    viewdata.status.mentions,\n                    viewdata.status.tags,\n                    viewdata.status.emojis,\n                    adapterHandler\n                )\n                binding.statusContentWarningButton.hide()\n                binding.statusContentWarningDescription.hide()\n            } else {\n                val emojiSpoiler = viewdata.status.spoilerText.emojify(\n                    viewdata.status.emojis,\n                    binding.statusContentWarningDescription,\n                    statusDisplayOptions.animateEmojis\n                )\n                binding.statusContentWarningDescription.text = emojiSpoiler\n                binding.statusContentWarningDescription.show()\n                binding.statusContentWarningButton.show()\n                setContentWarningButtonText(viewState.isContentShow(viewdata.id, true))\n                binding.statusContentWarningButton.setOnClickListener {\n                    viewdata()?.let { viewdata ->\n                        val contentShown = viewState.isContentShow(viewdata.id, true)\n                        binding.statusContentWarningDescription.invalidate()\n                        viewState.setContentShow(viewdata.id, !contentShown)\n                        setTextVisible(\n                            !contentShown,\n                            viewdata.content,\n                            viewdata.status.mentions,\n                            viewdata.status.tags,\n                            viewdata.status.emojis,\n                            adapterHandler\n                        )\n                        setContentWarningButtonText(!contentShown)\n                    }\n                }\n                setTextVisible(\n                    viewState.isContentShow(viewdata.id, true),\n                    viewdata.content,\n                    viewdata.status.mentions,\n                    viewdata.status.tags,\n                    viewdata.status.emojis,\n                    adapterHandler\n                )\n            }\n        }\n    }\n\n    private fun setContentWarningButtonText(contentShown: Boolean) {\n        if (contentShown) {\n            binding.statusContentWarningButton.setText(R.string.post_content_warning_show_less)\n        } else {\n            binding.statusContentWarningButton.setText(R.string.post_content_warning_show_more)\n        }\n    }\n\n    private fun setTextVisible(\n        expanded: Boolean,\n        content: Spanned,\n        mentions: List<Status.Mention>,\n        tags: List<HashTag>?,\n        emojis: List<Emoji>,\n        listener: LinkListener\n    ) {\n        if (expanded) {\n            val emojifiedText = content.emojify(\n                emojis,\n                binding.statusContent,\n                statusDisplayOptions.animateEmojis\n            )\n            setClickableText(binding.statusContent, emojifiedText, mentions, tags, listener)\n        } else {\n            setClickableMentions(binding.statusContent, mentions, listener)\n        }\n        if (binding.statusContent.text.isNullOrBlank()) {\n            binding.statusContent.hide()\n        } else {\n            binding.statusContent.show()\n        }\n    }\n\n    private fun setCreatedAt(createdAt: Date?) {\n        if (statusDisplayOptions.useAbsoluteTime) {\n            binding.timestampInfo.text = absoluteTimeFormatter.format(createdAt)\n        } else {\n            binding.timestampInfo.text = if (createdAt != null) {\n                val then = createdAt.time\n                val now = System.currentTimeMillis()\n                getRelativeTimeSpanString(binding.timestampInfo.context, then, now)\n            } else {\n                // unknown minutes~\n                \"?m\"\n            }\n        }\n    }\n\n    private fun setupCollapsedState(\n        collapsible: Boolean,\n        collapsed: Boolean,\n        expanded: Boolean,\n        spoilerText: String\n    ) {\n        /* input filter for TextViews have to be set before text */\n        if (collapsible && (expanded || TextUtils.isEmpty(spoilerText))) {\n            binding.buttonToggleContent.setOnClickListener {\n                viewdata()?.let { viewdata ->\n                    viewState.setCollapsed(viewdata.id, !collapsed)\n                    updateTextView()\n                }\n            }\n\n            binding.buttonToggleContent.show()\n            if (collapsed) {\n                binding.buttonToggleContent.setText(R.string.post_content_show_more)\n                binding.statusContent.filters = COLLAPSE_INPUT_FILTER\n            } else {\n                binding.buttonToggleContent.setText(R.string.post_content_show_less)\n                binding.statusContent.filters = NO_INPUT_FILTER\n            }\n        } else {\n            binding.buttonToggleContent.hide()\n            binding.statusContent.filters = NO_INPUT_FILTER\n        }\n    }\n\n    private fun viewdata() = getStatusForPosition(bindingAdapterPosition)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/report/adapter/StatusesAdapter.kt",
    "content": "/* Copyright 2019 Joel Pyska\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.report.adapter\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.paging.PagingDataAdapter\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.components.report.model.StatusViewState\nimport com.keylesspalace.tusky.databinding.ItemReportStatusBinding\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.viewdata.StatusViewData\n\nclass StatusesAdapter(\n    private val statusDisplayOptions: StatusDisplayOptions,\n    private val statusViewState: StatusViewState,\n    private val adapterHandler: AdapterHandler\n) : PagingDataAdapter<StatusViewData.Concrete, StatusViewHolder>(STATUS_COMPARATOR) {\n\n    private val statusForPosition: (Int) -> StatusViewData.Concrete? = { position: Int ->\n        if (position != RecyclerView.NO_POSITION) getItem(position) else null\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): StatusViewHolder {\n        val binding = ItemReportStatusBinding.inflate(\n            LayoutInflater.from(parent.context),\n            parent,\n            false\n        )\n        return StatusViewHolder(\n            binding,\n            statusDisplayOptions,\n            statusViewState,\n            adapterHandler,\n            statusForPosition\n        )\n    }\n\n    override fun onBindViewHolder(holder: StatusViewHolder, position: Int) {\n        getItem(position)?.let { status ->\n            holder.bind(status)\n        }\n    }\n\n    companion object {\n        val STATUS_COMPARATOR = object : DiffUtil.ItemCallback<StatusViewData.Concrete>() {\n            override fun areContentsTheSame(\n                oldItem: StatusViewData.Concrete,\n                newItem: StatusViewData.Concrete\n            ): Boolean = oldItem == newItem\n\n            override fun areItemsTheSame(\n                oldItem: StatusViewData.Concrete,\n                newItem: StatusViewData.Concrete\n            ): Boolean = oldItem.id == newItem.id\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/report/adapter/StatusesPagingSource.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.report.adapter\n\nimport android.util.Log\nimport androidx.paging.PagingSource\nimport androidx.paging.PagingState\nimport at.connyduck.calladapter.networkresult.getOrThrow\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.network.MastodonApi\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.coroutineScope\n\nclass StatusesPagingSource(\n    private val accountId: String,\n    private val mastodonApi: MastodonApi\n) : PagingSource<String, Status>() {\n\n    override fun getRefreshKey(state: PagingState<String, Status>): String? {\n        return state.anchorPosition?.let { anchorPosition ->\n            state.closestItemToPosition(anchorPosition)?.id\n        }\n    }\n\n    override suspend fun load(params: LoadParams<String>): LoadResult<String, Status> {\n        val key = params.key\n        try {\n            val result = if (params is LoadParams.Refresh && key != null) {\n                // Use coroutineScope to ensure that one failed call will cancel the other one\n                // and the source Exception will be propagated locally.\n                coroutineScope {\n                    val initialStatus = async { getSingleStatus(key) }\n                    val additionalStatuses =\n                        async { getStatusList(maxId = key, limit = params.loadSize - 1) }\n                    listOf(initialStatus.await()) + additionalStatuses.await()\n                }\n            } else {\n                val maxId = if (params is LoadParams.Refresh || params is LoadParams.Append) {\n                    params.key\n                } else {\n                    null\n                }\n\n                val minId = if (params is LoadParams.Prepend) {\n                    params.key\n                } else {\n                    null\n                }\n\n                getStatusList(minId = minId, maxId = maxId, limit = params.loadSize)\n            }\n            return LoadResult.Page(\n                data = result,\n                prevKey = result.firstOrNull()?.id,\n                nextKey = result.lastOrNull()?.id\n            )\n        } catch (e: Exception) {\n            Log.w(\"StatusesPagingSource\", \"failed to load statuses\", e)\n            return LoadResult.Error(e)\n        }\n    }\n\n    private suspend fun getSingleStatus(statusId: String): Status {\n        return mastodonApi.status(statusId).getOrThrow()\n    }\n\n    private suspend fun getStatusList(\n        minId: String? = null,\n        maxId: String? = null,\n        limit: Int\n    ): List<Status> {\n        return mastodonApi.accountStatuses(\n            accountId = accountId,\n            maxId = maxId,\n            sinceId = null,\n            minId = minId,\n            limit = limit,\n            excludeReblogs = true\n        ).getOrThrow()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/report/fragments/ReportDoneFragment.kt",
    "content": "/* Copyright 2019 Joel Pyska\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.report.fragments\n\nimport android.os.Bundle\nimport android.view.View\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.lifecycle.lifecycleScope\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.report.ReportViewModel\nimport com.keylesspalace.tusky.components.report.Screen\nimport com.keylesspalace.tusky.databinding.FragmentReportDoneBinding\nimport com.keylesspalace.tusky.util.Loading\nimport com.keylesspalace.tusky.util.viewBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass ReportDoneFragment : Fragment(R.layout.fragment_report_done) {\n\n    private val viewModel: ReportViewModel by activityViewModels()\n\n    private val binding by viewBinding(FragmentReportDoneBinding::bind)\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        binding.textReported.text = getString(R.string.report_sent_success, viewModel.accountUserName)\n        handleClicks()\n        subscribeObservables()\n    }\n\n    private fun subscribeObservables() {\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.muteState.collect {\n                if (it == null) return@collect\n                if (it !is Loading) {\n                    binding.buttonMute.visibility = View.VISIBLE\n                    binding.progressMute.visibility = View.GONE\n                } else {\n                    binding.buttonMute.visibility = View.INVISIBLE\n                    binding.progressMute.visibility = View.VISIBLE\n                }\n\n                binding.buttonMute.setText(\n                    when (it.data) {\n                        true -> R.string.action_unmute\n                        else -> R.string.action_mute\n                    }\n                )\n            }\n        }\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.blockState.collect {\n                if (it == null) return@collect\n                if (it !is Loading) {\n                    binding.buttonBlock.visibility = View.VISIBLE\n                    binding.progressBlock.visibility = View.GONE\n                } else {\n                    binding.buttonBlock.visibility = View.INVISIBLE\n                    binding.progressBlock.visibility = View.VISIBLE\n                }\n                binding.buttonBlock.setText(\n                    when (it.data) {\n                        true -> R.string.action_unblock\n                        else -> R.string.action_block\n                    }\n                )\n            }\n        }\n    }\n\n    private fun handleClicks() {\n        binding.buttonDone.setOnClickListener {\n            viewModel.navigateTo(Screen.Finish)\n        }\n        binding.buttonBlock.setOnClickListener {\n            viewModel.toggleBlock()\n        }\n        binding.buttonMute.setOnClickListener {\n            viewModel.toggleMute()\n        }\n    }\n\n    companion object {\n        fun newInstance() = ReportDoneFragment()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/report/fragments/ReportNoteFragment.kt",
    "content": "/* Copyright 2019 Joel Pyska\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.report.fragments\n\nimport android.os.Bundle\nimport android.view.View\nimport androidx.core.widget.doAfterTextChanged\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.lifecycle.lifecycleScope\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.report.ReportViewModel\nimport com.keylesspalace.tusky.components.report.Screen\nimport com.keylesspalace.tusky.databinding.FragmentReportNoteBinding\nimport com.keylesspalace.tusky.util.Error\nimport com.keylesspalace.tusky.util.Loading\nimport com.keylesspalace.tusky.util.Success\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.viewBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport java.io.IOException\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass ReportNoteFragment : Fragment(R.layout.fragment_report_note) {\n\n    private val viewModel: ReportViewModel by activityViewModels()\n\n    private val binding by viewBinding(FragmentReportNoteBinding::bind)\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        fillViews()\n        handleChanges()\n        handleClicks()\n        subscribeObservables()\n    }\n\n    private fun handleChanges() {\n        binding.editNote.doAfterTextChanged {\n            viewModel.reportNote = it?.toString().orEmpty()\n        }\n        binding.checkIsNotifyRemote.setOnCheckedChangeListener { _, isChecked ->\n            viewModel.isRemoteNotify = isChecked\n        }\n    }\n\n    private fun fillViews() {\n        binding.editNote.setText(viewModel.reportNote)\n\n        if (viewModel.isRemoteAccount) {\n            binding.checkIsNotifyRemote.show()\n            binding.reportDescriptionRemoteInstance.show()\n        } else {\n            binding.checkIsNotifyRemote.hide()\n            binding.reportDescriptionRemoteInstance.hide()\n        }\n\n        if (viewModel.isRemoteAccount) {\n            binding.checkIsNotifyRemote.text = getString(R.string.report_remote_instance, viewModel.remoteServer)\n        }\n        binding.checkIsNotifyRemote.isChecked = viewModel.isRemoteNotify\n    }\n\n    private fun subscribeObservables() {\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.reportingState.collect {\n                if (it == null) return@collect\n                when (it) {\n                    is Success -> viewModel.navigateTo(Screen.Done)\n                    is Loading -> showLoading()\n                    is Error -> showError(it.cause)\n                }\n            }\n        }\n    }\n\n    private fun showError(error: Throwable?) {\n        binding.editNote.isEnabled = true\n        binding.checkIsNotifyRemote.isEnabled = true\n        binding.buttonReport.isEnabled = true\n        binding.buttonBack.isEnabled = true\n        binding.progressBar.hide()\n\n        Snackbar.make(\n            binding.buttonBack,\n            if (error is IOException) R.string.error_network else R.string.error_generic,\n            Snackbar.LENGTH_LONG\n        )\n            .setAction(R.string.action_retry) {\n                sendReport()\n            }\n            .show()\n    }\n\n    private fun sendReport() {\n        viewModel.doReport()\n    }\n\n    private fun showLoading() {\n        binding.buttonReport.isEnabled = false\n        binding.buttonBack.isEnabled = false\n        binding.editNote.isEnabled = false\n        binding.checkIsNotifyRemote.isEnabled = false\n        binding.progressBar.show()\n    }\n\n    private fun handleClicks() {\n        binding.buttonBack.setOnClickListener {\n            viewModel.navigateTo(Screen.Back)\n        }\n\n        binding.buttonReport.setOnClickListener {\n            sendReport()\n        }\n    }\n\n    companion object {\n        fun newInstance() = ReportNoteFragment()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/report/fragments/ReportStatusesFragment.kt",
    "content": "/* Copyright 2019 Joel Pyska\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.report.fragments\n\nimport android.content.SharedPreferences\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport androidx.core.app.ActivityOptionsCompat\nimport androidx.core.view.MenuProvider\nimport androidx.core.view.ViewCompat\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.paging.LoadState\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.SimpleItemAnimator\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.StatusListActivity\nimport com.keylesspalace.tusky.ViewMediaActivity\nimport com.keylesspalace.tusky.components.account.AccountActivity\nimport com.keylesspalace.tusky.components.report.ReportViewModel\nimport com.keylesspalace.tusky.components.report.Screen\nimport com.keylesspalace.tusky.components.report.adapter.AdapterHandler\nimport com.keylesspalace.tusky.components.report.adapter.StatusesAdapter\nimport com.keylesspalace.tusky.databinding.FragmentReportStatusesBinding\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.util.CardViewMode\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.util.visible\nimport com.keylesspalace.tusky.viewdata.AttachmentViewData\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass ReportStatusesFragment :\n    Fragment(R.layout.fragment_report_statuses),\n    OnRefreshListener,\n    MenuProvider,\n    AdapterHandler {\n\n    @Inject\n    lateinit var accountManager: AccountManager\n\n    @Inject\n    lateinit var preferences: SharedPreferences\n\n    private val viewModel: ReportViewModel by activityViewModels()\n\n    private val binding by viewBinding(FragmentReportStatusesBinding::bind)\n\n    private var adapter: StatusesAdapter? = null\n\n    private var snackbarErrorRetry: Snackbar? = null\n\n    override fun showMedia(v: View?, status: StatusViewData.Concrete, idx: Int) {\n        when (status.attachments[idx].type) {\n            Attachment.Type.GIFV, Attachment.Type.VIDEO, Attachment.Type.IMAGE, Attachment.Type.AUDIO -> {\n                val attachments = AttachmentViewData.list(status)\n                val intent = ViewMediaActivity.newIntent(requireContext(), attachments, idx)\n                if (v != null) {\n                    val url = status.attachments[idx].url\n                    ViewCompat.setTransitionName(v, url)\n                    val options = ActivityOptionsCompat.makeSceneTransitionAnimation(\n                        requireActivity(),\n                        v,\n                        url\n                    )\n                    startActivity(intent, options.toBundle())\n                } else {\n                    startActivity(intent)\n                }\n            }\n\n            Attachment.Type.UNKNOWN -> {\n            }\n        }\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED)\n        handleClicks()\n        initStatusesView()\n        binding.swipeRefreshLayout.setOnRefreshListener(this)\n    }\n\n    override fun onDestroyView() {\n        // Clear the adapter to prevent leaking the View\n        adapter = null\n        snackbarErrorRetry = null\n        super.onDestroyView()\n    }\n\n    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n        menuInflater.inflate(R.menu.fragment_report_statuses, menu)\n    }\n\n    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {\n        return when (menuItem.itemId) {\n            R.id.action_refresh -> {\n                binding.swipeRefreshLayout.isRefreshing = true\n                onRefresh()\n                true\n            }\n\n            else -> false\n        }\n    }\n\n    override fun onRefresh() {\n        snackbarErrorRetry?.dismiss()\n        snackbarErrorRetry = null\n        adapter?.refresh()\n    }\n\n    private fun initStatusesView() {\n        val statusDisplayOptions = StatusDisplayOptions(\n            animateAvatars = false,\n            mediaPreviewEnabled = accountManager.activeAccount?.mediaPreviewEnabled ?: true,\n            useAbsoluteTime = preferences.getBoolean(PrefKeys.ABSOLUTE_TIME_VIEW, false),\n            showBotOverlay = false,\n            useBlurhash = preferences.getBoolean(PrefKeys.USE_BLURHASH, true),\n            cardViewMode = CardViewMode.NONE,\n            hideStats = preferences.getBoolean(PrefKeys.WELLBEING_HIDE_STATS_POSTS, false),\n            animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false),\n            showStatsInline = preferences.getBoolean(PrefKeys.SHOW_STATS_INLINE, false),\n            showSensitiveMedia = accountManager.activeAccount!!.alwaysShowSensitiveMedia,\n            openSpoiler = accountManager.activeAccount!!.alwaysOpenSpoiler\n        )\n\n        val adapter = StatusesAdapter(statusDisplayOptions, viewModel.statusViewState, this)\n        this.adapter = adapter\n\n        binding.recyclerView.addItemDecoration(\n            DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL)\n        )\n        binding.recyclerView.layoutManager = LinearLayoutManager(requireContext())\n        binding.recyclerView.adapter = adapter\n        (binding.recyclerView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.statusesFlow.collectLatest { pagingData ->\n                adapter.submitData(pagingData)\n            }\n        }\n\n        adapter.addLoadStateListener { loadState ->\n            if (loadState.refresh is LoadState.Error ||\n                loadState.append is LoadState.Error ||\n                loadState.prepend is LoadState.Error\n            ) {\n                showError(adapter)\n            }\n\n            binding.progressBarBottom.visible(loadState.append == LoadState.Loading)\n            binding.progressBarTop.visible(loadState.prepend == LoadState.Loading)\n            binding.progressBarLoading.visible(\n                loadState.refresh == LoadState.Loading && !binding.swipeRefreshLayout.isRefreshing\n            )\n\n            if (loadState.refresh != LoadState.Loading) {\n                binding.swipeRefreshLayout.isRefreshing = false\n            }\n        }\n    }\n\n    private fun showError(adapter: StatusesAdapter) {\n        if (snackbarErrorRetry?.isShown != true) {\n            snackbarErrorRetry =\n                Snackbar.make(binding.swipeRefreshLayout, R.string.failed_fetch_posts, Snackbar.LENGTH_INDEFINITE)\n                    .setAction(R.string.action_retry) {\n                        adapter.retry()\n                    }.also {\n                        it.show()\n                    }\n        }\n    }\n\n    private fun handleClicks() {\n        binding.buttonCancel.setOnClickListener {\n            viewModel.navigateTo(Screen.Back)\n        }\n\n        binding.buttonContinue.setOnClickListener {\n            viewModel.navigateTo(Screen.Note)\n        }\n    }\n\n    override fun setStatusChecked(status: Status, isChecked: Boolean) {\n        viewModel.setStatusChecked(status, isChecked)\n    }\n\n    override fun isStatusChecked(id: String): Boolean {\n        return viewModel.isStatusChecked(id)\n    }\n\n    override fun onViewAccount(id: String) = startActivity(\n        AccountActivity.getIntent(requireContext(), id)\n    )\n\n    override fun onViewTag(tag: String) = startActivity(\n        StatusListActivity.newHashtagIntent(requireContext(), tag)\n    )\n\n    override fun onViewUrl(url: String) = viewModel.checkClickedUrl(url)\n\n    companion object {\n        fun newInstance() = ReportStatusesFragment()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/report/model/StatusViewState.kt",
    "content": "/* Copyright 2019 Joel Pyska\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.report.model\n\nclass StatusViewState {\n    private val mediaShownState = HashMap<String, Boolean>()\n    private val contentShownState = HashMap<String, Boolean>()\n    private val longContentCollapsedState = HashMap<String, Boolean>()\n\n    fun isMediaShow(id: String, isSensitive: Boolean): Boolean = isStateEnabled(\n        mediaShownState,\n        id,\n        !isSensitive\n    )\n    fun setMediaShow(id: String, isShow: Boolean) = setStateEnabled(mediaShownState, id, isShow)\n\n    fun isContentShow(id: String, isSensitive: Boolean): Boolean = isStateEnabled(\n        contentShownState,\n        id,\n        !isSensitive\n    )\n    fun setContentShow(id: String, isShow: Boolean) = setStateEnabled(contentShownState, id, isShow)\n\n    fun isCollapsed(id: String, isCollapsed: Boolean): Boolean = isStateEnabled(\n        longContentCollapsedState,\n        id,\n        isCollapsed\n    )\n    fun setCollapsed(id: String, isCollapsed: Boolean) =\n        setStateEnabled(longContentCollapsedState, id, isCollapsed)\n\n    private fun isStateEnabled(map: Map<String, Boolean>, id: String, def: Boolean): Boolean =\n        map[id]\n            ?: def\n\n    private fun setStateEnabled(map: MutableMap<String, Boolean>, id: String, state: Boolean) =\n        map.put(\n            id,\n            state\n        )\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/scheduled/ScheduledStatusActivity.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.scheduled\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport androidx.activity.viewModels\nimport androidx.core.view.MenuProvider\nimport androidx.lifecycle.lifecycleScope\nimport androidx.paging.LoadState\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.keylesspalace.tusky.BaseActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.StatusScheduledEvent\nimport com.keylesspalace.tusky.components.compose.ComposeActivity\nimport com.keylesspalace.tusky.databinding.ActivityScheduledStatusBinding\nimport com.keylesspalace.tusky.entity.ScheduledStatus\nimport com.keylesspalace.tusky.util.ensureBottomPadding\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.viewBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass ScheduledStatusActivity :\n    BaseActivity(),\n    ScheduledStatusActionListener,\n    MenuProvider {\n\n    @Inject\n    lateinit var eventHub: EventHub\n\n    private val viewModel: ScheduledStatusViewModel by viewModels()\n\n    private val binding by viewBinding(ActivityScheduledStatusBinding::inflate)\n\n    private val adapter = ScheduledStatusAdapter(this)\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        setContentView(binding.root)\n        addMenuProvider(this)\n\n        setSupportActionBar(binding.includedToolbar.toolbar)\n        supportActionBar?.run {\n            title = getString(R.string.title_scheduled_posts)\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n        }\n\n        binding.scheduledTootList.ensureBottomPadding()\n\n        binding.swipeRefreshLayout.setOnRefreshListener(this::refreshStatuses)\n\n        binding.scheduledTootList.setHasFixedSize(true)\n        binding.scheduledTootList.layoutManager = LinearLayoutManager(this)\n        val divider = DividerItemDecoration(this, DividerItemDecoration.VERTICAL)\n        binding.scheduledTootList.addItemDecoration(divider)\n        binding.scheduledTootList.adapter = adapter\n\n        lifecycleScope.launch {\n            viewModel.data.collectLatest { pagingData ->\n                adapter.submitData(pagingData)\n            }\n        }\n\n        adapter.addLoadStateListener { loadState ->\n            if (loadState.refresh is LoadState.Error) {\n                binding.progressBar.hide()\n                binding.errorMessageView.show()\n\n                val errorState = loadState.refresh as LoadState.Error\n                binding.errorMessageView.setup(errorState.error) { refreshStatuses() }\n            }\n            if (loadState.refresh != LoadState.Loading) {\n                binding.swipeRefreshLayout.isRefreshing = false\n            }\n            if (loadState.refresh is LoadState.NotLoading) {\n                binding.progressBar.hide()\n                if (adapter.itemCount == 0) {\n                    binding.errorMessageView.setup(\n                        R.drawable.elephant_friend_empty,\n                        R.string.no_scheduled_posts\n                    )\n                    binding.errorMessageView.show()\n                } else {\n                    binding.errorMessageView.hide()\n                }\n            }\n        }\n\n        lifecycleScope.launch {\n            eventHub.events.collect { event ->\n                if (event is StatusScheduledEvent) {\n                    adapter.refresh()\n                }\n            }\n        }\n    }\n\n    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n        menuInflater.inflate(R.menu.activity_scheduled_status, menu)\n    }\n\n    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {\n        return when (menuItem.itemId) {\n            R.id.action_refresh -> {\n                binding.swipeRefreshLayout.isRefreshing = true\n                refreshStatuses()\n                true\n            }\n            else -> false\n        }\n    }\n\n    private fun refreshStatuses() {\n        adapter.refresh()\n    }\n\n    override fun edit(item: ScheduledStatus) {\n        val intent = ComposeActivity.startIntent(\n            this,\n            ComposeActivity.ComposeOptions(\n                scheduledTootId = item.id,\n                content = item.params.text,\n                contentWarning = item.params.spoilerText,\n                mediaAttachments = item.mediaAttachments,\n                inReplyToId = item.params.inReplyToId,\n                visibility = item.params.visibility,\n                scheduledAt = item.scheduledAt,\n                sensitive = item.params.sensitive,\n                kind = ComposeActivity.ComposeKind.EDIT_SCHEDULED\n            )\n        )\n        startActivity(intent)\n    }\n\n    override fun delete(item: ScheduledStatus) {\n        MaterialAlertDialogBuilder(this)\n            .setMessage(R.string.delete_scheduled_post_warning)\n            .setNegativeButton(android.R.string.cancel, null)\n            .setPositiveButton(android.R.string.ok) { _, _ ->\n                viewModel.deleteScheduledStatus(item)\n            }\n            .show()\n    }\n\n    companion object {\n        fun newIntent(context: Context) = Intent(context, ScheduledStatusActivity::class.java)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/scheduled/ScheduledStatusAdapter.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.scheduled\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.paging.PagingDataAdapter\nimport androidx.recyclerview.widget.DiffUtil\nimport com.keylesspalace.tusky.databinding.ItemScheduledStatusBinding\nimport com.keylesspalace.tusky.entity.ScheduledStatus\nimport com.keylesspalace.tusky.util.BindingHolder\n\ninterface ScheduledStatusActionListener {\n    fun edit(item: ScheduledStatus)\n    fun delete(item: ScheduledStatus)\n}\n\nclass ScheduledStatusAdapter(\n    val listener: ScheduledStatusActionListener\n) : PagingDataAdapter<ScheduledStatus, BindingHolder<ItemScheduledStatusBinding>>(\n    object : DiffUtil.ItemCallback<ScheduledStatus>() {\n        override fun areItemsTheSame(oldItem: ScheduledStatus, newItem: ScheduledStatus): Boolean {\n            return oldItem.id == newItem.id\n        }\n\n        override fun areContentsTheSame(\n            oldItem: ScheduledStatus,\n            newItem: ScheduledStatus\n        ): Boolean {\n            return oldItem == newItem\n        }\n    }\n) {\n\n    override fun onCreateViewHolder(\n        parent: ViewGroup,\n        viewType: Int\n    ): BindingHolder<ItemScheduledStatusBinding> {\n        val binding = ItemScheduledStatusBinding.inflate(\n            LayoutInflater.from(parent.context),\n            parent,\n            false\n        )\n        return BindingHolder(binding)\n    }\n\n    override fun onBindViewHolder(\n        holder: BindingHolder<ItemScheduledStatusBinding>,\n        position: Int\n    ) {\n        getItem(position)?.let { item ->\n            holder.binding.edit.isEnabled = true\n            holder.binding.delete.isEnabled = true\n            holder.binding.text.text = item.params.text\n            holder.binding.edit.setOnClickListener {\n                listener.edit(item)\n            }\n            holder.binding.delete.setOnClickListener {\n                listener.delete(item)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/scheduled/ScheduledStatusPagingSource.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.scheduled\n\nimport android.util.Log\nimport androidx.paging.PagingSource\nimport androidx.paging.PagingState\nimport at.connyduck.calladapter.networkresult.getOrThrow\nimport com.keylesspalace.tusky.entity.ScheduledStatus\nimport com.keylesspalace.tusky.network.MastodonApi\n\nclass ScheduledStatusPagingSourceFactory(\n    private val mastodonApi: MastodonApi\n) : () -> ScheduledStatusPagingSource {\n\n    private val scheduledTootsCache = mutableListOf<ScheduledStatus>()\n\n    private var pagingSource: ScheduledStatusPagingSource? = null\n\n    override fun invoke(): ScheduledStatusPagingSource {\n        return ScheduledStatusPagingSource(mastodonApi, scheduledTootsCache).also {\n            pagingSource = it\n        }\n    }\n\n    fun remove(status: ScheduledStatus) {\n        scheduledTootsCache.remove(status)\n        pagingSource?.invalidate()\n    }\n}\n\nclass ScheduledStatusPagingSource(\n    private val mastodonApi: MastodonApi,\n    private val scheduledStatusesCache: MutableList<ScheduledStatus>\n) : PagingSource<String, ScheduledStatus>() {\n\n    override fun getRefreshKey(state: PagingState<String, ScheduledStatus>): String? {\n        return null\n    }\n\n    override suspend fun load(params: LoadParams<String>): LoadResult<String, ScheduledStatus> {\n        return if (params is LoadParams.Refresh && scheduledStatusesCache.isNotEmpty()) {\n            LoadResult.Page(\n                data = scheduledStatusesCache,\n                prevKey = null,\n                nextKey = scheduledStatusesCache.lastOrNull()?.id\n            )\n        } else {\n            try {\n                val result = mastodonApi.scheduledStatuses(\n                    maxId = params.key,\n                    limit = params.loadSize\n                ).getOrThrow()\n\n                LoadResult.Page(\n                    data = result,\n                    prevKey = null,\n                    nextKey = result.lastOrNull()?.id\n                )\n            } catch (e: Exception) {\n                Log.w(\"ScheduledStatuses\", \"Error loading scheduled statuses\", e)\n                LoadResult.Error(e)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/scheduled/ScheduledStatusViewModel.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.scheduled\n\nimport android.util.Log\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport androidx.paging.Pager\nimport androidx.paging.PagingConfig\nimport androidx.paging.cachedIn\nimport at.connyduck.calladapter.networkresult.fold\nimport com.keylesspalace.tusky.entity.ScheduledStatus\nimport com.keylesspalace.tusky.network.MastodonApi\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.launch\n\n@HiltViewModel\nclass ScheduledStatusViewModel @Inject constructor(\n    val mastodonApi: MastodonApi\n) : ViewModel() {\n\n    private val pagingSourceFactory = ScheduledStatusPagingSourceFactory(mastodonApi)\n\n    val data = Pager(\n        config = PagingConfig(\n            pageSize = 20,\n            initialLoadSize = 20\n        ),\n        pagingSourceFactory = pagingSourceFactory\n    ).flow\n        .cachedIn(viewModelScope)\n\n    fun deleteScheduledStatus(status: ScheduledStatus) {\n        viewModelScope.launch {\n            mastodonApi.deleteScheduledStatus(status.id).fold(\n                {\n                    pagingSourceFactory.remove(status)\n                },\n                { throwable ->\n                    Log.w(\"ScheduledTootViewModel\", \"Error deleting scheduled status\", throwable)\n                }\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/search/SearchActivity.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.search\n\nimport android.app.SearchManager\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.MotionEvent\nimport androidx.activity.viewModels\nimport androidx.appcompat.widget.SearchView\nimport androidx.core.view.MenuProvider\nimport com.google.android.material.tabs.TabLayout\nimport com.google.android.material.tabs.TabLayoutMediator\nimport com.keylesspalace.tusky.BottomSheetActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.search.adapter.SearchPagerAdapter\nimport com.keylesspalace.tusky.databinding.ActivitySearchBinding\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.util.reduceSwipeSensitivity\nimport com.keylesspalace.tusky.util.viewBinding\nimport dagger.hilt.android.AndroidEntryPoint\n\n@AndroidEntryPoint\nclass SearchActivity : BottomSheetActivity(), MenuProvider, SearchView.OnQueryTextListener {\n\n    private val viewModel: SearchViewModel by viewModels()\n\n    private val binding by viewBinding(ActivitySearchBinding::inflate)\n\n    private lateinit var searchView: SearchView\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        setSupportActionBar(binding.toolbar)\n        supportActionBar?.apply {\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n            setDisplayShowTitleEnabled(false)\n        }\n        addMenuProvider(this)\n        setupPages()\n        handleIntent(intent)\n    }\n\n    private fun setupPages() {\n        binding.pages.reduceSwipeSensitivity()\n        binding.pages.adapter = SearchPagerAdapter(this)\n\n        val enableSwipeForTabs = preferences.getBoolean(PrefKeys.ENABLE_SWIPE_FOR_TABS, true)\n        binding.pages.isUserInputEnabled = enableSwipeForTabs\n\n        TabLayoutMediator(binding.tabs, binding.pages) {\n                tab, position ->\n            tab.text = getPageTitle(position)\n        }.attach()\n    }\n\n    override fun onNewIntent(intent: Intent) {\n        super.onNewIntent(intent)\n        handleIntent(intent)\n    }\n\n    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n        menuInflater.inflate(R.menu.search_toolbar, menu)\n        val searchViewMenuItem = menu.findItem(R.id.action_search)\n        searchViewMenuItem.expandActionView()\n        searchView = searchViewMenuItem.actionView as SearchView\n        setupSearchView()\n        setupClearFocusOnClickListeners()\n    }\n\n    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {\n        return false\n    }\n\n    private fun getPageTitle(position: Int): CharSequence {\n        return when (position) {\n            0 -> getString(R.string.title_posts)\n            1 -> getString(R.string.title_accounts)\n            2 -> getString(R.string.title_hashtags_dialog)\n            else -> throw IllegalArgumentException(\"Unknown page index: $position\")\n        }\n    }\n\n    private fun handleIntent(intent: Intent) {\n        if (Intent.ACTION_SEARCH == intent.action) {\n            viewModel.currentQuery = intent.getStringExtra(SearchManager.QUERY).orEmpty()\n            viewModel.search(viewModel.currentQuery)\n            searchView.clearFocus()\n        }\n    }\n\n    private fun setupClearFocusOnClickListeners() {\n        binding.overlayPagesClickView.setOnTouchListener { view, event ->\n            if (event.action == MotionEvent.ACTION_DOWN) {\n                searchView.clearFocus()\n                view.performClick()\n            }\n            false\n        }\n        binding.toolbar.setOnClickListener {\n            searchView.clearFocus()\n        }\n        binding.tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {\n            override fun onTabSelected(p0: TabLayout.Tab?) {\n                searchView.clearFocus()\n            }\n\n            override fun onTabUnselected(p0: TabLayout.Tab?) {}\n\n            override fun onTabReselected(p0: TabLayout.Tab?) {\n                searchView.clearFocus()\n            }\n        })\n    }\n\n    private fun setupSearchView() {\n        searchView.setIconifiedByDefault(false)\n        searchView.setSearchableInfo(\n            (\n                getSystemService(\n                    Context.SEARCH_SERVICE\n                ) as? SearchManager\n                )?.getSearchableInfo(componentName)\n        )\n\n        // SearchView has a bug. If it's displayed 'app:showAsAction=\"always\"' it's too wide,\n        // pushing other icons (including the options menu '...' icon) off the edge of the\n        // screen.\n        //\n        // E.g., see:\n        //\n        // - https://stackoverflow.com/questions/41662373/android-toolbar-searchview-too-wide-to-move-other-items\n        // - https://stackoverflow.com/questions/51525088/how-to-control-size-of-a-searchview-in-toolbar\n        // - https://stackoverflow.com/questions/36976163/push-icons-away-when-expandig-searchview-in-android-toolbar\n        // - https://issuetracker.google.com/issues/36976484\n        //\n        // The fix is to use 'app:showAsAction=\"ifRoom|collapseActionView\"' and then immediately\n        // expand it after inflating. That sets the width correctly.\n        //\n        // But if you do that code in AppCompatDelegateImpl activates, and when the user presses\n        // the \"Back\" button the SearchView is first set to its collapsed state. The user has to\n        // press \"Back\" again to exit the activity. This is clearly unacceptable.\n        //\n        // It appears to be impossible to override this behaviour on API level < 33.\n        //\n        // SearchView does allow you to specify the maximum width. So take the screen width,\n        // subtract 48dp * 2 (for the menu icon and back icon on either side), convert to pixels,\n        // and use that.\n        val pxScreenWidth = resources.displayMetrics.widthPixels\n        val pxBuffer = ((48 * 2) * resources.displayMetrics.density).toInt()\n        searchView.maxWidth = pxScreenWidth - pxBuffer\n\n        // Keep text that was entered also when switching to a different tab (before the search is executed)\n        searchView.setOnQueryTextListener(this)\n        searchView.setQuery(viewModel.currentSearchFieldContent ?: \"\", false)\n\n        if (viewModel.currentSearchFieldContent == \"\") searchView.requestFocus()\n    }\n\n    override fun onQueryTextSubmit(query: String?): Boolean {\n        return false\n    }\n\n    override fun onQueryTextChange(newText: String?): Boolean {\n        viewModel.currentSearchFieldContent = newText\n\n        return false\n    }\n\n    companion object {\n        const val TAG = \"SearchActivity\"\n        fun getIntent(context: Context) = Intent(context, SearchActivity::class.java)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/search/SearchType.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.search\n\nenum class SearchType(val apiParameter: String) {\n    Status(\"statuses\"),\n    Account(\"accounts\"),\n    Hashtag(\"hashtags\")\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/search/SearchViewModel.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.search\n\nimport android.util.Log\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport androidx.paging.Pager\nimport androidx.paging.PagingConfig\nimport androidx.paging.cachedIn\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport at.connyduck.calladapter.networkresult.fold\nimport at.connyduck.calladapter.networkresult.map\nimport at.connyduck.calladapter.networkresult.onFailure\nimport com.keylesspalace.tusky.components.instanceinfo.InstanceInfoRepository\nimport com.keylesspalace.tusky.components.search.adapter.SearchPagingSourceFactory\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.entity.DeletedStatus\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.usecase.TimelineCases\nimport com.keylesspalace.tusky.util.toViewData\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport com.keylesspalace.tusky.viewdata.TranslationViewData\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.Deferred\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.launch\n\n@HiltViewModel\nclass SearchViewModel @Inject constructor(\n    mastodonApi: MastodonApi,\n    private val timelineCases: TimelineCases,\n    private val accountManager: AccountManager,\n    private val instanceInfoRepository: InstanceInfoRepository,\n) : ViewModel() {\n\n    init {\n        instanceInfoRepository.precache()\n    }\n\n    var currentQuery: String = \"\"\n    var currentSearchFieldContent: String? = null\n\n    val activeAccount: AccountEntity?\n        get() = accountManager.activeAccount\n\n    val mediaPreviewEnabled = activeAccount?.mediaPreviewEnabled == true\n    val alwaysShowSensitiveMedia = activeAccount?.alwaysShowSensitiveMedia == true\n    val alwaysOpenSpoiler = activeAccount?.alwaysOpenSpoiler == true\n\n    private val loadedStatuses: MutableList<StatusViewData.Concrete> = mutableListOf()\n\n    private val statusesPagingSourceFactory =\n        SearchPagingSourceFactory(mastodonApi, SearchType.Status, loadedStatuses) {\n            it.statuses.map { status ->\n                status.toViewData(\n                    isShowingContent = status.shouldShowContent(alwaysShowSensitiveMedia, Filter.Kind.PUBLIC),\n                    isExpanded = alwaysOpenSpoiler,\n                    isCollapsed = true,\n                    filter = status.getApplicableFilter(Filter.Kind.PUBLIC),\n                )\n            }.apply {\n                loadedStatuses.addAll(this)\n            }\n        }\n    private val accountsPagingSourceFactory =\n        SearchPagingSourceFactory(mastodonApi, SearchType.Account) {\n            it.accounts\n        }\n    private val hashtagsPagingSourceFactory =\n        SearchPagingSourceFactory(mastodonApi, SearchType.Hashtag) {\n            it.hashtags\n        }\n\n    val statusesFlow = Pager(\n        config = PagingConfig(\n            pageSize = DEFAULT_LOAD_SIZE,\n            initialLoadSize = DEFAULT_LOAD_SIZE\n        ),\n        pagingSourceFactory = statusesPagingSourceFactory\n    ).flow\n        .cachedIn(viewModelScope)\n\n    val accountsFlow = Pager(\n        config = PagingConfig(\n            pageSize = DEFAULT_LOAD_SIZE,\n            initialLoadSize = DEFAULT_LOAD_SIZE\n        ),\n        pagingSourceFactory = accountsPagingSourceFactory\n    ).flow\n        .cachedIn(viewModelScope)\n\n    val hashtagsFlow = Pager(\n        config = PagingConfig(\n            pageSize = DEFAULT_LOAD_SIZE,\n            initialLoadSize = DEFAULT_LOAD_SIZE\n        ),\n        pagingSourceFactory = hashtagsPagingSourceFactory\n    ).flow\n        .cachedIn(viewModelScope)\n\n    fun search(query: String) {\n        loadedStatuses.clear()\n        statusesPagingSourceFactory.newSearch(query)\n        accountsPagingSourceFactory.newSearch(query)\n        hashtagsPagingSourceFactory.newSearch(query)\n    }\n\n    fun removeItem(statusViewData: StatusViewData.Concrete, deleteMedia: Boolean) {\n        viewModelScope.launch {\n            if (timelineCases.delete(statusViewData.id, deleteMedia).isSuccess) {\n                if (loadedStatuses.remove(statusViewData)) {\n                    statusesPagingSourceFactory.invalidate()\n                }\n            }\n        }\n    }\n\n    fun clearStatusCache() {\n        loadedStatuses.clear()\n    }\n\n    fun expandedChange(statusViewData: StatusViewData.Concrete, expanded: Boolean) {\n        updateStatusViewData(statusViewData.copy(isExpanded = expanded))\n    }\n\n    fun reblog(statusViewData: StatusViewData.Concrete, reblog: Boolean, visibility: Status.Visibility = Status.Visibility.PUBLIC) {\n        viewModelScope.launch {\n            timelineCases.reblog(statusViewData.id, reblog, visibility).fold({\n                updateStatus(\n                    statusViewData.status.copy(\n                        reblogged = reblog,\n                        reblog = statusViewData.status.reblog?.copy(reblogged = reblog)\n                    )\n                )\n            }, { t ->\n                Log.d(TAG, \"Failed to reblog status ${statusViewData.id}\", t)\n            })\n        }\n    }\n\n    fun contentHiddenChange(statusViewData: StatusViewData.Concrete, isShowing: Boolean) {\n        updateStatusViewData(statusViewData.copy(isShowingContent = isShowing))\n    }\n\n    fun collapsedChange(statusViewData: StatusViewData.Concrete, collapsed: Boolean) {\n        updateStatusViewData(statusViewData.copy(isCollapsed = collapsed))\n    }\n\n    fun voteInPoll(statusViewData: StatusViewData.Concrete, choices: List<Int>) {\n        val votedPoll = statusViewData.status.actionableStatus.poll!!.votedCopy(choices)\n        updateStatus(statusViewData.status.copy(poll = votedPoll))\n        viewModelScope.launch {\n            timelineCases.voteInPoll(statusViewData.id, votedPoll.id, choices)\n                .onFailure { t -> Log.d(TAG, \"Failed to vote in poll: ${statusViewData.id}\", t) }\n        }\n    }\n\n    fun showPollResults(status: StatusViewData.Concrete) = viewModelScope.launch {\n        timelineCases.showPollResults(status.actionableId)\n    }\n\n    fun favorite(statusViewData: StatusViewData.Concrete, isFavorited: Boolean) {\n        updateStatus(statusViewData.status.copy(favourited = isFavorited))\n        viewModelScope.launch {\n            timelineCases.favourite(statusViewData.id, isFavorited)\n        }\n    }\n\n    fun bookmark(statusViewData: StatusViewData.Concrete, isBookmarked: Boolean) {\n        updateStatus(statusViewData.status.copy(bookmarked = isBookmarked))\n        viewModelScope.launch {\n            timelineCases.bookmark(statusViewData.id, isBookmarked)\n        }\n    }\n\n    fun muteAccount(accountId: String, notifications: Boolean, duration: Int?) {\n        viewModelScope.launch {\n            timelineCases.mute(accountId, notifications, duration)\n        }\n    }\n\n    fun pinAccount(status: Status, isPin: Boolean) {\n        viewModelScope.launch {\n            timelineCases.pin(status.id, isPin)\n        }\n    }\n\n    fun blockAccount(accountId: String) {\n        viewModelScope.launch {\n            timelineCases.block(accountId)\n        }\n    }\n\n    fun deleteStatusAsync(id: String, deleteMedia: Boolean): Deferred<NetworkResult<DeletedStatus>> {\n        return viewModelScope.async {\n            timelineCases.delete(id, deleteMedia)\n        }\n    }\n\n    fun muteConversation(statusViewData: StatusViewData.Concrete, mute: Boolean) {\n        updateStatus(statusViewData.status.copy(muted = mute))\n        viewModelScope.launch {\n            timelineCases.muteConversation(statusViewData.id, mute)\n        }\n    }\n\n    fun supportsTranslation(): Boolean =\n        instanceInfoRepository.cachedInstanceInfoOrFallback.translationEnabled == true\n\n    suspend fun translate(statusViewData: StatusViewData.Concrete): NetworkResult<Unit> {\n        updateStatusViewData(statusViewData.copy(translation = TranslationViewData.Loading))\n        return timelineCases.translate(statusViewData.actionableId)\n            .map { translation ->\n                updateStatusViewData(\n                    statusViewData.copy(\n                        translation = TranslationViewData.Loaded(\n                            translation\n                        )\n                    )\n                )\n            }\n            .onFailure {\n                updateStatusViewData(statusViewData.copy(translation = null))\n            }\n    }\n\n    fun untranslate(statusViewData: StatusViewData.Concrete) {\n        updateStatusViewData(statusViewData.copy(translation = null))\n    }\n\n    private fun updateStatusViewData(newStatusViewData: StatusViewData.Concrete) {\n        val idx = loadedStatuses.indexOfFirst { it.id == newStatusViewData.id }\n        if (idx >= 0) {\n            loadedStatuses[idx] = newStatusViewData\n            statusesPagingSourceFactory.invalidate()\n        }\n    }\n\n    private fun updateStatus(newStatus: Status) {\n        val statusViewData = loadedStatuses.find { it.id == newStatus.id }\n        if (statusViewData != null) {\n            updateStatusViewData(statusViewData.copy(status = newStatus))\n        }\n    }\n\n    companion object {\n        private const val TAG = \"SearchViewModel\"\n        private const val DEFAULT_LOAD_SIZE = 20\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/search/adapter/SearchAccountsAdapter.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.search.adapter\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.paging.PagingDataAdapter\nimport androidx.recyclerview.widget.DiffUtil\nimport com.keylesspalace.tusky.adapter.AccountViewHolder\nimport com.keylesspalace.tusky.databinding.ItemAccountBinding\nimport com.keylesspalace.tusky.entity.TimelineAccount\nimport com.keylesspalace.tusky.interfaces.LinkListener\n\nclass SearchAccountsAdapter(private val linkListener: LinkListener, private val animateAvatars: Boolean, private val animateEmojis: Boolean, private val showBotOverlay: Boolean) :\n    PagingDataAdapter<TimelineAccount, AccountViewHolder>(ACCOUNT_COMPARATOR) {\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AccountViewHolder {\n        val binding = ItemAccountBinding.inflate(\n            LayoutInflater.from(parent.context),\n            parent,\n            false\n        )\n        return AccountViewHolder(binding)\n    }\n\n    override fun onBindViewHolder(holder: AccountViewHolder, position: Int) {\n        getItem(position)?.let { item ->\n            holder.apply {\n                setupWithAccount(item, animateAvatars, animateEmojis, showBotOverlay)\n                setupLinkListener(linkListener)\n            }\n        }\n    }\n\n    companion object {\n\n        val ACCOUNT_COMPARATOR = object : DiffUtil.ItemCallback<TimelineAccount>() {\n            override fun areContentsTheSame(\n                oldItem: TimelineAccount,\n                newItem: TimelineAccount\n            ): Boolean = oldItem == newItem\n\n            override fun areItemsTheSame(\n                oldItem: TimelineAccount,\n                newItem: TimelineAccount\n            ): Boolean = oldItem.id == newItem.id\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/search/adapter/SearchHashtagsAdapter.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.search.adapter\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.paging.PagingDataAdapter\nimport androidx.recyclerview.widget.DiffUtil\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemHashtagBinding\nimport com.keylesspalace.tusky.entity.HashTag\nimport com.keylesspalace.tusky.interfaces.LinkListener\nimport com.keylesspalace.tusky.util.BindingHolder\n\nclass SearchHashtagsAdapter(private val linkListener: LinkListener) :\n    PagingDataAdapter<HashTag, BindingHolder<ItemHashtagBinding>>(HASHTAG_COMPARATOR) {\n\n    override fun onCreateViewHolder(\n        parent: ViewGroup,\n        viewType: Int\n    ): BindingHolder<ItemHashtagBinding> {\n        val binding = ItemHashtagBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n        return BindingHolder(binding)\n    }\n\n    override fun onBindViewHolder(holder: BindingHolder<ItemHashtagBinding>, position: Int) {\n        getItem(position)?.let { (name) ->\n            holder.binding.root.text = holder.binding.root.context.getString(R.string.hashtag_format, name)\n            holder.binding.root.setOnClickListener { linkListener.onViewTag(name) }\n        }\n    }\n\n    companion object {\n\n        val HASHTAG_COMPARATOR = object : DiffUtil.ItemCallback<HashTag>() {\n            override fun areContentsTheSame(oldItem: HashTag, newItem: HashTag): Boolean =\n                oldItem.name == newItem.name\n\n            override fun areItemsTheSame(oldItem: HashTag, newItem: HashTag): Boolean =\n                oldItem.name == newItem.name\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/search/adapter/SearchPagerAdapter.kt",
    "content": "/* Copyright 2019 Joel Pyska\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.search.adapter\n\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentActivity\nimport androidx.viewpager2.adapter.FragmentStateAdapter\nimport com.keylesspalace.tusky.components.search.fragments.SearchAccountsFragment\nimport com.keylesspalace.tusky.components.search.fragments.SearchHashtagsFragment\nimport com.keylesspalace.tusky.components.search.fragments.SearchStatusesFragment\n\nclass SearchPagerAdapter(activity: FragmentActivity) : FragmentStateAdapter(activity) {\n\n    override fun createFragment(position: Int): Fragment {\n        return when (position) {\n            0 -> SearchStatusesFragment.newInstance()\n            1 -> SearchAccountsFragment.newInstance()\n            2 -> SearchHashtagsFragment.newInstance()\n            else -> throw IllegalArgumentException(\"Unknown page index: $position\")\n        }\n    }\n\n    override fun getItemCount() = 3\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/search/adapter/SearchPagingSource.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.search.adapter\n\nimport androidx.paging.PagingSource\nimport androidx.paging.PagingState\nimport at.connyduck.calladapter.networkresult.getOrThrow\nimport com.keylesspalace.tusky.components.search.SearchType\nimport com.keylesspalace.tusky.entity.SearchResult\nimport com.keylesspalace.tusky.network.MastodonApi\n\nclass SearchPagingSource<T : Any>(\n    private val mastodonApi: MastodonApi,\n    private val searchType: SearchType,\n    private val searchRequest: String,\n    private val initialItems: List<T>?,\n    private val parser: (SearchResult) -> List<T>\n) : PagingSource<Int, T>() {\n\n    override fun getRefreshKey(state: PagingState<Int, T>): Int? {\n        return null\n    }\n\n    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, T> {\n        if (searchRequest.isEmpty()) {\n            return LoadResult.Page(\n                data = emptyList(),\n                prevKey = null,\n                nextKey = null\n            )\n        }\n\n        if (params.key == null && !initialItems.isNullOrEmpty()) {\n            return LoadResult.Page(\n                data = initialItems.toList(),\n                prevKey = null,\n                nextKey = initialItems.size\n            )\n        }\n\n        val currentKey = params.key ?: 0\n\n        try {\n            val data = mastodonApi.search(\n                query = searchRequest,\n                type = searchType.apiParameter,\n                resolve = true,\n                limit = params.loadSize,\n                offset = currentKey,\n                following = false\n            ).getOrThrow()\n\n            val res = parser(data)\n\n            val nextKey = if (res.isEmpty()) {\n                null\n            } else {\n                currentKey + res.size\n            }\n\n            return LoadResult.Page(\n                data = res,\n                prevKey = null,\n                nextKey = nextKey\n            )\n        } catch (e: Exception) {\n            return LoadResult.Error(e)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/search/adapter/SearchPagingSourceFactory.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.search.adapter\n\nimport com.keylesspalace.tusky.components.search.SearchType\nimport com.keylesspalace.tusky.entity.SearchResult\nimport com.keylesspalace.tusky.network.MastodonApi\n\nclass SearchPagingSourceFactory<T : Any>(\n    private val mastodonApi: MastodonApi,\n    private val searchType: SearchType,\n    private val initialItems: List<T>? = null,\n    private val parser: (SearchResult) -> List<T>\n) : () -> SearchPagingSource<T> {\n\n    private var searchRequest: String = \"\"\n\n    private var currentSource: SearchPagingSource<T>? = null\n\n    override fun invoke(): SearchPagingSource<T> {\n        return SearchPagingSource(\n            mastodonApi = mastodonApi,\n            searchType = searchType,\n            searchRequest = searchRequest,\n            initialItems = initialItems,\n            parser = parser\n        ).also { source ->\n            currentSource = source\n        }\n    }\n\n    fun newSearch(newSearchRequest: String) {\n        this.searchRequest = newSearchRequest\n        currentSource?.invalidate()\n    }\n\n    fun invalidate() {\n        currentSource?.invalidate()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/search/adapter/SearchStatusesAdapter.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.search.adapter\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.paging.PagingDataAdapter\nimport androidx.recyclerview.widget.DiffUtil\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.adapter.StatusBaseViewHolder\nimport com.keylesspalace.tusky.adapter.StatusViewHolder\nimport com.keylesspalace.tusky.interfaces.StatusActionListener\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.viewdata.StatusViewData\n\nclass SearchStatusesAdapter(\n    private val statusDisplayOptions: StatusDisplayOptions,\n    private val statusListener: StatusActionListener\n) : PagingDataAdapter<StatusViewData.Concrete, StatusViewHolder>(STATUS_COMPARATOR) {\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): StatusViewHolder {\n        val view = LayoutInflater.from(parent.context)\n            .inflate(R.layout.item_status, parent, false)\n        return StatusViewHolder(view)\n    }\n\n    override fun onBindViewHolder(holder: StatusViewHolder, position: Int) {\n        onBindViewHolder(holder, position, emptyList())\n    }\n\n    override fun onBindViewHolder(holder: StatusViewHolder, position: Int, payloads: List<Any>) {\n        getItem(position)?.let { item ->\n            holder.setupWithStatus(item, statusListener, statusDisplayOptions, payloads, true)\n        }\n    }\n\n    companion object {\n\n        val STATUS_COMPARATOR = object : DiffUtil.ItemCallback<StatusViewData.Concrete>() {\n            override fun areItemsTheSame(\n                oldItem: StatusViewData.Concrete,\n                newItem: StatusViewData.Concrete\n            ): Boolean {\n                return oldItem.id == newItem.id\n            }\n\n            override fun areContentsTheSame(\n                oldItem: StatusViewData.Concrete,\n                newItem: StatusViewData.Concrete\n            ): Boolean {\n                return false // Items are different always. It allows to refresh timestamp on every view holder update\n            }\n\n            override fun getChangePayload(\n                oldItem: StatusViewData.Concrete,\n                newItem: StatusViewData.Concrete\n            ): Any? {\n                return if (oldItem == newItem) {\n                    // If items are equal - update timestamp only\n                    StatusBaseViewHolder.Key.KEY_CREATED\n                } else {\n                    // If items are different - update the whole view holder\n                    null\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/search/fragments/SearchAccountsFragment.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.search.fragments\n\nimport android.content.SharedPreferences\nimport android.os.Bundle\nimport android.view.View\nimport androidx.paging.PagingData\nimport androidx.paging.PagingDataAdapter\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport com.keylesspalace.tusky.components.search.adapter.SearchAccountsAdapter\nimport com.keylesspalace.tusky.entity.TimelineAccount\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.Flow\n\n@AndroidEntryPoint\nclass SearchAccountsFragment : SearchFragment<TimelineAccount>() {\n\n    @Inject\n    lateinit var preferences: SharedPreferences\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        binding.searchRecyclerView.addItemDecoration(\n            DividerItemDecoration(\n                binding.searchRecyclerView.context,\n                DividerItemDecoration.VERTICAL\n            )\n        )\n    }\n\n    override fun createAdapter(): PagingDataAdapter<TimelineAccount, *> {\n        return SearchAccountsAdapter(\n            this,\n            preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false),\n            preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false),\n            preferences.getBoolean(PrefKeys.SHOW_BOT_OVERLAY, true)\n        )\n    }\n\n    override val data: Flow<PagingData<TimelineAccount>>\n        get() = viewModel.accountsFlow\n\n    companion object {\n        fun newInstance() = SearchAccountsFragment()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/search/fragments/SearchFragment.kt",
    "content": "package com.keylesspalace.tusky.components.search.fragments\n\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport androidx.core.view.MenuProvider\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.paging.LoadState\nimport androidx.paging.PagingData\nimport androidx.paging.PagingDataAdapter\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.SimpleItemAnimator\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.BottomSheetActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.StatusListActivity\nimport com.keylesspalace.tusky.components.account.AccountActivity\nimport com.keylesspalace.tusky.components.search.SearchViewModel\nimport com.keylesspalace.tusky.databinding.FragmentSearchBinding\nimport com.keylesspalace.tusky.interfaces.LinkListener\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.ensureBottomPadding\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.util.visible\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.launch\n\nabstract class SearchFragment<T : Any> :\n    Fragment(R.layout.fragment_search),\n    LinkListener,\n    SwipeRefreshLayout.OnRefreshListener,\n    MenuProvider {\n\n    @Inject\n    lateinit var mastodonApi: MastodonApi\n\n    protected val viewModel: SearchViewModel by activityViewModels()\n\n    protected val binding by viewBinding(FragmentSearchBinding::bind)\n\n    private var snackbarErrorRetry: Snackbar? = null\n\n    abstract fun createAdapter(): PagingDataAdapter<T, *>\n\n    abstract val data: Flow<PagingData<T>>\n    protected var adapter: PagingDataAdapter<T, *>? = null\n\n    private var currentQuery: String = \"\"\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        val adapter = initAdapter()\n        binding.swipeRefreshLayout.setOnRefreshListener(this)\n        binding.searchRecyclerView.ensureBottomPadding()\n        requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED)\n        subscribeObservables(adapter)\n    }\n\n    override fun onDestroyView() {\n        // Clear the adapter to prevent leaking the View\n        adapter = null\n        snackbarErrorRetry = null\n        super.onDestroyView()\n    }\n\n    private fun subscribeObservables(adapter: PagingDataAdapter<T, *>) {\n        viewLifecycleOwner.lifecycleScope.launch {\n            data.collectLatest { pagingData ->\n                adapter.submitData(pagingData)\n            }\n        }\n\n        adapter.addLoadStateListener { loadState ->\n\n            if (loadState.refresh is LoadState.Error) {\n                showError(adapter)\n            }\n\n            val isNewSearch = currentQuery != viewModel.currentQuery\n\n            binding.searchProgressBar.visible(\n                loadState.refresh == LoadState.Loading && isNewSearch && !binding.swipeRefreshLayout.isRefreshing\n            )\n            binding.searchRecyclerView.visible(\n                loadState.refresh is LoadState.NotLoading || !isNewSearch || binding.swipeRefreshLayout.isRefreshing\n            )\n\n            if (loadState.refresh != LoadState.Loading) {\n                binding.swipeRefreshLayout.isRefreshing = false\n                currentQuery = viewModel.currentQuery\n            }\n\n            binding.progressBarBottom.visible(loadState.append == LoadState.Loading)\n\n            binding.searchNoResultsText.visible(\n                loadState.refresh is LoadState.NotLoading && adapter.itemCount == 0 && viewModel.currentQuery.isNotEmpty()\n            )\n        }\n    }\n\n    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n        menuInflater.inflate(R.menu.fragment_search, menu)\n    }\n\n    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {\n        return when (menuItem.itemId) {\n            R.id.action_refresh -> {\n                binding.swipeRefreshLayout.isRefreshing = true\n                onRefresh()\n                true\n            }\n\n            else -> false\n        }\n    }\n\n    private fun initAdapter(): PagingDataAdapter<T, *> {\n        binding.searchRecyclerView.layoutManager = LinearLayoutManager(binding.searchRecyclerView.context)\n        val adapter = createAdapter()\n        this.adapter = adapter\n        binding.searchRecyclerView.adapter = adapter\n        binding.searchRecyclerView.setHasFixedSize(true)\n        (binding.searchRecyclerView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false\n        return adapter\n    }\n\n    private fun showError(adapter: PagingDataAdapter<T, *>) {\n        if (snackbarErrorRetry?.isShown != true) {\n            snackbarErrorRetry =\n                Snackbar.make(binding.root, R.string.failed_search, Snackbar.LENGTH_INDEFINITE)\n                    .setAction(R.string.action_retry) {\n                        snackbarErrorRetry = null\n                        adapter.retry()\n                    }.also {\n                        it.show()\n                    }\n        }\n    }\n\n    override fun onViewAccount(id: String) {\n        bottomSheetActivity?.startActivityWithSlideInAnimation(\n            AccountActivity.getIntent(requireContext(), id)\n        )\n    }\n\n    override fun onViewTag(tag: String) {\n        bottomSheetActivity?.startActivityWithSlideInAnimation(\n            StatusListActivity.newHashtagIntent(requireContext(), tag)\n        )\n    }\n\n    override fun onViewUrl(url: String) {\n        bottomSheetActivity?.viewUrl(url)\n    }\n\n    protected val bottomSheetActivity\n        get() = (activity as? BottomSheetActivity)\n\n    override fun onRefresh() {\n        snackbarErrorRetry?.dismiss()\n        snackbarErrorRetry = null\n        adapter?.refresh()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/search/fragments/SearchHashtagsFragment.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.search.fragments\n\nimport android.os.Bundle\nimport android.view.View\nimport androidx.paging.PagingData\nimport androidx.paging.PagingDataAdapter\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport com.keylesspalace.tusky.components.search.adapter.SearchHashtagsAdapter\nimport com.keylesspalace.tusky.entity.HashTag\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.Flow\n\n@AndroidEntryPoint\nclass SearchHashtagsFragment : SearchFragment<HashTag>() {\n\n    override val data: Flow<PagingData<HashTag>>\n        get() = viewModel.hashtagsFlow\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        binding.searchRecyclerView.addItemDecoration(\n            DividerItemDecoration(\n                binding.searchRecyclerView.context,\n                DividerItemDecoration.VERTICAL\n            )\n        )\n    }\n\n    override fun createAdapter(): PagingDataAdapter<HashTag, *> = SearchHashtagsAdapter(this)\n\n    companion object {\n        fun newInstance() = SearchHashtagsFragment()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/search/fragments/SearchStatusesFragment.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.search.fragments\n\nimport android.Manifest\nimport android.app.DownloadManager\nimport android.content.Intent\nimport android.content.SharedPreferences\nimport android.os.Build\nimport android.os.Bundle\nimport android.os.Environment\nimport android.util.Log\nimport android.view.View\nimport android.widget.Toast\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.appcompat.widget.PopupMenu\nimport androidx.core.app.ActivityOptionsCompat\nimport androidx.core.content.getSystemService\nimport androidx.core.net.toUri\nimport androidx.core.view.ViewCompat\nimport androidx.lifecycle.lifecycleScope\nimport androidx.paging.PagingData\nimport androidx.paging.PagingDataAdapter\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport at.connyduck.calladapter.networkresult.fold\nimport at.connyduck.calladapter.networkresult.onFailure\nimport at.connyduck.sparkbutton.SparkButton\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.ViewMediaActivity\nimport com.keylesspalace.tusky.components.compose.ComposeActivity\nimport com.keylesspalace.tusky.components.compose.ComposeActivity.ComposeOptions\nimport com.keylesspalace.tusky.components.report.ReportActivity\nimport com.keylesspalace.tusky.components.search.adapter.SearchStatusesAdapter\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.entity.Status.Mention\nimport com.keylesspalace.tusky.interfaces.AccountSelectionListener\nimport com.keylesspalace.tusky.interfaces.StatusActionListener\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.util.CardViewMode\nimport com.keylesspalace.tusky.util.ListStatusAccessibilityDelegate\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.util.copyToClipboard\nimport com.keylesspalace.tusky.util.openLink\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport com.keylesspalace.tusky.util.updateRelativeTimePeriodically\nimport com.keylesspalace.tusky.view.ConfirmationBottomSheet.Companion.confirmFavourite\nimport com.keylesspalace.tusky.view.ConfirmationBottomSheet.Companion.confirmReblog\nimport com.keylesspalace.tusky.view.showMuteAccountDialog\nimport com.keylesspalace.tusky.viewdata.AttachmentViewData\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport dagger.hilt.android.AndroidEntryPoint\nimport java.util.Locale\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass SearchStatusesFragment : SearchFragment<StatusViewData.Concrete>(), StatusActionListener {\n    @Inject\n    lateinit var accountManager: AccountManager\n\n    @Inject\n    lateinit var preferences: SharedPreferences\n\n    override val data: Flow<PagingData<StatusViewData.Concrete>>\n        get() = viewModel.statusesFlow\n\n    private var pendingMediaDownloads: List<String>? = null\n\n    private val downloadAllMediaPermissionLauncher =\n        registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->\n            if (isGranted) {\n                pendingMediaDownloads?.let { downloadAllMedia(it) }\n            } else {\n                Toast.makeText(\n                    context,\n                    R.string.error_media_download_permission,\n                    Toast.LENGTH_SHORT\n                ).show()\n            }\n            pendingMediaDownloads = null\n        }\n\n    private var buttonToAnimate: SparkButton? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        pendingMediaDownloads = savedInstanceState?.getStringArrayList(PENDING_MEDIA_DOWNLOADS_STATE_KEY)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        adapter?.let {\n            updateRelativeTimePeriodically(preferences, it)\n        }\n    }\n\n    override fun onSaveInstanceState(outState: Bundle) {\n        super.onSaveInstanceState(outState)\n        pendingMediaDownloads?.let {\n            outState.putStringArrayList(PENDING_MEDIA_DOWNLOADS_STATE_KEY, ArrayList(it))\n        }\n    }\n\n    override fun createAdapter(): PagingDataAdapter<StatusViewData.Concrete, *> {\n        val statusDisplayOptions = StatusDisplayOptions(\n            animateAvatars = preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false),\n            mediaPreviewEnabled = viewModel.mediaPreviewEnabled,\n            useAbsoluteTime = preferences.getBoolean(PrefKeys.ABSOLUTE_TIME_VIEW, false),\n            showBotOverlay = preferences.getBoolean(PrefKeys.SHOW_BOT_OVERLAY, true),\n            useBlurhash = preferences.getBoolean(PrefKeys.USE_BLURHASH, true),\n            cardViewMode = CardViewMode.NONE,\n            hideStats = preferences.getBoolean(PrefKeys.WELLBEING_HIDE_STATS_POSTS, false),\n            animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false),\n            showStatsInline = preferences.getBoolean(PrefKeys.SHOW_STATS_INLINE, false),\n            showSensitiveMedia = accountManager.activeAccount!!.alwaysShowSensitiveMedia,\n            openSpoiler = accountManager.activeAccount!!.alwaysOpenSpoiler\n        )\n        val adapter = SearchStatusesAdapter(statusDisplayOptions, this)\n\n        binding.searchRecyclerView.setAccessibilityDelegateCompat(\n            ListStatusAccessibilityDelegate(binding.searchRecyclerView, this) { pos ->\n                if (pos in 0 until adapter.itemCount) {\n                    adapter.peek(pos)\n                } else {\n                    null\n                }\n            }\n        )\n\n        binding.searchRecyclerView.addItemDecoration(\n            DividerItemDecoration(\n                binding.searchRecyclerView.context,\n                DividerItemDecoration.VERTICAL\n            )\n        )\n        binding.searchRecyclerView.layoutManager =\n            LinearLayoutManager(binding.searchRecyclerView.context)\n        return adapter\n    }\n\n    override fun onDestroyView() {\n        buttonToAnimate = null\n        super.onDestroyView()\n    }\n\n    override fun onRefresh() {\n        viewModel.clearStatusCache()\n        super.onRefresh()\n    }\n\n    override fun onContentHiddenChange(isShowing: Boolean, position: Int) {\n        adapter?.peek(position)?.let {\n            viewModel.contentHiddenChange(it, isShowing)\n        }\n    }\n\n    override fun onReply(position: Int) {\n        adapter?.peek(position)?.let { status ->\n            reply(status)\n        }\n    }\n\n    override fun onFavourite(favourite: Boolean, position: Int, button: SparkButton?) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n\n        if (favourite) {\n            confirmFavourite(preferences) {\n                viewModel.favorite(status, true)\n                buttonToAnimate?.playAnimation()\n                buttonToAnimate?.isChecked = true\n            }\n        } else {\n            viewModel.favorite(status, false)\n            buttonToAnimate?.isChecked = false\n        }\n    }\n\n    override fun onBookmark(bookmark: Boolean, position: Int) {\n        adapter?.peek(position)?.let { status ->\n            viewModel.bookmark(status, bookmark)\n        }\n    }\n\n    override fun onMore(view: View, position: Int) {\n        adapter?.peek(position)?.let {\n            more(it, view, position)\n        }\n    }\n\n    override fun onViewMedia(position: Int, attachmentIndex: Int, view: View?) {\n        adapter?.peek(position)?.let { status ->\n            when (status.attachments[attachmentIndex].type) {\n                Attachment.Type.GIFV, Attachment.Type.VIDEO, Attachment.Type.IMAGE, Attachment.Type.AUDIO -> {\n                    val attachments = AttachmentViewData.list(status)\n                    val intent = ViewMediaActivity.newIntent(\n                        requireContext(),\n                        attachments,\n                        attachmentIndex\n                    )\n                    if (view != null) {\n                        val url = status.attachments[attachmentIndex].url\n                        ViewCompat.setTransitionName(view, url)\n                        val options = ActivityOptionsCompat.makeSceneTransitionAnimation(\n                            requireActivity(),\n                            view,\n                            url\n                        )\n                        startActivity(intent, options.toBundle())\n                    } else {\n                        startActivity(intent)\n                    }\n                }\n\n                Attachment.Type.UNKNOWN -> {\n                    context?.openLink(status.attachments[attachmentIndex].unknownUrl)\n                }\n            }\n        }\n    }\n\n    override fun onViewThread(position: Int) {\n        adapter?.peek(position)?.status?.let { status ->\n            val actionableStatus = status.actionableStatus\n            bottomSheetActivity?.viewThread(actionableStatus.id, actionableStatus.url)\n        }\n    }\n\n    override fun onOpenReblog(position: Int) {\n        adapter?.peek(position)?.status?.let { status ->\n            bottomSheetActivity?.viewAccount(status.account.id)\n        }\n    }\n\n    override fun onExpandedChange(expanded: Boolean, position: Int) {\n        adapter?.peek(position)?.let {\n            viewModel.expandedChange(it, expanded)\n        }\n    }\n\n    override fun onLoadMore(position: Int) {\n        // Not possible here\n    }\n\n    override fun onContentCollapsedChange(isCollapsed: Boolean, position: Int) {\n        adapter?.peek(position)?.let {\n            viewModel.collapsedChange(it, isCollapsed)\n        }\n    }\n\n    override fun onVoteInPoll(position: Int, choices: List<Int>) {\n        adapter?.peek(position)?.let {\n            viewModel.voteInPoll(it, choices)\n        }\n    }\n\n    override fun onShowPollResults(position: Int) {\n        adapter?.peek(position)?.asStatusOrNull()?.let { status ->\n            viewModel.showPollResults(status)\n        }\n    }\n\n    override fun clearWarningAction(position: Int) {}\n\n    private fun removeItem(position: Int, deleteMedia: Boolean) {\n        adapter?.peek(position)?.let {\n            viewModel.removeItem(it, deleteMedia)\n        }\n    }\n\n    override fun onReblog(reblog: Boolean, position: Int, visibility: Status.Visibility?, button: SparkButton?) {\n        adapter?.peek(position)?.let { status ->\n            buttonToAnimate = button\n\n            if (reblog && visibility == null) {\n                confirmReblog(preferences) { visibility ->\n                    viewModel.reblog(status, true, visibility)\n                    buttonToAnimate?.playAnimation()\n                    buttonToAnimate?.isChecked = true\n                }\n            } else {\n                viewModel.reblog(status, reblog, visibility ?: Status.Visibility.PUBLIC)\n                if (reblog) {\n                    buttonToAnimate?.playAnimation()\n                }\n                buttonToAnimate?.isChecked = false\n            }\n        }\n    }\n\n    override fun onUntranslate(position: Int) {\n        adapter?.peek(position)?.let {\n            viewModel.untranslate(it)\n        }\n    }\n\n    private fun reply(status: StatusViewData.Concrete) {\n        val actionableStatus = status.actionable\n        val mentionedUsernames = actionableStatus.mentions.map { it.username }\n            .toMutableSet()\n            .apply {\n                add(actionableStatus.account.username)\n                remove(viewModel.activeAccount?.username)\n            }\n\n        val intent = ComposeActivity.startIntent(\n            requireContext(),\n            ComposeOptions(\n                inReplyToId = status.actionableId,\n                replyVisibility = actionableStatus.visibility,\n                contentWarning = actionableStatus.spoilerText,\n                mentionedUsernames = mentionedUsernames,\n                replyingStatusAuthor = actionableStatus.account.localUsername,\n                replyingStatusContent = status.content.toString(),\n                language = actionableStatus.language,\n                kind = ComposeActivity.ComposeKind.NEW\n            )\n        )\n        bottomSheetActivity?.startActivityWithSlideInAnimation(intent)\n    }\n\n    private fun more(statusViewData: StatusViewData.Concrete, view: View, position: Int) {\n        val status = statusViewData.status\n        val id = status.actionableId\n        val accountId = status.actionableStatus.account.id\n        val accountUsername = status.actionableStatus.account.username\n        val statusUrl = status.actionableStatus.url\n        val loggedInAccountId = viewModel.activeAccount?.accountId\n\n        val popup = PopupMenu(view.context, view)\n        val statusIsByCurrentUser = loggedInAccountId?.equals(accountId) == true\n        // Give a different menu depending on whether this is the user's own toot or not.\n        if (statusIsByCurrentUser) {\n            popup.inflate(R.menu.status_more_for_user)\n            val menu = popup.menu\n            menu.findItem(R.id.status_open_as).isVisible = !statusUrl.isNullOrBlank()\n            when (status.visibility) {\n                Status.Visibility.PUBLIC, Status.Visibility.UNLISTED -> {\n                    val textId =\n                        getString(\n                            if (status.pinned) R.string.unpin_action else R.string.pin_action\n                        )\n                    menu.add(0, R.id.pin, 1, textId)\n                }\n\n                Status.Visibility.PRIVATE -> {\n                    var reblogged = status.reblogged\n                    if (status.reblog != null) reblogged = status.reblog.reblogged\n                    menu.findItem(R.id.status_reblog_private).isVisible = !reblogged\n                    menu.findItem(R.id.status_unreblog_private).isVisible = reblogged\n                }\n\n                Status.Visibility.UNKNOWN, Status.Visibility.DIRECT -> {\n                } // Ignore\n            }\n        } else {\n            popup.inflate(R.menu.status_more)\n            val menu = popup.menu\n            menu.findItem(R.id.status_download_media).isVisible = status.attachments.isNotEmpty()\n        }\n\n        val openAsItem = popup.menu.findItem(R.id.status_open_as)\n        val openAsText = bottomSheetActivity?.openAsText\n        if (openAsText == null) {\n            openAsItem.isVisible = false\n        } else {\n            openAsItem.title = openAsText\n        }\n\n        val mutable =\n            statusIsByCurrentUser || accountIsInMentions(viewModel.activeAccount, status.mentions)\n        val muteConversationItem = popup.menu.findItem(R.id.status_mute_conversation).apply {\n            isVisible = mutable\n        }\n        if (mutable) {\n            muteConversationItem.setTitle(\n                if (status.muted) {\n                    R.string.action_unmute_conversation\n                } else {\n                    R.string.action_mute_conversation\n                }\n            )\n        }\n\n        // translation not there for your own posts\n        popup.menu.findItem(R.id.status_translate)?.let { translateItem ->\n            translateItem.isVisible =\n                !status.language.equals(Locale.getDefault().language, ignoreCase = true) &&\n                viewModel.supportsTranslation()\n            translateItem.setTitle(if (statusViewData.translation != null) R.string.action_show_original else R.string.action_translate)\n        }\n\n        popup.setOnMenuItemClickListener { item ->\n            when (item.itemId) {\n                R.id.post_share_content -> {\n                    val statusToShare: Status = status.actionableStatus\n\n                    val sendIntent = Intent()\n                    sendIntent.action = Intent.ACTION_SEND\n\n                    val stringToShare = statusToShare.account.username +\n                        \" - \" +\n                        statusToShare.content\n                    sendIntent.putExtra(Intent.EXTRA_TEXT, stringToShare)\n                    sendIntent.type = \"text/plain\"\n                    startActivity(\n                        Intent.createChooser(\n                            sendIntent,\n                            resources.getText(R.string.send_post_content_to)\n                        )\n                    )\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.post_share_link -> {\n                    val sendIntent = Intent()\n                    sendIntent.action = Intent.ACTION_SEND\n                    sendIntent.putExtra(Intent.EXTRA_TEXT, statusUrl)\n                    sendIntent.type = \"text/plain\"\n                    startActivity(\n                        Intent.createChooser(\n                            sendIntent,\n                            resources.getText(R.string.send_post_link_to)\n                        )\n                    )\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_copy_link -> {\n                    statusUrl?.let { requireActivity().copyToClipboard(it, getString(R.string.url_copied)) }\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_open_as -> {\n                    showOpenAsDialog(statusUrl!!, item.title)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_download_media -> {\n                    requestDownloadAllMedia(status)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_mute_conversation -> {\n                    adapter?.peek(position)?.let { foundStatus ->\n                        viewModel.muteConversation(foundStatus, !status.muted)\n                    }\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_mute -> {\n                    onMute(accountId, accountUsername)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_block -> {\n                    onBlock(accountId, accountUsername)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_report -> {\n                    openReportPage(accountId, accountUsername, id)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_unreblog_private -> {\n                    onReblog(false, position, Status.Visibility.PRIVATE)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_reblog_private -> {\n                    onReblog(true, position, Status.Visibility.PRIVATE)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_delete -> {\n                    showConfirmDeleteDialog(id, position)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_delete_and_redraft -> {\n                    showConfirmEditDialog(id, position, status)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_edit -> {\n                    editStatus(id, status)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.pin -> {\n                    viewModel.pinAccount(status, !status.pinned)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_translate -> {\n                    if (statusViewData.translation != null) {\n                        viewModel.untranslate(statusViewData)\n                    } else {\n                        viewLifecycleOwner.lifecycleScope.launch {\n                            viewModel.translate(statusViewData)\n                                .onFailure {\n                                    Snackbar.make(\n                                        requireView(),\n                                        getString(R.string.ui_error_translate, it.message),\n                                        Snackbar.LENGTH_LONG\n                                    ).show()\n                                }\n                        }\n                    }\n                }\n            }\n            false\n        }\n        popup.show()\n    }\n\n    private fun onBlock(accountId: String, accountUsername: String) {\n        MaterialAlertDialogBuilder(requireContext())\n            .setMessage(getString(R.string.dialog_block_warning, accountUsername))\n            .setPositiveButton(android.R.string.ok) { _, _ -> viewModel.blockAccount(accountId) }\n            .setNegativeButton(android.R.string.cancel, null)\n            .show()\n    }\n\n    private fun onMute(accountId: String, accountUsername: String) {\n        showMuteAccountDialog(\n            this.requireActivity(),\n            accountUsername\n        ) { notifications, duration ->\n            viewModel.muteAccount(accountId, notifications, duration)\n        }\n    }\n\n    private fun accountIsInMentions(account: AccountEntity?, mentions: List<Mention>): Boolean {\n        return mentions.firstOrNull {\n            account?.username == it.username && account.domain == it.url.toUri().host\n        } != null\n    }\n\n    private fun showOpenAsDialog(statusUrl: String, dialogTitle: CharSequence?) {\n        bottomSheetActivity?.showAccountChooserDialog(\n            dialogTitle,\n            false,\n            object : AccountSelectionListener {\n                override fun onAccountSelected(account: AccountEntity) {\n                    bottomSheetActivity?.openAsAccount(statusUrl, account)\n                }\n            }\n        )\n    }\n\n    private fun downloadAllMedia(mediaUrls: List<String>) {\n        Toast.makeText(context, R.string.downloading_media, Toast.LENGTH_SHORT).show()\n        val downloadManager: DownloadManager = requireContext().getSystemService()!!\n\n        for (url in mediaUrls) {\n            val uri = url.toUri()\n            val request = DownloadManager.Request(uri)\n            request.setDestinationInExternalPublicDir(\n                Environment.DIRECTORY_DOWNLOADS,\n                uri.lastPathSegment\n            )\n            downloadManager.enqueue(request)\n        }\n    }\n\n    private fun requestDownloadAllMedia(status: Status) {\n        if (status.attachments.isEmpty()) {\n            return\n        }\n        val mediaUrls = status.attachments.map { it.url }\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {\n            pendingMediaDownloads = mediaUrls\n            downloadAllMediaPermissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)\n        } else {\n            downloadAllMedia(mediaUrls)\n        }\n    }\n\n    private fun openReportPage(accountId: String, accountUsername: String, statusId: String) {\n        startActivity(\n            ReportActivity.getIntent(requireContext(), accountId, accountUsername, statusId)\n        )\n    }\n\n    private fun showConfirmDeleteDialog(id: String, position: Int) {\n        context?.let {\n            MaterialAlertDialogBuilder(it)\n                .setMessage(R.string.dialog_delete_post_warning)\n                .setPositiveButton(android.R.string.ok) { _, _ ->\n                    viewModel.deleteStatusAsync(id, true)\n                    removeItem(position, true)\n                }\n                .setNegativeButton(android.R.string.cancel, null)\n                .show()\n        }\n    }\n\n    private fun showConfirmEditDialog(id: String, position: Int, status: Status) {\n        context?.let { context ->\n            MaterialAlertDialogBuilder(context)\n                .setMessage(R.string.dialog_redraft_post_warning)\n                .setPositiveButton(android.R.string.ok) { _, _ ->\n                    viewLifecycleOwner.lifecycleScope.launch {\n                        viewModel.deleteStatusAsync(id, false).await().fold(\n                            { deletedStatus ->\n                                removeItem(position, false)\n\n                                val redraftStatus = if (deletedStatus.isEmpty) {\n                                    status.toDeletedStatus()\n                                } else {\n                                    deletedStatus\n                                }\n\n                                val intent = ComposeActivity.startIntent(\n                                    context,\n                                    ComposeOptions(\n                                        content = redraftStatus.text.orEmpty(),\n                                        inReplyToId = redraftStatus.inReplyToId,\n                                        visibility = redraftStatus.visibility,\n                                        contentWarning = redraftStatus.spoilerText,\n                                        mediaAttachments = redraftStatus.attachments,\n                                        sensitive = redraftStatus.sensitive,\n                                        poll = redraftStatus.poll?.toNewPoll(status.createdAt),\n                                        language = redraftStatus.language,\n                                        kind = ComposeActivity.ComposeKind.NEW\n                                    )\n                                )\n                                startActivity(intent)\n                            },\n                            { error ->\n                                Log.w(\"SearchStatusesFragment\", \"error deleting status\", error)\n                                Toast.makeText(\n                                    context,\n                                    R.string.error_generic,\n                                    Toast.LENGTH_SHORT\n                                ).show()\n                            }\n                        )\n                    }\n                }\n                .setNegativeButton(android.R.string.cancel, null)\n                .show()\n        }\n    }\n\n    private fun editStatus(id: String, status: Status) {\n        viewLifecycleOwner.lifecycleScope.launch {\n            mastodonApi.statusSource(id).fold(\n                { source ->\n                    val composeOptions = ComposeOptions(\n                        content = source.text,\n                        inReplyToId = status.inReplyToId,\n                        visibility = status.visibility,\n                        contentWarning = source.spoilerText,\n                        mediaAttachments = status.attachments,\n                        sensitive = status.sensitive,\n                        language = status.language,\n                        statusId = source.id,\n                        poll = status.poll?.toNewPoll(status.createdAt),\n                        kind = ComposeActivity.ComposeKind.EDIT_POSTED\n                    )\n                    startActivity(ComposeActivity.startIntent(requireContext(), composeOptions))\n                },\n                {\n                    Snackbar.make(\n                        requireView(),\n                        getString(R.string.error_status_source_load),\n                        Snackbar.LENGTH_SHORT\n                    ).show()\n                }\n            )\n        }\n    }\n\n    companion object {\n        private const val PENDING_MEDIA_DOWNLOADS_STATE_KEY = \"pending_media_downloads\"\n\n        fun newInstance() = SearchStatusesFragment()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/systemnotifications/NotificationChannelData.kt",
    "content": "package com.keylesspalace.tusky.components.systemnotifications\n\nimport androidx.annotation.Keep\nimport androidx.annotation.StringRes\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.entity.Notification\n\n@Keep\nenum class NotificationChannelData(\n    val notificationTypes: List<Notification.Type>,\n    @StringRes val title: Int,\n    @StringRes val description: Int,\n) {\n    MENTION(\n        listOf(Notification.Type.Mention),\n        R.string.notification_mention_name,\n        R.string.notification_mention_descriptions,\n    ),\n\n    REBLOG(\n        listOf(Notification.Type.Reblog),\n        R.string.notification_boost_name,\n        R.string.notification_boost_description\n    ),\n\n    FAVOURITE(\n        listOf(Notification.Type.Favourite),\n        R.string.notification_favourite_name,\n        R.string.notification_favourite_description\n    ),\n\n    FOLLOW(\n        listOf(Notification.Type.Follow),\n        R.string.notification_follow_name,\n        R.string.notification_follow_description\n    ),\n\n    FOLLOW_REQUEST(\n        listOf(Notification.Type.FollowRequest),\n        R.string.notification_follow_request_name,\n        R.string.notification_follow_request_description\n    ),\n\n    POLL(\n        listOf(Notification.Type.Poll),\n        R.string.notification_poll_name,\n        R.string.notification_poll_description\n    ),\n\n    SUBSCRIPTIONS(\n        listOf(Notification.Type.Status),\n        R.string.notification_subscription_name,\n        R.string.notification_subscription_description\n    ),\n\n    UPDATES(\n        listOf(Notification.Type.Update),\n        R.string.notification_update_name,\n        R.string.notification_update_description\n    ),\n\n    ADMIN(\n        listOf(Notification.Type.SignUp, Notification.Type.Report),\n        R.string.notification_channel_admin,\n        R.string.notification_channel_admin_description\n    ),\n\n    OTHER(\n        listOf(Notification.Type.SeveredRelationship, Notification.Type.ModerationWarning),\n        R.string.notification_channel_other,\n        R.string.notification_channel_other_description\n    );\n\n    fun getChannelId(account: AccountEntity): String {\n        return getChannelId(account.identifier)\n    }\n\n    fun getChannelId(accountIdentifier: String): String {\n        return \"CHANNEL_${name}$accountIdentifier\"\n    }\n}\n\nfun Set<NotificationChannelData>.toTypes(): Set<Notification.Type> {\n    return flatMap { channelData -> channelData.notificationTypes }.toSet()\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/systemnotifications/NotificationFetcher.kt",
    "content": "package com.keylesspalace.tusky.components.systemnotifications\n\nimport android.util.Log\nimport androidx.annotation.WorkerThread\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.NewNotificationsEvent\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.entity.Marker\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.HttpHeaderLink\nimport com.keylesspalace.tusky.util.isLessThan\nimport javax.inject.Inject\n\n/** Models next/prev links from the \"Links\" header in an API response */\ndata class Links(val next: String?, val prev: String?) {\n    companion object {\n        fun from(linkHeader: String?): Links {\n            val links = HttpHeaderLink.parse(linkHeader)\n            return Links(\n                next = HttpHeaderLink.findByRelationType(links, \"next\")?.uri?.getQueryParameter(\n                    \"max_id\"\n                ),\n                prev = HttpHeaderLink.findByRelationType(links, \"prev\")?.uri?.getQueryParameter(\n                    \"min_id\"\n                )\n            )\n        }\n    }\n}\n\n/**\n * Fetch Mastodon notifications and show Android notifications, with summaries, for them.\n *\n * Should only be called by a worker thread.\n *\n * @see com.keylesspalace.tusky.worker.NotificationWorker\n * @see <a href=\"https://developer.android.com/guide/background/persistent/threading/worker\">Background worker</a>\n */\n@WorkerThread\nclass NotificationFetcher @Inject constructor(\n    private val mastodonApi: MastodonApi,\n    private val accountManager: AccountManager,\n    private val eventHub: EventHub,\n    private val notificationService: NotificationService,\n) {\n    suspend fun fetchAndShow(accountId: Long?) {\n        for (account in accountManager.accounts) {\n            if (accountId != null && account.id != accountId) {\n                continue\n            }\n\n            if (account.notificationsEnabled) {\n                try {\n                    val notifications = fetchNewNotifications(account)\n                        .filter { notificationService.filterNotification(account, it.type) }\n                        .sortedWith(\n                            compareBy({ it.id.length }, { it.id })\n                        ) // oldest notifications first\n\n                    eventHub.dispatch(NewNotificationsEvent(account.accountId, notifications))\n\n                    notificationService.show(account, notifications)\n                } catch (e: Exception) {\n                    Log.e(TAG, \"Error while fetching notifications\", e)\n                }\n            }\n        }\n    }\n\n    /**\n     * Fetch new Mastodon Notifications and update the marker position.\n     *\n     * Here, \"new\" means \"notifications with IDs newer than notifications the user has already\n     * seen.\"\n     *\n     * The \"water mark\" for Mastodon Notification IDs are stored in three places.\n     *\n     * - acccount.lastNotificationId -- the ID of the top-most notification when the user last\n     *   left the Notifications tab.\n     * - The Mastodon \"marker\" API -- the ID of the most recent notification fetched here.\n     * - account.notificationMarkerId -- local version of the value from the Mastodon marker\n     *   API, in case the Mastodon server does not implement that API.\n     *\n     * The user may have refreshed the \"Notifications\" tab and seen notifications newer than the\n     * ones that were last fetched here. So `lastNotificationId` takes precedence if it is greater\n     * than the marker.\n     */\n    private suspend fun fetchNewNotifications(account: AccountEntity): List<Notification> {\n        val authHeader = \"Bearer ${account.accessToken}\"\n\n        // Figure out where to read from. Choose the most recent notification ID from:\n        //\n        // - The Mastodon marker API (if the server supports it)\n        // - account.notificationMarkerId\n        // - account.lastNotificationId\n        Log.d(TAG, \"Getting notification marker for ${account.fullName}.\")\n        val remoteMarkerId = fetchMarker(authHeader, account)?.lastReadId ?: \"0\"\n        val localMarkerId = account.notificationMarkerId\n        val markerId = if (remoteMarkerId.isLessThan(\n                localMarkerId\n            )\n        ) {\n            localMarkerId\n        } else {\n            remoteMarkerId\n        }\n        val readingPosition = account.lastNotificationId\n\n        var minId: String? = if (readingPosition.isLessThan(markerId)) markerId else readingPosition\n        Log.d(TAG, \"  remoteMarkerId: $remoteMarkerId\")\n        Log.d(TAG, \"  localMarkerId: $localMarkerId\")\n        Log.d(TAG, \"  readingPosition: $readingPosition\")\n\n        Log.d(TAG, \"Getting Notifications for ${account.fullName}, min_id: $minId.\")\n\n        // Fetch all outstanding notifications\n        val notifications: List<Notification> = buildList {\n            while (minId != null) {\n                val response = mastodonApi.notificationsWithAuth(\n                    authHeader,\n                    account.domain,\n                    minId = minId\n                )\n                if (!response.isSuccessful) break\n\n                // Notifications are returned in the page in order, newest first,\n                // (https://github.com/mastodon/documentation/issues/1226), insert the\n                // new page at the head of the list.\n                response.body()?.let { addAll(0, it) }\n\n                // Get the previous page, which will be chronologically newer\n                // notifications. If it doesn't exist this is null and the loop\n                // will exit.\n                val links = Links.from(response.headers()[\"link\"])\n                minId = links.prev\n            }\n        }\n\n        // Save the newest notification ID in the marker.\n        notifications.firstOrNull()?.let {\n            val newMarkerId = notifications.first().id\n            Log.d(TAG, \"Updating notification marker for ${account.fullName} to: $newMarkerId\")\n            mastodonApi.updateMarkersWithAuth(\n                auth = authHeader,\n                domain = account.domain,\n                notificationsLastReadId = newMarkerId\n            )\n            accountManager.updateAccount(account) { copy(notificationMarkerId = newMarkerId) }\n        }\n\n        Log.d(TAG, \"Got ${notifications.size} Notifications.\")\n\n        return notifications\n    }\n\n    private suspend fun fetchMarker(authHeader: String, account: AccountEntity): Marker? {\n        return try {\n            val allMarkers = mastodonApi.markersWithAuth(\n                authHeader,\n                account.domain,\n                listOf(\"notifications\")\n            )\n            val notificationMarker = allMarkers[\"notifications\"]\n            Log.d(TAG, \"Fetched marker for ${account.fullName}: $notificationMarker\")\n            notificationMarker\n        } catch (e: Exception) {\n            Log.e(TAG, \"Failed to fetch marker\", e)\n            null\n        }\n    }\n\n    companion object {\n        private const val TAG = \"NotificationFetcher\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/systemnotifications/NotificationService.kt",
    "content": "package com.keylesspalace.tusky.components.systemnotifications\n\nimport android.Manifest\nimport android.app.Activity\nimport android.app.NotificationChannel\nimport android.app.NotificationChannelGroup\nimport android.app.NotificationManager\nimport android.app.PendingIntent\nimport android.content.Context\nimport android.content.Intent\nimport android.content.SharedPreferences\nimport android.content.pm.PackageManager\nimport android.graphics.BitmapFactory\nimport android.os.Build\nimport android.os.Bundle\nimport android.provider.Settings\nimport android.service.notification.StatusBarNotification\nimport android.util.Log\nimport androidx.annotation.StringRes\nimport androidx.annotation.VisibleForTesting\nimport androidx.core.app.ActivityCompat\nimport androidx.core.app.NotificationCompat\nimport androidx.core.app.NotificationManagerCompat\nimport androidx.core.app.NotificationManagerCompat.NotificationWithIdAndTag\nimport androidx.core.app.RemoteInput\nimport androidx.core.app.TaskStackBuilder\nimport androidx.core.content.edit\nimport androidx.core.net.toUri\nimport androidx.work.Constraints\nimport androidx.work.Data\nimport androidx.work.ExistingPeriodicWorkPolicy\nimport androidx.work.NetworkType\nimport androidx.work.OneTimeWorkRequest\nimport androidx.work.OutOfQuotaPolicy\nimport androidx.work.PeriodicWorkRequest\nimport androidx.work.WorkManager\nimport at.connyduck.calladapter.networkresult.fold\nimport at.connyduck.calladapter.networkresult.onFailure\nimport at.connyduck.calladapter.networkresult.onSuccess\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.load.resource.bitmap.RoundedCorners\nimport com.keylesspalace.tusky.BuildConfig\nimport com.keylesspalace.tusky.MainActivity\nimport com.keylesspalace.tusky.MainActivity.Companion.composeIntent\nimport com.keylesspalace.tusky.MainActivity.Companion.openNotificationIntent\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.compose.ComposeActivity\nimport com.keylesspalace.tusky.components.compose.ComposeActivity.ComposeOptions\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.di.ApplicationScope\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.entity.NotificationSubscribeResult\nimport com.keylesspalace.tusky.entity.RelationshipSeveranceEvent\nimport com.keylesspalace.tusky.entity.visibleNotificationTypes\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.receiver.SendStatusBroadcastReceiver\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.util.CryptoUtil\nimport com.keylesspalace.tusky.util.parseAsMastodonHtml\nimport com.keylesspalace.tusky.util.unicodeWrap\nimport com.keylesspalace.tusky.viewdata.buildDescription\nimport com.keylesspalace.tusky.viewdata.calculatePercent\nimport com.keylesspalace.tusky.worker.NotificationWorker\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport java.text.NumberFormat\nimport java.util.concurrent.ExecutionException\nimport java.util.concurrent.TimeUnit\nimport javax.inject.Inject\nimport javax.inject.Singleton\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport org.unifiedpush.android.connector.UnifiedPush\nimport retrofit2.HttpException\n\n@Singleton\nclass NotificationService @Inject constructor(\n    private val notificationManager: NotificationManager,\n    private val accountManager: AccountManager,\n    private val api: MastodonApi,\n    private val preferences: SharedPreferences,\n    @ApplicationContext private val context: Context,\n    @ApplicationScope private val applicationScope: CoroutineScope,\n) {\n    private var workManager: WorkManager = WorkManager.getInstance(context)\n\n    private var notificationId: Int = NOTIFICATION_ID_PRUNE_CACHE + 1\n\n    init {\n        createWorkerNotificationChannel()\n    }\n\n    fun areNotificationsEnabledBySystem(): Boolean {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            // on Android >= O, notifications are enabled, if at least one channel is enabled\n\n            if (notificationManager.areNotificationsEnabled()) {\n                for (channel in notificationManager.notificationChannels) {\n                    if (channel != null && channel.importance > NotificationManager.IMPORTANCE_NONE) {\n                        Log.d(TAG, \"Notifications enabled for app by the system.\")\n                        return true\n                    }\n                }\n            }\n            Log.d(TAG, \"Notifications disabled for app by the system.\")\n\n            return false\n        } else {\n            // on Android < O, notifications are enabled, if at least one account has notification enabled\n            return accountManager.areNotificationsEnabled()\n        }\n    }\n\n    suspend fun setupNotifications(activity: Activity) {\n        resetPushWhenDistributorIsMissing()\n\n        if (arePushNotificationsAvailable()) {\n            setupPushNotifications(activity)\n        }\n\n        // At least as a fallback and otherwise as main source when there are no push distributors installed:\n        enablePullNotifications()\n    }\n\n    fun enablePullNotifications() {\n        val workRequest: PeriodicWorkRequest = PeriodicWorkRequest.Builder(\n            NotificationWorker::class.java,\n            PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,\n            TimeUnit.MILLISECONDS,\n        )\n            .setConstraints(\n                Constraints.Builder()\n                    .setRequiredNetworkType(NetworkType.CONNECTED)\n                    .build()\n            )\n            .build()\n\n        workManager.enqueueUniquePeriodicWork(NOTIFICATION_PULL_NAME, ExistingPeriodicWorkPolicy.KEEP, workRequest)\n\n        Log.d(TAG, \"Enabled pull checks with ${PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS / 60000} minutes interval.\")\n    }\n\n    fun createNotificationChannelsForAccount(account: AccountEntity) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            val channelGroup = NotificationChannelGroup(account.identifier, account.fullName)\n            notificationManager.createNotificationChannelGroup(channelGroup)\n\n            val channels = NotificationChannelData.entries.map {\n                NotificationChannel(\n                    it.getChannelId(account),\n                    context.getString(it.title),\n                    NotificationManager.IMPORTANCE_DEFAULT\n                ).apply {\n                    description = context.getString(it.description)\n                    enableLights(true)\n                    lightColor = -0xd46f27\n                    enableVibration(true)\n                    setShowBadge(true)\n                    group = account.identifier\n                }\n            }\n\n            notificationManager.createNotificationChannels(channels)\n        }\n    }\n\n    private fun deleteNotificationChannelsForAccount(account: AccountEntity) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            notificationManager.deleteNotificationChannelGroup(account.identifier)\n        }\n    }\n\n    private fun enqueueOneTimeWorker(account: AccountEntity?) {\n        val oneTimeRequestBuilder = OneTimeWorkRequest.Builder(NotificationWorker::class.java)\n            .setExpedited(OutOfQuotaPolicy.DROP_WORK_REQUEST)\n            .setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build())\n\n        account?.let {\n            val data = Data.Builder()\n            data.putLong(NotificationWorker.KEY_ACCOUNT_ID, account.id)\n            oneTimeRequestBuilder.setInputData(data.build())\n        }\n\n        workManager.enqueue(oneTimeRequestBuilder.build())\n    }\n\n    fun disablePullNotifications() {\n        workManager.cancelUniqueWork(NOTIFICATION_PULL_NAME)\n        Log.d(TAG, \"Disabled pull checks.\")\n    }\n\n    fun clearNotificationsForAccount(account: AccountEntity) {\n        for (androidNotification in notificationManager.activeNotifications) {\n            if (account.id.toInt() == androidNotification.id) {\n                notificationManager.cancel(androidNotification.tag, androidNotification.id)\n            }\n        }\n    }\n\n    fun filterNotification(account: AccountEntity, type: Notification.Type): Boolean {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            val channelId = getChannelId(account, type)\n                ?: // unknown notificationtype\n                return false\n            val channel = notificationManager.getNotificationChannel(channelId)\n\n            return channel != null && channel.importance > NotificationManager.IMPORTANCE_NONE\n        }\n\n        return when (type) {\n            Notification.Type.Mention -> account.notificationsMentioned\n            Notification.Type.Status -> account.notificationsSubscriptions\n            Notification.Type.Follow -> account.notificationsFollowed\n            Notification.Type.FollowRequest -> account.notificationsFollowRequested\n            Notification.Type.Reblog -> account.notificationsReblogged\n            Notification.Type.Favourite -> account.notificationsFavorited\n            Notification.Type.Poll -> account.notificationsPolls\n            Notification.Type.SignUp -> account.notificationsAdmin\n            Notification.Type.Update -> account.notificationsUpdates\n            Notification.Type.Report -> account.notificationsAdmin\n            else -> account.notificationsOther\n        }\n    }\n\n    fun show(account: AccountEntity, notifications: List<Notification>) {\n        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {\n            return\n        }\n\n        if (notifications.isEmpty()) {\n            return\n        }\n\n        val newNotifications = ArrayList<NotificationWithIdAndTag>()\n\n        val notificationsByType: Map<Notification.Type, List<Notification>> = notifications.groupBy { it.type }\n        for ((type, notificationsForOneType) in notificationsByType) {\n            val summary = createSummaryNotification(account, type, notificationsForOneType) ?: continue\n\n            // NOTE Enqueue the summary first: Needed to avoid rate limit problems:\n            //   ie. single notification is enqueued but later the summary one is filtered and thus no grouping\n            //   takes place.\n            newNotifications.add(summary)\n\n            for (notification in notificationsForOneType) {\n                val single = createNotification(notification, account) ?: continue\n                newNotifications.add(single)\n            }\n        }\n\n        val notificationManagerCompat = NotificationManagerCompat.from(context)\n        // NOTE having multiple summary notifications: this here should still collapse them in only one occurrence\n        notificationManagerCompat.notify(newNotifications)\n    }\n\n    private fun createNotification(apiNotification: Notification, account: AccountEntity): NotificationWithIdAndTag? {\n        val baseNotification = createBaseNotification(apiNotification, account) ?: return null\n\n        return NotificationWithIdAndTag(\n            apiNotification.id,\n            account.id.toInt(),\n            baseNotification\n        )\n    }\n\n    @VisibleForTesting\n    fun createBaseNotification(apiNotification: Notification, account: AccountEntity): android.app.Notification? {\n        val channelId = getChannelId(account, apiNotification.type) ?: return null\n\n        val body = apiNotification.rewriteToStatusTypeIfNeeded(account.accountId)\n\n        // Check for an existing notification matching this account and api notification\n        var existingAndroidNotification: android.app.Notification? = null\n        val activeNotifications = notificationManager.activeNotifications\n        for (androidNotification in activeNotifications) {\n            if (body.id == androidNotification.tag && account.id.toInt() == androidNotification.id) {\n                existingAndroidNotification = androidNotification.notification\n            }\n        }\n\n        notificationId++\n\n        val builder = if (existingAndroidNotification == null) {\n            getNotificationBuilder(body, account, channelId)\n        } else {\n            NotificationCompat.Builder(context, existingAndroidNotification)\n        }\n\n        builder\n            .setContentTitle(titleForType(body, account))\n            .setContentText(bodyForType(body, account))\n\n        if (body.type == Notification.Type.Mention || body.type == Notification.Type.Poll) {\n            builder.setStyle(\n                NotificationCompat.BigTextStyle()\n                    .bigText(bodyForType(body, account))\n            )\n        }\n\n        if (body.type != Notification.Type.SeveredRelationship && body.type != Notification.Type.ModerationWarning) {\n            val accountAvatar = try {\n                Glide.with(context)\n                    .asBitmap()\n                    .load(body.account.avatar)\n                    .transform(RoundedCorners(20))\n                    .submit()\n                    .get()\n            } catch (e: ExecutionException) {\n                Log.d(TAG, \"Error loading account avatar\", e)\n                BitmapFactory.decodeResource(context.resources, R.drawable.avatar_default)\n            } catch (e: InterruptedException) {\n                Log.d(TAG, \"Error loading account avatar\", e)\n                BitmapFactory.decodeResource(context.resources, R.drawable.avatar_default)\n            }\n\n            builder.setLargeIcon(accountAvatar)\n        }\n\n        // Reply to mention action; RemoteInput is available from KitKat Watch, but buttons are available from Nougat\n        if (body.type == Notification.Type.Mention) {\n            val replyRemoteInput = RemoteInput.Builder(KEY_REPLY)\n                .setLabel(context.getString(R.string.label_quick_reply))\n                .build()\n\n            val quickReplyPendingIntent = getStatusReplyIntent(body, account, notificationId)\n\n            val quickReplyAction =\n                NotificationCompat.Action.Builder(\n                    R.drawable.ic_reply_24dp,\n                    context.getString(R.string.action_quick_reply),\n                    quickReplyPendingIntent\n                )\n                    .addRemoteInput(replyRemoteInput)\n                    .build()\n\n            builder.addAction(quickReplyAction)\n\n            val composeIntent = getStatusComposeIntent(body, account, notificationId)\n\n            val composeAction =\n                NotificationCompat.Action.Builder(\n                    R.drawable.ic_reply_24dp,\n                    context.getString(R.string.action_compose_shortcut),\n                    composeIntent\n                )\n                    .setShowsUserInterface(true)\n                    .build()\n\n            builder.addAction(composeAction)\n        }\n\n        builder.addExtras(\n            Bundle().apply {\n                // Add the sending account's name, so it can be used also later when summarising this notification\n                putString(EXTRA_ACCOUNT_NAME, body.account.name)\n                putString(EXTRA_NOTIFICATION_TYPE, body.type.name)\n            }\n        )\n\n        return builder.build()\n    }\n\n    /**\n     * Create a notification that summarises the other notifications in this group.\n     *\n     * NOTE: We always create a summary notification (even for only one notification of that type):\n     *   - No need to especially track the grouping\n     *   - No need to change an existing single notification when there arrives another one of its group\n     *   - Only the summary one will get announced\n     */\n    private fun createSummaryNotification(account: AccountEntity, type: Notification.Type, additionalNotifications: List<Notification>): NotificationWithIdAndTag? {\n        val typeChannelId = getChannelId(account, type) ?: return null\n\n        val summaryStackBuilder = TaskStackBuilder.create(context)\n        summaryStackBuilder.addParentStack(MainActivity::class.java)\n        val summaryResultIntent = openNotificationIntent(context, account.id, type)\n        summaryStackBuilder.addNextIntent(summaryResultIntent)\n\n        val summaryResultPendingIntent = summaryStackBuilder.getPendingIntent(\n            (notificationId + account.id * 10000).toInt(),\n            pendingIntentFlags(false)\n        )\n\n        val activeNotifications = getActiveNotifications(account.id, typeChannelId)\n\n        val notificationCount = activeNotifications.size + additionalNotifications.size\n\n        val title = context.resources.getQuantityString(R.plurals.notification_title_summary, notificationCount, notificationCount)\n        val text = joinNames(activeNotifications, additionalNotifications)\n\n        val summaryBuilder = NotificationCompat.Builder(context, typeChannelId)\n            .setSmallIcon(R.drawable.tusky_notification_icon)\n            .setContentIntent(summaryResultPendingIntent)\n            .setColor(context.getColor(R.color.notification_color))\n            .setAutoCancel(true)\n            .setContentTitle(title)\n            .setContentText(text)\n            .setShortcutId(account.id.toString())\n            .setSubText(account.fullName)\n            .setVisibility(NotificationCompat.VISIBILITY_PRIVATE)\n            .setCategory(NotificationCompat.CATEGORY_SOCIAL)\n            .setGroup(typeChannelId)\n            .setGroupSummary(true)\n            .setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_SUMMARY)\n\n        setSoundVibrationLight(account, summaryBuilder)\n\n        val summaryTag = \"$GROUP_SUMMARY_TAG.$typeChannelId\"\n\n        return NotificationWithIdAndTag(summaryTag, account.id.toInt(), summaryBuilder.build())\n    }\n\n    fun createWorkerNotification(@StringRes titleResource: Int): android.app.Notification {\n        val title = context.getString(titleResource)\n        return NotificationCompat.Builder(context, CHANNEL_BACKGROUND_TASKS)\n            .setContentTitle(title)\n            .setTicker(title)\n            .setSmallIcon(R.drawable.tusky_notification_icon)\n            .setOngoing(true)\n            .build()\n    }\n\n    private fun getChannelId(account: AccountEntity, type: Notification.Type): String? {\n        return NotificationChannelData.entries.find { data ->\n            data.notificationTypes.contains(type)\n        }?.getChannelId(account)\n    }\n\n    /**\n     * Return all active notifications, ignoring notifications that:\n     * - belong to a different account\n     * - belong to a different type\n     * - are summary notifications\n     */\n    private fun getActiveNotifications(accountId: Long, typeChannelId: String): List<StatusBarNotification> {\n        return notificationManager.activeNotifications.filter {\n            val channelId = it.notification.group\n            it.id == accountId.toInt() && channelId == typeChannelId && it.tag != \"$GROUP_SUMMARY_TAG.$channelId\"\n        }\n    }\n\n    private fun getNotificationBuilder(notification: Notification, account: AccountEntity, channelId: String): NotificationCompat.Builder {\n        val notificationType = notification.type\n        val eventResultPendingIntent = if (notificationType == Notification.Type.ModerationWarning) {\n            val warning = notification.moderationWarning!!\n            val intent = Intent(Intent.ACTION_VIEW, \"https://${account.domain}/disputes/strikes/${warning.id}\".toUri())\n            PendingIntent.getActivity(context, account.id.toInt(), intent, pendingIntentFlags(false))\n        } else {\n            val eventResultIntent = openNotificationIntent(context, account.id, notificationType)\n\n            val eventStackBuilder = TaskStackBuilder.create(context)\n            eventStackBuilder.addParentStack(MainActivity::class.java)\n            eventStackBuilder.addNextIntent(eventResultIntent)\n\n            eventStackBuilder.getPendingIntent(\n                account.id.toInt(),\n                pendingIntentFlags(false)\n            )\n        }\n\n        val builder = NotificationCompat.Builder(context, channelId)\n            .setSmallIcon(R.drawable.tusky_notification_icon)\n            .setContentIntent(eventResultPendingIntent)\n            .setColor(context.getColor(R.color.notification_color))\n            .setAutoCancel(true)\n            .setShortcutId(account.id.toString())\n            .setSubText(account.fullName)\n            .setVisibility(NotificationCompat.VISIBILITY_PRIVATE)\n            .setCategory(NotificationCompat.CATEGORY_SOCIAL)\n            .setOnlyAlertOnce(true)\n            .setGroup(channelId)\n            .setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_SUMMARY) // Only ever alert for the summary notification\n\n        setSoundVibrationLight(account, builder)\n\n        return builder\n    }\n\n    private fun titleForType(notification: Notification, account: AccountEntity): String? {\n        val accountName = notification.account.name.unicodeWrap()\n        when (notification.type) {\n            Notification.Type.Mention -> return context.getString(R.string.notification_mention_format, accountName)\n            Notification.Type.Status -> return context.getString(R.string.notification_subscription_format, accountName)\n            Notification.Type.Follow -> return context.getString(R.string.notification_follow_format, accountName)\n            Notification.Type.FollowRequest -> return context.getString(R.string.notification_follow_request_format, accountName)\n            Notification.Type.Favourite -> return context.getString(R.string.notification_favourite_format, accountName)\n            Notification.Type.Reblog -> return context.getString(R.string.notification_reblog_format, accountName)\n            Notification.Type.Poll -> return if (notification.status!!.account.id == account.accountId) {\n                context.getString(R.string.poll_ended_created)\n            } else {\n                context.getString(R.string.poll_ended_voted)\n            }\n            Notification.Type.SignUp -> return context.getString(R.string.notification_sign_up_format, accountName)\n            Notification.Type.Update -> return context.getString(R.string.notification_update_format, accountName)\n            Notification.Type.Report -> return context.getString(R.string.notification_report_format, account.domain)\n            Notification.Type.SeveredRelationship -> return context.getString(R.string.relationship_severance_event_title)\n            Notification.Type.ModerationWarning -> return context.getString(R.string.moderation_warning)\n            is Notification.Type.Unknown -> return null\n        }\n    }\n\n    private fun bodyForType(notification: Notification, account: AccountEntity): String? {\n        val alwaysOpenSpoiler = account.alwaysOpenSpoiler\n\n        when (notification.type) {\n            Notification.Type.Follow, Notification.Type.FollowRequest, Notification.Type.SignUp -> return \"@\" + notification.account.username\n            Notification.Type.Mention, Notification.Type.Favourite, Notification.Type.Reblog, Notification.Type.Status -> return if (!notification.status?.spoilerText.isNullOrEmpty() && !alwaysOpenSpoiler) {\n                notification.status.spoilerText\n            } else {\n                notification.status?.content?.parseAsMastodonHtml()?.toString()\n            }\n            Notification.Type.Poll -> if (!notification.status?.spoilerText.isNullOrEmpty() && !alwaysOpenSpoiler) {\n                return notification.status.spoilerText\n            } else {\n                val poll = notification.status?.poll ?: return null\n\n                val builder = StringBuilder(notification.status.content.parseAsMastodonHtml())\n                builder.append('\\n')\n\n                poll.options.forEachIndexed { i, option ->\n                    builder.append(\n                        buildDescription(\n                            option.title,\n                            calculatePercent(option.votesCount, poll.votersCount, poll.votesCount),\n                            poll.ownVotes.contains(i),\n                            context\n                        )\n                    )\n                    builder.append('\\n')\n                }\n\n                return builder.toString()\n            }\n            Notification.Type.Report -> return context.getString(\n                R.string.notification_header_report_format,\n                notification.account.name.unicodeWrap(),\n                notification.report!!.targetAccount.name.unicodeWrap()\n            )\n            Notification.Type.SeveredRelationship -> return severedRelationShipText(context, notification.event!!, account.domain)\n            Notification.Type.ModerationWarning -> return context.getString(notification.moderationWarning!!.action.text)\n            else -> return null\n        }\n    }\n\n    private fun createWorkerNotificationChannel() {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {\n            return\n        }\n\n        val channel = NotificationChannel(\n            CHANNEL_BACKGROUND_TASKS,\n            context.getString(R.string.notification_listenable_worker_name),\n            NotificationManager.IMPORTANCE_NONE\n        )\n\n        channel.description = context.getString(R.string.notification_listenable_worker_description)\n        channel.enableLights(false)\n        channel.enableVibration(false)\n        channel.setShowBadge(false)\n\n        notificationManager.createNotificationChannel(channel)\n    }\n\n    private fun setSoundVibrationLight(account: AccountEntity, builder: NotificationCompat.Builder) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            return // Do nothing on Android O or newer, the system uses only the channel settings\n        }\n\n        builder.setDefaults(0)\n\n        if (account.notificationSound) {\n            builder.setSound(Settings.System.DEFAULT_NOTIFICATION_URI)\n        }\n\n        if (account.notificationVibration) {\n            builder.setVibrate(longArrayOf(500, 500))\n        }\n\n        if (account.notificationLight) {\n            builder.setLights(-0xd46f27, 300, 1000)\n        }\n    }\n\n    private fun joinNames(notifications1: List<StatusBarNotification>, notifications2: List<Notification>): String? {\n        val names = java.util.ArrayList<String>(notifications1.size + notifications2.size)\n\n        for (notification in notifications1) {\n            val author = notification.notification.extras.getString(EXTRA_ACCOUNT_NAME) ?: continue\n            names.add(author)\n        }\n\n        for (noti in notifications2) {\n            names.add(noti.account.name)\n        }\n\n        if (names.size > 3) {\n            val length = names.size\n            return context.getString(\n                R.string.notification_summary_large,\n                names[length - 1].unicodeWrap(),\n                names[length - 2].unicodeWrap(),\n                names[length - 3].unicodeWrap(),\n                length - 3\n            )\n        } else if (names.size == 3) {\n            return context.getString(\n                R.string.notification_summary_medium,\n                names[2].unicodeWrap(),\n                names[1].unicodeWrap(),\n                names[0].unicodeWrap()\n            )\n        } else if (names.size == 2) {\n            return context.getString(\n                R.string.notification_summary_small,\n                names[1].unicodeWrap(),\n                names[0].unicodeWrap()\n            )\n        }\n\n        return null\n    }\n\n    private fun getStatusReplyIntent(apiNotification: Notification, account: AccountEntity, requestCode: Int): PendingIntent {\n        val status = checkNotNull(apiNotification.status)\n\n        val inReplyToId = status.id\n        val actionableStatus = status.actionableStatus\n        val replyVisibility = actionableStatus.visibility\n        val contentWarning = actionableStatus.spoilerText\n        val mentions = actionableStatus.mentions\n\n        val mentionedUsernames = buildSet {\n            add(actionableStatus.account.username)\n            for (mention in mentions) {\n                add(mention.username)\n            }\n            remove(account.username)\n        }\n\n        val replyIntent = Intent(context, SendStatusBroadcastReceiver::class.java)\n            .setAction(REPLY_ACTION)\n            .putExtra(KEY_SENDER_ACCOUNT_ID, account.id)\n            .putExtra(KEY_SENDER_ACCOUNT_IDENTIFIER, account.identifier)\n            .putExtra(KEY_SENDER_ACCOUNT_FULL_NAME, account.fullName)\n            .putExtra(KEY_SERVER_NOTIFICATION_ID, apiNotification.id)\n            .putExtra(KEY_CITED_STATUS_ID, inReplyToId)\n            .putExtra(KEY_VISIBILITY, replyVisibility)\n            .putExtra(KEY_SPOILER, contentWarning)\n            .putExtra(KEY_MENTIONS, mentionedUsernames.toTypedArray<String?>())\n\n        return PendingIntent.getBroadcast(\n            context.applicationContext,\n            requestCode,\n            replyIntent,\n            pendingIntentFlags(true)\n        )\n    }\n\n    private fun getStatusComposeIntent(apiNotification: Notification, account: AccountEntity, requestCode: Int): PendingIntent {\n        val status = checkNotNull(apiNotification.status)\n\n        val citedLocalAuthor = status.account.localUsername\n        val citedText = status.content.parseAsMastodonHtml().toString()\n        val inReplyToId = status.id\n        val actionableStatus = status.actionableStatus\n        val replyVisibility = actionableStatus.visibility\n        val contentWarning = actionableStatus.spoilerText\n        val mentions = actionableStatus.mentions\n\n        val mentionedUsernames = buildSet {\n            add(actionableStatus.account.username)\n            for (mention in mentions) {\n                add(mention.username)\n            }\n            remove(account.username)\n        }\n\n        val composeOptions = ComposeOptions()\n        composeOptions.inReplyToId = inReplyToId\n        composeOptions.replyVisibility = replyVisibility\n        composeOptions.contentWarning = contentWarning\n        composeOptions.replyingStatusAuthor = citedLocalAuthor\n        composeOptions.replyingStatusContent = citedText\n        composeOptions.mentionedUsernames = mentionedUsernames\n        composeOptions.modifiedInitialState = true\n        composeOptions.language = actionableStatus.language\n        composeOptions.kind = ComposeActivity.ComposeKind.NEW\n\n        val composeIntent = composeIntent(context, composeOptions, account.id, apiNotification.id, account.id.toInt())\n\n        // make sure a new instance of MainActivity is started and old ones get destroyed\n        composeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)\n\n        return PendingIntent.getActivity(\n            context.applicationContext,\n            requestCode,\n            composeIntent,\n            pendingIntentFlags(false)\n        )\n    }\n\n    private fun pendingIntentFlags(mutable: Boolean): Int {\n        return if (mutable) {\n            PendingIntent.FLAG_UPDATE_CURRENT or (if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) PendingIntent.FLAG_MUTABLE else 0)\n        } else {\n            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE\n        }\n    }\n\n    suspend fun disableAllNotifications() {\n        disablePushNotificationsForAllAccounts()\n        disablePullNotifications()\n    }\n\n    suspend fun disableNotificationsForAccount(account: AccountEntity) {\n        disablePushNotificationsForAccount(account)\n\n        deleteNotificationChannelsForAccount(account)\n\n        if (!areNotificationsEnabledBySystem()) {\n            // TODO this is sort of a hack, it means: are there now no active accounts?\n\n            disablePullNotifications()\n        }\n    }\n\n    //\n    // Push notification section\n    //\n\n    fun arePushNotificationsAvailable(): Boolean =\n        UnifiedPush.getDistributors(context).isNotEmpty()\n\n    private suspend fun setupPushNotifications(activity: Activity) {\n        accountManager.accounts.forEach {\n            val notificationGroupEnabled = Build.VERSION.SDK_INT < 28 ||\n                notificationManager.getNotificationChannelGroup(it.identifier)?.isBlocked == false\n            val shouldEnable = it.notificationsEnabled && notificationGroupEnabled\n\n            if (shouldEnable) {\n                setupPushNotificationsForAccount(activity, it)\n                Log.d(TAG, \"Enabled push notifications for account ${it.id}.\")\n            } else {\n                disablePushNotificationsForAccount(it)\n                Log.d(TAG, \"Disabled push notifications for account ${it.id}.\")\n            }\n        }\n    }\n\n    private suspend fun setupPushNotificationsForAccount(activity: Activity, account: AccountEntity) {\n        val currentSubscription = getActiveSubscription(account)\n\n        if (currentSubscription != null) {\n            val alertData = buildAlertsMap(account)\n\n            if (alertData != currentSubscription.alerts) {\n                // Update the subscription to match notification settings\n                updatePushSubscription(account)\n            } else {\n                Log.d(TAG, \"Nothing to be done. Current push subscription matches for account ${account.id}.\")\n            }\n        } else {\n            Log.d(TAG, \"Trying to create a UnifiedPush subscription for account ${account.id}\")\n\n            // When changing the local UP distributor this is necessary first to enable the following callbacks (i. e. onNewEndpoint);\n            //   make sure this is done in any inconsistent case (is not too often and doesn't hurt).\n            unregisterPushEndpoint(account)\n\n            UnifiedPush.registerAppWithDialog(activity, account.id.toString(), features = arrayListOf(UnifiedPush.FEATURE_BYTES_MESSAGE))\n            // Will lead to call of registerPushEndpoint()\n        }\n    }\n\n    private fun resetPushWhenDistributorIsMissing() {\n        val lastUsedPushProvider = preferences.getString(PrefKeys.LAST_USED_PUSH_PROVDER, null)\n        // NOTE UnifiedPush.getSavedDistributor() cannot be used here as that is already null here if the\n        //   distributor was uninstalled.\n\n        if (lastUsedPushProvider.isNullOrEmpty() || UnifiedPush.getDistributors(context).contains(lastUsedPushProvider)) {\n            return\n        }\n\n        Log.w(TAG, \"Previous push provider ($lastUsedPushProvider) uninstalled. Resetting all accounts.\")\n\n        preferences.edit {\n            remove(PrefKeys.LAST_USED_PUSH_PROVDER)\n        }\n\n        applicationScope.launch {\n            accountManager.accounts.forEach {\n                // reset all accounts, also does resetPushSettingsInAccount()\n                unregisterPushEndpoint(it)\n            }\n        }\n    }\n\n    private suspend fun getActiveSubscription(account: AccountEntity): NotificationSubscribeResult? {\n        api.pushNotificationSubscription(\n            \"Bearer ${account.accessToken}\",\n            account.domain\n        ).fold(\n            onSuccess = {\n                if (!account.matchesPushSubscription(it.endpoint)) {\n                    Log.w(TAG, \"Server push endpoint does not match previously registered one: ${it.endpoint} vs. ${account.unifiedPushUrl}\")\n\n                    return null\n                }\n\n                return it\n            },\n            onFailure = { throwable ->\n                if (throwable is HttpException && throwable.code() == 404) {\n                    // this is alright; there is no subscription on the server\n                    return null\n                }\n\n                Log.e(TAG, \"Cannot get push subscription for account \" + account.id + \": \" + throwable.message, throwable)\n                return null\n            }\n        )\n    }\n\n    private suspend fun disablePushNotificationsForAllAccounts() {\n        accountManager.accounts.forEach {\n            disablePushNotificationsForAccount(it)\n        }\n    }\n\n    private suspend fun disablePushNotificationsForAccount(account: AccountEntity) {\n        if (!account.isPushNotificationsEnabled()) {\n            return\n        }\n\n        unregisterPushEndpoint(account)\n\n        // this probably does nothing (distributor to handle this is missing)\n        UnifiedPush.unregisterApp(context, account.id.toString())\n    }\n\n    fun fetchNotificationsOnPushMessage(account: AccountEntity) {\n        // TODO should there be a rate limit here? Ie. we could be silent (can we?) for another notification in a short timeframe.\n\n        Log.d(TAG, \"Fetching notifications because of push for account ${account.id}\")\n\n        enqueueOneTimeWorker(account)\n    }\n\n    private fun buildAlertsMap(account: AccountEntity): Map<String, Boolean> =\n        buildMap {\n            visibleNotificationTypes.forEach {\n                put(it.name, filterNotification(account, it))\n            }\n        }\n\n    private fun buildAlertSubscriptionData(account: AccountEntity): Map<String, Boolean> =\n        buildAlertsMap(account).mapKeys { \"data[alerts][${it.key}]\" }\n\n    // Called by UnifiedPush callback in UnifiedPushBroadcastReceiver\n    suspend fun registerPushEndpoint(\n        account: AccountEntity,\n        endpoint: String\n    ) = withContext(Dispatchers.IO) {\n        // Generate a prime256v1 key pair for WebPush\n        // Decryption is unimplemented for now, since Mastodon uses an old WebPush\n        // standard which does not send needed information for decryption in the payload\n        // This makes it not directly compatible with UnifiedPush\n        // As of now, we use it purely as a way to trigger a pull\n        val keyPair = CryptoUtil.generateECKeyPair(CryptoUtil.CURVE_PRIME256_V1)\n        val auth = CryptoUtil.secureRandomBytesEncoded(16)\n\n        api.subscribePushNotifications(\n            \"Bearer ${account.accessToken}\",\n            account.domain,\n            endpoint,\n            keyPair.pubkey,\n            auth,\n            buildAlertSubscriptionData(account)\n        ).onFailure { throwable ->\n            Log.w(TAG, \"Error setting push endpoint for account ${account.id}\", throwable)\n            disablePushNotificationsForAccount(account)\n        }.onSuccess {\n            Log.d(TAG, \"UnifiedPush registration succeeded for account ${account.id}\")\n\n            accountManager.updateAccount(account) {\n                copy(\n                    pushPubKey = keyPair.pubkey,\n                    pushPrivKey = keyPair.privKey,\n                    pushAuth = auth,\n                    pushServerKey = it.serverKey,\n                    unifiedPushUrl = endpoint\n                )\n            }\n\n            UnifiedPush.getAckDistributor(context)?.let {\n                Log.d(TAG, \"Saving distributor to preferences: $it\")\n\n                preferences.edit {\n                    putString(PrefKeys.LAST_USED_PUSH_PROVDER, it)\n                }\n\n                // TODO once this is selected it cannot be changed (except by wiping the application or uninstalling the provider)\n            }\n        }\n    }\n\n    // Synchronize the enabled / disabled state of notifications with server-side subscription (also NotificationBlockStateBroadcastReceiver).\n    suspend fun updatePushSubscription(account: AccountEntity) {\n        withContext(Dispatchers.IO) {\n            api.updatePushNotificationSubscription(\n                \"Bearer ${account.accessToken}\",\n                account.domain,\n                buildAlertSubscriptionData(account)\n            ).onSuccess {\n                Log.d(TAG, \"UnifiedPush subscription updated for account ${account.id}\")\n                accountManager.updateAccount(account) {\n                    copy(pushServerKey = it.serverKey)\n                }\n            }.onFailure { throwable ->\n                Log.e(TAG, \"Could not update subscription ${throwable.message}\")\n            }\n        }\n    }\n\n    suspend fun unregisterPushEndpoint(account: AccountEntity) {\n        withContext(Dispatchers.IO) {\n            api.unsubscribePushNotifications(\"Bearer ${account.accessToken}\", account.domain)\n                .onFailure { throwable ->\n                    Log.w(TAG, \"Error unregistering push endpoint for account \" + account.id, throwable)\n                }\n                .onSuccess {\n                    Log.d(TAG, \"UnifiedPush unregistration succeeded for account \" + account.id)\n                    resetPushSettingsInAccount(account)\n                }\n        }\n    }\n\n    private suspend fun resetPushSettingsInAccount(account: AccountEntity) {\n        accountManager.updateAccount(account) {\n            copy(\n                pushPubKey = \"\",\n                pushPrivKey = \"\",\n                pushAuth = \"\",\n                pushServerKey = \"\",\n                unifiedPushUrl = \"\"\n            )\n        }\n    }\n\n    companion object {\n        const val TAG = \"NotificationService\"\n\n        const val KEY_CITED_STATUS_ID: String = \"KEY_CITED_STATUS_ID\"\n        const val KEY_MENTIONS: String = \"KEY_MENTIONS\"\n        const val KEY_REPLY: String = \"KEY_REPLY\"\n        const val KEY_SENDER_ACCOUNT_FULL_NAME: String = \"KEY_SENDER_ACCOUNT_FULL_NAME\"\n        const val KEY_SENDER_ACCOUNT_ID: String = \"KEY_SENDER_ACCOUNT_ID\"\n        const val KEY_SENDER_ACCOUNT_IDENTIFIER: String = \"KEY_SENDER_ACCOUNT_IDENTIFIER\"\n        const val KEY_SERVER_NOTIFICATION_ID: String = \"KEY_SERVER_NOTIFICATION_ID\"\n        const val KEY_SPOILER: String = \"KEY_SPOILER\"\n        const val KEY_VISIBILITY: String = \"KEY_VISIBILITY\"\n        const val NOTIFICATION_ID_FETCH_NOTIFICATION: Int = 0\n        const val NOTIFICATION_ID_PRUNE_CACHE: Int = 1\n        const val REPLY_ACTION: String = \"REPLY_ACTION\"\n\n        private const val CHANNEL_BACKGROUND_TASKS: String = \"CHANNEL_BACKGROUND_TASKS\"\n        private const val EXTRA_ACCOUNT_NAME = BuildConfig.APPLICATION_ID + \".notification.extra.account_name\"\n        private const val EXTRA_NOTIFICATION_TYPE = BuildConfig.APPLICATION_ID + \".notification.extra.notification_type\"\n        private const val GROUP_SUMMARY_TAG = BuildConfig.APPLICATION_ID + \".notification.group_summary\"\n        private const val NOTIFICATION_PULL_NAME = \"pullNotifications\"\n\n        private val numberFormat = NumberFormat.getNumberInstance()\n\n        fun severedRelationShipText(\n            context: Context,\n            event: RelationshipSeveranceEvent,\n            instanceName: String\n        ): String {\n            return when (event.type) {\n                RelationshipSeveranceEvent.Type.DOMAIN_BLOCK -> {\n                    val followers = numberFormat.format(event.followersCount)\n                    val following = numberFormat.format(event.followingCount)\n                    val followingText = context.resources.getQuantityString(R.plurals.accounts, event.followingCount, following)\n                    context.getString(R.string.relationship_severance_event_domain_block, instanceName, event.targetName, followers, followingText)\n                }\n\n                RelationshipSeveranceEvent.Type.USER_DOMAIN_BLOCK -> {\n                    val followers = numberFormat.format(event.followersCount)\n                    val following = numberFormat.format(event.followingCount)\n                    val followingText = context.resources.getQuantityString(R.plurals.accounts, event.followingCount, following)\n                    context.getString(R.string.relationship_severance_event_user_domain_block, event.targetName, followers, followingText)\n                }\n\n                RelationshipSeveranceEvent.Type.ACCOUNT_SUSPENSION -> {\n                    context.getString(R.string.relationship_severance_event_account_suspension, instanceName, event.targetName)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelineFragment.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.timeline\n\nimport android.content.SharedPreferences\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.accessibility.AccessibilityManager\nimport androidx.core.content.getSystemService\nimport androidx.core.view.MenuProvider\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.lifecycle.lifecycleScope\nimport androidx.paging.LoadState\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.SimpleItemAnimator\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener\nimport at.connyduck.calladapter.networkresult.onFailure\nimport at.connyduck.sparkbutton.SparkButton\nimport at.connyduck.sparkbutton.helpers.Utils\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.PreferenceChangedEvent\nimport com.keylesspalace.tusky.appstore.StatusComposedEvent\nimport com.keylesspalace.tusky.components.accountlist.AccountListActivity\nimport com.keylesspalace.tusky.components.accountlist.AccountListActivity.Companion.newIntent\nimport com.keylesspalace.tusky.components.preference.PreferencesFragment.ReadingOrder\nimport com.keylesspalace.tusky.components.timeline.viewmodel.CachedTimelineViewModel\nimport com.keylesspalace.tusky.components.timeline.viewmodel.NetworkTimelineViewModel\nimport com.keylesspalace.tusky.components.timeline.viewmodel.TimelineViewModel\nimport com.keylesspalace.tusky.databinding.FragmentTimelineBinding\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.fragment.SFragment\nimport com.keylesspalace.tusky.interfaces.ActionButtonActivity\nimport com.keylesspalace.tusky.interfaces.RefreshableFragment\nimport com.keylesspalace.tusky.interfaces.ReselectableFragment\nimport com.keylesspalace.tusky.interfaces.StatusActionListener\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.util.CardViewMode\nimport com.keylesspalace.tusky.util.ListStatusAccessibilityDelegate\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.util.ensureBottomPadding\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport com.keylesspalace.tusky.util.unsafeLazy\nimport com.keylesspalace.tusky.util.updateRelativeTimePeriodically\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.view.ConfirmationBottomSheet.Companion.confirmFavourite\nimport com.keylesspalace.tusky.view.ConfirmationBottomSheet.Companion.confirmReblog\nimport com.keylesspalace.tusky.viewdata.AttachmentViewData\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport com.keylesspalace.tusky.viewdata.TranslationViewData\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass TimelineFragment :\n    SFragment(R.layout.fragment_timeline),\n    OnRefreshListener,\n    StatusActionListener,\n    ReselectableFragment,\n    RefreshableFragment,\n    MenuProvider {\n\n    @Inject\n    lateinit var eventHub: EventHub\n\n    @Inject\n    lateinit var preferences: SharedPreferences\n\n    private val viewModel: TimelineViewModel by unsafeLazy {\n        val viewModelProvider = ViewModelProvider(viewModelStore, defaultViewModelProviderFactory, defaultViewModelCreationExtras)\n        if (kind == TimelineViewModel.Kind.HOME) {\n            viewModelProvider[CachedTimelineViewModel::class.java]\n        } else {\n            viewModelProvider[NetworkTimelineViewModel::class.java]\n        }\n    }\n\n    private val binding by viewBinding(FragmentTimelineBinding::bind)\n\n    private lateinit var kind: TimelineViewModel.Kind\n\n    private var adapter: TimelinePagingAdapter? = null\n\n    private var isSwipeToRefreshEnabled = true\n\n    /**\n     * Adapter position of the placeholder that was most recently clicked to \"Load more\". If null\n     * then there is no active \"Load more\" operation\n     */\n    private var loadMorePosition: Int? = null\n\n    /** ID of the status immediately below the most recent \"Load more\" placeholder click */\n    // The Paging library assumes that the user will be scrolling down a list of items,\n    // and if new items are loaded but not visible then it's reasonable to scroll to the top\n    // of the inserted items. It does not seem to be possible to disable that behaviour.\n    //\n    // That behaviour should depend on the user's preferred reading order. If they prefer to\n    // read oldest first then the list should be scrolled to the bottom of the freshly\n    // inserted statuses.\n    //\n    // To do this:\n    //\n    // 1. When \"Load more\" is clicked (onLoadMore()):\n    //    a. Remember the adapter position of the \"Load more\" item in loadMorePosition\n    //    b. Remember the ID of the status immediately below the \"Load more\" item in\n    //       statusIdBelowLoadMore\n    // 2. After the new items have been inserted, search the adapter for the position of the\n    //    status with id == statusIdBelowLoadMore.\n    // 3. If this position is still visible on screen then do nothing, otherwise, scroll the view\n    //    so that the status is visible.\n    //\n    // The user can then scroll up to read the new statuses.\n    private var statusIdBelowLoadMore: String? = null\n\n    /** The user's preferred reading order */\n    private lateinit var readingOrder: ReadingOrder\n\n    private var buttonToAnimate: SparkButton? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        val arguments = requireArguments()\n        kind = TimelineViewModel.Kind.valueOf(arguments.getString(KIND_ARG)!!)\n        val id: String? = if (kind == TimelineViewModel.Kind.USER ||\n            kind == TimelineViewModel.Kind.USER_PINNED ||\n            kind == TimelineViewModel.Kind.USER_WITH_REPLIES ||\n            kind == TimelineViewModel.Kind.LIST\n        ) {\n            arguments.getString(ID_ARG)!!\n        } else {\n            null\n        }\n\n        val tags = if (kind == TimelineViewModel.Kind.TAG) {\n            arguments.getStringArrayList(HASHTAGS_ARG)!!\n        } else {\n            listOf()\n        }\n        viewModel.init(\n            kind,\n            id,\n            tags\n        )\n\n        isSwipeToRefreshEnabled = arguments.getBoolean(ARG_ENABLE_SWIPE_TO_REFRESH, true)\n\n        readingOrder = ReadingOrder.from(preferences.getString(PrefKeys.READING_ORDER, null))\n    }\n\n    private fun createAdapter(): TimelinePagingAdapter {\n        val statusDisplayOptions = StatusDisplayOptions(\n            animateAvatars = preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false),\n            mediaPreviewEnabled = accountManager.activeAccount!!.mediaPreviewEnabled,\n            useAbsoluteTime = preferences.getBoolean(PrefKeys.ABSOLUTE_TIME_VIEW, false),\n            showBotOverlay = preferences.getBoolean(PrefKeys.SHOW_BOT_OVERLAY, true),\n            useBlurhash = preferences.getBoolean(PrefKeys.USE_BLURHASH, true),\n            cardViewMode = if (preferences.getBoolean(\n                    PrefKeys.SHOW_CARDS_IN_TIMELINES,\n                    false\n                )\n            ) {\n                CardViewMode.INDENTED\n            } else {\n                CardViewMode.NONE\n            },\n            hideStats = preferences.getBoolean(PrefKeys.WELLBEING_HIDE_STATS_POSTS, false),\n            animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false),\n            showStatsInline = preferences.getBoolean(PrefKeys.SHOW_STATS_INLINE, false),\n            showSensitiveMedia = accountManager.activeAccount!!.alwaysShowSensitiveMedia,\n            openSpoiler = accountManager.activeAccount!!.alwaysOpenSpoiler\n        )\n        return TimelinePagingAdapter(\n            statusDisplayOptions,\n            this\n        )\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED)\n\n        val adapter = createAdapter()\n        this.adapter = adapter\n\n        setupSwipeRefreshLayout()\n        setupRecyclerView(adapter)\n\n        adapter.addLoadStateListener { loadState ->\n            if (loadState.refresh != LoadState.Loading && loadState.source.refresh != LoadState.Loading) {\n                binding.swipeRefreshLayout.isRefreshing = false\n            }\n\n            binding.statusView.hide()\n            binding.progressBar.hide()\n\n            if (adapter.itemCount == 0) {\n                when (loadState.refresh) {\n                    is LoadState.NotLoading -> {\n                        if (loadState.append is LoadState.NotLoading && loadState.source.refresh is LoadState.NotLoading) {\n                            binding.statusView.show()\n                            binding.statusView.setup(\n                                R.drawable.elephant_friend_empty,\n                                R.string.message_empty\n                            )\n                            if (kind == TimelineViewModel.Kind.HOME) {\n                                binding.statusView.showHelp(R.string.help_empty_home)\n                            }\n                        }\n                    }\n\n                    is LoadState.Error -> {\n                        binding.statusView.show()\n                        binding.statusView.setup(\n                            (loadState.refresh as LoadState.Error).error\n                        ) { onRefresh() }\n                    }\n\n                    is LoadState.Loading -> {\n                        binding.progressBar.show()\n                    }\n                }\n            }\n        }\n\n        adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {\n            override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {\n                val firstPos = (binding.recyclerView.layoutManager as LinearLayoutManager).findFirstCompletelyVisibleItemPosition()\n                if (firstPos == 0 && positionStart == 0 && adapter.itemCount != itemCount) {\n                    binding.recyclerView.post {\n                        if (getView() != null) {\n                            if (isSwipeToRefreshEnabled) {\n                                binding.recyclerView.scrollBy(\n                                    0,\n                                    Utils.dpToPx(requireContext(), -30)\n                                )\n                            } else {\n                                binding.recyclerView.scrollToPosition(0)\n                            }\n                        }\n                    }\n                    // we loaded new posts at the top - no need to handle \"load more\" anymore\n                    loadMorePosition = null\n                }\n                if (readingOrder == ReadingOrder.OLDEST_FIRST) {\n                    updateReadingPositionForOldestFirst(adapter)\n                }\n            }\n        })\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.statuses.collectLatest { pagingData ->\n                adapter.submitData(pagingData)\n            }\n        }\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            eventHub.events.collect { event ->\n                when (event) {\n                    is PreferenceChangedEvent -> {\n                        onPreferenceChanged(adapter, event.preferenceKey)\n                    }\n\n                    is StatusComposedEvent -> {\n                        val status = event.status\n                        handleStatusComposeEvent(adapter, status)\n                    }\n                }\n            }\n        }\n\n        updateRelativeTimePeriodically(preferences, adapter)\n    }\n\n    override fun onDestroyView() {\n        // Clear the adapter to prevent leaking the View\n        adapter = null\n        buttonToAnimate = null\n        super.onDestroyView()\n    }\n\n    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n        if (isSwipeToRefreshEnabled) {\n            menuInflater.inflate(R.menu.fragment_timeline, menu)\n        }\n    }\n\n    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {\n        return when (menuItem.itemId) {\n            R.id.action_refresh -> {\n                if (isSwipeToRefreshEnabled) {\n                    binding.swipeRefreshLayout.isRefreshing = true\n\n                    refreshContent()\n                    true\n                } else {\n                    false\n                }\n            }\n\n            else -> false\n        }\n    }\n\n    /**\n     * Set the correct reading position in the timeline after the user clicked \"Load more\",\n     * assuming the reading position should be below the freshly-loaded statuses.\n     */\n    // Note: The positionStart parameter to onItemRangeInserted() does not always\n    // match the adapter position where data was inserted (which is why loadMorePosition\n    // is tracked manually, see this bug report for another example:\n    // https://github.com/android/architecture-components-samples/issues/726).\n    private fun updateReadingPositionForOldestFirst(adapter: TimelinePagingAdapter) {\n        var position = loadMorePosition ?: return\n        val statusIdBelowLoadMore = statusIdBelowLoadMore ?: return\n\n        var status: StatusViewData?\n        while (adapter.peek(position).let {\n                status = it\n                it != null\n            }\n        ) {\n            if (status?.id == statusIdBelowLoadMore) {\n                val lastVisiblePosition =\n                    (binding.recyclerView.layoutManager as LinearLayoutManager).findLastVisibleItemPosition()\n                if (position > lastVisiblePosition) {\n                    binding.recyclerView.scrollToPosition(position)\n                }\n                break\n            }\n            position++\n        }\n        loadMorePosition = null\n    }\n\n    private fun setupSwipeRefreshLayout() {\n        binding.swipeRefreshLayout.isEnabled = isSwipeToRefreshEnabled\n        binding.swipeRefreshLayout.setOnRefreshListener(this)\n    }\n\n    private fun setupRecyclerView(adapter: TimelinePagingAdapter) {\n        val hasFab = (activity as? ActionButtonActivity?)?.actionButton != null\n        binding.recyclerView.ensureBottomPadding(fab = hasFab)\n\n        binding.recyclerView.setAccessibilityDelegateCompat(\n            ListStatusAccessibilityDelegate(binding.recyclerView, this) { pos ->\n                if (pos in 0 until adapter.itemCount) {\n                    adapter.peek(pos)\n                } else {\n                    null\n                }\n            }\n        )\n        binding.recyclerView.layoutManager = LinearLayoutManager(context)\n\n        val divider = DividerItemDecoration(context, RecyclerView.VERTICAL)\n        binding.recyclerView.addItemDecoration(divider)\n\n        // CWs are expanded without animation, buttons animate itself, we don't need it basically\n        (binding.recyclerView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false\n        binding.recyclerView.adapter = adapter\n    }\n\n    override fun onRefresh() {\n        binding.statusView.hide()\n\n        adapter?.refresh()\n    }\n\n    override val onMoreTranslate =\n        { translate: Boolean, position: Int ->\n            if (translate) {\n                onTranslate(position)\n            } else {\n                onUntranslate(\n                    position\n                )\n            }\n        }\n\n    override fun onReply(position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        super.reply(status.status)\n    }\n\n    override fun onReblog(reblog: Boolean, position: Int, visibility: Status.Visibility?, button: SparkButton?) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        buttonToAnimate = button\n\n        if (reblog && visibility == null) {\n            confirmReblog(preferences) { visibility ->\n                viewModel.reblog(true, status, visibility)\n                buttonToAnimate?.playAnimation()\n                buttonToAnimate?.isChecked = true\n            }\n        } else {\n            viewModel.reblog(reblog, status, visibility ?: Status.Visibility.PUBLIC)\n            if (reblog) {\n                buttonToAnimate?.playAnimation()\n            }\n            buttonToAnimate?.isChecked = reblog\n        }\n    }\n\n    private fun onTranslate(position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.translate(status)\n                .onFailure {\n                    Snackbar.make(\n                        requireView(),\n                        getString(R.string.ui_error_translate, it.message),\n                        Snackbar.LENGTH_LONG\n                    ).show()\n                }\n        }\n    }\n\n    override fun onUntranslate(position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.untranslate(status)\n    }\n\n    override fun onFavourite(favourite: Boolean, position: Int, button: SparkButton?) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        buttonToAnimate = button\n\n        if (favourite) {\n            confirmFavourite(preferences) {\n                viewModel.favorite(true, status)\n                buttonToAnimate?.playAnimation()\n                buttonToAnimate?.isChecked = true\n            }\n        } else {\n            viewModel.favorite(false, status)\n        }\n    }\n\n    override fun onBookmark(bookmark: Boolean, position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.bookmark(bookmark, status)\n    }\n\n    override fun onVoteInPoll(position: Int, choices: List<Int>) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.voteInPoll(choices, status)\n    }\n\n    override fun onShowPollResults(position: Int) {\n        adapter?.peek(position)?.asStatusOrNull()?.let { status ->\n            viewModel.showPollResults(status)\n        }\n    }\n\n    override fun clearWarningAction(position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.clearWarning(status)\n    }\n\n    override fun onMore(view: View, position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        super.more(\n            status.status,\n            view,\n            position,\n            (status.translation as? TranslationViewData.Loaded)?.data\n        )\n    }\n\n    override fun onOpenReblog(position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        super.openReblog(status.status)\n    }\n\n    override fun onExpandedChange(expanded: Boolean, position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.changeExpanded(expanded, status)\n    }\n\n    override fun onContentHiddenChange(isShowing: Boolean, position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.changeContentShowing(isShowing, status)\n    }\n\n    override fun onShowReblogs(position: Int) {\n        val statusId = adapter?.peek(position)?.asStatusOrNull()?.id ?: return\n        val intent = newIntent(requireContext(), AccountListActivity.Type.REBLOGGED, statusId)\n        activity?.startActivityWithSlideInAnimation(intent)\n    }\n\n    override fun onShowFavs(position: Int) {\n        val statusId = adapter?.peek(position)?.asStatusOrNull()?.id ?: return\n        val intent = newIntent(requireContext(), AccountListActivity.Type.FAVOURITED, statusId)\n        activity?.startActivityWithSlideInAnimation(intent)\n    }\n\n    override fun onLoadMore(position: Int) {\n        val adapter = this.adapter\n        val placeholder = adapter?.peek(position)?.asPlaceholderOrNull() ?: return\n        loadMorePosition = position\n        statusIdBelowLoadMore =\n            if (position + 1 < adapter.itemCount) adapter.peek(position + 1)?.id else null\n        viewModel.loadMore(placeholder.id)\n    }\n\n    override fun onContentCollapsedChange(isCollapsed: Boolean, position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.changeContentCollapsed(isCollapsed, status)\n    }\n\n    override fun onViewMedia(position: Int, attachmentIndex: Int, view: View?) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        super.viewMedia(\n            attachmentIndex,\n            AttachmentViewData.list(status),\n            view\n        )\n    }\n\n    override fun onViewThread(position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        super.viewThread(status.actionable.id, status.actionable.url)\n    }\n\n    override fun onViewTag(tag: String) {\n        if (viewModel.kind == TimelineViewModel.Kind.TAG && viewModel.tags.size == 1 &&\n            viewModel.tags.contains(tag)\n        ) {\n            // If already viewing a tag page, then ignore any request to view that tag again.\n            return\n        }\n        super.viewTag(tag)\n    }\n\n    override fun onViewAccount(id: String) {\n        if ((\n                viewModel.kind == TimelineViewModel.Kind.USER ||\n                    viewModel.kind == TimelineViewModel.Kind.USER_WITH_REPLIES\n                ) &&\n            viewModel.id == id\n        ) {\n            /* If already viewing an account page, then any requests to view that account page\n             * should be ignored. */\n            return\n        }\n        super.viewAccount(id)\n    }\n\n    private fun onPreferenceChanged(adapter: TimelinePagingAdapter, key: String) {\n        when (key) {\n            PrefKeys.MEDIA_PREVIEW_ENABLED -> {\n                val enabled = accountManager.activeAccount!!.mediaPreviewEnabled\n                val oldMediaPreviewEnabled = adapter.mediaPreviewEnabled\n                if (enabled != oldMediaPreviewEnabled) {\n                    adapter.mediaPreviewEnabled = enabled\n                    adapter.notifyItemRangeChanged(0, adapter.itemCount)\n                }\n            }\n\n            PrefKeys.READING_ORDER -> {\n                readingOrder = ReadingOrder.from(\n                    preferences.getString(PrefKeys.READING_ORDER, null)\n                )\n            }\n        }\n    }\n\n    private fun handleStatusComposeEvent(adapter: TimelinePagingAdapter, status: Status) {\n        when (kind) {\n            TimelineViewModel.Kind.HOME,\n            TimelineViewModel.Kind.PUBLIC_FEDERATED,\n            TimelineViewModel.Kind.PUBLIC_LOCAL,\n            TimelineViewModel.Kind.PUBLIC_TRENDING_STATUSES -> adapter.refresh()\n\n            TimelineViewModel.Kind.USER,\n            TimelineViewModel.Kind.USER_WITH_REPLIES -> if (status.account.id == viewModel.id) {\n                adapter.refresh()\n            }\n\n            TimelineViewModel.Kind.TAG,\n            TimelineViewModel.Kind.FAVOURITES,\n            TimelineViewModel.Kind.LIST,\n            TimelineViewModel.Kind.BOOKMARKS,\n            TimelineViewModel.Kind.USER_PINNED -> return\n        }\n    }\n\n    public override fun removeItem(position: Int) {\n        val status = adapter?.peek(position)?.asStatusOrNull() ?: return\n        viewModel.removeStatusWithId(status.id)\n    }\n\n    private var talkBackWasEnabled = false\n\n    override fun onPause() {\n        super.onPause()\n        (binding.recyclerView.layoutManager as? LinearLayoutManager)?.findFirstVisibleItemPosition()\n            ?.let { position ->\n                if (position != RecyclerView.NO_POSITION) {\n                    adapter?.snapshot()?.getOrNull(position)?.id?.let { statusId ->\n                        viewModel.saveReadingPosition(statusId)\n                    }\n                }\n            }\n    }\n\n    override fun onResume() {\n        super.onResume()\n        val a11yManager = requireContext().getSystemService<AccessibilityManager>()\n\n        val wasEnabled = talkBackWasEnabled\n        talkBackWasEnabled = a11yManager?.isEnabled == true\n        Log.d(TAG, \"talkback was enabled: $wasEnabled, now $talkBackWasEnabled\")\n        if (talkBackWasEnabled && !wasEnabled) {\n            val adapter = requireNotNull(this.adapter)\n            adapter.notifyItemRangeChanged(0, adapter.itemCount)\n        }\n    }\n\n    override fun onReselect() {\n        if (view != null) {\n            binding.recyclerView.layoutManager?.scrollToPosition(0)\n            binding.recyclerView.stopScroll()\n        }\n    }\n\n    override fun refreshContent() {\n        onRefresh()\n    }\n\n    companion object {\n        private const val TAG = \"TimelineF\" // logging tag\n        private const val KIND_ARG = \"kind\"\n        private const val ID_ARG = \"id\"\n        private const val HASHTAGS_ARG = \"hashtags\"\n        private const val ARG_ENABLE_SWIPE_TO_REFRESH = \"enableSwipeToRefresh\"\n\n        fun newInstance(\n            kind: TimelineViewModel.Kind,\n            hashtagOrId: String? = null,\n            enableSwipeToRefresh: Boolean = true\n        ): TimelineFragment {\n            val fragment = TimelineFragment()\n            val arguments = Bundle(3)\n            arguments.putString(KIND_ARG, kind.name)\n            arguments.putString(ID_ARG, hashtagOrId)\n            arguments.putBoolean(ARG_ENABLE_SWIPE_TO_REFRESH, enableSwipeToRefresh)\n            fragment.arguments = arguments\n            return fragment\n        }\n\n        @JvmStatic\n        fun newHashtagInstance(hashtags: List<String>): TimelineFragment {\n            val fragment = TimelineFragment()\n            val arguments = Bundle(3)\n            arguments.putString(KIND_ARG, TimelineViewModel.Kind.TAG.name)\n            arguments.putStringArrayList(HASHTAGS_ARG, ArrayList(hashtags))\n            arguments.putBoolean(ARG_ENABLE_SWIPE_TO_REFRESH, true)\n            fragment.arguments = arguments\n            return fragment\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelinePagingAdapter.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.timeline\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.paging.PagingDataAdapter\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.adapter.FilteredStatusViewHolder\nimport com.keylesspalace.tusky.adapter.LoadMoreViewHolder\nimport com.keylesspalace.tusky.adapter.PlaceholderViewHolder\nimport com.keylesspalace.tusky.adapter.StatusBaseViewHolder\nimport com.keylesspalace.tusky.adapter.StatusViewHolder\nimport com.keylesspalace.tusky.databinding.ItemLoadMoreBinding\nimport com.keylesspalace.tusky.databinding.ItemPlaceholderBinding\nimport com.keylesspalace.tusky.databinding.ItemStatusFilteredBinding\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.interfaces.StatusActionListener\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.viewdata.StatusViewData\n\nclass TimelinePagingAdapter(\n    private var statusDisplayOptions: StatusDisplayOptions,\n    private val statusListener: StatusActionListener\n) : PagingDataAdapter<StatusViewData, RecyclerView.ViewHolder>(TimelineDifferCallback) {\n\n    var mediaPreviewEnabled: Boolean\n        get() = statusDisplayOptions.mediaPreviewEnabled\n        set(mediaPreviewEnabled) {\n            statusDisplayOptions = statusDisplayOptions.copy(\n                mediaPreviewEnabled = mediaPreviewEnabled\n            )\n        }\n\n    init {\n        stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {\n        val inflater = LayoutInflater.from(parent.context)\n        return when (viewType) {\n            VIEW_TYPE_PLACEHOLDER -> {\n                PlaceholderViewHolder(\n                    ItemPlaceholderBinding.inflate(inflater, parent, false),\n                    mode = PlaceholderViewHolder.Mode.STATUS\n                )\n            }\n            VIEW_TYPE_STATUS_FILTERED -> {\n                FilteredStatusViewHolder(\n                    ItemStatusFilteredBinding.inflate(inflater, parent, false),\n                    statusListener\n                )\n            }\n            VIEW_TYPE_LOAD_MORE -> {\n                LoadMoreViewHolder(\n                    ItemLoadMoreBinding.inflate(inflater, parent, false),\n                    statusListener\n                )\n            }\n            else -> {\n                StatusViewHolder(inflater.inflate(R.layout.item_status, parent, false))\n            }\n        }\n    }\n\n    override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) {\n        onBindViewHolder(viewHolder, position, emptyList())\n    }\n\n    override fun onBindViewHolder(\n        viewHolder: RecyclerView.ViewHolder,\n        position: Int,\n        payloads: List<Any>\n    ) {\n        val viewData = getItem(position)\n        if (viewData is StatusViewData.LoadMore) {\n            val holder = viewHolder as LoadMoreViewHolder\n            holder.setup(viewData.isLoading)\n        } else if (viewData is StatusViewData.Concrete) {\n            if (viewData.filter?.action == Filter.Action.WARN) {\n                val holder = viewHolder as FilteredStatusViewHolder\n                holder.bind(viewData)\n            } else {\n                val holder = viewHolder as StatusViewHolder\n                holder.setupWithStatus(\n                    viewData,\n                    statusListener,\n                    statusDisplayOptions,\n                    payloads,\n                    true\n                )\n            }\n        }\n    }\n\n    override fun getItemViewType(position: Int): Int {\n        val viewData = getItem(position)\n        return when {\n            viewData == null -> VIEW_TYPE_PLACEHOLDER\n            viewData is StatusViewData.LoadMore -> VIEW_TYPE_LOAD_MORE\n            viewData.filter?.action == Filter.Action.WARN -> VIEW_TYPE_STATUS_FILTERED\n            else -> VIEW_TYPE_STATUS\n        }\n    }\n\n    companion object {\n        private const val VIEW_TYPE_PLACEHOLDER = 0\n        private const val VIEW_TYPE_STATUS = 1\n        private const val VIEW_TYPE_STATUS_FILTERED = 2\n        private const val VIEW_TYPE_LOAD_MORE = 3\n\n        private val TimelineDifferCallback = object : DiffUtil.ItemCallback<StatusViewData>() {\n            override fun areItemsTheSame(\n                oldItem: StatusViewData,\n                newItem: StatusViewData\n            ): Boolean {\n                return oldItem.id == newItem.id\n            }\n\n            override fun areContentsTheSame(\n                oldItem: StatusViewData,\n                newItem: StatusViewData\n            ): Boolean {\n                return false // Items are different always. It allows to refresh timestamp on every view holder update\n            }\n\n            override fun getChangePayload(oldItem: StatusViewData, newItem: StatusViewData): Any? {\n                return if (oldItem == newItem) {\n                    // If items are equal - update timestamp only\n                    StatusBaseViewHolder.Key.KEY_CREATED\n                } else {\n                    // If items are different - update the whole view holder\n                    null\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelineTypeMappers.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.timeline\n\nimport com.keylesspalace.tusky.db.entity.HomeTimelineData\nimport com.keylesspalace.tusky.db.entity.HomeTimelineEntity\nimport com.keylesspalace.tusky.db.entity.TimelineAccountEntity\nimport com.keylesspalace.tusky.db.entity.TimelineStatusEntity\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.entity.TimelineAccount\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport com.keylesspalace.tusky.viewdata.TranslationViewData\nimport java.util.Date\n\ndata class LoadMorePlaceholder(\n    val id: String,\n    val loading: Boolean\n)\n\nfun TimelineAccount.toEntity(tuskyAccountId: Long): TimelineAccountEntity {\n    return TimelineAccountEntity(\n        serverId = id,\n        tuskyAccountId = tuskyAccountId,\n        localUsername = localUsername,\n        username = username,\n        displayName = name,\n        url = url,\n        avatar = avatar,\n        emojis = emojis,\n        note = note,\n        bot = bot\n    )\n}\n\nfun TimelineAccountEntity.toAccount(): TimelineAccount {\n    return TimelineAccount(\n        id = serverId,\n        localUsername = localUsername,\n        username = username,\n        displayName = displayName,\n        note = note,\n        url = url,\n        avatar = avatar,\n        bot = bot,\n        emojis = emojis\n    )\n}\n\nfun LoadMorePlaceholder.toEntity(tuskyAccountId: Long): HomeTimelineEntity {\n    return HomeTimelineEntity(\n        id = this.id,\n        tuskyAccountId = tuskyAccountId,\n        statusId = null,\n        reblogAccountId = null,\n        loading = this.loading\n    )\n}\n\nfun Status.toEntity(\n    tuskyAccountId: Long,\n    expanded: Boolean,\n    contentShowing: Boolean,\n    contentCollapsed: Boolean\n) = TimelineStatusEntity(\n    serverId = id,\n    url = actionableStatus.url,\n    tuskyAccountId = tuskyAccountId,\n    authorServerId = actionableStatus.account.id,\n    inReplyToId = actionableStatus.inReplyToId,\n    inReplyToAccountId = actionableStatus.inReplyToAccountId,\n    content = actionableStatus.content,\n    createdAt = actionableStatus.createdAt.time,\n    editedAt = actionableStatus.editedAt?.time,\n    emojis = actionableStatus.emojis,\n    reblogsCount = actionableStatus.reblogsCount,\n    favouritesCount = actionableStatus.favouritesCount,\n    reblogged = actionableStatus.reblogged,\n    favourited = actionableStatus.favourited,\n    bookmarked = actionableStatus.bookmarked,\n    sensitive = actionableStatus.sensitive,\n    spoilerText = actionableStatus.spoilerText,\n    visibility = actionableStatus.visibility,\n    attachments = actionableStatus.attachments,\n    mentions = actionableStatus.mentions,\n    tags = actionableStatus.tags,\n    application = actionableStatus.application,\n    poll = actionableStatus.poll,\n    muted = actionableStatus.muted,\n    expanded = expanded,\n    contentShowing = contentShowing,\n    contentCollapsed = contentCollapsed,\n    pinned = actionableStatus.pinned,\n    card = actionableStatus.card,\n    repliesCount = actionableStatus.repliesCount,\n    language = actionableStatus.language,\n    filtered = actionableStatus.filtered.orEmpty()\n)\n\nfun TimelineStatusEntity.toStatus(\n    account: TimelineAccountEntity,\n) = Status(\n    id = serverId,\n    url = url,\n    account = account.toAccount(),\n    inReplyToId = inReplyToId,\n    inReplyToAccountId = inReplyToAccountId,\n    reblog = null,\n    content = content,\n    createdAt = Date(createdAt),\n    editedAt = editedAt?.let { Date(it) },\n    emojis = emojis,\n    reblogsCount = reblogsCount,\n    favouritesCount = favouritesCount,\n    reblogged = reblogged,\n    favourited = favourited,\n    bookmarked = bookmarked,\n    sensitive = sensitive,\n    spoilerText = spoilerText,\n    visibility = visibility,\n    attachments = attachments,\n    mentions = mentions,\n    tags = tags,\n    application = application,\n    pinned = false,\n    muted = muted,\n    poll = poll,\n    card = card,\n    repliesCount = repliesCount,\n    language = language,\n    filtered = filtered,\n)\n\nfun HomeTimelineData.toViewData(\n    isDetailed: Boolean = false,\n    translation: TranslationViewData? = null,\n): StatusViewData {\n    if (this.account == null || this.status == null) {\n        return StatusViewData.LoadMore(this.id, loading)\n    }\n\n    val originalStatus = status.toStatus(account)\n    val status = if (reblogAccount != null) {\n        Status(\n            id = id,\n            // no url for reblogs\n            url = null,\n            account = reblogAccount.toAccount(),\n            inReplyToId = status.inReplyToId,\n            inReplyToAccountId = status.inReplyToAccountId,\n            reblog = originalStatus,\n            content = status.content,\n            // lie but whatever?\n            createdAt = Date(status.createdAt),\n            editedAt = null,\n            emojis = emptyList(),\n            reblogsCount = status.reblogsCount,\n            favouritesCount = status.favouritesCount,\n            reblogged = status.reblogged,\n            favourited = status.favourited,\n            bookmarked = status.bookmarked,\n            sensitive = status.sensitive,\n            spoilerText = status.spoilerText,\n            visibility = status.visibility,\n            attachments = emptyList(),\n            mentions = emptyList(),\n            tags = emptyList(),\n            application = null,\n            pinned = false,\n            muted = status.muted,\n            poll = null,\n            card = null,\n            repliesCount = status.repliesCount,\n            language = status.language,\n            filtered = status.filtered,\n        )\n    } else {\n        originalStatus\n    }\n\n    return StatusViewData.Concrete(\n        status = status,\n        isExpanded = this.status.expanded,\n        isShowingContent = this.status.contentShowing,\n        isCollapsed = this.status.contentCollapsed,\n        isDetailed = isDetailed,\n        repliedToAccount = repliedToAccount?.toAccount(),\n        translation = translation,\n    )\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/timeline/util/TimelineUtils.kt",
    "content": "package com.keylesspalace.tusky.components.timeline.util\n\nimport com.squareup.moshi.JsonDataException\nimport java.io.IOException\nimport retrofit2.HttpException\n\nfun Throwable.isExpected() =\n    this is IOException || this is HttpException || this is JsonDataException\n\ninline fun <T> ifExpected(t: Throwable, cb: () -> T): T {\n    if (t.isExpected()) {\n        return cb()\n    } else {\n        throw t\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/CachedTimelineRemoteMediator.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.timeline.viewmodel\n\nimport android.util.Log\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.LoadType\nimport androidx.paging.PagingState\nimport androidx.paging.RemoteMediator\nimport androidx.room.withTransaction\nimport com.keylesspalace.tusky.components.timeline.LoadMorePlaceholder\nimport com.keylesspalace.tusky.components.timeline.toEntity\nimport com.keylesspalace.tusky.components.timeline.util.ifExpected\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.db.entity.HomeTimelineData\nimport com.keylesspalace.tusky.db.entity.HomeTimelineEntity\nimport com.keylesspalace.tusky.db.entity.TimelineStatusEntity\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.network.MastodonApi\nimport retrofit2.HttpException\n\n@OptIn(ExperimentalPagingApi::class)\nclass CachedTimelineRemoteMediator(\n    private val viewModel: CachedTimelineViewModel,\n    private val api: MastodonApi,\n    private val db: AppDatabase,\n) : RemoteMediator<Int, HomeTimelineData>() {\n\n    private var initialRefresh = false\n\n    private val timelineDao = db.timelineDao()\n    private val statusDao = db.timelineStatusDao()\n    private val accountDao = db.timelineAccountDao()\n\n    override suspend fun load(\n        loadType: LoadType,\n        state: PagingState<Int, HomeTimelineData>\n    ): MediatorResult {\n        val activeAccount = viewModel.activeAccountFlow.value\n        if (activeAccount == null) {\n            return MediatorResult.Success(endOfPaginationReached = true)\n        }\n\n        try {\n            var dbEmpty = false\n\n            val topPlaceholderId = if (loadType == LoadType.REFRESH) {\n                timelineDao.getTopPlaceholderId(activeAccount.id)\n            } else {\n                null // don't execute the query if it is not needed\n            }\n\n            if (!initialRefresh && loadType == LoadType.REFRESH) {\n                val topId = timelineDao.getTopId(activeAccount.id)\n                topId?.let { cachedTopId ->\n                    val statusResponse = api.homeTimeline(\n                        maxId = cachedTopId,\n                        // so already existing placeholders don't get accidentally overwritten\n                        sinceId = topPlaceholderId,\n                        limit = state.config.pageSize\n                    )\n\n                    val statuses = statusResponse.body()\n                    if (statusResponse.isSuccessful && statuses != null) {\n                        db.withTransaction {\n                            replaceStatusRange(statuses, state, activeAccount)\n                        }\n                    }\n                }\n                initialRefresh = true\n                dbEmpty = topId == null\n            }\n\n            val statusResponse = when (loadType) {\n                LoadType.REFRESH -> {\n                    api.homeTimeline(sinceId = topPlaceholderId, limit = state.config.pageSize)\n                }\n                LoadType.PREPEND -> {\n                    return MediatorResult.Success(endOfPaginationReached = true)\n                }\n                LoadType.APPEND -> {\n                    val maxId = state.pages.findLast { it.data.isNotEmpty() }?.data?.lastOrNull()?.status?.serverId\n                    api.homeTimeline(maxId = maxId, limit = state.config.pageSize)\n                }\n            }\n\n            val statuses = statusResponse.body()\n            if (!statusResponse.isSuccessful || statuses == null) {\n                return MediatorResult.Error(HttpException(statusResponse))\n            }\n\n            db.withTransaction {\n                val overlappedStatuses = replaceStatusRange(statuses, state, activeAccount)\n\n                /* In case we loaded a whole page and there was no overlap with existing statuses,\n                   we insert a placeholder because there might be even more unknown statuses */\n                if (loadType == LoadType.REFRESH && overlappedStatuses == 0 && statuses.size == state.config.pageSize && !dbEmpty) {\n                    /* This overrides the last of the newly loaded statuses with a placeholder\n                       to guarantee the placeholder has an id that exists on the server as not all\n                       servers handle client generated ids as expected */\n                    timelineDao.insertHomeTimelineItem(\n                        LoadMorePlaceholder(statuses.last().id, loading = false).toEntity(activeAccount.id)\n                    )\n                }\n            }\n            return MediatorResult.Success(endOfPaginationReached = statuses.isEmpty())\n        } catch (e: Exception) {\n            return ifExpected(e) {\n                Log.w(TAG, \"Failed to load timeline\", e)\n                MediatorResult.Error(e)\n            }\n        }\n    }\n\n    /**\n     * Deletes all statuses in a given range and inserts new statuses.\n     * This is necessary so statuses that have been deleted on the server are cleaned up.\n     * Should be run in a transaction as it executes multiple db updates\n     * @param statuses the new statuses\n     * @return the number of old statuses that have been cleared from the database\n     */\n    private suspend fun replaceStatusRange(\n        statuses: List<Status>,\n        state: PagingState<Int, HomeTimelineData>,\n        activeAccount: AccountEntity\n    ): Int {\n        val overlappedStatuses = if (statuses.isNotEmpty()) {\n            timelineDao.deleteRange(activeAccount.id, statuses.last().id, statuses.first().id)\n        } else {\n            0\n        }\n\n        for (status in statuses) {\n            accountDao.insert(status.account.toEntity(activeAccount.id))\n            status.reblog?.account?.toEntity(activeAccount.id)?.let { rebloggedAccount ->\n                accountDao.insert(rebloggedAccount)\n            }\n\n            // check if we already have one of the newly loaded statuses cached locally\n            // in case we do, copy the local state (expanded, contentShowing, contentCollapsed) over so it doesn't get lost\n            var oldStatus: TimelineStatusEntity? = null\n            for (page in state.pages) {\n                oldStatus = page.data.find { s ->\n                    s.status?.serverId == status.actionableId\n                }?.status\n                if (oldStatus != null) break\n            }\n\n            val expanded = oldStatus?.expanded ?: activeAccount.alwaysOpenSpoiler\n            val contentShowing = oldStatus?.contentShowing ?: status.shouldShowContent(activeAccount.alwaysShowSensitiveMedia, viewModel.kind.toFilterKind())\n            val contentCollapsed = oldStatus?.contentCollapsed != false\n\n            statusDao.insert(\n                status.actionableStatus.toEntity(\n                    tuskyAccountId = activeAccount.id,\n                    expanded = expanded,\n                    contentShowing = contentShowing,\n                    contentCollapsed = contentCollapsed\n                )\n            )\n            timelineDao.insertHomeTimelineItem(\n                HomeTimelineEntity(\n                    tuskyAccountId = activeAccount.id,\n                    id = status.id,\n                    statusId = status.actionableId,\n                    reblogAccountId = if (status.reblog != null) {\n                        status.account.id\n                    } else {\n                        null\n                    }\n                )\n            )\n        }\n        return overlappedStatuses\n    }\n\n    companion object {\n        private const val TAG = \"CachedTimelineRM\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/CachedTimelineViewModel.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.timeline.viewmodel\n\nimport android.content.SharedPreferences\nimport android.util.Log\nimport androidx.lifecycle.viewModelScope\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.Pager\nimport androidx.paging.PagingConfig\nimport androidx.paging.PagingSource\nimport androidx.paging.cachedIn\nimport androidx.paging.filter\nimport androidx.paging.map\nimport androidx.room.withTransaction\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport at.connyduck.calladapter.networkresult.map\nimport at.connyduck.calladapter.networkresult.onFailure\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.components.preference.PreferencesFragment.ReadingOrder.NEWEST_FIRST\nimport com.keylesspalace.tusky.components.preference.PreferencesFragment.ReadingOrder.OLDEST_FIRST\nimport com.keylesspalace.tusky.components.timeline.LoadMorePlaceholder\nimport com.keylesspalace.tusky.components.timeline.toEntity\nimport com.keylesspalace.tusky.components.timeline.toViewData\nimport com.keylesspalace.tusky.components.timeline.util.ifExpected\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.entity.HomeTimelineData\nimport com.keylesspalace.tusky.db.entity.HomeTimelineEntity\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.network.FilterModel\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.usecase.TimelineCases\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport com.keylesspalace.tusky.viewdata.TranslationViewData\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.launch\nimport retrofit2.HttpException\n\n/**\n * TimelineViewModel that caches all statuses in a local database\n */\n@HiltViewModel\nclass CachedTimelineViewModel @Inject constructor(\n    timelineCases: TimelineCases,\n    private val api: MastodonApi,\n    eventHub: EventHub,\n    accountManager: AccountManager,\n    sharedPreferences: SharedPreferences,\n    filterModel: FilterModel,\n    private val db: AppDatabase\n) : TimelineViewModel(\n    timelineCases,\n    eventHub,\n    accountManager,\n    sharedPreferences,\n    filterModel\n) {\n\n    private var currentPagingSource: PagingSource<Int, HomeTimelineData>? = null\n\n    /** Map from status id to translation. */\n    private val translations = MutableStateFlow(mapOf<String, TranslationViewData>())\n\n    @OptIn(ExperimentalPagingApi::class)\n    override val statuses = Pager(\n        config = PagingConfig(\n            pageSize = LOAD_AT_ONCE\n        ),\n        remoteMediator = CachedTimelineRemoteMediator(this, api, db),\n        pagingSourceFactory = {\n            db.timelineDao().getHomeTimeline(accountId).also { newPagingSource ->\n                this.currentPagingSource = newPagingSource\n            }\n        }\n    ).flow\n        // Apply cachedIn() early to be able to combine with translation flow.\n        // This will not cache ViewData's but practically we don't need this.\n        // If you notice that this flow is used in more than once place consider\n        // adding another cachedIn() for the overall result.\n        .cachedIn(viewModelScope)\n        .combine(translations) { pagingData, translations ->\n            pagingData.map { timelineData ->\n                val translation = translations[timelineData.status?.serverId]\n                val viewData = timelineData.toViewData(\n                    isDetailed = false,\n                    translation = translation\n                )\n                viewData.filter = shouldFilterStatus(viewData)\n                viewData\n            }.filter { statusViewData ->\n                statusViewData.filter?.action != Filter.Action.HIDE\n            }\n        }\n        .flowOn(Dispatchers.Default)\n\n    override fun changeExpanded(expanded: Boolean, status: StatusViewData.Concrete) {\n        viewModelScope.launch {\n            db.timelineStatusDao()\n                .setExpanded(accountId, status.actionableId, expanded)\n        }\n    }\n\n    override fun changeContentShowing(isShowing: Boolean, status: StatusViewData.Concrete) {\n        viewModelScope.launch {\n            db.timelineStatusDao()\n                .setContentShowing(accountId, status.actionableId, isShowing)\n        }\n    }\n\n    override fun changeContentCollapsed(isCollapsed: Boolean, status: StatusViewData.Concrete) {\n        viewModelScope.launch {\n            db.timelineStatusDao()\n                .setContentCollapsed(accountId, status.actionableId, isCollapsed)\n        }\n    }\n\n    override fun clearWarning(status: StatusViewData.Concrete) {\n        viewModelScope.launch {\n            db.timelineStatusDao().clearWarning(accountId, status.actionableId)\n        }\n    }\n\n    override fun removeStatusWithId(id: String) {\n        // handled by CacheUpdater\n    }\n\n    override fun loadMore(placeholderId: String) {\n        viewModelScope.launch {\n            try {\n                val timelineDao = db.timelineDao()\n                val statusDao = db.timelineStatusDao()\n                val accountDao = db.timelineAccountDao()\n\n                timelineDao.insertHomeTimelineItem(\n                    LoadMorePlaceholder(placeholderId, loading = true).toEntity(tuskyAccountId = accountId)\n                )\n\n                val (idAbovePlaceholder, idBelowPlaceholder) = db.withTransaction {\n                    timelineDao.getIdAbove(accountId, placeholderId) to\n                        timelineDao.getIdBelow(accountId, placeholderId)\n                }\n                val response = when (readingOrder) {\n                    // Using minId, loads up to LOAD_AT_ONCE statuses with IDs immediately\n                    // after minId and no larger than maxId\n                    OLDEST_FIRST -> api.homeTimeline(\n                        maxId = idAbovePlaceholder,\n                        minId = idBelowPlaceholder,\n                        limit = LOAD_AT_ONCE\n                    )\n                    // Using sinceId, loads up to LOAD_AT_ONCE statuses immediately before\n                    // maxId, and no smaller than minId.\n                    NEWEST_FIRST -> api.homeTimeline(\n                        maxId = idAbovePlaceholder,\n                        sinceId = idBelowPlaceholder,\n                        limit = LOAD_AT_ONCE\n                    )\n                }\n\n                val statuses = response.body()\n                if (!response.isSuccessful || statuses == null) {\n                    loadMoreFailed(placeholderId, HttpException(response))\n                    return@launch\n                }\n\n                val account = activeAccountFlow.value\n                if (account == null) {\n                    return@launch\n                }\n\n                db.withTransaction {\n                    timelineDao.deleteHomeTimelineItem(accountId, placeholderId)\n\n                    val overlappedStatuses = if (statuses.isNotEmpty()) {\n                        timelineDao.deleteRange(\n                            accountId,\n                            statuses.last().id,\n                            statuses.first().id\n                        )\n                    } else {\n                        0\n                    }\n\n                    for (status in statuses) {\n                        accountDao.insert(status.account.toEntity(accountId))\n                        status.reblog?.account?.toEntity(accountId)\n                            ?.let { rebloggedAccount ->\n                                accountDao.insert(rebloggedAccount)\n                            }\n                        statusDao.insert(\n                            status.actionableStatus.toEntity(\n                                tuskyAccountId = accountId,\n                                expanded = account.alwaysOpenSpoiler,\n                                contentShowing = status.shouldShowContent(account.alwaysShowSensitiveMedia, kind.toFilterKind()),\n                                contentCollapsed = true,\n                            )\n                        )\n                        timelineDao.insertHomeTimelineItem(\n                            HomeTimelineEntity(\n                                tuskyAccountId = accountId,\n                                id = status.id,\n                                statusId = status.actionableId,\n                                reblogAccountId = if (status.reblog != null) {\n                                    status.account.id\n                                } else {\n                                    null\n                                }\n                            )\n                        )\n                    }\n\n                    /* In case we loaded a whole page and there was no overlap with existing statuses,\n                       we insert a placeholder because there might be even more unknown statuses */\n                    if (overlappedStatuses == 0 && statuses.size == LOAD_AT_ONCE) {\n                        /* This overrides the first/last of the newly loaded statuses with a placeholder\n                           to guarantee the placeholder has an id that exists on the server as not all\n                           servers handle client generated ids as expected */\n                        val idToConvert = when (readingOrder) {\n                            OLDEST_FIRST -> statuses.first().id\n                            NEWEST_FIRST -> statuses.last().id\n                        }\n                        timelineDao.insertHomeTimelineItem(\n                            LoadMorePlaceholder(\n                                idToConvert,\n                                loading = false\n                            ).toEntity(accountId)\n                        )\n                    }\n                }\n            } catch (e: Exception) {\n                ifExpected(e) {\n                    loadMoreFailed(placeholderId, e)\n                }\n            }\n        }\n    }\n\n    private suspend fun loadMoreFailed(placeholderId: String, e: Exception) {\n        Log.w(TAG, \"failed loading statuses\", e)\n        val activeAccount = accountManager.activeAccount!!\n        db.timelineDao()\n            .insertHomeTimelineItem(LoadMorePlaceholder(placeholderId, loading = false).toEntity(activeAccount.id))\n    }\n\n    override fun fullReload() {\n        viewModelScope.launch {\n            val activeAccount = accountManager.activeAccount!!\n            db.timelineDao().removeAllHomeTimelineItems(activeAccount.id)\n        }\n    }\n\n    override fun saveReadingPosition(statusId: String) {\n        viewModelScope.launch {\n            accountManager.activeAccount?.let { account ->\n                Log.d(TAG, \"Saving position at: $statusId\")\n                accountManager.updateAccount(account) {\n                    copy(lastVisibleHomeTimelineStatusId = statusId)\n                }\n            }\n        }\n    }\n\n    override suspend fun invalidate() {\n        // invalidating when we don't have statuses yet can cause empty timelines because it cancels the network load\n        if (db.timelineDao().getHomeTimelineItemCount(accountId) > 0) {\n            currentPagingSource?.invalidate()\n        }\n    }\n\n    override suspend fun translate(status: StatusViewData.Concrete): NetworkResult<Unit> {\n        translations.value += (status.id to TranslationViewData.Loading)\n        return timelineCases.translate(status.actionableId)\n            .map { translation ->\n                translations.value += (status.actionableId to TranslationViewData.Loaded(translation))\n            }\n            .onFailure {\n                translations.value -= status.actionableId\n            }\n    }\n\n    override fun untranslate(status: StatusViewData.Concrete) {\n        translations.value -= status.actionableId\n    }\n\n    companion object {\n        private const val TAG = \"CachedTimelineViewModel\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/NetworkTimelinePagingSource.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.timeline.viewmodel\n\nimport androidx.paging.PagingSource\nimport androidx.paging.PagingState\nimport com.keylesspalace.tusky.viewdata.StatusViewData\n\nclass NetworkTimelinePagingSource(\n    private val viewModel: NetworkTimelineViewModel\n) : PagingSource<String, StatusViewData>() {\n\n    override fun getRefreshKey(state: PagingState<String, StatusViewData>): String? = null\n\n    override suspend fun load(params: LoadParams<String>): LoadResult<String, StatusViewData> {\n        return if (params is LoadParams.Refresh) {\n            val list = viewModel.statusData.toList()\n            LoadResult.Page(list, null, viewModel.nextKey)\n        } else {\n            LoadResult.Page(emptyList(), null, null)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/NetworkTimelineRemoteMediator.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.timeline.viewmodel\n\nimport android.util.Log\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.LoadType\nimport androidx.paging.PagingState\nimport androidx.paging.RemoteMediator\nimport com.keylesspalace.tusky.components.timeline.util.ifExpected\nimport com.keylesspalace.tusky.util.HttpHeaderLink\nimport com.keylesspalace.tusky.util.toViewData\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport retrofit2.HttpException\n\n@OptIn(ExperimentalPagingApi::class)\nclass NetworkTimelineRemoteMediator(\n    private val viewModel: NetworkTimelineViewModel\n) : RemoteMediator<String, StatusViewData>() {\n\n    private val statusIds = mutableSetOf<String>()\n\n    init {\n        if (viewModel.kind == TimelineViewModel.Kind.PUBLIC_TRENDING_STATUSES) {\n            statusIds.addAll(viewModel.statusData.map { it.id })\n        }\n    }\n\n    override suspend fun load(\n        loadType: LoadType,\n        state: PagingState<String, StatusViewData>\n    ): MediatorResult {\n        try {\n            val statusResponse = when (loadType) {\n                LoadType.REFRESH -> {\n                    viewModel.fetchStatusesForKind(null, null, limit = state.config.pageSize)\n                }\n                LoadType.PREPEND -> {\n                    return MediatorResult.Success(endOfPaginationReached = true)\n                }\n                LoadType.APPEND -> {\n                    val maxId = viewModel.nextKey\n                    if (maxId != null) {\n                        viewModel.fetchStatusesForKind(maxId, null, limit = state.config.pageSize)\n                    } else {\n                        return MediatorResult.Success(endOfPaginationReached = true)\n                    }\n                }\n            }\n\n            val statuses = statusResponse.body()\n            if (!statusResponse.isSuccessful || statuses == null) {\n                return MediatorResult.Error(HttpException(statusResponse))\n            }\n\n            val activeAccount = viewModel.activeAccountFlow.value!!\n\n            val data = statuses.map { status ->\n\n                val oldStatus = viewModel.statusData.find { s ->\n                    s.asStatusOrNull()?.id == status.id\n                }?.asStatusOrNull()\n\n                val filter = oldStatus?.filter ?: status.getApplicableFilter(viewModel.kind.toFilterKind())\n                val contentShowing = oldStatus?.isShowingContent ?: status.shouldShowContent(activeAccount.alwaysShowSensitiveMedia, viewModel.kind.toFilterKind())\n                val expanded = oldStatus?.isExpanded ?: activeAccount.alwaysOpenSpoiler\n                val contentCollapsed = oldStatus?.isCollapsed != false\n\n                status.toViewData(\n                    isShowingContent = contentShowing,\n                    isExpanded = expanded,\n                    isCollapsed = contentCollapsed,\n                    filter = filter,\n                )\n            }\n\n            if (loadType == LoadType.REFRESH && viewModel.statusData.isNotEmpty()) {\n                val insertPlaceholder = if (statuses.isNotEmpty()) {\n                    !viewModel.statusData.removeAll { statusViewData ->\n                        statuses.any { status -> status.id == statusViewData.asStatusOrNull()?.id }\n                    }\n                } else {\n                    false\n                }\n\n                if (viewModel.kind == TimelineViewModel.Kind.PUBLIC_TRENDING_STATUSES) {\n                    statusIds.addAll(data.map { it.id })\n                }\n\n                viewModel.statusData.addAll(0, data)\n\n                if (insertPlaceholder) {\n                    viewModel.statusData[statuses.size - 1] = StatusViewData.LoadMore(statuses.last().id, false)\n                }\n            } else {\n                val linkHeader = statusResponse.headers()[\"Link\"]\n                val links = HttpHeaderLink.parse(linkHeader)\n                val next = HttpHeaderLink.findByRelationType(links, \"next\")\n\n                var filteredData = data\n                if (viewModel.kind == TimelineViewModel.Kind.PUBLIC_TRENDING_STATUSES) {\n                    // Trending statuses use offset for paging, not IDs. If a new status has been added to the remote\n                    // feed after we performed the initial fetch, then the feed will have moved, but our offset won't.\n                    // As a result, we'd get repeat statuses. This addresses that.\n                    filteredData = data.filter { !statusIds.contains(it.id) }\n                    statusIds.addAll(filteredData.map { it.id })\n\n                    viewModel.nextKey = next?.uri?.getQueryParameter(\"offset\")\n                } else {\n                    viewModel.nextKey = next?.uri?.getQueryParameter(\"max_id\")\n                }\n\n                viewModel.statusData.addAll(filteredData)\n            }\n\n            viewModel.currentSource?.invalidate()\n            return MediatorResult.Success(endOfPaginationReached = statuses.isEmpty())\n        } catch (e: Exception) {\n            return ifExpected(e) {\n                Log.w(TAG, \"Failed to load timeline\", e)\n                MediatorResult.Error(e)\n            }\n        }\n    }\n\n    companion object {\n        private const val TAG = \"NetworkTimelineRM\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/NetworkTimelineViewModel.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.timeline.viewmodel\n\nimport android.content.SharedPreferences\nimport android.util.Log\nimport androidx.lifecycle.viewModelScope\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.Pager\nimport androidx.paging.PagingConfig\nimport androidx.paging.cachedIn\nimport androidx.paging.filter\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport at.connyduck.calladapter.networkresult.map\nimport at.connyduck.calladapter.networkresult.onFailure\nimport com.keylesspalace.tusky.appstore.BlockEvent\nimport com.keylesspalace.tusky.appstore.DomainMuteEvent\nimport com.keylesspalace.tusky.appstore.Event\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.MuteEvent\nimport com.keylesspalace.tusky.appstore.PollShowResultsEvent\nimport com.keylesspalace.tusky.appstore.PollVoteEvent\nimport com.keylesspalace.tusky.appstore.StatusChangedEvent\nimport com.keylesspalace.tusky.appstore.StatusDeletedEvent\nimport com.keylesspalace.tusky.appstore.UnfollowEvent\nimport com.keylesspalace.tusky.components.timeline.util.ifExpected\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.entity.Poll\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.network.FilterModel\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.usecase.TimelineCases\nimport com.keylesspalace.tusky.util.getDomain\nimport com.keylesspalace.tusky.util.isLessThan\nimport com.keylesspalace.tusky.util.isLessThanOrEqual\nimport com.keylesspalace.tusky.util.toViewData\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport com.keylesspalace.tusky.viewdata.TranslationViewData\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport java.io.IOException\nimport javax.inject.Inject\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.asExecutor\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.launch\nimport retrofit2.HttpException\nimport retrofit2.Response\n\n/**\n * TimelineViewModel that caches all statuses in an in-memory list\n */\n@HiltViewModel\nclass NetworkTimelineViewModel @Inject constructor(\n    timelineCases: TimelineCases,\n    private val api: MastodonApi,\n    eventHub: EventHub,\n    accountManager: AccountManager,\n    sharedPreferences: SharedPreferences,\n    filterModel: FilterModel\n) : TimelineViewModel(\n    timelineCases,\n    eventHub,\n    accountManager,\n    sharedPreferences,\n    filterModel\n) {\n\n    var currentSource: NetworkTimelinePagingSource? = null\n\n    val statusData: MutableList<StatusViewData> = mutableListOf()\n\n    var nextKey: String? = null\n\n    @OptIn(ExperimentalPagingApi::class)\n    override val statuses = Pager(\n        config = PagingConfig(\n            pageSize = LOAD_AT_ONCE\n        ),\n        pagingSourceFactory = {\n            NetworkTimelinePagingSource(\n                viewModel = this\n            ).also { source ->\n                currentSource = source\n            }\n        },\n        remoteMediator = NetworkTimelineRemoteMediator(this)\n    ).flow\n        .map { pagingData ->\n            pagingData.filter(Dispatchers.Default.asExecutor()) { statusViewData ->\n                shouldFilterStatus(statusViewData)?.action != Filter.Action.HIDE\n            }\n        }\n        .flowOn(Dispatchers.Default)\n        .cachedIn(viewModelScope)\n\n    init {\n        viewModelScope.launch {\n            eventHub.events\n                .collect { event -> handleEvent(event) }\n        }\n    }\n\n    private fun handleEvent(event: Event) {\n        when (event) {\n            is StatusChangedEvent -> handleStatusChangedEvent(event.status)\n            is PollVoteEvent -> handlePollVote(event.statusId, event.poll)\n            is PollShowResultsEvent -> handlePollShowResults(event.statusId)\n            is UnfollowEvent -> {\n                if (kind == Kind.HOME) {\n                    val id = event.accountId\n                    removeAllByAccountId(id)\n                }\n            }\n            is BlockEvent -> {\n                if (kind != Kind.USER && kind != Kind.USER_WITH_REPLIES && kind != Kind.USER_PINNED) {\n                    val id = event.accountId\n                    removeAllByAccountId(id)\n                }\n            }\n            is MuteEvent -> {\n                if (kind != Kind.USER && kind != Kind.USER_WITH_REPLIES && kind != Kind.USER_PINNED) {\n                    val id = event.accountId\n                    removeAllByAccountId(id)\n                }\n            }\n            is DomainMuteEvent -> {\n                if (kind != Kind.USER && kind != Kind.USER_WITH_REPLIES && kind != Kind.USER_PINNED) {\n                    val instance = event.instance\n                    removeAllByInstance(instance)\n                }\n            }\n            is StatusDeletedEvent -> {\n                if (kind != Kind.USER && kind != Kind.USER_WITH_REPLIES && kind != Kind.USER_PINNED) {\n                    removeStatusWithId(event.statusId)\n                }\n            }\n        }\n    }\n\n    override fun changeExpanded(expanded: Boolean, status: StatusViewData.Concrete) {\n        status.copy(\n            isExpanded = expanded\n        ).update()\n    }\n\n    override fun changeContentShowing(isShowing: Boolean, status: StatusViewData.Concrete) {\n        status.copy(\n            isShowingContent = isShowing\n        ).update()\n    }\n\n    override fun changeContentCollapsed(isCollapsed: Boolean, status: StatusViewData.Concrete) {\n        status.copy(\n            isCollapsed = isCollapsed\n        ).update()\n    }\n\n    private fun removeAllByAccountId(accountId: String) {\n        statusData.removeAll { vd ->\n            val status = vd.asStatusOrNull()?.status ?: return@removeAll false\n            status.account.id == accountId || status.actionableStatus.account.id == accountId\n        }\n        currentSource?.invalidate()\n    }\n\n    private fun removeAllByInstance(instance: String) {\n        statusData.removeAll { vd ->\n            val status = vd.asStatusOrNull()?.status ?: return@removeAll false\n            getDomain(status.account.url) == instance\n        }\n        currentSource?.invalidate()\n    }\n\n    override fun removeStatusWithId(id: String) {\n        statusData.removeAll { vd ->\n            val status = vd.asStatusOrNull()?.status ?: return@removeAll false\n            status.id == id || status.reblog?.id == id\n        }\n        currentSource?.invalidate()\n    }\n\n    override fun loadMore(placeholderId: String) {\n        viewModelScope.launch {\n            try {\n                val placeholderIndex =\n                    statusData.indexOfFirst { it is StatusViewData.LoadMore && it.id == placeholderId }\n                statusData[placeholderIndex] =\n                    StatusViewData.LoadMore(placeholderId, isLoading = true)\n\n                val idAbovePlaceholder = statusData.getOrNull(placeholderIndex - 1)?.id\n\n                val statusResponse = fetchStatusesForKind(\n                    fromId = idAbovePlaceholder,\n                    uptoId = null,\n                    limit = 20\n                )\n\n                val statuses = statusResponse.body()\n                if (!statusResponse.isSuccessful || statuses == null) {\n                    loadMoreFailed(placeholderId, HttpException(statusResponse))\n                    return@launch\n                }\n\n                statusData.removeAt(placeholderIndex)\n\n                val activeAccount = accountManager.activeAccount!!\n                val data: MutableList<StatusViewData> = statuses.map { status ->\n                    status.toViewData(\n                        isShowingContent = status.shouldShowContent(activeAccount.alwaysShowSensitiveMedia, kind.toFilterKind()),\n                        isExpanded = activeAccount.alwaysOpenSpoiler,\n                        isCollapsed = true,\n                        filter = status.getApplicableFilter(kind.toFilterKind()),\n                    )\n                }.toMutableList()\n\n                if (statuses.isNotEmpty()) {\n                    val firstId = statuses.first().id\n                    val lastId = statuses.last().id\n                    val overlappedFrom = statusData.indexOfFirst {\n                        it.asStatusOrNull()?.id?.isLessThanOrEqual(firstId) ?: false\n                    }\n                    val overlappedTo = statusData.indexOfFirst {\n                        it.asStatusOrNull()?.id?.isLessThan(lastId) ?: false\n                    }\n\n                    if (overlappedFrom < overlappedTo) {\n                        data.mapIndexed { i, status ->\n                            i to statusData.firstOrNull {\n                                it.asStatusOrNull()?.id == status.id\n                            }?.asStatusOrNull()\n                        }\n                            .filter { (_, oldStatus) -> oldStatus != null }\n                            .forEach { (i, oldStatus) ->\n                                data[i] = data[i].asStatusOrNull()!!\n                                    .copy(\n                                        isShowingContent = oldStatus!!.isShowingContent,\n                                        isExpanded = oldStatus.isExpanded,\n                                        isCollapsed = oldStatus.isCollapsed\n                                    )\n                            }\n\n                        statusData.removeAll { status ->\n                            when (status) {\n                                is StatusViewData.LoadMore -> lastId.isLessThan(status.id) && status.id.isLessThanOrEqual(\n                                    firstId\n                                )\n\n                                is StatusViewData.Concrete -> lastId.isLessThan(status.id) && status.id.isLessThanOrEqual(\n                                    firstId\n                                )\n                            }\n                        }\n                    } else {\n                        data[data.size - 1] =\n                            StatusViewData.LoadMore(statuses.last().id, isLoading = false)\n                    }\n                }\n\n                statusData.addAll(placeholderIndex, data)\n\n                currentSource?.invalidate()\n            } catch (e: Exception) {\n                ifExpected(e) {\n                    loadMoreFailed(placeholderId, e)\n                }\n            }\n        }\n    }\n\n    private fun loadMoreFailed(placeholderId: String, e: Exception) {\n        Log.w(\"NetworkTimelineVM\", \"failed loading statuses\", e)\n\n        val index =\n            statusData.indexOfFirst { it is StatusViewData.LoadMore && it.id == placeholderId }\n        statusData[index] = StatusViewData.LoadMore(placeholderId, isLoading = false)\n\n        currentSource?.invalidate()\n    }\n\n    private fun handleStatusChangedEvent(status: Status) {\n        updateStatusByActionableId(status.id) { status }\n    }\n\n    private fun handlePollVote(statusId: String, poll: Poll) {\n        updateStatusByActionableId(statusId) { status ->\n            status.copy(poll = poll)\n        }\n    }\n\n    private fun handlePollShowResults(statusId: String) {\n        updateStatusByActionableId(statusId) { status ->\n            status.copy(poll = status.poll?.copy(voted = true))\n        }\n    }\n\n    override fun fullReload() {\n        nextKey = statusData.firstOrNull { it is StatusViewData.Concrete }?.asStatusOrNull()?.id\n        statusData.clear()\n        currentSource?.invalidate()\n    }\n\n    override fun clearWarning(status: StatusViewData.Concrete) {\n        updateStatusByActionableId(status.actionableId) {\n            it.copy(filtered = emptyList())\n        }\n    }\n\n    override fun saveReadingPosition(statusId: String) {\n        /** Does nothing for non-cached timelines */\n    }\n\n    override suspend fun invalidate() {\n        currentSource?.invalidate()\n    }\n\n    override suspend fun translate(status: StatusViewData.Concrete): NetworkResult<Unit> {\n        status.copy(translation = TranslationViewData.Loading).update()\n        return timelineCases.translate(status.actionableId)\n            .map { translation ->\n                status.copy(translation = TranslationViewData.Loaded(translation)).update()\n            }\n            .onFailure {\n                status.update()\n            }\n    }\n\n    override fun untranslate(status: StatusViewData.Concrete) {\n        status.copy(translation = null).update()\n    }\n\n    @Throws(IOException::class, HttpException::class)\n    suspend fun fetchStatusesForKind(\n        fromId: String?,\n        uptoId: String?,\n        limit: Int\n    ): Response<List<Status>> {\n        return when (kind) {\n            Kind.HOME -> api.homeTimeline(maxId = fromId, sinceId = uptoId, limit = limit)\n            Kind.PUBLIC_FEDERATED -> api.publicTimeline(null, fromId, uptoId, limit)\n            Kind.PUBLIC_LOCAL -> api.publicTimeline(true, fromId, uptoId, limit)\n            Kind.TAG -> {\n                val firstHashtag = tags[0]\n                val additionalHashtags = tags.subList(1, tags.size)\n                api.hashtagTimeline(firstHashtag, additionalHashtags, null, fromId, uptoId, limit)\n            }\n\n            Kind.USER -> api.accountStatuses(\n                id!!,\n                fromId,\n                uptoId,\n                limit,\n                excludeReplies = true,\n                onlyMedia = null,\n                pinned = null\n            )\n\n            Kind.USER_PINNED -> api.accountStatuses(\n                id!!,\n                fromId,\n                uptoId,\n                limit,\n                excludeReplies = null,\n                onlyMedia = null,\n                pinned = true\n            )\n\n            Kind.USER_WITH_REPLIES -> api.accountStatuses(\n                id!!,\n                fromId,\n                uptoId,\n                limit,\n                excludeReplies = null,\n                onlyMedia = null,\n                pinned = null\n            )\n\n            Kind.FAVOURITES -> api.favourites(fromId, uptoId, limit)\n            Kind.BOOKMARKS -> api.bookmarks(fromId, uptoId, limit)\n            Kind.LIST -> api.listTimeline(id!!, fromId, uptoId, limit)\n            Kind.PUBLIC_TRENDING_STATUSES -> api.trendingStatuses(limit = limit, offset = fromId)\n        }\n    }\n\n    private fun StatusViewData.Concrete.update() {\n        val position =\n            statusData.indexOfFirst { viewData -> viewData.asStatusOrNull()?.id == this.id }\n        statusData[position] = this\n        currentSource?.invalidate()\n    }\n\n    private inline fun updateStatusByActionableId(id: String, updater: (Status) -> Status) {\n        // posts can be multiple times in the timeline, e.g. once the original and once as boost\n        statusData.forEachIndexed { index, status ->\n            if (status.asStatusOrNull()?.actionableId == id) {\n                updateViewDataAt(index) { vd ->\n                    if (vd.status.reblog != null) {\n                        vd.copy(status = vd.status.copy(reblog = updater(vd.status.reblog)))\n                    } else {\n                        vd.copy(status = updater(vd.status))\n                    }\n                }\n            }\n        }\n    }\n\n    private inline fun updateViewDataAt(\n        position: Int,\n        updater: (StatusViewData.Concrete) -> StatusViewData.Concrete\n    ) {\n        val status = statusData.getOrNull(position)?.asStatusOrNull() ?: return\n        statusData[position] = updater(status)\n        currentSource?.invalidate()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/TimelineViewModel.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.timeline.viewmodel\n\nimport android.content.SharedPreferences\nimport android.util.Log\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport androidx.paging.PagingData\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport at.connyduck.calladapter.networkresult.getOrThrow\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.FilterUpdatedEvent\nimport com.keylesspalace.tusky.appstore.PreferenceChangedEvent\nimport com.keylesspalace.tusky.components.preference.PreferencesFragment.ReadingOrder\nimport com.keylesspalace.tusky.components.timeline.util.ifExpected\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.network.FilterModel\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.usecase.TimelineCases\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.launch\n\nabstract class TimelineViewModel(\n    protected val timelineCases: TimelineCases,\n    private val eventHub: EventHub,\n    val accountManager: AccountManager,\n    private val sharedPreferences: SharedPreferences,\n    private val filterModel: FilterModel\n) : ViewModel() {\n\n    val activeAccountFlow = accountManager.activeAccount(viewModelScope)\n    protected val accountId: Long = activeAccountFlow.value!!.id\n\n    abstract val statuses: Flow<PagingData<StatusViewData>>\n\n    var kind: Kind = Kind.HOME\n        private set\n    var id: String? = null\n        private set\n    var tags: List<String> = emptyList()\n        private set\n\n    protected var alwaysShowSensitiveMedia = false\n    private var alwaysOpenSpoilers = false\n    private var filterRemoveReplies = false\n    private var filterRemoveReblogs = false\n    private var filterRemoveSelfReblogs = false\n    protected var readingOrder: ReadingOrder = ReadingOrder.OLDEST_FIRST\n\n    fun init(kind: Kind, id: String?, tags: List<String>) {\n        this.kind = kind\n        this.id = id\n        this.tags = tags\n\n        val activeAccount = activeAccountFlow.value!!\n\n        if (kind == Kind.HOME) {\n            // Note the variable is \"true if filter\" but the underlying preference/settings text is \"true if show\"\n            filterRemoveReplies = !activeAccount.isShowHomeReplies\n            filterRemoveReblogs = !activeAccount.isShowHomeBoosts\n            filterRemoveSelfReblogs = !activeAccount.isShowHomeSelfBoosts\n        }\n        readingOrder = ReadingOrder.from(sharedPreferences.getString(PrefKeys.READING_ORDER, null))\n\n        this.alwaysShowSensitiveMedia = activeAccount.alwaysShowSensitiveMedia\n        this.alwaysOpenSpoilers = activeAccount.alwaysOpenSpoiler\n\n        viewModelScope.launch {\n            eventHub.events\n                .collect { event ->\n                    when (event) {\n                        is PreferenceChangedEvent -> {\n                            onPreferenceChanged(event.preferenceKey)\n                        }\n                        is FilterUpdatedEvent -> {\n                            if (filterContextMatchesKind(this@TimelineViewModel.kind, event.filterContext)) {\n                                filterModel.init(kind.toFilterKind())\n                                invalidate()\n                            }\n                        }\n                    }\n                }\n        }\n\n        viewModelScope.launch {\n            val needsRefresh = filterModel.init(kind.toFilterKind())\n            if (needsRefresh) {\n                fullReload()\n            }\n        }\n    }\n\n    fun reblog(reblog: Boolean, status: StatusViewData.Concrete, visibility: Status.Visibility = Status.Visibility.PUBLIC): Job = viewModelScope.launch {\n        try {\n            timelineCases.reblog(status.actionableId, reblog, visibility).getOrThrow()\n        } catch (t: Exception) {\n            ifExpected(t) {\n                Log.d(TAG, \"Failed to reblog status \" + status.actionableId, t)\n            }\n        }\n    }\n\n    fun favorite(favorite: Boolean, status: StatusViewData.Concrete): Job = viewModelScope.launch {\n        try {\n            timelineCases.favourite(status.actionableId, favorite).getOrThrow()\n        } catch (t: Exception) {\n            ifExpected(t) {\n                Log.d(TAG, \"Failed to favourite status \" + status.actionableId, t)\n            }\n        }\n    }\n\n    fun bookmark(bookmark: Boolean, status: StatusViewData.Concrete): Job = viewModelScope.launch {\n        try {\n            timelineCases.bookmark(status.actionableId, bookmark).getOrThrow()\n        } catch (t: Exception) {\n            ifExpected(t) {\n                Log.d(TAG, \"Failed to bookmark status \" + status.actionableId, t)\n            }\n        }\n    }\n\n    fun voteInPoll(choices: List<Int>, status: StatusViewData.Concrete): Job =\n        viewModelScope.launch {\n            val poll = status.status.actionableStatus.poll ?: run {\n                Log.w(TAG, \"No poll on status ${status.id}\")\n                return@launch\n            }\n\n            try {\n                timelineCases.voteInPoll(status.actionableId, poll.id, choices).getOrThrow()\n            } catch (t: Exception) {\n                ifExpected(t) {\n                    Log.d(TAG, \"Failed to vote in poll: \" + status.actionableId, t)\n                }\n            }\n        }\n\n    fun showPollResults(status: StatusViewData.Concrete) = viewModelScope.launch {\n        timelineCases.showPollResults(status.actionableId)\n    }\n\n    abstract fun changeExpanded(expanded: Boolean, status: StatusViewData.Concrete)\n\n    abstract fun changeContentShowing(isShowing: Boolean, status: StatusViewData.Concrete)\n\n    abstract fun changeContentCollapsed(isCollapsed: Boolean, status: StatusViewData.Concrete)\n\n    abstract fun removeStatusWithId(id: String)\n\n    abstract fun loadMore(placeholderId: String)\n\n    abstract fun fullReload()\n\n    abstract fun clearWarning(status: StatusViewData.Concrete)\n\n    /** Saves the user's reading position so it can be restored later */\n    abstract fun saveReadingPosition(statusId: String)\n\n    /** Triggered when currently displayed data must be reloaded. */\n    protected abstract suspend fun invalidate()\n\n    protected fun shouldFilterStatus(statusViewData: StatusViewData): Filter? {\n        val status = statusViewData.asStatusOrNull()?.status ?: return null\n        return if (\n            (status.isReply && filterRemoveReplies) ||\n            (status.reblog != null && filterRemoveReblogs) ||\n            (status.account.id == status.reblog?.account?.id && filterRemoveSelfReblogs)\n        ) {\n            Filter(context = listOf(kind.toFilterKind()), action = Filter.Action.HIDE)\n        } else if (status.actionableStatus.account.id == activeAccountFlow.value?.accountId) {\n            // Mastodon filters don't apply for own posts\n            null\n        } else {\n            filterModel.shouldFilterStatus(status.actionableStatus)\n        }\n    }\n\n    private fun onPreferenceChanged(key: String) {\n        activeAccountFlow.value?.let { activeAccount ->\n            when (key) {\n                PrefKeys.TAB_FILTER_HOME_REPLIES -> {\n                    val filter = !activeAccount.isShowHomeReplies\n                    val oldRemoveReplies = filterRemoveReplies\n                    filterRemoveReplies = kind == Kind.HOME && !filter\n                    if (oldRemoveReplies != filterRemoveReplies) {\n                        fullReload()\n                    }\n                }\n\n                PrefKeys.TAB_FILTER_HOME_BOOSTS -> {\n                    val filter = !activeAccount.isShowHomeBoosts\n                    val oldRemoveReblogs = filterRemoveReblogs\n                    filterRemoveReblogs = kind == Kind.HOME && !filter\n                    if (oldRemoveReblogs != filterRemoveReblogs) {\n                        fullReload()\n                    }\n                }\n\n                PrefKeys.TAB_SHOW_HOME_SELF_BOOSTS -> {\n                    val filter = !activeAccount.isShowHomeSelfBoosts\n                    val oldRemoveSelfReblogs = filterRemoveSelfReblogs\n                    filterRemoveSelfReblogs = kind == Kind.HOME && !filter\n                    if (oldRemoveSelfReblogs != filterRemoveSelfReblogs) {\n                        fullReload()\n                    }\n                }\n\n                PrefKeys.ALWAYS_SHOW_SENSITIVE_MEDIA -> {\n                    // it is ok if only newly loaded statuses are affected, no need to fully refresh\n                    alwaysShowSensitiveMedia = activeAccount.alwaysShowSensitiveMedia\n                }\n\n                PrefKeys.READING_ORDER -> {\n                    readingOrder = ReadingOrder.from(sharedPreferences.getString(PrefKeys.READING_ORDER, null))\n                }\n            }\n        }\n    }\n\n    abstract suspend fun translate(status: StatusViewData.Concrete): NetworkResult<Unit>\n    abstract fun untranslate(status: StatusViewData.Concrete)\n\n    companion object {\n        private const val TAG = \"TimelineVM\"\n        internal const val LOAD_AT_ONCE = 30\n\n        fun filterContextMatchesKind(kind: Kind, filterContext: List<Filter.Kind>): Boolean =\n            filterContext.contains(kind.toFilterKind())\n    }\n\n    enum class Kind {\n        HOME,\n        PUBLIC_LOCAL,\n        PUBLIC_FEDERATED,\n        TAG,\n        USER,\n        USER_PINNED,\n        USER_WITH_REPLIES,\n        FAVOURITES,\n        LIST,\n        BOOKMARKS,\n        PUBLIC_TRENDING_STATUSES;\n\n        fun toFilterKind(): Filter.Kind {\n            return when (valueOf(name)) {\n                HOME, LIST -> Filter.Kind.HOME\n                PUBLIC_FEDERATED, PUBLIC_LOCAL, TAG, FAVOURITES, PUBLIC_TRENDING_STATUSES -> Filter.Kind.PUBLIC\n                USER, USER_WITH_REPLIES, USER_PINNED -> Filter.Kind.ACCOUNT\n                else -> Filter.Kind.PUBLIC\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingActivity.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <https://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.trending\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.fragment.app.commit\nimport com.keylesspalace.tusky.BaseActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ActivityTrendingBinding\nimport com.keylesspalace.tusky.util.viewBinding\nimport dagger.hilt.android.AndroidEntryPoint\n\n@AndroidEntryPoint\nclass TrendingActivity : BaseActivity() {\n\n    private val binding: ActivityTrendingBinding by viewBinding(ActivityTrendingBinding::inflate)\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n\n        setSupportActionBar(binding.includedToolbar.toolbar)\n\n        supportActionBar?.run {\n            setTitle(R.string.title_public_trending_hashtags)\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n        }\n\n        if (supportFragmentManager.findFragmentById(R.id.fragmentContainer) == null) {\n            supportFragmentManager.commit {\n                val fragment = TrendingTagsFragment.newInstance()\n                replace(R.id.fragmentContainer, fragment)\n            }\n        }\n    }\n\n    companion object {\n        fun getIntent(context: Context) = Intent(context, TrendingActivity::class.java)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingDateViewHolder.kt",
    "content": "/* Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.trending\n\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemTrendingDateBinding\nimport java.text.SimpleDateFormat\nimport java.util.Date\nimport java.util.Locale\nimport java.util.TimeZone\n\nclass TrendingDateViewHolder(\n    private val binding: ItemTrendingDateBinding\n) : RecyclerView.ViewHolder(binding.root) {\n\n    private val dateFormat = SimpleDateFormat(\"EEE dd MMM yyyy\", Locale.getDefault()).apply {\n        this.timeZone = TimeZone.getDefault()\n    }\n\n    fun setup(start: Date, end: Date) {\n        binding.dates.text = itemView.context.getString(\n            R.string.date_range,\n            dateFormat.format(start),\n            dateFormat.format(end)\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagViewHolder.kt",
    "content": "/* Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.trending\n\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ItemTrendingCellBinding\nimport com.keylesspalace.tusky.util.formatNumber\nimport com.keylesspalace.tusky.viewdata.TrendingViewData\nimport java.text.NumberFormat\n\nclass TrendingTagViewHolder(\n    private val binding: ItemTrendingCellBinding\n) : RecyclerView.ViewHolder(binding.root) {\n\n    private val numberFormat: NumberFormat = NumberFormat.getNumberInstance()\n\n    fun setup(tagViewData: TrendingViewData.Tag, onViewTag: (String) -> Unit) {\n        binding.tag.text = binding.root.context.getString(R.string.hashtag_format, tagViewData.name)\n\n        binding.graph.maxTrendingValue = tagViewData.maxTrendingValue\n        binding.graph.primaryLineData = tagViewData.usage\n        binding.graph.secondaryLineData = tagViewData.accounts\n\n        binding.totalUsage.text = formatNumber(tagViewData.usage.sum(), 1000)\n\n        val totalAccounts = tagViewData.accounts.sum()\n        binding.totalAccounts.text = formatNumber(totalAccounts, 1000)\n\n        binding.currentUsage.text = numberFormat.format(tagViewData.usage.last())\n        binding.currentAccounts.text = numberFormat.format(tagViewData.accounts.last())\n\n        itemView.setOnClickListener {\n            onViewTag(tagViewData.name)\n        }\n\n        itemView.contentDescription =\n            itemView.context.getString(\n                R.string.accessibility_talking_about_tag,\n                totalAccounts,\n                tagViewData.name\n            )\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagsAdapter.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.trending\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.databinding.ItemTrendingCellBinding\nimport com.keylesspalace.tusky.databinding.ItemTrendingDateBinding\nimport com.keylesspalace.tusky.viewdata.TrendingViewData\n\nclass TrendingTagsAdapter(\n    private val onViewTag: (String) -> Unit\n) : ListAdapter<TrendingViewData, RecyclerView.ViewHolder>(TrendingDifferCallback) {\n\n    init {\n        stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY\n    }\n\n    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): RecyclerView.ViewHolder {\n        return when (viewType) {\n            VIEW_TYPE_TAG -> {\n                val binding =\n                    ItemTrendingCellBinding.inflate(LayoutInflater.from(viewGroup.context))\n                TrendingTagViewHolder(binding)\n            }\n            else -> {\n                val binding =\n                    ItemTrendingDateBinding.inflate(LayoutInflater.from(viewGroup.context))\n                TrendingDateViewHolder(binding)\n            }\n        }\n    }\n\n    override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) {\n        when (val viewData = getItem(position)) {\n            is TrendingViewData.Tag -> {\n                val holder = viewHolder as TrendingTagViewHolder\n                holder.setup(viewData, onViewTag)\n            }\n\n            is TrendingViewData.Header -> {\n                val holder = viewHolder as TrendingDateViewHolder\n                holder.setup(viewData.start, viewData.end)\n            }\n        }\n    }\n\n    override fun getItemViewType(position: Int): Int {\n        return if (getItem(position) is TrendingViewData.Tag) {\n            VIEW_TYPE_TAG\n        } else {\n            VIEW_TYPE_HEADER\n        }\n    }\n\n    companion object {\n        const val VIEW_TYPE_HEADER = 0\n        const val VIEW_TYPE_TAG = 1\n\n        val TrendingDifferCallback = object : DiffUtil.ItemCallback<TrendingViewData>() {\n            override fun areItemsTheSame(\n                oldItem: TrendingViewData,\n                newItem: TrendingViewData\n            ): Boolean {\n                return oldItem.id == newItem.id\n            }\n\n            override fun areContentsTheSame(\n                oldItem: TrendingViewData,\n                newItem: TrendingViewData\n            ): Boolean {\n                return oldItem == newItem\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagsFragment.kt",
    "content": "/* Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.trending\n\nimport android.content.res.Configuration\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.View\nimport android.view.accessibility.AccessibilityManager\nimport androidx.core.content.getSystemService\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.GridLayoutManager\nimport androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.SimpleItemAnimator\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener\nimport at.connyduck.sparkbutton.helpers.Utils\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.StatusListActivity\nimport com.keylesspalace.tusky.components.trending.viewmodel.TrendingTagsViewModel\nimport com.keylesspalace.tusky.databinding.FragmentTrendingTagsBinding\nimport com.keylesspalace.tusky.interfaces.ActionButtonActivity\nimport com.keylesspalace.tusky.interfaces.RefreshableFragment\nimport com.keylesspalace.tusky.interfaces.ReselectableFragment\nimport com.keylesspalace.tusky.util.ensureBottomPadding\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.viewdata.TrendingViewData\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass TrendingTagsFragment :\n    Fragment(R.layout.fragment_trending_tags),\n    OnRefreshListener,\n    ReselectableFragment,\n    RefreshableFragment {\n\n    private val viewModel: TrendingTagsViewModel by viewModels()\n\n    private val binding by viewBinding(FragmentTrendingTagsBinding::bind)\n\n    private var adapter: TrendingTagsAdapter? = null\n\n    override fun onConfigurationChanged(newConfig: Configuration) {\n        super.onConfigurationChanged(newConfig)\n        val columnCount =\n            requireContext().resources.getInteger(R.integer.trending_column_count)\n        adapter?.let {\n            setupLayoutManager(it, columnCount)\n        }\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        val adapter = TrendingTagsAdapter(::onViewTag)\n        this.adapter = adapter\n        binding.swipeRefreshLayout.setOnRefreshListener(this)\n        setupRecyclerView(adapter)\n\n        adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {\n            override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {\n                val firstPos = (binding.recyclerView.layoutManager as LinearLayoutManager).findFirstCompletelyVisibleItemPosition()\n                if (firstPos == 0 && positionStart == 0 && adapter.itemCount != itemCount) {\n                    binding.recyclerView.post {\n                        if (getView() != null) {\n                            binding.recyclerView.scrollBy(\n                                0,\n                                Utils.dpToPx(requireContext(), -30)\n                            )\n                        }\n                    }\n                }\n            }\n        })\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.uiState.collectLatest { trendingState ->\n                processViewState(adapter, trendingState)\n            }\n        }\n    }\n\n    override fun onDestroyView() {\n        // Clear the adapter to prevent leaking the View\n        adapter = null\n        super.onDestroyView()\n    }\n\n    private fun setupLayoutManager(adapter: TrendingTagsAdapter, columnCount: Int) {\n        binding.recyclerView.layoutManager = GridLayoutManager(context, columnCount).apply {\n            spanSizeLookup = object : SpanSizeLookup() {\n                override fun getSpanSize(position: Int): Int {\n                    return when (adapter.getItemViewType(position)) {\n                        TrendingTagsAdapter.VIEW_TYPE_HEADER -> columnCount\n                        TrendingTagsAdapter.VIEW_TYPE_TAG -> 1\n                        else -> -1\n                    }\n                }\n            }\n        }\n    }\n\n    private fun setupRecyclerView(adapter: TrendingTagsAdapter) {\n        binding.recyclerView.ensureBottomPadding(fab = actionButtonPresent())\n\n        val columnCount =\n            requireContext().resources.getInteger(R.integer.trending_column_count)\n        setupLayoutManager(adapter, columnCount)\n\n        binding.recyclerView.setHasFixedSize(true)\n\n        (binding.recyclerView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false\n        binding.recyclerView.adapter = adapter\n    }\n\n    override fun onRefresh() {\n        viewModel.invalidate(true)\n    }\n\n    fun onViewTag(tag: String) {\n        requireActivity().startActivityWithSlideInAnimation(\n            StatusListActivity.newHashtagIntent(requireContext(), tag)\n        )\n    }\n\n    private fun processViewState(\n        adapter: TrendingTagsAdapter,\n        uiState: TrendingTagsViewModel.TrendingTagsUiState\n    ) {\n        Log.d(TAG, uiState.loadingState.name)\n        when (uiState.loadingState) {\n            TrendingTagsViewModel.LoadingState.INITIAL -> clearLoadingState()\n            TrendingTagsViewModel.LoadingState.LOADING -> applyLoadingState()\n            TrendingTagsViewModel.LoadingState.REFRESHING -> applyRefreshingState()\n            TrendingTagsViewModel.LoadingState.LOADED -> applyLoadedState(adapter, uiState.trendingViewData)\n            TrendingTagsViewModel.LoadingState.ERROR_NETWORK -> networkError()\n            TrendingTagsViewModel.LoadingState.ERROR_OTHER -> otherError()\n        }\n    }\n\n    private fun applyLoadedState(adapter: TrendingTagsAdapter, viewData: List<TrendingViewData>) {\n        clearLoadingState()\n\n        adapter.submitList(viewData)\n\n        if (viewData.isEmpty()) {\n            binding.recyclerView.hide()\n            binding.messageView.show()\n            binding.messageView.setup(\n                R.drawable.elephant_friend_empty,\n                R.string.message_empty,\n                null\n            )\n        } else {\n            binding.recyclerView.show()\n            binding.messageView.hide()\n        }\n        binding.progressBar.hide()\n    }\n\n    private fun applyRefreshingState() {\n        binding.swipeRefreshLayout.isRefreshing = true\n    }\n\n    private fun applyLoadingState() {\n        binding.recyclerView.hide()\n        binding.messageView.hide()\n        binding.progressBar.show()\n    }\n\n    private fun clearLoadingState() {\n        binding.swipeRefreshLayout.isRefreshing = false\n        binding.progressBar.hide()\n        binding.messageView.hide()\n    }\n\n    private fun networkError() {\n        binding.recyclerView.hide()\n        binding.messageView.show()\n        binding.progressBar.hide()\n\n        binding.swipeRefreshLayout.isRefreshing = false\n        binding.messageView.setup(\n            R.drawable.errorphant_offline,\n            R.string.error_network\n        ) { refreshContent() }\n    }\n\n    private fun otherError() {\n        binding.recyclerView.hide()\n        binding.messageView.show()\n        binding.progressBar.hide()\n\n        binding.swipeRefreshLayout.isRefreshing = false\n        binding.messageView.setup(\n            R.drawable.errorphant_error,\n            R.string.error_generic\n        ) { refreshContent() }\n    }\n\n    private fun actionButtonPresent(): Boolean {\n        return (activity as? ActionButtonActivity?)?.actionButton != null\n    }\n\n    private var talkBackWasEnabled = false\n\n    override fun onResume() {\n        super.onResume()\n        val a11yManager = requireContext().getSystemService<AccessibilityManager>()\n\n        val wasEnabled = talkBackWasEnabled\n        talkBackWasEnabled = a11yManager?.isEnabled == true\n        Log.d(TAG, \"talkback was enabled: $wasEnabled, now $talkBackWasEnabled\")\n        if (talkBackWasEnabled && !wasEnabled) {\n            val adapter = requireNotNull(this.adapter)\n            adapter.notifyItemRangeChanged(0, adapter.itemCount)\n        }\n    }\n\n    override fun onReselect() {\n        if (view != null) {\n            binding.recyclerView.layoutManager?.scrollToPosition(0)\n            binding.recyclerView.stopScroll()\n        }\n    }\n\n    override fun refreshContent() {\n        onRefresh()\n    }\n\n    companion object {\n        private const val TAG = \"TrendingTagsFragment\"\n\n        fun newInstance() = TrendingTagsFragment()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/trending/viewmodel/TrendingTagsViewModel.kt",
    "content": "/* Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.trending.viewmodel\n\nimport android.util.Log\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport at.connyduck.calladapter.networkresult.fold\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.PreferenceChangedEvent\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.entity.end\nimport com.keylesspalace.tusky.entity.start\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.toViewData\nimport com.keylesspalace.tusky.viewdata.TrendingViewData\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport java.io.IOException\nimport javax.inject.Inject\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.filterIsInstance\nimport kotlinx.coroutines.launch\n\n@HiltViewModel\nclass TrendingTagsViewModel @Inject constructor(\n    private val mastodonApi: MastodonApi,\n    private val eventHub: EventHub\n) : ViewModel() {\n    enum class LoadingState {\n        INITIAL,\n        LOADING,\n        REFRESHING,\n        LOADED,\n        ERROR_NETWORK,\n        ERROR_OTHER\n    }\n\n    data class TrendingTagsUiState(\n        val trendingViewData: List<TrendingViewData>,\n        val loadingState: LoadingState\n    )\n\n    val uiState: Flow<TrendingTagsUiState> get() = _uiState\n    private val _uiState = MutableStateFlow(TrendingTagsUiState(listOf(), LoadingState.INITIAL))\n\n    init {\n        invalidate()\n\n        // Collect PreferenceChangedEvent, FiltersActivity creates them when a filter is created\n        // or deleted. Unfortunately, there's nothing in the event to determine if it's a filter\n        // that was modified, so refresh on every preference change.\n        viewModelScope.launch {\n            eventHub.events\n                .filterIsInstance<PreferenceChangedEvent>()\n                .collect {\n                    invalidate()\n                }\n        }\n    }\n\n    /**\n     * Invalidate the current list of trending tags and fetch a new list.\n     *\n     * A tag is excluded if it is filtered by the user on their home timeline.\n     */\n    fun invalidate(refresh: Boolean = false) = viewModelScope.launch {\n        if (refresh) {\n            _uiState.value = TrendingTagsUiState(emptyList(), LoadingState.REFRESHING)\n        } else {\n            _uiState.value = TrendingTagsUiState(emptyList(), LoadingState.LOADING)\n        }\n\n        val deferredFilters = async { mastodonApi.getFilters() }\n\n        mastodonApi.trendingTags().fold(\n            { tagResponse ->\n\n                val firstTag = tagResponse.firstOrNull()\n                _uiState.value = if (firstTag == null) {\n                    TrendingTagsUiState(emptyList(), LoadingState.LOADED)\n                } else {\n                    val homeFilters = deferredFilters.await().getOrNull()?.filter { filter ->\n                        filter.context.contains(Filter.Kind.HOME)\n                    }\n                    val tags = tagResponse\n                        .filter { tag ->\n                            homeFilters?.none { filter ->\n                                filter.keywords.any { keyword -> keyword.keyword.equals(tag.name, ignoreCase = true) }\n                            } ?: false\n                        }\n                        .sortedByDescending { tag -> tag.history.sumOf { it.uses.toLongOrNull() ?: 0 } }\n                        .toViewData()\n\n                    val header = TrendingViewData.Header(firstTag.start, firstTag.end)\n                    TrendingTagsUiState(listOf(header) + tags, LoadingState.LOADED)\n                }\n            },\n            { error ->\n                Log.w(TAG, \"failed loading trending tags\", error)\n                if (error is IOException) {\n                    _uiState.value = TrendingTagsUiState(emptyList(), LoadingState.ERROR_NETWORK)\n                } else {\n                    _uiState.value = TrendingTagsUiState(emptyList(), LoadingState.ERROR_OTHER)\n                }\n            }\n        )\n    }\n\n    companion object {\n        private const val TAG = \"TrendingViewModel\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/viewthread/ConversationLineItemDecoration.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.viewthread\n\nimport android.content.Context\nimport android.graphics.Canvas\nimport android.graphics.drawable.Drawable\nimport android.view.View\nimport androidx.core.content.ContextCompat\nimport androidx.core.view.forEach\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\n\nclass ConversationLineItemDecoration(context: Context) : RecyclerView.ItemDecoration() {\n    private val divider: Drawable = ContextCompat.getDrawable(\n        context,\n        R.drawable.conversation_thread_line\n    )!!\n\n    private val avatarTopMargin = context.resources.getDimensionPixelSize(\n        R.dimen.account_avatar_margin\n    )\n    private val halfAvatarHeight = context.resources.getDimensionPixelSize(R.dimen.timeline_status_avatar_height) / 2\n    private val statusLineMarginStart = context.resources.getDimensionPixelSize(\n        R.dimen.status_line_margin_start\n    )\n\n    override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) {\n        val dividerStart = parent.paddingStart + statusLineMarginStart\n        val dividerEnd = dividerStart + divider.intrinsicWidth\n\n        val items = (parent.adapter as ThreadAdapter).currentList\n\n        parent.forEach { statusItemView ->\n            val position = parent.getChildAdapterPosition(statusItemView)\n\n            items.getOrNull(position)?.let { current ->\n                val above = items.getOrNull(position - 1)\n                val dividerTop = if (above != null && above.id == current.status.inReplyToId) {\n                    statusItemView.top\n                } else {\n                    statusItemView.top + avatarTopMargin + halfAvatarHeight\n                }\n                val below = items.getOrNull(position + 1)\n                val dividerBottom = if (below != null && current.id == below.status.inReplyToId && !current.isDetailed) {\n                    statusItemView.bottom\n                } else {\n                    statusItemView.top + avatarTopMargin + halfAvatarHeight\n                }\n\n                if (parent.layoutDirection == View.LAYOUT_DIRECTION_LTR) {\n                    divider.setBounds(dividerStart, dividerTop, dividerEnd, dividerBottom)\n                } else {\n                    divider.setBounds(\n                        canvas.width - dividerEnd,\n                        dividerTop,\n                        canvas.width - dividerStart,\n                        dividerBottom\n                    )\n                }\n                divider.draw(canvas)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/viewthread/ThreadAdapter.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.viewthread\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.adapter.FilteredStatusViewHolder\nimport com.keylesspalace.tusky.adapter.StatusBaseViewHolder\nimport com.keylesspalace.tusky.adapter.StatusDetailedViewHolder\nimport com.keylesspalace.tusky.adapter.StatusViewHolder\nimport com.keylesspalace.tusky.databinding.ItemStatusFilteredBinding\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.interfaces.StatusActionListener\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.viewdata.StatusViewData\n\nclass ThreadAdapter(\n    private val statusDisplayOptions: StatusDisplayOptions,\n    private val statusActionListener: StatusActionListener\n) : ListAdapter<StatusViewData.Concrete, RecyclerView.ViewHolder>(ThreadDifferCallback) {\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {\n        val inflater = LayoutInflater.from(parent.context)\n        return when (viewType) {\n            VIEW_TYPE_STATUS ->\n                StatusViewHolder(inflater.inflate(R.layout.item_status, parent, false))\n            VIEW_TYPE_STATUS_FILTERED ->\n                FilteredStatusViewHolder(\n                    ItemStatusFilteredBinding.inflate(inflater, parent, false),\n                    statusActionListener\n                )\n            VIEW_TYPE_STATUS_DETAILED ->\n                StatusDetailedViewHolder(\n                    inflater.inflate(R.layout.item_status_detailed, parent, false)\n                )\n            else -> error(\"Unknown item type: $viewType\")\n        }\n    }\n\n    override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) {\n        onBindViewHolder(viewHolder, position, emptyList())\n    }\n\n    override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int, payloads: List<Any>) {\n        val status = getItem(position)\n        if (viewHolder is FilteredStatusViewHolder) {\n            viewHolder.bind(status)\n        } else if (viewHolder is StatusBaseViewHolder) {\n            viewHolder.setupWithStatus(status, statusActionListener, statusDisplayOptions, payloads, false)\n        }\n    }\n\n    override fun getItemViewType(position: Int): Int {\n        val viewData = getItem(position)\n        return if (viewData.isDetailed) {\n            VIEW_TYPE_STATUS_DETAILED\n        } else if (viewData.filter?.action == Filter.Action.WARN) {\n            VIEW_TYPE_STATUS_FILTERED\n        } else {\n            VIEW_TYPE_STATUS\n        }\n    }\n\n    companion object {\n        private const val VIEW_TYPE_STATUS = 0\n        private const val VIEW_TYPE_STATUS_DETAILED = 1\n        private const val VIEW_TYPE_STATUS_FILTERED = 2\n\n        val ThreadDifferCallback = object : DiffUtil.ItemCallback<StatusViewData.Concrete>() {\n            override fun areItemsTheSame(\n                oldItem: StatusViewData.Concrete,\n                newItem: StatusViewData.Concrete\n            ): Boolean {\n                return oldItem.id == newItem.id\n            }\n\n            override fun areContentsTheSame(\n                oldItem: StatusViewData.Concrete,\n                newItem: StatusViewData.Concrete\n            ): Boolean {\n                return false // Items are different always. It allows to refresh timestamp on every view holder update\n            }\n\n            override fun getChangePayload(\n                oldItem: StatusViewData.Concrete,\n                newItem: StatusViewData.Concrete\n            ): Any? {\n                return if (oldItem == newItem) {\n                    // If items are equal - update timestamp only\n                    StatusBaseViewHolder.Key.KEY_CREATED\n                } else {\n                    // If items are different - update the whole view holder\n                    null\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadActivity.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.viewthread\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.fragment.app.commit\nimport com.keylesspalace.tusky.BottomSheetActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ActivityViewThreadBinding\nimport com.keylesspalace.tusky.util.viewBinding\nimport dagger.hilt.android.AndroidEntryPoint\n\n@AndroidEntryPoint\nclass ViewThreadActivity : BottomSheetActivity() {\n\n    private val binding by viewBinding(ActivityViewThreadBinding::inflate)\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        setSupportActionBar(binding.includedToolbar.toolbar)\n        supportActionBar?.run {\n            setDisplayHomeAsUpEnabled(true)\n            setDisplayShowHomeEnabled(true)\n            setDisplayShowTitleEnabled(true)\n        }\n\n        setTitle(R.string.title_view_thread)\n\n        val id = intent.getStringExtra(ID_EXTRA)!!\n        val url = intent.getStringExtra(URL_EXTRA)!!\n        val fragment =\n            supportFragmentManager.findFragmentByTag(FRAGMENT_TAG + id) as ViewThreadFragment?\n                ?: ViewThreadFragment.newInstance(id, url)\n\n        supportFragmentManager.commit {\n            replace(R.id.fragment_container, fragment, FRAGMENT_TAG + id)\n        }\n    }\n\n    companion object {\n\n        fun startIntent(context: Context, id: String, url: String): Intent {\n            val intent = Intent(context, ViewThreadActivity::class.java)\n            intent.putExtra(ID_EXTRA, id)\n            intent.putExtra(URL_EXTRA, url)\n            return intent\n        }\n\n        private const val ID_EXTRA = \"id\"\n        private const val URL_EXTRA = \"url\"\n        private const val FRAGMENT_TAG = \"ViewThreadFragment_\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadFragment.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.viewthread\n\nimport android.content.SharedPreferences\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.widget.LinearLayout\nimport androidx.annotation.CheckResult\nimport androidx.core.view.MenuProvider\nimport androidx.fragment.app.commit\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.SimpleItemAnimator\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener\nimport at.connyduck.calladapter.networkresult.onFailure\nimport at.connyduck.sparkbutton.SparkButton\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.accountlist.AccountListActivity\nimport com.keylesspalace.tusky.components.accountlist.AccountListActivity.Companion.newIntent\nimport com.keylesspalace.tusky.components.viewthread.edits.ViewEditsFragment\nimport com.keylesspalace.tusky.databinding.FragmentViewThreadBinding\nimport com.keylesspalace.tusky.db.DraftsAlert\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.fragment.SFragment\nimport com.keylesspalace.tusky.interfaces.StatusActionListener\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.util.CardViewMode\nimport com.keylesspalace.tusky.util.ListStatusAccessibilityDelegate\nimport com.keylesspalace.tusky.util.StatusDisplayOptions\nimport com.keylesspalace.tusky.util.ensureBottomPadding\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.openLink\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport com.keylesspalace.tusky.util.updateRelativeTimePeriodically\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.view.ConfirmationBottomSheet.Companion.confirmFavourite\nimport com.keylesspalace.tusky.view.ConfirmationBottomSheet.Companion.confirmReblog\nimport com.keylesspalace.tusky.viewdata.AttachmentViewData.Companion.list\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport com.keylesspalace.tusky.viewdata.TranslationViewData\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineStart\nimport kotlinx.coroutines.awaitCancellation\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass ViewThreadFragment :\n    SFragment(R.layout.fragment_view_thread),\n    OnRefreshListener,\n    StatusActionListener,\n    MenuProvider {\n\n    @Inject\n    lateinit var preferences: SharedPreferences\n\n    @Inject\n    lateinit var draftsAlert: DraftsAlert\n\n    private val viewModel: ViewThreadViewModel by viewModels()\n\n    private val binding by viewBinding(FragmentViewThreadBinding::bind)\n\n    private var adapter: ThreadAdapter? = null\n    private lateinit var thisThreadsStatusId: String\n\n    private var alwaysShowSensitiveMedia = false\n    private var alwaysOpenSpoiler = false\n\n    private var buttonToAnimate: SparkButton? = null\n\n    /**\n     * State of the \"reveal\" menu item that shows/hides content that is behind a content\n     * warning. Setting this invalidates the menu to redraw the menu item.\n     */\n    private var revealButtonState = RevealButtonState.NO_BUTTON\n        set(value) {\n            field = value\n            requireActivity().invalidateMenu()\n        }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        thisThreadsStatusId = requireArguments().getString(ID_EXTRA)!!\n    }\n\n    private fun createAdapter(): ThreadAdapter {\n        val statusDisplayOptions = StatusDisplayOptions(\n            animateAvatars = preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false),\n            mediaPreviewEnabled = accountManager.activeAccount!!.mediaPreviewEnabled,\n            useAbsoluteTime = preferences.getBoolean(PrefKeys.ABSOLUTE_TIME_VIEW, false),\n            showBotOverlay = preferences.getBoolean(PrefKeys.SHOW_BOT_OVERLAY, true),\n            useBlurhash = preferences.getBoolean(PrefKeys.USE_BLURHASH, true),\n            cardViewMode = if (preferences.getBoolean(PrefKeys.SHOW_CARDS_IN_TIMELINES, false)) {\n                CardViewMode.INDENTED\n            } else {\n                CardViewMode.NONE\n            },\n            hideStats = preferences.getBoolean(PrefKeys.WELLBEING_HIDE_STATS_POSTS, false),\n            animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false),\n            showStatsInline = preferences.getBoolean(PrefKeys.SHOW_STATS_INLINE, false),\n            showSensitiveMedia = accountManager.activeAccount!!.alwaysShowSensitiveMedia,\n            openSpoiler = accountManager.activeAccount!!.alwaysOpenSpoiler\n        )\n        return ThreadAdapter(statusDisplayOptions, this)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED)\n\n        val adapter = createAdapter()\n        this.adapter = adapter\n\n        binding.swipeRefreshLayout.setOnRefreshListener(this)\n\n        binding.recyclerView.ensureBottomPadding()\n\n        binding.recyclerView.setHasFixedSize(true)\n        binding.recyclerView.layoutManager = LinearLayoutManager(context)\n        binding.recyclerView.setAccessibilityDelegateCompat(\n            ListStatusAccessibilityDelegate(\n                binding.recyclerView,\n                this\n            ) { index -> adapter.currentList.getOrNull(index) }\n        )\n        val divider = DividerItemDecoration(context, LinearLayout.VERTICAL)\n        binding.recyclerView.addItemDecoration(divider)\n        binding.recyclerView.addItemDecoration(ConversationLineItemDecoration(requireContext()))\n        alwaysShowSensitiveMedia = accountManager.activeAccount!!.alwaysShowSensitiveMedia\n        alwaysOpenSpoiler = accountManager.activeAccount!!.alwaysOpenSpoiler\n\n        binding.recyclerView.adapter = adapter\n\n        (binding.recyclerView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false\n\n        var initialProgressBar = getProgressBarJob(binding.initialProgressBar, 500)\n        var threadProgressBar = getProgressBarJob(binding.threadProgressBar, 500)\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.uiState.collect { uiState ->\n                when (uiState) {\n                    is ThreadUiState.Loading -> {\n                        revealButtonState = RevealButtonState.NO_BUTTON\n\n                        binding.recyclerView.hide()\n                        binding.statusView.hide()\n\n                        initialProgressBar = getProgressBarJob(binding.initialProgressBar, 500)\n                        initialProgressBar.start()\n                    }\n\n                    is ThreadUiState.LoadingThread -> {\n                        if (uiState.statusViewDatum == null) {\n                            // no detailed statuses available, e.g. because author is blocked\n                            activity?.finish()\n                            return@collect\n                        }\n\n                        initialProgressBar.cancel()\n                        threadProgressBar = getProgressBarJob(binding.threadProgressBar, 500)\n                        threadProgressBar.start()\n\n                        if (viewModel.isInitialLoad) {\n                            adapter.submitList(listOf(uiState.statusViewDatum))\n\n                            // else this \"submit one and then all on success below\" will always center on the one\n                        }\n\n                        revealButtonState = uiState.revealButton\n                        binding.swipeRefreshLayout.isRefreshing = false\n\n                        binding.recyclerView.show()\n                        binding.statusView.hide()\n                    }\n\n                    is ThreadUiState.Error -> {\n                        Log.w(TAG, \"failed to load status\", uiState.throwable)\n                        initialProgressBar.cancel()\n                        threadProgressBar.cancel()\n\n                        revealButtonState = RevealButtonState.NO_BUTTON\n                        binding.swipeRefreshLayout.isRefreshing = false\n\n                        binding.recyclerView.hide()\n                        binding.statusView.show()\n\n                        binding.statusView.setup(\n                            uiState.throwable\n                        ) { viewModel.retry(thisThreadsStatusId) }\n                    }\n\n                    is ThreadUiState.Success -> {\n                        if (uiState.statusViewData.none { viewData -> viewData.isDetailed }) {\n                            // no detailed statuses available, e.g. because author is blocked\n                            activity?.finish()\n                            return@collect\n                        }\n\n                        threadProgressBar.cancel()\n\n                        adapter.submitList(uiState.statusViewData) {\n                            if (lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED) && viewModel.isInitialLoad) {\n                                viewModel.isInitialLoad = false\n\n                                // Ensure the top of the status is visible\n                                (binding.recyclerView.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(\n                                    uiState.detailedStatusPosition,\n                                    0\n                                )\n                            }\n                        }\n\n                        revealButtonState = uiState.revealButton\n                        binding.swipeRefreshLayout.isRefreshing = false\n\n                        binding.recyclerView.show()\n                        binding.statusView.hide()\n                    }\n\n                    is ThreadUiState.Refreshing -> {\n                        threadProgressBar.cancel()\n                    }\n                }\n            }\n        }\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.errors.collect { throwable ->\n                Log.w(TAG, \"failed to load status context\", throwable)\n                Snackbar.make(binding.root, R.string.error_generic, Snackbar.LENGTH_SHORT)\n                    .setAction(R.string.action_retry) {\n                        viewModel.retry(thisThreadsStatusId)\n                    }\n                    .show()\n            }\n        }\n\n        updateRelativeTimePeriodically(preferences, adapter)\n\n        draftsAlert.observeInContext(requireActivity(), true)\n\n        viewModel.loadThread(thisThreadsStatusId)\n    }\n\n    override fun onDestroyView() {\n        // Clear the adapter to prevent leaking the View\n        adapter = null\n        buttonToAnimate = null\n        super.onDestroyView()\n    }\n\n    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n        menuInflater.inflate(R.menu.fragment_view_thread, menu)\n        val actionReveal = menu.findItem(R.id.action_reveal)\n        actionReveal.isVisible = revealButtonState != RevealButtonState.NO_BUTTON\n        actionReveal.setIcon(\n            when (revealButtonState) {\n                RevealButtonState.REVEAL -> R.drawable.ic_visibility_24dp\n                else -> R.drawable.ic_visibility_off_24dp\n            }\n        )\n    }\n\n    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {\n        return when (menuItem.itemId) {\n            R.id.action_reveal -> {\n                viewModel.toggleRevealButton()\n                true\n            }\n\n            R.id.action_open_in_web -> {\n                context?.openLink(requireArguments().getString(URL_EXTRA)!!)\n                true\n            }\n\n            R.id.action_refresh -> {\n                onRefresh()\n                true\n            }\n\n            else -> false\n        }\n    }\n\n    /**\n     * Create a job to implement a delayed-visible progress bar.\n     *\n     * Delaying the visibility of the progress bar can improve user perception of UI speed because\n     * fewer UI elements are appearing and disappearing.\n     *\n     * When started the job will wait `delayMs` then show `view`. If the job is cancelled at\n     * any time `view` is hidden.\n     */\n    @CheckResult\n    private fun getProgressBarJob(view: View, delayMs: Long) =\n        viewLifecycleOwner.lifecycleScope.launch(\n            start = CoroutineStart.LAZY\n        ) {\n            try {\n                delay(delayMs)\n                view.show()\n                awaitCancellation()\n            } finally {\n                view.hide()\n            }\n        }\n\n    override fun onRefresh() {\n        viewModel.refresh(thisThreadsStatusId)\n    }\n\n    override fun onReply(position: Int) {\n        val viewData = adapter?.currentList?.getOrNull(position) ?: return\n        super.reply(viewData.status)\n    }\n\n    override fun onReblog(reblog: Boolean, position: Int, visibility: Status.Visibility?, button: SparkButton?) {\n        val status = adapter?.currentList?.getOrNull(position) ?: return\n        buttonToAnimate = button\n\n        if (reblog && visibility == null) {\n            confirmReblog(preferences) { visibility ->\n                viewModel.reblog(true, status, visibility)\n                buttonToAnimate?.playAnimation()\n                buttonToAnimate?.isChecked = true\n            }\n        } else {\n            viewModel.reblog(reblog, status, visibility ?: Status.Visibility.PUBLIC)\n            if (reblog) {\n                buttonToAnimate?.playAnimation()\n            }\n            buttonToAnimate?.isChecked = false\n        }\n    }\n\n    override val onMoreTranslate: ((translate: Boolean, position: Int) -> Unit) =\n        { translate: Boolean, position: Int ->\n            if (translate) {\n                onTranslate(position)\n            } else {\n                onUntranslate(\n                    position\n                )\n            }\n        }\n\n    private fun onTranslate(position: Int) {\n        val status = adapter?.currentList?.getOrNull(position) ?: return\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.translate(status)\n                .onFailure {\n                    Snackbar.make(\n                        requireView(),\n                        getString(R.string.ui_error_translate, it.message),\n                        Snackbar.LENGTH_LONG\n                    ).show()\n                }\n        }\n    }\n\n    override fun onUntranslate(position: Int) {\n        val status = adapter?.currentList?.getOrNull(position) ?: return\n        viewModel.untranslate(status)\n    }\n\n    override fun onFavourite(favourite: Boolean, position: Int, button: SparkButton?) {\n        val status = adapter?.currentList?.getOrNull(position) ?: return\n        buttonToAnimate = button\n\n        if (favourite) {\n            confirmFavourite(preferences) {\n                viewModel.favorite(true, status)\n                buttonToAnimate?.playAnimation()\n                buttonToAnimate?.isChecked = true\n            }\n        } else {\n            viewModel.favorite(false, status)\n            buttonToAnimate?.isChecked = false\n        }\n    }\n\n    override fun onBookmark(bookmark: Boolean, position: Int) {\n        val status = adapter?.currentList?.getOrNull(position) ?: return\n        viewModel.bookmark(bookmark, status)\n    }\n\n    override fun onMore(view: View, position: Int) {\n        val viewData = adapter?.currentList?.getOrNull(position) ?: return\n        super.more(\n            viewData.status,\n            view,\n            position,\n            (viewData.translation as? TranslationViewData.Loaded)?.data\n        )\n    }\n\n    override fun onViewMedia(position: Int, attachmentIndex: Int, view: View?) {\n        val status = adapter?.currentList?.getOrNull(position) ?: return\n        super.viewMedia(\n            attachmentIndex,\n            list(status, alwaysShowSensitiveMedia),\n            view\n        )\n    }\n\n    override fun onViewThread(position: Int) {\n        val status = adapter?.currentList?.getOrNull(position) ?: return\n        if (thisThreadsStatusId == status.id) {\n            // If already viewing this thread, don't reopen it.\n            return\n        }\n        super.viewThread(status.actionableId, status.actionable.url)\n    }\n\n    override fun onViewUrl(url: String) {\n        val status: StatusViewData.Concrete? = viewModel.detailedStatus()\n        if (status != null && status.status.url == url) {\n            // already viewing the status with this url\n            // probably just a preview federated and the user is clicking again to view more -> open the browser\n            // this can happen with some friendica statuses\n            requireContext().openLink(url)\n            return\n        }\n        super.onViewUrl(url)\n    }\n\n    override fun onOpenReblog(position: Int) {\n        // there are no reblogs in threads\n    }\n\n    override fun onExpandedChange(expanded: Boolean, position: Int) {\n        val status = adapter?.currentList?.getOrNull(position) ?: return\n        viewModel.changeExpanded(expanded, status)\n    }\n\n    override fun onContentHiddenChange(isShowing: Boolean, position: Int) {\n        val status = adapter?.currentList?.getOrNull(position) ?: return\n        viewModel.changeContentShowing(isShowing, status)\n    }\n\n    override fun onLoadMore(position: Int) {\n        // only used in timelines\n    }\n\n    override fun onShowReblogs(position: Int) {\n        val status = adapter?.currentList?.getOrNull(position) ?: return\n        val intent = newIntent(requireContext(), AccountListActivity.Type.REBLOGGED, status.id)\n        requireActivity().startActivityWithSlideInAnimation(intent)\n    }\n\n    override fun onShowFavs(position: Int) {\n        val status = adapter?.currentList?.getOrNull(position) ?: return\n        val intent = newIntent(requireContext(), AccountListActivity.Type.FAVOURITED, status.id)\n        requireActivity().startActivityWithSlideInAnimation(intent)\n    }\n\n    override fun onContentCollapsedChange(isCollapsed: Boolean, position: Int) {\n        val status = adapter?.currentList?.getOrNull(position) ?: return\n        viewModel.changeContentCollapsed(isCollapsed, status)\n    }\n\n    override fun onViewTag(tag: String) {\n        super.viewTag(tag)\n    }\n\n    override fun onViewAccount(id: String) {\n        super.viewAccount(id)\n    }\n\n    public override fun removeItem(position: Int) {\n        adapter?.currentList?.getOrNull(position)?.let { status ->\n            if (status.isDetailed) {\n                // the main status we are viewing is being removed, finish the activity\n                activity?.finish()\n                return\n            }\n            viewModel.removeStatus(status)\n        }\n    }\n\n    override fun onVoteInPoll(position: Int, choices: List<Int>) {\n        val status = adapter?.currentList?.getOrNull(position) ?: return\n        viewModel.voteInPoll(choices, status)\n    }\n\n    override fun onShowPollResults(position: Int) {\n        adapter?.currentList?.getOrNull(position)?.let { status ->\n            viewModel.showPollResults(status)\n        }\n    }\n\n    override fun onShowEdits(position: Int) {\n        val status = adapter?.currentList?.getOrNull(position) ?: return\n        val viewEditsFragment = ViewEditsFragment.newInstance(status.actionableId)\n\n        parentFragmentManager.commit {\n            setCustomAnimations(\n                R.anim.activity_open_enter,\n                R.anim.activity_open_exit,\n                R.anim.activity_close_enter,\n                R.anim.activity_close_exit\n            )\n            replace(R.id.fragment_container, viewEditsFragment, \"ViewEditsFragment_$id\")\n            addToBackStack(null)\n        }\n    }\n\n    override fun clearWarningAction(position: Int) {\n        val status = adapter?.currentList?.getOrNull(position) ?: return\n        viewModel.clearWarning(status)\n    }\n\n    companion object {\n        private const val TAG = \"ViewThreadFragment\"\n\n        private const val ID_EXTRA = \"id\"\n        private const val URL_EXTRA = \"url\"\n\n        fun newInstance(id: String, url: String): ViewThreadFragment {\n            val arguments = Bundle(2)\n            val fragment = ViewThreadFragment()\n            arguments.putString(ID_EXTRA, id)\n            arguments.putString(URL_EXTRA, url)\n            fragment.arguments = arguments\n            return fragment\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadViewModel.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.viewthread\n\nimport android.util.Log\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport at.connyduck.calladapter.networkresult.fold\nimport at.connyduck.calladapter.networkresult.getOrElse\nimport at.connyduck.calladapter.networkresult.getOrThrow\nimport at.connyduck.calladapter.networkresult.map\nimport at.connyduck.calladapter.networkresult.onFailure\nimport at.connyduck.calladapter.networkresult.onSuccess\nimport com.keylesspalace.tusky.appstore.BlockEvent\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.StatusChangedEvent\nimport com.keylesspalace.tusky.appstore.StatusComposedEvent\nimport com.keylesspalace.tusky.appstore.StatusDeletedEvent\nimport com.keylesspalace.tusky.components.timeline.toStatus\nimport com.keylesspalace.tusky.components.timeline.util.ifExpected\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.network.FilterModel\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.usecase.TimelineCases\nimport com.keylesspalace.tusky.util.toViewData\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport com.keylesspalace.tusky.viewdata.TranslationViewData\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharedFlow\nimport kotlinx.coroutines.flow.asSharedFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport kotlinx.coroutines.flow.update\nimport kotlinx.coroutines.launch\n\n@HiltViewModel\nclass ViewThreadViewModel @Inject constructor(\n    private val api: MastodonApi,\n    private val filterModel: FilterModel,\n    private val timelineCases: TimelineCases,\n    private val db: AppDatabase,\n    eventHub: EventHub,\n    accountManager: AccountManager,\n) : ViewModel() {\n\n    private val activeAccount = accountManager.activeAccount!!\n\n    private val _uiState = MutableStateFlow(ThreadUiState.Loading as ThreadUiState)\n    val uiState: Flow<ThreadUiState> = _uiState.asStateFlow()\n\n    private val _errors = MutableSharedFlow<Throwable>(\n        replay = 0,\n        extraBufferCapacity = 1,\n        onBufferOverflow = BufferOverflow.DROP_OLDEST\n    )\n    val errors: SharedFlow<Throwable> = _errors.asSharedFlow()\n\n    var isInitialLoad: Boolean = true\n\n    private val alwaysShowSensitiveMedia: Boolean = activeAccount.alwaysShowSensitiveMedia\n    private val alwaysOpenSpoiler: Boolean = activeAccount.alwaysOpenSpoiler\n\n    init {\n        viewModelScope.launch {\n            eventHub.events\n                .collect { event ->\n                    when (event) {\n                        is StatusChangedEvent -> handleStatusChangedEvent(event.status)\n                        is BlockEvent -> removeAllByAccountId(event.accountId)\n                        is StatusComposedEvent -> handleStatusComposedEvent(event)\n                        is StatusDeletedEvent -> handleStatusDeletedEvent(event)\n                    }\n                }\n        }\n    }\n\n    fun loadThread(id: String) {\n        _uiState.value = ThreadUiState.Loading\n\n        viewModelScope.launch {\n            Log.d(TAG, \"Finding status with: $id\")\n            val filterCall = async { filterModel.init(Filter.Kind.THREAD) }\n\n            val contextCall = async { api.statusContext(id) }\n            val statusAndAccount = db.timelineStatusDao().getStatusWithAccount(activeAccount.id, id)\n\n            var detailedStatus = if (statusAndAccount != null) {\n                Log.d(TAG, \"Loaded status from local timeline\")\n                StatusViewData.Concrete(\n                    status = statusAndAccount.first.toStatus(statusAndAccount.second),\n                    isExpanded = statusAndAccount.first.expanded,\n                    isShowingContent = statusAndAccount.first.contentShowing,\n                    isCollapsed = statusAndAccount.first.contentCollapsed,\n                    isDetailed = true,\n                    // NOTE repliedToAccount is null here: this avoids showing \"in reply to\" over every post\n                    translation = null\n                )\n            } else {\n                Log.d(TAG, \"Loaded status from network\")\n                val result = api.status(id).getOrElse { exception ->\n                    _uiState.value = ThreadUiState.Error(exception)\n                    return@launch\n                }\n                result.toViewData(isDetailed = true)\n            }\n\n            _uiState.value = ThreadUiState.LoadingThread(\n                statusViewDatum = detailedStatus,\n                revealButton = detailedStatus.getRevealButtonState()\n            )\n\n            // If the detailedStatus was loaded from the database it might be out-of-date\n            // compared to the remote one. Now the user has a working UI do a background fetch\n            // for the status. Ignore errors, the user still has a functioning UI if the fetch\n            // failed. Update the database when the fetch was successful.\n            if (statusAndAccount != null) {\n                api.status(id).onSuccess { result ->\n                    db.timelineStatusDao().update(tuskyAccountId = activeAccount.id, status = result)\n                    detailedStatus = result.toViewData(isDetailed = true)\n                }\n            }\n\n            filterCall.await() // make sure FilterModel is initialized before using it\n            val contextResult = contextCall.await()\n\n            contextResult.fold({ statusContext ->\n                val ancestors =\n                    statusContext.ancestors.map { status -> status.toViewData() }.filter()\n                val descendants =\n                    statusContext.descendants.map { status -> status.toViewData() }.filter()\n                val statuses = ancestors + detailedStatus + descendants\n\n                _uiState.value = ThreadUiState.Success(\n                    statusViewData = statuses,\n                    detailedStatusPosition = ancestors.size,\n                    revealButton = statuses.getRevealButtonState()\n                )\n            }, { throwable ->\n                _errors.emit(throwable)\n                _uiState.value = ThreadUiState.Success(\n                    statusViewData = listOf(detailedStatus),\n                    detailedStatusPosition = 0,\n                    revealButton = RevealButtonState.NO_BUTTON\n                )\n            })\n        }\n    }\n\n    fun retry(id: String) {\n        _uiState.value = ThreadUiState.Loading\n        loadThread(id)\n    }\n\n    fun refresh(id: String) {\n        _uiState.value = ThreadUiState.Refreshing\n        loadThread(id)\n    }\n\n    fun detailedStatus(): StatusViewData.Concrete? {\n        return when (val uiState = _uiState.value) {\n            is ThreadUiState.Success -> uiState.statusViewData.find { status ->\n                status.isDetailed\n            }\n\n            is ThreadUiState.LoadingThread -> uiState.statusViewDatum\n            else -> null\n        }\n    }\n\n    fun reblog(reblog: Boolean, status: StatusViewData.Concrete, visibility: Status.Visibility = Status.Visibility.PUBLIC): Job = viewModelScope.launch {\n        try {\n            timelineCases.reblog(status.actionableId, reblog, visibility).getOrThrow()\n        } catch (t: Exception) {\n            ifExpected(t) {\n                Log.d(TAG, \"Failed to reblog status \" + status.actionableId, t)\n            }\n        }\n    }\n\n    fun favorite(favorite: Boolean, status: StatusViewData.Concrete): Job = viewModelScope.launch {\n        try {\n            timelineCases.favourite(status.actionableId, favorite).getOrThrow()\n        } catch (t: Exception) {\n            ifExpected(t) {\n                Log.d(TAG, \"Failed to favourite status \" + status.actionableId, t)\n            }\n        }\n    }\n\n    fun bookmark(bookmark: Boolean, status: StatusViewData.Concrete): Job = viewModelScope.launch {\n        try {\n            timelineCases.bookmark(status.actionableId, bookmark).getOrThrow()\n        } catch (t: Exception) {\n            ifExpected(t) {\n                Log.d(TAG, \"Failed to bookmark status \" + status.actionableId, t)\n            }\n        }\n    }\n\n    fun voteInPoll(choices: List<Int>, status: StatusViewData.Concrete): Job =\n        viewModelScope.launch {\n            val poll = status.status.actionableStatus.poll ?: run {\n                Log.w(TAG, \"No poll on status ${status.id}\")\n                return@launch\n            }\n\n            val votedPoll = poll.votedCopy(choices)\n            updateStatus(status.id) { status ->\n                status.copy(poll = votedPoll)\n            }\n\n            try {\n                timelineCases.voteInPoll(status.actionableId, poll.id, choices).getOrThrow()\n            } catch (t: Exception) {\n                ifExpected(t) {\n                    Log.d(TAG, \"Failed to vote in poll: \" + status.actionableId, t)\n                }\n            }\n        }\n\n    fun showPollResults(status: StatusViewData.Concrete) = viewModelScope.launch {\n        updateStatus(status.id) { it.copy(poll = it.poll?.copy(voted = true)) }\n    }\n\n    fun removeStatus(statusToRemove: StatusViewData.Concrete) {\n        updateSuccess { uiState ->\n            uiState.copy(\n                statusViewData = uiState.statusViewData.filterNot { status -> status == statusToRemove }\n            )\n        }\n    }\n\n    fun changeExpanded(expanded: Boolean, status: StatusViewData.Concrete) {\n        updateSuccess { uiState ->\n            val statuses = uiState.statusViewData.map { viewData ->\n                if (viewData.id == status.id) {\n                    viewData.copy(isExpanded = expanded)\n                } else {\n                    viewData\n                }\n            }\n            uiState.copy(\n                statusViewData = statuses,\n                revealButton = statuses.getRevealButtonState()\n            )\n        }\n    }\n\n    fun changeContentShowing(isShowing: Boolean, status: StatusViewData.Concrete) {\n        updateStatusViewData(status.id) { viewData ->\n            viewData.copy(isShowingContent = isShowing)\n        }\n    }\n\n    fun changeContentCollapsed(isCollapsed: Boolean, status: StatusViewData.Concrete) {\n        updateStatusViewData(status.id) { viewData ->\n            viewData.copy(isCollapsed = isCollapsed)\n        }\n    }\n\n    suspend fun translate(status: StatusViewData.Concrete): NetworkResult<Unit> {\n        updateStatusViewData(status.id) { viewData ->\n            viewData.copy(translation = TranslationViewData.Loading)\n        }\n        return timelineCases.translate(status.actionableId)\n            .map { translation ->\n                updateStatusViewData(status.id) { viewData ->\n                    viewData.copy(translation = TranslationViewData.Loaded(translation))\n                }\n            }\n            .onFailure {\n                updateStatusViewData(status.id) { viewData ->\n                    viewData.copy(translation = null)\n                }\n            }\n    }\n\n    fun untranslate(status: StatusViewData.Concrete) {\n        updateStatusViewData(status.id) { viewData ->\n            viewData.copy(translation = null)\n        }\n    }\n\n    private fun handleStatusChangedEvent(status: Status) {\n        updateStatusViewData(status.id) { viewData ->\n            status.toViewData(\n                isShowingContent = viewData.isShowingContent,\n                isExpanded = viewData.isExpanded,\n                isCollapsed = viewData.isCollapsed,\n                isDetailed = viewData.isDetailed,\n                translation = viewData.translation,\n                filter = viewData.filter,\n            )\n        }\n    }\n\n    private fun removeAllByAccountId(accountId: String) {\n        updateSuccess { uiState ->\n            uiState.copy(\n                statusViewData = uiState.statusViewData.filter { viewData ->\n                    viewData.status.account.id != accountId\n                }\n            )\n        }\n    }\n\n    private fun handleStatusComposedEvent(event: StatusComposedEvent) {\n        val eventStatus = event.status\n        updateSuccess { uiState ->\n            val statuses = uiState.statusViewData\n            val detailedIndex = statuses.indexOfFirst { status -> status.isDetailed }\n            val repliedIndex =\n                statuses.indexOfFirst { status -> eventStatus.inReplyToId == status.id }\n            if (detailedIndex != -1 && repliedIndex >= detailedIndex) {\n                // there is a new reply to the detailed status or below -> display it\n                val newStatuses = statuses.subList(0, repliedIndex + 1) +\n                    eventStatus.toViewData() +\n                    statuses.subList(repliedIndex + 1, statuses.size)\n                uiState.copy(statusViewData = newStatuses)\n            } else {\n                uiState\n            }\n        }\n    }\n\n    private fun handleStatusDeletedEvent(event: StatusDeletedEvent) {\n        updateSuccess { uiState ->\n            uiState.copy(\n                statusViewData = uiState.statusViewData.filter { status ->\n                    status.id != event.statusId\n                }\n            )\n        }\n    }\n\n    fun toggleRevealButton() {\n        updateSuccess { uiState ->\n            when (uiState.revealButton) {\n                RevealButtonState.HIDE -> uiState.copy(\n                    statusViewData = uiState.statusViewData.map { viewData ->\n                        viewData.copy(isExpanded = false)\n                    },\n                    revealButton = RevealButtonState.REVEAL\n                )\n\n                RevealButtonState.REVEAL -> uiState.copy(\n                    statusViewData = uiState.statusViewData.map { viewData ->\n                        viewData.copy(isExpanded = true)\n                    },\n                    revealButton = RevealButtonState.HIDE\n                )\n\n                else -> uiState\n            }\n        }\n    }\n\n    private fun StatusViewData.Concrete.getRevealButtonState(): RevealButtonState {\n        val hasWarnings = status.spoilerText.isNotEmpty()\n\n        return if (hasWarnings) {\n            if (isExpanded) {\n                RevealButtonState.HIDE\n            } else {\n                RevealButtonState.REVEAL\n            }\n        } else {\n            RevealButtonState.NO_BUTTON\n        }\n    }\n\n    /**\n     * Get the reveal button state based on the state of all the statuses in the list.\n     *\n     * - If any status sets it to REVEAL, use REVEAL\n     * - If no status sets it to REVEAL, but at least one uses HIDE, use HIDE\n     * - Otherwise use NO_BUTTON\n     */\n    private fun List<StatusViewData.Concrete>.getRevealButtonState(): RevealButtonState {\n        var seenHide = false\n\n        forEach {\n            when (val state = it.getRevealButtonState()) {\n                RevealButtonState.NO_BUTTON -> return@forEach\n                RevealButtonState.REVEAL -> return state\n                RevealButtonState.HIDE -> seenHide = true\n            }\n        }\n\n        if (seenHide) {\n            return RevealButtonState.HIDE\n        }\n\n        return RevealButtonState.NO_BUTTON\n    }\n\n    private fun List<StatusViewData.Concrete>.filter(): List<StatusViewData.Concrete> {\n        return filter { status ->\n            if (status.isDetailed || status.status.account.id == activeAccount.accountId) {\n                true\n            } else {\n                status.filter = filterModel.shouldFilterStatus(status.status)\n                status.filter?.action != Filter.Action.HIDE\n            }\n        }\n    }\n\n    private fun Status.toViewData(isDetailed: Boolean = false): StatusViewData.Concrete {\n        val oldStatus = (_uiState.value as? ThreadUiState.Success)?.statusViewData?.find {\n            it.id == this.id\n        }\n        return toViewData(\n            isShowingContent = oldStatus?.isShowingContent ?: actionableStatus.shouldShowContent(alwaysShowSensitiveMedia, Filter.Kind.THREAD),\n            isExpanded = oldStatus?.isExpanded ?: alwaysOpenSpoiler,\n            isCollapsed = oldStatus?.isCollapsed ?: !isDetailed,\n            isDetailed = oldStatus?.isDetailed ?: isDetailed,\n            filter = oldStatus?.filter ?: actionableStatus.getApplicableFilter(Filter.Kind.THREAD),\n        )\n    }\n\n    private inline fun updateSuccess(updater: (ThreadUiState.Success) -> ThreadUiState.Success) {\n        _uiState.update { uiState ->\n            if (uiState is ThreadUiState.Success) {\n                updater(uiState)\n            } else {\n                uiState\n            }\n        }\n    }\n\n    private fun updateStatusViewData(\n        statusId: String,\n        updater: (StatusViewData.Concrete) -> StatusViewData.Concrete\n    ) {\n        updateSuccess { uiState ->\n            uiState.copy(\n                statusViewData = uiState.statusViewData.map { viewData ->\n                    if (viewData.id == statusId) {\n                        updater(viewData)\n                    } else {\n                        viewData\n                    }\n                }\n            )\n        }\n    }\n\n    private fun updateStatus(statusId: String, updater: (Status) -> Status) {\n        updateStatusViewData(statusId) { viewData ->\n            viewData.copy(\n                status = updater(viewData.status)\n            )\n        }\n    }\n\n    fun clearWarning(viewData: StatusViewData.Concrete) {\n        updateStatus(viewData.id) { status ->\n            status.copy(filtered = emptyList())\n        }\n    }\n\n    companion object {\n        private const val TAG = \"ViewThreadViewModel\"\n    }\n}\n\nsealed interface ThreadUiState {\n    /** The initial load of the detailed status for this thread */\n    data object Loading : ThreadUiState\n\n    /** Loading the detailed status has completed, now loading ancestors/descendants */\n    data class LoadingThread(\n        val statusViewDatum: StatusViewData.Concrete?,\n        val revealButton: RevealButtonState\n    ) : ThreadUiState\n\n    /** An error occurred at any point */\n    class Error(val throwable: Throwable) : ThreadUiState\n\n    /** Successfully loaded the full thread */\n    data class Success(\n        val statusViewData: List<StatusViewData.Concrete>,\n        val revealButton: RevealButtonState,\n        val detailedStatusPosition: Int\n    ) : ThreadUiState\n\n    /** Refreshing the thread with a swipe */\n    data object Refreshing : ThreadUiState\n}\n\nenum class RevealButtonState {\n    NO_BUTTON,\n    REVEAL,\n    HIDE\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/viewthread/edits/ViewEditsAdapter.kt",
    "content": "package com.keylesspalace.tusky.components.viewthread.edits\n\nimport android.content.Context\nimport android.graphics.Typeface.DEFAULT_BOLD\nimport android.graphics.drawable.Drawable\nimport android.text.Editable\nimport android.text.SpannableStringBuilder\nimport android.text.TextPaint\nimport android.text.style.CharacterStyle\nimport android.util.TypedValue\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.graphics.drawable.toDrawable\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.bumptech.glide.Glide\nimport com.google.android.material.color.MaterialColors\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.adapter.PollAdapter\nimport com.keylesspalace.tusky.adapter.PollAdapter.Companion.MULTIPLE\nimport com.keylesspalace.tusky.adapter.PollAdapter.Companion.SINGLE\nimport com.keylesspalace.tusky.databinding.ItemStatusEditBinding\nimport com.keylesspalace.tusky.entity.Attachment.Focus\nimport com.keylesspalace.tusky.entity.StatusEdit\nimport com.keylesspalace.tusky.interfaces.LinkListener\nimport com.keylesspalace.tusky.util.AbsoluteTimeFormatter\nimport com.keylesspalace.tusky.util.BindingHolder\nimport com.keylesspalace.tusky.util.BlurhashDrawable\nimport com.keylesspalace.tusky.util.TuskyTagHandler\nimport com.keylesspalace.tusky.util.aspectRatios\nimport com.keylesspalace.tusky.util.emojify\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.parseAsMastodonHtml\nimport com.keylesspalace.tusky.util.setClickableText\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.visible\nimport com.keylesspalace.tusky.viewdata.toViewData\nimport org.xml.sax.XMLReader\n\nclass ViewEditsAdapter(\n    private val edits: List<StatusEdit>,\n    private val animateEmojis: Boolean,\n    private val useBlurhash: Boolean,\n    private val listener: LinkListener\n) : RecyclerView.Adapter<BindingHolder<ItemStatusEditBinding>>() {\n\n    private val absoluteTimeFormatter = AbsoluteTimeFormatter()\n\n    /** Size of large text in this theme, in px */\n    private var largeTextSizePx: Float = 0f\n\n    /** Size of medium text in this theme, in px */\n    private var mediumTextSizePx: Float = 0f\n\n    override fun onCreateViewHolder(\n        parent: ViewGroup,\n        viewType: Int\n    ): BindingHolder<ItemStatusEditBinding> {\n        val binding = ItemStatusEditBinding.inflate(\n            LayoutInflater.from(parent.context),\n            parent,\n            false\n        )\n\n        binding.statusEditMediaPreview.clipToOutline = true\n\n        val typedValue = TypedValue()\n        val context = binding.root.context\n        val displayMetrics = context.resources.displayMetrics\n        context.theme.resolveAttribute(R.attr.status_text_large, typedValue, true)\n        largeTextSizePx = typedValue.getDimension(displayMetrics)\n        context.theme.resolveAttribute(R.attr.status_text_medium, typedValue, true)\n        mediumTextSizePx = typedValue.getDimension(displayMetrics)\n\n        return BindingHolder(binding)\n    }\n\n    override fun onBindViewHolder(holder: BindingHolder<ItemStatusEditBinding>, position: Int) {\n        val edit = edits[position]\n\n        val binding = holder.binding\n\n        val context = binding.root.context\n\n        val infoStringRes = if (position == edits.lastIndex) {\n            R.string.status_created_info\n        } else {\n            R.string.status_edit_info\n        }\n\n        // Show the most recent version of the status using large text to make it clearer for\n        // the user, and for similarity with thread view.\n        val variableTextSize = if (position == edits.lastIndex) {\n            mediumTextSizePx\n        } else {\n            largeTextSizePx\n        }\n        binding.statusEditContentWarningDescription.setTextSize(\n            TypedValue.COMPLEX_UNIT_PX,\n            variableTextSize\n        )\n        binding.statusEditContent.setTextSize(TypedValue.COMPLEX_UNIT_PX, variableTextSize)\n        binding.statusEditMediaSensitivity.setTextSize(TypedValue.COMPLEX_UNIT_PX, variableTextSize)\n\n        val timestamp = absoluteTimeFormatter.format(edit.createdAt, false)\n\n        binding.statusEditInfo.text = context.getString(infoStringRes, timestamp)\n\n        if (edit.spoilerText.isEmpty()) {\n            binding.statusEditContentWarningDescription.hide()\n            binding.statusEditContentWarningSeparator.hide()\n        } else {\n            binding.statusEditContentWarningDescription.show()\n            binding.statusEditContentWarningSeparator.show()\n            binding.statusEditContentWarningDescription.text = edit.spoilerText.emojify(\n                edit.emojis,\n                binding.statusEditContentWarningDescription,\n                animateEmojis\n            )\n        }\n\n        val emojifiedText = edit\n            .content\n            .parseAsMastodonHtml(EditsTagHandler(context))\n            .emojify(edit.emojis, binding.statusEditContent, animateEmojis)\n\n        setClickableText(\n            binding.statusEditContent,\n            emojifiedText,\n            emptyList(),\n            emptyList(),\n            listener,\n        )\n\n        if (edit.poll == null) {\n            binding.statusEditPollOptions.hide()\n            binding.statusEditPollDescription.hide()\n        } else {\n            binding.statusEditPollOptions.show()\n\n            // not used for now since not reported by the api\n            // https://github.com/mastodon/mastodon/issues/22571\n            // binding.statusEditPollDescription.show()\n\n            val pollAdapter = PollAdapter()\n            binding.statusEditPollOptions.adapter = pollAdapter\n            binding.statusEditPollOptions.layoutManager = LinearLayoutManager(context)\n\n            pollAdapter.setup(\n                options = edit.poll.options.map { it.toViewData(false) },\n                voteCount = 0,\n                votersCount = null,\n                emojis = edit.emojis,\n                mode = if (edit.poll.multiple) { // not reported by the api\n                    MULTIPLE\n                } else {\n                    SINGLE\n                },\n                resultClickListener = null,\n                animateEmojis = animateEmojis,\n                enabled = false\n            )\n        }\n\n        if (edit.mediaAttachments.isEmpty()) {\n            binding.statusEditMediaPreview.hide()\n            binding.statusEditMediaSensitivity.hide()\n        } else {\n            binding.statusEditMediaPreview.show()\n            binding.statusEditMediaPreview.aspectRatios = edit.mediaAttachments.aspectRatios()\n\n            binding.statusEditMediaPreview.forEachIndexed { index, imageView, descriptionIndicator ->\n\n                val attachment = edit.mediaAttachments[index]\n                val hasDescription = !attachment.description.isNullOrBlank()\n\n                if (hasDescription) {\n                    imageView.contentDescription = attachment.description\n                } else {\n                    imageView.contentDescription =\n                        imageView.context.getString(R.string.action_view_media)\n                }\n                descriptionIndicator.visibility = if (hasDescription) View.VISIBLE else View.GONE\n\n                val blurhash = attachment.blurhash\n\n                val placeholder: Drawable = if (blurhash != null && useBlurhash) {\n                    BlurhashDrawable(context, blurhash)\n                } else {\n                    MaterialColors.getColor(imageView, R.attr.colorBackgroundAccent).toDrawable()\n                }\n\n                if (attachment.previewUrl.isNullOrEmpty()) {\n                    imageView.removeFocalPoint()\n                    Glide.with(imageView)\n                        .load(placeholder)\n                        .centerInside()\n                        .into(imageView)\n                } else {\n                    val focus: Focus? = attachment.meta?.focus\n\n                    if (focus != null) {\n                        imageView.setFocalPoint(focus)\n                        Glide.with(imageView.context)\n                            .load(attachment.previewUrl)\n                            .placeholder(placeholder)\n                            .centerInside()\n                            .addListener(imageView)\n                            .into(imageView)\n                    } else {\n                        imageView.removeFocalPoint()\n                        Glide.with(imageView)\n                            .load(attachment.previewUrl)\n                            .placeholder(placeholder)\n                            .centerInside()\n                            .into(imageView)\n                    }\n                }\n            }\n            binding.statusEditMediaSensitivity.visible(edit.sensitive)\n        }\n    }\n\n    override fun getItemCount() = edits.size\n\n    companion object {\n        private const val VIEW_TYPE_EDITS_NEWEST = 0\n        private const val VIEW_TYPE_EDITS = 1\n    }\n}\n\n/**\n * Handle XML tags created by [ViewEditsViewModel] and create custom spans to display inserted or\n * deleted text.\n */\nclass EditsTagHandler(val context: Context) : TuskyTagHandler() {\n    /** Class to mark the start of a span of deleted text */\n    class Del\n\n    /** Class to mark the start of a span of inserted text */\n    class Ins\n\n    override fun handleTag(opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader) {\n        when (tag) {\n            DELETED_TEXT_EL -> {\n                if (opening) {\n                    start(output as SpannableStringBuilder, Del())\n                } else {\n                    end(\n                        output as SpannableStringBuilder,\n                        Del::class.java,\n                        DeletedTextSpan(context)\n                    )\n                }\n            }\n            INSERTED_TEXT_EL -> {\n                if (opening) {\n                    start(output as SpannableStringBuilder, Ins())\n                } else {\n                    end(\n                        output as SpannableStringBuilder,\n                        Ins::class.java,\n                        InsertedTextSpan(context)\n                    )\n                }\n            }\n            else -> super.handleTag(opening, tag, output, xmlReader)\n        }\n    }\n\n    /** Span that signifies deleted text */\n    class DeletedTextSpan(context: Context) : CharacterStyle() {\n        private var bgColor: Int\n\n        init {\n            bgColor = context.getColor(R.color.view_edits_background_delete)\n        }\n\n        override fun updateDrawState(tp: TextPaint) {\n            tp.bgColor = bgColor\n            tp.isStrikeThruText = true\n        }\n    }\n\n    /** Span that signifies inserted text */\n    class InsertedTextSpan(context: Context) : CharacterStyle() {\n        private var bgColor: Int\n\n        init {\n            bgColor = context.getColor(R.color.view_edits_background_insert)\n        }\n\n        override fun updateDrawState(tp: TextPaint) {\n            tp.bgColor = bgColor\n            tp.typeface = DEFAULT_BOLD\n        }\n    }\n\n    companion object {\n        /** XML element to represent text that has been deleted */\n        // Can't be an element that Android's HTML parser recognises, otherwise the tagHandler\n        // won't be called for it.\n        const val DELETED_TEXT_EL = \"tusky-del\"\n\n        /** XML element to represent text that has been inserted */\n        // Can't be an element that Android's HTML parser recognises, otherwise the tagHandler\n        // won't be called for it.\n        const val INSERTED_TEXT_EL = \"tusky-ins\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/viewthread/edits/ViewEditsFragment.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.viewthread.edits\n\nimport android.content.SharedPreferences\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.widget.LinearLayout\nimport androidx.core.view.MenuProvider\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.SimpleItemAnimator\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener\nimport com.keylesspalace.tusky.BottomSheetActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.StatusListActivity\nimport com.keylesspalace.tusky.components.account.AccountActivity\nimport com.keylesspalace.tusky.databinding.FragmentViewEditsBinding\nimport com.keylesspalace.tusky.interfaces.LinkListener\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.util.emojify\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.loadAvatar\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport com.keylesspalace.tusky.util.unicodeWrap\nimport com.keylesspalace.tusky.util.viewBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass ViewEditsFragment :\n    Fragment(R.layout.fragment_view_edits),\n    LinkListener,\n    OnRefreshListener,\n    MenuProvider {\n\n    @Inject\n    lateinit var preferences: SharedPreferences\n\n    private val viewModel: ViewEditsViewModel by viewModels()\n\n    private val binding by viewBinding(FragmentViewEditsBinding::bind)\n\n    private lateinit var statusId: String\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED)\n\n        binding.swipeRefreshLayout.setOnRefreshListener(this)\n\n        binding.recyclerView.setHasFixedSize(true)\n        binding.recyclerView.layoutManager = LinearLayoutManager(context)\n\n        val divider = DividerItemDecoration(context, LinearLayout.VERTICAL)\n        binding.recyclerView.addItemDecoration(divider)\n        (binding.recyclerView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false\n\n        statusId = requireArguments().getString(STATUS_ID_EXTRA)!!\n\n        val animateAvatars = preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false)\n        val animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false)\n        val useBlurhash = preferences.getBoolean(PrefKeys.USE_BLURHASH, true)\n        val avatarRadius: Int = requireContext().resources.getDimensionPixelSize(\n            R.dimen.avatar_radius_48dp\n        )\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.uiState.collect { uiState ->\n                when (uiState) {\n                    EditsUiState.Initial -> {}\n                    EditsUiState.Loading -> {\n                        binding.recyclerView.hide()\n                        binding.statusView.hide()\n                        binding.initialProgressBar.show()\n                    }\n                    EditsUiState.Refreshing -> {}\n                    is EditsUiState.Error -> {\n                        Log.w(TAG, \"failed to load edits\", uiState.throwable)\n\n                        binding.swipeRefreshLayout.isRefreshing = false\n                        binding.recyclerView.hide()\n                        binding.statusView.show()\n                        binding.initialProgressBar.hide()\n\n                        when (uiState.throwable) {\n                            is ViewEditsViewModel.MissingEditsException -> {\n                                binding.statusView.setup(\n                                    R.drawable.elephant_friend_empty,\n                                    R.string.error_missing_edits\n                                )\n                            }\n                            else -> {\n                                binding.statusView.setup(uiState.throwable) {\n                                    viewModel.loadEdits(statusId, force = true)\n                                }\n                            }\n                        }\n                    }\n                    is EditsUiState.Success -> {\n                        binding.swipeRefreshLayout.isRefreshing = false\n                        binding.recyclerView.show()\n                        binding.statusView.hide()\n                        binding.initialProgressBar.hide()\n\n                        binding.recyclerView.adapter = ViewEditsAdapter(\n                            edits = uiState.edits,\n                            animateEmojis = animateEmojis,\n                            useBlurhash = useBlurhash,\n                            listener = this@ViewEditsFragment\n                        )\n\n                        // Focus on the most recent version\n                        (binding.recyclerView.layoutManager as LinearLayoutManager).scrollToPosition(\n                            0\n                        )\n\n                        val account = uiState.edits.first().account\n                        loadAvatar(\n                            account.avatar,\n                            binding.statusAvatar,\n                            avatarRadius,\n                            animateAvatars\n                        )\n\n                        binding.statusDisplayName.text = account.name.unicodeWrap().emojify(account.emojis, binding.statusDisplayName, animateEmojis)\n                        binding.statusUsername.text = account.username\n                    }\n                }\n            }\n        }\n\n        viewModel.loadEdits(statusId)\n    }\n\n    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n        menuInflater.inflate(R.menu.fragment_view_edits, menu)\n    }\n\n    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {\n        return when (menuItem.itemId) {\n            R.id.action_refresh -> {\n                binding.swipeRefreshLayout.isRefreshing = true\n                onRefresh()\n                true\n            }\n            else -> false\n        }\n    }\n\n    override fun onResume() {\n        super.onResume()\n        requireActivity().title = getString(R.string.title_edits)\n    }\n\n    override fun onRefresh() {\n        viewModel.loadEdits(statusId, force = true, refreshing = true)\n    }\n\n    override fun onViewAccount(id: String) {\n        bottomSheetActivity?.startActivityWithSlideInAnimation(\n            AccountActivity.getIntent(requireContext(), id)\n        )\n    }\n\n    override fun onViewTag(tag: String) {\n        bottomSheetActivity?.startActivityWithSlideInAnimation(\n            StatusListActivity.newHashtagIntent(requireContext(), tag)\n        )\n    }\n\n    override fun onViewUrl(url: String) {\n        bottomSheetActivity?.viewUrl(url)\n    }\n\n    private val bottomSheetActivity\n        get() = (activity as? BottomSheetActivity)\n\n    companion object {\n        private const val TAG = \"ViewEditsFragment\"\n\n        private const val STATUS_ID_EXTRA = \"id\"\n\n        fun newInstance(statusId: String): ViewEditsFragment {\n            val arguments = Bundle(1)\n            val fragment = ViewEditsFragment()\n            arguments.putString(STATUS_ID_EXTRA, statusId)\n            fragment.arguments = arguments\n            return fragment\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/components/viewthread/edits/ViewEditsViewModel.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.viewthread.edits\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport at.connyduck.calladapter.networkresult.getOrElse\nimport com.keylesspalace.tusky.components.viewthread.edits.EditsTagHandler.Companion.DELETED_TEXT_EL\nimport com.keylesspalace.tusky.components.viewthread.edits.EditsTagHandler.Companion.INSERTED_TEXT_EL\nimport com.keylesspalace.tusky.entity.StatusEdit\nimport com.keylesspalace.tusky.network.MastodonApi\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport kotlinx.coroutines.launch\nimport org.pageseeder.diffx.api.LoadingException\nimport org.pageseeder.diffx.api.Operator\nimport org.pageseeder.diffx.config.DiffConfig\nimport org.pageseeder.diffx.config.TextGranularity\nimport org.pageseeder.diffx.config.WhiteSpaceProcessing\nimport org.pageseeder.diffx.core.OptimisticXMLProcessor\nimport org.pageseeder.diffx.format.XMLDiffOutput\nimport org.pageseeder.diffx.load.SAXLoader\nimport org.pageseeder.diffx.token.XMLToken\nimport org.pageseeder.diffx.token.XMLTokenType\nimport org.pageseeder.diffx.token.impl.SpaceToken\nimport org.pageseeder.diffx.xml.NamespaceSet\nimport org.pageseeder.xmlwriter.XML.NamespaceAware\nimport org.pageseeder.xmlwriter.XMLStringWriter\n\n@HiltViewModel\nclass ViewEditsViewModel @Inject constructor(private val api: MastodonApi) : ViewModel() {\n\n    private val _uiState = MutableStateFlow(EditsUiState.Initial as EditsUiState)\n    val uiState: StateFlow<EditsUiState> = _uiState.asStateFlow()\n\n    /** The API call to fetch edit history returned less than two items */\n    class MissingEditsException : Exception()\n\n    fun loadEdits(statusId: String, force: Boolean = false, refreshing: Boolean = false) {\n        if (!force && _uiState.value !is EditsUiState.Initial) return\n\n        if (refreshing) {\n            _uiState.value = EditsUiState.Refreshing\n        } else {\n            _uiState.value = EditsUiState.Loading\n        }\n\n        viewModelScope.launch {\n            val edits = api.statusEdits(statusId).getOrElse {\n                _uiState.value = EditsUiState.Error(it)\n                return@launch\n            }\n\n            // `edits` might have fewer than the minimum number of entries because of\n            // https://github.com/mastodon/mastodon/issues/25398.\n            if (edits.size < 2) {\n                _uiState.value = EditsUiState.Error(MissingEditsException())\n                return@launch\n            }\n\n            // Diff each status' content against the previous version, producing new\n            // content with additional `ins` or `del` elements marking inserted or\n            // deleted content.\n            //\n            // This can be CPU intensive depending on the number of edits and the size\n            // of each, so don't run this on Dispatchers.Main.\n            viewModelScope.launch(Dispatchers.Default) {\n                val sortedEdits = edits.sortedBy { it.createdAt }\n                    .reversed()\n                    .toMutableList()\n\n                SAXLoader.setXMLReaderClass(\"org.xmlpull.v1.sax2.Driver\")\n                val loader = SAXLoader()\n                loader.config = DiffConfig(\n                    false,\n                    WhiteSpaceProcessing.PRESERVE,\n                    TextGranularity.SPACE_WORD\n                )\n                val processor = OptimisticXMLProcessor()\n                processor.setCoalesce(true)\n                val output = HtmlDiffOutput()\n\n                try {\n                    // The XML processor expects `br` to be closed\n                    var currentContent =\n                        loader.load(sortedEdits[0].content.replace(\"<br>\", \"<br/>\"))\n                    var previousContent =\n                        loader.load(sortedEdits[1].content.replace(\"<br>\", \"<br/>\"))\n\n                    for (i in 1 until sortedEdits.size) {\n                        processor.diff(previousContent, currentContent, output)\n                        sortedEdits[i - 1] = sortedEdits[i - 1].copy(\n                            content = output.xml.toString()\n                        )\n\n                        if (i < sortedEdits.size - 1) {\n                            currentContent = previousContent\n                            previousContent = loader.load(\n                                sortedEdits[i + 1].content.replace(\"<br>\", \"<br/>\")\n                            )\n                        }\n                    }\n                    _uiState.value = EditsUiState.Success(sortedEdits)\n                } catch (_: LoadingException) {\n                    // Something failed parsing the XML from the server. Rather than\n                    // show an error just return the sorted edits so the user can at\n                    // least visually scan the differences.\n                    _uiState.value = EditsUiState.Success(sortedEdits)\n                }\n            }\n        }\n    }\n\n    companion object {\n        const val TAG = \"ViewEditsViewModel\"\n    }\n}\n\nsealed interface EditsUiState {\n    data object Initial : EditsUiState\n    data object Loading : EditsUiState\n\n    // \"Refreshing\" state is necessary, otherwise a refresh state transition is Success -> Success,\n    // and state flows don't emit repeated states, so the UI never updates.\n    data object Refreshing : EditsUiState\n    class Error(val throwable: Throwable) : EditsUiState\n    data class Success(\n        val edits: List<StatusEdit>\n    ) : EditsUiState\n}\n\n/**\n * Add elements wrapping inserted or deleted content.\n */\nclass HtmlDiffOutput : XMLDiffOutput {\n    /** XML Output */\n    lateinit var xml: XMLStringWriter\n        private set\n\n    override fun start() {\n        xml = XMLStringWriter(NamespaceAware.Yes)\n    }\n\n    override fun handle(operator: Operator, token: XMLToken) {\n        if (operator.isEdit) {\n            handleEdit(operator, token)\n        } else {\n            token.toXML(xml)\n        }\n    }\n\n    override fun end() {\n        xml.flush()\n    }\n\n    override fun setWriteXMLDeclaration(show: Boolean) {\n        // This space intentionally left blank\n    }\n\n    override fun setNamespaces(namespaces: NamespaceSet?) {\n        // This space intentionally left blank\n    }\n\n    private fun handleEdit(operator: Operator, token: XMLToken) {\n        if (token == SpaceToken.NEW_LINE) {\n            if (operator == Operator.INS) {\n                token.toXML(xml)\n            }\n            return\n        }\n        when (token.type) {\n            XMLTokenType.START_ELEMENT -> token.toXML(xml)\n            XMLTokenType.END_ELEMENT -> token.toXML(xml)\n            XMLTokenType.TEXT -> {\n                // wrap the characters in a <tusky-ins/tusky-del> element\n                when (operator) {\n                    Operator.DEL -> DELETED_TEXT_EL\n                    Operator.INS -> INSERTED_TEXT_EL\n                    else -> null\n                }?.let {\n                    xml.openElement(it, false)\n                }\n                token.toXML(xml)\n                xml.closeElement()\n            }\n            else -> {\n                // Only include inserted content\n                if (operator === Operator.INS) {\n                    token.toXML(xml)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/AccountManager.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db\n\nimport android.content.SharedPreferences\nimport android.util.Log\nimport androidx.room.withTransaction\nimport com.keylesspalace.tusky.db.dao.AccountDao\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.di.ApplicationScope\nimport com.keylesspalace.tusky.entity.Account\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport java.util.Locale\nimport javax.inject.Inject\nimport javax.inject.Singleton\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.runBlocking\n\n/**\n * This class is the main interface to all account related operations.\n */\n\nprivate const val TAG = \"AccountManager\"\n\n@Singleton\nclass AccountManager @Inject constructor(\n    private val db: AppDatabase,\n    private val preferences: SharedPreferences,\n    @ApplicationScope private val applicationScope: CoroutineScope\n) {\n\n    private val accountDao: AccountDao = db.accountDao()\n\n    /** A StateFlow that will update everytime an account in the database changes, is added or removed.\n     *  The first account is the currently active one.\n     */\n    val accountsFlow: StateFlow<List<AccountEntity>> = runBlocking {\n        accountDao.allAccounts()\n            .stateIn(CoroutineScope(applicationScope.coroutineContext + Dispatchers.IO))\n    }\n\n    /** A snapshot of all accounts in the database with the active account first */\n    val accounts: List<AccountEntity>\n        get() = accountsFlow.value\n\n    /** A snapshot currently active account, if there is one */\n    val activeAccount: AccountEntity?\n        get() = accounts.firstOrNull()\n\n    /** Returns a StateFlow for updates to the currently active account.\n     *  Note that always the same account will be emitted,\n     *  even if it is no longer active and that it will emit null when the account got removed.\n     *  @param scope the [CoroutineScope] this flow will be active in.\n     */\n    fun activeAccount(scope: CoroutineScope): StateFlow<AccountEntity?> {\n        val activeAccount = activeAccount\n        return accountsFlow.map { accounts ->\n            accounts.find { account -> activeAccount?.id == account.id }\n        }.stateIn(scope, SharingStarted.Lazily, activeAccount)\n    }\n\n    /**\n     * Adds a new account and makes it the active account.\n     * @param accessToken the access token for the new account\n     * @param domain the domain of the account's Mastodon instance\n     * @param clientId the oauth client id used to sign in the account\n     * @param clientSecret the oauth client secret used to sign in the account\n     * @param oauthScopes the oauth scopes granted to the account\n     * @param newAccount the [Account] as returned by the Mastodon Api\n     */\n    suspend fun addAccount(\n        accessToken: String,\n        domain: String,\n        clientId: String,\n        clientSecret: String,\n        oauthScopes: String,\n        newAccount: Account\n    ) = db.withTransaction {\n        activeAccount?.let {\n            Log.d(TAG, \"addAccount: saving account with id \" + it.id)\n            accountDao.insertOrReplace(it.copy(isActive = false))\n        }\n        // check if this is a relogin with an existing account, if yes update it, otherwise create a new one\n        val existingAccount = accounts.find { account ->\n            domain == account.domain && newAccount.id == account.accountId\n        }\n        val newAccountEntity = if (existingAccount != null) {\n            existingAccount.copy(\n                accessToken = accessToken,\n                clientId = clientId,\n                clientSecret = clientSecret,\n                oauthScopes = oauthScopes,\n                isActive = true\n            )\n        } else {\n            val maxAccountId = accounts.maxOfOrNull { it.id } ?: 0\n            val newAccountId = maxAccountId + 1\n            AccountEntity(\n                id = newAccountId,\n                domain = domain.lowercase(Locale.ROOT),\n                accessToken = accessToken,\n                clientId = clientId,\n                clientSecret = clientSecret,\n                oauthScopes = oauthScopes,\n                isActive = true,\n                accountId = newAccount.id\n            )\n        }\n        updateAccount(newAccountEntity, newAccount)\n    }\n\n    /**\n     * Saves an already known account to the database.\n     * New accounts must be created with [addAccount]\n     * @param account The account to save\n     * @param changer make the changes to save here - this is to make sure no stale data gets re-saved to the database\n     */\n    suspend fun updateAccount(account: AccountEntity, changer: AccountEntity.() -> AccountEntity) {\n        accounts.find { it.id == account.id }?.let { acc ->\n            Log.d(TAG, \"updateAccount: saving account with id \" + acc.id)\n            accountDao.insertOrReplace(changer(acc))\n        }\n    }\n\n    /**\n     * Updates an account with new information from the Mastodon api\n     * and saves it in the database.\n     * @param accountEntity the [AccountEntity] to update\n     * @param account the [Account] object which the newest data from the api\n     */\n    suspend fun updateAccount(accountEntity: AccountEntity, account: Account) {\n        // make sure no stale data gets re-saved to the database\n        val accountToUpdate = accounts.find { it.id == accountEntity.id } ?: accountEntity\n\n        val newAccount = accountToUpdate.copy(\n            accountId = account.id,\n            username = account.username,\n            displayName = account.name,\n            profilePictureUrl = account.avatar,\n            profileHeaderUrl = account.header,\n            defaultPostPrivacy = account.source?.privacy ?: Status.Visibility.PUBLIC,\n            defaultPostLanguage = account.source?.language.orEmpty(),\n            defaultMediaSensitivity = account.source?.sensitive == true,\n            emojis = account.emojis,\n            locked = account.locked\n        )\n\n        Log.d(TAG, \"updateAccount: saving account with id \" + accountToUpdate.id)\n        accountDao.insertOrReplace(newAccount)\n    }\n\n    /**\n     * Removes an account from the database.\n     * @return the new active account, or null if no other account was found\n     */\n    suspend fun remove(account: AccountEntity): AccountEntity? = db.withTransaction {\n        Log.d(TAG, \"remove: deleting account with id \" + account.id)\n        accountDao.delete(account)\n\n        accounts.find { it.id != account.id }?.let { otherAccount ->\n            val otherAccountActive = otherAccount.copy(\n                isActive = true\n            )\n            Log.d(TAG, \"remove: saving account with id \" + otherAccountActive.id)\n            accountDao.insertOrReplace(otherAccountActive)\n            otherAccountActive\n        }\n    }\n\n    /**\n     * Changes the active account\n     * @param accountId the database id of the new active account\n     */\n    suspend fun setActiveAccount(accountId: Long) = db.withTransaction {\n        Log.d(TAG, \"setActiveAccount $accountId\")\n\n        val newActiveAccount = accounts.find { (id) ->\n            id == accountId\n        } ?: return@withTransaction // invalid accountId passed, do nothing\n\n        activeAccount?.let {\n            accountDao.insertOrReplace(it.copy(isActive = false))\n        }\n\n        accountDao.insertOrReplace(newActiveAccount.copy(isActive = true))\n    }\n\n    /**\n     * @return true if at least one account has notifications enabled\n     */\n    fun areNotificationsEnabled(): Boolean {\n        return accounts.any { it.notificationsEnabled }\n    }\n\n    /**\n     * Finds an account by its database id\n     * @param accountId the id of the account\n     * @return the requested account or null if it was not found\n     */\n    fun getAccountById(accountId: Long): AccountEntity? {\n        return accounts.find { (id) ->\n            id == accountId\n        }\n    }\n\n    /**\n     * Finds an account by its string identifier\n     * @param identifier the string identifier of the account\n     * @return the requested account or null if it was not found\n     */\n    fun getAccountByIdentifier(identifier: String): AccountEntity? {\n        return accounts.find {\n            identifier == it.identifier\n        }\n    }\n\n    /**\n     * @return true if the name of the currently-selected account should be displayed in UIs\n     */\n    fun shouldDisplaySelfUsername(): Boolean {\n        val showUsernamePreference = preferences.getString(\n            PrefKeys.SHOW_SELF_USERNAME,\n            \"disambiguate\"\n        )\n        if (showUsernamePreference == \"always\") {\n            return true\n        }\n        if (showUsernamePreference == \"never\") {\n            return false\n        }\n\n        return accounts.size > 1 // \"disambiguate\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/AppDatabase.java",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.room.AutoMigration;\nimport androidx.room.Database;\nimport androidx.room.DeleteColumn;\nimport androidx.room.RoomDatabase;\nimport androidx.room.migration.AutoMigrationSpec;\nimport androidx.room.migration.Migration;\nimport androidx.sqlite.db.SupportSQLiteDatabase;\n\nimport com.keylesspalace.tusky.TabDataKt;\nimport com.keylesspalace.tusky.components.conversation.ConversationEntity;\nimport com.keylesspalace.tusky.db.dao.AccountDao;\nimport com.keylesspalace.tusky.db.dao.DraftDao;\nimport com.keylesspalace.tusky.db.dao.InstanceDao;\nimport com.keylesspalace.tusky.db.dao.NotificationPolicyDao;\nimport com.keylesspalace.tusky.db.dao.NotificationsDao;\nimport com.keylesspalace.tusky.db.dao.TimelineAccountDao;\nimport com.keylesspalace.tusky.db.dao.TimelineDao;\nimport com.keylesspalace.tusky.db.dao.TimelineStatusDao;\nimport com.keylesspalace.tusky.db.entity.AccountEntity;\nimport com.keylesspalace.tusky.db.entity.DraftEntity;\nimport com.keylesspalace.tusky.db.entity.HomeTimelineEntity;\nimport com.keylesspalace.tusky.db.entity.InstanceEntity;\nimport com.keylesspalace.tusky.db.entity.NotificationEntity;\nimport com.keylesspalace.tusky.db.entity.NotificationPolicyEntity;\nimport com.keylesspalace.tusky.db.entity.NotificationReportEntity;\nimport com.keylesspalace.tusky.db.entity.TimelineAccountEntity;\nimport com.keylesspalace.tusky.db.entity.TimelineStatusEntity;\n\nimport java.io.File;\n\n/**\n * DB version & declare DAO\n */\n@Database(\n    entities = {\n        DraftEntity.class,\n        AccountEntity.class,\n        InstanceEntity.class,\n        TimelineStatusEntity.class,\n        TimelineAccountEntity.class,\n        ConversationEntity.class,\n        NotificationEntity.class,\n        NotificationReportEntity.class,\n        HomeTimelineEntity.class,\n        NotificationPolicyEntity.class\n    },\n    // Note: Starting with version 54, database versions in Tusky are always even.\n    // This is to reserve odd version numbers for use by forks.\n    version = 70,\n    autoMigrations = {\n        @AutoMigration(from = 48, to = 49),\n        @AutoMigration(from = 49, to = 50, spec = AppDatabase.MIGRATION_49_50.class),\n        @AutoMigration(from = 50, to = 51),\n        @AutoMigration(from = 51, to = 52),\n        @AutoMigration(from = 53, to = 54), // hasDirectMessageBadge in AccountEntity\n        @AutoMigration(from = 56, to = 58), // translationEnabled in InstanceEntity/InstanceInfoEntity\n        @AutoMigration(from = 62, to = 64), // filterV2Available in InstanceEntity\n        @AutoMigration(from = 64, to = 66), // added profileHeaderUrl to AccountEntity\n        @AutoMigration(from = 66, to = 68, spec = AppDatabase.MIGRATION_66_68.class), // added event and moderationAction to NotificationEntity, new NotificationPolicyEntity\n        @AutoMigration(from = 68, to = 70), // added mastodonApiVersion to InstanceEntity\n    }\n)\npublic abstract class AppDatabase extends RoomDatabase {\n\n    @NonNull public abstract AccountDao accountDao();\n    @NonNull public abstract InstanceDao instanceDao();\n    @NonNull public abstract ConversationsDao conversationDao();\n    @NonNull public abstract TimelineDao timelineDao();\n    @NonNull public abstract DraftDao draftDao();\n    @NonNull public abstract NotificationsDao notificationsDao();\n    @NonNull public abstract TimelineStatusDao timelineStatusDao();\n    @NonNull public abstract TimelineAccountDao timelineAccountDao();\n    @NonNull public abstract NotificationPolicyDao notificationPolicyDao();\n\n    public static final Migration MIGRATION_2_3 = new Migration(2, 3) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"CREATE TABLE TootEntity2 (uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, text TEXT, urls TEXT, contentWarning TEXT);\");\n            database.execSQL(\"INSERT INTO TootEntity2 SELECT * FROM TootEntity;\");\n            database.execSQL(\"DROP TABLE TootEntity;\");\n            database.execSQL(\"ALTER TABLE TootEntity2 RENAME TO TootEntity;\");\n        }\n    };\n\n    public static final Migration MIGRATION_3_4 = new Migration(3, 4) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE TootEntity ADD COLUMN inReplyToId TEXT\");\n            database.execSQL(\"ALTER TABLE TootEntity ADD COLUMN inReplyToText TEXT\");\n            database.execSQL(\"ALTER TABLE TootEntity ADD COLUMN inReplyToUsername TEXT\");\n            database.execSQL(\"ALTER TABLE TootEntity ADD COLUMN visibility INTEGER\");\n        }\n    };\n\n    public static final Migration MIGRATION_4_5 = new Migration(4, 5) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"CREATE TABLE `AccountEntity` (\" +\n                    \"`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \" +\n                    \"`domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, \" +\n                    \"`isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, \" +\n                    \"`username` TEXT NOT NULL, `displayName` TEXT NOT NULL, \" +\n                    \"`profilePictureUrl` TEXT NOT NULL, \" +\n                    \"`notificationsEnabled` INTEGER NOT NULL, \" +\n                    \"`notificationsMentioned` INTEGER NOT NULL, \" +\n                    \"`notificationsFollowed` INTEGER NOT NULL, \" +\n                    \"`notificationsReblogged` INTEGER NOT NULL, \" +\n                    \"`notificationsFavorited` INTEGER NOT NULL, \" +\n                    \"`notificationSound` INTEGER NOT NULL, \" +\n                    \"`notificationVibration` INTEGER NOT NULL, \" +\n                    \"`notificationLight` INTEGER NOT NULL, \" +\n                    \"`lastNotificationId` TEXT NOT NULL, \" +\n                    \"`activeNotifications` TEXT NOT NULL)\");\n            database.execSQL(\"CREATE UNIQUE INDEX `index_AccountEntity_domain_accountId` ON `AccountEntity` (`domain`, `accountId`)\");\n        }\n    };\n\n    public static final Migration MIGRATION_5_6 = new Migration(5, 6) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"CREATE TABLE IF NOT EXISTS `EmojiListEntity` (`instance` TEXT NOT NULL, `emojiList` TEXT NOT NULL, PRIMARY KEY(`instance`))\");\n        }\n    };\n\n    public static final Migration MIGRATION_6_7 = new Migration(6, 7) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"CREATE TABLE IF NOT EXISTS `InstanceEntity` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, PRIMARY KEY(`instance`))\");\n            database.execSQL(\"INSERT OR REPLACE INTO `InstanceEntity` SELECT `instance`,`emojiList`, NULL FROM `EmojiListEntity`;\");\n            database.execSQL(\"DROP TABLE `EmojiListEntity`;\");\n        }\n    };\n\n    public static final Migration MIGRATION_7_8 = new Migration(7, 8) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `emojis` TEXT NOT NULL DEFAULT '[]'\");\n        }\n    };\n\n    public static final Migration MIGRATION_8_9 = new Migration(8, 9) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `TootEntity` ADD COLUMN `descriptions` TEXT DEFAULT '[]'\");\n        }\n    };\n\n    public static final Migration MIGRATION_9_10 = new Migration(9, 10) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `defaultPostPrivacy` INTEGER NOT NULL DEFAULT 1\");\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `defaultMediaSensitivity` INTEGER NOT NULL DEFAULT 0\");\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `alwaysShowSensitiveMedia` INTEGER NOT NULL DEFAULT 0\");\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `mediaPreviewEnabled` INTEGER NOT NULL DEFAULT '1'\");\n        }\n    };\n\n    public static final Migration MIGRATION_10_11 = new Migration(10, 11) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"CREATE TABLE IF NOT EXISTS `TimelineAccountEntity` (\" +\n                    \"`serverId` TEXT NOT NULL, \" +\n                    \"`timelineUserId` INTEGER NOT NULL, \" +\n                    \"`instance` TEXT NOT NULL, \" +\n                    \"`localUsername` TEXT NOT NULL, \" +\n                    \"`username` TEXT NOT NULL, \" +\n                    \"`displayName` TEXT NOT NULL, \" +\n                    \"`url` TEXT NOT NULL, \" +\n                    \"`avatar` TEXT NOT NULL, \" +\n                    \"`emojis` TEXT NOT NULL,\" +\n                    \"PRIMARY KEY(`serverId`, `timelineUserId`))\");\n\n            database.execSQL(\"CREATE TABLE IF NOT EXISTS `TimelineStatusEntity` (\" +\n                    \"`serverId` TEXT NOT NULL, \" +\n                    \"`url` TEXT, \" +\n                    \"`timelineUserId` INTEGER NOT NULL, \" +\n                    \"`authorServerId` TEXT,\" +\n                    \"`instance` TEXT, \" +\n                    \"`inReplyToId` TEXT, \" +\n                    \"`inReplyToAccountId` TEXT, \" +\n                    \"`content` TEXT, \" +\n                    \"`createdAt` INTEGER NOT NULL, \" +\n                    \"`emojis` TEXT, \" +\n                    \"`reblogsCount` INTEGER NOT NULL, \" +\n                    \"`favouritesCount` INTEGER NOT NULL, \" +\n                    \"`reblogged` INTEGER NOT NULL, \" +\n                    \"`favourited` INTEGER NOT NULL, \" +\n                    \"`sensitive` INTEGER NOT NULL, \" +\n                    \"`spoilerText` TEXT, \" +\n                    \"`visibility` INTEGER, \" +\n                    \"`attachments` TEXT, \" +\n                    \"`mentions` TEXT, \" +\n                    \"`application` TEXT, \" +\n                    \"`reblogServerId` TEXT, \" +\n                    \"`reblogAccountId` TEXT,\" +\n                    \" PRIMARY KEY(`serverId`, `timelineUserId`),\" +\n                    \" FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) \" +\n                    \"ON UPDATE NO ACTION ON DELETE NO ACTION )\");\n            database.execSQL(\"CREATE  INDEX IF NOT EXISTS\" +\n                    \"`index_TimelineStatusEntity_authorServerId_timelineUserId` \" +\n                    \"ON `TimelineStatusEntity` (`authorServerId`, `timelineUserId`)\");\n        }\n    };\n\n    public static final Migration MIGRATION_11_12 = new Migration(11, 12) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            String defaultTabs = TabDataKt.HOME + \";\" +\n                    TabDataKt.NOTIFICATIONS + \";\" +\n                    TabDataKt.LOCAL + \";\" +\n                    TabDataKt.FEDERATED;\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `tabPreferences` TEXT NOT NULL DEFAULT '\" + defaultTabs + \"'\");\n\n            database.execSQL(\"CREATE TABLE IF NOT EXISTS `ConversationEntity` (\" +\n                    \"`accountId` INTEGER NOT NULL, \" +\n                    \"`id` TEXT NOT NULL, \" +\n                    \"`accounts` TEXT NOT NULL, \" +\n                    \"`unread` INTEGER NOT NULL, \" +\n                    \"`s_id` TEXT NOT NULL, \" +\n                    \"`s_url` TEXT, \" +\n                    \"`s_inReplyToId` TEXT, \" +\n                    \"`s_inReplyToAccountId` TEXT, \" +\n                    \"`s_account` TEXT NOT NULL, \" +\n                    \"`s_content` TEXT NOT NULL, \" +\n                    \"`s_createdAt` INTEGER NOT NULL, \" +\n                    \"`s_emojis` TEXT NOT NULL, \" +\n                    \"`s_favouritesCount` INTEGER NOT NULL, \" +\n                    \"`s_favourited` INTEGER NOT NULL, \" +\n                    \"`s_sensitive` INTEGER NOT NULL, \" +\n                    \"`s_spoilerText` TEXT NOT NULL, \" +\n                    \"`s_attachments` TEXT NOT NULL, \" +\n                    \"`s_mentions` TEXT NOT NULL, \" +\n                    \"`s_showingHiddenContent` INTEGER NOT NULL, \" +\n                    \"`s_expanded` INTEGER NOT NULL, \" +\n                    \"`s_collapsible` INTEGER NOT NULL, \" +\n                    \"`s_collapsed` INTEGER NOT NULL, \" +\n                    \"PRIMARY KEY(`id`, `accountId`))\");\n\n        }\n    };\n\n    public static final Migration MIGRATION_12_13 = new Migration(12, 13) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n\n            database.execSQL(\"DROP TABLE IF EXISTS `TimelineAccountEntity`\");\n            database.execSQL(\"DROP TABLE IF EXISTS `TimelineStatusEntity`\");\n\n            database.execSQL(\"CREATE TABLE IF NOT EXISTS `TimelineAccountEntity` (\" +\n                    \"`serverId` TEXT NOT NULL, \" +\n                    \"`timelineUserId` INTEGER NOT NULL, \" +\n                    \"`localUsername` TEXT NOT NULL, \" +\n                    \"`username` TEXT NOT NULL, \" +\n                    \"`displayName` TEXT NOT NULL, \" +\n                    \"`url` TEXT NOT NULL, \" +\n                    \"`avatar` TEXT NOT NULL, \" +\n                    \"`emojis` TEXT NOT NULL,\" +\n                    \"PRIMARY KEY(`serverId`, `timelineUserId`))\");\n\n            database.execSQL(\"CREATE TABLE IF NOT EXISTS `TimelineStatusEntity` (\" +\n                    \"`serverId` TEXT NOT NULL, \" +\n                    \"`url` TEXT, \" +\n                    \"`timelineUserId` INTEGER NOT NULL, \" +\n                    \"`authorServerId` TEXT,\" +\n                    \"`inReplyToId` TEXT, \" +\n                    \"`inReplyToAccountId` TEXT, \" +\n                    \"`content` TEXT, \" +\n                    \"`createdAt` INTEGER NOT NULL, \" +\n                    \"`emojis` TEXT, \" +\n                    \"`reblogsCount` INTEGER NOT NULL, \" +\n                    \"`favouritesCount` INTEGER NOT NULL, \" +\n                    \"`reblogged` INTEGER NOT NULL, \" +\n                    \"`favourited` INTEGER NOT NULL, \" +\n                    \"`sensitive` INTEGER NOT NULL, \" +\n                    \"`spoilerText` TEXT, \" +\n                    \"`visibility` INTEGER, \" +\n                    \"`attachments` TEXT, \" +\n                    \"`mentions` TEXT, \" +\n                    \"`application` TEXT, \" +\n                    \"`reblogServerId` TEXT, \" +\n                    \"`reblogAccountId` TEXT,\" +\n                    \" PRIMARY KEY(`serverId`, `timelineUserId`),\" +\n                    \" FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) \" +\n                    \"ON UPDATE NO ACTION ON DELETE NO ACTION )\");\n            database.execSQL(\"CREATE  INDEX IF NOT EXISTS\" +\n                    \"`index_TimelineStatusEntity_authorServerId_timelineUserId` \" +\n                    \"ON `TimelineStatusEntity` (`authorServerId`, `timelineUserId`)\");\n        }\n    };\n\n    public static final Migration MIGRATION_10_13 = new Migration(10, 13) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            MIGRATION_11_12.migrate(database);\n            MIGRATION_12_13.migrate(database);\n        }\n    };\n\n    public static final Migration MIGRATION_13_14 = new Migration(13, 14) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `notificationsFilter` TEXT NOT NULL DEFAULT '[]'\");\n        }\n    };\n\n    public static final Migration MIGRATION_14_15 = new Migration(14, 15) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `TimelineStatusEntity` ADD COLUMN `poll` TEXT\");\n            database.execSQL(\"ALTER TABLE `ConversationEntity` ADD COLUMN `s_poll` TEXT\");\n        }\n    };\n\n    public static final Migration MIGRATION_15_16 = new Migration(15, 16) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `notificationsPolls` INTEGER NOT NULL DEFAULT 1\");\n        }\n    };\n\n    public static final Migration MIGRATION_16_17 = new Migration(16, 17) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `TimelineAccountEntity` ADD COLUMN `bot` INTEGER NOT NULL DEFAULT 0\");\n        }\n    };\n\n    public static final Migration MIGRATION_17_18 = new Migration(17, 18) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `alwaysOpenSpoiler` INTEGER NOT NULL DEFAULT 0\");\n        }\n    };\n\n    public static final Migration MIGRATION_18_19 = new Migration(18, 19) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `InstanceEntity` ADD COLUMN `maxPollOptions` INTEGER\");\n            database.execSQL(\"ALTER TABLE `InstanceEntity` ADD COLUMN `maxPollOptionLength` INTEGER\");\n\n            database.execSQL(\"ALTER TABLE `TootEntity` ADD COLUMN `poll` TEXT\");\n        }\n    };\n\n    public static final Migration MIGRATION_19_20 = new Migration(19, 20) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `TimelineStatusEntity` ADD COLUMN `bookmarked` INTEGER NOT NULL DEFAULT 0\");\n            database.execSQL(\"ALTER TABLE `ConversationEntity` ADD COLUMN `s_bookmarked` INTEGER NOT NULL DEFAULT 0\");\n        }\n\n    };\n\n    public static final Migration MIGRATION_20_21 = new Migration(20, 21) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `InstanceEntity` ADD COLUMN `version` TEXT\");\n        }\n    };\n\n    public static final Migration MIGRATION_21_22 = new Migration(21, 22) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `notificationsFollowRequested` INTEGER NOT NULL DEFAULT 0\");\n        }\n    };\n\n    public static final Migration MIGRATION_22_23 = new Migration(22, 23) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `TimelineStatusEntity` ADD COLUMN `muted` INTEGER\");\n        }\n    };\n\n    public static final Migration MIGRATION_23_24 = new Migration(23, 24) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `notificationsSubscriptions` INTEGER NOT NULL DEFAULT 1\");\n        }\n    };\n\n    public static final Migration MIGRATION_24_25 = new Migration(24, 25) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\n                    \"CREATE TABLE IF NOT EXISTS `DraftEntity` (\" +\n                            \"`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \" +\n                            \"`accountId` INTEGER NOT NULL, \" +\n                            \"`inReplyToId` TEXT,\" +\n                            \"`content` TEXT,\" +\n                            \"`contentWarning` TEXT,\" +\n                            \"`sensitive` INTEGER NOT NULL,\" +\n                            \"`visibility` INTEGER NOT NULL,\" +\n                            \"`attachments` TEXT NOT NULL,\" +\n                            \"`poll` TEXT,\" +\n                            \"`failedToSend` INTEGER NOT NULL)\"\n            );\n        }\n    };\n\n    public static class Migration25_26 extends Migration {\n\n        private final File oldDraftDirectory;\n\n        public Migration25_26(@Nullable File oldDraftDirectory) {\n            super(25, 26);\n            this.oldDraftDirectory = oldDraftDirectory;\n        }\n\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"DROP TABLE  `TootEntity`\");\n\n            if (oldDraftDirectory != null && oldDraftDirectory.isDirectory()) {\n                File[] oldDraftFiles = oldDraftDirectory.listFiles();\n                if (oldDraftFiles != null) {\n                    for (File file : oldDraftFiles) {\n                        if (!file.isDirectory()) {\n                            file.delete();\n                        }\n                    }\n                }\n\n            }\n        }\n    }\n\n    public static final Migration MIGRATION_26_27 = new Migration(26, 27) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `ConversationEntity` ADD COLUMN `s_muted`  INTEGER NOT NULL DEFAULT 0\");\n        }\n    };\n\n    public static final Migration MIGRATION_27_28 = new Migration(27, 28) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n\n            database.execSQL(\"DROP TABLE IF EXISTS `TimelineAccountEntity`\");\n            database.execSQL(\"DROP TABLE IF EXISTS `TimelineStatusEntity`\");\n\n            database.execSQL(\"CREATE TABLE IF NOT EXISTS `TimelineAccountEntity` (\" +\n                    \"`serverId` TEXT NOT NULL,\" +\n                    \"`timelineUserId` INTEGER NOT NULL,\" +\n                    \"`localUsername` TEXT NOT NULL,\" +\n                    \"`username` TEXT NOT NULL,\" +\n                    \"`displayName` TEXT NOT NULL,\" +\n                    \"`url` TEXT NOT NULL,\" +\n                    \"`avatar` TEXT NOT NULL,\" +\n                    \"`emojis` TEXT NOT NULL,\" +\n                    \"`bot` INTEGER NOT NULL,\" +\n                    \"PRIMARY KEY(`serverId`, `timelineUserId`) )\");\n\n            database.execSQL(\"CREATE TABLE IF NOT EXISTS `TimelineStatusEntity` (\" +\n                    \"`serverId` TEXT NOT NULL,\" +\n                    \"`url` TEXT,\" +\n                    \"`timelineUserId` INTEGER NOT NULL,\" +\n                    \"`authorServerId` TEXT,\" +\n                    \"`inReplyToId` TEXT,\" +\n                    \"`inReplyToAccountId` TEXT,\" +\n                    \"`content` TEXT,\" +\n                    \"`createdAt` INTEGER NOT NULL,\" +\n                    \"`emojis` TEXT,\" +\n                    \"`reblogsCount` INTEGER NOT NULL,\" +\n                    \"`favouritesCount` INTEGER NOT NULL,\" +\n                    \"`reblogged` INTEGER NOT NULL,\" +\n                    \"`bookmarked` INTEGER NOT NULL,\" +\n                    \"`favourited` INTEGER NOT NULL,\" +\n                    \"`sensitive` INTEGER NOT NULL,\" +\n                    \"`spoilerText` TEXT NOT NULL,\" +\n                    \"`visibility` INTEGER NOT NULL,\" +\n                    \"`attachments` TEXT,\" +\n                    \"`mentions` TEXT,\" +\n                    \"`application` TEXT,\" +\n                    \"`reblogServerId` TEXT,\" +\n                    \"`reblogAccountId` TEXT,\" +\n                    \"`poll` TEXT,\" +\n                    \"`muted` INTEGER,\" +\n                    \"`expanded` INTEGER NOT NULL,\" +\n                    \"`contentCollapsed` INTEGER NOT NULL,\" +\n                    \"`contentShowing` INTEGER NOT NULL,\" +\n                    \"`pinned` INTEGER NOT NULL,\" +\n                    \"PRIMARY KEY(`serverId`, `timelineUserId`),\" +\n                    \"FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`)\" +\n                    \"ON UPDATE NO ACTION ON DELETE NO ACTION )\");\n\n            database.execSQL(\"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId`\" +\n                    \"ON `TimelineStatusEntity` (`authorServerId`, `timelineUserId`)\");\n        }\n    };\n\n    public static final Migration MIGRATION_28_29 = new Migration(28, 29) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `ConversationEntity` ADD COLUMN `s_tags` TEXT\");\n            database.execSQL(\"ALTER TABLE `TimelineStatusEntity` ADD COLUMN `tags` TEXT\");\n        }\n    };\n\n    public static final Migration MIGRATION_29_30 = new Migration(29, 30) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `InstanceEntity` ADD COLUMN `charactersReservedPerUrl` INTEGER\");\n            database.execSQL(\"ALTER TABLE `InstanceEntity` ADD COLUMN `minPollDuration` INTEGER\");\n            database.execSQL(\"ALTER TABLE `InstanceEntity` ADD COLUMN `maxPollDuration` INTEGER\");\n        }\n    };\n\n    public static final Migration MIGRATION_30_31 = new Migration(30, 31) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n\n            // no actual scheme change, but placeholder ids are now used differently so the cache needs to be cleared to avoid bugs\n            database.execSQL(\"DELETE FROM `TimelineAccountEntity`\");\n            database.execSQL(\"DELETE FROM `TimelineStatusEntity`\");\n        }\n    };\n\n    public static final Migration MIGRATION_31_32 = new Migration(31, 32) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `notificationsSignUps` INTEGER NOT NULL DEFAULT 1\");\n        }\n    };\n\n    public static final Migration MIGRATION_32_33 = new Migration(32, 33) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n\n            // ConversationEntity lost the s_collapsible column\n            // since SQLite does not support removing columns and it is just a cache table, we recreate the whole table.\n            database.execSQL(\"DROP TABLE `ConversationEntity`\");\n            database.execSQL(\"CREATE TABLE IF NOT EXISTS `ConversationEntity` (\" +\n                    \"`accountId` INTEGER NOT NULL,\" +\n                    \"`id` TEXT NOT NULL,\" +\n                    \"`accounts` TEXT NOT NULL,\" +\n                    \"`unread` INTEGER NOT NULL,\" +\n                    \"`s_id` TEXT NOT NULL,\" +\n                    \"`s_url` TEXT,\" +\n                    \"`s_inReplyToId` TEXT,\" +\n                    \"`s_inReplyToAccountId` TEXT,\" +\n                    \"`s_account` TEXT NOT NULL,\" +\n                    \"`s_content` TEXT NOT NULL,\" +\n                    \"`s_createdAt` INTEGER NOT NULL,\" +\n                    \"`s_emojis` TEXT NOT NULL,\" +\n                    \"`s_favouritesCount` INTEGER NOT NULL,\" +\n                    \"`s_favourited` INTEGER NOT NULL,\" +\n                    \"`s_bookmarked` INTEGER NOT NULL,\" +\n                    \"`s_sensitive` INTEGER NOT NULL,\" +\n                    \"`s_spoilerText` TEXT NOT NULL,\" +\n                    \"`s_attachments` TEXT NOT NULL,\" +\n                    \"`s_mentions` TEXT NOT NULL,\" +\n                    \"`s_tags` TEXT,\" +\n                    \"`s_showingHiddenContent` INTEGER NOT NULL,\" +\n                    \"`s_expanded` INTEGER NOT NULL,\" +\n                    \"`s_collapsed` INTEGER NOT NULL,\" +\n                    \"`s_muted` INTEGER NOT NULL,\" +\n                    \"`s_poll` TEXT,\" +\n                    \"PRIMARY KEY(`id`, `accountId`))\");\n        }\n    };\n\n    public static final Migration MIGRATION_33_34 = new Migration(33, 34) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `notificationsUpdates` INTEGER NOT NULL DEFAULT 1\");\n        }\n    };\n\n    public static final Migration MIGRATION_34_35 = new Migration(34, 35) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `TimelineStatusEntity` ADD COLUMN `card` TEXT\");\n        }\n    };\n\n    public static final Migration MIGRATION_35_36 = new Migration(35, 36) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `oauthScopes`  TEXT NOT NULL DEFAULT ''\");\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `unifiedPushUrl`  TEXT NOT NULL DEFAULT ''\");\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `pushPubKey`  TEXT NOT NULL DEFAULT ''\");\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `pushPrivKey`  TEXT NOT NULL DEFAULT ''\");\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `pushAuth`  TEXT NOT NULL DEFAULT ''\");\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `pushServerKey`  TEXT NOT NULL DEFAULT ''\");\n        }\n    };\n\n    public static final Migration MIGRATION_36_37 = new Migration(36, 37) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `TimelineStatusEntity` ADD COLUMN `repliesCount` INTEGER NOT NULL DEFAULT 0\");\n            database.execSQL(\"ALTER TABLE `ConversationEntity` ADD COLUMN `s_repliesCount` INTEGER NOT NULL DEFAULT 0\");\n        }\n    };\n\n    public static final Migration MIGRATION_37_38 = new Migration(37, 38) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            // database needs to be cleaned because the ConversationAccountEntity got a new attribute\n            database.execSQL(\"DELETE FROM `ConversationEntity`\");\n            database.execSQL(\"ALTER TABLE `ConversationEntity` ADD COLUMN `order` INTEGER NOT NULL DEFAULT 0\");\n\n            // timestamps are now serialized differently so all cache tables that contain them need to be cleaned\n            database.execSQL(\"DELETE FROM `TimelineStatusEntity`\");\n        }\n    };\n\n    public static final Migration MIGRATION_38_39 = new Migration(38, 39) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `clientId` TEXT\");\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `clientSecret` TEXT\");\n        }\n    };\n\n    public static final Migration MIGRATION_39_40 = new Migration(39, 40) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `InstanceEntity` ADD COLUMN `videoSizeLimit` INTEGER\");\n            database.execSQL(\"ALTER TABLE `InstanceEntity` ADD COLUMN `imageSizeLimit` INTEGER\");\n            database.execSQL(\"ALTER TABLE `InstanceEntity` ADD COLUMN `imageMatrixLimit` INTEGER\");\n            database.execSQL(\"ALTER TABLE `InstanceEntity` ADD COLUMN `maxMediaAttachments` INTEGER\");\n            database.execSQL(\"ALTER TABLE `InstanceEntity` ADD COLUMN `maxFields` INTEGER\");\n            database.execSQL(\"ALTER TABLE `InstanceEntity` ADD COLUMN `maxFieldNameLength` INTEGER\");\n            database.execSQL(\"ALTER TABLE `InstanceEntity` ADD COLUMN `maxFieldValueLength` INTEGER\");\n        }\n    };\n\n    public static final Migration MIGRATION_40_41 = new Migration(40, 41) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `DraftEntity` ADD COLUMN `scheduledAt` TEXT\");\n        }\n    };\n\n    public static final Migration MIGRATION_41_42 = new Migration(41, 42) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `DraftEntity` ADD COLUMN `language` TEXT\");\n            database.execSQL(\"ALTER TABLE `TimelineStatusEntity` ADD COLUMN `language` TEXT\");\n            database.execSQL(\"ALTER TABLE `ConversationEntity` ADD COLUMN `s_language` TEXT\");\n        }\n    };\n\n    public static final Migration MIGRATION_42_43 = new Migration(42, 43) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `defaultPostLanguage` TEXT NOT NULL DEFAULT ''\");\n        }\n    };\n\n    public static final Migration MIGRATION_43_44 = new Migration(43, 44) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `notificationsReports` INTEGER NOT NULL DEFAULT 1\");\n        }\n    };\n\n    public static final Migration MIGRATION_44_45 = new Migration(44, 45) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `TimelineStatusEntity` ADD COLUMN `editedAt` INTEGER\");\n            database.execSQL(\"ALTER TABLE `ConversationEntity` ADD COLUMN `s_editedAt` INTEGER\");\n        }\n    };\n\n    public static final Migration MIGRATION_45_46 = new Migration(45, 46) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `DraftEntity` ADD COLUMN `statusId` TEXT\");\n        }\n    };\n\n    public static final Migration MIGRATION_46_47 = new Migration(46, 47) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `DraftEntity` ADD COLUMN `failedToSendNew` INTEGER NOT NULL DEFAULT 0\");\n        }\n    };\n\n    public static final Migration MIGRATION_47_48 = new Migration(47, 48) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `TimelineStatusEntity` ADD COLUMN `filtered` TEXT\");\n        }\n    };\n\n    @DeleteColumn(tableName = \"AccountEntity\", columnName = \"activeNotifications\")\n    static class MIGRATION_49_50 implements AutoMigrationSpec { }\n\n    /**\n     * TabData.TRENDING was renamed to TabData.TRENDING_TAGS, and the text\n     * representation was changed from \"Trending\" to \"TrendingTags\".\n     */\n    public static final Migration MIGRATION_52_53 = new Migration(52, 53) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"UPDATE `AccountEntity` SET `tabpreferences` = REPLACE(tabpreferences, 'Trending:', 'TrendingTags:')\");\n        }\n    };\n\n    public static final Migration MIGRATION_54_56 = new Migration(54, 56) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `isShowHomeBoosts` INTEGER NOT NULL DEFAULT 1\");\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `isShowHomeReplies` INTEGER NOT NULL DEFAULT 1\");\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `isShowHomeSelfBoosts` INTEGER NOT NULL DEFAULT 1\");\n        }\n    };\n\n    public static final Migration MIGRATION_58_60 = new Migration(58, 60) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            // drop the old tables - they are only caches anyway\n            database.execSQL(\"DROP TABLE `TimelineStatusEntity`\");\n            database.execSQL(\"DROP TABLE `TimelineAccountEntity`\");\n\n            // create the new tables\n            database.execSQL(\"\"\"\n                CREATE TABLE IF NOT EXISTS `TimelineAccountEntity` (\n                `serverId` TEXT NOT NULL,\n                `tuskyAccountId` INTEGER NOT NULL,\n                `localUsername` TEXT NOT NULL,\n                `username` TEXT NOT NULL,\n                `displayName` TEXT NOT NULL,\n                `url` TEXT NOT NULL,\n                `avatar` TEXT NOT NULL,\n                `emojis` TEXT NOT NULL,\n                `bot` INTEGER NOT NULL,\n                PRIMARY KEY(`serverId`, `tuskyAccountId`)\n                )\"\"\"\n            );\n            database.execSQL(\"\"\"\n                CREATE TABLE IF NOT EXISTS `TimelineStatusEntity` (\n                `serverId` TEXT NOT NULL,\n                `url` TEXT,\n                `tuskyAccountId` INTEGER NOT NULL,\n                `authorServerId` TEXT NOT NULL,\n                `inReplyToId` TEXT,\n                `inReplyToAccountId` TEXT,\n                `content` TEXT NOT NULL,\n                `createdAt` INTEGER NOT NULL,\n                `editedAt` INTEGER,\n                `emojis` TEXT NOT NULL,\n                `reblogsCount` INTEGER NOT NULL,\n                `favouritesCount` INTEGER NOT NULL,\n                `repliesCount` INTEGER NOT NULL,\n                `reblogged` INTEGER NOT NULL,\n                `bookmarked` INTEGER NOT NULL,\n                `favourited` INTEGER NOT NULL,\n                `sensitive` INTEGER NOT NULL,\n                `spoilerText` TEXT NOT NULL,\n                `visibility` INTEGER NOT NULL,\n                `attachments` TEXT NOT NULL,\n                `mentions` TEXT NOT NULL,\n                `tags` TEXT NOT NULL,\n                `application` TEXT,\n                `poll` TEXT,\n                `muted` INTEGER NOT NULL,\n                `expanded` INTEGER NOT NULL,\n                `contentCollapsed` INTEGER NOT NULL,\n                `contentShowing` INTEGER NOT NULL,\n                `pinned` INTEGER NOT NULL,\n                `card` TEXT, `language` TEXT,\n                `filtered` TEXT NOT NULL,\n                PRIMARY KEY(`serverId`, `tuskyAccountId`),\n                FOREIGN KEY(`authorServerId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION\n                )\"\"\"\n            );\n            database.execSQL(\n                \"CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_tuskyAccountId` ON `TimelineStatusEntity` (`authorServerId`, `tuskyAccountId`)\"\n            );\n            database.execSQL(\"\"\"\n                CREATE TABLE IF NOT EXISTS `HomeTimelineEntity` (\n                `tuskyAccountId` INTEGER NOT NULL,\n                `id` TEXT NOT NULL,\n                `statusId` TEXT,\n                `reblogAccountId` TEXT,\n                `loading` INTEGER NOT NULL,\n                PRIMARY KEY(`id`, `tuskyAccountId`),\n                FOREIGN KEY(`statusId`, `tuskyAccountId`) REFERENCES `TimelineStatusEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n                FOREIGN KEY(`reblogAccountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION\n                )\"\"\"\n            );\n            database.execSQL(\n                \"CREATE INDEX IF NOT EXISTS `index_HomeTimelineEntity_statusId_tuskyAccountId` ON `HomeTimelineEntity` (`statusId`, `tuskyAccountId`)\"\n            );\n            database.execSQL(\n                \"CREATE INDEX IF NOT EXISTS `index_HomeTimelineEntity_reblogAccountId_tuskyAccountId` ON `HomeTimelineEntity` (`reblogAccountId`, `tuskyAccountId`)\"\n            );\n            database.execSQL(\"\"\"\n                CREATE TABLE IF NOT EXISTS `NotificationReportEntity`(\n                `tuskyAccountId` INTEGER NOT NULL,\n                `serverId` TEXT NOT NULL,\n                `category` TEXT NOT NULL,\n                `statusIds` TEXT,\n                `createdAt` INTEGER NOT NULL,\n                `targetAccountId` TEXT,\n                PRIMARY KEY(`serverId`, `tuskyAccountId`),\n                FOREIGN KEY(`targetAccountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION\n                )\"\"\"\n            );\n            database.execSQL(\n                \"CREATE INDEX IF NOT EXISTS `index_NotificationReportEntity_targetAccountId_tuskyAccountId` ON `NotificationReportEntity` (`targetAccountId`, `tuskyAccountId`)\"\n            );\n            database.execSQL(\"\"\"\n                CREATE TABLE IF NOT EXISTS `NotificationEntity` (\n                `tuskyAccountId` INTEGER NOT NULL,\n                `type` TEXT,\n                `id` TEXT NOT NULL,\n                `accountId` TEXT,\n                `statusId` TEXT,\n                `reportId` TEXT,\n                `loading` INTEGER NOT NULL,\n                PRIMARY KEY(`id`, `tuskyAccountId`),\n                FOREIGN KEY(`accountId`, `tuskyAccountId`) REFERENCES `TimelineAccountEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n                FOREIGN KEY(`statusId`, `tuskyAccountId`) REFERENCES `TimelineStatusEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n                FOREIGN KEY(`reportId`, `tuskyAccountId`) REFERENCES `NotificationReportEntity`(`serverId`, `tuskyAccountId`) ON UPDATE NO ACTION ON DELETE NO ACTION\n                )\"\"\"\n            );\n            database.execSQL(\n                \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_accountId_tuskyAccountId` ON `NotificationEntity` (`accountId`, `tuskyAccountId`)\"\n            );\n            database.execSQL(\n                \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_statusId_tuskyAccountId` ON `NotificationEntity` (`statusId`, `tuskyAccountId`)\"\n            );\n            database.execSQL(\n                \"CREATE INDEX IF NOT EXISTS `index_NotificationEntity_reportId_tuskyAccountId` ON `NotificationEntity` (`reportId`, `tuskyAccountId`)\"\n            );\n        }\n    };\n\n    public static final Migration MIGRATION_60_62 = new Migration(60, 62) {\n        @Override\n        public void migrate(@NonNull SupportSQLiteDatabase database) {\n            database.execSQL(\"ALTER TABLE `AccountEntity` ADD COLUMN `defaultReplyPrivacy` INTEGER NOT NULL DEFAULT 0\");\n        }\n    };\n\n    @DeleteColumn(tableName = \"AccountEntity\", columnName = \"notificationsSignUps\")\n    @DeleteColumn(tableName = \"AccountEntity\", columnName = \"notificationsReports\")\n    static class MIGRATION_66_68 implements AutoMigrationSpec { }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/ConversationsDao.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db\n\nimport androidx.paging.PagingSource\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\nimport com.keylesspalace.tusky.components.conversation.ConversationEntity\n\n@Dao\ninterface ConversationsDao {\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insert(conversations: List<ConversationEntity>)\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insert(conversation: ConversationEntity)\n\n    @Query(\"DELETE FROM ConversationEntity WHERE id = :id AND accountId = :accountId\")\n    suspend fun delete(id: String, accountId: Long)\n\n    @Query(\"SELECT * FROM ConversationEntity WHERE accountId = :accountId ORDER BY `order` ASC\")\n    fun conversationsForAccount(accountId: Long): PagingSource<Int, ConversationEntity>\n\n    @Query(\"DELETE FROM ConversationEntity WHERE accountId = :accountId\")\n    suspend fun deleteForAccount(accountId: Long)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/Converters.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db\n\nimport androidx.room.ProvidedTypeConverter\nimport androidx.room.TypeConverter\nimport com.keylesspalace.tusky.TabData\nimport com.keylesspalace.tusky.components.conversation.ConversationAccountEntity\nimport com.keylesspalace.tusky.components.systemnotifications.NotificationChannelData\nimport com.keylesspalace.tusky.createTabDataFromId\nimport com.keylesspalace.tusky.db.entity.DraftAttachment\nimport com.keylesspalace.tusky.entity.AccountWarning\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.entity.FilterResult\nimport com.keylesspalace.tusky.entity.HashTag\nimport com.keylesspalace.tusky.entity.NewPoll\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.entity.Poll\nimport com.keylesspalace.tusky.entity.PreviewCard\nimport com.keylesspalace.tusky.entity.RelationshipSeveranceEvent\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.entity.notificationTypeFromString\nimport com.keylesspalace.tusky.settings.DefaultReplyVisibility\nimport com.squareup.moshi.Moshi\nimport com.squareup.moshi.adapter\nimport java.net.URLDecoder\nimport java.net.URLEncoder\nimport java.util.Date\nimport javax.inject.Inject\nimport javax.inject.Singleton\nimport kotlin.collections.forEach\nimport org.json.JSONArray\n\n@OptIn(ExperimentalStdlibApi::class)\n@ProvidedTypeConverter\n@Singleton\nclass Converters @Inject constructor(\n    private val moshi: Moshi\n) {\n\n    @TypeConverter\n    fun jsonToEmojiList(emojiListJson: String?): List<Emoji> {\n        return emojiListJson?.let { moshi.adapter<List<Emoji>?>().fromJson(it) }.orEmpty()\n    }\n\n    @TypeConverter\n    fun emojiListToJson(emojiList: List<Emoji>): String {\n        return moshi.adapter<List<Emoji>>().toJson(emojiList)\n    }\n\n    @TypeConverter\n    fun visibilityToInt(visibility: Status.Visibility?): Int {\n        return visibility?.int ?: Status.Visibility.UNKNOWN.int\n    }\n\n    @TypeConverter\n    fun intToVisibility(visibility: Int): Status.Visibility {\n        return Status.Visibility.fromInt(visibility)\n    }\n\n    @TypeConverter\n    fun defaultReplyVisibilityToInt(visibility: DefaultReplyVisibility?): Int {\n        return visibility?.int ?: DefaultReplyVisibility.MATCH_DEFAULT_POST_VISIBILITY.int\n    }\n\n    @TypeConverter\n    fun intToDefaultReplyVisibility(visibility: Int): DefaultReplyVisibility {\n        return DefaultReplyVisibility.fromInt(visibility)\n    }\n\n    @TypeConverter\n    fun stringToTabData(str: String?): List<TabData>? {\n        return str?.split(\";\")\n            ?.map {\n                val data = it.split(\":\")\n                createTabDataFromId(\n                    data[0],\n                    data.drop(1).map { s -> URLDecoder.decode(s, \"UTF-8\") }\n                )\n            }\n    }\n\n    @TypeConverter\n    fun tabDataToString(tabData: List<TabData>?): String? {\n        // List name may include \":\"\n        return tabData?.joinToString(\";\") {\n            it.id + \":\" + it.arguments.joinToString(\":\") { s -> URLEncoder.encode(s, \"UTF-8\") }\n        }\n    }\n\n    @TypeConverter\n    fun accountToJson(account: ConversationAccountEntity?): String {\n        return moshi.adapter<ConversationAccountEntity?>().toJson(account)\n    }\n\n    @TypeConverter\n    fun jsonToAccount(accountJson: String?): ConversationAccountEntity? {\n        return accountJson?.let { moshi.adapter<ConversationAccountEntity?>().fromJson(it) }\n    }\n\n    @TypeConverter\n    fun accountListToJson(accountList: List<ConversationAccountEntity>): String {\n        return moshi.adapter<List<ConversationAccountEntity>>().toJson(accountList)\n    }\n\n    @TypeConverter\n    fun jsonToAccountList(accountListJson: String?): List<ConversationAccountEntity> {\n        return accountListJson?.let { moshi.adapter<List<ConversationAccountEntity>?>().fromJson(it) }.orEmpty()\n    }\n\n    @TypeConverter\n    fun attachmentListToJson(attachmentList: List<Attachment>): String {\n        return moshi.adapter<List<Attachment>>().toJson(attachmentList)\n    }\n\n    @TypeConverter\n    fun jsonToAttachmentList(attachmentListJson: String?): List<Attachment> {\n        return attachmentListJson?.let { moshi.adapter<List<Attachment>?>().fromJson(it) }.orEmpty()\n    }\n\n    @TypeConverter\n    fun mentionListToJson(mentionArray: List<Status.Mention>): String {\n        return moshi.adapter<List<Status.Mention>>().toJson(mentionArray)\n    }\n\n    @TypeConverter\n    fun jsonToMentionArray(mentionListJson: String?): List<Status.Mention> {\n        return mentionListJson?.let { moshi.adapter<List<Status.Mention>?>().fromJson(it) }.orEmpty()\n    }\n\n    @TypeConverter\n    fun tagListToJson(tagArray: List<HashTag>?): String {\n        return moshi.adapter<List<HashTag>?>().toJson(tagArray)\n    }\n\n    @TypeConverter\n    fun jsonToTagArray(tagListJson: String?): List<HashTag>? {\n        return tagListJson?.let { moshi.adapter<List<HashTag>?>().fromJson(it) }\n    }\n\n    @TypeConverter\n    fun dateToLong(date: Date?): Long? {\n        return date?.time\n    }\n\n    @TypeConverter\n    fun longToDate(date: Long?): Date? {\n        return date?.let { Date(it) }\n    }\n\n    @TypeConverter\n    fun pollToJson(poll: Poll?): String {\n        return moshi.adapter<Poll?>().toJson(poll)\n    }\n\n    @TypeConverter\n    fun jsonToPoll(pollJson: String?): Poll? {\n        return pollJson?.let { moshi.adapter<Poll?>().fromJson(it) }\n    }\n\n    @TypeConverter\n    fun newPollToJson(newPoll: NewPoll?): String {\n        return moshi.adapter<NewPoll?>().toJson(newPoll)\n    }\n\n    @TypeConverter\n    fun jsonToNewPoll(newPollJson: String?): NewPoll? {\n        return newPollJson?.let { moshi.adapter<NewPoll?>().fromJson(it) }\n    }\n\n    @TypeConverter\n    fun draftAttachmentListToJson(draftAttachments: List<DraftAttachment>): String {\n        return moshi.adapter<List<DraftAttachment>>().toJson(draftAttachments)\n    }\n\n    @TypeConverter\n    fun jsonToDraftAttachmentList(draftAttachmentListJson: String?): List<DraftAttachment> {\n        return draftAttachmentListJson?.let { moshi.adapter<List<DraftAttachment>?>().fromJson(it) }.orEmpty()\n    }\n\n    @TypeConverter\n    fun filterResultListToJson(filterResults: List<FilterResult>?): String {\n        return moshi.adapter<List<FilterResult>?>().toJson(filterResults)\n    }\n\n    @TypeConverter\n    fun jsonToFilterResultList(filterResultListJson: String?): List<FilterResult>? {\n        return filterResultListJson?.let { moshi.adapter<List<FilterResult>?>().fromJson(it) }\n    }\n\n    @TypeConverter\n    fun cardToJson(card: PreviewCard?): String {\n        return moshi.adapter<PreviewCard?>().toJson(card)\n    }\n\n    @TypeConverter\n    fun jsonToCard(cardJson: String?): PreviewCard? {\n        return cardJson?.let { moshi.adapter<PreviewCard?>().fromJson(cardJson) }\n    }\n\n    @TypeConverter\n    fun stringListToJson(list: List<String>?): String? {\n        return moshi.adapter<List<String>?>().toJson(list)\n    }\n\n    @TypeConverter\n    fun jsonToStringList(listJson: String?): List<String>? {\n        return listJson?.let { moshi.adapter<List<String>?>().fromJson(it) }\n    }\n\n    @TypeConverter\n    fun applicationToJson(application: Status.Application?): String {\n        return moshi.adapter<Status.Application?>().toJson(application)\n    }\n\n    @TypeConverter\n    fun jsonToApplication(applicationJson: String?): Status.Application? {\n        return applicationJson?.let { moshi.adapter<Status.Application?>().fromJson(it) }\n    }\n\n    @TypeConverter\n    fun notificationChannelDataListToJson(data: Set<NotificationChannelData>?): String {\n        val array = JSONArray()\n        data?.forEach {\n            array.put(it.name)\n        }\n        return array.toString()\n    }\n\n    @TypeConverter\n    fun jsonToNotificationChannelDataList(data: String?): Set<NotificationChannelData> {\n        val ret = HashSet<NotificationChannelData>()\n        data?.let {\n            val array = JSONArray(data)\n            for (i in 0 until array.length()) {\n                val item = array.getString(i)\n                try {\n                    val type = NotificationChannelData.valueOf(item)\n                    ret.add(type)\n                } catch (_: IllegalArgumentException) {\n                    // ignore, this can happen because we stored individual notification types and not channels before\n                }\n            }\n        }\n        return ret\n    }\n\n    @TypeConverter\n    fun relationshipSeveranceEventToJson(event: RelationshipSeveranceEvent?): String {\n        return moshi.adapter<RelationshipSeveranceEvent?>().toJson(event)\n    }\n\n    @TypeConverter\n    fun jsonToRelationshipSeveranceEvent(eventJson: String?): RelationshipSeveranceEvent? {\n        return eventJson?.let { moshi.adapter<RelationshipSeveranceEvent?>().fromJson(it) }\n    }\n\n    @TypeConverter\n    fun accountWarningToJson(accountWarning: AccountWarning?): String {\n        return moshi.adapter<AccountWarning?>().toJson(accountWarning)\n    }\n\n    @TypeConverter\n    fun jsonToAccountWarning(accountWarningJson: String?): AccountWarning? {\n        return accountWarningJson?.let { moshi.adapter<AccountWarning?>().fromJson(it) }\n    }\n\n    @TypeConverter\n    fun accountWarningToJson(notificationType: Notification.Type): String {\n        return notificationType.name\n    }\n\n    @TypeConverter\n    fun jsonToNotificationType(notificationTypeJson: String): Notification.Type {\n        return notificationTypeFromString(notificationTypeJson)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/DatabaseCleaner.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db\n\nimport androidx.room.withTransaction\nimport com.keylesspalace.tusky.components.conversation.ConversationEntity\nimport com.keylesspalace.tusky.db.entity.HomeTimelineEntity\nimport com.keylesspalace.tusky.db.entity.NotificationEntity\nimport com.keylesspalace.tusky.db.entity.NotificationPolicyEntity\nimport com.keylesspalace.tusky.db.entity.NotificationReportEntity\nimport com.keylesspalace.tusky.db.entity.TimelineAccountEntity\nimport com.keylesspalace.tusky.db.entity.TimelineStatusEntity\nimport javax.inject.Inject\n\nclass DatabaseCleaner @Inject constructor(\n    private val db: AppDatabase\n) {\n    /**\n     * Cleans the [HomeTimelineEntity], [TimelineStatusEntity], [TimelineAccountEntity], [NotificationEntity] and [NotificationReportEntity] tables from old entries.\n     * Should be regularly run to prevent the database from growing too big.\n     * @param tuskyAccountId id of the account for which to clean tables\n     * @param timelineLimit how many timeline items to keep\n     * @param notificationLimit how many notifications to keep\n     */\n    suspend fun cleanupOldData(\n        tuskyAccountId: Long,\n        timelineLimit: Int,\n        notificationLimit: Int\n    ) {\n        db.withTransaction {\n            // the order here is important - foreign key constraints must not be violated\n            db.notificationsDao().cleanupNotifications(tuskyAccountId, notificationLimit)\n            db.notificationsDao().cleanupReports(tuskyAccountId)\n            db.timelineDao().cleanupHomeTimeline(tuskyAccountId, timelineLimit)\n            db.timelineStatusDao().cleanupStatuses(tuskyAccountId)\n            db.timelineAccountDao().cleanupAccounts(tuskyAccountId)\n        }\n    }\n\n    /**\n     * Deletes everything from the [HomeTimelineEntity], [TimelineStatusEntity], [TimelineAccountEntity], [NotificationEntity],\n     * [NotificationReportEntity],  [ConversationEntity] and [NotificationPolicyEntity] tables for one user.\n     * Intended to be used when a user logs out.\n     * @param tuskyAccountId id of the account for which to clean tables\n     */\n    suspend fun cleanupEverything(tuskyAccountId: Long) {\n        db.withTransaction {\n            // the order here is important - foreign key constraints must not be violated\n            db.notificationsDao().removeAllNotifications(tuskyAccountId)\n            db.notificationsDao().removeAllReports(tuskyAccountId)\n            db.timelineDao().removeAllHomeTimelineItems(tuskyAccountId)\n            db.timelineStatusDao().removeAllStatuses(tuskyAccountId)\n            db.timelineAccountDao().removeAllAccounts(tuskyAccountId)\n            db.conversationDao().deleteForAccount(tuskyAccountId)\n            db.notificationPolicyDao().deleteForAccount(tuskyAccountId)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/DraftsAlert.kt",
    "content": "/* Copyright 2023 Andi McClure\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db\n\nimport android.content.Context\nimport android.content.DialogInterface\nimport android.util.Log\nimport androidx.appcompat.app.AlertDialog\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleCoroutineScope\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.drafts.DraftsActivity\nimport com.keylesspalace.tusky.db.dao.DraftDao\nimport javax.inject.Inject\nimport kotlinx.coroutines.launch\n\n/**\n * This class manages an alert popup when a post has failed and been saved to drafts.\n * It must be separately registered in each lifetime in which it is to appear,\n * and it only appears if the post failure belongs to the current user.\n */\n\nprivate const val TAG = \"DraftsAlert\"\n\nclass DraftsAlert @Inject constructor(\n    db: AppDatabase,\n    private val accountManager: AccountManager\n) {\n    // For tracking when a media upload fails in the service\n    private val draftDao: DraftDao = db.draftDao()\n\n    private var dialog: AlertDialog? = null\n\n    fun <T> observeInContext(context: T, showAlert: Boolean) where T : Context, T : LifecycleOwner {\n        accountManager.activeAccount?.let { activeAccount ->\n            val coroutineScope = context.lifecycleScope\n\n            // One activity never sees more then one user id in its lifetime.\n            val activeAccountId = activeAccount.id\n\n            // observe ensures that this gets called at the most appropriate moment wrt the context lifecycle—\n            // at init, at next onResume, or immediately if the context is resumed already.\n            coroutineScope.launch {\n                context.repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                    val draftsNeedUserAlert = draftDao.draftsNeedUserAlert(activeAccountId)\n\n                    if (showAlert) {\n                        draftDao.draftsNeedUserAlert(activeAccountId).collect { count ->\n                            Log.d(TAG, \"User id $activeAccountId changed: Notification-worthy draft count $count\")\n                            if (count > 0) {\n                                dialog?.cancel()\n                                dialog = MaterialAlertDialogBuilder(context)\n                                    .setTitle(R.string.action_post_failed)\n                                    .setMessage(\n                                        context.resources.getQuantityString(R.plurals.action_post_failed_detail, count)\n                                    )\n                                    .setPositiveButton(R.string.action_post_failed_show_drafts) { _: DialogInterface?, _: Int ->\n                                        clearDraftsAlert(coroutineScope, activeAccountId) // User looked at drafts\n\n                                        val intent = DraftsActivity.newIntent(context)\n                                        context.startActivity(intent)\n                                    }\n                                    .setNegativeButton(R.string.action_post_failed_do_nothing) { _: DialogInterface?, _: Int ->\n                                        clearDraftsAlert(coroutineScope, activeAccountId) // User doesn't care\n                                    }\n                                    .show()\n                            }\n                        }\n                    } else {\n                        draftsNeedUserAlert.collect {\n                            Log.d(TAG, \"User id $activeAccountId: Clean out notification-worthy drafts\")\n                            clearDraftsAlert(coroutineScope, activeAccountId)\n                        }\n                    }\n                }\n            }\n        } ?: run {\n            Log.w(TAG, \"Attempted to observe drafts, but there is no active account\")\n        }\n    }\n\n    /**\n     * Clear drafts alert for specified user\n     */\n    private fun clearDraftsAlert(coroutineScope: LifecycleCoroutineScope, id: Long) {\n        coroutineScope.launch {\n            draftDao.draftsClearNeedUserAlert(id)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/dao/AccountDao.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db.dao\n\nimport androidx.room.Dao\nimport androidx.room.Delete\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\ninterface AccountDao {\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertOrReplace(account: AccountEntity): Long\n\n    @Delete\n    suspend fun delete(account: AccountEntity)\n\n    @Query(\"SELECT * FROM AccountEntity ORDER BY isActive DESC\")\n    fun allAccounts(): Flow<List<AccountEntity>>\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/dao/DraftDao.kt",
    "content": "/* Copyright 2020 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db.dao\n\nimport androidx.paging.PagingSource\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\nimport com.keylesspalace.tusky.db.entity.DraftEntity\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\ninterface DraftDao {\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertOrReplace(draft: DraftEntity)\n\n    @Query(\"SELECT * FROM DraftEntity WHERE accountId = :accountId ORDER BY id ASC\")\n    fun draftsPagingSource(accountId: Long): PagingSource<Int, DraftEntity>\n\n    @Query(\"SELECT COUNT(*) FROM DraftEntity WHERE accountId = :accountId AND failedToSendNew = 1\")\n    fun draftsNeedUserAlert(accountId: Long): Flow<Int>\n\n    @Query(\n        \"UPDATE DraftEntity SET failedToSendNew = 0 WHERE accountId = :accountId AND failedToSendNew = 1\"\n    )\n    suspend fun draftsClearNeedUserAlert(accountId: Long)\n\n    @Query(\"SELECT * FROM DraftEntity WHERE accountId = :accountId\")\n    suspend fun loadDrafts(accountId: Long): List<DraftEntity>\n\n    @Query(\"DELETE FROM DraftEntity WHERE id = :id\")\n    suspend fun delete(id: Int)\n\n    @Query(\"SELECT * FROM DraftEntity WHERE id = :id\")\n    suspend fun find(id: Int): DraftEntity?\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/dao/InstanceDao.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db.dao\n\nimport androidx.room.Dao\nimport androidx.room.Query\nimport androidx.room.RewriteQueriesToDropUnusedColumns\nimport androidx.room.Upsert\nimport com.keylesspalace.tusky.db.entity.EmojisEntity\nimport com.keylesspalace.tusky.db.entity.InstanceEntity\nimport com.keylesspalace.tusky.db.entity.InstanceInfoEntity\n\n@Dao\ninterface InstanceDao {\n\n    @Upsert(entity = InstanceEntity::class)\n    suspend fun upsert(instance: InstanceInfoEntity)\n\n    @Upsert(entity = InstanceEntity::class)\n    suspend fun upsert(emojis: EmojisEntity)\n\n    @RewriteQueriesToDropUnusedColumns\n    @Query(\"SELECT * FROM InstanceEntity WHERE instance = :instance LIMIT 1\")\n    suspend fun getInstanceInfo(instance: String): InstanceInfoEntity?\n\n    @RewriteQueriesToDropUnusedColumns\n    @Query(\"SELECT * FROM InstanceEntity WHERE instance = :instance LIMIT 1\")\n    suspend fun getEmojiInfo(instance: String): EmojisEntity?\n\n    @Query(\"UPDATE InstanceEntity SET filterV2Supported = :filterV2Support WHERE instance = :instance\")\n    suspend fun setFilterV2Support(instance: String, filterV2Support: Boolean)\n\n    @Query(\"SELECT filterV2Supported FROM InstanceEntity WHERE instance = :instance LIMIT 1\")\n    suspend fun getFilterV2Support(instance: String): Boolean\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/dao/NotificationPolicyDao.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db.dao\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy.Companion.REPLACE\nimport androidx.room.Query\nimport com.keylesspalace.tusky.db.entity.NotificationPolicyEntity\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\ninterface NotificationPolicyDao {\n    @Query(\"SELECT * FROM NotificationPolicyEntity WHERE tuskyAccountId = :accountId\")\n    fun notificationPolicyForAccount(accountId: Long): Flow<NotificationPolicyEntity?>\n\n    @Insert(onConflict = REPLACE)\n    suspend fun update(entity: NotificationPolicyEntity)\n\n    @Query(\n        \"UPDATE NotificationPolicyEntity \" +\n            \"SET pendingRequestsCount = max(0, pendingRequestsCount - 1),\" +\n            \"pendingNotificationsCount = max(0, pendingNotificationsCount - :notificationCount) \" +\n            \"WHERE tuskyAccountId = :accountId\"\n    )\n    suspend fun updateCounts(\n        accountId: Long,\n        notificationCount: Int\n    )\n\n    @Query(\"DELETE FROM NotificationPolicyEntity WHERE tuskyAccountId = :accountId\")\n    suspend fun deleteForAccount(accountId: Long)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/dao/NotificationsDao.kt",
    "content": "/* Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db.dao\n\nimport androidx.paging.PagingSource\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy.Companion.REPLACE\nimport androidx.room.Query\nimport com.keylesspalace.tusky.db.entity.NotificationDataEntity\nimport com.keylesspalace.tusky.db.entity.NotificationEntity\nimport com.keylesspalace.tusky.db.entity.NotificationReportEntity\n\n@Dao\nabstract class NotificationsDao {\n\n    @Insert(onConflict = REPLACE)\n    abstract suspend fun insertNotification(notificationEntity: NotificationEntity): Long\n\n    @Insert(onConflict = REPLACE)\n    abstract suspend fun insertReport(notificationReportDataEntity: NotificationReportEntity): Long\n\n    @Query(\n        \"\"\"\nSELECT n.tuskyAccountId, n.type, n.id, n.loading, n.event, n.moderationWarning,\na.serverId as 'a_serverId', a.tuskyAccountId as 'a_tuskyAccountId',\na.localUsername as 'a_localUsername', a.username as 'a_username',\na.displayName as 'a_displayName', a.url as 'a_url', a.avatar as 'a_avatar',\na.note as 'a_note', a.emojis as 'a_emojis', a.bot as 'a_bot',\ns.serverId as 's_serverId', s.url as 's_url', s.tuskyAccountId as 's_tuskyAccountId',\ns.authorServerId as 's_authorServerId', s.inReplyToId as 's_inReplyToId', s.inReplyToAccountId as 's_inReplyToAccountId',\ns.content as 's_content', s.createdAt as 's_createdAt', s.editedAt as 's_editedAt', s.emojis as 's_emojis', s.reblogsCount as 's_reblogsCount',\ns.favouritesCount as 's_favouritesCount', s.repliesCount as 's_repliesCount', s.reblogged as 's_reblogged', s.favourited as 's_favourited',\ns.bookmarked as 's_bookmarked', s.sensitive as 's_sensitive', s.spoilerText as 's_spoilerText', s.visibility as 's_visibility',\ns.mentions as 's_mentions', s.tags as 's_tags', s.application as 's_application', s.content as 's_content', s.attachments as 's_attachments', s.poll as 's_poll',\ns.card as 's_card', s.muted as 's_muted', s.expanded as 's_expanded', s.contentShowing as 's_contentShowing', s.contentCollapsed as 's_contentCollapsed',\ns.pinned as 's_pinned', s.language as 's_language', s.filtered as 's_filtered',\nsa.serverId as 'sa_serverId', sa.tuskyAccountId as 'sa_tuskyAccountId',\nsa.localUsername as 'sa_localUsername', sa.username as 'sa_username',\nsa.displayName as 'sa_displayName', sa.url as 'sa_url', sa.avatar as 'sa_avatar',\nsa.note as 'sa_note', sa.emojis as 'sa_emojis', sa.bot as 'sa_bot',\nr.serverId as 'r_serverId', r.tuskyAccountId as 'r_tuskyAccountId',\nr.category as 'r_category', r.statusIds as 'r_statusIds',\nr.createdAt as 'r_createdAt', r.targetAccountId as 'r_targetAccountId',\nra.serverId as 'ra_serverId', ra.tuskyAccountId as 'ra_tuskyAccountId',\nra.localUsername as 'ra_localUsername', ra.username as 'ra_username',\nra.displayName as 'ra_displayName', ra.url as 'ra_url', ra.avatar as 'ra_avatar',\nra.note as 'ra_note', ra.emojis as 'ra_emojis', ra.bot as 'ra_bot'\nFROM NotificationEntity n\nLEFT JOIN TimelineAccountEntity a ON (n.tuskyAccountId = a.tuskyAccountId AND n.accountId = a.serverId)\nLEFT JOIN TimelineStatusEntity s ON (n.tuskyAccountId = s.tuskyAccountId AND n.statusId = s.serverId)\nLEFT JOIN TimelineAccountEntity sa ON (n.tuskyAccountId = sa.tuskyAccountId AND s.authorServerId = sa.serverId)\nLEFT JOIN NotificationReportEntity r ON (n.tuskyAccountId = r.tuskyAccountId AND n.reportId = r.serverId)\nLEFT JOIN TimelineAccountEntity ra ON (n.tuskyAccountId = ra.tuskyAccountId AND r.targetAccountId = ra.serverId)\nWHERE n.tuskyAccountId = :tuskyAccountId\nORDER BY LENGTH(n.id) DESC, n.id DESC\"\"\"\n    )\n    abstract fun getNotifications(tuskyAccountId: Long): PagingSource<Int, NotificationDataEntity>\n\n    @Query(\n        \"\"\"DELETE FROM NotificationEntity WHERE tuskyAccountId = :tuskyAccountId AND id = :notificationId\"\"\"\n    )\n    abstract suspend fun delete(tuskyAccountId: Long, notificationId: String): Int\n\n    @Query(\n        \"\"\"DELETE FROM NotificationEntity WHERE tuskyAccountId = :tuskyAccountId AND\n        (LENGTH(id) < LENGTH(:maxId) OR LENGTH(id) == LENGTH(:maxId) AND id <= :maxId)\nAND\n(LENGTH(id) > LENGTH(:minId) OR LENGTH(id) == LENGTH(:minId) AND id >= :minId)\n    \"\"\"\n    )\n    abstract suspend fun deleteRange(tuskyAccountId: Long, minId: String, maxId: String): Int\n\n    @Query(\n        \"\"\"DELETE FROM NotificationEntity WHERE tuskyAccountId = :tuskyAccountId\"\"\"\n    )\n    internal abstract suspend fun removeAllNotifications(tuskyAccountId: Long)\n\n    /**\n     * Deletes all NotificationReportEntities for Tusky user with id [tuskyAccountId].\n     * Warning: This can violate foreign key constraints if reports are still referenced in the NotificationEntity table.\n     */\n    @Query(\n        \"\"\"DELETE FROM NotificationReportEntity WHERE tuskyAccountId = :tuskyAccountId\"\"\"\n    )\n    internal abstract suspend fun removeAllReports(tuskyAccountId: Long)\n\n    @Query(\n        \"\"\"DELETE FROM NotificationEntity WHERE tuskyAccountId = :tuskyAccountId AND statusId = :statusId\"\"\"\n    )\n    abstract suspend fun deleteAllWithStatus(tuskyAccountId: Long, statusId: String)\n\n    /**\n     * Remove all notifications from user with id [userId] unless they are admin notifications.\n     */\n    @Query(\n        \"\"\"DELETE FROM NotificationEntity WHERE tuskyAccountId = :tuskyAccountId AND\n            (accountId = :userId OR\n            statusId IN (SELECT serverId FROM TimelineStatusEntity WHERE tuskyAccountId = :tuskyAccountId AND authorServerId = :userId)\n            )\n            AND type != \"admin.sign_up\" AND type != \"admin.report\"\n        \"\"\"\n    )\n    abstract suspend fun removeAllByUser(tuskyAccountId: Long, userId: String)\n\n    @Query(\n        \"\"\"DELETE FROM NotificationEntity\n            WHERE tuskyAccountId = :tuskyAccountId AND statusId IN (\n            SELECT serverId FROM TimelineStatusEntity WHERE tuskyAccountId = :tuskyAccountId AND authorServerId in\n            ( SELECT serverId FROM TimelineAccountEntity WHERE username LIKE '%@' || :instanceDomain\n            AND tuskyAccountId = :tuskyAccountId)\n            OR accountId IN ( SELECT serverId FROM TimelineAccountEntity WHERE username LIKE '%@' || :instanceDomain\n            AND tuskyAccountId = :tuskyAccountId)\n            )\"\"\"\n    )\n    abstract suspend fun deleteAllFromInstance(tuskyAccountId: Long, instanceDomain: String)\n\n    @Query(\"SELECT id FROM NotificationEntity WHERE tuskyAccountId = :accountId ORDER BY LENGTH(id) DESC, id DESC LIMIT 1\")\n    abstract suspend fun getTopId(accountId: Long): String?\n\n    @Query(\"SELECT id FROM NotificationEntity WHERE tuskyAccountId = :accountId AND type IS NULL ORDER BY LENGTH(id) DESC, id DESC LIMIT 1\")\n    abstract suspend fun getTopPlaceholderId(accountId: Long): String?\n\n    /**\n     * Cleans the NotificationEntity table from old entries.\n     * @param tuskyAccountId id of the account for which to clean tables\n     * @param limit how many timeline items to keep\n     */\n    @Query(\n        \"\"\"DELETE FROM NotificationEntity WHERE tuskyAccountId = :tuskyAccountId AND id NOT IN\n        (SELECT id FROM NotificationEntity WHERE tuskyAccountId = :tuskyAccountId ORDER BY LENGTH(id) DESC, id DESC LIMIT :limit)\n    \"\"\"\n    )\n    internal abstract suspend fun cleanupNotifications(tuskyAccountId: Long, limit: Int)\n\n    /**\n     * Cleans the NotificationReportEntity table from unreferenced entries.\n     * @param tuskyAccountId id of the account for which to clean the table\n     */\n    @Query(\n        \"\"\"DELETE FROM NotificationReportEntity WHERE tuskyAccountId = :tuskyAccountId\n        AND serverId NOT IN\n        (SELECT reportId FROM NotificationEntity WHERE tuskyAccountId = :tuskyAccountId and reportId IS NOT NULL)\"\"\"\n    )\n    internal abstract suspend fun cleanupReports(tuskyAccountId: Long)\n\n    /**\n     * Returns the id directly above [id], or null if [id] is the id of the top item\n     */\n    @Query(\n        \"SELECT id FROM NotificationEntity WHERE tuskyAccountId = :tuskyAccountId AND (LENGTH(:id) < LENGTH(id) OR (LENGTH(:id) = LENGTH(id) AND :id < id)) ORDER BY LENGTH(id) ASC, id ASC LIMIT 1\"\n    )\n    abstract suspend fun getIdAbove(tuskyAccountId: Long, id: String): String?\n\n    /**\n     * Returns the ID directly below [id], or null if [id] is the ID of the bottom item\n     */\n    @Query(\n        \"SELECT id FROM NotificationEntity WHERE tuskyAccountId = :tuskyAccountId AND (LENGTH(:id) > LENGTH(id) OR (LENGTH(:id) = LENGTH(id) AND :id > id)) ORDER BY LENGTH(id) DESC, id DESC LIMIT 1\"\n    )\n    abstract suspend fun getIdBelow(tuskyAccountId: Long, id: String): String?\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/dao/TimelineAccountDao.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db.dao\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy.Companion.REPLACE\nimport androidx.room.Query\nimport com.keylesspalace.tusky.db.entity.TimelineAccountEntity\n\n@Dao\nabstract class TimelineAccountDao {\n\n    @Insert(onConflict = REPLACE)\n    abstract suspend fun insert(timelineAccountEntity: TimelineAccountEntity): Long\n\n    @Query(\n        \"\"\"SELECT * FROM TimelineAccountEntity a\n           WHERE a.serverId = :accountId\n           AND a.tuskyAccountId = :tuskyAccountId\"\"\"\n    )\n    internal abstract suspend fun getAccount(tuskyAccountId: Long, accountId: String): TimelineAccountEntity?\n\n    @Query(\"DELETE FROM TimelineAccountEntity WHERE tuskyAccountId = :tuskyAccountId\")\n    abstract suspend fun removeAllAccounts(tuskyAccountId: Long)\n\n    /**\n     * Cleans the TimelineAccountEntity table from accounts that are no longer referenced by either TimelineStatusEntity, HomeTimelineEntity or NotificationEntity\n     * @param tuskyAccountId id of the user account for which to clean timeline accounts\n     */\n    @Query(\n        \"\"\"DELETE FROM TimelineAccountEntity WHERE tuskyAccountId = :tuskyAccountId\n        AND serverId NOT IN\n        (SELECT authorServerId FROM TimelineStatusEntity WHERE tuskyAccountId = :tuskyAccountId)\n        AND serverId NOT IN\n        (SELECT reblogAccountId FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId AND reblogAccountId IS NOT NULL)\n        AND serverId NOT IN\n        (SELECT accountId FROM NotificationEntity WHERE tuskyAccountId = :tuskyAccountId AND accountId IS NOT NULL)\n        AND serverId NOT IN\n        (SELECT targetAccountId FROM NotificationReportEntity WHERE tuskyAccountId = :tuskyAccountId AND targetAccountId IS NOT NULL)\"\"\"\n    )\n    abstract suspend fun cleanupAccounts(tuskyAccountId: Long)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/dao/TimelineDao.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db.dao\n\nimport androidx.paging.PagingSource\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy.Companion.REPLACE\nimport androidx.room.Query\nimport com.keylesspalace.tusky.db.entity.HomeTimelineData\nimport com.keylesspalace.tusky.db.entity.HomeTimelineEntity\n\n@Dao\nabstract class TimelineDao {\n\n    @Insert(onConflict = REPLACE)\n    abstract suspend fun insertHomeTimelineItem(item: HomeTimelineEntity): Long\n\n    @Query(\n        \"\"\"\nSELECT h.id, s.serverId, s.url, s.tuskyAccountId,\ns.authorServerId, s.inReplyToId, s.inReplyToAccountId, s.createdAt, s.editedAt,\ns.emojis, s.reblogsCount, s.favouritesCount, s.repliesCount, s.reblogged, s.favourited, s.bookmarked, s.sensitive,\ns.spoilerText, s.visibility, s.mentions, s.tags, s.application,\ns.content, s.attachments, s.poll, s.card, s.muted, s.expanded, s.contentShowing, s.contentCollapsed, s.pinned, s.language, s.filtered,\na.serverId as 'a_serverId', a.tuskyAccountId as 'a_tuskyAccountId',\na.localUsername as 'a_localUsername', a.username as 'a_username',\na.displayName as 'a_displayName', a.url as 'a_url', a.avatar as 'a_avatar',\na.note as 'a_note', a.emojis as 'a_emojis', a.bot as 'a_bot',\nrb.serverId as 'rb_serverId', rb.tuskyAccountId 'rb_tuskyAccountId',\nrb.localUsername as 'rb_localUsername', rb.username as 'rb_username',\nrb.displayName as 'rb_displayName', rb.url as 'rb_url', rb.avatar as 'rb_avatar',\nrb.note as 'rb_note', rb.emojis as 'rb_emojis', rb.bot as 'rb_bot',\nreplied.serverId as 'replied_serverId', replied.tuskyAccountId 'replied_tuskyAccountId',\nreplied.localUsername as 'replied_localUsername', replied.username as 'replied_username',\nreplied.displayName as 'replied_displayName', replied.url as 'replied_url', replied.avatar as 'replied_avatar',\nreplied.note as 'replied_note', replied.emojis as 'replied_emojis', replied.bot as 'replied_bot',\nh.loading\nFROM HomeTimelineEntity h\nLEFT JOIN TimelineStatusEntity s ON (h.statusId = s.serverId AND s.tuskyAccountId = :tuskyAccountId)\nLEFT JOIN TimelineAccountEntity a ON (s.authorServerId = a.serverId AND a.tuskyAccountId = :tuskyAccountId)\nLEFT JOIN TimelineAccountEntity rb ON (h.reblogAccountId = rb.serverId AND rb.tuskyAccountId = :tuskyAccountId)\nLEFT JOIN TimelineAccountEntity replied ON (s.inReplyToAccountId = replied.serverId AND replied.tuskyAccountId = :tuskyAccountId)\nWHERE h.tuskyAccountId = :tuskyAccountId\nORDER BY LENGTH(h.id) DESC, h.id DESC\"\"\"\n    )\n    abstract fun getHomeTimeline(tuskyAccountId: Long): PagingSource<Int, HomeTimelineData>\n\n    @Query(\n        \"\"\"DELETE FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId AND\n        (LENGTH(id) < LENGTH(:maxId) OR LENGTH(id) == LENGTH(:maxId) AND id <= :maxId)\nAND\n(LENGTH(id) > LENGTH(:minId) OR LENGTH(id) == LENGTH(:minId) AND id >= :minId)\n    \"\"\"\n    )\n    abstract suspend fun deleteRange(tuskyAccountId: Long, minId: String, maxId: String): Int\n\n    /**\n     * Remove all home timeline items that are statuses or reblogs by the user with id [userId], including reblogs from other people.\n     * (e.g. because user was blocked)\n     */\n    @Query(\n        \"\"\"DELETE FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId AND\n            (statusId IN\n            (SELECT serverId FROM TimelineStatusEntity WHERE tuskyAccountId = :tuskyAccountId AND authorServerId == :userId)\n            OR reblogAccountId == :userId)\n        \"\"\"\n    )\n    abstract suspend fun removeAllByUser(tuskyAccountId: Long, userId: String)\n\n    /**\n     * Remove all home timeline items that are statuses or reblogs by the user with id [userId], but not reblogs from other users.\n     * (e.g. because user was unfollowed)\n     */\n    @Query(\n        \"\"\"DELETE FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId AND\n            ((statusId IN\n            (SELECT serverId FROM TimelineStatusEntity WHERE tuskyAccountId = :tuskyAccountId AND authorServerId == :userId)\n            AND reblogAccountId IS NULL)\n            OR reblogAccountId == :userId)\n        \"\"\"\n    )\n    abstract suspend fun removeStatusesAndReblogsByUser(tuskyAccountId: Long, userId: String)\n\n    @Query(\"DELETE FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId\")\n    abstract suspend fun removeAllHomeTimelineItems(tuskyAccountId: Long)\n\n    @Query(\n        \"\"\"DELETE FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId AND id = :id\"\"\"\n    )\n    abstract suspend fun deleteHomeTimelineItem(tuskyAccountId: Long, id: String)\n\n    /**\n     * Deletes all hometimeline items that reference the status with it [statusId]. They can be regular statuses or reblogs.\n     */\n    @Query(\n        \"\"\"DELETE FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId AND statusId = :statusId\"\"\"\n    )\n    abstract suspend fun deleteAllWithStatus(tuskyAccountId: Long, statusId: String)\n\n    /**\n     * Trims the HomeTimelineEntity table down to [limit] entries by deleting the oldest in case there are more than [limit].\n     * @param tuskyAccountId id of the account for which to clean the home timeline\n     * @param limit how many timeline items to keep\n     */\n    @Query(\n        \"\"\"DELETE FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId AND id NOT IN\n        (SELECT id FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId ORDER BY LENGTH(id) DESC, id DESC LIMIT :limit)\n    \"\"\"\n    )\n    internal abstract suspend fun cleanupHomeTimeline(tuskyAccountId: Long, limit: Int)\n\n    @Query(\n        \"\"\"DELETE FROM HomeTimelineEntity\nWHERE tuskyAccountId = :tuskyAccountId AND statusId IN (\nSELECT serverId FROM TimelineStatusEntity WHERE tuskyAccountId = :tuskyAccountId AND authorServerId in\n( SELECT serverId FROM TimelineAccountEntity WHERE username LIKE '%@' || :instanceDomain\nAND tuskyAccountId = :tuskyAccountId\n))\"\"\"\n    )\n    abstract suspend fun deleteAllFromInstance(tuskyAccountId: Long, instanceDomain: String)\n\n    @Query(\n        \"SELECT id FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId ORDER BY LENGTH(id) DESC, id DESC LIMIT 1\"\n    )\n    abstract suspend fun getTopId(tuskyAccountId: Long): String?\n\n    @Query(\n        \"SELECT id FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId AND statusId IS NULL ORDER BY LENGTH(id) DESC, id DESC LIMIT 1\"\n    )\n    abstract suspend fun getTopPlaceholderId(tuskyAccountId: Long): String?\n\n    /**\n     * Returns the id directly above [id], or null if [id] is the id of the top item\n     */\n    @Query(\n        \"SELECT id FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId AND (LENGTH(:id) < LENGTH(id) OR (LENGTH(:id) = LENGTH(id) AND :id < id)) ORDER BY LENGTH(id) ASC, id ASC LIMIT 1\"\n    )\n    abstract suspend fun getIdAbove(tuskyAccountId: Long, id: String): String?\n\n    /**\n     * Returns the ID directly below [id], or null if [id] is the ID of the bottom item\n     */\n    @Query(\n        \"SELECT id FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId AND (LENGTH(:id) > LENGTH(id) OR (LENGTH(:id) = LENGTH(id) AND :id > id)) ORDER BY LENGTH(id) DESC, id DESC LIMIT 1\"\n    )\n    abstract suspend fun getIdBelow(tuskyAccountId: Long, id: String): String?\n\n    @Query(\"SELECT COUNT(*) FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId\")\n    abstract suspend fun getHomeTimelineItemCount(tuskyAccountId: Long): Int\n\n    /** Developer tools: Find N most recent status IDs */\n    @Query(\n        \"SELECT id FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId ORDER BY LENGTH(id) DESC, id DESC LIMIT :count\"\n    )\n    abstract suspend fun getMostRecentNHomeTimelineIds(tuskyAccountId: Long, count: Int): List<String>\n\n    /** Developer tools: Convert a home timeline item to a placeholder */\n    @Query(\"UPDATE HomeTimelineEntity SET statusId = NULL, reblogAccountId = NULL WHERE id = :serverId\")\n    abstract suspend fun convertHomeTimelineItemToPlaceholder(serverId: String)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/dao/TimelineStatusDao.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db.dao\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy.Companion.REPLACE\nimport androidx.room.Query\nimport androidx.room.Transaction\nimport androidx.room.TypeConverters\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.Converters\nimport com.keylesspalace.tusky.db.entity.TimelineAccountEntity\nimport com.keylesspalace.tusky.db.entity.TimelineStatusEntity\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.entity.HashTag\nimport com.keylesspalace.tusky.entity.Poll\nimport com.keylesspalace.tusky.entity.PreviewCard\nimport com.keylesspalace.tusky.entity.Status\n\n@Dao\nabstract class TimelineStatusDao(\n    private val db: AppDatabase\n) {\n\n    @Insert(onConflict = REPLACE)\n    abstract suspend fun insert(timelineStatusEntity: TimelineStatusEntity): Long\n\n    @Transaction\n    open suspend fun getStatusWithAccount(tuskyAccountId: Long, statusId: String): Pair<TimelineStatusEntity, TimelineAccountEntity>? {\n        val status = getStatus(tuskyAccountId, statusId) ?: return null\n        val account = db.timelineAccountDao().getAccount(tuskyAccountId, status.authorServerId) ?: return null\n        return status to account\n    }\n\n    @Query(\n        \"\"\"\nSELECT * FROM TimelineStatusEntity s\nWHERE s.serverId = :statusId\nAND s.authorServerId IS NOT NULL\nAND s.tuskyAccountId = :tuskyAccountId\"\"\"\n    )\n    abstract suspend fun getStatus(tuskyAccountId: Long, statusId: String): TimelineStatusEntity?\n\n    suspend fun update(tuskyAccountId: Long, status: Status) {\n        update(\n            tuskyAccountId = tuskyAccountId,\n            statusId = status.id,\n            content = status.content,\n            editedAt = status.editedAt?.time,\n            emojis = status.emojis,\n            reblogsCount = status.reblogsCount,\n            favouritesCount = status.favouritesCount,\n            repliesCount = status.repliesCount,\n            reblogged = status.reblogged,\n            bookmarked = status.bookmarked,\n            favourited = status.favourited,\n            sensitive = status.sensitive,\n            spoilerText = status.spoilerText,\n            visibility = status.visibility,\n            attachments = status.attachments,\n            mentions = status.mentions,\n            tags = status.tags,\n            poll = status.poll,\n            muted = status.muted,\n            pinned = status.pinned,\n            card = status.card,\n            language = status.language\n        )\n    }\n\n    @Query(\n        \"\"\"UPDATE TimelineStatusEntity\n           SET content = :content,\n           editedAt = :editedAt,\n           emojis = :emojis,\n           reblogsCount = :reblogsCount,\n           favouritesCount = :favouritesCount,\n           repliesCount = :repliesCount,\n           reblogged = :reblogged,\n           bookmarked = :bookmarked,\n           favourited = :favourited,\n           sensitive = :sensitive,\n           spoilerText = :spoilerText,\n           visibility = :visibility,\n           attachments = :attachments,\n           mentions = :mentions,\n           tags = :tags,\n           poll = :poll,\n           muted = :muted,\n           pinned = :pinned,\n           card = :card,\n           language = :language\n           WHERE tuskyAccountId = :tuskyAccountId AND serverId = :statusId\"\"\"\n    )\n    @TypeConverters(Converters::class)\n    abstract suspend fun update(\n        tuskyAccountId: Long,\n        statusId: String,\n        content: String?,\n        editedAt: Long?,\n        emojis: List<Emoji>?,\n        reblogsCount: Int,\n        favouritesCount: Int,\n        repliesCount: Int,\n        reblogged: Boolean,\n        bookmarked: Boolean,\n        favourited: Boolean,\n        sensitive: Boolean,\n        spoilerText: String,\n        visibility: Status.Visibility,\n        attachments: List<Attachment>?,\n        mentions: List<Status.Mention>?,\n        tags: List<HashTag>?,\n        poll: Poll?,\n        muted: Boolean?,\n        pinned: Boolean,\n        card: PreviewCard?,\n        language: String?\n    )\n\n    @Query(\n        \"\"\"UPDATE TimelineStatusEntity SET bookmarked = :bookmarked\nWHERE tuskyAccountId = :tuskyAccountId AND serverId = :statusId\"\"\"\n    )\n    abstract suspend fun setBookmarked(tuskyAccountId: Long, statusId: String, bookmarked: Boolean)\n\n    @Query(\n        \"\"\"UPDATE TimelineStatusEntity SET reblogged = :reblogged\nWHERE tuskyAccountId = :tuskyAccountId AND serverId = :statusId\"\"\"\n    )\n    abstract suspend fun setReblogged(tuskyAccountId: Long, statusId: String, reblogged: Boolean)\n\n    @Query(\"DELETE FROM TimelineStatusEntity WHERE tuskyAccountId = :tuskyAccountId\")\n    abstract suspend fun removeAllStatuses(tuskyAccountId: Long)\n\n    @Query(\n        \"\"\"DELETE FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId AND id = :id\"\"\"\n    )\n    abstract suspend fun deleteHomeTimelineItem(tuskyAccountId: Long, id: String)\n\n    /**\n     * Deletes all hometimeline items that reference the status with it [statusId]. They can be regular statuses or reblogs.\n     */\n    @Query(\n        \"\"\"DELETE FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId AND statusId = :statusId\"\"\"\n    )\n    abstract suspend fun deleteAllWithStatus(tuskyAccountId: Long, statusId: String)\n\n    /**\n     * Cleans the TimelineStatusEntity table from unreferenced status entries.\n     * @param tuskyAccountId id of the account for which to clean statuses\n     */\n    @Query(\n        \"\"\"DELETE FROM TimelineStatusEntity WHERE tuskyAccountId = :tuskyAccountId\n        AND serverId NOT IN\n        (SELECT statusId FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId AND statusId IS NOT NULL)\n        AND serverId NOT IN\n        (SELECT statusId FROM NotificationEntity WHERE tuskyAccountId = :tuskyAccountId AND statusId IS NOT NULL)\"\"\"\n    )\n    internal abstract suspend fun cleanupStatuses(tuskyAccountId: Long)\n\n    @Query(\n        \"\"\"UPDATE TimelineStatusEntity SET poll = :poll\nWHERE tuskyAccountId = :tuskyAccountId AND serverId = :statusId\"\"\"\n    )\n    @TypeConverters(Converters::class)\n    abstract suspend fun setVoted(tuskyAccountId: Long, statusId: String, poll: Poll)\n\n    @Transaction\n    open suspend fun setShowResults(tuskyAccountId: Long, statusId: String) {\n        getStatus(tuskyAccountId, statusId)?.let { status ->\n            status.poll?.let { poll ->\n                setVoted(tuskyAccountId, statusId, poll.copy(voted = true))\n            }\n        }\n    }\n\n    @Query(\n        \"\"\"UPDATE TimelineStatusEntity SET expanded = :expanded\nWHERE tuskyAccountId = :tuskyAccountId AND serverId = :statusId\"\"\"\n    )\n    abstract suspend fun setExpanded(tuskyAccountId: Long, statusId: String, expanded: Boolean)\n\n    @Query(\n        \"\"\"UPDATE TimelineStatusEntity SET contentShowing = :contentShowing\nWHERE tuskyAccountId = :tuskyAccountId AND serverId = :statusId\"\"\"\n    )\n    abstract suspend fun setContentShowing(\n        tuskyAccountId: Long,\n        statusId: String,\n        contentShowing: Boolean\n    )\n\n    @Query(\n        \"\"\"UPDATE TimelineStatusEntity SET contentCollapsed = :contentCollapsed\nWHERE tuskyAccountId = :tuskyAccountId AND serverId = :statusId\"\"\"\n    )\n    abstract suspend fun setContentCollapsed(\n        tuskyAccountId: Long,\n        statusId: String,\n        contentCollapsed: Boolean\n    )\n\n    @Query(\n        \"\"\"UPDATE TimelineStatusEntity SET pinned = :pinned\nWHERE tuskyAccountId = :tuskyAccountId AND serverId = :statusId\"\"\"\n    )\n    abstract suspend fun setPinned(tuskyAccountId: Long, statusId: String, pinned: Boolean)\n\n    @Query(\n        \"\"\"DELETE FROM HomeTimelineEntity\nWHERE tuskyAccountId = :tuskyAccountId AND statusId IN (\nSELECT serverId FROM TimelineStatusEntity WHERE tuskyAccountId = :tuskyAccountId AND authorServerId in\n( SELECT serverId FROM TimelineAccountEntity WHERE username LIKE '%@' || :instanceDomain\nAND tuskyAccountId = :tuskyAccountId\n))\"\"\"\n    )\n    abstract suspend fun deleteAllFromInstance(tuskyAccountId: Long, instanceDomain: String)\n\n    @Query(\n        \"UPDATE TimelineStatusEntity SET filtered = '[]' WHERE tuskyAccountId = :tuskyAccountId AND serverId = :statusId\"\n    )\n    abstract suspend fun clearWarning(tuskyAccountId: Long, statusId: String): Int\n\n    @Query(\n        \"SELECT id FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId ORDER BY LENGTH(id) DESC, id DESC LIMIT 1\"\n    )\n    abstract suspend fun getTopId(tuskyAccountId: Long): String?\n\n    @Query(\n        \"SELECT id FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId AND statusId IS NULL ORDER BY LENGTH(id) DESC, id DESC LIMIT 1\"\n    )\n    abstract suspend fun getTopPlaceholderId(tuskyAccountId: Long): String?\n\n    /**\n     * Returns the id directly above [id], or null if [id] is the id of the top item\n     */\n    @Query(\n        \"SELECT id FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId AND (LENGTH(:id) < LENGTH(id) OR (LENGTH(:id) = LENGTH(id) AND :id < id)) ORDER BY LENGTH(id) ASC, id ASC LIMIT 1\"\n    )\n    abstract suspend fun getIdAbove(tuskyAccountId: Long, id: String): String?\n\n    /**\n     * Returns the ID directly below [id], or null if [id] is the ID of the bottom item\n     */\n    @Query(\n        \"SELECT id FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId AND (LENGTH(:id) > LENGTH(id) OR (LENGTH(:id) = LENGTH(id) AND :id > id)) ORDER BY LENGTH(id) DESC, id DESC LIMIT 1\"\n    )\n    abstract suspend fun getIdBelow(tuskyAccountId: Long, id: String): String?\n\n    /**\n     * Returns the id of the next placeholder after [id], or null if there is no placeholder.\n     */\n    @Query(\n        \"SELECT id FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId AND statusId IS NULL AND (LENGTH(:id) > LENGTH(id) OR (LENGTH(:id) = LENGTH(id) AND :id > id)) ORDER BY LENGTH(id) DESC, id DESC LIMIT 1\"\n    )\n    abstract suspend fun getNextPlaceholderIdAfter(tuskyAccountId: Long, id: String): String?\n\n    @Query(\"SELECT COUNT(*) FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId\")\n    abstract suspend fun getHomeTimelineItemCount(tuskyAccountId: Long): Int\n\n    /** Developer tools: Find N most recent status IDs */\n    @Query(\n        \"SELECT id FROM HomeTimelineEntity WHERE tuskyAccountId = :tuskyAccountId ORDER BY LENGTH(id) DESC, id DESC LIMIT :count\"\n    )\n    abstract suspend fun getMostRecentNStatusIds(tuskyAccountId: Long, count: Int): List<String>\n\n    /** Developer tools: Convert a home timeline item to a placeholder */\n    @Query(\"UPDATE HomeTimelineEntity SET statusId = NULL, reblogAccountId = NULL WHERE id = :serverId\")\n    abstract suspend fun convertStatusToPlaceholder(serverId: String)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/entity/AccountEntity.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db.entity\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.Index\nimport androidx.room.PrimaryKey\nimport androidx.room.TypeConverters\nimport com.keylesspalace.tusky.TabData\nimport com.keylesspalace.tusky.components.systemnotifications.NotificationChannelData\nimport com.keylesspalace.tusky.db.Converters\nimport com.keylesspalace.tusky.defaultTabs\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.settings.DefaultReplyVisibility\n\n@Entity(\n    indices = [\n        Index(\n            value = [\"domain\", \"accountId\"],\n            unique = true\n        )\n    ]\n)\n@TypeConverters(Converters::class)\ndata class AccountEntity(\n    @field:PrimaryKey(autoGenerate = true) val id: Long,\n    val domain: String,\n    val accessToken: String,\n    // nullable for backward compatibility\n    val clientId: String?,\n    // nullable for backward compatibility\n    val clientSecret: String?,\n    val isActive: Boolean,\n    val accountId: String = \"\",\n    val username: String = \"\",\n    val displayName: String = \"\",\n    val profilePictureUrl: String = \"\",\n    @ColumnInfo(defaultValue = \"\") val profileHeaderUrl: String = \"\",\n    val notificationsEnabled: Boolean = true,\n    val notificationsMentioned: Boolean = true,\n    val notificationsFollowed: Boolean = true,\n    val notificationsFollowRequested: Boolean = true,\n    val notificationsReblogged: Boolean = true,\n    val notificationsFavorited: Boolean = true,\n    val notificationsPolls: Boolean = true,\n    val notificationsSubscriptions: Boolean = true,\n    val notificationsUpdates: Boolean = true,\n    @ColumnInfo(defaultValue = \"true\") val notificationsAdmin: Boolean = true,\n    @ColumnInfo(defaultValue = \"true\") val notificationsOther: Boolean = true,\n    val notificationSound: Boolean = true,\n    val notificationVibration: Boolean = true,\n    val notificationLight: Boolean = true,\n    val defaultPostPrivacy: Status.Visibility = Status.Visibility.PUBLIC,\n    val defaultReplyPrivacy: DefaultReplyVisibility = DefaultReplyVisibility.MATCH_DEFAULT_POST_VISIBILITY,\n    val defaultMediaSensitivity: Boolean = false,\n    val defaultPostLanguage: String = \"\",\n    val alwaysShowSensitiveMedia: Boolean = false,\n    /** True if content behind a content warning is shown by default */\n    @ColumnInfo(defaultValue = \"0\")\n    val alwaysOpenSpoiler: Boolean = false,\n\n    /**\n     * True if the \"Download media previews\" preference is true. This implies\n     * that media previews are shown as well as downloaded.\n     */\n    val mediaPreviewEnabled: Boolean = true,\n    /**\n     * ID of the last notification the user read on the Notification, list, and should be restored\n     * to view when the user returns to the list.\n     *\n     * May not be the ID of the most recent notification if the user has scrolled down the list.\n     */\n    val lastNotificationId: String = \"0\",\n    /**\n     *  ID of the most recent Mastodon notification that Tusky has fetched to show as an\n     *  Android notification.\n     */\n    @ColumnInfo(defaultValue = \"0\")\n    val notificationMarkerId: String = \"0\",\n    val emojis: List<Emoji> = emptyList(),\n    val tabPreferences: List<TabData> = defaultTabs(),\n    val notificationsFilter: Set<NotificationChannelData> = emptySet(),\n    // Scope cannot be changed without re-login, so store it in case\n    // the scope needs to be changed in the future\n    val oauthScopes: String = \"\",\n    val unifiedPushUrl: String = \"\",\n    val pushPubKey: String = \"\",\n    val pushPrivKey: String = \"\",\n    val pushAuth: String = \"\",\n    val pushServerKey: String = \"\",\n\n    /**\n     * ID of the status at the top of the visible list in the home timeline when the\n     * user navigated away.\n     */\n    val lastVisibleHomeTimelineStatusId: String? = null,\n\n    /** true if the connected Mastodon account is locked (has to manually approve all follow requests **/\n    @ColumnInfo(defaultValue = \"0\")\n    val locked: Boolean = false,\n\n    @ColumnInfo(defaultValue = \"0\")\n    val hasDirectMessageBadge: Boolean = false,\n\n    val isShowHomeBoosts: Boolean = true,\n    val isShowHomeReplies: Boolean = true,\n    val isShowHomeSelfBoosts: Boolean = true\n) {\n    val identifier: String\n        get() = \"$domain:$accountId\"\n\n    val fullName: String\n        get() = \"@$username@$domain\"\n\n    fun isPushNotificationsEnabled(): Boolean {\n        return unifiedPushUrl.isNotEmpty()\n    }\n\n    fun matchesPushSubscription(endpoint: String): Boolean {\n        return unifiedPushUrl == endpoint\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/entity/DraftEntity.kt",
    "content": "/* Copyright 2020 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db.entity\n\nimport android.net.Uri\nimport android.os.Parcelable\nimport androidx.core.net.toUri\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\nimport androidx.room.TypeConverters\nimport com.keylesspalace.tusky.db.Converters\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.entity.NewPoll\nimport com.keylesspalace.tusky.entity.Status\nimport com.squareup.moshi.JsonClass\nimport kotlinx.parcelize.Parcelize\n\n@Entity\n@TypeConverters(Converters::class)\ndata class DraftEntity(\n    @PrimaryKey(autoGenerate = true) val id: Int = 0,\n    val accountId: Long,\n    val inReplyToId: String?,\n    val content: String?,\n    val contentWarning: String?,\n    val sensitive: Boolean,\n    val visibility: Status.Visibility,\n    val attachments: List<DraftAttachment>,\n    val poll: NewPoll?,\n    val failedToSend: Boolean,\n    val failedToSendNew: Boolean,\n    val scheduledAt: String?,\n    val language: String?,\n    val statusId: String?\n)\n\n@JsonClass(generateAdapter = true)\n@Parcelize\ndata class DraftAttachment(\n    val uriString: String,\n    val description: String?,\n    val focus: Attachment.Focus?,\n    val type: Type\n) : Parcelable {\n    val uri: Uri\n        get() = uriString.toUri()\n\n    @JsonClass(generateAdapter = false)\n    enum class Type {\n        IMAGE,\n        VIDEO,\n        AUDIO\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/entity/HomeTimelineEntity.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db.entity\n\nimport androidx.room.Embedded\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport androidx.room.Index\n\n/**\n * Entity to store an item on the home timeline. Can be a standalone status, a reblog, or a placeholder.\n */\n@Entity(\n    primaryKeys = [\"id\", \"tuskyAccountId\"],\n    foreignKeys = (\n        [\n            ForeignKey(\n                entity = TimelineStatusEntity::class,\n                parentColumns = [\"serverId\", \"tuskyAccountId\"],\n                childColumns = [\"statusId\", \"tuskyAccountId\"]\n            ),\n            ForeignKey(\n                entity = TimelineAccountEntity::class,\n                parentColumns = [\"serverId\", \"tuskyAccountId\"],\n                childColumns = [\"reblogAccountId\", \"tuskyAccountId\"]\n            )\n        ]\n        ),\n    indices = [\n        Index(\"statusId\", \"tuskyAccountId\"),\n        Index(\"reblogAccountId\", \"tuskyAccountId\"),\n    ]\n)\ndata class HomeTimelineEntity(\n    val tuskyAccountId: Long,\n    // the id by which the timeline is sorted\n    val id: String,\n    // the id of the status, null when a placeholder\n    val statusId: String?,\n    // the id of the account who reblogged the status, null if no reblog\n    val reblogAccountId: String?,\n    // only relevant when this is a placeholder\n    val loading: Boolean = false\n)\n\n/**\n * Helper class for queries that return HomeTimelineEntity including all references\n */\ndata class HomeTimelineData(\n    val id: String,\n    @Embedded val status: TimelineStatusEntity?,\n    @Embedded(prefix = \"a_\") val account: TimelineAccountEntity?,\n    @Embedded(prefix = \"rb_\") val reblogAccount: TimelineAccountEntity?,\n    @Embedded(prefix = \"replied_\") val repliedToAccount: TimelineAccountEntity?,\n    val loading: Boolean\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/entity/InstanceEntity.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db.entity\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\nimport androidx.room.TypeConverters\nimport com.keylesspalace.tusky.db.Converters\nimport com.keylesspalace.tusky.entity.Emoji\n\n@Entity\n@TypeConverters(Converters::class)\ndata class InstanceEntity(\n    @PrimaryKey val instance: String,\n    val emojiList: List<Emoji>?,\n    val maximumTootCharacters: Int?,\n    val maxPollOptions: Int?,\n    val maxPollOptionLength: Int?,\n    val minPollDuration: Int?,\n    val maxPollDuration: Int?,\n    val charactersReservedPerUrl: Int?,\n    val version: String?,\n    val videoSizeLimit: Int?,\n    val imageSizeLimit: Int?,\n    val imageMatrixLimit: Int?,\n    val maxMediaAttachments: Int?,\n    val maxFields: Int?,\n    val maxFieldNameLength: Int?,\n    val maxFieldValueLength: Int?,\n    val translationEnabled: Boolean?,\n    val mastodonApiVersion: Int?,\n\n    // ToDo: Remove this again when filter v1 support is dropped\n    @ColumnInfo(defaultValue = \"false\") val filterV2Supported: Boolean = false\n)\n\n@TypeConverters(Converters::class)\ndata class EmojisEntity(\n    @PrimaryKey val instance: String,\n    val emojiList: List<Emoji>?\n)\n\ndata class InstanceInfoEntity(\n    @PrimaryKey val instance: String,\n    val maximumTootCharacters: Int?,\n    val maxPollOptions: Int?,\n    val maxPollOptionLength: Int?,\n    val minPollDuration: Int?,\n    val maxPollDuration: Int?,\n    val charactersReservedPerUrl: Int?,\n    val version: String?,\n    val videoSizeLimit: Int?,\n    val imageSizeLimit: Int?,\n    val imageMatrixLimit: Int?,\n    val maxMediaAttachments: Int?,\n    val maxFields: Int?,\n    val maxFieldNameLength: Int?,\n    val maxFieldValueLength: Int?,\n    val translationEnabled: Boolean?,\n    val mastodonApiVersion: Int?,\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/entity/NotificationEntity.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db.entity\n\nimport androidx.room.Embedded\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport androidx.room.Index\nimport androidx.room.TypeConverters\nimport com.keylesspalace.tusky.db.Converters\nimport com.keylesspalace.tusky.entity.AccountWarning\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.entity.RelationshipSeveranceEvent\nimport java.util.Date\n\n@TypeConverters(Converters::class)\ndata class NotificationDataEntity(\n    // id of the account logged into Tusky this notifications belongs to\n    val tuskyAccountId: Long,\n    // null when placeholder\n    val type: Notification.Type?,\n    val id: String,\n    @Embedded(prefix = \"a_\") val account: TimelineAccountEntity?,\n    @Embedded(prefix = \"s_\") val status: TimelineStatusEntity?,\n    @Embedded(prefix = \"sa_\") val statusAccount: TimelineAccountEntity?,\n    @Embedded(prefix = \"r_\") val report: NotificationReportEntity?,\n    @Embedded(prefix = \"ra_\") val reportTargetAccount: TimelineAccountEntity?,\n    val event: RelationshipSeveranceEvent?,\n    val moderationWarning: AccountWarning?,\n    // relevant when it is a placeholder\n    val loading: Boolean = false\n)\n\n@Entity(\n    primaryKeys = [\"id\", \"tuskyAccountId\"],\n    foreignKeys = (\n        [\n            ForeignKey(\n                entity = TimelineAccountEntity::class,\n                parentColumns = [\"serverId\", \"tuskyAccountId\"],\n                childColumns = [\"accountId\", \"tuskyAccountId\"]\n            ),\n            ForeignKey(\n                entity = TimelineStatusEntity::class,\n                parentColumns = [\"serverId\", \"tuskyAccountId\"],\n                childColumns = [\"statusId\", \"tuskyAccountId\"]\n            ),\n            ForeignKey(\n                entity = NotificationReportEntity::class,\n                parentColumns = [\"serverId\", \"tuskyAccountId\"],\n                childColumns = [\"reportId\", \"tuskyAccountId\"]\n            )\n        ]\n        ),\n    indices = [\n        Index(\"accountId\", \"tuskyAccountId\"),\n        Index(\"statusId\", \"tuskyAccountId\"),\n        Index(\"reportId\", \"tuskyAccountId\"),\n    ]\n)\n@TypeConverters(Converters::class)\ndata class NotificationEntity(\n    // id of the account logged into Tusky this notifications belongs to\n    val tuskyAccountId: Long,\n    // null when placeholder\n    val type: Notification.Type?,\n    val id: String,\n    val accountId: String?,\n    val statusId: String?,\n    val reportId: String?,\n    val event: RelationshipSeveranceEvent?,\n    val moderationWarning: AccountWarning?,\n    // relevant when it is a placeholder\n    val loading: Boolean = false\n)\n\n@Entity(\n    primaryKeys = [\"serverId\", \"tuskyAccountId\"],\n    foreignKeys = (\n        [\n            ForeignKey(\n                entity = TimelineAccountEntity::class,\n                parentColumns = [\"serverId\", \"tuskyAccountId\"],\n                childColumns = [\"targetAccountId\", \"tuskyAccountId\"]\n            )\n        ]\n        ),\n    indices = [\n        Index(\"targetAccountId\", \"tuskyAccountId\"),\n    ]\n)\n@TypeConverters(Converters::class)\ndata class NotificationReportEntity(\n    // id of the account logged into Tusky this report belongs to\n    val tuskyAccountId: Long,\n    val serverId: String,\n    val category: String,\n    val statusIds: List<String>?,\n    val createdAt: Date,\n    val targetAccountId: String?\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/entity/NotificationPolicyEntity.kt",
    "content": "package com.keylesspalace.tusky.db.entity\n\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\n\n@Entity\ndata class NotificationPolicyEntity(\n    @PrimaryKey val tuskyAccountId: Long,\n    val pendingRequestsCount: Int,\n    val pendingNotificationsCount: Int\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/entity/TimelineAccountEntity.kt",
    "content": "/* Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db.entity\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.TypeConverters\nimport com.keylesspalace.tusky.db.Converters\nimport com.keylesspalace.tusky.entity.Emoji\n\n@Entity(\n    primaryKeys = [\"serverId\", \"tuskyAccountId\"]\n)\n@TypeConverters(Converters::class)\ndata class TimelineAccountEntity(\n    val serverId: String,\n    val tuskyAccountId: Long,\n    val localUsername: String,\n    val username: String,\n    val displayName: String,\n    val url: String,\n    val avatar: String,\n    @ColumnInfo(defaultValue = \"\") val note: String,\n    val emojis: List<Emoji>,\n    val bot: Boolean\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/db/entity/TimelineStatusEntity.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.db.entity\n\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport androidx.room.Index\nimport androidx.room.TypeConverters\nimport com.keylesspalace.tusky.db.Converters\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.entity.FilterResult\nimport com.keylesspalace.tusky.entity.HashTag\nimport com.keylesspalace.tusky.entity.Poll\nimport com.keylesspalace.tusky.entity.PreviewCard\nimport com.keylesspalace.tusky.entity.Status\n\n/**\n * Entity for caching status data. Used within home timelines and notifications.\n * The information if a status is a reblog is not stored here but in [HomeTimelineEntity].\n */\n@Entity(\n    primaryKeys = [\"serverId\", \"tuskyAccountId\"],\n    foreignKeys = (\n        [\n            ForeignKey(\n                entity = TimelineAccountEntity::class,\n                parentColumns = [\"serverId\", \"tuskyAccountId\"],\n                childColumns = [\"authorServerId\", \"tuskyAccountId\"]\n            )\n        ]\n        ),\n    // Avoiding rescanning status table when accounts table changes. Recommended by Room(c).\n    indices = [Index(\"authorServerId\", \"tuskyAccountId\")]\n)\n@TypeConverters(Converters::class)\ndata class TimelineStatusEntity(\n    // id never flips: we need it for sorting so it's a real id\n    val serverId: String,\n    val url: String?,\n    // our local id for the logged in user in case there are multiple accounts per instance\n    val tuskyAccountId: Long,\n    val authorServerId: String,\n    val inReplyToId: String?,\n    val inReplyToAccountId: String?,\n    val content: String,\n    val createdAt: Long,\n    val editedAt: Long?,\n    val emojis: List<Emoji>,\n    val reblogsCount: Int,\n    val favouritesCount: Int,\n    val repliesCount: Int,\n    val reblogged: Boolean,\n    val bookmarked: Boolean,\n    val favourited: Boolean,\n    val sensitive: Boolean,\n    val spoilerText: String,\n    val visibility: Status.Visibility,\n    val attachments: List<Attachment>,\n    val mentions: List<Status.Mention>,\n    val tags: List<HashTag>,\n    val application: Status.Application?,\n    // if it has a reblogged status, it's id is stored here\n    val poll: Poll?,\n    val muted: Boolean,\n    /** Also used as the \"loading\" attribute when this TimelineStatusEntity is a placeholder */\n    val expanded: Boolean,\n    val contentCollapsed: Boolean,\n    val contentShowing: Boolean,\n    val pinned: Boolean,\n    val card: PreviewCard?,\n    val language: String?,\n    val filtered: List<FilterResult>\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/di/CoroutineScopeModule.kt",
    "content": "/*\n * Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.di\n\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport javax.inject.Qualifier\nimport javax.inject.Singleton\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.SupervisorJob\n\n/**\n * Scope for potentially long-running tasks that should outlive the viewmodel that\n * started them. For example, if the API call to bookmark a status is taking a long\n * time, that call should not be cancelled because the user has navigated away from\n * the viewmodel that made the call.\n *\n * @see https://developer.android.com/topic/architecture/data-layer#make_an_operation_live_longer_than_the_screen\n */\n@Retention(AnnotationRetention.BINARY)\n@Qualifier\nannotation class ApplicationScope\n\n@Module\n@InstallIn(SingletonComponent::class)\nobject CoroutineScopeModule {\n    @ApplicationScope\n    @Provides\n    @Singleton\n    fun providesApplicationScope() = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/di/NetworkModule.kt",
    "content": "/* Copyright 2018 charlag\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.di\n\nimport android.content.Context\nimport android.content.SharedPreferences\nimport android.os.Build\nimport android.util.Log\nimport at.connyduck.calladapter.networkresult.NetworkResultCallAdapterFactory\nimport com.keylesspalace.tusky.BuildConfig\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.json.GuardedAdapter\nimport com.keylesspalace.tusky.json.NotificationTypeAdapter\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.network.MediaUploadApi\nimport com.keylesspalace.tusky.network.apiForAccount\nimport com.keylesspalace.tusky.settings.PrefKeys.HTTP_PROXY_ENABLED\nimport com.keylesspalace.tusky.settings.PrefKeys.HTTP_PROXY_PORT\nimport com.keylesspalace.tusky.settings.PrefKeys.HTTP_PROXY_SERVER\nimport com.keylesspalace.tusky.settings.ProxyConfiguration\nimport com.keylesspalace.tusky.util.getNonNullString\nimport com.squareup.moshi.Moshi\nimport com.squareup.moshi.adapters.EnumJsonAdapter\nimport com.squareup.moshi.adapters.Rfc3339DateJsonAdapter\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport dagger.hilt.components.SingletonComponent\nimport java.net.IDN\nimport java.net.InetSocketAddress\nimport java.net.Proxy\nimport java.util.Date\nimport java.util.concurrent.TimeUnit\nimport javax.inject.Named\nimport javax.inject.Singleton\nimport okhttp3.Cache\nimport okhttp3.OkHttp\nimport okhttp3.OkHttpClient\nimport okhttp3.logging.HttpLoggingInterceptor\nimport retrofit2.Retrofit\nimport retrofit2.converter.moshi.MoshiConverterFactory\n\n/**\n * Created by charlag on 3/24/18.\n */\n\n@Module\n@InstallIn(SingletonComponent::class)\nobject NetworkModule {\n\n    private const val TAG = \"NetworkModule\"\n\n    @Provides\n    @Named(\"defaultPort\")\n    fun providesDefaultPort(): Int {\n        return 443\n    }\n\n    @Provides\n    @Named(\"defaultScheme\")\n    fun providesDefaultScheme(): String {\n        return \"https://\"\n    }\n\n    @Provides\n    @Singleton\n    fun providesMoshi(): Moshi = Moshi.Builder()\n        .add(GuardedAdapter.ANNOTATION_FACTORY)\n        .add(Date::class.java, Rfc3339DateJsonAdapter())\n        // Enum types with fallback value\n        .add(\n            Attachment.Type::class.java,\n            EnumJsonAdapter.create(Attachment.Type::class.java)\n                .withUnknownFallback(Attachment.Type.UNKNOWN)\n        )\n        .add(\n            Notification.Type::class.java,\n            NotificationTypeAdapter()\n        )\n        .add(\n            Status.Visibility::class.java,\n            EnumJsonAdapter.create(Status.Visibility::class.java)\n                .withUnknownFallback(Status.Visibility.UNKNOWN)\n        )\n        .build()\n\n    @Provides\n    @Singleton\n    fun providesHttpClient(\n        @ApplicationContext context: Context,\n        preferences: SharedPreferences\n    ): OkHttpClient {\n        val httpProxyEnabled = preferences.getBoolean(HTTP_PROXY_ENABLED, false)\n        val httpServer = preferences.getNonNullString(HTTP_PROXY_SERVER, \"\")\n        val httpPort = preferences.getNonNullString(HTTP_PROXY_PORT, \"-1\").toIntOrNull() ?: -1\n        val cacheSize = 25 * 1024 * 1024L // 25 MiB\n        val builder = OkHttpClient.Builder()\n            .addInterceptor { chain ->\n                /**\n                 * Add a custom User-Agent that contains Tusky, Android and OkHttp Version to all requests\n                 * Example:\n                 * User-Agent: Tusky/1.1.2 Android/5.0.2 OkHttp/4.9.0\n                 * */\n                val requestWithUserAgent = chain.request().newBuilder()\n                    .header(\n                        \"User-Agent\",\n                        \"Tusky/${BuildConfig.VERSION_NAME} Android/${Build.VERSION.RELEASE} OkHttp/${OkHttp.VERSION}\"\n                    )\n                    .build()\n                chain.proceed(requestWithUserAgent)\n            }\n            .readTimeout(30, TimeUnit.SECONDS)\n            .writeTimeout(30, TimeUnit.SECONDS)\n            .cache(Cache(context.cacheDir, cacheSize))\n\n        if (httpProxyEnabled) {\n            ProxyConfiguration.create(httpServer, httpPort)?.also { conf ->\n                val address = InetSocketAddress.createUnresolved(IDN.toASCII(conf.hostname), conf.port)\n                builder.proxy(Proxy(Proxy.Type.HTTP, address))\n            } ?: Log.w(TAG, \"Invalid proxy configuration: ($httpServer, $httpPort)\")\n        }\n        if (BuildConfig.DEBUG) {\n            builder.addInterceptor(\n                HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BASIC }\n            )\n        }\n        return builder.build()\n    }\n\n    @Provides\n    @Singleton\n    fun providesRetrofit(\n        httpClient: OkHttpClient,\n        moshi: Moshi\n    ): Retrofit {\n        return Retrofit.Builder()\n            .baseUrl(\"https://${MastodonApi.PLACEHOLDER_DOMAIN}\")\n            .client(httpClient)\n            .addConverterFactory(MoshiConverterFactory.create(moshi).withStreaming())\n            .addCallAdapterFactory(NetworkResultCallAdapterFactory.create())\n            .build()\n    }\n\n    @Provides\n    fun providesMastodonApi(\n        httpClient: OkHttpClient,\n        retrofit: Retrofit,\n        accountManager: AccountManager\n    ): MastodonApi {\n        return apiForAccount(accountManager.activeAccount, httpClient, retrofit)\n    }\n\n    @Provides\n    fun providesMediaUploadApi(\n        retrofit: Retrofit,\n        okHttpClient: OkHttpClient,\n        accountManager: AccountManager\n    ): MediaUploadApi {\n        val longTimeOutOkHttpClient = okHttpClient.newBuilder()\n            .readTimeout(100, TimeUnit.SECONDS)\n            .writeTimeout(100, TimeUnit.SECONDS)\n            .build()\n\n        return apiForAccount(accountManager.activeAccount, longTimeOutOkHttpClient, retrofit)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/di/NotificationManagerModule.kt",
    "content": "/* Copyright 2025 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.di\n\nimport android.app.NotificationManager\nimport android.content.Context\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport dagger.hilt.components.SingletonComponent\n\n@Module\n@InstallIn(SingletonComponent::class)\nobject NotificationManagerModule {\n    @Provides\n    fun providesNotificationManager(@ApplicationContext appContext: Context): NotificationManager {\n        return appContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/di/PlayerModule.kt",
    "content": "/*\n * Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.di\n\nimport android.content.Context\nimport android.os.Looper\nimport androidx.annotation.OptIn\nimport androidx.media3.common.C\nimport androidx.media3.common.Format\nimport androidx.media3.common.MimeTypes\nimport androidx.media3.common.util.UnstableApi\nimport androidx.media3.datasource.DataSource\nimport androidx.media3.datasource.DefaultDataSource\nimport androidx.media3.datasource.okhttp.OkHttpDataSource\nimport androidx.media3.exoplayer.DefaultRenderersFactory\nimport androidx.media3.exoplayer.ExoPlayer\nimport androidx.media3.exoplayer.RenderersFactory\nimport androidx.media3.exoplayer.audio.AudioSink\nimport androidx.media3.exoplayer.audio.DefaultAudioSink\nimport androidx.media3.exoplayer.audio.MediaCodecAudioRenderer\nimport androidx.media3.exoplayer.mediacodec.MediaCodecSelector\nimport androidx.media3.exoplayer.metadata.MetadataRenderer\nimport androidx.media3.exoplayer.source.MediaSource\nimport androidx.media3.exoplayer.source.ProgressiveMediaSource\nimport androidx.media3.exoplayer.text.TextRenderer\nimport androidx.media3.exoplayer.video.MediaCodecVideoRenderer\nimport androidx.media3.extractor.ExtractorsFactory\nimport androidx.media3.extractor.flac.FlacExtractor\nimport androidx.media3.extractor.mkv.MatroskaExtractor\nimport androidx.media3.extractor.mp3.Mp3Extractor\nimport androidx.media3.extractor.mp4.FragmentedMp4Extractor\nimport androidx.media3.extractor.mp4.Mp4Extractor\nimport androidx.media3.extractor.ogg.OggExtractor\nimport androidx.media3.extractor.text.SubtitleParser\nimport androidx.media3.extractor.text.ttml.TtmlParser\nimport androidx.media3.extractor.text.webvtt.Mp4WebvttParser\nimport androidx.media3.extractor.text.webvtt.WebvttParser\nimport androidx.media3.extractor.wav.WavExtractor\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport dagger.hilt.components.SingletonComponent\nimport okhttp3.OkHttpClient\n\n@Module\n@InstallIn(SingletonComponent::class)\n@OptIn(UnstableApi::class)\nobject PlayerModule {\n    @Provides\n    fun provideAudioSink(@ApplicationContext context: Context): AudioSink {\n        return DefaultAudioSink.Builder(context)\n            .build()\n    }\n\n    @Provides\n    fun provideRenderersFactory(\n        @ApplicationContext context: Context,\n        audioSink: AudioSink\n    ): RenderersFactory {\n        return RenderersFactory { eventHandler,\n                                  videoRendererEventListener,\n                                  audioRendererEventListener,\n                                  textRendererOutput,\n                                  metadataRendererOutput ->\n            arrayOf(\n                MediaCodecVideoRenderer.Builder(context)\n                    .setMediaCodecSelector(MediaCodecSelector.DEFAULT)\n                    .setAllowedJoiningTimeMs(DefaultRenderersFactory.DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS)\n                    .setEnableDecoderFallback(true)\n                    .setEventHandler(eventHandler)\n                    .setEventListener(videoRendererEventListener)\n                    .setMaxDroppedFramesToNotify(DefaultRenderersFactory.MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY)\n                    .build(),\n                MediaCodecAudioRenderer(\n                    context,\n                    MediaCodecSelector.DEFAULT,\n                    // enableDecoderFallback = true\n                    true,\n                    eventHandler,\n                    audioRendererEventListener,\n                    audioSink\n                ),\n                TextRenderer(\n                    textRendererOutput,\n                    eventHandler.looper\n                ),\n                MetadataRenderer(\n                    metadataRendererOutput,\n                    eventHandler.looper\n                )\n            )\n        }\n    }\n\n    @Provides\n    fun providesSubtitleParserFactory(): SubtitleParser.Factory {\n        return object : SubtitleParser.Factory {\n            override fun supportsFormat(format: Format): Boolean {\n                return when (format.sampleMimeType) {\n                    MimeTypes.TEXT_VTT,\n                    MimeTypes.APPLICATION_MP4VTT,\n                    MimeTypes.APPLICATION_TTML -> true\n\n                    else -> false\n                }\n            }\n\n            override fun getCueReplacementBehavior(format: Format): Int {\n                return when (val mimeType = format.sampleMimeType) {\n                    MimeTypes.TEXT_VTT -> WebvttParser.CUE_REPLACEMENT_BEHAVIOR\n                    MimeTypes.APPLICATION_MP4VTT -> Mp4WebvttParser.CUE_REPLACEMENT_BEHAVIOR\n                    MimeTypes.APPLICATION_TTML -> TtmlParser.CUE_REPLACEMENT_BEHAVIOR\n                    else -> throw IllegalArgumentException(\"Unsupported MIME type: $mimeType\")\n                }\n            }\n\n            override fun create(format: Format): SubtitleParser {\n                return when (val mimeType = format.sampleMimeType) {\n                    MimeTypes.TEXT_VTT -> WebvttParser()\n                    MimeTypes.APPLICATION_MP4VTT -> Mp4WebvttParser()\n                    MimeTypes.APPLICATION_TTML -> TtmlParser()\n                    else -> throw IllegalArgumentException(\"Unsupported MIME type: $mimeType\")\n                }\n            }\n        }\n    }\n\n    @Provides\n    fun provideExtractorsFactory(subtitleParserFactory: SubtitleParser.Factory): ExtractorsFactory {\n        // Extractors order is optimized according to\n        // https://docs.google.com/document/d/1w2mKaWMxfz2Ei8-LdxqbPs1VLe_oudB-eryXXw9OvQQ\n        return ExtractorsFactory {\n            arrayOf(\n                FlacExtractor(),\n                WavExtractor(),\n                Mp4Extractor(subtitleParserFactory),\n                FragmentedMp4Extractor(subtitleParserFactory),\n                OggExtractor(),\n                MatroskaExtractor(subtitleParserFactory),\n                Mp3Extractor()\n            )\n        }\n    }\n\n    @Provides\n    fun provideDataSourceFactory(\n        @ApplicationContext context: Context,\n        okHttpClient: OkHttpClient\n    ): DataSource.Factory {\n        return DefaultDataSource.Factory(context, OkHttpDataSource.Factory(okHttpClient))\n    }\n\n    @Provides\n    fun provideMediaSourceFactory(\n        dataSourceFactory: DataSource.Factory,\n        extractorsFactory: ExtractorsFactory\n    ): MediaSource.Factory {\n        // Only progressive download is supported for Mastodon attachments\n        return ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory)\n    }\n\n    @Provides\n    fun provideExoPlayer(\n        @ApplicationContext context: Context,\n        renderersFactory: RenderersFactory,\n        mediaSourceFactory: MediaSource.Factory\n    ): ExoPlayer {\n        return ExoPlayer.Builder(context, renderersFactory, mediaSourceFactory)\n            .setLooper(Looper.getMainLooper())\n            .setHandleAudioBecomingNoisy(true) // automatically pause when unplugging headphones\n            .setWakeMode(C.WAKE_MODE_NONE) // playback is always in the foreground\n            .build()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/di/PreferencesEntryPoint.kt",
    "content": "package com.keylesspalace.tusky.di\n\nimport android.content.SharedPreferences\nimport dagger.hilt.EntryPoint\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\n\n@EntryPoint\n@InstallIn(SingletonComponent::class)\ninterface PreferencesEntryPoint {\n    fun preferences(): SharedPreferences\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/di/StorageModule.kt",
    "content": "/* Copyright 2018 charlag\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.di\n\nimport android.content.Context\nimport android.content.SharedPreferences\nimport androidx.preference.PreferenceManager\nimport androidx.room.Room\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.Converters\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport dagger.hilt.components.SingletonComponent\nimport javax.inject.Singleton\n\n/**\n * Created by charlag on 3/21/18.\n */\n\n@Module\n@InstallIn(SingletonComponent::class)\nobject StorageModule {\n\n    @Provides\n    fun providesSharedPreferences(@ApplicationContext appContext: Context): SharedPreferences {\n        return PreferenceManager.getDefaultSharedPreferences(appContext)\n    }\n\n    @Provides\n    @Singleton\n    fun providesDatabase(@ApplicationContext appContext: Context, converters: Converters): AppDatabase {\n        return Room.databaseBuilder(appContext, AppDatabase::class.java, \"tuskyDB\")\n            .addTypeConverter(converters)\n            .addMigrations(\n                AppDatabase.MIGRATION_2_3, AppDatabase.MIGRATION_3_4, AppDatabase.MIGRATION_4_5,\n                AppDatabase.MIGRATION_5_6, AppDatabase.MIGRATION_6_7, AppDatabase.MIGRATION_7_8,\n                AppDatabase.MIGRATION_8_9, AppDatabase.MIGRATION_9_10, AppDatabase.MIGRATION_10_11,\n                AppDatabase.MIGRATION_11_12, AppDatabase.MIGRATION_12_13, AppDatabase.MIGRATION_10_13,\n                AppDatabase.MIGRATION_13_14, AppDatabase.MIGRATION_14_15, AppDatabase.MIGRATION_15_16,\n                AppDatabase.MIGRATION_16_17, AppDatabase.MIGRATION_17_18, AppDatabase.MIGRATION_18_19,\n                AppDatabase.MIGRATION_19_20, AppDatabase.MIGRATION_20_21, AppDatabase.MIGRATION_21_22,\n                AppDatabase.MIGRATION_22_23, AppDatabase.MIGRATION_23_24, AppDatabase.MIGRATION_24_25,\n                AppDatabase.Migration25_26(appContext.getExternalFilesDir(\"Tusky\")),\n                AppDatabase.MIGRATION_26_27, AppDatabase.MIGRATION_27_28, AppDatabase.MIGRATION_28_29,\n                AppDatabase.MIGRATION_29_30, AppDatabase.MIGRATION_30_31, AppDatabase.MIGRATION_31_32,\n                AppDatabase.MIGRATION_32_33, AppDatabase.MIGRATION_33_34, AppDatabase.MIGRATION_34_35,\n                AppDatabase.MIGRATION_35_36, AppDatabase.MIGRATION_36_37, AppDatabase.MIGRATION_37_38,\n                AppDatabase.MIGRATION_38_39, AppDatabase.MIGRATION_39_40, AppDatabase.MIGRATION_40_41,\n                AppDatabase.MIGRATION_41_42, AppDatabase.MIGRATION_42_43, AppDatabase.MIGRATION_43_44,\n                AppDatabase.MIGRATION_44_45, AppDatabase.MIGRATION_45_46, AppDatabase.MIGRATION_46_47,\n                AppDatabase.MIGRATION_47_48, AppDatabase.MIGRATION_52_53, AppDatabase.MIGRATION_54_56,\n                AppDatabase.MIGRATION_58_60, AppDatabase.MIGRATION_60_62\n            )\n            .build()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/AccessToken.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class AccessToken(\n    @Json(name = \"access_token\") val accessToken: String\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/Account.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\nimport java.util.Date\n\n@JsonClass(generateAdapter = true)\ndata class Account(\n    val id: String,\n    @Json(name = \"username\") val localUsername: String,\n    @Json(name = \"acct\") val username: String,\n    // should never be null per Api definition, but some servers break the contract\n    @Json(name = \"display_name\") val displayName: String? = null,\n    @Json(name = \"created_at\") val createdAt: Date,\n    val note: String,\n    val url: String,\n    val avatar: String,\n    val header: String,\n    val locked: Boolean = false,\n    @Json(name = \"followers_count\") val followersCount: Int = 0,\n    @Json(name = \"following_count\") val followingCount: Int = 0,\n    @Json(name = \"statuses_count\") val statusesCount: Int = 0,\n    val source: AccountSource? = null,\n    val bot: Boolean = false,\n    // default value for backward compatibility\n    val emojis: List<Emoji> = emptyList(),\n    // default value for backward compatibility\n    val fields: List<Field> = emptyList(),\n    val moved: Account? = null,\n    val roles: List<Role> = emptyList()\n) {\n\n    val name: String\n        get() = if (displayName.isNullOrEmpty()) {\n            localUsername\n        } else {\n            displayName\n        }\n\n    val isRemote: Boolean\n        get() = this.username != this.localUsername\n}\n\n@JsonClass(generateAdapter = true)\ndata class AccountSource(\n    val privacy: Status.Visibility = Status.Visibility.PUBLIC,\n    val sensitive: Boolean? = null,\n    val note: String? = null,\n    val fields: List<StringField> = emptyList(),\n    val language: String? = null\n)\n\n@JsonClass(generateAdapter = true)\ndata class Field(\n    val name: String,\n    val value: String,\n    @Json(name = \"verified_at\") val verifiedAt: Date? = null\n)\n\n@JsonClass(generateAdapter = true)\ndata class StringField(\n    val name: String,\n    val value: String\n)\n\n@JsonClass(generateAdapter = true)\ndata class Role(\n    val name: String,\n    val color: String\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/AccountWarning.kt",
    "content": "/* Copyright 2025 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport androidx.annotation.StringRes\nimport com.keylesspalace.tusky.R\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class AccountWarning(\n    val id: String,\n    val action: Action\n) {\n\n    @JsonClass(generateAdapter = false)\n    enum class Action(@StringRes val text: Int) {\n        @Json(name = \"none\")\n        NONE(R.string.moderation_warning_action_none),\n\n        @Json(name = \"disable\")\n        DISABLE(R.string.moderation_warning_action_disable),\n\n        @Json(name = \"mark_statuses_as_sensitive\")\n        MARK_STATUSES_AS_SENSITIVE(R.string.moderation_warning_action_mark_statuses_as_sensitive),\n\n        @Json(name = \"delete_statuses\")\n        DELETE_STATUSES(R.string.moderation_warning_action_delete_statuses),\n\n        @Json(name = \"sensitive\")\n        SENSITIVE(R.string.moderation_warning_action_sensitive),\n\n        @Json(name = \"silence\")\n        SILENCE(R.string.moderation_warning_action_silence),\n\n        @Json(name = \"suspend\")\n        SUSPEND(R.string.moderation_warning_action_suspend),\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/Announcement.kt",
    "content": "/* Copyright 2020 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\nimport java.util.Date\n\n@JsonClass(generateAdapter = true)\ndata class Announcement(\n    val id: String,\n    val content: String,\n    @Json(name = \"starts_at\") val startsAt: Date? = null,\n    @Json(name = \"ends_at\") val endsAt: Date? = null,\n    @Json(name = \"all_day\") val allDay: Boolean,\n    @Json(name = \"published_at\") val publishedAt: Date,\n    @Json(name = \"updated_at\") val updatedAt: Date,\n    val read: Boolean = false,\n    val mentions: List<Status.Mention>,\n    val tags: List<HashTag>,\n    val emojis: List<Emoji>,\n    val reactions: List<Reaction>\n) {\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (other !is Announcement) return false\n\n        return id == other.id\n    }\n\n    override fun hashCode(): Int {\n        return id.hashCode()\n    }\n\n    @JsonClass(generateAdapter = true)\n    data class Reaction(\n        val name: String,\n        val count: Int,\n        val me: Boolean = false,\n        val url: String? = null,\n        @Json(name = \"static_url\") val staticUrl: String? = null\n    )\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/AppCredentials.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class AppCredentials(\n    @Json(name = \"client_id\") val clientId: String,\n    @Json(name = \"client_secret\") val clientSecret: String\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/Attachment.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport android.os.Parcelable\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\nimport kotlinx.parcelize.Parcelize\n\n@JsonClass(generateAdapter = true)\n@Parcelize\ndata class Attachment(\n    val id: String,\n    val url: String,\n    // can be null for e.g. audio attachments\n    @Json(name = \"preview_url\") val previewUrl: String? = null,\n    // null when local attachment\n    @Json(name = \"remote_url\") val remoteUrl: String? = null,\n    val meta: MetaData? = null,\n    val type: Type,\n    val description: String? = null,\n    val blurhash: String? = null\n) : Parcelable {\n\n    /** The url to open for attachments of unknown type */\n    val unknownUrl: String\n        get() = remoteUrl ?: url\n\n    @JsonClass(generateAdapter = false)\n    enum class Type {\n        @Json(name = \"image\")\n        IMAGE,\n\n        @Json(name = \"gifv\")\n        GIFV,\n\n        @Json(name = \"video\")\n        VIDEO,\n\n        @Json(name = \"audio\")\n        AUDIO,\n\n        UNKNOWN\n    }\n\n    /**\n     * The meta data of an [Attachment].\n     */\n    @JsonClass(generateAdapter = true)\n    @Parcelize\n    data class MetaData(\n        val focus: Focus? = null,\n        val duration: Float? = null,\n        val original: Size? = null,\n        val small: Size? = null\n    ) : Parcelable\n\n    /**\n     * The Focus entity, used to specify the focal point of an image.\n     *\n     * See here for more details what the x and y mean:\n     *   https://github.com/jonom/jquery-focuspoint#1-calculate-your-images-focus-point\n     */\n    @JsonClass(generateAdapter = true)\n    @Parcelize\n    data class Focus(\n        val x: Float?,\n        val y: Float?\n    ) : Parcelable {\n        fun toMastodonApiString(): String = \"$x,$y\"\n    }\n\n    /**\n     * The size of an image, used to specify the width/height.\n     */\n    @JsonClass(generateAdapter = true)\n    @Parcelize\n    data class Size(\n        val width: Int = 0,\n        val height: Int = 0,\n        val aspect: Double = 0.0\n    ) : Parcelable\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/Conversation.kt",
    "content": "/* Copyright 2019 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class Conversation(\n    val id: String,\n    val accounts: List<TimelineAccount>,\n    // should never be null, but apparently it's possible https://github.com/tuskyapp/Tusky/issues/1038\n    @Json(name = \"last_status\") val lastStatus: Status? = null,\n    val unread: Boolean\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/DeletedStatus.kt",
    "content": "/* Copyright 2019 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\nimport java.util.Date\n\n@JsonClass(generateAdapter = true)\ndata class DeletedStatus(\n    val text: String?,\n    @Json(name = \"in_reply_to_id\") val inReplyToId: String? = null,\n    @Json(name = \"spoiler_text\") val spoilerText: String,\n    val visibility: Status.Visibility,\n    val sensitive: Boolean,\n    @Json(name = \"media_attachments\") val attachments: List<Attachment>,\n    val poll: Poll? = null,\n    @Json(name = \"created_at\") val createdAt: Date,\n    val language: String? = null\n) {\n    val isEmpty: Boolean\n        get() = text == null && attachments.isEmpty()\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/Emoji.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport android.os.Parcelable\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\nimport kotlinx.parcelize.Parcelize\n\n@JsonClass(generateAdapter = true)\n@Parcelize\ndata class Emoji(\n    val shortcode: String,\n    val url: String,\n    @Json(name = \"static_url\") val staticUrl: String,\n    @Json(name = \"visible_in_picker\") val visibleInPicker: Boolean = true,\n    val category: String?\n) : Parcelable\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/Error.kt",
    "content": "/*\n * Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n/** @see [Error](https://docs.joinmastodon.org/entities/Error/) */\n@JsonClass(generateAdapter = true)\ndata class Error(\n    val error: String,\n    @Json(name = \"error_description\") val errorDescription: String? = null\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/Filter.kt",
    "content": "package com.keylesspalace.tusky.entity\n\nimport android.os.Parcelable\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\nimport java.util.Date\nimport kotlinx.parcelize.Parcelize\n\n@JsonClass(generateAdapter = true)\n@Parcelize\ndata class Filter(\n    val id: String = \"\",\n    val title: String = \"\",\n    val context: List<Kind>,\n    @Json(name = \"expires_at\") val expiresAt: Date? = null,\n    @Json(name = \"filter_action\") val action: Action,\n    // This field is mandatory according to the API documentation but is in fact optional in some instances\n    val keywords: List<FilterKeyword> = emptyList(),\n    // val statuses: List<FilterStatus>,\n) : Parcelable {\n\n    @JsonClass(generateAdapter = false)\n    enum class Action(val action: String) {\n        @Json(name = \"none\")\n        NONE(\"none\"),\n\n        @Json(name = \"blur\")\n        BLUR(\"blur\"),\n\n        @Json(name = \"warn\")\n        WARN(\"warn\"),\n\n        @Json(name = \"hide\")\n        HIDE(\"hide\");\n\n        // Retrofit will call toString when sending this class as part of a form-urlencoded body.\n        override fun toString() = action\n\n        companion object {\n            fun from(action: String): Action = entries.firstOrNull { it.action == action } ?: WARN\n        }\n    }\n\n    @JsonClass(generateAdapter = false)\n    enum class Kind(val kind: String) {\n        @Json(name = \"home\")\n        HOME(\"home\"),\n\n        @Json(name = \"notifications\")\n        NOTIFICATIONS(\"notifications\"),\n\n        @Json(name = \"public\")\n        PUBLIC(\"public\"),\n\n        @Json(name = \"thread\")\n        THREAD(\"thread\"),\n\n        @Json(name = \"account\")\n        ACCOUNT(\"account\");\n\n        // Retrofit will call toString when sending this class as part of a form-urlencoded body.\n        override fun toString() = kind\n\n        companion object {\n            fun from(kind: String): Kind = entries.firstOrNull { it.kind == kind } ?: PUBLIC\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/FilterKeyword.kt",
    "content": "package com.keylesspalace.tusky.entity\n\nimport android.os.Parcelable\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\nimport kotlinx.parcelize.Parcelize\n\n@JsonClass(generateAdapter = true)\n@Parcelize\ndata class FilterKeyword(\n    val id: String,\n    val keyword: String,\n    @Json(name = \"whole_word\") val wholeWord: Boolean\n) : Parcelable\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/FilterResult.kt",
    "content": "package com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class FilterResult(\n    val filter: Filter,\n//    @Json(name = \"keyword_matches\") val keywordMatches: List<String>? = null,\n//    @Json(name = \"status_matches\") val statusMatches: List<String>? = null\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/FilterV1.kt",
    "content": "/* Copyright 2018 Levi Bard\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\nimport java.util.Date\n\n@JsonClass(generateAdapter = true)\ndata class FilterV1(\n    val id: String,\n    val phrase: String,\n    val context: List<String>,\n    @Json(name = \"expires_at\") val expiresAt: Date? = null,\n    val irreversible: Boolean,\n    @Json(name = \"whole_word\") val wholeWord: Boolean\n) {\n\n    override fun hashCode(): Int {\n        return id.hashCode()\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (other !is FilterV1) {\n            return false\n        }\n        return other.id == id\n    }\n\n    fun toFilter() = Filter(\n        id = id,\n        title = phrase,\n        context = context.map(Filter.Kind::from),\n        expiresAt = expiresAt,\n        action = Filter.Action.WARN,\n        keywords = listOf(\n            FilterKeyword(\n                id = id,\n                keyword = phrase,\n                wholeWord = wholeWord\n            )\n        )\n    )\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/HashTag.kt",
    "content": "package com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class HashTag(\n    val name: String,\n    val url: String,\n    val following: Boolean? = null\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/Instance.kt",
    "content": "package com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class Instance(\n    val domain: String,\n//    val title: String,\n    val version: String,\n//    @Json(name = \"source_url\") val sourceUrl: String,\n//    val description: String,\n//    val usage: Usage,\n//    val thumbnail: Thumbnail,\n//    val languages: List<String>,\n    val configuration: Configuration? = null,\n//    val registrations: Registrations,\n//    val contact: Contact,\n    val rules: List<Rule> = emptyList(),\n    val pleroma: PleromaConfiguration? = null,\n    @Json(name = \"api_versions\") val apiVersions: ApiVersions? = null,\n) {\n    @JsonClass(generateAdapter = true)\n    data class Usage(val users: Users) {\n        @JsonClass(generateAdapter = true)\n        data class Users(@Json(name = \"active_month\") val activeMonth: Int)\n    }\n\n    @JsonClass(generateAdapter = true)\n    data class Thumbnail(\n        val url: String,\n        val blurhash: String? = null,\n        val versions: Versions? = null\n    ) {\n        @JsonClass(generateAdapter = true)\n        data class Versions(\n            @Json(name = \"@1x\") val at1x: String? = null,\n            @Json(name = \"@2x\") val at2x: String? = null\n        )\n    }\n\n    @JsonClass(generateAdapter = true)\n    data class Configuration(\n        val urls: Urls? = null,\n        val accounts: Accounts? = null,\n        val statuses: Statuses? = null,\n        @Json(name = \"media_attachments\") val mediaAttachments: MediaAttachments? = null,\n        val polls: Polls? = null,\n        val translation: Translation? = null,\n    ) {\n        @JsonClass(generateAdapter = true)\n        data class Urls(@Json(name = \"streaming_api\") val streamingApi: String? = null)\n\n        @JsonClass(generateAdapter = true)\n        data class Accounts(\n            @Json(name = \"max_featured_tags\") val maxFeaturedTags: Int,\n            // GoToSocial feature\n            @Json(name = \"max_profile_fields\") val maxProfileFields: Int?\n        )\n\n        @JsonClass(generateAdapter = true)\n        data class Statuses(\n            @Json(name = \"max_characters\") val maxCharacters: Int? = null,\n            @Json(name = \"max_media_attachments\") val maxMediaAttachments: Int? = null,\n            @Json(name = \"characters_reserved_per_url\") val charactersReservedPerUrl: Int? = null\n        )\n\n        @JsonClass(generateAdapter = true)\n        data class MediaAttachments(\n            // Warning: This is an array in mastodon and a dictionary in friendica\n            // @Json(name = \"supported_mime_types\") val supportedMimeTypes: List<String> = emptyList(),\n            @Json(name = \"image_size_limit\") val imageSizeLimitBytes: Long? = null,\n            @Json(name = \"image_matrix_limit\") val imagePixelCountLimit: Long? = null,\n            @Json(name = \"video_size_limit\") val videoSizeLimitBytes: Long? = null,\n            @Json(name = \"video_matrix_limit\") val videoPixelCountLimit: Long? = null,\n            @Json(name = \"video_frame_rate_limit\") val videoFrameRateLimit: Int? = null\n        )\n\n        @JsonClass(generateAdapter = true)\n        data class Polls(\n            @Json(name = \"max_options\") val maxOptions: Int? = null,\n            @Json(name = \"max_characters_per_option\") val maxCharactersPerOption: Int? = null,\n            @Json(name = \"min_expiration\") val minExpirationSeconds: Int? = null,\n            @Json(name = \"max_expiration\") val maxExpirationSeconds: Int? = null\n        )\n\n        @JsonClass(generateAdapter = true)\n        data class Translation(val enabled: Boolean)\n    }\n\n    @JsonClass(generateAdapter = true)\n    data class Registrations(\n        val enabled: Boolean,\n        @Json(name = \"approval_required\") val approvalRequired: Boolean,\n        val message: String? = null\n    )\n\n    @JsonClass(generateAdapter = true)\n    data class Contact(val email: String, val account: Account)\n\n    @JsonClass(generateAdapter = true)\n    data class Rule(val id: String, val text: String)\n\n    @JsonClass(generateAdapter = true)\n    data class ApiVersions(val mastodon: Int? = null)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/InstanceV1.kt",
    "content": "/* Copyright 2018 Levi Bard\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class InstanceV1(\n    val uri: String,\n    // val title: String,\n    // val description: String,\n    // val email: String,\n    val version: String,\n    // val urls: Map<String, String>,\n    // val stats: Map<String, Int>?,\n    // val thumbnail: String?,\n    // val languages: List<String>,\n    // @Json(name = \"contact_account\") val contactAccount: Account?,\n    @Json(name = \"max_toot_chars\") val maxTootChars: Int? = null,\n    @Json(name = \"poll_limits\") val pollConfiguration: PollConfiguration? = null,\n    val configuration: InstanceConfiguration? = null,\n    @Json(name = \"max_media_attachments\") val maxMediaAttachments: Int? = null,\n    val pleroma: PleromaConfiguration? = null,\n    @Json(name = \"upload_limit\") val uploadLimit: Int? = null,\n    val rules: List<InstanceRules> = emptyList()\n) {\n    override fun hashCode(): Int {\n        return uri.hashCode()\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (other !is InstanceV1) {\n            return false\n        }\n        return other.uri == uri\n    }\n}\n\n@JsonClass(generateAdapter = true)\ndata class PollConfiguration(\n    @Json(name = \"max_options\") val maxOptions: Int? = null,\n    @Json(name = \"max_option_chars\") val maxOptionChars: Int? = null,\n    @Json(name = \"max_characters_per_option\") val maxCharactersPerOption: Int? = null,\n    @Json(name = \"min_expiration\") val minExpiration: Int? = null,\n    @Json(name = \"max_expiration\") val maxExpiration: Int? = null\n)\n\n@JsonClass(generateAdapter = true)\ndata class InstanceConfiguration(\n    val statuses: StatusConfiguration? = null,\n    @Json(name = \"media_attachments\") val mediaAttachments: MediaAttachmentConfiguration? = null,\n    val polls: PollConfiguration? = null\n)\n\n@JsonClass(generateAdapter = true)\ndata class StatusConfiguration(\n    @Json(name = \"max_characters\") val maxCharacters: Int? = null,\n    @Json(name = \"max_media_attachments\") val maxMediaAttachments: Int? = null,\n    @Json(name = \"characters_reserved_per_url\") val charactersReservedPerUrl: Int? = null\n)\n\n@JsonClass(generateAdapter = true)\ndata class MediaAttachmentConfiguration(\n    @Json(name = \"supported_mime_types\") val supportedMimeTypes: List<String> = emptyList(),\n    @Json(name = \"image_size_limit\") val imageSizeLimit: Int? = null,\n    @Json(name = \"image_matrix_limit\") val imageMatrixLimit: Int? = null,\n    @Json(name = \"video_size_limit\") val videoSizeLimit: Int? = null,\n    @Json(name = \"video_frame_rate_limit\") val videoFrameRateLimit: Int? = null,\n    @Json(name = \"video_matrix_limit\") val videoMatrixLimit: Int? = null\n)\n\n@JsonClass(generateAdapter = true)\ndata class PleromaConfiguration(\n    val metadata: PleromaMetadata? = null\n)\n\n@JsonClass(generateAdapter = true)\ndata class PleromaMetadata(\n    @Json(name = \"fields_limits\") val fieldLimits: PleromaFieldLimits\n)\n\n@JsonClass(generateAdapter = true)\ndata class PleromaFieldLimits(\n    @Json(name = \"max_fields\") val maxFields: Int? = null,\n    @Json(name = \"name_length\") val nameLength: Int? = null,\n    @Json(name = \"value_length\") val valueLength: Int? = null\n)\n\n@JsonClass(generateAdapter = true)\ndata class InstanceRules(\n    val id: String,\n    val text: String\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/Marker.kt",
    "content": "package com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\nimport java.util.Date\n\n/**\n * API type for saving the scroll position of a timeline.\n */\n@JsonClass(generateAdapter = true)\ndata class Marker(\n    @Json(name = \"last_read_id\")\n    val lastReadId: String,\n    val version: Int,\n    @Json(name = \"updated_at\")\n    val updatedAt: Date\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/MastoList.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n/**\n * Created by charlag on 1/4/18.\n */\n@JsonClass(generateAdapter = true)\ndata class MastoList(\n    val id: String,\n    val title: String,\n    val exclusive: Boolean? = null,\n    @Json(name = \"replies_policy\") val repliesPolicy: String? = null\n) {\n    enum class ReplyPolicy(val policy: String) {\n        NONE(\"none\"),\n        LIST(\"list\"),\n        FOLLOWED(\"followed\");\n\n        companion object {\n            fun from(policy: String?): ReplyPolicy =\n                entries.firstOrNull { it.policy == policy } ?: LIST\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/MediaUploadResult.kt",
    "content": "package com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.JsonClass\n\n/**\n * The same as Attachment, except the url is null - see https://docs.joinmastodon.org/methods/statuses/media/\n * We are only interested in the id, so other attributes are omitted\n */\n@JsonClass(generateAdapter = true)\ndata class MediaUploadResult(\n    val id: String\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/NewStatus.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport android.os.Parcelable\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\nimport kotlinx.parcelize.Parcelize\n\n@JsonClass(generateAdapter = true)\ndata class NewStatus(\n    val status: String,\n    @Json(name = \"spoiler_text\") val warningText: String,\n    @Json(name = \"in_reply_to_id\") val inReplyToId: String? = null,\n    val visibility: String,\n    val sensitive: Boolean,\n    @Json(name = \"media_ids\") val mediaIds: List<String> = emptyList(),\n    @Json(name = \"media_attributes\") val mediaAttributes: List<MediaAttribute> = emptyList(),\n    @Json(name = \"scheduled_at\") val scheduledAt: String? = null,\n    val poll: NewPoll? = null,\n    val language: String? = null\n)\n\n@JsonClass(generateAdapter = true)\n@Parcelize\ndata class NewPoll(\n    val options: List<String>,\n    @Json(name = \"expires_in\") val expiresIn: Int,\n    val multiple: Boolean\n) : Parcelable\n\n// It would be nice if we could reuse MediaToSend,\n// but the server requires a different format for focus\n@JsonClass(generateAdapter = true)\n@Parcelize\ndata class MediaAttribute(\n    val id: String,\n    val description: String? = null,\n    val focus: String? = null,\n    val thumbnail: String? = null\n) : Parcelable\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/Notification.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.keylesspalace.tusky.entity.Notification.Type\nimport com.keylesspalace.tusky.entity.Notification.Type.Favourite\nimport com.keylesspalace.tusky.entity.Notification.Type.Follow\nimport com.keylesspalace.tusky.entity.Notification.Type.FollowRequest\nimport com.keylesspalace.tusky.entity.Notification.Type.Mention\nimport com.keylesspalace.tusky.entity.Notification.Type.ModerationWarning\nimport com.keylesspalace.tusky.entity.Notification.Type.Reblog\nimport com.keylesspalace.tusky.entity.Notification.Type.SeveredRelationship\nimport com.keylesspalace.tusky.entity.Notification.Type.SignUp\nimport com.keylesspalace.tusky.entity.Notification.Type.Unknown\nimport com.keylesspalace.tusky.entity.Notification.Type.Update\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class Notification(\n    val type: Type,\n    val id: String,\n    val account: TimelineAccount,\n    val status: Status? = null,\n    val report: Report? = null,\n    val filtered: Boolean = false,\n    val event: RelationshipSeveranceEvent? = null,\n    @Json(name = \"moderation_warning\") val moderationWarning: AccountWarning? = null\n) {\n\n    /** From https://docs.joinmastodon.org/entities/Notification/#type */\n    @JsonClass(generateAdapter = false)\n    sealed class Type(val name: String) {\n        data class Unknown(val unknownName: String) : Type(unknownName)\n\n        /** Someone mentioned you */\n        object Mention : Type(\"mention\")\n\n        /** Someone boosted one of your statuses */\n        object Reblog : Type(\"reblog\")\n\n        /** Someone favourited one of your statuses */\n        object Favourite : Type(\"favourite\")\n\n        /** Someone followed you */\n        object Follow : Type(\"follow\")\n\n        /** Someone requested to follow you */\n        object FollowRequest : Type(\"follow_request\")\n\n        /** A poll you have voted in or created has ended */\n        object Poll : Type(\"poll\")\n\n        /** Someone you enabled notifications for has posted a status */\n        object Status : Type(\"status\")\n\n        /** Someone signed up (optionally sent to admins) */\n        object SignUp : Type(\"admin.sign_up\")\n\n        /** A status you interacted with has been updated */\n        object Update : Type(\"update\")\n\n        /** A new report has been filed */\n        object Report : Type(\"admin.report\")\n\n        /**  Some of your follow relationships have been severed as a result of a moderation or block event **/\n        object SeveredRelationship : Type(\"severed_relationships\")\n\n        /** moderation_warning = A moderator has taken action against your account or has sent you a warning **/\n        object ModerationWarning : Type(\"moderation_warning\")\n\n        // can't use data objects or this wouldn't work\n        override fun toString() = name\n    }\n\n    // for Pleroma compatibility that uses Mention type\n    fun rewriteToStatusTypeIfNeeded(accountId: String): Notification {\n        if (type == Mention && status != null) {\n            return if (status.mentions.any {\n                    it.id == accountId\n                }\n            ) {\n                this\n            } else {\n                copy(type = Type.Status)\n            }\n        }\n        return this\n    }\n}\n\n/** Notification types for UI display (omits UNKNOWN) */\n/** this is not in a companion object so it gets initialized earlier,\n * otherwise it might get initialized when a subclass is loaded,\n * which leds to crash since those subclasses are referenced here */\nval visibleNotificationTypes = listOf(Mention, Reblog, Favourite, Follow, FollowRequest, Type.Poll, Type.Status, SignUp, Update, Type.Report, SeveredRelationship, ModerationWarning)\n\nfun notificationTypeFromString(s: String): Type {\n    return visibleNotificationTypes.firstOrNull { it.name == s.lowercase() } ?: Unknown(s)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/NotificationPolicy.kt",
    "content": "/* Copyright 2024 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class NotificationPolicy(\n    @Json(name = \"for_not_following\") val forNotFollowing: State,\n    @Json(name = \"for_not_followers\") val forNotFollowers: State,\n    @Json(name = \"for_new_accounts\") val forNewAccounts: State,\n    @Json(name = \"for_private_mentions\") val forPrivateMentions: State,\n    @Json(name = \"for_limited_accounts\") val forLimitedAccounts: State,\n    val summary: Summary\n) {\n    @JsonClass(generateAdapter = false)\n    enum class State {\n        @Json(name = \"accept\")\n        ACCEPT,\n\n        @Json(name = \"filter\")\n        FILTER,\n\n        @Json(name = \"drop\")\n        DROP\n    }\n\n    @JsonClass(generateAdapter = true)\n    data class Summary(\n        @Json(name = \"pending_requests_count\") val pendingRequestsCount: Int,\n        @Json(name = \"pending_notifications_count\") val pendingNotificationsCount: Int\n    )\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/NotificationRequest.kt",
    "content": "/* Copyright 2024 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class NotificationRequest(\n    val id: String,\n    val account: Account,\n    @Json(name = \"notifications_count\") val notificationsCount: Int\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/NotificationSubscribeResult.kt",
    "content": "/* Copyright 2022 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class NotificationSubscribeResult(\n    val id: Int,\n    val endpoint: String,\n    val alerts: Map<String, Boolean>,\n    @Json(name = \"server_key\") val serverKey: String\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/Poll.kt",
    "content": "package com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\nimport java.util.Date\n\n@JsonClass(generateAdapter = true)\ndata class Poll(\n    val id: String,\n    @Json(name = \"expires_at\") val expiresAt: Date? = null,\n    val expired: Boolean,\n    val multiple: Boolean,\n    @Json(name = \"votes_count\") val votesCount: Int,\n    // nullable for compatibility with Pleroma\n    @Json(name = \"voters_count\") val votersCount: Int? = null,\n    val options: List<PollOption>,\n    val voted: Boolean = false,\n    @Json(name = \"own_votes\") val ownVotes: List<Int> = emptyList()\n) {\n\n    fun votedCopy(choices: List<Int>): Poll {\n        val newOptions = options.mapIndexed { index, option ->\n            if (choices.contains(index)) {\n                option.copy(votesCount = (option.votesCount ?: 0) + 1)\n            } else {\n                option\n            }\n        }\n\n        return copy(\n            options = newOptions,\n            votesCount = votesCount + choices.size,\n            votersCount = votersCount?.plus(1),\n            voted = true\n        )\n    }\n\n    fun toNewPoll(creationDate: Date) = NewPoll(\n        options.map { it.title },\n        expiresAt?.let {\n            ((it.time - creationDate.time) / 1000).toInt() + 1\n        } ?: 3600,\n        multiple\n    )\n}\n\n@JsonClass(generateAdapter = true)\ndata class PollOption(\n    val title: String,\n    @Json(name = \"votes_count\") val votesCount: Int? = null\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/PreviewCard.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.keylesspalace.tusky.json.Guarded\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\nimport java.util.Date\n\n@JsonClass(generateAdapter = true)\ndata class PreviewCard(\n    val url: String,\n    val title: String,\n    val description: String = \"\",\n    val authors: List<PreviewCardAuthor> = emptyList(),\n    @Json(name = \"author_name\") val authorName: String? = null,\n    @Json(name = \"provider_name\") val providerName: String? = null,\n    // sometimes this date is invalid https://github.com/tuskyapp/Tusky/issues/4992\n    @Json(name = \"published_at\") @Guarded val publishedAt: Date?,\n    val image: String? = null,\n    val type: String,\n    val width: Int = 0,\n    val height: Int = 0,\n    val blurhash: String? = null,\n    @Json(name = \"embed_url\") val embedUrl: String? = null\n) {\n\n    override fun hashCode() = url.hashCode()\n\n    override fun equals(other: Any?): Boolean {\n        if (other !is PreviewCard) {\n            return false\n        }\n        return other.url == this.url\n    }\n\n    companion object {\n        const val TYPE_PHOTO = \"photo\"\n    }\n}\n\n@JsonClass(generateAdapter = true)\ndata class PreviewCardAuthor(\n    val name: String,\n    val url: String,\n    val account: TimelineAccount?\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/Relationship.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.keylesspalace.tusky.json.Guarded\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class Relationship(\n    val id: String,\n    val following: Boolean,\n    @Json(name = \"followed_by\") val followedBy: Boolean,\n    val blocking: Boolean,\n    val muting: Boolean,\n    @Json(name = \"muting_notifications\") val mutingNotifications: Boolean,\n    val requested: Boolean,\n    @Json(name = \"showing_reblogs\") val showingReblogs: Boolean,\n    /* Pleroma extension, same as 'notifying' on Mastodon.\n     * Some instances like qoto.org have a custom subscription feature where 'subscribing' is a json object,\n     * so we use GuardedAdapter to ignore the field if it is not a boolean.\n     */\n    @Guarded val subscribing: Boolean? = null,\n    @Json(name = \"domain_blocking\") val blockingDomain: Boolean,\n    // nullable for backward compatibility / feature detection\n    val note: String? = null,\n    // since 3.3.0rc\n    val notifying: Boolean? = null\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/RelationshipSeveranceEvent.kt",
    "content": "/* Copyright 2025 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class RelationshipSeveranceEvent(\n    val id: String,\n    val type: Type,\n    @Json(name = \"target_name\") val targetName: String,\n    @Json(name = \"followers_count\") val followersCount: Int,\n    @Json(name = \"following_count\") val followingCount: Int\n) {\n\n    @JsonClass(generateAdapter = false)\n    enum class Type {\n        @Json(name = \"domain_block\")\n        DOMAIN_BLOCK,\n\n        @Json(name = \"user_domain_block\")\n        USER_DOMAIN_BLOCK,\n\n        @Json(name = \"account_suspension\")\n        ACCOUNT_SUSPENSION,\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/Report.kt",
    "content": "package com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\nimport java.util.Date\n\n@JsonClass(generateAdapter = true)\ndata class Report(\n    val id: String,\n    val category: String,\n    @Json(name = \"status_ids\") val statusIds: List<String>? = null,\n    @Json(name = \"created_at\") val createdAt: Date,\n    @Json(name = \"target_account\") val targetAccount: TimelineAccount\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/ScheduledStatus.kt",
    "content": "/* Copyright 2019 kyori19\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class ScheduledStatus(\n    val id: String,\n    @Json(name = \"scheduled_at\") val scheduledAt: String,\n    val params: StatusParams,\n    @Json(name = \"media_attachments\") val mediaAttachments: List<Attachment>\n)\n\n// minimal class to avoid json parsing errors with servers that don't support scheduling\n// https://github.com/tuskyapp/Tusky/issues/4703\n@JsonClass(generateAdapter = true)\ndata class ScheduledStatusReply(\n    val id: String,\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/SearchResult.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class SearchResult(\n    val accounts: List<TimelineAccount>,\n    val statuses: List<Status>,\n    val hashtags: List<HashTag>\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/Status.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport android.text.SpannableStringBuilder\nimport android.text.style.URLSpan\nimport com.keylesspalace.tusky.util.parseAsMastodonHtml\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\nimport java.util.Date\n\n@JsonClass(generateAdapter = true)\ndata class Status(\n    val id: String,\n    // not present if it's reblog\n    val url: String? = null,\n    val account: TimelineAccount,\n    @Json(name = \"in_reply_to_id\") val inReplyToId: String? = null,\n    @Json(name = \"in_reply_to_account_id\") val inReplyToAccountId: String? = null,\n    val reblog: Status? = null,\n    val content: String,\n    @Json(name = \"created_at\") val createdAt: Date,\n    @Json(name = \"edited_at\") val editedAt: Date? = null,\n    val emojis: List<Emoji>,\n    @Json(name = \"reblogs_count\") val reblogsCount: Int,\n    @Json(name = \"favourites_count\") val favouritesCount: Int,\n    @Json(name = \"replies_count\") val repliesCount: Int,\n    val reblogged: Boolean = false,\n    val favourited: Boolean = false,\n    val bookmarked: Boolean = false,\n    val sensitive: Boolean,\n    @Json(name = \"spoiler_text\") val spoilerText: String,\n    val visibility: Visibility,\n    @Json(name = \"media_attachments\") val attachments: List<Attachment>,\n    val mentions: List<Mention>,\n    // Use null to mark the absence of tags because of semantic differences in LinkHelper\n    val tags: List<HashTag> = emptyList(),\n    val application: Application? = null,\n    val pinned: Boolean = false,\n    val muted: Boolean = false,\n    val poll: Poll? = null,\n    /** Preview card for links included within status content. */\n    val card: PreviewCard? = null,\n    /** ISO 639 language code for this status. */\n    val language: String? = null,\n    /** If the current token has an authorized user: The filter and keywords that matched this status.\n     *  Iceshrimp and maybe other implementations explicitly send filtered=null so we can't default to empty list. */\n    val filtered: List<FilterResult>? = null\n) {\n\n    val actionableId: String\n        get() = reblog?.id ?: id\n\n    val actionableStatus: Status\n        get() = reblog ?: this\n\n    val isReply: Boolean\n        get() = inReplyToId != null\n\n    @JsonClass(generateAdapter = false)\n    enum class Visibility(val int: Int) {\n        UNKNOWN(0),\n\n        @Json(name = \"public\")\n        PUBLIC(1),\n\n        @Json(name = \"unlisted\")\n        UNLISTED(2),\n\n        @Json(name = \"private\")\n        PRIVATE(3),\n\n        @Json(name = \"direct\")\n        DIRECT(4);\n\n        val stringValue: String\n            get() = when (this) {\n                PUBLIC -> \"public\"\n                UNLISTED -> \"unlisted\"\n                PRIVATE -> \"private\"\n                DIRECT -> \"direct\"\n                UNKNOWN -> \"unknown\"\n            }\n\n        companion object {\n            fun fromInt(int: Int): Visibility {\n                return when (int) {\n                    4 -> DIRECT\n                    3 -> PRIVATE\n                    2 -> UNLISTED\n                    1 -> PUBLIC\n                    0 -> UNKNOWN\n                    else -> UNKNOWN\n                }\n            }\n\n            fun fromStringValue(s: String): Visibility {\n                return when (s) {\n                    \"public\" -> PUBLIC\n                    \"unlisted\" -> UNLISTED\n                    \"private\" -> PRIVATE\n                    \"direct\" -> DIRECT\n                    \"unknown\" -> UNKNOWN\n                    else -> UNKNOWN\n                }\n            }\n        }\n    }\n\n    val isRebloggingAllowed: Boolean\n        get() {\n            return (visibility != Visibility.DIRECT && visibility != Visibility.UNKNOWN)\n        }\n\n    fun toDeletedStatus(): DeletedStatus {\n        return DeletedStatus(\n            text = getEditableText(),\n            inReplyToId = inReplyToId,\n            spoilerText = spoilerText,\n            visibility = visibility,\n            sensitive = sensitive,\n            attachments = attachments,\n            poll = poll,\n            createdAt = createdAt,\n            language = language\n        )\n    }\n\n    private fun getEditableText(): String {\n        val contentSpanned = content.parseAsMastodonHtml()\n        val builder = SpannableStringBuilder(content.parseAsMastodonHtml())\n        for (span in contentSpanned.getSpans(0, content.length, URLSpan::class.java)) {\n            val url = span.url\n            for ((_, url1, username) in mentions) {\n                if (url == url1) {\n                    val start = builder.getSpanStart(span)\n                    val end = builder.getSpanEnd(span)\n                    if (start >= 0 && end >= 0) {\n                        builder.replace(start, end, \"@$username\")\n                    }\n                    break\n                }\n            }\n        }\n        return builder.toString()\n    }\n\n    fun getApplicableFilter(kind: Filter.Kind): Filter? =\n        actionableStatus.filtered?.filter { it.filter.context.contains(kind) }?.maxByOrNull { it.filter.action.ordinal }?.filter\n\n    fun shouldShowContent(alwayShowSensitiveContent: Boolean, context: Filter.Kind): Boolean =\n        alwayShowSensitiveContent || (!actionableStatus.sensitive && getApplicableFilter(context)?.action != Filter.Action.BLUR)\n\n    @JsonClass(generateAdapter = true)\n    data class Mention(\n        val id: String,\n        val url: String,\n        @Json(name = \"acct\") val username: String,\n        @Json(name = \"username\") val localUsername: String\n    )\n\n    @JsonClass(generateAdapter = true)\n    data class Application(\n        val name: String,\n        val website: String? = null\n    )\n\n    companion object {\n        const val MAX_MEDIA_ATTACHMENTS = 4\n        const val MAX_POLL_OPTIONS = 4\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/StatusContext.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class StatusContext(\n    val ancestors: List<Status>,\n    val descendants: List<Status>\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/StatusEdit.kt",
    "content": "package com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\nimport java.util.Date\n\n@JsonClass(generateAdapter = true)\ndata class StatusEdit(\n    val content: String,\n    @Json(name = \"spoiler_text\") val spoilerText: String,\n    val sensitive: Boolean,\n    @Json(name = \"created_at\") val createdAt: Date,\n    val account: TimelineAccount,\n    val poll: Poll? = null,\n    @Json(name = \"media_attachments\") val mediaAttachments: List<Attachment>,\n    val emojis: List<Emoji>\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/StatusParams.kt",
    "content": "/* Copyright 2019 kyori19\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class StatusParams(\n    val text: String,\n    val sensitive: Boolean? = null,\n    val visibility: Status.Visibility,\n    @Json(name = \"spoiler_text\") val spoilerText: String? = null,\n    @Json(name = \"in_reply_to_id\") val inReplyToId: String? = null\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/StatusSource.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class StatusSource(\n    val id: String,\n    val text: String,\n    @Json(name = \"spoiler_text\") val spoilerText: String\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/TimelineAccount.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n/**\n * Same as [Account], but only with the attributes required in timelines.\n * Prefer this class over [Account] because it uses way less memory & deserializes faster from json.\n */\n@JsonClass(generateAdapter = true)\ndata class TimelineAccount(\n    val id: String,\n    @Json(name = \"username\") val localUsername: String,\n    @Json(name = \"acct\") val username: String,\n    // should never be null per Api definition, but some servers break the contract\n    @Json(name = \"display_name\") val displayName: String? = null,\n    val url: String,\n    val avatar: String,\n    val note: String,\n    val bot: Boolean = false,\n    // optional for backward compatibility\n    val emojis: List<Emoji> = emptyList()\n) {\n\n    val name: String\n        get() = if (displayName.isNullOrEmpty()) {\n            localUsername\n        } else {\n            displayName\n        }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/Translation.kt",
    "content": "package com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.Json\nimport com.squareup.moshi.JsonClass\n\n@JsonClass(generateAdapter = true)\ndata class MediaTranslation(\n    val id: String,\n    val description: String,\n)\n\n/**\n * Represents the result of machine translating some status content.\n *\n * See [doc](https://docs.joinmastodon.org/entities/Translation/).\n */\n@JsonClass(generateAdapter = true)\ndata class Translation(\n    val content: String,\n    @Json(name = \"spoiler_text\")\n    val spoilerText: String? = null,\n    val poll: TranslatedPoll? = null,\n    @Json(name = \"media_attachments\")\n    val mediaAttachments: List<MediaTranslation> = emptyList(),\n    @Json(name = \"detected_source_language\")\n    val detectedSourceLanguage: String,\n    val provider: String,\n)\n\n@JsonClass(generateAdapter = true)\ndata class TranslatedPoll(\n    val options: List<TranslatedPollOption>\n)\n\n@JsonClass(generateAdapter = true)\ndata class TranslatedPollOption(\n    val title: String\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/entity/TrendingTagsResult.kt",
    "content": "/* Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.entity\n\nimport com.squareup.moshi.JsonClass\nimport java.util.Date\n\n/**\n * Mastodon API Documentation: https://docs.joinmastodon.org/methods/trends/#tags\n *\n * @param name The name of the hashtag (after the #). The \"caturday\" in \"#caturday\".\n * (@param url The URL to your mastodon instance list for this hashtag.)\n * @param history A list of [TrendingTagHistory]. Each element contains metrics per day for this hashtag.\n * (@param following This is not listed in the APIs at the time of writing, but an instance is delivering it.)\n */\n@JsonClass(generateAdapter = true)\ndata class TrendingTag(\n    val name: String,\n    val history: List<TrendingTagHistory>\n)\n\n/**\n * Mastodon API Documentation: https://docs.joinmastodon.org/methods/trends/#tags\n *\n * @param day The day that this was posted in Unix Epoch Seconds.\n * @param accounts The number of accounts that have posted with this hashtag.\n * @param uses The number of posts with this hashtag.\n */\n@JsonClass(generateAdapter = true)\ndata class TrendingTagHistory(\n    val day: String,\n    val accounts: String,\n    val uses: String\n)\n\nval TrendingTag.start\n    get() = Date(history.last().day.toLong() * 1000L)\nval TrendingTag.end\n    get() = Date(history.first().day.toLong() * 1000L)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\npackage com.keylesspalace.tusky.fragment\n\nimport android.Manifest\nimport android.app.DownloadManager\nimport android.content.DialogInterface\nimport android.content.Intent\nimport android.os.Build\nimport android.os.Bundle\nimport android.os.Environment\nimport android.util.Log\nimport android.view.MenuItem\nimport android.view.View\nimport android.widget.Toast\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.annotation.LayoutRes\nimport androidx.appcompat.widget.PopupMenu\nimport androidx.core.app.ActivityOptionsCompat\nimport androidx.core.content.getSystemService\nimport androidx.core.net.toUri\nimport androidx.fragment.app.Fragment\nimport androidx.lifecycle.lifecycleScope\nimport at.connyduck.calladapter.networkresult.fold\nimport at.connyduck.calladapter.networkresult.onFailure\nimport at.connyduck.sparkbutton.SparkButton\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.BaseActivity\nimport com.keylesspalace.tusky.BottomSheetActivity\nimport com.keylesspalace.tusky.PostLookupFallbackBehavior\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.StatusListActivity.Companion.newHashtagIntent\nimport com.keylesspalace.tusky.ViewMediaActivity.Companion.newIntent\nimport com.keylesspalace.tusky.components.compose.ComposeActivity\nimport com.keylesspalace.tusky.components.compose.ComposeActivity.Companion.startIntent\nimport com.keylesspalace.tusky.components.compose.ComposeActivity.ComposeOptions\nimport com.keylesspalace.tusky.components.instanceinfo.InstanceInfoRepository\nimport com.keylesspalace.tusky.components.report.ReportActivity.Companion.getIntent\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.entity.Translation\nimport com.keylesspalace.tusky.interfaces.AccountSelectionListener\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.usecase.TimelineCases\nimport com.keylesspalace.tusky.util.copyToClipboard\nimport com.keylesspalace.tusky.util.openLink\nimport com.keylesspalace.tusky.util.parseAsMastodonHtml\nimport com.keylesspalace.tusky.util.startActivityWithSlideInAnimation\nimport com.keylesspalace.tusky.view.showMuteAccountDialog\nimport com.keylesspalace.tusky.viewdata.AttachmentViewData\nimport java.util.Locale\nimport javax.inject.Inject\nimport kotlinx.coroutines.launch\n\n/* Note from Andrew on Jan. 22, 2017: This class is a design problem for me, so I left it with an\n * awkward name. TimelineFragment and NotificationFragment have significant overlap but the nature\n * of that is complicated by how they're coupled with Status and Notification and the corresponding\n * adapters. I feel like the profile pages and thread viewer, which I haven't made yet, will also\n * overlap functionality. So, I'm momentarily leaving it and hopefully working on those will clear\n * up what needs to be where. */\nabstract class SFragment(@LayoutRes contentLayoutId: Int) : Fragment(contentLayoutId) {\n    protected abstract fun removeItem(position: Int)\n    protected abstract fun onReblog(reblog: Boolean, position: Int, visibility: Status.Visibility?, button: SparkButton?)\n\n    /** `null` if translation is not supported on this screen */\n    protected abstract val onMoreTranslate: ((translate: Boolean, position: Int) -> Unit)?\n\n    private val bottomSheetActivity: BottomSheetActivity\n        get() = (requireActivity() as? BottomSheetActivity)\n            ?: throw IllegalStateException(\"Fragment must be attached to a BottomSheetActivity!\")\n\n    @Inject\n    lateinit var mastodonApi: MastodonApi\n\n    @Inject\n    lateinit var accountManager: AccountManager\n\n    @Inject\n    lateinit var timelineCases: TimelineCases\n\n    @Inject\n    lateinit var instanceInfoRepository: InstanceInfoRepository\n\n    private var pendingMediaDownloads: List<String>? = null\n\n    private val downloadAllMediaPermissionLauncher =\n        registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->\n            if (isGranted) {\n                pendingMediaDownloads?.let { downloadAllMedia(it) }\n            } else {\n                Toast.makeText(\n                    context,\n                    R.string.error_media_download_permission,\n                    Toast.LENGTH_SHORT\n                ).show()\n            }\n            pendingMediaDownloads = null\n        }\n\n    override fun startActivity(intent: Intent) {\n        requireActivity().startActivityWithSlideInAnimation(intent)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        pendingMediaDownloads = savedInstanceState?.getStringArrayList(PENDING_MEDIA_DOWNLOADS_STATE_KEY)\n    }\n\n    override fun onSaveInstanceState(outState: Bundle) {\n        super.onSaveInstanceState(outState)\n        pendingMediaDownloads?.let {\n            outState.putStringArrayList(PENDING_MEDIA_DOWNLOADS_STATE_KEY, ArrayList(it))\n        }\n    }\n\n    override fun onResume() {\n        super.onResume()\n\n        // make sure we have instance info for when we'll need it\n        instanceInfoRepository.precache()\n    }\n\n    protected fun openReblog(status: Status?) {\n        if (status == null) return\n        bottomSheetActivity.viewAccount(status.account.id)\n    }\n\n    protected fun viewThread(statusId: String?, statusUrl: String?) {\n        bottomSheetActivity.viewThread(statusId!!, statusUrl)\n    }\n\n    protected fun viewAccount(accountId: String?) {\n        bottomSheetActivity.viewAccount(accountId!!)\n    }\n\n    open fun onViewUrl(url: String) {\n        bottomSheetActivity.viewUrl(url, PostLookupFallbackBehavior.OPEN_IN_BROWSER)\n    }\n\n    protected fun reply(status: Status) {\n        val actionableStatus = status.actionableStatus\n        val account = actionableStatus.account\n        var loggedInUsername: String? = null\n        val activeAccount = accountManager.activeAccount\n        if (activeAccount != null) {\n            loggedInUsername = activeAccount.username\n        }\n        val mentionedUsernames = LinkedHashSet(\n            listOf(account.username) + actionableStatus.mentions.map { it.username }\n        ).apply { remove(loggedInUsername) }\n\n        val composeOptions = ComposeOptions(\n            inReplyToId = status.actionableId,\n            replyVisibility = actionableStatus.visibility,\n            contentWarning = actionableStatus.spoilerText,\n            mentionedUsernames = mentionedUsernames,\n            replyingStatusAuthor = account.localUsername,\n            replyingStatusContent = actionableStatus.content.parseAsMastodonHtml().toString(),\n            language = actionableStatus.language,\n            kind = ComposeActivity.ComposeKind.NEW\n        )\n\n        val intent = startIntent(requireContext(), composeOptions)\n        requireActivity().startActivity(intent)\n    }\n\n    protected fun more(status: Status, view: View, position: Int, translation: Translation?) {\n        val id = status.actionableId\n        val actionableStatus = status.actionableStatus\n        val accountId = actionableStatus.account.id\n        val accountUsername = actionableStatus.account.username\n        val statusUrl = actionableStatus.url\n        var loggedInAccountId: String? = null\n        val activeAccount = accountManager.activeAccount\n        if (activeAccount != null) {\n            loggedInAccountId = activeAccount.accountId\n        }\n        val popup = PopupMenu(requireContext(), view)\n        // Give a different menu depending on whether this is the user's own toot or not.\n        val statusIsByCurrentUser = loggedInAccountId != null && loggedInAccountId == accountId\n        if (statusIsByCurrentUser) {\n            popup.inflate(R.menu.status_more_for_user)\n            val menu = popup.menu\n            when (actionableStatus.visibility) {\n                Status.Visibility.PUBLIC, Status.Visibility.UNLISTED -> {\n                    menu.add(\n                        0,\n                        R.id.pin,\n                        1,\n                        getString(\n                            if (actionableStatus.pinned) R.string.unpin_action else R.string.pin_action\n                        )\n                    )\n                }\n\n                Status.Visibility.PRIVATE -> {\n                    menu.findItem(R.id.status_reblog_private).isVisible = !actionableStatus.reblogged\n                    menu.findItem(R.id.status_unreblog_private).isVisible = actionableStatus.reblogged\n                }\n\n                else -> {}\n            }\n        } else {\n            popup.inflate(R.menu.status_more)\n            popup.menu.findItem(R.id.status_download_media).isVisible =\n                status.attachments.isNotEmpty()\n        }\n        val menu = popup.menu\n        val openAsItem = menu.findItem(R.id.status_open_as)\n        val openAsText = (activity as BaseActivity?)?.openAsText\n        if (openAsText == null) {\n            openAsItem.isVisible = false\n        } else {\n            openAsItem.title = openAsText\n        }\n        val muteConversationItem = menu.findItem(R.id.status_mute_conversation)\n        val mutable =\n            statusIsByCurrentUser || accountIsInMentions(activeAccount, status.mentions)\n        muteConversationItem.isVisible = mutable\n        if (mutable) {\n            muteConversationItem.setTitle(\n                if (!status.muted) {\n                    R.string.action_mute_conversation\n                } else {\n                    R.string.action_unmute_conversation\n                }\n            )\n        }\n\n        // translation not there for posts already in your language or non-public posts\n        menu.findItem(R.id.status_translate)?.let { translateItem ->\n            translateItem.isVisible = onMoreTranslate != null &&\n                !status.language.equals(Locale.getDefault().language, ignoreCase = true) &&\n                instanceInfoRepository.cachedInstanceInfoOrFallback.translationEnabled == true &&\n                (status.visibility == Status.Visibility.PUBLIC || status.visibility == Status.Visibility.UNLISTED)\n            translateItem.setTitle(if (translation != null) R.string.action_show_original else R.string.action_translate)\n        }\n\n        popup.setOnMenuItemClickListener { item: MenuItem ->\n            when (item.itemId) {\n                R.id.post_share_content -> {\n                    val statusToShare = status.reblog ?: status\n                    val sendIntent = Intent().apply {\n                        action = Intent.ACTION_SEND\n                        type = \"text/plain\"\n                        putExtra(\n                            Intent.EXTRA_TEXT,\n                            \"${statusToShare.account.username} - ${statusToShare.content.parseAsMastodonHtml()}\"\n                        )\n                        putExtra(Intent.EXTRA_SUBJECT, statusUrl)\n                    }\n                    startActivity(\n                        Intent.createChooser(\n                            sendIntent,\n                            resources.getText(R.string.send_post_content_to)\n                        )\n                    )\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.post_share_link -> {\n                    val sendIntent = Intent().apply {\n                        action = Intent.ACTION_SEND\n                        putExtra(Intent.EXTRA_TEXT, statusUrl)\n                        type = \"text/plain\"\n                    }\n                    startActivity(\n                        Intent.createChooser(\n                            sendIntent,\n                            resources.getText(R.string.send_post_link_to)\n                        )\n                    )\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_copy_link -> {\n                    statusUrl?.let { requireActivity().copyToClipboard(it, getString(R.string.url_copied)) }\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_open_as -> {\n                    showOpenAsDialog(statusUrl, item.title)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_download_media -> {\n                    requestDownloadAllMedia(actionableStatus)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_mute -> {\n                    onMute(accountId, accountUsername)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_block -> {\n                    onBlock(accountId, accountUsername)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_report -> {\n                    openReportPage(accountId, accountUsername, id)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_unreblog_private -> {\n                    onReblog(false, position, Status.Visibility.PRIVATE, null)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_reblog_private -> {\n                    onReblog(true, position, Status.Visibility.PRIVATE, null)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_delete -> {\n                    showConfirmDeleteDialog(id, position)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_delete_and_redraft -> {\n                    showConfirmEditDialog(id, position, status)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_edit -> {\n                    editStatus(id, status)\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.pin -> {\n                    viewLifecycleOwner.lifecycleScope.launch {\n                        timelineCases.pin(status.actionableId, !actionableStatus.pinned)\n                            .onFailure { e: Throwable ->\n                                val message = e.message\n                                    ?: getString(if (status.pinned) R.string.failed_to_unpin else R.string.failed_to_pin)\n                                Snackbar.make(requireView(), message, Snackbar.LENGTH_LONG)\n                                    .show()\n                            }\n                    }\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_mute_conversation -> {\n                    lifecycleScope.launch {\n                        timelineCases.muteConversation(status.id, !status.muted)\n                    }\n                    return@setOnMenuItemClickListener true\n                }\n\n                R.id.status_translate -> {\n                    onMoreTranslate?.invoke(translation == null, position)\n                }\n            }\n            false\n        }\n        popup.show()\n    }\n\n    private fun onMute(accountId: String, accountUsername: String) {\n        showMuteAccountDialog(\n            this.requireActivity(),\n            accountUsername\n        ) { notifications: Boolean, duration: Int? ->\n            lifecycleScope.launch {\n                timelineCases.mute(accountId, notifications, duration)\n            }\n        }\n    }\n\n    private fun onBlock(accountId: String, accountUsername: String) {\n        MaterialAlertDialogBuilder(requireContext())\n            .setMessage(getString(R.string.dialog_block_warning, accountUsername))\n            .setPositiveButton(android.R.string.ok) { _: DialogInterface?, _: Int ->\n                lifecycleScope.launch {\n                    timelineCases.block(accountId)\n                }\n            }\n            .setNegativeButton(android.R.string.cancel, null)\n            .show()\n    }\n\n    protected fun viewMedia(urlIndex: Int, attachments: List<AttachmentViewData>, view: View?) {\n        val (attachment) = attachments[urlIndex]\n        when (attachment.type) {\n            Attachment.Type.GIFV, Attachment.Type.VIDEO, Attachment.Type.IMAGE, Attachment.Type.AUDIO -> {\n                val intent = newIntent(requireContext(), attachments, urlIndex)\n                if (view != null) {\n                    val url = attachment.url\n                    view.transitionName = url\n                    val options = ActivityOptionsCompat.makeSceneTransitionAnimation(\n                        requireActivity(),\n                        view,\n                        url\n                    )\n                    startActivity(intent, options.toBundle())\n                } else {\n                    startActivity(intent)\n                }\n            }\n\n            Attachment.Type.UNKNOWN -> {\n                requireContext().openLink(attachment.unknownUrl)\n            }\n        }\n    }\n\n    protected fun viewTag(tag: String) {\n        startActivity(newHashtagIntent(requireContext(), tag))\n    }\n\n    private fun openReportPage(accountId: String, accountUsername: String, statusId: String) {\n        startActivity(getIntent(requireContext(), accountId, accountUsername, statusId))\n    }\n\n    private fun showConfirmDeleteDialog(id: String, position: Int) {\n        MaterialAlertDialogBuilder(requireActivity())\n            .setMessage(R.string.dialog_delete_post_warning)\n            .setPositiveButton(android.R.string.ok) { _: DialogInterface?, _: Int ->\n                viewLifecycleOwner.lifecycleScope.launch {\n                    val result = timelineCases.delete(id, true).exceptionOrNull()\n                    if (result != null) {\n                        Log.w(\"SFragment\", \"error deleting status\", result)\n                        Toast.makeText(requireContext(), R.string.error_generic, Toast.LENGTH_SHORT).show()\n                    }\n                    // XXX: Removes the item even if there was an error. This is probably not\n                    // correct (see similar code in showConfirmEditDialog() which only\n                    // removes the item if the timelineCases.delete() call succeeded.\n                    //\n                    // Either way, this logic should be in the view model.\n                    removeItem(position)\n                }\n            }\n            .setNegativeButton(android.R.string.cancel, null)\n            .show()\n    }\n\n    private fun showConfirmEditDialog(id: String, position: Int, status: Status) {\n        val context = context ?: return\n\n        MaterialAlertDialogBuilder(context)\n            .setMessage(R.string.dialog_redraft_post_warning)\n            .setPositiveButton(android.R.string.ok) { _: DialogInterface?, _: Int ->\n                viewLifecycleOwner.lifecycleScope.launch {\n                    timelineCases.delete(id, false).fold(\n                        { deletedStatus ->\n                            removeItem(position)\n                            val sourceStatus = if (deletedStatus.isEmpty) {\n                                status.toDeletedStatus()\n                            } else {\n                                deletedStatus\n                            }\n                            val composeOptions = ComposeOptions(\n                                content = sourceStatus.text,\n                                inReplyToId = sourceStatus.inReplyToId,\n                                visibility = sourceStatus.visibility,\n                                contentWarning = sourceStatus.spoilerText,\n                                mediaAttachments = sourceStatus.attachments,\n                                sensitive = sourceStatus.sensitive,\n                                modifiedInitialState = true,\n                                language = sourceStatus.language,\n                                poll = sourceStatus.poll?.toNewPoll(sourceStatus.createdAt),\n                                kind = ComposeActivity.ComposeKind.NEW\n                            )\n                            startActivity(startIntent(context, composeOptions))\n                        },\n                        { error: Throwable? ->\n                            Log.w(\"SFragment\", \"error deleting status\", error)\n                            Toast.makeText(context, R.string.error_generic, Toast.LENGTH_SHORT)\n                                .show()\n                        }\n                    )\n                }\n            }\n            .setNegativeButton(android.R.string.cancel, null)\n            .show()\n    }\n\n    private fun editStatus(id: String, status: Status) {\n        viewLifecycleOwner.lifecycleScope.launch {\n            mastodonApi.statusSource(id).fold(\n                { source ->\n                    val composeOptions = ComposeOptions(\n                        content = source.text,\n                        inReplyToId = status.inReplyToId,\n                        visibility = status.visibility,\n                        contentWarning = source.spoilerText,\n                        mediaAttachments = status.attachments,\n                        sensitive = status.sensitive,\n                        language = status.language,\n                        statusId = source.id,\n                        poll = status.poll?.toNewPoll(status.createdAt),\n                        kind = ComposeActivity.ComposeKind.EDIT_POSTED\n                    )\n                    startActivity(startIntent(requireContext(), composeOptions))\n                },\n                {\n                    Snackbar.make(\n                        requireView(),\n                        getString(R.string.error_status_source_load),\n                        Snackbar.LENGTH_SHORT\n                    ).show()\n                }\n            )\n        }\n    }\n\n    private fun showOpenAsDialog(statusUrl: String?, dialogTitle: CharSequence?) {\n        if (statusUrl == null) {\n            return\n        }\n\n        (activity as BaseActivity).apply {\n            showAccountChooserDialog(\n                dialogTitle,\n                false,\n                object : AccountSelectionListener {\n                    override fun onAccountSelected(account: AccountEntity) {\n                        openAsAccount(statusUrl, account)\n                    }\n                }\n            )\n        }\n    }\n\n    private fun downloadAllMedia(mediaUrls: List<String>) {\n        Toast.makeText(context, R.string.downloading_media, Toast.LENGTH_SHORT).show()\n        val downloadManager: DownloadManager = requireContext().getSystemService()!!\n\n        for (url in mediaUrls) {\n            val uri = url.toUri()\n            downloadManager.enqueue(\n                DownloadManager.Request(uri).apply {\n                    setDestinationInExternalPublicDir(\n                        Environment.DIRECTORY_DOWNLOADS,\n                        uri.lastPathSegment\n                    )\n                }\n            )\n        }\n    }\n\n    private fun requestDownloadAllMedia(status: Status) {\n        if (status.attachments.isEmpty()) {\n            return\n        }\n        val mediaUrls = status.attachments.map { it.url }\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {\n            pendingMediaDownloads = mediaUrls\n            downloadAllMediaPermissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)\n        } else {\n            downloadAllMedia(mediaUrls)\n        }\n    }\n\n    companion object {\n        private const val PENDING_MEDIA_DOWNLOADS_STATE_KEY = \"pending_media_downloads\"\n\n        private fun accountIsInMentions(\n            account: AccountEntity?,\n            mentions: List<Status.Mention>\n        ): Boolean {\n            return mentions.any { mention ->\n                account?.username == mention.username && account.domain == mention.url.toUri().host\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/fragment/ViewImageFragment.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.fragment\n\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport android.annotation.SuppressLint\nimport android.graphics.PointF\nimport android.graphics.drawable.Drawable\nimport android.os.Bundle\nimport android.view.GestureDetector\nimport android.view.LayoutInflater\nimport android.view.MotionEvent\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.ImageView\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat.Type.displayCutout\nimport androidx.core.view.WindowInsetsCompat.Type.systemBars\nimport androidx.core.view.updatePadding\nimport androidx.lifecycle.lifecycleScope\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.load.DataSource\nimport com.bumptech.glide.load.engine.GlideException\nimport com.bumptech.glide.request.RequestListener\nimport com.bumptech.glide.request.target.Target\nimport com.google.android.material.bottomsheet.BottomSheetBehavior\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.FragmentViewImageBinding\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.util.getParcelableCompat\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.util.visible\nimport com.ortiz.touchview.OnTouchCoordinatesListener\nimport com.ortiz.touchview.TouchImageView\nimport kotlin.math.abs\nimport kotlinx.coroutines.CompletableDeferred\nimport kotlinx.coroutines.launch\n\nclass ViewImageFragment : ViewMediaFragment() {\n    interface PhotoActionsListener {\n        fun onBringUp()\n        fun onDismiss()\n        fun onPhotoTap()\n    }\n\n    private val binding by viewBinding(FragmentViewImageBinding::bind)\n\n    private val photoActionsListener: PhotoActionsListener\n        get() = requireActivity() as PhotoActionsListener\n    private var transition: CompletableDeferred<Unit>? = null\n    private var shouldStartTransition = false\n\n    // Volatile: Image requests happen on background thread and we want to see updates to it\n    // immediately on another thread. Atomic is an overkill for such thing.\n    @Volatile\n    private var startedTransition = false\n\n    override fun setupMediaView(\n        url: String,\n        previewUrl: String?,\n        description: String?,\n        showingDescription: Boolean\n    ) {\n        binding.photoView.transitionName = url\n        binding.mediaDescription.text = description\n        binding.captionSheet.visible(showingDescription)\n\n        startedTransition = false\n        loadImageFromNetwork(url, previewUrl, binding.photoView)\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        this.transition = CompletableDeferred()\n        return inflater.inflate(R.layout.fragment_view_image, container, false)\n    }\n\n    @SuppressLint(\"ClickableViewAccessibility\")\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        val arguments = requireArguments()\n        val attachment = arguments.getParcelableCompat<Attachment>(ARG_ATTACHMENT)\n        this.shouldStartTransition = arguments.getBoolean(ARG_START_POSTPONED_TRANSITION)\n        val url: String?\n        var description: String? = null\n\n        if (attachment != null) {\n            url = attachment.url\n            description = attachment.description\n        } else {\n            url = arguments.getString(ARG_SINGLE_IMAGE_URL)\n            if (url == null) {\n                throw IllegalArgumentException(\"attachment or image url has to be set\")\n            }\n        }\n\n        val descriptionBottomSheet = BottomSheetBehavior.from(binding.captionSheet)\n\n        ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets ->\n            val topInsets = insets.getInsets(displayCutout()).top\n            val bottomInsets = insets.getInsets(systemBars()).bottom\n            val mediaDescriptionBottomPadding = requireContext().resources.getDimensionPixelSize(R.dimen.media_description_sheet_bottom_padding)\n            val mediaDescriptionPeekHeight = requireContext().resources.getDimensionPixelSize(R.dimen.media_description_sheet_peek_height)\n            binding.mediaDescription.updatePadding(bottom = mediaDescriptionBottomPadding + bottomInsets)\n            descriptionBottomSheet.setPeekHeight(mediaDescriptionPeekHeight + bottomInsets, false)\n            binding.photoView.updatePadding(\n                top = topInsets,\n                bottom = bottomInsets\n            )\n            binding.photoView.invalidate()\n            insets.inset(0, topInsets, 0, bottomInsets)\n        }\n\n        val singleTapDetector = GestureDetector(\n            requireContext(),\n            object : GestureDetector.SimpleOnGestureListener() {\n                override fun onDown(e: MotionEvent) = true\n                override fun onSingleTapConfirmed(e: MotionEvent): Boolean {\n                    if (isAdded) {\n                        photoActionsListener.onPhotoTap()\n                    }\n                    return false\n                }\n            }\n        )\n\n        binding.photoView.setOnTouchCoordinatesListener(object : OnTouchCoordinatesListener {\n            /** Y coordinate of the last single-finger drag */\n            var lastDragY: Float? = null\n\n            override fun onTouchCoordinate(view: View, event: MotionEvent, bitmapPoint: PointF) {\n                singleTapDetector.onTouchEvent(event)\n\n                // Two fingers have gone down after a single finger drag. Finish the drag\n                if (event.pointerCount == 2 && lastDragY != null) {\n                    onGestureEnd(view)\n                    lastDragY = null\n                }\n\n                // Stop the parent view from handling touches if either (a) the user has 2+\n                // fingers on the screen, or (b) the image has been zoomed in, and can be scrolled\n                // horizontally in both directions.\n                //\n                // This stops things like ViewPager2 from trying to intercept a left/right swipe\n                // and ensures that the image does not appear to \"stick\" to the screen as different\n                // views fight over who should be handling the swipe.\n                //\n                // If the view can be scrolled in one direction it's OK to let the parent intercept,\n                // which allows the user to swipe between images even if one or more of them have\n                // been zoomed in.\n                if (event.pointerCount >= 2 || view.canScrollHorizontally(1) && view.canScrollHorizontally(-1)) {\n                    when (event.action) {\n                        MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE -> {\n                            view.parent.requestDisallowInterceptTouchEvent(true)\n                        }\n\n                        MotionEvent.ACTION_UP -> {\n                            view.parent.requestDisallowInterceptTouchEvent(false)\n                        }\n                    }\n                    return\n                }\n\n                // The user is dragging the image around\n                if (event.pointerCount == 1) {\n                    // If the image is zoomed then the swipe-to-dismiss functionality is disabled\n                    if ((view as TouchImageView).isZoomed) return\n\n                    // The user's finger just went down, start recording where they are dragging from\n                    if (event.action == MotionEvent.ACTION_DOWN) {\n                        lastDragY = event.rawY\n                        return\n                    }\n\n                    // The user is dragging the un-zoomed image to possibly fling it up or down\n                    // to dismiss.\n                    if (event.action == MotionEvent.ACTION_MOVE) {\n                        // lastDragY may be null; e.g., the user was performing a two-finger drag,\n                        // and has lifted one finger. In this case do nothing\n                        lastDragY ?: return\n\n                        // Compute the Y offset of the drag, and scale/translate the photoview\n                        // accordingly.\n                        val diff = event.rawY - lastDragY!!\n                        if (view.translationY != 0f || abs(diff) > 40) {\n                            // Drag has definitely started, stop the parent from interfering\n                            view.parent.requestDisallowInterceptTouchEvent(true)\n                            view.translationY += diff\n                            val scale = (-abs(view.translationY) / 720 + 1).coerceAtLeast(0.5f)\n                            view.scaleY = scale\n                            view.scaleX = scale\n                            lastDragY = event.rawY\n                        }\n                        return\n                    }\n\n                    // The user has finished dragging. Allow the parent to handle touch events if\n                    // appropriate, and end the gesture.\n                    if (event.action == MotionEvent.ACTION_UP || event.action == MotionEvent.ACTION_CANCEL) {\n                        view.parent.requestDisallowInterceptTouchEvent(false)\n                        if (lastDragY != null) onGestureEnd(view)\n                        lastDragY = null\n                        return\n                    }\n                }\n            }\n\n            /**\n             * Handle the end of the user's gesture.\n             *\n             * If the user was previously dragging, and the image has been dragged a sufficient\n             * distance then we are done. Otherwise, animate the image back to its starting position.\n             */\n            private fun onGestureEnd(view: View) {\n                if (abs(view.translationY) > 180) {\n                    photoActionsListener.onDismiss()\n                } else {\n                    view.animate().translationY(0f).scaleX(1f).scaleY(1f).start()\n                }\n            }\n        })\n\n        finalizeViewSetup(url, attachment?.previewUrl, description)\n    }\n\n    override fun onToolbarVisibilityChange(visible: Boolean) {\n        if (view == null) return\n\n        isDescriptionVisible = showingDescription && visible\n        val alpha = if (isDescriptionVisible) 1.0f else 0.0f\n        binding.captionSheet.animate().alpha(alpha)\n            .setListener(object : AnimatorListenerAdapter() {\n                override fun onAnimationEnd(animation: Animator) {\n                    view ?: return\n                    binding.captionSheet.visible(isDescriptionVisible)\n                    animation.removeListener(this)\n                }\n            })\n            .start()\n    }\n\n    override fun onDestroyView() {\n        transition = null\n        super.onDestroyView()\n    }\n\n    private fun loadImageFromNetwork(url: String, previewUrl: String?, photoView: ImageView) {\n        val glide = Glide.with(this)\n        // Request image from the any cache\n        glide\n            .load(url)\n            .dontAnimate()\n            .onlyRetrieveFromCache(true)\n            .let {\n                if (previewUrl != null) {\n                    it.thumbnail(\n                        glide\n                            .load(previewUrl)\n                            .dontAnimate()\n                            .onlyRetrieveFromCache(true)\n                            .centerInside()\n                            .addListener(ImageRequestListener(true, isThumbnailRequest = true))\n                    )\n                } else {\n                    it\n                }\n            }\n            // Request image from the network on fail load image from cache\n            .error(\n                glide.load(url)\n                    .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)\n                    .centerInside()\n                    .addListener(ImageRequestListener(false, isThumbnailRequest = false))\n            )\n            .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)\n            .centerInside()\n            .addListener(ImageRequestListener(true, isThumbnailRequest = false))\n            .into(photoView)\n    }\n\n    /**\n     * We start transition as soon as we think reasonable but we must take care about couple of\n     * things>\n     *  - Do not change image in the middle of transition. It messes up the view.\n     *  - Do not transition for the views which don't require it. Starting transition from\n     *      multiple fragments does weird things\n     *  - Do not wait to transition until the image loads from network\n     *\n     * Preview, cached image, network image, x - failed, o - succeeded\n     * P C N - start transition after...\n     * x x x - the cache fails\n     * x x o - the cache fails\n     * x o o - the cache succeeds\n     * o x o - the preview succeeds. Do not start on cache.\n     * o o o - the preview succeeds. Do not start on cache.\n     *\n     * So start transition after the first success or after anything with the cache\n     *\n     * @param isCacheRequest - is this listener for request image from cache or from the network\n     */\n    private inner class ImageRequestListener(\n        private val isCacheRequest: Boolean,\n        private val isThumbnailRequest: Boolean\n    ) : RequestListener<Drawable> {\n\n        override fun onLoadFailed(\n            e: GlideException?,\n            model: Any?,\n            target: Target<Drawable>,\n            isFirstResource: Boolean\n        ): Boolean {\n            // If cache for full image failed complete transition\n            if (isCacheRequest && !isThumbnailRequest && shouldStartTransition &&\n                !startedTransition\n            ) {\n                photoActionsListener.onBringUp()\n            }\n            // Hide progress bar only on fail request from internet\n            if (!isCacheRequest) binding.progressBar.hide()\n            // We don't want to overwrite preview with null when main image fails to load\n            return !isCacheRequest\n        }\n\n        @SuppressLint(\"CheckResult\")\n        override fun onResourceReady(\n            resource: Drawable,\n            model: Any,\n            target: Target<Drawable>,\n            dataSource: DataSource,\n            isFirstResource: Boolean\n        ): Boolean {\n            binding.progressBar.hide() // Always hide the progress bar on success\n\n            if (!startedTransition || !shouldStartTransition) {\n                // Set this right away so that we don't have to concurrent post() requests\n                startedTransition = true\n                // post() because load() replaces image with null. Sometimes after we set\n                // the thumbnail.\n                binding.photoView.post {\n                    if (isAdded) {\n                        target.onResourceReady(resource, null)\n                        if (shouldStartTransition) photoActionsListener.onBringUp()\n                    }\n                }\n            } else {\n                // This waits for transition. If there's no transition then we should hit\n                // another branch. When the view is destroyed the coroutine is automatically canceled.\n                transition?.let {\n                    viewLifecycleOwner.lifecycleScope.launch {\n                        it.await()\n                        target.onResourceReady(resource, null)\n                    }\n                }\n            }\n            return true\n        }\n    }\n\n    override fun onTransitionEnd() {\n        this.transition?.complete(Unit)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/fragment/ViewMediaFragment.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.fragment\n\nimport android.os.Bundle\nimport android.text.TextUtils\nimport androidx.fragment.app.Fragment\nimport com.keylesspalace.tusky.ViewMediaActivity\nimport com.keylesspalace.tusky.entity.Attachment\n\nabstract class ViewMediaFragment : Fragment() {\n    private var toolbarVisibilityDisposable: Function0<Boolean>? = null\n\n    abstract fun setupMediaView(\n        url: String,\n        previewUrl: String?,\n        description: String?,\n        showingDescription: Boolean\n    )\n\n    abstract fun onToolbarVisibilityChange(visible: Boolean)\n\n    protected var showingDescription = false\n    protected var isDescriptionVisible = false\n\n    companion object {\n        @JvmStatic\n        protected val ARG_START_POSTPONED_TRANSITION = \"startPostponedTransition\"\n\n        @JvmStatic\n        protected val ARG_ATTACHMENT = \"attach\"\n\n        @JvmStatic\n        protected val ARG_SINGLE_IMAGE_URL = \"singleImageUrl\"\n\n        @JvmStatic\n        fun newInstance(\n            attachment: Attachment,\n            shouldStartPostponedTransition: Boolean\n        ): ViewMediaFragment {\n            val arguments = Bundle(2)\n            arguments.putParcelable(ARG_ATTACHMENT, attachment)\n            arguments.putBoolean(ARG_START_POSTPONED_TRANSITION, shouldStartPostponedTransition)\n\n            val fragment = when (attachment.type) {\n                Attachment.Type.IMAGE -> ViewImageFragment()\n                Attachment.Type.VIDEO,\n                Attachment.Type.GIFV,\n                Attachment.Type.AUDIO -> ViewVideoFragment()\n                else -> ViewImageFragment() // it probably won't show anything, but its better than crashing\n            }\n            fragment.arguments = arguments\n            return fragment\n        }\n\n        @JvmStatic\n        fun newSingleImageInstance(imageUrl: String): ViewMediaFragment {\n            val arguments = Bundle(2)\n            val fragment = ViewImageFragment()\n            arguments.putString(ARG_SINGLE_IMAGE_URL, imageUrl)\n            arguments.putBoolean(ARG_START_POSTPONED_TRANSITION, true)\n\n            fragment.arguments = arguments\n            return fragment\n        }\n    }\n\n    abstract fun onTransitionEnd()\n\n    protected fun finalizeViewSetup(url: String, previewUrl: String?, description: String?) {\n        val mediaActivity = activity as ViewMediaActivity\n\n        showingDescription = !TextUtils.isEmpty(description)\n        isDescriptionVisible = showingDescription\n        setupMediaView(\n            url,\n            previewUrl,\n            description,\n            showingDescription && mediaActivity.isToolbarVisible\n        )\n\n        toolbarVisibilityDisposable = (activity as ViewMediaActivity)\n            .addToolbarVisibilityListener { isVisible ->\n                onToolbarVisibilityChange(isVisible)\n            }\n    }\n\n    override fun onDestroyView() {\n        toolbarVisibilityDisposable?.invoke()\n        toolbarVisibilityDisposable = null\n        super.onDestroyView()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/fragment/ViewVideoFragment.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.fragment\n\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport android.annotation.SuppressLint\nimport android.graphics.drawable.Drawable\nimport android.os.Bundle\nimport android.os.Handler\nimport android.os.Looper\nimport android.view.GestureDetector\nimport android.view.Gravity\nimport android.view.LayoutInflater\nimport android.view.MotionEvent\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.FrameLayout\nimport android.widget.LinearLayout\nimport androidx.annotation.OptIn\nimport androidx.constraintlayout.widget.ConstraintLayout\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat.Type.systemBars\nimport androidx.core.view.updateLayoutParams\nimport androidx.core.view.updatePadding\nimport androidx.lifecycle.DefaultLifecycleObserver\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.media3.common.AudioAttributes\nimport androidx.media3.common.C\nimport androidx.media3.common.MediaItem\nimport androidx.media3.common.PlaybackException\nimport androidx.media3.common.Player\nimport androidx.media3.common.util.UnstableApi\nimport androidx.media3.exoplayer.ExoPlayer\nimport androidx.media3.exoplayer.util.EventLogger\nimport androidx.media3.ui.AspectRatioFrameLayout\nimport androidx.media3.ui.PlayerView\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.request.target.CustomViewTarget\nimport com.bumptech.glide.request.transition.Transition\nimport com.google.android.material.snackbar.Snackbar\nimport com.keylesspalace.tusky.BuildConfig\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.ViewMediaActivity\nimport com.keylesspalace.tusky.databinding.FragmentViewVideoBinding\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.util.getParcelableCompat\nimport com.keylesspalace.tusky.util.unsafeLazy\nimport com.keylesspalace.tusky.util.viewBinding\nimport com.keylesspalace.tusky.util.visible\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport javax.inject.Provider\nimport kotlin.math.abs\n\n@AndroidEntryPoint\n@OptIn(UnstableApi::class)\nclass ViewVideoFragment : ViewMediaFragment() {\n    interface VideoActionsListener {\n        fun onDismiss()\n    }\n\n    @Inject\n    lateinit var playerProvider: Provider<ExoPlayer>\n\n    private val binding by viewBinding(FragmentViewVideoBinding::bind)\n\n    private val videoActionsListener: VideoActionsListener\n        get() = requireActivity() as VideoActionsListener\n    private val handler = Handler(Looper.getMainLooper())\n    private val hideToolbar = Runnable {\n        // Hoist toolbar hiding to activity so it can track state across different fragments\n        // This is explicitly stored as runnable so that we pass it to the handler later for cancellation\n        mediaActivity.onPhotoTap()\n    }\n    private val mediaActivity: ViewMediaActivity\n        get() = requireActivity() as ViewMediaActivity\n    private val isAudio\n        get() = mediaAttachment.type == Attachment.Type.AUDIO\n\n    private val mediaAttachment: Attachment by unsafeLazy {\n        arguments?.getParcelableCompat<Attachment>(ARG_ATTACHMENT)\n            ?: throw IllegalArgumentException(\"attachment has to be set\")\n    }\n\n    private var player: ExoPlayer? = null\n\n    /** The saved seek position, if the fragment is being resumed */\n    private var savedSeekPosition: Long = 0\n\n    /** Have we received at least one \"READY\" event? */\n    private var haveStarted = false\n\n    /** Is there a pending autohide? (We can't rely on Android's tracking because that clears on suspend.) */\n    private var pendingHideToolbar = false\n\n    /** Prevent the next play start from queueing a toolbar hide. */\n    private var suppressNextHideToolbar = false\n\n    @SuppressLint(\"PrivateResource\", \"MissingInflatedId\")\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        val rootView = inflater.inflate(R.layout.fragment_view_video, container, false)\n\n        // Move the controls to the bottom of the screen, with enough bottom margin to clear the seekbar\n        val controls = rootView.findViewById<LinearLayout>(\n            androidx.media3.ui.R.id.exo_center_controls\n        )\n        val layoutParams = controls.layoutParams as FrameLayout.LayoutParams\n        layoutParams.gravity = Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM\n        layoutParams.bottomMargin = rootView.context.resources.getDimension(androidx.media3.ui.R.dimen.exo_styled_bottom_bar_height)\n            .toInt()\n        controls.layoutParams = layoutParams\n\n        return rootView\n    }\n\n    @SuppressLint(\"ClickableViewAccessibility\")\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        ViewCompat.setOnApplyWindowInsetsListener(binding.mediaDescriptionScrollView) { captionSheet, insets ->\n            val systemBarInsets = insets.getInsets(systemBars())\n            captionSheet.updatePadding(bottom = systemBarInsets.bottom)\n            binding.videoView.updateLayoutParams<ConstraintLayout.LayoutParams> {\n                bottomMargin = systemBarInsets.bottom\n            }\n\n            insets.inset(0, 0, 0, systemBarInsets.bottom)\n        }\n\n        /**\n         * Handle single taps, flings, and dragging\n         */\n        val touchListener = object : View.OnTouchListener {\n            var lastY = 0f\n\n            /** The view that contains the playing content */\n            // binding.videoView is fullscreen, and includes the controls, so don't use that\n            // when scaling in response to the user dragging on the screen\n            val contentFrame = binding.videoView.findViewById<AspectRatioFrameLayout>(\n                androidx.media3.ui.R.id.exo_content_frame\n            )\n\n            /** Handle taps and flings */\n            val simpleGestureDetector = GestureDetector(\n                requireContext(),\n                object : GestureDetector.SimpleOnGestureListener() {\n                    override fun onDown(e: MotionEvent) = true\n\n                    /** A single tap should show/hide the media description */\n                    override fun onSingleTapUp(e: MotionEvent): Boolean {\n                        mediaActivity.onPhotoTap()\n                        return true // Do not pass gestures through to media3\n                    }\n\n                    /** A fling up/down should dismiss the fragment */\n                    override fun onFling(\n                        e1: MotionEvent?,\n                        e2: MotionEvent,\n                        velocityX: Float,\n                        velocityY: Float\n                    ): Boolean {\n                        if (abs(velocityY) > abs(velocityX)) {\n                            videoActionsListener.onDismiss()\n                            return true\n                        }\n                        return true // Do not pass gestures through to media3\n                    }\n                }\n            )\n\n            @SuppressLint(\"ClickableViewAccessibility\")\n            override fun onTouch(v: View?, event: MotionEvent): Boolean {\n                // Track movement, and scale / translate the video display accordingly\n                if (event.action == MotionEvent.ACTION_DOWN) {\n                    lastY = event.rawY\n                } else if (event.pointerCount == 1 && event.action == MotionEvent.ACTION_MOVE) {\n                    val diff = event.rawY - lastY\n                    if (contentFrame.translationY != 0f || abs(diff) > 40) {\n                        contentFrame.translationY += diff\n                        val scale = (-abs(contentFrame.translationY) / 720 + 1).coerceAtLeast(0.5f)\n                        contentFrame.scaleY = scale\n                        contentFrame.scaleX = scale\n                        lastY = event.rawY\n                    }\n                } else if (event.action == MotionEvent.ACTION_UP || event.action == MotionEvent.ACTION_CANCEL) {\n                    if (abs(contentFrame.translationY) > 180) {\n                        videoActionsListener.onDismiss()\n                    } else {\n                        contentFrame.animate().translationY(0f).scaleX(1f).scaleY(1f).start()\n                    }\n                }\n\n                simpleGestureDetector.onTouchEvent(event)\n\n                // Do not pass gestures through to media3\n                // We have to do this because otherwise taps to hide will be double-handled and media3 will re-show itself\n                // media3 has a property to disable \"hide on tap\" but \"show on tap\" is unconditional\n                return true\n            }\n        }\n\n        val mediaPlayerListener = object : Player.Listener {\n            @SuppressLint(\"ClickableViewAccessibility\", \"SyntheticAccessor\")\n            @OptIn(UnstableApi::class)\n            override fun onPlaybackStateChanged(playbackState: Int) {\n                when (playbackState) {\n                    Player.STATE_READY -> {\n                        if (!haveStarted) {\n                            // Wait until the media is loaded before accepting taps as we don't want toolbar to\n                            // be hidden until then.\n                            binding.videoView.setOnTouchListener(touchListener)\n\n                            binding.progressBar.hide()\n                            binding.videoView.useController = true\n                            binding.videoView.showController()\n                            haveStarted = true\n                        } else {\n                            // This isn't a real \"done loading\"; this is a resume event after backgrounding.\n                            if (mediaActivity.isToolbarVisible) {\n                                // Before suspend, the toolbar/description were visible, so description is visible already.\n                                // But media3 will have automatically hidden the video controls on suspend, so we need to match the description state.\n                                binding.videoView.showController()\n                                if (!pendingHideToolbar) {\n                                    suppressNextHideToolbar = true // The user most recently asked us to show the toolbar, so don't hide it when play starts.\n                                }\n                            } else {\n                                mediaActivity.onPhotoTap()\n                            }\n                        }\n                    }\n                    else -> { /* do nothing */ }\n                }\n            }\n\n            override fun onIsPlayingChanged(isPlaying: Boolean) {\n                if (isAudio) return\n                if (isPlaying) {\n                    if (suppressNextHideToolbar) {\n                        suppressNextHideToolbar = false\n                    } else {\n                        hideToolbarAfterDelay(TOOLBAR_HIDE_DELAY_MS)\n                    }\n                } else {\n                    handler.removeCallbacks(hideToolbar)\n                }\n            }\n\n            @SuppressLint(\"SyntheticAccessor\")\n            override fun onPlayerError(error: PlaybackException) {\n                binding.progressBar.hide()\n                val message = getString(\n                    R.string.error_media_playback,\n                    error.cause?.message ?: error.message\n                )\n                Snackbar.make(binding.root, message, Snackbar.LENGTH_INDEFINITE)\n                    .setTextMaxLines(10)\n                    .setAction(R.string.action_retry) { player?.prepare() }\n                    .show()\n            }\n        }\n\n        savedSeekPosition = savedInstanceState?.getLong(SEEK_POSITION) ?: 0\n\n        val attachment = mediaAttachment\n        finalizeViewSetup(attachment.url, attachment.previewUrl, attachment.description)\n\n        // Lifecycle callbacks\n        viewLifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver {\n            override fun onStart(owner: LifecycleOwner) {\n                initializePlayer(mediaPlayerListener)\n                binding.videoView.onResume()\n            }\n\n            override fun onStop(owner: LifecycleOwner) {\n                // This might be multi-window, so pause everything now.\n                binding.videoView.onPause()\n                releasePlayer()\n                handler.removeCallbacks(hideToolbar)\n            }\n        })\n    }\n\n    override fun onSaveInstanceState(outState: Bundle) {\n        super.onSaveInstanceState(outState)\n        outState.putLong(SEEK_POSITION, savedSeekPosition)\n    }\n\n    private fun initializePlayer(mediaPlayerListener: Player.Listener) {\n        player = playerProvider.get().apply {\n            setAudioAttributes(\n                AudioAttributes.Builder()\n                    .setContentType(if (isAudio) C.AUDIO_CONTENT_TYPE_UNKNOWN else C.AUDIO_CONTENT_TYPE_MOVIE)\n                    .setUsage(C.USAGE_MEDIA)\n                    .build(),\n                true\n            )\n            if (BuildConfig.DEBUG) addAnalyticsListener(EventLogger(\"$TAG:ExoPlayer\"))\n            setMediaItem(MediaItem.fromUri(mediaAttachment.url))\n            addListener(mediaPlayerListener)\n            repeatMode = Player.REPEAT_MODE_ONE\n            playWhenReady = true\n            seekTo(savedSeekPosition)\n            prepare()\n        }\n\n        binding.videoView.player = player\n\n        // Audio-only files might have a preview image. If they do, set it as the artwork\n        if (isAudio) {\n            mediaAttachment.previewUrl?.let { url ->\n                Glide.with(this)\n                    .load(url)\n                    .into(\n                        object : CustomViewTarget<PlayerView, Drawable>(binding.videoView) {\n                            override fun onLoadFailed(errorDrawable: Drawable?) {\n                                // Don't do anything\n                            }\n\n                            override fun onResourceCleared(placeholder: Drawable?) {\n                                view.defaultArtwork = null\n                            }\n\n                            override fun onResourceReady(\n                                resource: Drawable,\n                                transition: Transition<in Drawable>?\n                            ) {\n                                view.defaultArtwork = resource\n                            }\n                        }.clearOnDetach()\n                    )\n            }\n        }\n    }\n\n    private fun releasePlayer() {\n        player?.let {\n            savedSeekPosition = it.currentPosition\n            it.release()\n            player = null\n            binding.videoView.player = null\n        }\n    }\n\n    @SuppressLint(\"ClickableViewAccessibility\")\n    override fun setupMediaView(\n        url: String,\n        previewUrl: String?,\n        description: String?,\n        showingDescription: Boolean\n    ) {\n        binding.mediaDescriptionTextView.text = description\n        binding.mediaDescriptionScrollView.visible(showingDescription)\n\n        // Ensure the description is visible over the video\n        binding.mediaDescriptionScrollView.elevation = binding.videoView.elevation + 1\n\n        binding.videoView.transitionName = url\n\n        binding.videoView.requestFocus()\n\n        if (requireArguments().getBoolean(ARG_START_POSTPONED_TRANSITION)) {\n            mediaActivity.onBringUp()\n        }\n    }\n\n    private fun hideToolbarAfterDelay(delayMilliseconds: Int) {\n        pendingHideToolbar = true\n        handler.postDelayed(hideToolbar, delayMilliseconds.toLong())\n    }\n\n    override fun onToolbarVisibilityChange(visible: Boolean) {\n        if (view == null) {\n            return\n        }\n\n        isDescriptionVisible = showingDescription && visible\n        val alpha = if (isDescriptionVisible) 1.0f else 0.0f\n        if (isDescriptionVisible) {\n            // If to be visible, need to make visible immediately and animate alpha\n            binding.mediaDescriptionScrollView.alpha = 0.0f\n            binding.mediaDescriptionScrollView.visible(isDescriptionVisible)\n        }\n\n        binding.mediaDescriptionScrollView.animate().alpha(alpha)\n            .setListener(object : AnimatorListenerAdapter() {\n                @SuppressLint(\"SyntheticAccessor\")\n                override fun onAnimationEnd(animation: Animator) {\n                    view ?: return\n                    binding.mediaDescriptionScrollView.visible(isDescriptionVisible)\n                    animation.removeListener(this)\n                }\n            })\n            .start()\n\n        // media3 controls bar\n        if (visible) {\n            binding.videoView.showController()\n        } else {\n            binding.videoView.hideController()\n        }\n\n        // Either the user just requested toolbar display, or we just hid it.\n        // Either way, any pending hides are no longer appropriate.\n        pendingHideToolbar = false\n        handler.removeCallbacks(hideToolbar)\n    }\n\n    override fun onTransitionEnd() { }\n\n    companion object {\n        private const val TAG = \"ViewVideoFragment\"\n        private const val TOOLBAR_HIDE_DELAY_MS = 4_000\n        private const val SEEK_POSITION = \"seekPosition\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/interfaces/AccountActionListener.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\npackage com.keylesspalace.tusky.interfaces\n\ninterface AccountActionListener {\n    fun onViewAccount(id: String)\n    fun onMute(mute: Boolean, id: String, position: Int, notifications: Boolean)\n    fun onBlock(block: Boolean, id: String, position: Int)\n    fun onRespondToFollowRequest(accept: Boolean, accountIdRequestingFollow: String, position: Int)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/interfaces/AccountSelectionListener.kt",
    "content": "/* Copyright 2019 Levi Bard\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.interfaces\n\nimport com.keylesspalace.tusky.db.entity.AccountEntity\n\ninterface AccountSelectionListener {\n    fun onAccountSelected(account: AccountEntity)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/interfaces/ActionButtonActivity.java",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.interfaces;\n\nimport androidx.annotation.Nullable;\nimport com.google.android.material.floatingactionbutton.FloatingActionButton;\n\npublic interface ActionButtonActivity {\n\n    /* return the ActionButton of the Activity to hide or show it on scroll */\n    @Nullable\n    FloatingActionButton getActionButton();\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/interfaces/HashtagActionListener.kt",
    "content": "package com.keylesspalace.tusky.interfaces\n\ninterface HashtagActionListener {\n    fun unfollow(tagName: String, position: Int)\n    fun viewTag(tagName: String)\n    fun copyTagName(tagName: String)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/interfaces/LinkListener.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.interfaces\n\ninterface LinkListener {\n    fun onViewTag(tag: String)\n    fun onViewAccount(id: String)\n    fun onViewUrl(url: String)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/interfaces/RefreshableFragment.kt",
    "content": "package com.keylesspalace.tusky.interfaces\n\n/**\n * Created by pandasoft (joelpyska1@gmail.com) on 04/04/2019.\n */\ninterface RefreshableFragment {\n    /**\n     * Call this method to refresh fragment content\n     */\n    fun refreshContent()\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/interfaces/ReselectableFragment.kt",
    "content": "package com.keylesspalace.tusky.interfaces\n\n/**\n * Created by pandasoft (joelpyska1@gmail.com) on 04/04/2019.\n */\ninterface ReselectableFragment {\n    /**\n     * Call this method when tab reselected\n     */\n    fun onReselect()\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/interfaces/StatusActionListener.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\npackage com.keylesspalace.tusky.interfaces\n\nimport android.view.View\nimport at.connyduck.sparkbutton.SparkButton\nimport com.keylesspalace.tusky.entity.Status\n\ninterface StatusActionListener : LinkListener {\n    fun onReply(position: Int)\n\n    /**\n     * Reblog the post at [position]\n     * @param visibility The visibility to use for the reblog, if the user has already chosen it, null otherwise\n     * @param button Optional button to animate\n     */\n    fun onReblog(reblog: Boolean, position: Int, visibility: Status.Visibility?, button: SparkButton? = null)\n\n    /**\n     * Favourite the post at [position]\n     * @param button Optional button to animate\n     */\n    fun onFavourite(favourite: Boolean, position: Int, button: SparkButton? = null)\n    fun onBookmark(bookmark: Boolean, position: Int)\n    fun onMore(view: View, position: Int)\n    fun onViewMedia(position: Int, attachmentIndex: Int, view: View?)\n    fun onViewThread(position: Int)\n\n    /**\n     * Open reblog author for the status.\n     * @param position At which position in the list status is located\n     */\n    fun onOpenReblog(position: Int)\n    fun onExpandedChange(expanded: Boolean, position: Int)\n    fun onContentHiddenChange(isShowing: Boolean, position: Int)\n    fun onLoadMore(position: Int)\n\n    /**\n     * Called when the status [android.widget.ToggleButton] responsible for collapsing long\n     * status content is interacted with.\n     *\n     * @param isCollapsed Whether the status content is shown in a collapsed state or fully.\n     * @param position    The position of the status in the list.\n     */\n    fun onContentCollapsedChange(isCollapsed: Boolean, position: Int)\n\n    /**\n     * called when the reblog count has been clicked\n     * @param position The position of the status in the list.\n     */\n    fun onShowReblogs(position: Int) {}\n\n    /**\n     * called when the favourite count has been clicked\n     * @param position The position of the status in the list.\n     */\n    fun onShowFavs(position: Int) {}\n\n    fun onVoteInPoll(position: Int, choices: List<Int>)\n\n    fun onShowPollResults(position: Int)\n\n    fun onShowEdits(position: Int) {}\n\n    fun clearWarningAction(position: Int)\n\n    fun onUntranslate(position: Int)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/json/Guarded.kt",
    "content": "/*\n * Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.json\n\nimport com.squareup.moshi.JsonQualifier\n\n@Retention(AnnotationRetention.RUNTIME)\n@JsonQualifier\ninternal annotation class Guarded\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/json/GuardedAdapter.kt",
    "content": "/*\n * Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.json\n\nimport android.util.Log\nimport com.squareup.moshi.JsonAdapter\nimport com.squareup.moshi.JsonReader\nimport com.squareup.moshi.JsonWriter\nimport com.squareup.moshi.Moshi\nimport com.squareup.moshi.Types\nimport java.lang.reflect.Type\n\n/**\n * This adapter tries to parse the value using a delegated parser\n * and returns null in case of error.\n */\nclass GuardedAdapter<T> private constructor(\n    private val delegate: JsonAdapter<T>\n) : JsonAdapter<T>() {\n\n    override fun fromJson(reader: JsonReader): T? {\n        return try {\n            reader.peekJson().use { delegate.fromJson(it) }\n        } catch (e: Exception) {\n            Log.w(\"GuardedAdapter\", \"failed to read json\", e)\n            null\n        } finally {\n            reader.skipValue()\n        }\n    }\n\n    override fun toJson(writer: JsonWriter, value: T?) {\n        delegate.toJson(writer, value)\n    }\n\n    companion object {\n        val ANNOTATION_FACTORY = object : Factory {\n            override fun create(\n                type: Type,\n                annotations: Set<Annotation>,\n                moshi: Moshi\n            ): JsonAdapter<*>? {\n                val delegateAnnotations =\n                    Types.nextAnnotations(annotations, Guarded::class.java) ?: return null\n                val delegate = moshi.nextAdapter<Any?>(this, type, delegateAnnotations)\n                return GuardedAdapter(delegate)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/json/NotificationTypeAdapter.kt",
    "content": "/*\n * Copyright 2025 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.json\n\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.entity.notificationTypeFromString\nimport com.squareup.moshi.JsonAdapter\nimport com.squareup.moshi.JsonReader\nimport com.squareup.moshi.JsonWriter\n\nclass NotificationTypeAdapter : JsonAdapter<Notification.Type>() {\n\n    override fun fromJson(reader: JsonReader): Notification.Type {\n        return notificationTypeFromString(reader.nextString())\n    }\n\n    override fun toJson(writer: JsonWriter, value: Notification.Type?) {\n        writer.value(value?.name)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/network/ApiFactory.kt",
    "content": "package com.keylesspalace.tusky.network\n\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport okhttp3.OkHttpClient\nimport retrofit2.Retrofit\nimport retrofit2.create\n\n/**\n * Creates an instance of an Api that will only make requests as the provided account.\n * @param account The account to make requests as.\n * When null, request without additional DOMAIN_HEADER will fail.\n * @param httpClient The OkHttpClient to make requests as\n * @param retrofit The Retrofit instance to derive the api from\n * @param scheme The scheme to use. Only used in tests.\n * @param port The port to use. Only used in tests.\n */\ninline fun <reified T> apiForAccount(\n    account: AccountEntity?,\n    httpClient: OkHttpClient,\n    retrofit: Retrofit,\n    scheme: String = \"https://\",\n    port: Int? = null\n): T {\n    return retrofit.newBuilder()\n        .apply {\n            if (account != null) {\n                baseUrl(\"$scheme${account.domain}${ if (port == null) \"\" else \":$port\"}\")\n            }\n        }\n        .callFactory { originalRequest ->\n            var request = originalRequest\n\n            val domainHeader = originalRequest.header(MastodonApi.DOMAIN_HEADER)\n            if (domainHeader != null) {\n                request = originalRequest.newBuilder()\n                    .url(\n                        originalRequest.url.newBuilder().host(domainHeader).build()\n                    )\n                    .removeHeader(MastodonApi.DOMAIN_HEADER)\n                    .build()\n            } else if (account != null && request.url.host == account.domain) {\n                request = request.newBuilder()\n                    .header(\"Authorization\", \"Bearer ${account.accessToken}\")\n                    .build()\n            }\n\n            if (request.url.host == MastodonApi.PLACEHOLDER_DOMAIN) {\n                FailingCall(request)\n            } else {\n                httpClient.newCall(request)\n            }\n        }\n        .build()\n        .create()\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/network/FailingCall.kt",
    "content": "/* Copyright 2024 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.network\n\nimport okhttp3.Call\nimport okhttp3.Callback\nimport okhttp3.Protocol\nimport okhttp3.Request\nimport okhttp3.Response\nimport okhttp3.ResponseBody.Companion.toResponseBody\nimport okio.Timeout\n\nclass FailingCall(private val request: Request) : Call {\n\n    private var isExecuted: Boolean = false\n\n    override fun cancel() { }\n\n    override fun clone(): Call {\n        return FailingCall(request())\n    }\n\n    override fun enqueue(responseCallback: Callback) {\n        isExecuted = true\n        responseCallback.onResponse(this, failingResponse())\n    }\n\n    override fun execute(): Response {\n        isExecuted = true\n        return failingResponse()\n    }\n\n    override fun isCanceled(): Boolean = false\n\n    override fun isExecuted(): Boolean = isExecuted\n\n    override fun request(): Request = request\n\n    override fun timeout(): Timeout {\n        return Timeout.NONE\n    }\n\n    private fun failingResponse(): Response {\n        return Response.Builder()\n            .request(request)\n            .code(400)\n            .message(\"Bad Request\")\n            .protocol(Protocol.HTTP_1_1)\n            .body(\"\".toResponseBody())\n            .build()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/network/FilterModel.kt",
    "content": "package com.keylesspalace.tusky.network\n\nimport android.util.Log\nimport at.connyduck.calladapter.networkresult.fold\nimport at.connyduck.calladapter.networkresult.getOrElse\nimport com.keylesspalace.tusky.components.instanceinfo.InstanceInfoRepository\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.entity.FilterV1\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.util.isHttpNotFound\nimport com.keylesspalace.tusky.util.parseAsMastodonHtml\nimport java.util.Date\nimport java.util.regex.Pattern\nimport javax.inject.Inject\n\n/**\n * One-stop for status filtering logic using Mastodon's filters.\n *\n * 1. You init with [init], this checks which filter version to use and compiles regex pattern if needed.\n * 2. You call [shouldFilterStatus] to figure out what to display when you load statuses.\n */\nclass FilterModel @Inject constructor(\n    private val instanceInfoRepo: InstanceInfoRepository,\n    private val api: MastodonApi\n) {\n    private var pattern: Pattern? = null\n    private var v1 = false\n    private lateinit var kind: Filter.Kind\n\n    /**\n     * @param kind the [Filter.Kind] that should be filtered\n     * @return true when filters v1 have been loaded successfully and the currently shown posts may need to be filtered\n     */\n    suspend fun init(kind: Filter.Kind): Boolean {\n        this.kind = kind\n\n        if (instanceInfoRepo.isFilterV2Supported()) {\n            // nothing to do - Instance supports V2 so posts are filtered by the server\n            return false\n        }\n\n        api.getFilters().fold(\n            {\n                instanceInfoRepo.saveFilterV2Support(true)\n                return false\n            },\n            { throwable ->\n                if (throwable.isHttpNotFound()) {\n                    val filters = api.getFiltersV1().getOrElse {\n                        Log.w(TAG, \"Failed to fetch filters\", it)\n                        return false\n                    }\n\n                    this.v1 = true\n\n                    val activeFilters = filters.filter { filter -> filter.context.contains(kind.kind) }\n\n                    this.pattern = makeFilter(activeFilters)\n\n                    return activeFilters.isNotEmpty()\n                } else {\n                    Log.e(TAG, \"Error getting filters\", throwable)\n                    return false\n                }\n            }\n        )\n    }\n\n    fun shouldFilterStatus(status: Status): Filter? {\n        if (v1) {\n            // Patterns are expensive and thread-safe, matchers are neither.\n            val matcher = pattern?.matcher(\"\") ?: return null\n\n            if (status.poll?.options?.any { matcher.reset(it.title).find() } == true) {\n                return Filter(context = listOf(kind), action = Filter.Action.HIDE)\n            }\n\n            val spoilerText = status.actionableStatus.spoilerText\n            val attachmentsDescriptions = status.attachments.mapNotNull { it.description }\n\n            return if (\n                matcher.reset(status.actionableStatus.content.parseAsMastodonHtml().toString()).find() ||\n                (spoilerText.isNotEmpty() && matcher.reset(spoilerText).find()) ||\n                (attachmentsDescriptions.isNotEmpty() && matcher.reset(attachmentsDescriptions.joinToString(\"\\n\")).find())\n            ) {\n                return Filter(context = listOf(kind), action = Filter.Action.HIDE)\n            } else {\n                null\n            }\n        }\n\n        return status.getApplicableFilter(kind)\n    }\n\n    private fun filterToRegexToken(filter: FilterV1): String? {\n        val phrase = filter.phrase\n        val quotedPhrase = Pattern.quote(phrase)\n        return if (filter.wholeWord && ALPHANUMERIC.matcher(phrase).matches()) {\n            \"(^|\\\\W)$quotedPhrase($|\\\\W)\"\n        } else {\n            quotedPhrase\n        }\n    }\n\n    private fun makeFilter(filters: List<FilterV1>): Pattern? {\n        val now = Date()\n        val nonExpiredFilters = filters.filter { it.expiresAt?.before(now) != true }\n        if (nonExpiredFilters.isEmpty()) return null\n        val tokens = nonExpiredFilters\n            .asSequence()\n            .map { filterToRegexToken(it) }\n            .joinToString(\"|\")\n\n        return Pattern.compile(tokens, Pattern.CASE_INSENSITIVE)\n    }\n\n    companion object {\n        private const val TAG = \"FilterModel\"\n        private val ALPHANUMERIC = Pattern.compile(\"^\\\\w+$\")\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/network/MastodonApi.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.network\n\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport com.keylesspalace.tusky.components.filters.FilterExpiration\nimport com.keylesspalace.tusky.entity.AccessToken\nimport com.keylesspalace.tusky.entity.Account\nimport com.keylesspalace.tusky.entity.Announcement\nimport com.keylesspalace.tusky.entity.AppCredentials\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.entity.Conversation\nimport com.keylesspalace.tusky.entity.DeletedStatus\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.entity.FilterKeyword\nimport com.keylesspalace.tusky.entity.FilterV1\nimport com.keylesspalace.tusky.entity.HashTag\nimport com.keylesspalace.tusky.entity.Instance\nimport com.keylesspalace.tusky.entity.InstanceV1\nimport com.keylesspalace.tusky.entity.Marker\nimport com.keylesspalace.tusky.entity.MastoList\nimport com.keylesspalace.tusky.entity.MediaUploadResult\nimport com.keylesspalace.tusky.entity.NewStatus\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.entity.NotificationPolicy\nimport com.keylesspalace.tusky.entity.NotificationRequest\nimport com.keylesspalace.tusky.entity.NotificationSubscribeResult\nimport com.keylesspalace.tusky.entity.Poll\nimport com.keylesspalace.tusky.entity.Relationship\nimport com.keylesspalace.tusky.entity.ScheduledStatus\nimport com.keylesspalace.tusky.entity.ScheduledStatusReply\nimport com.keylesspalace.tusky.entity.SearchResult\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.entity.StatusContext\nimport com.keylesspalace.tusky.entity.StatusEdit\nimport com.keylesspalace.tusky.entity.StatusSource\nimport com.keylesspalace.tusky.entity.TimelineAccount\nimport com.keylesspalace.tusky.entity.Translation\nimport com.keylesspalace.tusky.entity.TrendingTag\nimport okhttp3.MultipartBody\nimport okhttp3.RequestBody\nimport retrofit2.Response\nimport retrofit2.http.Body\nimport retrofit2.http.DELETE\nimport retrofit2.http.Field\nimport retrofit2.http.FieldMap\nimport retrofit2.http.FormUrlEncoded\nimport retrofit2.http.GET\nimport retrofit2.http.HTTP\nimport retrofit2.http.Header\nimport retrofit2.http.Multipart\nimport retrofit2.http.PATCH\nimport retrofit2.http.POST\nimport retrofit2.http.PUT\nimport retrofit2.http.Part\nimport retrofit2.http.PartMap\nimport retrofit2.http.Path\nimport retrofit2.http.Query\n\n/**\n * for documentation of the Mastodon REST API see https://docs.joinmastodon.org/api/\n */\n\n@JvmSuppressWildcards\ninterface MastodonApi {\n\n    companion object {\n        const val ENDPOINT_AUTHORIZE = \"oauth/authorize\"\n        const val DOMAIN_HEADER = \"domain\"\n        const val PLACEHOLDER_DOMAIN = \"dummy.placeholder\"\n    }\n\n    @GET(\"/api/v1/custom_emojis\")\n    suspend fun getCustomEmojis(): NetworkResult<List<Emoji>>\n\n    @GET(\"api/v1/instance\")\n    suspend fun getInstanceV1(\n        @Header(DOMAIN_HEADER) domain: String? = null\n    ): NetworkResult<InstanceV1>\n\n    @GET(\"api/v2/instance\")\n    suspend fun getInstance(\n        @Header(DOMAIN_HEADER) domain: String? = null\n    ): NetworkResult<Instance>\n\n    @GET(\"api/v1/filters\")\n    suspend fun getFiltersV1(): NetworkResult<List<FilterV1>>\n\n    @GET(\"api/v2/filters/{filterId}\")\n    suspend fun getFilter(@Path(\"filterId\") filterId: String): NetworkResult<Filter>\n\n    @GET(\"api/v2/filters\")\n    suspend fun getFilters(): NetworkResult<List<Filter>>\n\n    @GET(\"api/v1/timelines/home\")\n    @Throws(Exception::class)\n    suspend fun homeTimeline(\n        @Query(\"max_id\") maxId: String? = null,\n        @Query(\"min_id\") minId: String? = null,\n        @Query(\"since_id\") sinceId: String? = null,\n        @Query(\"limit\") limit: Int? = null\n    ): Response<List<Status>>\n\n    @GET(\"api/v1/timelines/public\")\n    suspend fun publicTimeline(\n        @Query(\"local\") local: Boolean? = null,\n        @Query(\"max_id\") maxId: String? = null,\n        @Query(\"since_id\") sinceId: String? = null,\n        @Query(\"limit\") limit: Int? = null\n    ): Response<List<Status>>\n\n    @GET(\"api/v1/timelines/tag/{hashtag}\")\n    suspend fun hashtagTimeline(\n        @Path(\"hashtag\") hashtag: String,\n        @Query(\"any[]\") any: List<String>?,\n        @Query(\"local\") local: Boolean?,\n        @Query(\"max_id\") maxId: String?,\n        @Query(\"since_id\") sinceId: String?,\n        @Query(\"limit\") limit: Int?\n    ): Response<List<Status>>\n\n    @GET(\"api/v1/timelines/list/{listId}\")\n    suspend fun listTimeline(\n        @Path(\"listId\") listId: String,\n        @Query(\"max_id\") maxId: String?,\n        @Query(\"since_id\") sinceId: String?,\n        @Query(\"limit\") limit: Int?\n    ): Response<List<Status>>\n\n    @GET(\"api/v1/notifications\")\n    @Throws(Exception::class)\n    suspend fun notifications(\n        /** Return results older than this ID */\n        @Query(\"max_id\") maxId: String? = null,\n        /** Return results newer than this ID */\n        @Query(\"since_id\") sinceId: String? = null,\n        /** Return results immediately newer than this ID */\n        @Query(\"min_id\") minId: String? = null,\n        /** Maximum number of results to return. Defaults to 15, max is 30 */\n        @Query(\"limit\") limit: Int? = null,\n        /** Types to excludes from the results */\n        @Query(\"exclude_types[]\") excludes: Set<Notification.Type>? = null,\n        /** Return only notifications received from the specified account. */\n        @Query(\"account_id\") accountId: String? = null\n    ): Response<List<Notification>>\n\n    /** Fetch a single notification */\n    @GET(\"api/v1/notifications/{id}\")\n    suspend fun notification(@Path(\"id\") id: String): Response<Notification>\n\n    @GET(\"api/v1/markers\")\n    suspend fun markersWithAuth(\n        @Header(\"Authorization\") auth: String,\n        @Header(DOMAIN_HEADER) domain: String,\n        @Query(\"timeline[]\") timelines: List<String>\n    ): Map<String, Marker>\n\n    @FormUrlEncoded\n    @POST(\"api/v1/markers\")\n    suspend fun updateMarkersWithAuth(\n        @Header(\"Authorization\") auth: String,\n        @Header(DOMAIN_HEADER) domain: String,\n        @Field(\"home[last_read_id]\") homeLastReadId: String? = null,\n        @Field(\"notifications[last_read_id]\") notificationsLastReadId: String? = null\n    ): NetworkResult<Unit>\n\n    @GET(\"api/v1/notifications\")\n    suspend fun notificationsWithAuth(\n        @Header(\"Authorization\") auth: String,\n        @Header(DOMAIN_HEADER) domain: String,\n        /** Return results immediately newer than this ID */\n        @Query(\"min_id\") minId: String?\n    ): Response<List<Notification>>\n\n    @POST(\"api/v1/notifications/clear\")\n    suspend fun clearNotifications(): NetworkResult<Unit>\n\n    @FormUrlEncoded\n    @PUT(\"api/v1/media/{mediaId}\")\n    suspend fun updateMedia(\n        @Path(\"mediaId\") mediaId: String,\n        @Field(\"description\") description: String?,\n        @Field(\"focus\") focus: String?\n    ): NetworkResult<Attachment>\n\n    @GET(\"api/v1/media/{mediaId}\")\n    suspend fun getMedia(@Path(\"mediaId\") mediaId: String): Response<MediaUploadResult>\n\n    @POST(\"api/v1/statuses\")\n    suspend fun createStatus(\n        @Header(\"Authorization\") auth: String,\n        @Header(DOMAIN_HEADER) domain: String,\n        @Header(\"Idempotency-Key\") idempotencyKey: String,\n        @Body status: NewStatus\n    ): NetworkResult<Status>\n\n    @POST(\"api/v1/statuses\")\n    suspend fun createScheduledStatus(\n        @Header(\"Authorization\") auth: String,\n        @Header(DOMAIN_HEADER) domain: String,\n        @Header(\"Idempotency-Key\") idempotencyKey: String,\n        @Body status: NewStatus\n    ): NetworkResult<ScheduledStatusReply>\n\n    @GET(\"api/v1/statuses/{id}\")\n    suspend fun status(@Path(\"id\") statusId: String): NetworkResult<Status>\n\n    @PUT(\"api/v1/statuses/{id}\")\n    suspend fun editStatus(\n        @Path(\"id\") statusId: String,\n        @Header(\"Authorization\") auth: String,\n        @Header(DOMAIN_HEADER) domain: String,\n        @Header(\"Idempotency-Key\") idempotencyKey: String,\n        @Body editedStatus: NewStatus\n    ): NetworkResult<Status>\n\n    @GET(\"api/v1/statuses/{id}/source\")\n    suspend fun statusSource(@Path(\"id\") statusId: String): NetworkResult<StatusSource>\n\n    @GET(\"api/v1/statuses/{id}/context\")\n    suspend fun statusContext(@Path(\"id\") statusId: String): NetworkResult<StatusContext>\n\n    @GET(\"api/v1/statuses/{id}/history\")\n    suspend fun statusEdits(@Path(\"id\") statusId: String): NetworkResult<List<StatusEdit>>\n\n    @GET(\"api/v1/statuses/{id}/reblogged_by\")\n    suspend fun statusRebloggedBy(\n        @Path(\"id\") statusId: String,\n        @Query(\"max_id\") maxId: String?\n    ): Response<List<TimelineAccount>>\n\n    @GET(\"api/v1/statuses/{id}/favourited_by\")\n    suspend fun statusFavouritedBy(\n        @Path(\"id\") statusId: String,\n        @Query(\"max_id\") maxId: String?\n    ): Response<List<TimelineAccount>>\n\n    @DELETE(\"api/v1/statuses/{id}\")\n    suspend fun deleteStatus(\n        @Path(\"id\") statusId: String,\n        @Query(\"delete_media\") deleteMedia: Boolean? = null\n    ): NetworkResult<DeletedStatus>\n\n    @FormUrlEncoded\n    @POST(\"api/v1/statuses/{id}/reblog\")\n    suspend fun reblogStatus(@Path(\"id\") statusId: String, @Field(\"visibility\") visibility: String?): NetworkResult<Status>\n\n    @POST(\"api/v1/statuses/{id}/unreblog\")\n    suspend fun unreblogStatus(@Path(\"id\") statusId: String): NetworkResult<Status>\n\n    @POST(\"api/v1/statuses/{id}/favourite\")\n    suspend fun favouriteStatus(@Path(\"id\") statusId: String): NetworkResult<Status>\n\n    @POST(\"api/v1/statuses/{id}/unfavourite\")\n    suspend fun unfavouriteStatus(@Path(\"id\") statusId: String): NetworkResult<Status>\n\n    @POST(\"api/v1/statuses/{id}/bookmark\")\n    suspend fun bookmarkStatus(@Path(\"id\") statusId: String): NetworkResult<Status>\n\n    @POST(\"api/v1/statuses/{id}/unbookmark\")\n    suspend fun unbookmarkStatus(@Path(\"id\") statusId: String): NetworkResult<Status>\n\n    @POST(\"api/v1/statuses/{id}/pin\")\n    suspend fun pinStatus(@Path(\"id\") statusId: String): NetworkResult<Status>\n\n    @POST(\"api/v1/statuses/{id}/unpin\")\n    suspend fun unpinStatus(@Path(\"id\") statusId: String): NetworkResult<Status>\n\n    @POST(\"api/v1/statuses/{id}/mute\")\n    suspend fun muteConversation(@Path(\"id\") statusId: String): NetworkResult<Status>\n\n    @POST(\"api/v1/statuses/{id}/unmute\")\n    suspend fun unmuteConversation(@Path(\"id\") statusId: String): NetworkResult<Status>\n\n    @GET(\"api/v1/scheduled_statuses\")\n    suspend fun scheduledStatuses(\n        @Query(\"limit\") limit: Int? = null,\n        @Query(\"max_id\") maxId: String? = null\n    ): NetworkResult<List<ScheduledStatus>>\n\n    @DELETE(\"api/v1/scheduled_statuses/{id}\")\n    suspend fun deleteScheduledStatus(\n        @Path(\"id\") scheduledStatusId: String\n    ): NetworkResult<Unit>\n\n    @GET(\"api/v1/accounts/verify_credentials\")\n    suspend fun accountVerifyCredentials(\n        @Header(DOMAIN_HEADER) domain: String? = null,\n        @Header(\"Authorization\") auth: String? = null\n    ): NetworkResult<Account>\n\n    @FormUrlEncoded\n    @PATCH(\"api/v1/accounts/update_credentials\")\n    suspend fun accountUpdateSource(\n        @Field(\"source[privacy]\") privacy: String?,\n        @Field(\"source[sensitive]\") sensitive: Boolean?,\n        @Field(\"source[language]\") language: String?\n    ): NetworkResult<Account>\n\n    @Multipart\n    @PATCH(\"api/v1/accounts/update_credentials\")\n    suspend fun accountUpdateCredentials(\n        @Part(value = \"display_name\") displayName: RequestBody?,\n        @Part(value = \"note\") note: RequestBody?,\n        @Part(value = \"locked\") locked: RequestBody?,\n        @Part avatar: MultipartBody.Part?,\n        @Part header: MultipartBody.Part?,\n        @PartMap fields: Map<String, RequestBody>\n    ): NetworkResult<Account>\n\n    @GET(\"api/v1/accounts/search\")\n    suspend fun searchAccounts(\n        @Query(\"q\") query: String,\n        @Query(\"resolve\") resolve: Boolean? = null,\n        @Query(\"limit\") limit: Int? = null,\n        @Query(\"following\") following: Boolean? = null\n    ): NetworkResult<List<TimelineAccount>>\n\n    @GET(\"api/v1/accounts/{id}\")\n    suspend fun account(@Path(\"id\") accountId: String): NetworkResult<Account>\n\n    /**\n     * Method to fetch statuses for the specified account.\n     * @param accountId ID for account for which statuses will be requested\n     * @param maxId Only statuses with ID less than maxID will be returned\n     * @param sinceId Only statuses with ID bigger than sinceID will be returned\n     * @param limit Limit returned statuses (current API limits: default - 20, max - 40)\n     * @param excludeReplies only return statuses that are no replies\n     * @param onlyMedia only return statuses that have media attached\n     */\n    @GET(\"api/v1/accounts/{id}/statuses\")\n    suspend fun accountStatuses(\n        @Path(\"id\") accountId: String,\n        @Query(\"max_id\") maxId: String? = null,\n        @Query(\"since_id\") sinceId: String? = null,\n        @Query(\"limit\") limit: Int? = null,\n        @Query(\"exclude_replies\") excludeReplies: Boolean? = null,\n        @Query(\"only_media\") onlyMedia: Boolean? = null,\n        @Query(\"pinned\") pinned: Boolean? = null\n    ): Response<List<Status>>\n\n    @GET(\"api/v1/accounts/{id}/followers\")\n    suspend fun accountFollowers(\n        @Path(\"id\") accountId: String,\n        @Query(\"max_id\") maxId: String?\n    ): Response<List<TimelineAccount>>\n\n    @GET(\"api/v1/accounts/{id}/following\")\n    suspend fun accountFollowing(\n        @Path(\"id\") accountId: String,\n        @Query(\"max_id\") maxId: String?\n    ): Response<List<TimelineAccount>>\n\n    @FormUrlEncoded\n    @POST(\"api/v1/accounts/{id}/follow\")\n    suspend fun followAccount(\n        @Path(\"id\") accountId: String,\n        @Field(\"reblogs\") showReblogs: Boolean? = null,\n        @Field(\"notify\") notify: Boolean? = null\n    ): NetworkResult<Relationship>\n\n    @POST(\"api/v1/accounts/{id}/unfollow\")\n    suspend fun unfollowAccount(@Path(\"id\") accountId: String): NetworkResult<Relationship>\n\n    @POST(\"api/v1/accounts/{id}/block\")\n    suspend fun blockAccount(@Path(\"id\") accountId: String): NetworkResult<Relationship>\n\n    @POST(\"api/v1/accounts/{id}/unblock\")\n    suspend fun unblockAccount(@Path(\"id\") accountId: String): NetworkResult<Relationship>\n\n    @FormUrlEncoded\n    @POST(\"api/v1/accounts/{id}/mute\")\n    suspend fun muteAccount(\n        @Path(\"id\") accountId: String,\n        @Field(\"notifications\") notifications: Boolean? = null,\n        @Field(\"duration\") duration: Int? = null\n    ): NetworkResult<Relationship>\n\n    @POST(\"api/v1/accounts/{id}/unmute\")\n    suspend fun unmuteAccount(@Path(\"id\") accountId: String): NetworkResult<Relationship>\n\n    @GET(\"api/v1/accounts/relationships\")\n    suspend fun relationships(\n        @Query(\"id[]\") accountIds: List<String>\n    ): NetworkResult<List<Relationship>>\n\n    @POST(\"api/v1/pleroma/accounts/{id}/subscribe\")\n    suspend fun subscribeAccount(@Path(\"id\") accountId: String): NetworkResult<Relationship>\n\n    @POST(\"api/v1/pleroma/accounts/{id}/unsubscribe\")\n    suspend fun unsubscribeAccount(@Path(\"id\") accountId: String): NetworkResult<Relationship>\n\n    @GET(\"api/v1/blocks\")\n    suspend fun blocks(@Query(\"max_id\") maxId: String? = null): Response<List<TimelineAccount>>\n\n    @GET(\"api/v1/mutes\")\n    suspend fun mutes(@Query(\"max_id\") maxId: String? = null): Response<List<TimelineAccount>>\n\n    @GET(\"api/v1/domain_blocks\")\n    suspend fun domainBlocks(\n        @Query(\"max_id\") maxId: String? = null,\n        @Query(\"since_id\") sinceId: String? = null,\n        @Query(\"limit\") limit: Int? = null\n    ): Response<List<String>>\n\n    @FormUrlEncoded\n    @POST(\"api/v1/domain_blocks\")\n    suspend fun blockDomain(@Field(\"domain\") domain: String): NetworkResult<Unit>\n\n    @FormUrlEncoded\n    // @DELETE doesn't support fields\n    @HTTP(method = \"DELETE\", path = \"api/v1/domain_blocks\", hasBody = true)\n    suspend fun unblockDomain(@Field(\"domain\") domain: String): NetworkResult<Unit>\n\n    @GET(\"api/v1/favourites\")\n    suspend fun favourites(\n        @Query(\"max_id\") maxId: String?,\n        @Query(\"since_id\") sinceId: String?,\n        @Query(\"limit\") limit: Int?\n    ): Response<List<Status>>\n\n    @GET(\"api/v1/bookmarks\")\n    suspend fun bookmarks(\n        @Query(\"max_id\") maxId: String?,\n        @Query(\"since_id\") sinceId: String?,\n        @Query(\"limit\") limit: Int?\n    ): Response<List<Status>>\n\n    @GET(\"api/v1/follow_requests\")\n    suspend fun followRequests(@Query(\"max_id\") maxId: String?): Response<List<TimelineAccount>>\n\n    @POST(\"api/v1/follow_requests/{id}/authorize\")\n    suspend fun authorizeFollowRequest(@Path(\"id\") accountId: String): NetworkResult<Relationship>\n\n    @POST(\"api/v1/follow_requests/{id}/reject\")\n    suspend fun rejectFollowRequest(@Path(\"id\") accountId: String): NetworkResult<Relationship>\n\n    @FormUrlEncoded\n    @POST(\"api/v1/apps\")\n    suspend fun authenticateApp(\n        @Header(DOMAIN_HEADER) domain: String,\n        @Field(\"client_name\") clientName: String,\n        @Field(\"redirect_uris\") redirectUris: String,\n        @Field(\"scopes\") scopes: String,\n        @Field(\"website\") website: String\n    ): NetworkResult<AppCredentials>\n\n    @FormUrlEncoded\n    @POST(\"oauth/token\")\n    suspend fun fetchOAuthToken(\n        @Header(DOMAIN_HEADER) domain: String,\n        @Field(\"client_id\") clientId: String,\n        @Field(\"client_secret\") clientSecret: String,\n        @Field(\"redirect_uri\") redirectUri: String,\n        @Field(\"code\") code: String,\n        @Field(\"grant_type\") grantType: String\n    ): NetworkResult<AccessToken>\n\n    @FormUrlEncoded\n    @POST(\"oauth/revoke\")\n    suspend fun revokeOAuthToken(\n        @Field(\"client_id\") clientId: String,\n        @Field(\"client_secret\") clientSecret: String,\n        @Field(\"token\") token: String\n    ): NetworkResult<Unit>\n\n    @GET(\"/api/v1/lists\")\n    suspend fun getLists(): NetworkResult<List<MastoList>>\n\n    @GET(\"/api/v1/accounts/{id}/lists\")\n    suspend fun getListsIncludesAccount(\n        @Path(\"id\") accountId: String\n    ): NetworkResult<List<MastoList>>\n\n    @FormUrlEncoded\n    @POST(\"api/v1/lists\")\n    suspend fun createList(\n        @Field(\"title\") title: String,\n        @Field(\"exclusive\") exclusive: Boolean?,\n        @Field(\"replies_policy\") replyPolicy: String\n    ): NetworkResult<MastoList>\n\n    @FormUrlEncoded\n    @PUT(\"api/v1/lists/{listId}\")\n    suspend fun updateList(\n        @Path(\"listId\") listId: String,\n        @Field(\"title\") title: String,\n        @Field(\"exclusive\") exclusive: Boolean?,\n        @Field(\"replies_policy\") replyPolicy: String\n    ): NetworkResult<MastoList>\n\n    @DELETE(\"api/v1/lists/{listId}\")\n    suspend fun deleteList(@Path(\"listId\") listId: String): NetworkResult<Unit>\n\n    @GET(\"api/v1/lists/{listId}/accounts\")\n    suspend fun getAccountsInList(\n        @Path(\"listId\") listId: String,\n        @Query(\"limit\") limit: Int\n    ): NetworkResult<List<TimelineAccount>>\n\n    @FormUrlEncoded\n    // @DELETE doesn't support fields\n    @HTTP(method = \"DELETE\", path = \"api/v1/lists/{listId}/accounts\", hasBody = true)\n    suspend fun deleteAccountFromList(\n        @Path(\"listId\") listId: String,\n        @Field(\"account_ids[]\") accountIds: List<String>\n    ): NetworkResult<Unit>\n\n    @FormUrlEncoded\n    @POST(\"api/v1/lists/{listId}/accounts\")\n    suspend fun addAccountToList(\n        @Path(\"listId\") listId: String,\n        @Field(\"account_ids[]\") accountIds: List<String>\n    ): NetworkResult<Unit>\n\n    @GET(\"/api/v1/conversations\")\n    suspend fun getConversations(\n        @Query(\"max_id\") maxId: String? = null,\n        @Query(\"limit\") limit: Int? = null\n    ): Response<List<Conversation>>\n\n    @DELETE(\"/api/v1/conversations/{id}\")\n    suspend fun deleteConversation(@Path(\"id\") conversationId: String)\n\n    @FormUrlEncoded\n    @POST(\"api/v1/filters\")\n    suspend fun createFilterV1(\n        @Field(\"phrase\") phrase: String,\n        @Field(\"context[]\") context: List<String>,\n        @Field(\"irreversible\") irreversible: Boolean?,\n        @Field(\"whole_word\") wholeWord: Boolean?,\n        @Field(\"expires_in\") expiresIn: FilterExpiration?\n    ): NetworkResult<FilterV1>\n\n    @FormUrlEncoded\n    @PUT(\"api/v1/filters/{id}\")\n    suspend fun updateFilterV1(\n        @Path(\"id\") id: String,\n        @Field(\"phrase\") phrase: String,\n        @Field(\"context[]\") context: List<String>,\n        @Field(\"irreversible\") irreversible: Boolean?,\n        @Field(\"whole_word\") wholeWord: Boolean?,\n        @Field(\"expires_in\") expiresIn: FilterExpiration?\n    ): NetworkResult<FilterV1>\n\n    @DELETE(\"api/v1/filters/{id}\")\n    suspend fun deleteFilterV1(@Path(\"id\") id: String): NetworkResult<Unit>\n\n    @FormUrlEncoded\n    @POST(\"api/v2/filters\")\n    suspend fun createFilter(\n        @Field(\"title\") title: String,\n        @Field(\"context[]\") context: List<Filter.Kind>,\n        @Field(\"filter_action\") filterAction: Filter.Action,\n        @Field(\"expires_in\") expiresIn: FilterExpiration?\n    ): NetworkResult<Filter>\n\n    @FormUrlEncoded\n    @PUT(\"api/v2/filters/{id}\")\n    suspend fun updateFilter(\n        @Path(\"id\") id: String,\n        @Field(\"title\") title: String? = null,\n        @Field(\"context[]\") context: List<Filter.Kind>? = null,\n        @Field(\"filter_action\") filterAction: Filter.Action? = null,\n        @Field(\"expires_in\") expires: FilterExpiration? = null\n    ): NetworkResult<Filter>\n\n    @DELETE(\"api/v2/filters/{id}\")\n    suspend fun deleteFilter(@Path(\"id\") id: String): NetworkResult<Unit>\n\n    @FormUrlEncoded\n    @POST(\"api/v2/filters/{filterId}/keywords\")\n    suspend fun addFilterKeyword(\n        @Path(\"filterId\") filterId: String,\n        @Field(\"keyword\") keyword: String,\n        @Field(\"whole_word\") wholeWord: Boolean\n    ): NetworkResult<FilterKeyword>\n\n    @FormUrlEncoded\n    @PUT(\"api/v2/filters/keywords/{keywordId}\")\n    suspend fun updateFilterKeyword(\n        @Path(\"keywordId\") keywordId: String,\n        @Field(\"keyword\") keyword: String,\n        @Field(\"whole_word\") wholeWord: Boolean\n    ): NetworkResult<FilterKeyword>\n\n    @DELETE(\"api/v2/filters/keywords/{keywordId}\")\n    suspend fun deleteFilterKeyword(\n        @Path(\"keywordId\") keywordId: String\n    ): NetworkResult<Unit>\n\n    @FormUrlEncoded\n    @POST(\"api/v1/polls/{id}/votes\")\n    suspend fun voteInPoll(\n        @Path(\"id\") id: String,\n        @Field(\"choices[]\") choices: List<Int>\n    ): NetworkResult<Poll>\n\n    @GET(\"api/v1/announcements\")\n    suspend fun announcements(): NetworkResult<List<Announcement>>\n\n    @POST(\"api/v1/announcements/{id}/dismiss\")\n    suspend fun dismissAnnouncement(@Path(\"id\") announcementId: String): NetworkResult<Unit>\n\n    @PUT(\"api/v1/announcements/{id}/reactions/{name}\")\n    suspend fun addAnnouncementReaction(\n        @Path(\"id\") announcementId: String,\n        @Path(\"name\") name: String\n    ): NetworkResult<Unit>\n\n    @DELETE(\"api/v1/announcements/{id}/reactions/{name}\")\n    suspend fun removeAnnouncementReaction(\n        @Path(\"id\") announcementId: String,\n        @Path(\"name\") name: String\n    ): NetworkResult<Unit>\n\n    @FormUrlEncoded\n    @POST(\"api/v1/reports\")\n    suspend fun report(\n        @Field(\"account_id\") accountId: String,\n        @Field(\"status_ids[]\") statusIds: List<String>,\n        @Field(\"comment\") comment: String,\n        @Field(\"forward\") isNotifyRemote: Boolean?\n    ): NetworkResult<Unit>\n\n    @GET(\"api/v1/accounts/{id}/statuses\")\n    suspend fun accountStatuses(\n        @Path(\"id\") accountId: String,\n        @Query(\"max_id\") maxId: String?,\n        @Query(\"since_id\") sinceId: String?,\n        @Query(\"min_id\") minId: String?,\n        @Query(\"limit\") limit: Int?,\n        @Query(\"exclude_reblogs\") excludeReblogs: Boolean?\n    ): NetworkResult<List<Status>>\n\n    @GET(\"api/v2/search\")\n    suspend fun search(\n        @Query(\"q\") query: String?,\n        @Query(\"type\") type: String? = null,\n        @Query(\"resolve\") resolve: Boolean? = null,\n        @Query(\"limit\") limit: Int? = null,\n        @Query(\"offset\") offset: Int? = null,\n        @Query(\"following\") following: Boolean? = null\n    ): NetworkResult<SearchResult>\n\n    @FormUrlEncoded\n    @POST(\"api/v1/accounts/{id}/note\")\n    suspend fun updateAccountNote(\n        @Path(\"id\") accountId: String,\n        @Field(\"comment\") note: String\n    ): NetworkResult<Relationship>\n\n    @GET(\"api/v1/push/subscription\")\n    suspend fun pushNotificationSubscription(\n        @Header(\"Authorization\") auth: String,\n        @Header(DOMAIN_HEADER) domain: String\n    ): NetworkResult<NotificationSubscribeResult>\n\n    @FormUrlEncoded\n    @POST(\"api/v1/push/subscription\")\n    suspend fun subscribePushNotifications(\n        @Header(\"Authorization\") auth: String,\n        @Header(DOMAIN_HEADER) domain: String,\n        @Field(\"subscription[endpoint]\") endPoint: String,\n        @Field(\"subscription[keys][p256dh]\") keysP256DH: String,\n        @Field(\"subscription[keys][auth]\") keysAuth: String,\n        // The \"data[alerts][]\" fields to enable / disable notifications\n        // Should be generated dynamically from all the available notification\n        // types defined in [com.keylesspalace.tusky.entities.Notification.Types]\n        @FieldMap data: Map<String, Boolean>\n    ): NetworkResult<NotificationSubscribeResult>\n\n    @FormUrlEncoded\n    @PUT(\"api/v1/push/subscription\")\n    suspend fun updatePushNotificationSubscription(\n        @Header(\"Authorization\") auth: String,\n        @Header(DOMAIN_HEADER) domain: String,\n        @FieldMap data: Map<String, Boolean>\n    ): NetworkResult<NotificationSubscribeResult>\n\n    @DELETE(\"api/v1/push/subscription\")\n    suspend fun unsubscribePushNotifications(\n        @Header(\"Authorization\") auth: String,\n        @Header(DOMAIN_HEADER) domain: String\n    ): NetworkResult<Unit>\n\n    @GET(\"api/v1/tags/{name}\")\n    suspend fun tag(@Path(\"name\") name: String): NetworkResult<HashTag>\n\n    @GET(\"api/v1/followed_tags\")\n    suspend fun followedTags(\n        @Query(\"min_id\") minId: String? = null,\n        @Query(\"since_id\") sinceId: String? = null,\n        @Query(\"max_id\") maxId: String? = null,\n        @Query(\"limit\") limit: Int? = null\n    ): Response<List<HashTag>>\n\n    @POST(\"api/v1/tags/{name}/follow\")\n    suspend fun followTag(@Path(\"name\") name: String): NetworkResult<HashTag>\n\n    @POST(\"api/v1/tags/{name}/unfollow\")\n    suspend fun unfollowTag(@Path(\"name\") name: String): NetworkResult<HashTag>\n\n    @GET(\"api/v1/trends/tags\")\n    suspend fun trendingTags(): NetworkResult<List<TrendingTag>>\n\n    @GET(\"api/v1/trends/statuses\")\n    suspend fun trendingStatuses(\n        @Query(\"limit\") limit: Int? = null,\n        @Query(\"offset\") offset: String? = null\n    ): Response<List<Status>>\n\n    @FormUrlEncoded\n    @POST(\"api/v1/statuses/{id}/translate\")\n    suspend fun translate(\n        @Path(\"id\") statusId: String,\n        @Field(\"lang\") targetLanguage: String?\n    ): NetworkResult<Translation>\n\n    @GET(\"api/v2/notifications/policy\")\n    suspend fun notificationPolicy(): NetworkResult<NotificationPolicy>\n\n    @FormUrlEncoded\n    @PATCH(\"api/v2/notifications/policy\")\n    suspend fun updateNotificationPolicy(\n        @Field(\"for_not_following\") forNotFollowing: String?,\n        @Field(\"for_not_followers\") forNotFollowers: String?,\n        @Field(\"for_new_accounts\") forNewAccounts: String?,\n        @Field(\"for_private_mentions\") forPrivateMentions: String?,\n        @Field(\"for_limited_accounts\") forLimitedAccounts: String?\n    ): NetworkResult<NotificationPolicy>\n\n    @GET(\"api/v1/notifications/requests\")\n    suspend fun getNotificationRequests(\n        @Query(\"max_id\") maxId: String? = null,\n        @Query(\"min_id\") minId: String? = null,\n        @Query(\"since_id\") sinceId: String? = null,\n        @Query(\"limit\") limit: Int? = null\n    ): Response<List<NotificationRequest>>\n\n    @POST(\"api/v1/notifications/requests/{id}/accept\")\n    suspend fun acceptNotificationRequest(@Path(\"id\") notificationId: String): NetworkResult<Unit>\n\n    @POST(\"api/v1/notifications/requests/{id}/dismiss\")\n    suspend fun dismissNotificationRequest(@Path(\"id\") notificationId: String): NetworkResult<Unit>\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/network/MediaUploadApi.kt",
    "content": "package com.keylesspalace.tusky.network\n\nimport com.keylesspalace.tusky.entity.MediaUploadResult\nimport okhttp3.MultipartBody\nimport retrofit2.Response\nimport retrofit2.http.Multipart\nimport retrofit2.http.POST\nimport retrofit2.http.Part\n\n/** endpoints defined in this interface will be called with a higher timeout than usual\n * which is necessary for media uploads to succeed on some servers\n */\ninterface MediaUploadApi {\n    @Multipart\n    @POST(\"api/v2/media\")\n    suspend fun uploadMedia(\n        @Part file: MultipartBody.Part,\n        @Part description: MultipartBody.Part? = null,\n        @Part focus: MultipartBody.Part? = null\n    ): Response<MediaUploadResult>\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/network/UriRequestBody.kt",
    "content": "/*\n * Copyright 2024 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\npackage com.keylesspalace.tusky.network\n\nimport android.content.ContentResolver\nimport android.net.Uri\nimport java.io.FileNotFoundException\nimport okhttp3.MediaType\nimport okhttp3.RequestBody\nimport okio.Buffer\nimport okio.BufferedSink\nimport okio.source\n\n// Align with Okio Segment size for better performance\nprivate const val DEFAULT_CHUNK_SIZE = 8192L\n\nfun interface UploadCallback {\n    fun onProgressUpdate(percentage: Int)\n}\n\nfun Uri.asRequestBody(\n    contentResolver: ContentResolver,\n    contentType: MediaType? = null,\n    contentLength: Long = -1L,\n    uploadListener: UploadCallback? = null\n): RequestBody {\n    return object : RequestBody() {\n        override fun contentType(): MediaType? = contentType\n\n        override fun contentLength(): Long = contentLength\n\n        override fun writeTo(sink: BufferedSink) {\n            val buffer = Buffer()\n            var uploaded: Long = 0\n            val inputStream = contentResolver.openInputStream(this@asRequestBody)\n                ?: throw FileNotFoundException(\"Unavailable ContentProvider\")\n\n            inputStream.source().use { source ->\n                while (true) {\n                    val read = source.read(buffer, DEFAULT_CHUNK_SIZE)\n                    if (read == -1L) {\n                        break\n                    }\n                    sink.write(buffer, read)\n                    uploaded += read\n                    uploadListener?.let { if (contentLength > 0L) it.onProgressUpdate((100L * uploaded / contentLength).toInt()) }\n                }\n                uploadListener?.onProgressUpdate(100)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/pager/ImagePagerAdapter.kt",
    "content": "package com.keylesspalace.tusky.pager\n\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentActivity\nimport com.keylesspalace.tusky.ViewMediaAdapter\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.fragment.ViewMediaFragment\nimport java.lang.ref.WeakReference\n\nclass ImagePagerAdapter(\n    activity: FragmentActivity,\n    private val attachments: List<Attachment>,\n    private val initialPosition: Int\n) : ViewMediaAdapter(activity) {\n\n    private var didTransition = false\n    private val fragments =\n        MutableList<WeakReference<ViewMediaFragment>?>(attachments.size) { null }\n\n    override fun getItemCount() = attachments.size\n\n    override fun createFragment(position: Int): Fragment {\n        if (position >= 0 && position < attachments.size) {\n            // Fragment should not wait for or start transition if it already happened but we\n            // instantiate the same fragment again, e.g. open the first photo, scroll to the\n            // forth photo and then back to the first. The first fragment will try to start the\n            // transition and wait until it's over and it will never take place.\n            val fragment = ViewMediaFragment.newInstance(\n                attachment = attachments[position],\n                shouldStartPostponedTransition = !didTransition && position == initialPosition\n            )\n            fragments[position] = WeakReference(fragment)\n            return fragment\n        } else {\n            throw IllegalStateException()\n        }\n    }\n\n    override fun onTransitionEnd(position: Int) {\n        this.didTransition = true\n        fragments[position]?.get()?.onTransitionEnd()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/pager/MainPagerAdapter.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.pager\n\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentActivity\nimport com.keylesspalace.tusky.TabData\nimport com.keylesspalace.tusky.util.CustomFragmentStateAdapter\n\nclass MainPagerAdapter(var tabs: List<TabData>, activity: FragmentActivity) : CustomFragmentStateAdapter(\n    activity\n) {\n\n    override fun createFragment(position: Int): Fragment {\n        val tab = tabs[position]\n        return tab.fragment(tab.arguments)\n    }\n\n    override fun getItemCount() = tabs.size\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/pager/SingleImagePagerAdapter.kt",
    "content": "package com.keylesspalace.tusky.pager\n\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentActivity\nimport com.keylesspalace.tusky.ViewMediaAdapter\nimport com.keylesspalace.tusky.fragment.ViewMediaFragment\n\nclass SingleImagePagerAdapter(\n    activity: FragmentActivity,\n    private val imageUrl: String\n) : ViewMediaAdapter(activity) {\n\n    override fun createFragment(position: Int): Fragment {\n        return if (position == 0) {\n            ViewMediaFragment.newSingleImageInstance(imageUrl)\n        } else {\n            throw IllegalStateException()\n        }\n    }\n\n    override fun getItemCount() = 1\n\n    override fun onTransitionEnd(position: Int) {\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/receiver/NotificationBlockStateBroadcastReceiver.kt",
    "content": "/* Copyright 2022 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.receiver\n\nimport android.app.NotificationManager\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Build\nimport com.keylesspalace.tusky.components.systemnotifications.NotificationService\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.di.ApplicationScope\nimport com.keylesspalace.tusky.network.MastodonApi\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.launch\n\n@AndroidEntryPoint\nclass NotificationBlockStateBroadcastReceiver : BroadcastReceiver() {\n    @Inject\n    lateinit var mastodonApi: MastodonApi\n\n    @Inject\n    lateinit var accountManager: AccountManager\n\n    @Inject\n    lateinit var notificationService: NotificationService\n\n    @Inject\n    @ApplicationScope\n    lateinit var externalScope: CoroutineScope\n\n    override fun onReceive(context: Context, intent: Intent) {\n        if (Build.VERSION.SDK_INT < 28) return\n        if (!notificationService.arePushNotificationsAvailable()) return\n\n        val nm = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager\n\n        val accountIdentifier = when (intent.action) {\n            NotificationManager.ACTION_NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED -> {\n                val channelId = intent.getStringExtra(NotificationManager.EXTRA_NOTIFICATION_CHANNEL_ID)\n                nm.getNotificationChannel(channelId).group\n            }\n            NotificationManager.ACTION_NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED -> {\n                intent.getStringExtra(NotificationManager.EXTRA_NOTIFICATION_CHANNEL_GROUP_ID)\n            }\n            else -> null\n        } ?: return\n\n        accountManager.getAccountByIdentifier(accountIdentifier)?.let { account ->\n            if (account.isPushNotificationsEnabled()) {\n                externalScope.launch {\n                    notificationService.updatePushSubscription(account)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/receiver/SendStatusBroadcastReceiver.kt",
    "content": "/* Copyright 2018 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.receiver\n\nimport android.annotation.SuppressLint\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport android.util.Log\nimport androidx.core.app.NotificationCompat\nimport androidx.core.app.NotificationManagerCompat\nimport androidx.core.app.RemoteInput\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.systemnotifications.NotificationChannelData\nimport com.keylesspalace.tusky.components.systemnotifications.NotificationService\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.service.SendStatusService\nimport com.keylesspalace.tusky.service.StatusToSend\nimport com.keylesspalace.tusky.util.getSerializableExtraCompat\nimport com.keylesspalace.tusky.util.randomAlphanumericString\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass SendStatusBroadcastReceiver : BroadcastReceiver() {\n\n    @Inject\n    lateinit var accountManager: AccountManager\n\n    @SuppressLint(\"MissingPermission\")\n    override fun onReceive(context: Context, intent: Intent) {\n        if (intent.action == NotificationService.REPLY_ACTION) {\n            val serverNotificationId = intent.getStringExtra(NotificationService.KEY_SERVER_NOTIFICATION_ID)\n            val senderId = intent.getLongExtra(NotificationService.KEY_SENDER_ACCOUNT_ID, -1)\n            val senderIdentifier = intent.getStringExtra(\n                NotificationService.KEY_SENDER_ACCOUNT_IDENTIFIER\n            )!!\n            val senderFullName = intent.getStringExtra(\n                NotificationService.KEY_SENDER_ACCOUNT_FULL_NAME\n            )\n            val citedStatusId = intent.getStringExtra(NotificationService.KEY_CITED_STATUS_ID)\n            val visibility =\n                intent.getSerializableExtraCompat<Status.Visibility>(NotificationService.KEY_VISIBILITY)!!\n            val spoiler = intent.getStringExtra(NotificationService.KEY_SPOILER).orEmpty()\n            val mentions = intent.getStringArrayExtra(NotificationService.KEY_MENTIONS).orEmpty()\n\n            val account = accountManager.getAccountById(senderId)\n\n            val notificationManager = NotificationManagerCompat.from(context)\n\n            val message = getReplyMessage(intent)\n\n            if (account == null) {\n                Log.w(TAG, \"Account \\\"$senderId\\\" not found in database. Aborting quick reply!\")\n\n                val notification = NotificationCompat.Builder(\n                    context,\n                    NotificationChannelData.MENTION.getChannelId(senderIdentifier)\n                )\n                    .setSmallIcon(R.drawable.tusky_notification_icon)\n                    .setColor(context.getColor(R.color.tusky_blue))\n                    .setGroup(senderFullName)\n                    .setDefaults(0) // We don't want this to make any sound or vibration\n                    .setOnlyAlertOnce(true)\n                    .setContentTitle(context.getString(R.string.error_generic))\n                    .setContentText(context.getString(R.string.error_sender_account_gone))\n                    .setSubText(senderFullName)\n                    .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)\n                    .setCategory(NotificationCompat.CATEGORY_SOCIAL)\n                    .build()\n\n                notificationManager.notify(serverNotificationId, senderId.toInt(), notification)\n            } else {\n                val text = mentions.joinToString(\" \", postfix = \" \") { \"@$it\" } + message.toString()\n\n                val sendIntent = SendStatusService.sendStatusIntent(\n                    context,\n                    StatusToSend(\n                        text = text,\n                        warningText = spoiler,\n                        visibility = visibility.stringValue,\n                        sensitive = false,\n                        media = emptyList(),\n                        scheduledAt = null,\n                        inReplyToId = citedStatusId,\n                        poll = null,\n                        replyingStatusContent = null,\n                        replyingStatusAuthorUsername = null,\n                        accountId = account.id,\n                        draftId = -1,\n                        idempotencyKey = randomAlphanumericString(16),\n                        retries = 0,\n                        language = null,\n                        statusId = null\n                    )\n                )\n\n                context.startService(sendIntent)\n\n                // Notifications with remote input active can't be cancelled, so let's replace it with another one that will dismiss automatically\n                val notification = NotificationCompat.Builder(\n                    context,\n                    NotificationChannelData.MENTION.getChannelId(senderIdentifier)\n                )\n                    .setSmallIcon(R.drawable.tusky_notification_icon)\n                    .setColor(context.getColor(R.color.notification_color))\n                    .setGroup(senderFullName)\n                    .setDefaults(0) // We don't want this to make any sound or vibration\n                    .setOnlyAlertOnce(true)\n                    .setContentTitle(context.getString(R.string.reply_sending))\n                    .setContentText(context.getString(R.string.reply_sending_long))\n                    .setSubText(senderFullName)\n                    .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)\n                    .setCategory(NotificationCompat.CATEGORY_SOCIAL)\n                    .setTimeoutAfter(5000)\n                    .build()\n\n                notificationManager.notify(serverNotificationId, senderId.toInt(), notification)\n            }\n        }\n    }\n\n    private fun getReplyMessage(intent: Intent): CharSequence {\n        val remoteInput = RemoteInput.getResultsFromIntent(intent)\n\n        return remoteInput?.getCharSequence(NotificationService.KEY_REPLY, \"\") ?: \"\"\n    }\n\n    companion object {\n        const val TAG = \"SendStatusBroadcastReceiver\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/receiver/UnifiedPushBroadcastReceiver.kt",
    "content": "/* Copyright 2022 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.receiver\n\nimport android.content.Context\nimport android.util.Log\nimport com.keylesspalace.tusky.components.systemnotifications.NotificationService\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.di.ApplicationScope\nimport com.keylesspalace.tusky.network.MastodonApi\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.launch\nimport org.unifiedpush.android.connector.MessagingReceiver\n\n@AndroidEntryPoint\nclass UnifiedPushBroadcastReceiver : MessagingReceiver() {\n    @Inject\n    lateinit var accountManager: AccountManager\n\n    @Inject\n    lateinit var mastodonApi: MastodonApi\n\n    @Inject\n    lateinit var notificationService: NotificationService\n\n    @Inject\n    @ApplicationScope\n    lateinit var applicationScope: CoroutineScope\n\n    override fun onMessage(context: Context, message: ByteArray, instance: String) {\n        Log.d(TAG, \"New message received for account $instance: #${message.size}\")\n        val account = accountManager.getAccountById(instance.toLong())\n        account?.let {\n            notificationService.fetchNotificationsOnPushMessage(it)\n        }\n    }\n\n    override fun onNewEndpoint(context: Context, endpoint: String, instance: String) {\n        Log.d(TAG, \"Endpoint available for account $instance: $endpoint\")\n        accountManager.getAccountById(instance.toLong())?.let {\n            applicationScope.launch { notificationService.registerPushEndpoint(it, endpoint) }\n        }\n    }\n\n    override fun onRegistrationFailed(context: Context, instance: String) = Unit\n\n    override fun onUnregistered(context: Context, instance: String) {\n        Log.d(TAG, \"Endpoint unregistered for account $instance\")\n        accountManager.getAccountById(instance.toLong())?.let {\n            // It's fine if the account does not exist anymore -- that means it has been logged out\n            // TODO its not: this is the Mastodon side and should be done (unregistered)\n            applicationScope.launch { notificationService.unregisterPushEndpoint(it) }\n        }\n    }\n\n    companion object {\n        const val TAG = \"UnifiedPushBroadcastReceiver\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/service/SendStatusService.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.service\n\nimport android.app.Notification\nimport android.app.NotificationChannel\nimport android.app.NotificationManager\nimport android.app.PendingIntent\nimport android.app.Service\nimport android.content.ClipData\nimport android.content.ClipDescription\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Build\nimport android.os.IBinder\nimport android.os.Parcelable\nimport android.util.Log\nimport androidx.annotation.StringRes\nimport androidx.core.app.NotificationCompat\nimport androidx.core.app.ServiceCompat\nimport at.connyduck.calladapter.networkresult.fold\nimport com.keylesspalace.tusky.MainActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.StatusChangedEvent\nimport com.keylesspalace.tusky.appstore.StatusComposedEvent\nimport com.keylesspalace.tusky.appstore.StatusScheduledEvent\nimport com.keylesspalace.tusky.components.compose.MediaUploader\nimport com.keylesspalace.tusky.components.compose.UploadEvent\nimport com.keylesspalace.tusky.components.drafts.DraftHelper\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.entity.MediaAttribute\nimport com.keylesspalace.tusky.entity.NewPoll\nimport com.keylesspalace.tusky.entity.NewStatus\nimport com.keylesspalace.tusky.entity.ScheduledStatusReply\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.getParcelableExtraCompat\nimport com.keylesspalace.tusky.util.unsafeLazy\nimport dagger.hilt.android.AndroidEntryPoint\nimport java.util.concurrent.ConcurrentHashMap\nimport java.util.concurrent.TimeUnit\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport kotlinx.parcelize.Parcelize\nimport retrofit2.HttpException\n\n@AndroidEntryPoint\nclass SendStatusService : Service() {\n\n    @Inject\n    lateinit var mastodonApi: MastodonApi\n\n    @Inject\n    lateinit var accountManager: AccountManager\n\n    @Inject\n    lateinit var eventHub: EventHub\n\n    @Inject\n    lateinit var draftHelper: DraftHelper\n\n    @Inject\n    lateinit var mediaUploader: MediaUploader\n\n    private val supervisorJob = SupervisorJob()\n    private val serviceScope = CoroutineScope(Dispatchers.Main + supervisorJob)\n\n    private val statusesToSend = ConcurrentHashMap<Int, StatusToSend>()\n    private val sendJobs = ConcurrentHashMap<Int, Job>()\n\n    private val notificationManager by unsafeLazy {\n        getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager\n    }\n\n    override fun onBind(intent: Intent): IBinder? = null\n\n    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {\n        if (intent.hasExtra(KEY_STATUS)) {\n            val statusToSend: StatusToSend = intent.getParcelableExtraCompat(KEY_STATUS)\n                ?: throw IllegalStateException(\"SendStatusService started without $KEY_STATUS extra\")\n\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n                val channel =\n                    NotificationChannel(\n                        CHANNEL_ID,\n                        getString(R.string.send_post_notification_channel_name),\n                        NotificationManager.IMPORTANCE_LOW\n                    )\n                notificationManager.createNotificationChannel(channel)\n            }\n\n            var notificationText = statusToSend.warningText\n            if (notificationText.isBlank()) {\n                notificationText = statusToSend.text\n            }\n\n            val builder = NotificationCompat.Builder(this, CHANNEL_ID)\n                .setSmallIcon(R.drawable.tusky_notification_icon)\n                .setContentTitle(getString(R.string.send_post_notification_title))\n                .setContentText(notificationText)\n                .setProgress(1, 0, true)\n                .setOngoing(true)\n                .setColor(getColor(R.color.notification_color))\n                .addAction(\n                    0,\n                    getString(android.R.string.cancel),\n                    cancelSendingIntent(sendingNotificationId)\n                )\n\n            if (statusesToSend.isEmpty() || Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n                ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_DETACH)\n                startForeground(sendingNotificationId, builder.build())\n            } else {\n                notificationManager.notify(sendingNotificationId, builder.build())\n            }\n\n            statusesToSend[sendingNotificationId] = statusToSend\n            sendStatus(sendingNotificationId--)\n        } else if (intent.hasExtra(KEY_CANCEL)) {\n            cancelSending(intent.getIntExtra(KEY_CANCEL, 0))\n        }\n\n        return START_NOT_STICKY\n    }\n\n    override fun onTimeout(startId: Int) {\n        // https://developer.android.com/about/versions/14/changes/fgs-types-required#short-service\n        // max time for short service reached on Android 14+, stop sending\n        statusesToSend.forEach { (statusId, _) ->\n            serviceScope.launch {\n                failSending(statusId)\n            }\n        }\n    }\n\n    private fun sendStatus(statusId: Int) {\n        // when statusToSend == null, sending has been canceled\n        val statusToSend = statusesToSend[statusId] ?: return\n\n        // when account == null, user has logged out, cancel sending\n        val account = accountManager.getAccountById(statusToSend.accountId)\n\n        if (account == null) {\n            statusesToSend.remove(statusId)\n            notificationManager.cancel(statusId)\n            stopSelfWhenDone()\n            return\n        }\n\n        statusToSend.retries++\n\n        sendJobs[statusId] = serviceScope.launch {\n            // first, wait for media uploads to finish\n            val media = statusToSend.media.map { mediaItem ->\n                if (mediaItem.id == null) {\n                    when (val uploadState = mediaUploader.getMediaUploadState(mediaItem.localId)) {\n                        is UploadEvent.FinishedEvent -> mediaItem.copy(id = uploadState.mediaId, processed = uploadState.processed)\n                        is UploadEvent.ErrorEvent -> {\n                            Log.w(TAG, \"failed uploading media\", uploadState.error)\n                            failSending(statusId)\n                            stopSelfWhenDone()\n                            return@launch\n                        }\n                    }\n                } else {\n                    mediaItem\n                }\n            }\n\n            // then wait until server finished processing the media\n            try {\n                var mediaCheckRetries = 0\n                while (media.any { mediaItem -> !mediaItem.processed }) {\n                    delay(1000L * mediaCheckRetries)\n                    media.forEach { mediaItem ->\n                        if (!mediaItem.processed) {\n                            when (mastodonApi.getMedia(mediaItem.id!!).code()) {\n                                200 -> mediaItem.processed = true // success\n                                206 -> { } // media is still being processed, continue checking\n                                else -> { // some kind of server error, retrying probably doesn't make sense\n                                    failSending(statusId)\n                                    stopSelfWhenDone()\n                                    return@launch\n                                }\n                            }\n                        }\n                    }\n                    mediaCheckRetries++\n                }\n            } catch (e: Exception) {\n                Log.w(TAG, \"failed getting media status\", e)\n                retrySending(statusId)\n                return@launch\n            }\n\n            val isNew = statusToSend.statusId == null\n\n            if (isNew) {\n                media.forEach { mediaItem ->\n                    if (mediaItem.processed && (mediaItem.description != null || mediaItem.focus != null)) {\n                        mastodonApi.updateMedia(mediaItem.id!!, mediaItem.description, mediaItem.focus?.toMastodonApiString())\n                            .fold({\n                            }, { throwable ->\n                                Log.w(TAG, \"failed to update media on status send\", throwable)\n                                failOrRetry(throwable, statusId)\n\n                                return@launch\n                            })\n                    }\n                }\n            }\n\n            // finally, send the new status\n            val newStatus = NewStatus(\n                status = statusToSend.text,\n                warningText = statusToSend.warningText,\n                inReplyToId = statusToSend.inReplyToId,\n                visibility = statusToSend.visibility,\n                sensitive = statusToSend.sensitive,\n                mediaIds = media.map { it.id!! },\n                scheduledAt = statusToSend.scheduledAt,\n                poll = statusToSend.poll,\n                language = statusToSend.language,\n                mediaAttributes = media.map { mediaItem ->\n                    MediaAttribute(\n                        id = mediaItem.id!!,\n                        description = mediaItem.description,\n                        focus = mediaItem.focus?.toMastodonApiString(),\n                        thumbnail = null\n                    )\n                }\n            )\n\n            val scheduled = !statusToSend.scheduledAt.isNullOrEmpty()\n\n            val sendResult = if (isNew) {\n                if (!scheduled) {\n                    mastodonApi.createStatus(\n                        \"Bearer \" + account.accessToken,\n                        account.domain,\n                        statusToSend.idempotencyKey,\n                        newStatus\n                    )\n                } else {\n                    mastodonApi.createScheduledStatus(\n                        \"Bearer \" + account.accessToken,\n                        account.domain,\n                        statusToSend.idempotencyKey,\n                        newStatus\n                    )\n                }\n            } else {\n                mastodonApi.editStatus(\n                    statusToSend.statusId!!,\n                    \"Bearer \" + account.accessToken,\n                    account.domain,\n                    statusToSend.idempotencyKey,\n                    newStatus\n                )\n            }\n\n            sendResult.fold({ sentStatus ->\n                statusesToSend.remove(statusId)\n                // If the status was loaded from a draft, delete the draft and associated media files.\n                if (statusToSend.draftId != 0) {\n                    draftHelper.deleteDraftAndAttachments(statusToSend.draftId)\n                }\n\n                mediaUploader.cancelUploadScope(*statusToSend.media.map { it.localId }.toIntArray())\n\n                if (scheduled) {\n                    eventHub.dispatch(StatusScheduledEvent((sentStatus as ScheduledStatusReply).id))\n                } else if (!isNew) {\n                    eventHub.dispatch(StatusChangedEvent(sentStatus as Status))\n                } else {\n                    eventHub.dispatch(StatusComposedEvent(sentStatus as Status))\n                }\n\n                notificationManager.cancel(statusId)\n            }, { throwable ->\n                Log.w(TAG, \"failed sending status\", throwable)\n                failOrRetry(throwable, statusId)\n            })\n            stopSelfWhenDone()\n        }\n    }\n\n    private suspend fun failOrRetry(throwable: Throwable, statusId: Int) {\n        if (throwable is HttpException) {\n            // the server refused to accept, save status & show error message\n            failSending(statusId)\n        } else {\n            // a network problem occurred, let's retry sending the status\n            retrySending(statusId)\n        }\n    }\n\n    private suspend fun retrySending(statusId: Int) {\n        // when statusToSend == null, sending has been canceled\n        val statusToSend = statusesToSend[statusId] ?: return\n\n        val backoff = TimeUnit.SECONDS.toMillis(\n            statusToSend.retries.toLong()\n        ).coerceAtMost(MAX_RETRY_INTERVAL)\n\n        delay(backoff)\n        sendStatus(statusId)\n    }\n\n    private fun stopSelfWhenDone() {\n        if (statusesToSend.isEmpty()) {\n            ServiceCompat.stopForeground(\n                this@SendStatusService,\n                ServiceCompat.STOP_FOREGROUND_REMOVE\n            )\n            stopSelf()\n        }\n    }\n\n    private suspend fun failSending(statusId: Int) {\n        val failedStatus = statusesToSend.remove(statusId)\n        if (failedStatus != null) {\n            mediaUploader.cancelUploadScope(*failedStatus.media.map { it.localId }.toIntArray())\n\n            saveStatusToDrafts(failedStatus, failedToSendAlert = true)\n\n            val notification = buildDraftNotification(\n                R.string.send_post_notification_error_title,\n                R.string.send_post_notification_saved_content,\n                failedStatus.accountId,\n                statusId\n            )\n\n            notificationManager.cancel(statusId)\n            notificationManager.notify(errorNotificationId++, notification)\n        }\n\n        // NOTE only this removes the \"Sending...\" notification (added with startForeground() above)\n        stopSelfWhenDone()\n    }\n\n    private fun cancelSending(statusId: Int) = serviceScope.launch {\n        val statusToCancel = statusesToSend.remove(statusId)\n        if (statusToCancel != null) {\n            mediaUploader.cancelUploadScope(*statusToCancel.media.map { it.localId }.toIntArray())\n\n            val sendJob = sendJobs.remove(statusId)\n            sendJob?.cancel()\n\n            saveStatusToDrafts(statusToCancel, failedToSendAlert = false)\n\n            val notification = buildDraftNotification(\n                R.string.send_post_notification_cancel_title,\n                R.string.send_post_notification_saved_content,\n                statusToCancel.accountId,\n                statusId\n            )\n\n            notificationManager.notify(statusId, notification)\n\n            delay(5000)\n\n            stopSelfWhenDone()\n        }\n    }\n\n    private suspend fun saveStatusToDrafts(status: StatusToSend, failedToSendAlert: Boolean) {\n        draftHelper.saveDraft(\n            draftId = status.draftId,\n            accountId = status.accountId,\n            inReplyToId = status.inReplyToId,\n            content = status.text,\n            contentWarning = status.warningText,\n            sensitive = status.sensitive,\n            visibility = Status.Visibility.fromStringValue(status.visibility),\n            mediaUris = status.media.map { it.uri },\n            mediaDescriptions = status.media.map { it.description },\n            mediaFocus = status.media.map { it.focus },\n            poll = status.poll,\n            failedToSend = true,\n            failedToSendAlert = failedToSendAlert,\n            scheduledAt = status.scheduledAt,\n            language = status.language,\n            statusId = status.statusId\n        )\n    }\n\n    private fun cancelSendingIntent(statusId: Int): PendingIntent {\n        val intent = Intent(this, SendStatusService::class.java)\n        intent.putExtra(KEY_CANCEL, statusId)\n        return PendingIntent.getService(\n            this,\n            statusId,\n            intent,\n            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE,\n        )\n    }\n\n    private fun buildDraftNotification(\n        @StringRes title: Int,\n        @StringRes content: Int,\n        accountId: Long,\n        statusId: Int\n    ): Notification {\n        val intent = MainActivity.draftIntent(this, accountId)\n\n        val pendingIntent = PendingIntent.getActivity(\n            this,\n            statusId,\n            intent,\n            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE,\n        )\n\n        return NotificationCompat.Builder(this@SendStatusService, CHANNEL_ID)\n            .setSmallIcon(R.drawable.tusky_notification_icon)\n            .setContentTitle(getString(title))\n            .setContentText(getString(content))\n            .setColor(getColor(R.color.notification_color))\n            .setAutoCancel(true)\n            .setOngoing(false)\n            .setContentIntent(pendingIntent)\n            .build()\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        supervisorJob.cancel()\n    }\n\n    companion object {\n        private const val TAG = \"SendStatusService\"\n\n        private const val KEY_STATUS = \"status\"\n        private const val KEY_CANCEL = \"cancel_id\"\n        private const val CHANNEL_ID = \"send_toots\"\n\n        private val MAX_RETRY_INTERVAL = TimeUnit.MINUTES.toMillis(1)\n\n        private var sendingNotificationId = -1 // use negative ids to not clash with other notis\n        private var errorNotificationId = Int.MIN_VALUE // use even more negative ids to not clash with other notis\n\n        fun sendStatusIntent(context: Context, statusToSend: StatusToSend): Intent {\n            val intent = Intent(context, SendStatusService::class.java)\n            intent.putExtra(KEY_STATUS, statusToSend)\n\n            if (statusToSend.media.isNotEmpty()) {\n                // forward uri permissions\n                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)\n                val uriClip = ClipData(\n                    ClipDescription(\"Status Media\", arrayOf(\"image/*\", \"video/*\")),\n                    ClipData.Item(statusToSend.media[0].uri)\n                )\n                statusToSend.media\n                    .drop(1)\n                    .forEach { mediaItem ->\n                        uriClip.addItem(ClipData.Item(mediaItem.uri))\n                    }\n\n                intent.clipData = uriClip\n            }\n\n            return intent\n        }\n    }\n}\n\n@Parcelize\ndata class StatusToSend(\n    val text: String,\n    val warningText: String,\n    val visibility: String,\n    val sensitive: Boolean,\n    val media: List<MediaToSend>,\n    val scheduledAt: String?,\n    val inReplyToId: String?,\n    val poll: NewPoll?,\n    val replyingStatusContent: String?,\n    val replyingStatusAuthorUsername: String?,\n    val accountId: Long,\n    val draftId: Int,\n    val idempotencyKey: String,\n    var retries: Int,\n    val language: String?,\n    val statusId: String?\n) : Parcelable\n\n@Parcelize\ndata class MediaToSend(\n    val localId: Int,\n    // null if media is not yet completely uploaded\n    val id: String?,\n    val uri: String,\n    val description: String?,\n    val focus: Attachment.Focus?,\n    var processed: Boolean\n) : Parcelable\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/service/ServiceClient.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.service\n\nimport android.content.Context\nimport androidx.core.content.ContextCompat\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport javax.inject.Inject\n\nclass ServiceClient @Inject constructor(@ApplicationContext private val context: Context) {\n    fun sendToot(tootToSend: StatusToSend) {\n        val intent = SendStatusService.sendStatusIntent(context, tootToSend)\n        ContextCompat.startForegroundService(context, intent)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/service/TuskyTileService.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.service\n\nimport android.annotation.SuppressLint\nimport android.app.PendingIntent\nimport android.content.Intent\nimport android.os.Build\nimport android.service.quicksettings.TileService\nimport com.keylesspalace.tusky.MainActivity\nimport com.keylesspalace.tusky.components.compose.ComposeActivity\n\n/**\n * Small Addition that adds in a QuickSettings tile\n * opens the Compose activity or shows an account selector when multiple accounts are present\n */\nclass TuskyTileService : TileService() {\n\n    @SuppressLint(\"StartActivityAndCollapseDeprecated\")\n    @Suppress(\"DEPRECATION\")\n    override fun onClick() {\n        val intent = MainActivity.composeIntent(this, ComposeActivity.ComposeOptions())\n        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {\n            val pendingIntent = PendingIntent.getActivity(this, 1, intent, PendingIntent.FLAG_IMMUTABLE)\n            startActivityAndCollapse(pendingIntent)\n        } else {\n            startActivityAndCollapse(intent)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/settings/AccountPreferenceDataStore.kt",
    "content": "package com.keylesspalace.tusky.settings\n\nimport androidx.preference.PreferenceDataStore\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.PreferenceChangedEvent\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.di.ApplicationScope\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.launch\n\nclass AccountPreferenceDataStore @Inject constructor(\n    private val accountManager: AccountManager,\n    private val eventHub: EventHub,\n    @ApplicationScope private val externalScope: CoroutineScope\n) : PreferenceDataStore() {\n    private val account: AccountEntity = accountManager.activeAccount!!\n\n    override fun getBoolean(key: String, defValue: Boolean): Boolean {\n        return when (key) {\n            PrefKeys.ALWAYS_SHOW_SENSITIVE_MEDIA -> account.alwaysShowSensitiveMedia\n            PrefKeys.ALWAYS_OPEN_SPOILER -> account.alwaysOpenSpoiler\n            PrefKeys.MEDIA_PREVIEW_ENABLED -> account.mediaPreviewEnabled\n            PrefKeys.TAB_FILTER_HOME_BOOSTS -> account.isShowHomeBoosts\n            PrefKeys.TAB_FILTER_HOME_REPLIES -> account.isShowHomeReplies\n            PrefKeys.TAB_SHOW_HOME_SELF_BOOSTS -> account.isShowHomeSelfBoosts\n            else -> defValue\n        }\n    }\n\n    override fun putBoolean(key: String, value: Boolean) {\n        externalScope.launch {\n            accountManager.updateAccount(account) {\n                when (key) {\n                    PrefKeys.ALWAYS_SHOW_SENSITIVE_MEDIA -> copy(alwaysShowSensitiveMedia = value)\n                    PrefKeys.ALWAYS_OPEN_SPOILER -> copy(alwaysOpenSpoiler = value)\n                    PrefKeys.MEDIA_PREVIEW_ENABLED -> copy(mediaPreviewEnabled = value)\n                    PrefKeys.TAB_FILTER_HOME_BOOSTS -> copy(isShowHomeBoosts = value)\n                    PrefKeys.TAB_FILTER_HOME_REPLIES -> copy(isShowHomeReplies = value)\n                    PrefKeys.TAB_SHOW_HOME_SELF_BOOSTS -> copy(isShowHomeSelfBoosts = value)\n                    else -> this\n                }\n            }\n            eventHub.dispatch(PreferenceChangedEvent(key))\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/settings/DefaultReplyVisibility.kt",
    "content": "package com.keylesspalace.tusky.settings\n\nimport com.keylesspalace.tusky.entity.Status\n\nenum class DefaultReplyVisibility(val int: Int) {\n    MATCH_DEFAULT_POST_VISIBILITY(0),\n    PUBLIC(1),\n    UNLISTED(2),\n    PRIVATE(3),\n    DIRECT(4);\n\n    val stringValue: String\n        get() = when (this) {\n            MATCH_DEFAULT_POST_VISIBILITY -> \"match_default_post_visibility\"\n            PUBLIC -> \"public\"\n            UNLISTED -> \"unlisted\"\n            PRIVATE -> \"private\"\n            DIRECT -> \"direct\"\n        }\n\n    fun toVisibilityOr(default: Status.Visibility): Status.Visibility {\n        return when (this) {\n            PUBLIC -> Status.Visibility.PUBLIC\n            UNLISTED -> Status.Visibility.UNLISTED\n            PRIVATE -> Status.Visibility.PRIVATE\n            DIRECT -> Status.Visibility.DIRECT\n            else -> default\n        }\n    }\n\n    companion object {\n        fun fromInt(int: Int): DefaultReplyVisibility {\n            return when (int) {\n                4 -> DIRECT\n                3 -> PRIVATE\n                2 -> UNLISTED\n                1 -> PUBLIC\n                else -> MATCH_DEFAULT_POST_VISIBILITY\n            }\n        }\n        fun fromStringValue(s: String): DefaultReplyVisibility {\n            return when (s) {\n                \"public\" -> PUBLIC\n                \"unlisted\" -> UNLISTED\n                \"private\" -> PRIVATE\n                \"direct\" -> DIRECT\n                else -> MATCH_DEFAULT_POST_VISIBILITY\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/settings/ProxyConfiguration.kt",
    "content": "package com.keylesspalace.tusky.settings\n\nimport java.net.IDN\n\nclass ProxyConfiguration private constructor(\n    val hostname: String,\n    val port: Int\n) {\n    companion object {\n        fun create(hostname: String, port: Int): ProxyConfiguration? {\n            if (isValidHostname(IDN.toASCII(hostname)) && isValidProxyPort(port)) {\n                return ProxyConfiguration(hostname, port)\n            }\n            return null\n        }\n        fun isValidProxyPort(value: Any): Boolean = when (value) {\n            is String -> if (value == \"\") {\n                true\n            } else {\n                value.runCatching(String::toInt).map(\n                    PROXY_RANGE::contains\n                ).getOrDefault(false)\n            }\n            is Int -> PROXY_RANGE.contains(value)\n            else -> false\n        }\n        fun isValidHostname(hostname: String): Boolean =\n            IP_ADDRESS_REGEX.matches(hostname) || HOSTNAME_REGEX.matches(hostname)\n        const val MIN_PROXY_PORT = 1\n        const val MAX_PROXY_PORT = 65535\n    }\n}\n\nprivate val PROXY_RANGE =\n    IntRange(ProxyConfiguration.MIN_PROXY_PORT, ProxyConfiguration.MAX_PROXY_PORT)\nprivate val IP_ADDRESS_REGEX =\n    Regex(\n        \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$\"\n    )\nprivate val HOSTNAME_REGEX =\n    Regex(\n        \"^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\\\-]*[a-zA-Z0-9])\\\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\\\-]*[A-Za-z0-9])$\"\n    )\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/settings/SettingsConstants.kt",
    "content": "package com.keylesspalace.tusky.settings\n\nenum class AppTheme(val value: String) {\n    NIGHT(\"night\"),\n    DAY(\"day\"),\n    BLACK(\"black\"),\n    AUTO(\"auto\"),\n    AUTO_SYSTEM(\"auto_system\"),\n    AUTO_SYSTEM_BLACK(\"auto_system_black\");\n\n    companion object {\n        fun stringValues() = entries.map { it.value }.toTypedArray()\n\n        @JvmField\n        val DEFAULT = AUTO_SYSTEM\n    }\n}\n\n/**\n * Current preferences schema version. Format is 4-digit year + 2 digit month (zero padded) + 2\n * digit day (zero padded) + 2 digit counter (zero padded).\n *\n * If you make an incompatible change to the preferences schema you must:\n *\n * - Update this value\n * - Update the code in\n *   [TuskyApplication.upgradeSharedPreferences][com.keylesspalace.tusky.TuskyApplication.upgradeSharedPreferences]\n *   to migrate from the old schema version to the new schema version.\n *\n * An incompatible change is:\n *\n * - Deleting a preference. The migration should delete the old preference.\n * - Changing a preference's default value (e.g., from true to false, or from one enum value to\n *   another). The migration should check to see if the user had set an explicit value for\n *   that preference ([SharedPreferences.contains][android.content.SharedPreferences.contains]);\n *   if they hadn't then the migration should set the *old* default value as the preference's\n *   value, so the app behaviour does not unexpectedly change.\n * - Changing a preference's type (e.g,. from a boolean to an enum). If you do this you may want\n *   to give the preference a different name, but you still need to migrate the user's previous\n *   preference value to the new preference.\n * - Renaming a preference key. The migration should copy the user's previous value for the\n *   preference under the old key to the value for the new, and delete the old preference.\n *\n * A compatible change is:\n *\n * - Adding a new preference that does not change the interpretation of an existing preference\n */\nconst val SCHEMA_VERSION = 2025032401\n\n/** The schema version for fresh installs */\nconst val NEW_INSTALL_SCHEMA_VERSION = 0\n\nobject PrefKeys {\n    // Note: not all of these keys are actually used as SharedPreferences keys but we must give\n    // each preference a key for it to work.\n\n    const val SCHEMA_VERSION: String = \"schema_version\"\n    const val LAST_USED_PUSH_PROVDER = \"lastUsedPushProvider\"\n\n    const val APP_THEME = \"appTheme\"\n    const val LANGUAGE = \"language\"\n    const val STATUS_TEXT_SIZE = \"statusTextSize\"\n    const val READING_ORDER = \"readingOrder\"\n    const val MAIN_NAV_POSITION = \"mainNavPosition\"\n    const val HIDE_TOP_TOOLBAR = \"hideTopToolbar\"\n    const val SHOW_NOTIFICATIONS_FILTER = \"showNotificationsFilter\"\n    const val ABSOLUTE_TIME_VIEW = \"absoluteTimeView\"\n    const val SHOW_BOT_OVERLAY = \"showBotOverlay\"\n    const val ANIMATE_GIF_AVATARS = \"animateGifAvatars\"\n    const val USE_BLURHASH = \"useBlurhash\"\n    const val SHOW_SELF_USERNAME = \"showSelfUsername\"\n    const val SHOW_CARDS_IN_TIMELINES = \"showCardsInTimelines\"\n    const val CONFIRM_REBLOGS = \"confirmReblogs\"\n    const val CONFIRM_FAVOURITES = \"confirmFavourites\"\n    const val CONFIRM_FOLLOWS = \"confirmFollows\"\n    const val ENABLE_SWIPE_FOR_TABS = \"enableSwipeForTabs\"\n    const val ANIMATE_CUSTOM_EMOJIS = \"animateCustomEmojis\"\n    const val SHOW_STATS_INLINE = \"showStatsInline\"\n\n    const val CUSTOM_TABS = \"customTabs\"\n    const val WELLBEING_LIMITED_NOTIFICATIONS = \"wellbeingModeLimitedNotifications\"\n    const val WELLBEING_HIDE_STATS_POSTS = \"wellbeingHideStatsPosts\"\n    const val WELLBEING_HIDE_STATS_PROFILE = \"wellbeingHideStatsProfile\"\n\n    const val HTTP_PROXY_ENABLED = \"httpProxyEnabled\"\n    const val HTTP_PROXY_SERVER = \"httpProxyServer\"\n    const val HTTP_PROXY_PORT = \"httpProxyPort\"\n\n    const val DEFAULT_POST_PRIVACY = \"defaultPostPrivacy\"\n    const val DEFAULT_POST_LANGUAGE = \"defaultPostLanguage\"\n    const val DEFAULT_REPLY_PRIVACY = \"defaultReplyPrivacy\"\n    const val DEFAULT_MEDIA_SENSITIVITY = \"defaultMediaSensitivity\"\n    const val MEDIA_PREVIEW_ENABLED = \"mediaPreviewEnabled\"\n    const val ALWAYS_SHOW_SENSITIVE_MEDIA = \"alwaysShowSensitiveMedia\"\n    const val ALWAYS_OPEN_SPOILER = \"alwaysOpenSpoiler\"\n\n    const val NOTIFICATIONS_ENABLED = \"notificationsEnabled\"\n    const val NOTIFICATION_ALERT_LIGHT = \"notificationAlertLight\"\n    const val NOTIFICATION_ALERT_VIBRATE = \"notificationAlertVibrate\"\n    const val NOTIFICATION_ALERT_SOUND = \"notificationAlertSound\"\n\n    const val TAB_FILTER_HOME_REPLIES = \"tabFilterHomeReplies_v2\" // This was changed once to reset an unintentionally set default.\n    const val TAB_FILTER_HOME_BOOSTS = \"tabFilterHomeBoosts\"\n    const val TAB_SHOW_HOME_SELF_BOOSTS = \"tabShowHomeSelfBoosts\"\n\n    /** UI text scaling factor, stored as float, 100 = 100% = no scaling */\n    const val UI_TEXT_SCALE_RATIO = \"uiTextScaleRatio\"\n\n    /** UI text scaling factor, stored as float, 100 = 100% = no scaling */\n    const val REBLOG_PRIVACY = \"reblogPrivacy\"\n\n    object Deprecated {\n        const val FAB_HIDE = \"fabHide\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/settings/SettingsDSL.kt",
    "content": "package com.keylesspalace.tusky.settings\n\nimport android.content.Context\nimport android.widget.Button\nimport androidx.activity.result.ActivityResultRegistryOwner\nimport androidx.annotation.StringRes\nimport androidx.core.widget.doAfterTextChanged\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.preference.EditTextPreference\nimport androidx.preference.ListPreference\nimport androidx.preference.Preference\nimport androidx.preference.PreferenceCategory\nimport androidx.preference.PreferenceFragmentCompat\nimport androidx.preference.PreferenceScreen\nimport androidx.preference.SwitchPreferenceCompat\nimport com.keylesspalace.tusky.view.SliderPreference\nimport de.c1710.filemojicompat_ui.views.picker.preference.EmojiPickerPreference\n\nclass PreferenceParent(\n    val context: Context,\n    val addPref: (pref: Preference) -> Unit\n)\n\ninline fun PreferenceParent.preference(builder: Preference.() -> Unit): Preference {\n    val pref = Preference(context)\n    builder(pref)\n    addPref(pref)\n    return pref\n}\n\ninline fun PreferenceParent.listPreference(builder: ListPreference.() -> Unit): ListPreference {\n    val pref = ListPreference(context)\n    builder(pref)\n    addPref(pref)\n    return pref\n}\n\ninline fun <A> PreferenceParent.emojiPreference(\n    activity: A,\n    builder: EmojiPickerPreference.() -> Unit\n): EmojiPickerPreference\n    where A : Context, A : ActivityResultRegistryOwner, A : LifecycleOwner {\n    val pref = EmojiPickerPreference.get(activity)\n    builder(pref)\n    addPref(pref)\n    return pref\n}\n\ninline fun PreferenceParent.sliderPreference(\n    builder: SliderPreference.() -> Unit\n): SliderPreference {\n    val pref = SliderPreference(context)\n    builder(pref)\n    addPref(pref)\n    return pref\n}\n\ninline fun PreferenceParent.switchPreference(\n    builder: SwitchPreferenceCompat.() -> Unit\n): SwitchPreferenceCompat {\n    val pref = SwitchPreferenceCompat(context)\n    builder(pref)\n    addPref(pref)\n    return pref\n}\n\ninline fun PreferenceParent.validatedEditTextPreference(\n    errorMessage: String?,\n    crossinline isValid: (a: String) -> Boolean,\n    builder: EditTextPreference.() -> Unit\n): EditTextPreference {\n    val pref = EditTextPreference(context)\n    pref.setOnBindEditTextListener { editText ->\n        editText.doAfterTextChanged { editable ->\n            requireNotNull(editable)\n            val btn = editText.rootView.findViewById<Button>(android.R.id.button1)\n            if (isValid(editable.toString())) {\n                editText.error = null\n                btn.isEnabled = true\n            } else {\n                editText.error = errorMessage\n                btn.isEnabled = false\n            }\n        }\n    }\n    builder(pref)\n    addPref(pref)\n    return pref\n}\n\ninline fun PreferenceParent.preferenceCategory(\n    @StringRes title: Int? = null,\n    builder: PreferenceParent.(PreferenceCategory) -> Unit\n) {\n    val category = PreferenceCategory(context)\n    addPref(category)\n    title?.run(category::setTitle)\n    val newParent = PreferenceParent(context) { category.addPreference(it) }\n    builder(newParent, category)\n}\n\ninline fun PreferenceFragmentCompat.makePreferenceScreen(\n    builder: PreferenceParent.() -> Unit\n): PreferenceScreen {\n    val context = requireContext()\n    val screen = preferenceManager.createPreferenceScreen(context)\n    val parent = PreferenceParent(context) { screen.addPreference(it) }\n    // For some functions (like dependencies) it's much easier for us if we attach screen first\n    // and change it later\n    preferenceScreen = screen\n    builder(parent)\n    return screen\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/usecase/DeveloperToolsUseCase.kt",
    "content": "package com.keylesspalace.tusky.usecase\n\nimport android.util.Log\nimport androidx.room.withTransaction\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.dao.TimelineDao\nimport javax.inject.Inject\n\n/**\n * Functionality that is only intended to be used by the \"Developer Tools\" menu when built\n * in debug mode.\n */\nclass DeveloperToolsUseCase @Inject constructor(\n    private val db: AppDatabase\n) {\n\n    private var timelineDao: TimelineDao = db.timelineDao()\n\n    /**\n     * Create a gap in the home timeline to make it easier to interactively experiment with\n     * different \"Load more\" behaviours.\n     *\n     * Do this by taking the 10 most recent statuses, keeping the first 2, deleting the next 7,\n     * and replacing the last one with a placeholder.\n     */\n    suspend fun createLoadMoreGap(accountId: Long) {\n        db.withTransaction {\n            val ids = timelineDao.getMostRecentNHomeTimelineIds(accountId, 10)\n            val maxId = ids[2]\n            val minId = ids[8]\n            val placeHolderId = ids[9]\n\n            Log.d(\n                TAG,\n                \"createLoadMoreGap: creating gap between $minId .. $maxId (new placeholder: $placeHolderId\"\n            )\n\n            timelineDao.deleteRange(accountId, minId, maxId)\n            timelineDao.convertHomeTimelineItemToPlaceholder(placeHolderId)\n        }\n    }\n\n    companion object {\n        const val TAG = \"DeveloperToolsUseCase\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/usecase/LogoutUsecase.kt",
    "content": "package com.keylesspalace.tusky.usecase\n\nimport com.keylesspalace.tusky.components.drafts.DraftHelper\nimport com.keylesspalace.tusky.components.systemnotifications.NotificationService\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.DatabaseCleaner\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.ShareShortcutHelper\nimport javax.inject.Inject\n\nclass LogoutUsecase @Inject constructor(\n    private val api: MastodonApi,\n    private val databaseCleaner: DatabaseCleaner,\n    private val accountManager: AccountManager,\n    private val draftHelper: DraftHelper,\n    private val shareShortcutHelper: ShareShortcutHelper,\n    private val notificationService: NotificationService,\n) {\n\n    /**\n     * Logs the current account out and clears all caches associated with it\n     * @return true if the user is logged in with other accounts, false if it was the only one\n     */\n    suspend fun logout(account: AccountEntity): Boolean {\n        // invalidate the oauth token, if we have the client id & secret\n        // (could be missing if user logged in with a previous version of Tusky)\n        val clientId = account.clientId\n        val clientSecret = account.clientSecret\n        if (clientId != null && clientSecret != null) {\n            api.revokeOAuthToken(\n                clientId = clientId,\n                clientSecret = clientSecret,\n                token = account.accessToken\n            )\n        }\n\n        notificationService.disableNotificationsForAccount(account)\n\n        // remove account from local AccountManager\n        val otherAccountAvailable = accountManager.remove(account) != null\n\n        // clear the database - this could trigger network calls so do it last when all tokens are gone\n        databaseCleaner.cleanupEverything(account.id)\n        draftHelper.deleteAllDraftsAndAttachmentsForAccount(account.id)\n\n        // remove shortcut associated with the account\n        shareShortcutHelper.removeShortcut(account)\n\n        return otherAccountAvailable\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/usecase/NotificationPolicyUsecase.kt",
    "content": "package com.keylesspalace.tusky.usecase\n\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport at.connyduck.calladapter.networkresult.fold\nimport at.connyduck.calladapter.networkresult.onSuccess\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.entity.NotificationPolicyEntity\nimport com.keylesspalace.tusky.entity.NotificationPolicy\nimport com.keylesspalace.tusky.network.MastodonApi\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport retrofit2.HttpException\n\nclass NotificationPolicyUsecase @Inject constructor(\n    private val api: MastodonApi,\n    private val db: AppDatabase,\n    accountManager: AccountManager\n) {\n\n    private val accountId = accountManager.activeAccount!!.id\n\n    private val _state: MutableStateFlow<NotificationPolicyState> = MutableStateFlow(NotificationPolicyState.Loading)\n    val state: StateFlow<NotificationPolicyState> = _state.asStateFlow()\n\n    val info: Flow<NotificationPolicyEntity?> = db.notificationPolicyDao().notificationPolicyForAccount(accountId)\n\n    suspend fun getNotificationPolicy() {\n        _state.value.let { state ->\n            if (state is NotificationPolicyState.Loaded) {\n                _state.value = state.copy(refreshing = true)\n            } else {\n                _state.value = NotificationPolicyState.Loading\n            }\n        }\n\n        api.notificationPolicy().fold(\n            { policy ->\n                db.notificationPolicyDao().update(\n                    NotificationPolicyEntity(\n                        tuskyAccountId = accountId,\n                        pendingRequestsCount = policy.summary.pendingRequestsCount,\n                        pendingNotificationsCount = policy.summary.pendingNotificationsCount,\n                    )\n                )\n                _state.value = NotificationPolicyState.Loaded(refreshing = false, policy = policy)\n            },\n            { t ->\n                if (t is HttpException && t.code() == 404) {\n                    _state.value = NotificationPolicyState.Unsupported\n                } else {\n                    _state.value = NotificationPolicyState.Error(t)\n                }\n            }\n        )\n    }\n\n    suspend fun updatePolicy(\n        forNotFollowing: String? = null,\n        forNotFollowers: String? = null,\n        forNewAccounts: String? = null,\n        forPrivateMentions: String? = null,\n        forLimitedAccounts: String? = null\n    ): NetworkResult<NotificationPolicy> {\n        return api.updateNotificationPolicy(\n            forNotFollowing = forNotFollowing,\n            forNotFollowers = forNotFollowers,\n            forNewAccounts = forNewAccounts,\n            forPrivateMentions = forPrivateMentions,\n            forLimitedAccounts = forLimitedAccounts\n        ).onSuccess { notificationPolicy ->\n            _state.value = NotificationPolicyState.Loaded(false, notificationPolicy)\n        }\n    }\n\n    suspend fun updateCounts(notificationCount: Int) =\n        db.notificationPolicyDao().updateCounts(accountId, notificationCount)\n}\n\nsealed interface NotificationPolicyState {\n\n    data object Loading : NotificationPolicyState\n    data object Unsupported : NotificationPolicyState\n    data class Error(\n        val throwable: Throwable\n    ) : NotificationPolicyState\n    data class Loaded(\n        val refreshing: Boolean,\n        val policy: NotificationPolicy\n    ) : NotificationPolicyState\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/usecase/TimelineCases.kt",
    "content": "/* Copyright 2018 charlag\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.usecase\n\nimport android.util.Log\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport at.connyduck.calladapter.networkresult.fold\nimport at.connyduck.calladapter.networkresult.onFailure\nimport at.connyduck.calladapter.networkresult.onSuccess\nimport com.keylesspalace.tusky.appstore.BlockEvent\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.MuteEvent\nimport com.keylesspalace.tusky.appstore.PollShowResultsEvent\nimport com.keylesspalace.tusky.appstore.PollVoteEvent\nimport com.keylesspalace.tusky.appstore.StatusChangedEvent\nimport com.keylesspalace.tusky.appstore.StatusDeletedEvent\nimport com.keylesspalace.tusky.entity.DeletedStatus\nimport com.keylesspalace.tusky.entity.Poll\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.entity.Translation\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.getServerErrorMessage\nimport java.util.Locale\nimport javax.inject.Inject\n\n/**\n * Created by charlag on 3/24/18.\n */\n\nclass TimelineCases @Inject constructor(\n    private val mastodonApi: MastodonApi,\n    private val eventHub: EventHub\n) {\n\n    suspend fun reblog(statusId: String, reblog: Boolean, visibility: Status.Visibility = Status.Visibility.PUBLIC): NetworkResult<Status> {\n        return if (reblog) {\n            mastodonApi.reblogStatus(statusId, visibility.stringValue)\n        } else {\n            mastodonApi.unreblogStatus(statusId)\n        }.onSuccess { status ->\n            if (status.reblog != null) {\n                // when reblogging, the Mastodon Api does not return the reblogged status directly\n                // but the newly created status with reblog set to the reblogged status\n                eventHub.dispatch(StatusChangedEvent(status.reblog))\n            } else {\n                eventHub.dispatch(StatusChangedEvent(status))\n            }\n        }\n    }\n\n    suspend fun favourite(statusId: String, favourite: Boolean): NetworkResult<Status> {\n        return if (favourite) {\n            mastodonApi.favouriteStatus(statusId)\n        } else {\n            mastodonApi.unfavouriteStatus(statusId)\n        }.onSuccess { status ->\n            eventHub.dispatch(StatusChangedEvent(status))\n        }\n    }\n\n    suspend fun bookmark(statusId: String, bookmark: Boolean): NetworkResult<Status> {\n        return if (bookmark) {\n            mastodonApi.bookmarkStatus(statusId)\n        } else {\n            mastodonApi.unbookmarkStatus(statusId)\n        }.onSuccess { status ->\n            eventHub.dispatch(StatusChangedEvent(status))\n        }\n    }\n\n    suspend fun muteConversation(statusId: String, mute: Boolean): NetworkResult<Status> {\n        return if (mute) {\n            mastodonApi.muteConversation(statusId)\n        } else {\n            mastodonApi.unmuteConversation(statusId)\n        }.onSuccess { status ->\n            eventHub.dispatch(StatusChangedEvent(status))\n        }\n    }\n\n    suspend fun mute(statusId: String, notifications: Boolean, duration: Int?) {\n        try {\n            mastodonApi.muteAccount(statusId, notifications, duration)\n            eventHub.dispatch(MuteEvent(statusId))\n        } catch (t: Throwable) {\n            Log.w(TAG, \"Failed to mute account\", t)\n        }\n    }\n\n    suspend fun block(statusId: String) {\n        try {\n            mastodonApi.blockAccount(statusId)\n            eventHub.dispatch(BlockEvent(statusId))\n        } catch (t: Throwable) {\n            Log.w(TAG, \"Failed to block account\", t)\n        }\n    }\n\n    suspend fun delete(statusId: String, deleteMedia: Boolean): NetworkResult<DeletedStatus> {\n        return mastodonApi.deleteStatus(statusId, deleteMedia)\n            .onSuccess { eventHub.dispatch(StatusDeletedEvent(statusId)) }\n            .onFailure { Log.w(TAG, \"Failed to delete status\", it) }\n    }\n\n    suspend fun pin(statusId: String, pin: Boolean): NetworkResult<Status> {\n        return if (pin) {\n            mastodonApi.pinStatus(statusId)\n        } else {\n            mastodonApi.unpinStatus(statusId)\n        }.fold({ status ->\n            eventHub.dispatch(StatusChangedEvent(status))\n            NetworkResult.success(status)\n        }, { e ->\n            Log.w(TAG, \"Failed to change pin state\", e)\n            NetworkResult.failure(TimelineError(e.getServerErrorMessage()))\n        })\n    }\n\n    suspend fun voteInPoll(\n        statusId: String,\n        pollId: String,\n        choices: List<Int>\n    ): NetworkResult<Poll> {\n        if (choices.isEmpty()) {\n            return NetworkResult.failure(IllegalStateException())\n        }\n\n        return mastodonApi.voteInPoll(pollId, choices).onSuccess { poll ->\n            eventHub.dispatch(PollVoteEvent(statusId, poll))\n        }\n    }\n\n    suspend fun showPollResults(statusId: String) {\n        eventHub.dispatch(PollShowResultsEvent(statusId))\n    }\n\n    suspend fun translate(\n        statusId: String\n    ): NetworkResult<Translation> {\n        return mastodonApi.translate(statusId, Locale.getDefault().language)\n    }\n\n    companion object {\n        private const val TAG = \"TimelineCases\"\n    }\n}\n\nclass TimelineError(message: String?) : RuntimeException(message)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/AbsoluteTimeFormatter.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.util\n\nimport java.text.SimpleDateFormat\nimport java.util.Calendar\nimport java.util.Date\nimport java.util.Locale\nimport java.util.TimeZone\n\nclass AbsoluteTimeFormatter @JvmOverloads constructor(private val tz: TimeZone = TimeZone.getDefault()) {\n    private val sameDaySdf = SimpleDateFormat(\n        \"HH:mm\",\n        Locale.getDefault()\n    ).apply { this.timeZone = tz }\n    private val sameYearSdf = SimpleDateFormat(\"dd MMM, HH:mm\", Locale.getDefault()).apply {\n        this.timeZone = tz\n    }\n    private val otherYearSdf = SimpleDateFormat(\"yyyy-MM-dd\", Locale.getDefault()).apply {\n        this.timeZone = tz\n    }\n    private val otherYearCompleteSdf = SimpleDateFormat(\n        \"yyyy-MM-dd HH:mm\",\n        Locale.getDefault()\n    ).apply {\n        this.timeZone = tz\n    }\n\n    @JvmOverloads\n    fun format(time: Date?, shortFormat: Boolean = true, now: Date = Date()): String {\n        return when {\n            time == null -> \"??\"\n            isSameDate(time, now, tz) -> sameDaySdf.format(time)\n            isSameYear(time, now, tz) -> sameYearSdf.format(time)\n            shortFormat -> otherYearSdf.format(time)\n            else -> otherYearCompleteSdf.format(time)\n        }\n    }\n\n    companion object {\n\n        private fun isSameDate(dateOne: Date, dateTwo: Date, tz: TimeZone): Boolean {\n            val calendarOne = Calendar.getInstance(tz).apply { time = dateOne }\n            val calendarTwo = Calendar.getInstance(tz).apply { time = dateTwo }\n\n            return calendarOne.get(Calendar.YEAR) == calendarTwo.get(Calendar.YEAR) &&\n                calendarOne.get(Calendar.MONTH) == calendarTwo.get(Calendar.MONTH) &&\n                calendarOne.get(Calendar.DAY_OF_MONTH) == calendarTwo.get(Calendar.DAY_OF_MONTH)\n        }\n\n        private fun isSameYear(dateOne: Date, dateTwo: Date, timeZone1: TimeZone): Boolean {\n            val calendarOne = Calendar.getInstance(timeZone1).apply { time = dateOne }\n            val calendarTwo = Calendar.getInstance(timeZone1).apply { time = dateTwo }\n\n            return calendarOne.get(Calendar.YEAR) == calendarTwo.get(Calendar.YEAR)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/ActivityExtensions.kt",
    "content": "@file:JvmName(\"ActivityExtensions\")\n\npackage com.keylesspalace.tusky.util\n\nimport android.app.Activity\nimport android.content.ClipData\nimport android.content.ClipboardManager\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Build\nimport android.widget.Toast\nimport androidx.activity.ComponentActivity\nimport androidx.annotation.AnimRes\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleEventObserver\nimport com.keylesspalace.tusky.BaseActivity\n\nfun Activity.startActivityWithSlideInAnimation(intent: Intent) {\n    startActivity(intent.withSlideInAnimation())\n}\n\nfun Intent.withSlideInAnimation(): Intent {\n    // the new transition api needs to be called by the activity that is the result of the transition,\n    // so we pass a flag that BaseActivity will respect.\n    return putExtra(BaseActivity.OPEN_WITH_SLIDE_IN, true)\n}\n\n/**\n * Call this method in Activity.onCreate() to configure the open or close transitions.\n */\n@Suppress(\"DEPRECATION\")\nfun ComponentActivity.overrideActivityTransitionCompat(\n    overrideType: Int,\n    @AnimRes enterAnim: Int,\n    @AnimRes exitAnim: Int\n) {\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {\n        overrideActivityTransition(overrideType, enterAnim, exitAnim)\n    } else {\n        if (overrideType == ActivityConstants.OVERRIDE_TRANSITION_OPEN) {\n            overridePendingTransition(enterAnim, exitAnim)\n        } else {\n            lifecycle.addObserver(\n                LifecycleEventObserver { _, event ->\n                    if (event == Lifecycle.Event.ON_PAUSE && isFinishing) {\n                        overridePendingTransition(enterAnim, exitAnim)\n                    }\n                }\n            )\n        }\n    }\n}\n\nfun Activity.copyToClipboard(text: CharSequence, popupText: CharSequence, clipboardLabel: CharSequence = \"\") {\n    val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager\n    clipboard.setPrimaryClip(ClipData.newPlainText(clipboardLabel, text))\n    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) {\n        Toast.makeText(this, popupText, Toast.LENGTH_SHORT).show()\n    }\n}\n\nobject ActivityConstants {\n    const val OVERRIDE_TRANSITION_OPEN = 0\n    const val OVERRIDE_TRANSITION_CLOSE = 1\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/AlertDialogExtensions.kt",
    "content": "/*\n * Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.util\n\nimport android.content.DialogInterface\nimport androidx.annotation.StringRes\nimport androidx.appcompat.app.AlertDialog\nimport kotlinx.coroutines.suspendCancellableCoroutine\n\n/**\n * Wait for the alert dialog buttons to be clicked, return the ID of the clicked button\n *\n * @param positiveText Text to show on the positive button\n * @param negativeText Optional text to show on the negative button\n * @param neutralText Optional text to show on the neutral button\n */\nsuspend fun AlertDialog.await(\n    positiveText: String,\n    negativeText: String? = null,\n    neutralText: String? = null\n) = suspendCancellableCoroutine { cont ->\n    val listener = DialogInterface.OnClickListener { _, which ->\n        cont.resume(which) { _, _, _ -> dismiss() }\n    }\n\n    setButton(AlertDialog.BUTTON_POSITIVE, positiveText, listener)\n    negativeText?.let { setButton(AlertDialog.BUTTON_NEGATIVE, it, listener) }\n    neutralText?.let { setButton(AlertDialog.BUTTON_NEUTRAL, it, listener) }\n\n    setOnCancelListener { cont.cancel() }\n    cont.invokeOnCancellation { dismiss() }\n    show()\n}\n\n/**\n * @see [AlertDialog.await]\n */\nsuspend fun AlertDialog.await(\n    @StringRes positiveTextResource: Int,\n    @StringRes negativeTextResource: Int? = null,\n    @StringRes neutralTextResource: Int? = null\n) = await(\n    context.getString(positiveTextResource),\n    negativeTextResource?.let { context.getString(it) },\n    neutralTextResource?.let { context.getString(it) }\n)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/AsciiFolding.kt",
    "content": "/* Copyright 2022 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.util\n\n// Inspired by https://github.com/mastodon/mastodon/blob/main/app/lib/ascii_folding.rb\n\nval unicodeToASCIIMap = \"ÀÁÂÃÄÅàáâãäåĀāĂăĄąÇçĆćĈĉĊċČčÐðĎďĐđÈÉÊËèéêëĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħÌÍÎÏìíîïĨĩĪīĬĭĮįİıĴĵĶķĸĹĺĻļĽľĿŀŁłÑñŃńŅņŇňŉŊŋÒÓÔÕÖØòóôõöøŌōŎŏŐőŔŕŖŗŘřŚśŜŝŞşŠšſŢţŤťŦŧÙÚÛÜùúûüŨũŪūŬŭŮůŰűŲųŴŵÝýÿŶŷŸŹźŻżŽž\".toList().zip(\n    \"AAAAAAaaaaaaAaAaAaCcCcCcCcCcDdDdDdEEEEeeeeEeEeEeEeEeGgGgGgGgHhHhIIIIiiiiIiIiIiIiIiJjKkkLlLlLlLlLlNnNnNnNnnNnOOOOOOooooooOoOoOoRrRrRrSsSsSsSssTtTtTtUUUUuuuuUuUuUuUuUuUuWwYyyYyYZzZzZz\".toList()\n).toMap()\n\nfun normalizeToASCII(text: CharSequence): String {\n    return String(text.map { unicodeToASCIIMap[it] ?: it }.toCharArray())\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/AttachmentHelper.kt",
    "content": "@file:JvmName(\"AttachmentHelper\")\n\npackage com.keylesspalace.tusky.util\n\nimport android.content.Context\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.entity.Attachment\nimport kotlin.math.roundToInt\nimport kotlin.time.Duration.Companion.seconds\n\nfun Attachment.getFormattedDescription(context: Context): CharSequence {\n    val durationInSeconds = meta?.duration ?: 0f\n    val duration = if (durationInSeconds > 0f) {\n        durationInSeconds.roundToInt().seconds.toComponents { hours, minutes, seconds, _ ->\n            \"%d:%02d:%02d \".format(hours, minutes, seconds)\n        }\n    } else {\n        \"\"\n    }\n    return duration + if (description.isNullOrEmpty()) {\n        context.getString(R.string.description_post_media_no_description_placeholder)\n    } else {\n        description\n    }\n}\n\nfun List<Attachment>.aspectRatios(): List<Double> {\n    return map { attachment ->\n        // clamp ratio between 2:1 & 1:2, defaulting to 16:9\n        val size = (attachment.meta?.small ?: attachment.meta?.original) ?: return@map 1.7778\n        if (size.aspect > 0) return@map size.aspect.coerceIn(0.5, 2.0)\n        if (size.width == 0 || size.height == 0) return@map 1.7778\n        (size.width.toDouble() / size.height).coerceIn(0.5, 2.0)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/BindingHolder.kt",
    "content": "package com.keylesspalace.tusky.util\n\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.viewbinding.ViewBinding\n\nclass BindingHolder<T : ViewBinding>(\n    val binding: T\n) : RecyclerView.ViewHolder(binding.root)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/BlurHashDecoder.kt",
    "content": "/**\n * Blurhash implementation from blurhash project:\n * https://github.com/woltapp/blurhash\n * Minor modifications by charlag\n * Major performance improvements by cbeyls\n */\n\npackage com.keylesspalace.tusky.util\n\nimport android.graphics.Bitmap\nimport android.graphics.Color\nimport kotlin.math.PI\nimport kotlin.math.cos\nimport kotlin.math.pow\nimport kotlin.math.withSign\n\nobject BlurHashDecoder {\n\n    fun decode(blurHash: String?, width: Int, height: Int, punch: Float = 1f): Bitmap? {\n        require(width > 0) { \"Width must be greater than zero\" }\n        require(height > 0) { \"height must be greater than zero\" }\n        if (blurHash == null || blurHash.length < 6) {\n            return null\n        }\n        val numCompEnc = decode83(blurHash, 0, 1)\n        val numCompX = (numCompEnc % 9) + 1\n        val numCompY = (numCompEnc / 9) + 1\n        val totalComp = numCompX * numCompY\n        if (blurHash.length != 4 + 2 * totalComp) {\n            return null\n        }\n        val maxAcEnc = decode83(blurHash, 1, 2)\n        val maxAc = (maxAcEnc + 1) / 166f\n        val colors = FloatArray(totalComp * 3)\n        var colorEnc = decode83(blurHash, 2, 6)\n        decodeDc(colorEnc, colors)\n        for (i in 1 until totalComp) {\n            val from = 4 + i * 2\n            colorEnc = decode83(blurHash, from, from + 2)\n            decodeAc(colorEnc, maxAc * punch, colors, i * 3)\n        }\n        return composeBitmap(width, height, numCompX, numCompY, colors)\n    }\n\n    private fun decode83(str: String, from: Int, to: Int): Int {\n        var result = 0\n        for (i in from until to) {\n            val index = CHARS.indexOf(str[i])\n            if (index != -1) {\n                result = result * 83 + index\n            }\n        }\n        return result\n    }\n\n    private fun decodeDc(colorEnc: Int, outArray: FloatArray) {\n        val r = (colorEnc shr 16) and 0xFF\n        val g = (colorEnc shr 8) and 0xFF\n        val b = colorEnc and 0xFF\n        outArray[0] = srgbToLinear(r)\n        outArray[1] = srgbToLinear(g)\n        outArray[2] = srgbToLinear(b)\n    }\n\n    private fun srgbToLinear(colorEnc: Int): Float {\n        val v = colorEnc / 255f\n        return if (v <= 0.04045f) {\n            (v / 12.92f)\n        } else {\n            ((v + 0.055f) / 1.055f).pow(2.4f)\n        }\n    }\n\n    private fun decodeAc(value: Int, maxAc: Float, outArray: FloatArray, outIndex: Int) {\n        val r = value / (19 * 19)\n        val g = (value / 19) % 19\n        val b = value % 19\n        outArray[outIndex] = signedPow2((r - 9) / 9.0f) * maxAc\n        outArray[outIndex + 1] = signedPow2((g - 9) / 9.0f) * maxAc\n        outArray[outIndex + 2] = signedPow2((b - 9) / 9.0f) * maxAc\n    }\n\n    private fun signedPow2(value: Float) = value.pow(2f).withSign(value)\n\n    private fun composeBitmap(\n        width: Int,\n        height: Int,\n        numCompX: Int,\n        numCompY: Int,\n        colors: FloatArray\n    ): Bitmap {\n        val imageArray = IntArray(width * height)\n        val cosinesX = createCosines(width, numCompX)\n        val cosinesY = if (width == height && numCompX == numCompY) {\n            cosinesX\n        } else {\n            createCosines(height, numCompY)\n        }\n        for (y in 0 until height) {\n            for (x in 0 until width) {\n                var r = 0f\n                var g = 0f\n                var b = 0f\n                for (j in 0 until numCompY) {\n                    val cosY = cosinesY[y * numCompY + j]\n                    for (i in 0 until numCompX) {\n                        val cosX = cosinesX[x * numCompX + i]\n                        val basis = cosX * cosY\n                        val colorIndex = (j * numCompX + i) * 3\n                        r += colors[colorIndex] * basis\n                        g += colors[colorIndex + 1] * basis\n                        b += colors[colorIndex + 2] * basis\n                    }\n                }\n                imageArray[x + width * y] = Color.rgb(linearToSrgb(r), linearToSrgb(g), linearToSrgb(b))\n            }\n        }\n        return Bitmap.createBitmap(imageArray, width, height, Bitmap.Config.ARGB_8888)\n    }\n\n    private fun createCosines(size: Int, numComp: Int) = FloatArray(size * numComp) { index ->\n        val x = index / numComp\n        val i = index % numComp\n        cos(PI * x * i / size).toFloat()\n    }\n\n    private fun linearToSrgb(value: Float): Int {\n        val v = value.coerceIn(0f, 1f)\n        return if (v <= 0.0031308f) {\n            (v * 12.92f * 255f + 0.5f).toInt()\n        } else {\n            ((1.055f * v.pow(1 / 2.4f) - 0.055f) * 255 + 0.5f).toInt()\n        }\n    }\n\n    private const val CHARS = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~\"\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/BlurhashDrawable.kt",
    "content": "/* Copyright 2025 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.util\n\nimport android.content.Context\nimport android.graphics.drawable.BitmapDrawable\n\n/**\n * Drawable to display blurhashes with custom equals and hashCode implementation.\n * This is so Glide does not flicker unnecessarily when it is used with blurhashes as placeholder.\n */\nclass BlurhashDrawable(\n    context: Context,\n    val blurhash: String\n) : BitmapDrawable(\n    context.resources,\n    BlurHashDecoder.decode(blurhash, 32, 32, 1f)\n) {\n    override fun equals(other: Any?): Boolean {\n        return (other as? BlurhashDrawable)?.blurhash == blurhash\n    }\n\n    override fun hashCode(): Int {\n        return blurhash.hashCode()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/BundleExtensions.kt",
    "content": "package com.keylesspalace.tusky.util\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.os.Parcelable\nimport androidx.core.content.IntentCompat\nimport androidx.core.os.BundleCompat\nimport java.io.Serializable\n\ninline fun <reified T : Parcelable> Bundle.getParcelableCompat(key: String?): T? =\n    BundleCompat.getParcelable(this, key, T::class.java)\n\ninline fun <reified T : Serializable> Bundle.getSerializableCompat(key: String?): T? =\n    BundleCompat.getSerializable(this, key, T::class.java)\n\ninline fun <reified T : Parcelable> Intent.getParcelableExtraCompat(key: String?): T? =\n    IntentCompat.getParcelableExtra(this, key, T::class.java)\n\ninline fun <reified T : Serializable> Intent.getSerializableExtraCompat(key: String?): T? =\n    IntentCompat.getSerializableExtra(this, key, T::class.java)\n\ninline fun <reified T : Parcelable> Intent.getParcelableArrayListExtraCompat(key: String?): ArrayList<T>? =\n    IntentCompat.getParcelableArrayListExtra(this, key, T::class.java)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/CardViewMode.kt",
    "content": "package com.keylesspalace.tusky.util\n\nenum class CardViewMode {\n    NONE,\n    FULL_WIDTH,\n    INDENTED\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/CompositeWithOpaqueBackground.kt",
    "content": "/*\n * Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.util\n\nimport android.graphics.Bitmap\nimport android.graphics.BitmapShader\nimport android.graphics.Canvas\nimport android.graphics.ColorMatrix\nimport android.graphics.ColorMatrixColorFilter\nimport android.graphics.Paint\nimport android.graphics.Shader\nimport com.bumptech.glide.load.Key\nimport com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool\nimport com.bumptech.glide.load.resource.bitmap.BitmapTransformation\nimport com.bumptech.glide.util.Util\nimport java.nio.ByteBuffer\nimport java.security.MessageDigest\n\n/**\n * Set an opaque background behind the non-transparent areas of a bitmap.\n *\n * Profile images may have areas that are partially transparent (i.e., alpha value >= 1 and < 255).\n *\n * Displaying those can be a problem if there is anything drawn under them, as it will show\n * through the image.\n *\n * Fix this, by:\n *\n * - Creating a mask that matches the partially transparent areas of the image\n * - Creating a new bitmap that, in the areas that match the mask, contains a background color\n * - Composite the original image over the top\n *\n * So the partially transparent areas on the original image are composited over the original\n * background, the fully transparent areas on the original image are left transparent.\n */\nclass CompositeWithOpaqueBackground(val backgroundColor: Int) : BitmapTransformation() {\n\n    override fun equals(other: Any?): Boolean {\n        if (other is CompositeWithOpaqueBackground) {\n            return other.backgroundColor == backgroundColor\n        }\n        return false\n    }\n\n    override fun hashCode() = Util.hashCode(ID.hashCode(), Util.hashCode(backgroundColor))\n\n    override fun updateDiskCacheKey(messageDigest: MessageDigest) {\n        messageDigest.update(ID_BYTES)\n        messageDigest.update(ByteBuffer.allocate(Int.SIZE_BYTES).putInt(backgroundColor).array())\n    }\n\n    override fun transform(\n        pool: BitmapPool,\n        toTransform: Bitmap,\n        outWidth: Int,\n        outHeight: Int\n    ): Bitmap {\n        // If the input bitmap has no alpha channel then there's nothing to do\n        if (!toTransform.hasAlpha()) return toTransform\n\n        // Convert the background to a bitmap.\n        val backgroundBitmap = pool.get(outWidth, outHeight, Bitmap.Config.ARGB_8888)\n        backgroundBitmap.eraseColor(backgroundColor)\n\n        // Convert the alphaBitmap (where the alpha channel has 8bpp) to a mask of 1bpp\n        // TODO: toTransform.extractAlpha(paint, ...) could be used here, but I can't find any\n        // useful documentation covering paints and mask filters.\n        val maskBitmap = pool.get(outWidth, outHeight, Bitmap.Config.ALPHA_8).apply {\n            val canvas = Canvas(this)\n            canvas.drawBitmap(toTransform, 0f, 0f, EXTRACT_MASK_PAINT)\n        }\n\n        val shader = BitmapShader(backgroundBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT)\n        val paintShader = Paint()\n        paintShader.isAntiAlias = true\n        paintShader.shader = shader\n        paintShader.style = Paint.Style.FILL_AND_STROKE\n\n        // Write the background to a new bitmap, masked to just the non-transparent areas of the\n        // original image\n        val dest = pool.get(outWidth, outHeight, toTransform.config)\n        val canvas = Canvas(dest)\n        canvas.drawBitmap(maskBitmap, 0f, 0f, paintShader)\n\n        // Finally, write the original bitmap over the top\n        canvas.drawBitmap(toTransform, 0f, 0f, null)\n\n        // Clean up intermediate bitmaps\n        pool.put(maskBitmap)\n        pool.put(backgroundBitmap)\n\n        return dest\n    }\n\n    companion object {\n        @Suppress(\"unused\")\n        private const val TAG = \"CompositeWithOpaqueBackground\"\n        private val ID = CompositeWithOpaqueBackground::class.qualifiedName!!\n        private val ID_BYTES = ID.toByteArray(Key.CHARSET)\n\n        /** Paint with a color filter that converts 8bpp alpha images to a 1bpp mask */\n        private val EXTRACT_MASK_PAINT = Paint().apply {\n            colorFilter = ColorMatrixColorFilter(\n                ColorMatrix(\n                    floatArrayOf(\n                        0f, 0f, 0f, 0f, 0f,\n                        0f, 0f, 0f, 0f, 0f,\n                        0f, 0f, 0f, 0f, 0f,\n                        0f, 0f, 0f, 255f, 0f\n                    )\n                )\n            )\n            isAntiAlias = false\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/CryptoUtil.kt",
    "content": "/* Copyright 2022 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.util\n\nimport android.util.Base64\nimport java.security.KeyPairGenerator\nimport java.security.SecureRandom\nimport java.security.Security\nimport org.bouncycastle.jce.ECNamedCurveTable\nimport org.bouncycastle.jce.interfaces.ECPrivateKey\nimport org.bouncycastle.jce.interfaces.ECPublicKey\nimport org.bouncycastle.jce.provider.BouncyCastleProvider\n\nobject CryptoUtil {\n    const val CURVE_PRIME256_V1 = \"prime256v1\"\n\n    private const val BASE64_FLAGS = Base64.URL_SAFE or Base64.NO_PADDING or Base64.NO_WRAP\n\n    init {\n        Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME)\n        Security.addProvider(BouncyCastleProvider())\n    }\n\n    private fun secureRandomBytes(len: Int): ByteArray {\n        val ret = ByteArray(len)\n        SecureRandom.getInstance(\"SHA1PRNG\").nextBytes(ret)\n        return ret\n    }\n\n    fun secureRandomBytesEncoded(len: Int): String {\n        return Base64.encodeToString(secureRandomBytes(len), BASE64_FLAGS)\n    }\n\n    data class EncodedKeyPair(val pubkey: String, val privKey: String)\n\n    fun generateECKeyPair(curve: String): EncodedKeyPair {\n        val spec = ECNamedCurveTable.getParameterSpec(curve)\n        val gen = KeyPairGenerator.getInstance(\"EC\", BouncyCastleProvider.PROVIDER_NAME)\n        gen.initialize(spec)\n        val keyPair = gen.genKeyPair()\n        val pubKey = keyPair.public as ECPublicKey\n        val privKey = keyPair.private as ECPrivateKey\n        val encodedPubKey = Base64.encodeToString(pubKey.q.getEncoded(false), BASE64_FLAGS)\n        val encodedPrivKey = Base64.encodeToString(privKey.d.toByteArray(), BASE64_FLAGS)\n        return EncodedKeyPair(encodedPubKey, encodedPrivKey)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/CustomEmojiHelper.kt",
    "content": "/* Copyright 2020 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\n@file:JvmName(\"CustomEmojiHelper\")\n\npackage com.keylesspalace.tusky.util\n\nimport android.graphics.Canvas\nimport android.graphics.Paint\nimport android.graphics.drawable.Animatable\nimport android.graphics.drawable.Drawable\nimport android.text.style.ReplacementSpan\nimport android.view.View\nimport android.widget.TextView\nimport androidx.core.graphics.withSave\nimport androidx.core.text.toSpannable\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.request.target.CustomTarget\nimport com.bumptech.glide.request.target.Target\nimport com.bumptech.glide.request.transition.Transition\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.entity.Emoji\n\n/**\n * replaces emoji shortcodes in a text with EmojiSpans\n * @receiver the text containing custom emojis\n * @param emojis a list of the custom emojis\n * @param view a reference to the a view the emojis will be shown in (should be the TextView, but parents of the TextView are also acceptable)\n * @return the text with the shortcodes replaced by EmojiSpans\n*/\nfun CharSequence.emojify(emojis: List<Emoji>, view: View, animate: Boolean): CharSequence {\n    return view.updateEmojiTargets {\n        emojify(emojis, animate)\n    }\n}\n\nclass EmojiTargetScope<T : View>(val view: T) {\n    private val _targets = mutableListOf<Target<Drawable>>()\n    val targets: List<Target<Drawable>>\n        get() = _targets\n\n    fun CharSequence.emojify(emojis: List<Emoji>, animate: Boolean): CharSequence {\n        if (emojis.isEmpty()) {\n            return this\n        }\n\n        val spannable = toSpannable()\n        val requestManager = Glide.with(view)\n\n        emojis.forEach { (shortcode, url, staticUrl) ->\n            val pattern = \":$shortcode:\"\n            var start = indexOf(pattern)\n\n            while (start != -1) {\n                val end = start + pattern.length\n                val span = EmojiSpan(view)\n\n                spannable.setSpan(span, start, end, 0)\n                val target = span.createGlideTarget(view, animate)\n                requestManager\n                    .asDrawable()\n                    .load(\n                        if (animate) {\n                            url\n                        } else {\n                            staticUrl\n                        }\n                    )\n                    .into(target)\n                _targets.add(target)\n\n                start = indexOf(pattern, end)\n            }\n        }\n\n        return spannable\n    }\n}\n\ninline fun <T : View, R> T.updateEmojiTargets(body: EmojiTargetScope<T>.() -> R): R {\n    clearEmojiTargets()\n    val scope = EmojiTargetScope(this)\n    val result = body(scope)\n    setEmojiTargets(scope.targets)\n    return result\n}\n\n@Suppress(\"UNCHECKED_CAST\")\nfun View.clearEmojiTargets() {\n    getTag(R.id.custom_emoji_targets_tag)?.let { tag ->\n        val targets = tag as List<Target<Drawable>>\n        val requestManager = Glide.with(this)\n        targets.forEach { requestManager.clear(it) }\n        setTag(R.id.custom_emoji_targets_tag, null)\n    }\n}\n\nfun View.setEmojiTargets(targets: List<Target<Drawable>>) {\n    setTag(R.id.custom_emoji_targets_tag, targets.takeIf { it.isNotEmpty() })\n}\n\nclass EmojiSpan(view: View) : ReplacementSpan() {\n\n    private val emojiSize: Int = if (view is TextView) {\n        view.paint.textSize\n    } else {\n        // sometimes it is not possible to determine the TextView the emoji will be shown in,\n        // e.g. because it is passed to a library, so we fallback to a size that should be large\n        // enough in most cases\n        view.context.resources.getDimension(R.dimen.fallback_emoji_size)\n    }.times(1.2).toInt()\n\n    var imageDrawable: Drawable? = null\n\n    override fun getSize(\n        paint: Paint,\n        text: CharSequence,\n        start: Int,\n        end: Int,\n        fm: Paint.FontMetricsInt?\n    ): Int {\n        if (fm != null) {\n            /* update FontMetricsInt or otherwise span does not get drawn when\n             * it covers the whole text */\n            val metrics = paint.fontMetricsInt\n            fm.top = metrics.top\n            fm.ascent = metrics.ascent\n            fm.descent = metrics.descent\n            fm.bottom = metrics.bottom\n        }\n\n        return emojiSize\n    }\n\n    override fun draw(\n        canvas: Canvas,\n        text: CharSequence,\n        start: Int,\n        end: Int,\n        x: Float,\n        top: Int,\n        y: Int,\n        bottom: Int,\n        paint: Paint\n    ) {\n        imageDrawable?.let { drawable ->\n            canvas.withSave {\n                // start with a width relative to the text size\n                var emojiWidth = paint.textSize * 1.1\n\n                // calculate the height, keeping the aspect ratio correct\n                val drawableWidth = drawable.intrinsicWidth\n                val drawableHeight = drawable.intrinsicHeight\n                var emojiHeight = emojiWidth / drawableWidth * drawableHeight\n\n                // how much vertical space there is draw the emoji\n                val drawableSpace = (bottom - top).toDouble()\n\n                // in case the calculated height is bigger than the available space, scale the emoji down, preserving aspect ratio\n                if (emojiHeight > drawableSpace) {\n                    emojiWidth *= drawableSpace / emojiHeight\n                    emojiHeight = drawableSpace\n                }\n                drawable.setBounds(0, 0, emojiWidth.toInt(), emojiHeight.toInt())\n\n                // vertically center the emoji in the line\n                val transY = top + (drawableSpace / 2 - emojiHeight / 2)\n\n                translate(x, transY.toFloat())\n                drawable.draw(this)\n            }\n        }\n    }\n\n    fun createGlideTarget(view: View, animate: Boolean): Target<Drawable> {\n        return object : CustomTarget<Drawable>(emojiSize, emojiSize) {\n            override fun onStart() {\n                (imageDrawable as? Animatable)?.start()\n            }\n\n            override fun onStop() {\n                (imageDrawable as? Animatable)?.stop()\n            }\n\n            override fun onLoadFailed(errorDrawable: Drawable?) {\n                // Nothing to do\n            }\n\n            override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {\n                if (animate && resource is Animatable) {\n                    resource.callback = object : Drawable.Callback {\n                        override fun invalidateDrawable(who: Drawable) {\n                            view.invalidate()\n                        }\n\n                        override fun scheduleDrawable(who: Drawable, what: Runnable, `when`: Long) {\n                            view.postDelayed(what, `when`)\n                        }\n\n                        override fun unscheduleDrawable(who: Drawable, what: Runnable) {\n                            view.removeCallbacks(what)\n                        }\n                    }\n                    resource.start()\n                }\n\n                imageDrawable = resource\n                view.invalidate()\n            }\n\n            override fun onLoadCleared(placeholder: Drawable?) {\n                imageDrawable?.let { currentDrawable ->\n                    if (currentDrawable is Animatable) {\n                        currentDrawable.stop()\n                        currentDrawable.callback = null\n                    }\n                }\n                imageDrawable = null\n                view.invalidate()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/CustomFragmentStateAdapter.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.util\n\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentActivity\nimport androidx.viewpager2.adapter.FragmentStateAdapter\n\nabstract class CustomFragmentStateAdapter(\n    private val activity: FragmentActivity\n) : FragmentStateAdapter(activity) {\n\n    fun getFragment(position: Int): Fragment? =\n        activity.supportFragmentManager.findFragmentByTag(\"f\" + getItemId(position))\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/FocalPointUtil.kt",
    "content": "/* Copyright 2018 Jochem Raat <jchmrt@riseup.net>\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.util\n\nimport android.graphics.Matrix\nimport com.keylesspalace.tusky.entity.Attachment.Focus\n\n/**\n * Calculates the image matrix needed to maintain the correct cropping for image views based on\n * their focal point.\n *\n * The purpose of this class is to make sure that the focal point information on media\n * attachments are honoured. This class uses the custom matrix option of android ImageView's to\n * customize how the image is cropped into the view.\n *\n * See the explanation of focal points here:\n *    https://github.com/jonom/jquery-focuspoint#1-calculate-your-images-focus-point\n */\nobject FocalPointUtil {\n    /**\n     * Update the given matrix for the given parameters.\n     *\n     * How it works is using the following steps:\n     *   - First we determine if the image is too wide or too tall for the view size. If it is\n     *   too wide, we need to crop it horizontally and scale the height to fit the view\n     *   exactly. If it is too tall we need to crop vertically and scale the width to fit the\n     *   view exactly.\n     *   - Then we determine what translation is needed to get the focal point in view. We\n     *   prefer to get the focal point at the center of the preview. However if that would\n     *   result in some part of the preview being empty, we instead align the image so that it\n     *   fills the view, but still the focal point is always in view.\n     *\n     * @param viewWidth The width of the imageView.\n     * @param viewHeight The height of the imageView\n     * @param imageWidth The width of the actual image\n     * @param imageHeight The height of the actual image\n     * @param focus The focal point to focus\n     * @param mat The matrix to update, this matrix is reset() and then updated with the new\n     * configuration. We reuse the old matrix to prevent unnecessary allocations.\n     *\n     * @return The matrix which correctly crops the image\n     */\n    fun updateFocalPointMatrix(\n        viewWidth: Float,\n        viewHeight: Float,\n        imageWidth: Float,\n        imageHeight: Float,\n        focus: Focus,\n        mat: Matrix\n    ) {\n        // Reset the cached matrix:\n        mat.reset()\n\n        // calculate scaling:\n        val scale = calculateScaling(viewWidth, viewHeight, imageWidth, imageHeight)\n        mat.preScale(scale, scale)\n\n        // calculate offsets:\n        var top = 0f\n        var left = 0f\n        if (isVerticalCrop(viewWidth, viewHeight, imageWidth, imageHeight)) {\n            top = focalOffset(viewHeight, imageHeight, scale, focalYToCoordinate(focus.y ?: 0f))\n        } else { // horizontal crop\n            left = focalOffset(viewWidth, imageWidth, scale, focalXToCoordinate(focus.x ?: 0f))\n        }\n\n        mat.postTranslate(left, top)\n    }\n\n    /**\n     * Calculate the scaling of the image needed to make it fill the screen.\n     *\n     * The scaling used depends on if we need a vertical of horizontal crop.\n     */\n    fun calculateScaling(\n        viewWidth: Float,\n        viewHeight: Float,\n        imageWidth: Float,\n        imageHeight: Float\n    ): Float {\n        return if (isVerticalCrop(viewWidth, viewHeight, imageWidth, imageHeight)) {\n            viewWidth / imageWidth\n        } else { // horizontal crop:\n            viewHeight / imageHeight\n        }\n    }\n\n    /**\n     * Return true if we need a vertical crop, false for a horizontal crop.\n     */\n    fun isVerticalCrop(\n        viewWidth: Float,\n        viewHeight: Float,\n        imageWidth: Float,\n        imageHeight: Float\n    ): Boolean {\n        val viewRatio = viewWidth / viewHeight\n        val imageRatio = imageWidth / imageHeight\n\n        return viewRatio > imageRatio\n    }\n\n    /**\n     * Transform the focal x component to the corresponding coordinate on the image.\n     *\n     * This means that we go from a representation where the left side of the image is -1 and\n     * the right side +1, to a representation with the left side being 0 and the right side\n     * being +1.\n     */\n    fun focalXToCoordinate(x: Float): Float {\n        return (x + 1) / 2\n    }\n\n    /**\n     * Transform the focal y component to the corresponding coordinate on the image.\n     *\n     * This means that we go from a representation where the bottom side of the image is -1 and\n     * the top side +1, to a representation with the top side being 0 and the bottom side\n     * being +1.\n     */\n    fun focalYToCoordinate(y: Float): Float {\n        return (-y + 1) / 2\n    }\n\n    /**\n     * Calculate the relative offset needed to focus on the focal point in one direction.\n     *\n     * This method works for both the vertical and horizontal crops. It simply calculates\n     * what offset to take based on the proportions between the scaled image and the view\n     * available. It also makes sure to always fill the bounds of the view completely with\n     * the image. So it won't put the very edge of the image in center, because that would\n     * leave part of the view empty.\n     */\n    fun focalOffset(view: Float, image: Float, scale: Float, focal: Float): Float {\n        // The fraction of the image that will be in view:\n        val inView = view / (scale * image)\n        var offset = 0f\n\n        // These values indicate the maximum and minimum focal parameter possible while still\n        // keeping the entire view filled with the image:\n        val maxFocal = 1 - inView / 2\n        val minFocal = inView / 2\n\n        if (focal > maxFocal) {\n            offset = -((2 - inView) / 2) * image * scale + view * 0.5f\n        } else if (focal > minFocal) {\n            offset = -focal * image * scale + view * 0.5f\n        }\n\n        return offset\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/GlideExtensions.kt",
    "content": "package com.keylesspalace.tusky.util\n\nimport com.bumptech.glide.RequestBuilder\nimport com.bumptech.glide.load.DataSource\nimport com.bumptech.glide.load.engine.GlideException\nimport com.bumptech.glide.request.RequestListener\nimport com.bumptech.glide.request.target.Target\nimport kotlin.coroutines.Continuation\nimport kotlin.coroutines.resume\nimport kotlin.coroutines.resumeWithException\nimport kotlinx.coroutines.suspendCancellableCoroutine\n\n/**\n * Allows waiting for a Glide request to complete without blocking a background thread.\n */\nsuspend fun <R> RequestBuilder<R>.submitAsync(\n    width: Int = Target.SIZE_ORIGINAL,\n    height: Int = Target.SIZE_ORIGINAL\n): R {\n    return suspendCancellableCoroutine { continuation ->\n        val target = addListener(ContinuationRequestListener(continuation))\n            .submit(width, height)\n        continuation.invokeOnCancellation { target.cancel(true) }\n    }\n}\n\nprivate class ContinuationRequestListener<R>(continuation: Continuation<R>) : RequestListener<R> {\n    private var continuation: Continuation<R>? = continuation\n\n    override fun onLoadFailed(\n        e: GlideException?,\n        model: Any?,\n        target: Target<R>,\n        isFirstResource: Boolean\n    ): Boolean {\n        continuation?.let {\n            continuation = null\n            it.resumeWithException(e ?: GlideException(\"Image loading failed\"))\n        }\n        return false\n    }\n\n    override fun onResourceReady(\n        resource: R & Any,\n        model: Any,\n        target: Target<R>?,\n        dataSource: DataSource,\n        isFirstResource: Boolean\n    ): Boolean {\n        continuation?.let {\n            if (target?.request?.isComplete == true) {\n                continuation = null\n                it.resume(resource)\n            }\n        }\n        return false\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/GlideModule.kt",
    "content": "package com.keylesspalace.tusky.util\n\nimport com.bumptech.glide.annotation.GlideModule\nimport com.bumptech.glide.module.AppGlideModule\n\n@GlideModule\nclass GlideModule : AppGlideModule()\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/HttpHeaderLink.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\npackage com.keylesspalace.tusky.util\n\nimport android.net.Uri\nimport androidx.annotation.VisibleForTesting\nimport androidx.core.net.toUri\n\n/**\n * Represents one link and its parameters from the link header of an HTTP message.\n *\n * @see [RFC5988](https://tools.ietf.org/html/rfc5988)\n */\nclass HttpHeaderLink\n@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\nconstructor(\n    uri: String\n) {\n    data class Parameter(val name: String, val value: String?)\n\n    private val parameters: MutableList<Parameter> = ArrayList()\n\n    val uri: Uri = uri.toUri()\n\n    private data class ValueResult(val value: String, val end: Int = -1)\n\n    companion object {\n        private fun findEndOfQuotedString(line: String, start: Int): Int {\n            var i = start\n            while (i < line.length) {\n                val c = line[i]\n                if (c == '\\\\') {\n                    i += 1\n                } else if (c == '\"') {\n                    return i\n                }\n                i++\n            }\n            return -1\n        }\n\n        private fun parseValue(line: String, start: Int): ValueResult {\n            val foundIndex = line.indexOfAny(charArrayOf(';', ',', '\"'), start, false)\n            if (foundIndex == -1) {\n                return ValueResult(line.substring(start).trim())\n            }\n            val c = line[foundIndex]\n            return if (c == ';' || c == ',') {\n                ValueResult(line.substring(start, foundIndex).trim(), foundIndex)\n            } else {\n                var quoteEnd = findEndOfQuotedString(line, foundIndex + 1)\n                if (quoteEnd == -1) {\n                    quoteEnd = line.length\n                }\n                ValueResult(line.substring(foundIndex + 1, quoteEnd).trim(), quoteEnd)\n            }\n        }\n\n        private fun parseParameters(line: String, start: Int, link: HttpHeaderLink): Int {\n            var i = start\n            while (i < line.length) {\n                val foundIndex = line.indexOfAny(charArrayOf('=', ','), i, false)\n                if (foundIndex == -1) {\n                    return -1\n                } else if (line[foundIndex] == ',') {\n                    return foundIndex\n                }\n                val name = line.substring(line.indexOf(';', i) + 1, foundIndex).trim()\n                val result = parseValue(line, foundIndex)\n                val value = result.value\n                val parameter = Parameter(name, value)\n                link.parameters.add(parameter)\n                i = if (result.end == -1) {\n                    return -1\n                } else {\n                    result.end\n                }\n            }\n            return -1\n        }\n\n        /**\n         * @param line the entire link header, not including the initial \"Link:\"\n         * @return all links found in the header\n         */\n        fun parse(line: String?): List<HttpHeaderLink> {\n            val links: MutableList<HttpHeaderLink> = mutableListOf()\n            line ?: return links\n\n            var i = 0\n            while (i < line.length) {\n                val uriEnd = line.indexOf('>', i)\n                val uri = line.substring(line.indexOf('<', i) + 1, uriEnd)\n                val link = HttpHeaderLink(uri)\n                links.add(link)\n                val parseEnd = parseParameters(line, uriEnd, link)\n                i = if (parseEnd == -1) {\n                    break\n                } else {\n                    parseEnd\n                }\n                i++\n            }\n\n            return links\n        }\n\n        /**\n         * @param links intended to be those returned by parse()\n         * @param relationType of the parameter \"rel\", commonly \"next\" or \"prev\"\n         * @return the link matching the given relation type\n         */\n        fun findByRelationType(links: List<HttpHeaderLink>, relationType: String): HttpHeaderLink? {\n            return links.find { link ->\n                link.parameters.any { parameter ->\n                    parameter.name == \"rel\" && parameter.value == relationType\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/IOUtils.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.util\n\nimport android.content.ContentResolver\nimport android.net.Uri\nimport java.io.Closeable\nimport java.io.File\nimport java.io.IOException\nimport okio.buffer\nimport okio.sink\nimport okio.source\n\nfun Closeable.closeQuietly() {\n    try {\n        close()\n    } catch (e: IOException) {\n        // intentionally unhandled\n    }\n}\n\nfun Uri.copyToFile(contentResolver: ContentResolver, file: File): Boolean {\n    return try {\n        val inputStream = contentResolver.openInputStream(this) ?: return false\n        inputStream.source().use { source ->\n            file.sink().buffer().use { bufferedSink ->\n                bufferedSink.writeAll(source)\n            }\n        }\n        true\n    } catch (e: IOException) {\n        false\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/IconUtils.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.util\n\nimport android.graphics.Color\nimport android.graphics.drawable.Drawable\nimport androidx.appcompat.content.res.AppCompatResources\nimport androidx.preference.PreferenceFragmentCompat\nimport com.google.android.material.color.MaterialColors\nimport com.keylesspalace.tusky.R\n\nfun PreferenceFragmentCompat.icon(icon: Int): Drawable? {\n    val context = requireContext()\n    return AppCompatResources.getDrawable(context, icon)?.apply {\n        setTint(MaterialColors.getColor(context, R.attr.iconColor, Color.BLACK))\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/ImageLoadingHelper.kt",
    "content": "/* Copyright 2025 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\n@file:JvmName(\"ImageLoadingHelper\")\n\npackage com.keylesspalace.tusky.util\n\nimport android.graphics.Bitmap\nimport android.widget.ImageView\nimport androidx.annotation.Px\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.load.MultiTransformation\nimport com.bumptech.glide.load.Transformation\nimport com.bumptech.glide.load.resource.bitmap.CenterCrop\nimport com.bumptech.glide.load.resource.bitmap.RoundedCorners\nimport com.keylesspalace.tusky.R\n\nprivate val centerCropTransformation = CenterCrop()\n\nfun loadAvatar(\n    url: String?,\n    imageView: ImageView,\n    @Px radius: Int,\n    animate: Boolean,\n    transforms: List<Transformation<Bitmap>>? = null\n) {\n    if (url.isNullOrBlank()) {\n        Glide.with(imageView)\n            .load(R.drawable.avatar_default)\n            .into(imageView)\n    } else {\n        val multiTransformation = MultiTransformation(\n            buildList {\n                transforms?.let { this.addAll(it) }\n                add(centerCropTransformation)\n                add(RoundedCorners(radius))\n            }\n        )\n\n        if (animate) {\n            Glide.with(imageView)\n                .load(url)\n                .transform(multiTransformation)\n                .placeholder(R.drawable.avatar_default)\n                .into(imageView)\n        } else {\n            Glide.with(imageView)\n                .asBitmap()\n                .load(url)\n                .transform(multiTransformation)\n                .placeholder(R.drawable.avatar_default)\n                .into(imageView)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/Lazy.kt",
    "content": "package com.keylesspalace.tusky.util\n\n@Suppress(\"NOTHING_TO_INLINE\")\ninline fun <T : Any> unsafeLazy(noinline initializer: () -> T): Lazy<T> =\n    lazy(LazyThreadSafetyMode.NONE, initializer)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/LifecycleExtensions.kt",
    "content": "package com.keylesspalace.tusky.util\n\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.coroutineScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.launch\n\nfun Lifecycle.launchAndRepeatOnLifecycle(\n    state: Lifecycle.State = Lifecycle.State.STARTED,\n    block: suspend CoroutineScope.() -> Unit\n): Job = coroutineScope.launch {\n    repeatOnLifecycle(state, block)\n}\n\nfun LifecycleOwner.launchAndRepeatOnLifecycle(\n    state: Lifecycle.State = Lifecycle.State.STARTED,\n    block: suspend CoroutineScope.() -> Unit\n): Job = lifecycle.launchAndRepeatOnLifecycle(state, block)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/LinkHelper.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n@file:JvmName(\"LinkHelper\")\n\npackage com.keylesspalace.tusky.util\n\nimport android.content.ActivityNotFoundException\nimport android.content.Context\nimport android.content.Intent\nimport android.graphics.Color\nimport android.net.Uri\nimport android.os.Build\nimport android.text.Spannable\nimport android.text.SpannableStringBuilder\nimport android.text.Spanned\nimport android.text.method.LinkMovementMethod\nimport android.text.style.ClickableSpan\nimport android.text.style.ForegroundColorSpan\nimport android.text.style.QuoteSpan\nimport android.text.style.URLSpan\nimport android.util.Log\nimport android.view.MotionEvent\nimport android.view.MotionEvent.ACTION_UP\nimport android.view.View\nimport android.widget.TextView\nimport androidx.annotation.VisibleForTesting\nimport androidx.appcompat.content.res.AppCompatResources\nimport androidx.browser.customtabs.CustomTabColorSchemeParams\nimport androidx.browser.customtabs.CustomTabsIntent\nimport androidx.core.net.toUri\nimport androidx.preference.PreferenceManager\nimport at.connyduck.sparkbutton.helpers.Utils\nimport com.google.android.material.R as materialR\nimport com.google.android.material.color.MaterialColors\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.entity.HashTag\nimport com.keylesspalace.tusky.entity.Status.Mention\nimport com.keylesspalace.tusky.interfaces.LinkListener\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport java.net.URI\nimport java.net.URISyntaxException\nimport java.util.regex.Pattern\n\nfun getDomain(urlString: String?): String {\n    val host = urlString?.toUri()?.host\n    return when {\n        host == null -> \"\"\n        host.startsWith(\"www.\") -> host.substring(4)\n        else -> host\n    }\n}\n\n/**\n * Finds links, mentions, and hashtags in a piece of text and makes them clickable, associating\n * them with callbacks to notify when they're clicked.\n *\n * @param view the returned text will be put in\n * @param content containing text with mentions, links, or hashtags\n * @param mentions any '@' mentions which are known to be in the content\n * @param listener to notify about particular spans that are clicked\n * @param trailingHashtagView a text view to fill with trailing / out-of-band hashtags\n */\nfun setClickableText(\n    view: TextView,\n    content: CharSequence,\n    mentions: List<Mention>,\n    tags: List<HashTag>?,\n    listener: LinkListener,\n    trailingHashtagView: TextView? = null,\n) {\n    val spannableContent = markupHiddenUrls(view, content)\n    val (endOfContent, trailingHashtags) = when {\n        trailingHashtagView == null || tags.isNullOrEmpty() -> Pair(spannableContent.length, emptyList())\n        else -> getTrailingHashtags(spannableContent)\n    }\n    val inlineHashtags = mutableSetOf<CharSequence>()\n\n    view.text = spannableContent.apply {\n        styleQuoteSpans(view)\n        getSpans(0, endOfContent, URLSpan::class.java).forEach { span ->\n            val start = getSpanStart(span)\n            if (get(start) == '#') {\n                inlineHashtags.add(normalizeToASCII(subSequence(start + 1, getSpanEnd(span))))\n            }\n            setClickableText(span, this, mentions, tags, listener)\n        }\n    }.subSequence(0, endOfContent).trimEnd()\n\n    view.movementMethod = NoTrailingSpaceLinkMovementMethod\n\n    val showHashtagBar = (trailingHashtags.isNotEmpty() || inlineHashtags.size != tags?.size)\n    // I don't _love_ setting the visibility here, but the alternative is to duplicate the logic in other places\n    trailingHashtagView?.visible(showHashtagBar)\n\n    if (showHashtagBar) {\n        trailingHashtagView?.apply {\n            text = buildTrailingHashtagText(\n                tags?.filterNot { tag -> inlineHashtags.any { it.contentEquals(tag.name, ignoreCase = true) } },\n                trailingHashtags,\n                listener,\n            )\n        }\n    }\n}\n\n/**\n * Build a spanned string containing trailing and out-of-band hashtags for the trailing hashtag view\n * @param tagsFromServer The list of hashtags from the server\n * @param trailingHashtagsFromContent The list of trailing hashtags scraped from the post content\n * @param listener to notify about particular spans that are clicked\n */\nprivate fun buildTrailingHashtagText(tagsFromServer: List<HashTag>?, trailingHashtagsFromContent: List<HashTag>, listener: LinkListener): SpannableStringBuilder {\n    return SpannableStringBuilder().apply {\n        // we apply the tags scraped from the content first to preserve the casing\n        // (tags from the server are often downcased)\n        val additionalTags = tagsFromServer?.let {\n            it.filter { serverTag ->\n                trailingHashtagsFromContent.none {\n                    serverTag.name.equals(normalizeToASCII(it.name), ignoreCase = true)\n                }\n            }\n        } ?: emptyList()\n        appendTags(trailingHashtagsFromContent.plus(additionalTags), listener)\n    }\n}\n\n/**\n * Append space-separated url spans for a list of hashtags\n * @param tags The tags to append\n * @param listener to notify about particular spans that are clicked\n */\nprivate fun SpannableStringBuilder.appendTags(tags: List<HashTag>, listener: LinkListener) {\n    tags.forEachIndexed { index, tag ->\n        append(\"#${tag.name}\", getCustomSpanForTag(normalizeToASCII(tag.name), URLSpan(tag.url), listener), 0)\n        if (index != tags.lastIndex) {\n            append(\" \")\n        }\n    }\n}\n\nprivate val hashtagWithHashPattern = Pattern.compile(\"^#$HASHTAG_EXPRESSION$\")\nprivate val whitespacePattern = Regex(\"\"\"\\s+\"\"\")\n\n/**\n * Find the \"trailing\" hashtags in spanned content\n * These are hashtags in lines consisting *only* of hashtags at the end of the post\n */\n@VisibleForTesting\ninternal fun getTrailingHashtags(content: Spanned): Pair<Int, List<HashTag>> {\n    // split() instead of lines() because we need to be able to account for the length of the removed delimiter\n    val trailingContentLength = content.split('\\r', '\\n').asReversed().takeWhile { line ->\n        line.splitToSequence(whitespacePattern).all { it.isBlank() || hashtagWithHashPattern.matcher(it).matches() }\n    }.sumOf { it.length + 1 } // length + 1 to include the stripped line ending character\n\n    return when (trailingContentLength) {\n        0 -> Pair(content.length, emptyList())\n        else -> {\n            val trailingContentOffset = (content.length - trailingContentLength).coerceAtLeast(0)\n            Pair(\n                trailingContentOffset,\n                content.getSpans(trailingContentOffset, content.length, URLSpan::class.java)\n                    .filter { content[content.getSpanStart(it)] == '#' } // just in case\n                    .map { spanToHashtag(content, it) }\n            )\n        }\n    }\n}\n\n// URLSpan(\"#tag\", url) -> Hashtag(\"tag\", url)\nprivate fun spanToHashtag(content: Spanned, span: URLSpan) = HashTag(\n    content.subSequence(content.getSpanStart(span) + 1, content.getSpanEnd(span)).toString(),\n    span.url,\n)\n\n@VisibleForTesting\ninternal fun markupHiddenUrls(view: TextView, content: CharSequence): SpannableStringBuilder {\n    val spannableContent = SpannableStringBuilder(content)\n    val originalSpans = spannableContent.getSpans(0, content.length, URLSpan::class.java)\n    val obscuredLinkSpans = originalSpans.filter {\n        val start = spannableContent.getSpanStart(it)\n        val firstCharacter = content[start]\n        return@filter if (firstCharacter == '#' || firstCharacter == '@') {\n            false\n        } else {\n            val text = spannableContent.subSequence(\n                start,\n                spannableContent.getSpanEnd(it)\n            ).toString()\n                .split(' ').lastOrNull().orEmpty()\n            var textDomain = getDomain(text)\n            if (textDomain.isBlank()) {\n                textDomain = getDomain(\"https://$text\")\n            }\n            getDomain(it.url) != textDomain\n        }\n    }\n\n    for (span in obscuredLinkSpans) {\n        val start = spannableContent.getSpanStart(span)\n        val end = spannableContent.getSpanEnd(span)\n        val additionalText = \" \" + view.context.getString(\n            R.string.url_domain_notifier,\n            getDomain(span.url)\n        )\n        spannableContent.insert(\n            end,\n            additionalText\n        )\n        // reinsert the span so it covers the original and the additional text\n        spannableContent.setSpan(span, start, end + additionalText.length, 0)\n\n        val linkDrawable = AppCompatResources.getDrawable(view.context, R.drawable.ic_open_in_new_24dp)!!\n        // ImageSpan does not always align the icon correctly in the line, let's use our custom emoji span for this\n        val linkDrawableSpan = EmojiSpan(view)\n        linkDrawableSpan.imageDrawable = linkDrawable\n\n        val placeholderIndex = end + 2\n\n        spannableContent.setSpan(\n            linkDrawableSpan,\n            placeholderIndex,\n            placeholderIndex + \"🔗\".length,\n            0\n        )\n    }\n\n    return spannableContent\n}\n\n@VisibleForTesting\nfun setClickableText(\n    span: URLSpan,\n    builder: SpannableStringBuilder,\n    mentions: List<Mention>,\n    tags: List<HashTag>?,\n    listener: LinkListener\n) = builder.apply {\n    val start = getSpanStart(span)\n    val end = getSpanEnd(span)\n    val flags = getSpanFlags(span)\n    val text = subSequence(start, end)\n\n    val customSpan = when (text[0]) {\n        '#' -> getCustomSpanForTag(text, tags, span, listener)\n        '@' -> getCustomSpanForMention(mentions, span, listener)\n        else -> null\n    } ?: object : NoUnderlineURLSpan(span.url) {\n        override fun onClick(view: View) = listener.onViewUrl(url)\n    }\n\n    removeSpan(span)\n    setSpan(customSpan, start, end, flags)\n}\n\n@VisibleForTesting\nfun getTagName(text: CharSequence, tags: List<HashTag>?): String? {\n    val scrapedName = normalizeToASCII(text.subSequence(1, text.length))\n    return when (tags) {\n        null -> scrapedName\n        else -> tags.firstOrNull { it.name.equals(scrapedName, true) }?.name\n    }\n}\n\nprivate fun getCustomSpanForTag(\n    text: CharSequence,\n    tags: List<HashTag>?,\n    span: URLSpan,\n    listener: LinkListener\n) = getTagName(text, tags)?.let { getCustomSpanForTag(it, span, listener) }\n\nprivate fun getCustomSpanForTag(\n    tagName: String,\n    span: URLSpan,\n    listener: LinkListener\n) = object : NoUnderlineURLSpan(span.url) {\n    override fun onClick(view: View) = listener.onViewTag(tagName)\n}\n\nprivate fun getCustomSpanForMention(\n    mentions: List<Mention>,\n    span: URLSpan,\n    listener: LinkListener\n): ClickableSpan? {\n    // https://github.com/tuskyapp/Tusky/pull/2339\n    return mentions.firstOrNull { it.url == span.url }?.let {\n        getCustomSpanForMentionUrl(span.url, it.id, listener)\n    }\n}\n\nprivate fun getCustomSpanForMentionUrl(\n    url: String,\n    mentionId: String,\n    listener: LinkListener\n): ClickableSpan {\n    return object : MentionSpan(url) {\n        override fun onClick(view: View) = listener.onViewAccount(mentionId)\n    }\n}\n\nprivate fun SpannableStringBuilder.styleQuoteSpans(view: TextView) {\n    getSpans(0, length, QuoteSpan::class.java).forEach { span ->\n        val start = getSpanStart(span)\n        val end = getSpanEnd(span)\n        val flags = getSpanFlags(span)\n\n        val quoteColor = MaterialColors.getColor(view, android.R.attr.textColorTertiary)\n\n        val newQuoteSpan = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {\n            QuoteSpan(\n                quoteColor,\n                Utils.dpToPx(view.context, 3),\n                Utils.dpToPx(view.context, 8)\n            )\n        } else {\n            QuoteSpan(quoteColor)\n        }\n\n        val quoteColorSpan = ForegroundColorSpan(quoteColor)\n\n        removeSpan(span)\n        setSpan(newQuoteSpan, start, end, flags)\n        setSpan(quoteColorSpan, start, end, flags)\n    }\n}\n\n/**\n * Put mentions in a piece of text and makes them clickable, associating them with callbacks to\n * notify when they're clicked.\n *\n * @param view the returned text will be put in\n * @param mentions any '@' mentions which are known to be in the content\n * @param listener to notify about particular spans that are clicked\n */\nfun setClickableMentions(view: TextView, mentions: List<Mention>?, listener: LinkListener) {\n    if (mentions?.isEmpty() != false) {\n        view.text = null\n        return\n    }\n\n    view.text = SpannableStringBuilder().apply {\n        var start = 0\n        var end = 0\n        var flags: Int\n        var firstMention = true\n\n        for (mention in mentions) {\n            val customSpan = getCustomSpanForMentionUrl(mention.url, mention.id, listener)\n            end += 1 + mention.localUsername.length // length of @ + username\n            flags = getSpanFlags(customSpan)\n            if (firstMention) {\n                firstMention = false\n            } else {\n                append(\" \")\n                start += 1\n                end += 1\n            }\n\n            append(\"@\")\n            append(mention.localUsername)\n            setSpan(customSpan, start, end, flags)\n            start = end\n        }\n    }\n    view.movementMethod = NoTrailingSpaceLinkMovementMethod\n}\n\nfun createClickableText(text: String, link: String): CharSequence {\n    return SpannableStringBuilder(text).apply {\n        setSpan(NoUnderlineURLSpan(link), 0, text.length, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)\n    }\n}\n\n/**\n * Opens a link, depending on the settings, either in the browser or in a custom tab\n *\n * @receiver the Context to open the link from\n * @param url a string containing the url to open\n */\nfun Context.openLink(url: String) {\n    val uri = url.toUri().normalizeScheme()\n    val useCustomTabs = PreferenceManager.getDefaultSharedPreferences(\n        this\n    ).getBoolean(PrefKeys.CUSTOM_TABS, false)\n\n    if (useCustomTabs) {\n        openLinkInCustomTab(uri, this)\n    } else {\n        openLinkInBrowser(uri, this)\n    }\n}\n\n/**\n * opens a link in the browser via Intent.ACTION_VIEW\n *\n * @param uri the uri to open\n * @param context context\n */\nprivate fun openLinkInBrowser(uri: Uri?, context: Context) {\n    val intent = Intent(Intent.ACTION_VIEW, uri)\n    try {\n        context.startActivity(intent)\n    } catch (e: ActivityNotFoundException) {\n        Log.w(TAG, \"Activity was not found for intent, $intent\", e)\n    }\n}\n\n/**\n * tries to open a link in a custom tab\n * falls back to browser if not possible\n *\n * @param uri the uri to open\n * @param context context\n */\nfun openLinkInCustomTab(uri: Uri, context: Context) {\n    val toolbarColor = MaterialColors.getColor(\n        context,\n        materialR.attr.colorSurface,\n        Color.BLACK\n    )\n\n    @Suppress(\"DEPRECATION\")\n    val navigationbarColor = MaterialColors.getColor(\n        context,\n        android.R.attr.navigationBarColor,\n        Color.BLACK\n    )\n    val navigationbarDividerColor = MaterialColors.getColor(\n        context,\n        R.attr.dividerColor,\n        Color.BLACK\n    )\n    val colorSchemeParams = CustomTabColorSchemeParams.Builder()\n        .setToolbarColor(toolbarColor)\n        .setNavigationBarColor(navigationbarColor)\n        .setNavigationBarDividerColor(navigationbarDividerColor)\n        .build()\n    val customTabsIntent = CustomTabsIntent.Builder()\n        .setDefaultColorSchemeParams(colorSchemeParams)\n        .setShareState(CustomTabsIntent.SHARE_STATE_ON)\n        .setShowTitle(true)\n        .build()\n\n    try {\n        customTabsIntent.launchUrl(context, uri)\n    } catch (e: ActivityNotFoundException) {\n        Log.w(TAG, \"Activity was not found for intent $customTabsIntent\", e)\n        openLinkInBrowser(uri, context)\n    }\n}\n\n// https://mastodon.foo.bar/@User\n// https://mastodon.foo.bar/@User/43456787654678\n// https://mastodon.foo.bar/users/User/statuses/43456787654678\n// https://pleroma.foo.bar/users/User\n// https://pleroma.foo.bar/users/9qTHT2ANWUdXzENqC0\n// https://pleroma.foo.bar/notice/9sBHWIlwwGZi5QGlHc\n// https://pleroma.foo.bar/objects/d4643c42-3ae0-4b73-b8b0-c725f5819207\n// https://friendica.foo.bar/profile/user\n// https://friendica.foo.bar/display/d4643c42-3ae0-4b73-b8b0-c725f5819207\n// https://misskey.foo.bar/notes/83w6r388br (always lowercase)\n// https://pixelfed.social/p/connyduck/391263492998670833\n// https://pixelfed.social/connyduck\n// https://gts.foo.bar/@goblin/statuses/01GH9XANCJ0TA8Y95VE9H3Y0Q2\n// https://gts.foo.bar/@goblin\n// https://foo.microblog.pub/o/5b64045effd24f48a27d7059f6cb38f5\n// https://bookwyrm.foo.bar/user/User\n// https://bookwyrm.foo.bar/user/User/comment/123456\nfun looksLikeMastodonUrl(urlString: String): Boolean {\n    val uri: URI\n    try {\n        uri = URI(urlString)\n    } catch (_: URISyntaxException) {\n        return false\n    }\n\n    if (uri.query != null ||\n        uri.fragment != null ||\n        uri.path == null\n    ) {\n        return false\n    }\n\n    return uri.path.let {\n        it.matches(\"^/@[^/]+$\".toRegex()) ||\n            it.matches(\"^/@[^/]+/\\\\d+$\".toRegex()) ||\n            it.matches(\"^/users/[^/]+/statuses/\\\\d+$\".toRegex()) ||\n            it.matches(\"^/users/\\\\w+$\".toRegex()) ||\n            it.matches(\"^/user/[^/]+/comment/\\\\d+$\".toRegex()) ||\n            it.matches(\"^/user/\\\\w+$\".toRegex()) ||\n            it.matches(\"^/notice/[a-zA-Z0-9]+$\".toRegex()) ||\n            it.matches(\"^/objects/[-a-f0-9]+$\".toRegex()) ||\n            it.matches(\"^/notes/[a-z0-9]+$\".toRegex()) ||\n            it.matches(\"^/display/[-a-f0-9]+$\".toRegex()) ||\n            it.matches(\"^/profile/\\\\w+$\".toRegex()) ||\n            it.matches(\"^/p/\\\\w+/\\\\d+$\".toRegex()) ||\n            it.matches(\"^/\\\\w+$\".toRegex()) ||\n            it.matches(\"^/@[^/]+/statuses/[a-zA-Z0-9]+$\".toRegex()) ||\n            it.matches(\"^/o/[a-f0-9]+$\".toRegex())\n    }\n}\n\nprivate const val TAG = \"LinkHelper\"\n\n/**\n * [LinkMovementMethod] that doesn't add a leading/trailing clickable area.\n *\n * [LinkMovementMethod] has a bug in its calculation of the clickable width of a span on a line. If\n * the span is the last thing on the line the clickable area extends to the end of the view. So the\n * user can tap what appears to be whitespace and open a link.\n *\n * Fix this by overriding ACTION_UP touch events and calculating the true start and end of the\n * content on the line that was tapped. Then ignore clicks that are outside this area.\n *\n * See https://github.com/tuskyapp/Tusky/issues/1567.\n */\nobject NoTrailingSpaceLinkMovementMethod : LinkMovementMethod() {\n    override fun onTouchEvent(widget: TextView, buffer: Spannable, event: MotionEvent): Boolean {\n        val action = event.action\n        if (action != ACTION_UP) return super.onTouchEvent(widget, buffer, event)\n\n        val x = event.x.toInt()\n        val y = event.y.toInt() - widget.totalPaddingTop + widget.scrollY\n        val line = widget.layout.getLineForVertical(y)\n        val lineLeft = widget.layout.getLineLeft(line)\n        val lineRight = widget.layout.getLineRight(line)\n        if (x > lineRight || x >= 0 && x < lineLeft) {\n            return true\n        }\n\n        return super.onTouchEvent(widget, buffer, event)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/ListStatusAccessibilityDelegate.kt",
    "content": "package com.keylesspalace.tusky.util\n\nimport android.content.Context\nimport android.os.Bundle\nimport android.text.Spannable\nimport android.text.style.URLSpan\nimport android.view.View\nimport android.view.accessibility.AccessibilityEvent\nimport android.view.accessibility.AccessibilityManager\nimport android.widget.ArrayAdapter\nimport androidx.core.view.AccessibilityDelegateCompat\nimport androidx.core.view.accessibility.AccessibilityNodeInfoCompat\nimport androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.adapter.StatusBaseViewHolder\nimport com.keylesspalace.tusky.entity.Status.Companion.MAX_MEDIA_ATTACHMENTS\nimport com.keylesspalace.tusky.interfaces.StatusActionListener\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport kotlin.math.min\n\n// Not using lambdas because there's boxing of int then\nfun interface StatusProvider {\n    fun getStatus(pos: Int): StatusViewData?\n}\n\nclass ListStatusAccessibilityDelegate(\n    private val recyclerView: RecyclerView,\n    private val statusActionListener: StatusActionListener,\n    private val statusProvider: StatusProvider\n) : RecyclerViewAccessibilityDelegate(recyclerView) {\n    private val a11yManager = context.getSystemService(Context.ACCESSIBILITY_SERVICE)\n        as AccessibilityManager\n\n    override fun getItemDelegate(): AccessibilityDelegateCompat = itemDelegate\n\n    private val context: Context get() = recyclerView.context\n\n    private val itemDelegate = object : ItemDelegate(this) {\n        override fun onInitializeAccessibilityNodeInfo(\n            host: View,\n            info: AccessibilityNodeInfoCompat\n        ) {\n            super.onInitializeAccessibilityNodeInfo(host, info)\n\n            val pos = recyclerView.getChildAdapterPosition(host)\n            val status = statusProvider.getStatus(pos) ?: return\n            if (status is StatusViewData.Concrete) {\n                if (status.status.spoilerText.isNotEmpty()) {\n                    info.addAction(if (status.isExpanded) collapseCwAction else expandCwAction)\n                }\n\n                info.addAction(replyAction)\n\n                val actionable = status.actionable\n                if (actionable.isRebloggingAllowed) {\n                    info.addAction(if (actionable.reblogged) unreblogAction else reblogAction)\n                }\n                info.addAction(if (actionable.favourited) unfavouriteAction else favouriteAction)\n                info.addAction(if (actionable.bookmarked) unbookmarkAction else bookmarkAction)\n\n                val mediaActions = intArrayOf(\n                    R.id.action_open_media_1,\n                    R.id.action_open_media_2,\n                    R.id.action_open_media_3,\n                    R.id.action_open_media_4\n                )\n                val attachmentCount = min(actionable.attachments.size, MAX_MEDIA_ATTACHMENTS)\n                for (i in 0 until attachmentCount) {\n                    info.addAction(\n                        AccessibilityActionCompat(\n                            mediaActions[i],\n                            context.getString(R.string.action_open_media_n, i + 1)\n                        )\n                    )\n                }\n\n                info.addAction(openProfileAction)\n                if (getLinks(status).any()) info.addAction(linksAction)\n\n                val mentions = actionable.mentions\n                if (mentions.isNotEmpty()) info.addAction(mentionsAction)\n\n                if (getHashtags(status).any()) info.addAction(hashtagsAction)\n                if (!status.status.reblog?.account?.username.isNullOrEmpty()) {\n                    info.addAction(openRebloggerAction)\n                }\n                if (actionable.reblogsCount > 0) info.addAction(openRebloggedByAction)\n                if (actionable.favouritesCount > 0) info.addAction(openFavsAction)\n\n                info.addAction(moreAction)\n            }\n        }\n\n        override fun performAccessibilityAction(host: View, action: Int, args: Bundle?): Boolean {\n            val pos = recyclerView.getChildAdapterPosition(host)\n            when (action) {\n                R.id.action_reply -> {\n                    interrupt()\n                    statusActionListener.onReply(pos)\n                }\n                R.id.action_favourite -> statusActionListener.onFavourite(true, pos)\n                R.id.action_unfavourite -> statusActionListener.onFavourite(false, pos)\n                R.id.action_bookmark -> statusActionListener.onBookmark(true, pos)\n                R.id.action_unbookmark -> statusActionListener.onBookmark(false, pos)\n                R.id.action_reblog -> statusActionListener.onReblog(true, pos, null)\n                R.id.action_unreblog -> statusActionListener.onReblog(false, pos, null)\n                R.id.action_open_profile -> {\n                    interrupt()\n                    statusActionListener.onViewAccount(\n                        (\n                            statusProvider.getStatus(\n                                pos\n                            ) as StatusViewData.Concrete\n                            ).actionable.account.id\n                    )\n                }\n                R.id.action_open_media_1 -> {\n                    interrupt()\n                    statusActionListener.onViewMedia(pos, 0, null)\n                }\n                R.id.action_open_media_2 -> {\n                    interrupt()\n                    statusActionListener.onViewMedia(pos, 1, null)\n                }\n                R.id.action_open_media_3 -> {\n                    interrupt()\n                    statusActionListener.onViewMedia(pos, 2, null)\n                }\n                R.id.action_open_media_4 -> {\n                    interrupt()\n                    statusActionListener.onViewMedia(pos, 3, null)\n                }\n                R.id.action_expand_cw -> {\n                    // Toggling it directly to avoid animations\n                    // which cannot be disabled for detailed status for some reason\n                    val holder = recyclerView.getChildViewHolder(host) as StatusBaseViewHolder\n                    holder.toggleContentWarning()\n                    // Stop and restart narrator before it reads old description.\n                    // Would be nice if we could *just* read the content here but doesn't seem\n                    // to be possible.\n                    forceFocus(host)\n                }\n                R.id.action_collapse_cw -> {\n                    statusActionListener.onExpandedChange(false, pos)\n                    interrupt()\n                }\n                R.id.action_links -> showLinksDialog(host)\n                R.id.action_mentions -> showMentionsDialog(host)\n                R.id.action_hashtags -> showHashtagsDialog(host)\n                R.id.action_open_reblogger -> {\n                    interrupt()\n                    statusActionListener.onOpenReblog(pos)\n                }\n                R.id.action_open_reblogged_by -> {\n                    interrupt()\n                    statusActionListener.onShowReblogs(pos)\n                }\n                R.id.action_open_faved_by -> {\n                    interrupt()\n                    statusActionListener.onShowFavs(pos)\n                }\n                R.id.action_more -> {\n                    statusActionListener.onMore(host, pos)\n                }\n                else -> return super.performAccessibilityAction(host, action, args)\n            }\n            return true\n        }\n\n        private fun showLinksDialog(host: View) {\n            val status = getStatus(host) as? StatusViewData.Concrete ?: return\n            val links = getLinks(status).toList()\n            val textLinks = links.map { item -> item.link }\n            MaterialAlertDialogBuilder(host.context)\n                .setTitle(R.string.title_links_dialog)\n                .setAdapter(\n                    ArrayAdapter(\n                        host.context,\n                        android.R.layout.simple_list_item_1,\n                        textLinks\n                    )\n                ) { _, which -> host.context.openLink(links[which].link) }\n                .show()\n                .let { forceFocus(it.listView) }\n        }\n\n        private fun showMentionsDialog(host: View) {\n            val status = getStatus(host) as? StatusViewData.Concrete ?: return\n            val mentions = status.actionable.mentions\n            val stringMentions = mentions.map { it.username }\n            MaterialAlertDialogBuilder(host.context)\n                .setTitle(R.string.title_mentions_dialog)\n                .setAdapter(\n                    ArrayAdapter<CharSequence>(\n                        host.context,\n                        android.R.layout.simple_list_item_1,\n                        stringMentions\n                    )\n                ) { _, which ->\n                    statusActionListener.onViewAccount(mentions[which].id)\n                }\n                .show()\n                .let { forceFocus(it.listView) }\n        }\n\n        private fun showHashtagsDialog(host: View) {\n            val status = getStatus(host) as? StatusViewData.Concrete ?: return\n            val tags = getHashtags(status).map { it.subSequence(1, it.length) }.toList()\n            MaterialAlertDialogBuilder(host.context)\n                .setTitle(R.string.title_hashtags_dialog)\n                .setAdapter(\n                    ArrayAdapter(\n                        host.context,\n                        android.R.layout.simple_list_item_1,\n                        tags\n                    )\n                ) { _, which ->\n                    statusActionListener.onViewTag(tags[which].toString())\n                }\n                .show()\n                .let { forceFocus(it.listView) }\n        }\n\n        private fun getStatus(childView: View): StatusViewData {\n            return statusProvider.getStatus(recyclerView.getChildAdapterPosition(childView))!!\n        }\n    }\n\n    private fun getLinks(status: StatusViewData.Concrete): Sequence<LinkSpanInfo> {\n        val content = status.content\n        return if (content is Spannable) {\n            content.getSpans(0, content.length, URLSpan::class.java)\n                .asSequence()\n                .map { span ->\n                    val text = content.subSequence(\n                        content.getSpanStart(span),\n                        content.getSpanEnd(span)\n                    )\n                    if (isHashtag(text)) null else LinkSpanInfo(text.toString(), span.url)\n                }\n                .filterNotNull()\n        } else {\n            emptySequence()\n        }\n    }\n\n    private fun getHashtags(status: StatusViewData.Concrete): Sequence<CharSequence> {\n        val content = status.content\n        return content.getSpans(0, content.length, Object::class.java)\n            .asSequence()\n            .map { span ->\n                content.subSequence(content.getSpanStart(span), content.getSpanEnd(span))\n            }\n            .filter(this::isHashtag)\n    }\n\n    private fun forceFocus(host: View) {\n        interrupt()\n        host.post {\n            host.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED)\n        }\n    }\n\n    private fun interrupt() {\n        a11yManager.interrupt()\n    }\n\n    private fun isHashtag(text: CharSequence) = text.startsWith(\"#\")\n\n    private val collapseCwAction = AccessibilityActionCompat(\n        R.id.action_collapse_cw,\n        context.getString(R.string.post_content_warning_show_less)\n    )\n\n    private val expandCwAction = AccessibilityActionCompat(\n        R.id.action_expand_cw,\n        context.getString(R.string.post_content_warning_show_more)\n    )\n\n    private val replyAction = AccessibilityActionCompat(\n        R.id.action_reply,\n        context.getString(R.string.action_reply)\n    )\n\n    private val unreblogAction = AccessibilityActionCompat(\n        R.id.action_unreblog,\n        context.getString(R.string.action_unreblog)\n    )\n\n    private val reblogAction = AccessibilityActionCompat(\n        R.id.action_reblog,\n        context.getString(R.string.action_reblog)\n    )\n\n    private val unfavouriteAction = AccessibilityActionCompat(\n        R.id.action_unfavourite,\n        context.getString(R.string.action_unfavourite)\n    )\n\n    private val favouriteAction = AccessibilityActionCompat(\n        R.id.action_favourite,\n        context.getString(R.string.action_favourite)\n    )\n\n    private val bookmarkAction = AccessibilityActionCompat(\n        R.id.action_bookmark,\n        context.getString(R.string.action_bookmark)\n    )\n\n    private val unbookmarkAction = AccessibilityActionCompat(\n        R.id.action_unbookmark,\n        context.getString(R.string.action_bookmark)\n    )\n\n    private val openProfileAction = AccessibilityActionCompat(\n        R.id.action_open_profile,\n        context.getString(R.string.action_view_profile)\n    )\n\n    private val linksAction = AccessibilityActionCompat(\n        R.id.action_links,\n        context.getString(R.string.action_links)\n    )\n\n    private val mentionsAction = AccessibilityActionCompat(\n        R.id.action_mentions,\n        context.getString(R.string.action_mentions)\n    )\n\n    private val hashtagsAction = AccessibilityActionCompat(\n        R.id.action_hashtags,\n        context.getString(R.string.action_hashtags)\n    )\n\n    private val openRebloggerAction = AccessibilityActionCompat(\n        R.id.action_open_reblogger,\n        context.getString(R.string.action_open_reblogger)\n    )\n\n    private val openRebloggedByAction = AccessibilityActionCompat(\n        R.id.action_open_reblogged_by,\n        context.getString(R.string.action_open_reblogged_by)\n    )\n\n    private val openFavsAction = AccessibilityActionCompat(\n        R.id.action_open_faved_by,\n        context.getString(R.string.action_open_faved_by)\n    )\n\n    private val moreAction = AccessibilityActionCompat(\n        R.id.action_more,\n        context.getString(R.string.action_more)\n    )\n\n    private data class LinkSpanInfo(val text: String, val link: String)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/ListUtils.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\n@file:JvmName(\"ListUtils\")\n\npackage com.keylesspalace.tusky.util\n\ninline fun <T> List<T>.withoutFirstWhich(predicate: (T) -> Boolean): List<T> {\n    val index = indexOfFirst(predicate)\n    if (index == -1) {\n        return this\n    }\n    val newList = toMutableList()\n    newList.removeAt(index)\n    return newList\n}\n\ninline fun <T> List<T>.replacedFirstWhich(replacement: T, predicate: (T) -> Boolean): List<T> {\n    val index = indexOfFirst(predicate)\n    if (index == -1) {\n        return this\n    }\n    val newList = toMutableList()\n    newList[index] = replacement\n    return newList\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/LocaleExtensions.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.util\n\nimport android.content.Context\nimport com.keylesspalace.tusky.R\nimport java.util.Locale\n\n// When a language code has changed, `language` *explicitly* returns the obsolete version,\n// but `toLanguageTag()` uses the current version\n// https://developer.android.com/reference/java/util/Locale#getLanguage()\nval Locale.modernLanguageCode: String\n    get() {\n        return this.toLanguageTag().split('-', limit = 2)[0]\n    }\n\nfun Locale.getTuskyDisplayName(context: Context): String {\n    return context.getString(\n        R.string.language_display_name_format,\n        displayLanguage,\n        getDisplayLanguage(this)\n    )\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/LocaleManager.kt",
    "content": "/* Copyright 2019 Mélanie Chauvel (ariasuni)\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.util\n\nimport android.content.Context\nimport android.content.SharedPreferences\nimport android.os.Build\nimport androidx.appcompat.app.AppCompatDelegate\nimport androidx.core.content.edit\nimport androidx.core.os.LocaleListCompat\nimport androidx.preference.PreferenceDataStore\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass LocaleManager @Inject constructor(\n    @ApplicationContext val context: Context\n) : PreferenceDataStore() {\n\n    @Inject\n    lateinit var preferences: SharedPreferences\n\n    fun setLocale() {\n        val language = preferences.getNonNullString(PrefKeys.LANGUAGE, DEFAULT)\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {\n            if (language != HANDLED_BY_SYSTEM) {\n                // app is being opened on Android 13+ for the first time\n                // hand over the old setting to the system and save a dummy value in Shared Preferences\n                applyLanguageToApp(language)\n\n                preferences.edit {\n                    putString(PrefKeys.LANGUAGE, HANDLED_BY_SYSTEM)\n                }\n            }\n        } else {\n            // on Android < 13 we have to apply the language at every app start\n            applyLanguageToApp(language)\n        }\n    }\n\n    override fun putString(key: String?, value: String?) {\n        // if we are on Android < 13 we have to save the selected language so we can apply it at appstart\n        // on Android 13+ the system handles it for us\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {\n            preferences.edit {\n                putString(PrefKeys.LANGUAGE, value)\n            }\n        }\n        applyLanguageToApp(value)\n    }\n\n    override fun getString(key: String?, defValue: String?): String? {\n        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {\n            val selectedLanguage = AppCompatDelegate.getApplicationLocales()\n\n            if (selectedLanguage.isEmpty) {\n                DEFAULT\n            } else {\n                // Android lets users select all variants of languages we support in the system settings,\n                // so we need to find the closest match\n                // it should not happen that we find no match, but returning null is fine (picker will show default)\n\n                val availableLanguages = context.resources.getStringArray(R.array.language_values)\n\n                return availableLanguages.find { it == selectedLanguage[0]!!.toLanguageTag() }\n                    ?: availableLanguages.find { language ->\n                        language.startsWith(selectedLanguage[0]!!.language)\n                    }\n            }\n        } else {\n            preferences.getNonNullString(PrefKeys.LANGUAGE, DEFAULT)\n        }\n    }\n\n    private fun applyLanguageToApp(language: String?) {\n        val localeList = if (language == DEFAULT) {\n            LocaleListCompat.getEmptyLocaleList()\n        } else {\n            LocaleListCompat.forLanguageTags(language)\n        }\n\n        AppCompatDelegate.setApplicationLocales(localeList)\n    }\n\n    companion object {\n        private const val DEFAULT = \"default\"\n        private const val HANDLED_BY_SYSTEM = \"handled_by_system\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/LocaleUtils.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.util\n\nimport android.util.Log\nimport androidx.appcompat.app.AppCompatDelegate\nimport androidx.core.os.LocaleListCompat\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport java.util.Locale\n\nprivate const val TAG: String = \"LocaleUtils\"\n\nprivate fun LocaleListCompat.toList(): List<Locale> {\n    val list = mutableListOf<Locale>()\n    for (index in 0 until this.size()) {\n        this[index]?.let { list.add(it) }\n    }\n    return list\n}\n\n// Ensure that the locale whose code matches the given language is first in the list\nprivate fun ensureLanguagesAreFirst(locales: MutableList<Locale>, languages: List<String>) {\n    for (language in languages.reversed()) {\n        // Iterate prioritized languages in reverse to retain the order once bubbled to the top\n        var currentLocaleIndex = locales.indexOfFirst { it.language == language }\n        if (currentLocaleIndex < 0) {\n            // Recheck against modern language codes\n            // This should only happen when replying or when the per-account post language is set\n            // to a modern code\n            currentLocaleIndex = locales.indexOfFirst { it.modernLanguageCode == language }\n\n            if (currentLocaleIndex < 0) {\n                // This can happen when:\n                // - Your per-account posting language is set to one android doesn't know (e.g. toki pona)\n                // - Replying to a post in a language android doesn't know\n                locales.add(0, Locale(language))\n                Log.w(TAG, \"Attempting to use unknown language tag '$language'\")\n                continue\n            }\n        }\n\n        if (currentLocaleIndex > 0) {\n            // Move preselected locale to the top\n            locales.add(0, locales.removeAt(currentLocaleIndex))\n        }\n    }\n}\n\nfun getInitialLanguages(\n    language: String? = null,\n    activeAccount: AccountEntity? = null\n): List<String> {\n    val selected = listOfNotNull(language, activeAccount?.defaultPostLanguage)\n    val system = AppCompatDelegate.getApplicationLocales().toList() +\n        LocaleListCompat.getDefault().toList()\n\n    return (selected + system.map { it.language }).distinct().filter { it.isNotEmpty() }\n}\n\nfun getLocaleList(initialLanguages: List<String>): List<Locale> {\n    val locales = Locale.getAvailableLocales().filter {\n        // Only \"base\" languages, \"en\" but not \"en_DK\"\n        it.country.isNullOrEmpty() &&\n            it.script.isNullOrEmpty() &&\n            it.variant.isNullOrEmpty()\n    }.sortedBy { it.displayName }.toMutableList()\n    ensureLanguagesAreFirst(locales, initialLanguages)\n    return locales\n}\n\nfun localeNameForUntrustedISO639LangCode(code: String): String {\n    // It seems like it never throws?\n    return Locale(code).displayName\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/MediaUtils.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.util\n\nimport android.content.ContentResolver\nimport android.database.Cursor\nimport android.graphics.Bitmap\nimport android.graphics.BitmapFactory\nimport android.graphics.Matrix\nimport android.net.Uri\nimport android.provider.OpenableColumns\nimport android.util.Log\nimport androidx.exifinterface.media.ExifInterface\nimport java.io.File\nimport java.io.FileNotFoundException\nimport java.io.IOException\nimport java.text.SimpleDateFormat\nimport java.util.Date\nimport java.util.Locale\nimport kotlin.time.Duration.Companion.hours\n\n/**\n * Helper methods for obtaining and resizing media files\n */\nprivate const val TAG = \"MediaUtils\"\nprivate const val MEDIA_TEMP_PREFIX = \"Tusky_Share_Media\"\nconst val MEDIA_SIZE_UNKNOWN = -1L\n\n/**\n * Fetches the size of the media represented by the given URI, assuming it is openable and\n * the ContentResolver is able to resolve it.\n *\n * @return the size of the media in bytes or {@link MediaUtils#MEDIA_SIZE_UNKNOWN}\n */\nfun getMediaSize(contentResolver: ContentResolver, uri: Uri?): Long {\n    if (uri == null) {\n        return MEDIA_SIZE_UNKNOWN\n    }\n\n    var mediaSize = MEDIA_SIZE_UNKNOWN\n    val cursor: Cursor?\n    try {\n        cursor = contentResolver.query(uri, null, null, null, null)\n    } catch (e: SecurityException) {\n        return MEDIA_SIZE_UNKNOWN\n    }\n    if (cursor != null) {\n        val sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE)\n        cursor.moveToFirst()\n        mediaSize = cursor.getLong(sizeIndex)\n        cursor.close()\n    }\n    return mediaSize\n}\n\n@Throws(FileNotFoundException::class)\nfun getImageSquarePixels(contentResolver: ContentResolver, uri: Uri): Int {\n    val input = contentResolver.openInputStream(uri) ?: throw FileNotFoundException(\"Unavailable ContentProvider\")\n\n    val options = BitmapFactory.Options()\n    options.inJustDecodeBounds = true\n    try {\n        BitmapFactory.decodeStream(input, null, options)\n    } finally {\n        input.closeQuietly()\n    }\n\n    return options.outWidth * options.outHeight\n}\n\nfun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int {\n    // Raw height and width of image\n    val height = options.outHeight\n    val width = options.outWidth\n    var inSampleSize = 1\n\n    if (height > reqHeight || width > reqWidth) {\n        val halfHeight = height / 2\n        val halfWidth = width / 2\n\n        // Calculate the largest inSampleSize value that is a power of 2 and keeps both\n        // height and width larger than the requested height and width.\n        while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) {\n            inSampleSize *= 2\n        }\n    }\n\n    return inSampleSize\n}\n\nfun reorientBitmap(bitmap: Bitmap?, orientation: Int): Bitmap? {\n    val matrix = Matrix()\n    when (orientation) {\n        ExifInterface.ORIENTATION_NORMAL -> return bitmap\n        ExifInterface.ORIENTATION_FLIP_HORIZONTAL -> matrix.setScale(-1.0f, 1.0f)\n        ExifInterface.ORIENTATION_ROTATE_180 -> matrix.setRotate(180.0f)\n        ExifInterface.ORIENTATION_FLIP_VERTICAL -> {\n            matrix.setRotate(180.0f)\n            matrix.postScale(-1.0f, 1.0f)\n        }\n        ExifInterface.ORIENTATION_TRANSPOSE -> {\n            matrix.setRotate(90.0f)\n            matrix.postScale(-1.0f, 1.0f)\n        }\n        ExifInterface.ORIENTATION_ROTATE_90 -> matrix.setRotate(90.0f)\n        ExifInterface.ORIENTATION_TRANSVERSE -> {\n            matrix.setRotate(-90.0f)\n            matrix.postScale(-1.0f, 1.0f)\n        }\n        ExifInterface.ORIENTATION_ROTATE_270 -> matrix.setRotate(-90.0f)\n        else -> return bitmap\n    }\n\n    if (bitmap == null) {\n        return null\n    }\n\n    return try {\n        val result = Bitmap.createBitmap(\n            bitmap,\n            0,\n            0,\n            bitmap.width,\n            bitmap.height,\n            matrix,\n            true\n        )\n        if (!bitmap.sameAs(result)) {\n            bitmap.recycle()\n        }\n        result\n    } catch (e: OutOfMemoryError) {\n        null\n    }\n}\n\nfun getImageOrientation(uri: Uri, contentResolver: ContentResolver): Int {\n    try {\n        val inputStream = contentResolver.openInputStream(uri)\n            ?: return ExifInterface.ORIENTATION_UNDEFINED\n\n        try {\n            val exifInterface = ExifInterface(inputStream)\n            return exifInterface.getAttributeInt(\n                ExifInterface.TAG_ORIENTATION,\n                ExifInterface.ORIENTATION_NORMAL\n            )\n        } finally {\n            inputStream.closeQuietly()\n        }\n    } catch (e: IOException) {\n        Log.w(TAG, e)\n        return ExifInterface.ORIENTATION_UNDEFINED\n    }\n}\n\nfun deleteStaleCachedMedia(mediaDirectory: File?) {\n    if (mediaDirectory == null || !mediaDirectory.exists()) {\n        // Nothing to do\n        return\n    }\n\n    val unixTime = System.currentTimeMillis() - 24.hours.inWholeMilliseconds\n\n    val files = mediaDirectory.listFiles { file -> unixTime > file.lastModified() && file.name.contains(MEDIA_TEMP_PREFIX) }\n    if (files.isNullOrEmpty()) {\n        // Nothing to do\n        return\n    }\n\n    for (file in files) {\n        try {\n            file.delete()\n        } catch (se: SecurityException) {\n            Log.e(TAG, \"Error removing stale cached media\")\n        }\n    }\n}\n\nfun getTemporaryMediaFilename(extension: String): String {\n    return \"${MEDIA_TEMP_PREFIX}_${SimpleDateFormat(\n        \"yyyyMMdd_HHmmss\",\n        Locale.US\n    ).format(Date())}.$extension\"\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/NoUnderlineURLSpan.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.util\n\nimport android.text.TextPaint\nimport android.text.style.URLSpan\nimport android.view.View\n\nopen class NoUnderlineURLSpan(val url: String) : URLSpan(url) {\n\n    // This should not be necessary. But if you don't do this the [StatusLengthTest] tests\n    // fail. Without this, accessing the `url` property, or calling `getUrl()` (which should\n    // automatically call through to [UrlSpan.getURL]) returns null.\n    override fun getURL(): String {\n        return url\n    }\n\n    override fun updateDrawState(ds: TextPaint) {\n        super.updateDrawState(ds)\n        ds.isUnderlineText = false\n    }\n\n    override fun onClick(view: View) {\n        view.context.openLink(url)\n    }\n}\n\n/**\n * Mentions of other users (\"@user@example.org\")\n */\nopen class MentionSpan(url: String) : NoUnderlineURLSpan(url)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/NumberUtils.kt",
    "content": "@file:JvmName(\"NumberUtils\")\n\npackage com.keylesspalace.tusky.util\n\nimport java.text.NumberFormat\nimport java.util.Locale\nimport kotlin.math.abs\nimport kotlin.math.ln\nimport kotlin.math.pow\n\nprivate val ln_1k = ln(1000.0)\n\n/**\n * Format numbers according to the current locale. Numbers < min have\n * separators (',', '.', etc) inserted according to the locale.\n *\n * Numbers >= min are scaled down to that by multiples of 1,000, and\n * a suffix appropriate to the scaling is appended.\n */\nfun formatNumber(num: Long, min: Int = 100000): String {\n    val numberFormatter: NumberFormat = NumberFormat.getInstance()\n    val absNum = abs(num)\n    if (absNum < min) return numberFormatter.format(num)\n\n    val exp = (ln(absNum.toDouble()) / ln_1k).toInt()\n\n    // Suffixes here are locale-agnostic\n    return String.format(\n        Locale.getDefault(),\n        \"%.1f%c\",\n        num / 1000.0.pow(exp.toDouble()),\n        \"KMGTPE\"[exp - 1]\n    )\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/PickMediaFiles.kt",
    "content": "/* Copyright 2021 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.util\n\nimport android.app.Activity\nimport android.content.ClipData\nimport android.content.Context\nimport android.content.Intent\nimport android.net.Uri\nimport androidx.activity.result.contract.ActivityResultContract\n\nclass PickMediaFiles : ActivityResultContract<Boolean, List<Uri>>() {\n    override fun createIntent(context: Context, input: Boolean): Intent {\n        return Intent(Intent.ACTION_GET_CONTENT)\n            .addCategory(Intent.CATEGORY_OPENABLE)\n            .setType(\"*/*\")\n            .apply {\n                putExtra(Intent.EXTRA_MIME_TYPES, arrayOf(\"image/*\", \"video/*\", \"audio/*\"))\n                putExtra(Intent.EXTRA_ALLOW_MULTIPLE, input)\n            }\n    }\n\n    override fun parseResult(resultCode: Int, intent: Intent?): List<Uri> {\n        if (resultCode == Activity.RESULT_OK) {\n            val intentData = intent?.data\n            val clipData = intent?.clipData\n            if (intentData != null) {\n                // Single media, upload it and done.\n                return listOf(intentData)\n            } else if (clipData != null) {\n                return clipData.map { clipItem -> clipItem.uri }\n            }\n        }\n        return emptyList()\n    }\n}\n\nfun <T> ClipData.map(transform: (ClipData.Item) -> T): List<T> {\n    val destination = ArrayList<T>(this.itemCount)\n    for (i in 0 until this.itemCount) {\n        destination.add(transform(getItemAt(i)))\n    }\n    return destination\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/RelativeTimeUpdater.kt",
    "content": "@file:JvmName(\"RelativeTimeUpdater\")\n\npackage com.keylesspalace.tusky.util\n\nimport android.content.SharedPreferences\nimport androidx.fragment.app.Fragment\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.coroutineScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport androidx.recyclerview.widget.RecyclerView\nimport com.keylesspalace.tusky.adapter.StatusBaseViewHolder\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport kotlin.time.Duration.Companion.minutes\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\n\nprivate val UPDATE_INTERVAL = 1.minutes\n\n/**\n * Helper method to update adapter periodically to refresh timestamp\n * if setting absoluteTimeView is false.\n * Start updates when the Fragment becomes visible and stop when it is hidden.\n */\nfun Fragment.updateRelativeTimePeriodically(preferences: SharedPreferences, adapter: RecyclerView.Adapter<out RecyclerView.ViewHolder>) {\n    val lifecycle = viewLifecycleOwner.lifecycle\n    lifecycle.coroutineScope.launch {\n        // This child coroutine will launch each time the Fragment moves to the STARTED state\n        lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {\n            val useAbsoluteTime = preferences.getBoolean(PrefKeys.ABSOLUTE_TIME_VIEW, false)\n            while (!useAbsoluteTime) {\n                adapter.notifyItemRangeChanged(\n                    0,\n                    adapter.itemCount,\n                    StatusBaseViewHolder.Key.KEY_CREATED\n                )\n                delay(UPDATE_INTERVAL)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/Resource.kt",
    "content": "package com.keylesspalace.tusky.util\n\nsealed interface Resource<T> {\n    val data: T?\n}\n\nclass Loading<T>(override val data: T? = null) : Resource<T>\n\nclass Success<T>(override val data: T? = null) : Resource<T>\n\nclass Error<T>(\n    override val data: T? = null,\n    val errorMessage: String? = null,\n    var consumed: Boolean = false,\n    val cause: Throwable? = null\n) : Resource<T>\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/RickRoll.kt",
    "content": "package com.keylesspalace.tusky.util\n\nimport android.content.Context\nimport android.content.Intent\nimport androidx.core.net.toUri\nimport com.keylesspalace.tusky.R\n\nfun shouldRickRoll(context: Context, domain: String) =\n    context.resources.getStringArray(R.array.rick_roll_domains).any { candidate ->\n        domain.equals(candidate, true) || domain.endsWith(\".$candidate\", true)\n    }\n\nfun rickRoll(context: Context) {\n    val uri = context.getString(R.string.rick_roll_url).toUri()\n    val intent = Intent(Intent.ACTION_VIEW, uri).apply {\n        addCategory(Intent.CATEGORY_BROWSABLE)\n        addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)\n    }\n    context.startActivity(intent)\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/ShareShortcutHelper.kt",
    "content": "/* Copyright 2019 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\n@file:JvmName(\"ShareShortcutHelper\")\n\npackage com.keylesspalace.tusky.util\n\nimport android.content.Context\nimport android.content.Intent\nimport android.graphics.Canvas\nimport android.util.Log\nimport androidx.appcompat.content.res.AppCompatResources\nimport androidx.core.app.Person\nimport androidx.core.content.pm.ShortcutInfoCompat\nimport androidx.core.content.pm.ShortcutManagerCompat\nimport androidx.core.graphics.createBitmap\nimport androidx.core.graphics.drawable.IconCompat\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.load.engine.GlideException\nimport com.keylesspalace.tusky.MainActivity\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.di.ApplicationScope\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport javax.inject.Inject\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\n\nclass ShareShortcutHelper @Inject constructor(\n    @ApplicationContext private val context: Context,\n    private val accountManager: AccountManager,\n    @ApplicationScope private val externalScope: CoroutineScope\n) {\n\n    fun updateShortcuts() {\n        externalScope.launch(Dispatchers.IO) {\n            val innerSize = context.resources.getDimensionPixelSize(R.dimen.adaptive_bitmap_inner_size)\n            val outerSize = context.resources.getDimensionPixelSize(R.dimen.adaptive_bitmap_outer_size)\n\n            val maxNumberOfShortcuts = ShortcutManagerCompat.getMaxShortcutCountPerActivity(context)\n\n            val shortcuts = accountManager.accounts.take(maxNumberOfShortcuts).mapNotNull { account ->\n\n                val drawable = try {\n                    Glide.with(context)\n                        .asDrawable()\n                        .load(account.profilePictureUrl)\n                        .submitAsync(innerSize, innerSize)\n                } catch (e: GlideException) {\n                    // https://github.com/bumptech/glide/issues/4672 :/\n                    Log.w(TAG, \"failed to load avatar ${account.profilePictureUrl}\", e)\n                    AppCompatResources.getDrawable(context, R.drawable.avatar_default) ?: return@mapNotNull null\n                }\n\n                // inset the loaded bitmap inside a 108dp transparent canvas so it looks good as adaptive icon\n                val outBmp = createBitmap(outerSize, outerSize)\n\n                val canvas = Canvas(outBmp)\n                val borderSize = (outerSize - innerSize) / 2\n                drawable.setBounds(borderSize, borderSize, borderSize + innerSize, borderSize + innerSize)\n                drawable.draw(canvas)\n\n                val icon = IconCompat.createWithAdaptiveBitmap(outBmp)\n\n                val person = Person.Builder()\n                    .setIcon(icon)\n                    .setName(account.displayName)\n                    .setKey(account.identifier)\n                    .build()\n\n                // This intent will be sent when the user clicks on one of the launcher shortcuts. Intent from share sheet will be different\n                val intent = Intent(context, MainActivity::class.java).apply {\n                    action = Intent.ACTION_SEND\n                    type = \"text/plain\"\n                    putExtra(ShortcutManagerCompat.EXTRA_SHORTCUT_ID, account.id.toString())\n                }\n\n                ShortcutInfoCompat.Builder(context, account.id.toString())\n                    .setIntent(intent)\n                    .setCategories(setOf(\"com.keylesspalace.tusky.Share\"))\n                    .setShortLabel(account.displayName)\n                    .setPerson(person)\n                    .setIcon(icon)\n                    .build()\n            }\n\n            ShortcutManagerCompat.setDynamicShortcuts(context, shortcuts)\n        }\n    }\n\n    fun removeShortcut(account: AccountEntity) {\n        ShortcutManagerCompat.removeDynamicShortcuts(context, listOf(account.id.toString()))\n    }\n\n    companion object {\n        private const val TAG = \"ShareShortcutHelper\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/SharedPreferencesExtensions.kt",
    "content": "package com.keylesspalace.tusky.util\n\nimport android.content.SharedPreferences\n\nfun SharedPreferences.getNonNullString(key: String, defValue: String): String {\n    return this.getString(key, defValue) ?: defValue\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/SmartLengthInputFilter.kt",
    "content": "/* Copyright 2019 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.util\n\nimport android.icu.text.BreakIterator\nimport android.text.InputFilter\nimport android.text.SpannableStringBuilder\nimport android.text.Spanned\n\n/**\n * Defines how many characters to extend beyond the limit to cut at the end of the word on the\n * boundary of it rather than cutting at the word preceding that one.\n */\nprivate const val RUNWAY = 10\n\n/**\n * Default for maximum status length on Mastodon and default collapsing length on Pleroma.\n */\nprivate const val LENGTH_DEFAULT = 500\n\n/**\n * Calculates if it's worth trimming the message at a specific limit or if the content that will\n * be hidden will not be enough to justify the operation.\n *\n * @param message The message to trim.\n * @return Whether the message should be trimmed or not.\n */\nfun shouldTrimStatus(message: Spanned): Boolean {\n    return message.isNotEmpty() && LENGTH_DEFAULT.toFloat() / message.length < 0.75\n}\n\n/**\n * A customized version of {@link android.text.InputFilter.LengthFilter} which allows smarter\n * constraints and adds better visuals such as:\n * <ul>\n *     <li>Ellipsis at the end of the constrained text to show continuation.</li>\n *     <li>Trimming of invisible characters (new lines, spaces, etc.) from the constrained text.</li>\n *     <li>Constraints end at the end of the last \"word\", before a whitespace.</li>\n *     <li>Expansion of the limit by up to 10 characters to facilitate the previous constraint.</li>\n *     <li>Constraints are not applied if the percentage of hidden content is too small.</li>\n * </ul>\n */\nobject SmartLengthInputFilter : InputFilter {\n    /** {@inheritDoc} */\n    override fun filter(\n        source: CharSequence,\n        start: Int,\n        end: Int,\n        dest: Spanned,\n        dstart: Int,\n        dend: Int\n    ): CharSequence? {\n        // Code originally imported from InputFilter.LengthFilter but heavily customized and converted to Kotlin.\n        // https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/text/InputFilter.java#175\n\n        val sourceLength = source.length\n        var keep = LENGTH_DEFAULT - (dest.length - (dend - dstart))\n        if (keep <= 0) return \"\"\n        if (keep >= end - start) return null // Keep original\n\n        keep += start\n\n        // Skip trimming if the ratio doesn't warrant it\n        if (keep.toDouble() / sourceLength > 0.75) return null\n\n        // Enable trimming at the end of the closest word if possible\n        if (source[keep].isLetterOrDigit()) {\n            var boundary: Int\n\n            val iterator = BreakIterator.getWordInstance()\n            iterator.setText(source.toString())\n            boundary = iterator.following(keep)\n            if (keep - boundary > RUNWAY) boundary = iterator.preceding(keep)\n\n            keep = boundary\n        } else {\n            // If no runway is allowed simply remove whitespace if present\n            while (source[keep - 1].isWhitespace()) {\n                --keep\n                if (keep == start) return \"\"\n            }\n        }\n\n        if (source[keep - 1].isHighSurrogate()) {\n            --keep\n            if (keep == start) return \"\"\n        }\n\n        return if (source is Spanned) {\n            SpannableStringBuilder(source, start, keep).append(\"…\")\n        } else {\n            \"${source.subSequence(start, keep)}…\"\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/SpanUtils.kt",
    "content": "package com.keylesspalace.tusky.util\n\nimport android.content.Context\nimport android.text.Spannable\nimport android.text.SpannableStringBuilder\nimport android.text.Spanned\nimport android.text.style.CharacterStyle\nimport android.text.style.DynamicDrawableSpan\nimport android.text.style.ForegroundColorSpan\nimport android.text.style.ImageSpan\nimport android.text.style.URLSpan\nimport androidx.appcompat.content.res.AppCompatResources\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.util.twittertext.Regex\nimport java.util.regex.Pattern\n\n/**\n * @see <a href=\"https://github.com/tootsuite/mastodon/blob/master/app/models/tag.rb\">\n *     Tag#HASHTAG_RE</a>.\n */\nprivate const val HASHTAG_SEPARATORS = \"_\\\\u00B7\\\\u30FB\\\\u200c\"\ninternal const val TAG_PATTERN_STRING = \"(?<![=/)\\\\p{Alnum}])(#(([\\\\w_][\\\\w$HASHTAG_SEPARATORS]*[\\\\p{Alpha}$HASHTAG_SEPARATORS][\\\\w$HASHTAG_SEPARATORS]*[\\\\w_])|([\\\\w_]*[\\\\p{Alpha}][\\\\w_]*)))\"\nprivate val TAG_PATTERN = TAG_PATTERN_STRING.toPattern(Pattern.CASE_INSENSITIVE)\n\n/**\n * @see <a href=\"https://github.com/tootsuite/mastodon/blob/master/app/models/account.rb\">\n *     Account#MENTION_RE</a>\n */\nprivate const val USERNAME_PATTERN_STRING = \"[a-z0-9_]+([a-z0-9_.-]+[a-z0-9_]+)?\"\ninternal const val MENTION_PATTERN_STRING = \"(?<![=/\\\\w])(@($USERNAME_PATTERN_STRING)(?:@[\\\\w.-]+[\\\\w]+)?)\"\nprivate val MENTION_PATTERN = MENTION_PATTERN_STRING.toPattern(Pattern.CASE_INSENSITIVE)\n\nprivate val VALID_URL_PATTERN = Regex.VALID_URL_PATTERN_STRING.toPattern(Pattern.CASE_INSENSITIVE)\n\nprivate val spanClasses = listOf(ForegroundColorSpan::class.java, URLSpan::class.java)\n\n// url must come first, it may contain the other patterns\nval defaultFinders = listOf(\n    PatternFinder(\"http\", FoundMatchType.HTTP_URL, VALID_URL_PATTERN),\n    PatternFinder(\"#\", FoundMatchType.TAG, TAG_PATTERN),\n    PatternFinder(\"@\", FoundMatchType.MENTION, MENTION_PATTERN)\n)\n\nenum class FoundMatchType {\n    HTTP_URL,\n    HTTPS_URL,\n    TAG,\n    MENTION\n}\n\nclass PatternFinder(\n    val searchString: String,\n    val type: FoundMatchType,\n    val pattern: Pattern\n)\n\n/**\n * Takes text containing mentions and hashtags and urls and makes them the given colour.\n * @param finders The finders to use. This is here so they can be overridden from unit tests.\n */\nfun Spannable.highlightSpans(colour: Int, finders: List<PatternFinder> = defaultFinders) {\n    // Strip all existing colour spans.\n    for (spanClass in spanClasses) {\n        clearSpans(spanClass)\n    }\n\n    for (finder in finders) {\n        // before running the regular expression, check if there is even a chance of it finding something\n        if (this.contains(finder.searchString, ignoreCase = true)) {\n            val matcher = finder.pattern.matcher(this)\n\n            while (matcher.find()) {\n                // we found a match\n                val start = matcher.start(1)\n\n                val end = matcher.end(1)\n\n                // only add a span if there is no other one yet (e.g. the #anchor part of an url might match as hashtag, but must be ignored)\n                if (this.getSpans(start, end, URLSpan::class.java).isEmpty()) {\n                    this.setSpan(\n                        getSpan(finder.type, this, colour, start, end),\n                        start,\n                        end,\n                        Spanned.SPAN_INCLUSIVE_EXCLUSIVE\n                    )\n                }\n            }\n        }\n    }\n}\n\nprivate fun <T> Spannable.clearSpans(spanClass: Class<T>) {\n    for (span in getSpans(0, length, spanClass)) {\n        removeSpan(span)\n    }\n}\n\nprivate val iconNameMapping: Map<String, Int> = mapOf(\n    \"{{home}}\" to R.drawable.ic_home_24dp,\n    \"{{mail}}\" to R.drawable.ic_mail_24dp,\n    \"{{group}}\" to R.drawable.ic_group_24dp,\n    \"{{search}}\" to R.drawable.ic_search_24dp,\n    \"{{manage_accounts}}\" to R.drawable.ic_manage_accounts_24dp,\n    \"{{chevron_right}}\" to R.drawable.ic_chevron_right_24dp,\n    \"{{public}}\" to R.drawable.ic_public_24dp,\n    \"{{edit}}\" to R.drawable.ic_edit_24dp_filled\n)\n\n/**\n * Replaces text of the form {{icon_name}} with their spanned counterparts (ImageSpan). Supported icon names are above.\n */\nfun addDrawables(text: CharSequence, color: Int, size: Int, context: Context): Spannable {\n    val builder = SpannableStringBuilder(text)\n\n    iconNameMapping.forEach { iconName, icon ->\n        var index = 0\n        while (index < text.length - iconName.length && index != -1) {\n            index = text.indexOf(iconName, index)\n\n            if (index != -1) {\n                val drawable = AppCompatResources.getDrawable(context, icon)!!\n                drawable.setBounds(0, 0, size, size)\n                drawable.setTint(color)\n                builder.setSpan(ImageSpan(drawable, DynamicDrawableSpan.ALIGN_CENTER), index, index + iconName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n                index += iconName.length\n            }\n        }\n    }\n\n    return builder\n}\n\nprivate fun getSpan(\n    matchType: FoundMatchType,\n    string: CharSequence,\n    colour: Int,\n    start: Int,\n    end: Int\n): CharacterStyle {\n    return when (matchType) {\n        FoundMatchType.HTTP_URL, FoundMatchType.HTTPS_URL -> NoUnderlineURLSpan(string.substring(start, end))\n        FoundMatchType.MENTION -> MentionSpan(string.substring(start, end))\n        else -> ForegroundColorSpan(colour)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/StatusDisplayOptions.kt",
    "content": "/*\n * Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.util\n\nimport android.content.SharedPreferences\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.settings.PrefKeys\n\ndata class StatusDisplayOptions(\n    @get:JvmName(\"animateAvatars\")\n    val animateAvatars: Boolean,\n    @get:JvmName(\"mediaPreviewEnabled\")\n    val mediaPreviewEnabled: Boolean,\n    @get:JvmName(\"useAbsoluteTime\")\n    val useAbsoluteTime: Boolean,\n    @get:JvmName(\"showBotOverlay\")\n    val showBotOverlay: Boolean,\n    @get:JvmName(\"useBlurhash\")\n    val useBlurhash: Boolean,\n    @get:JvmName(\"cardViewMode\")\n    val cardViewMode: CardViewMode,\n    @get:JvmName(\"hideStats\")\n    val hideStats: Boolean,\n    @get:JvmName(\"animateEmojis\")\n    val animateEmojis: Boolean,\n    @get:JvmName(\"showStatsInline\")\n    val showStatsInline: Boolean,\n    @get:JvmName(\"showSensitiveMedia\")\n    val showSensitiveMedia: Boolean,\n    @get:JvmName(\"openSpoiler\")\n    val openSpoiler: Boolean\n) {\n\n    /**\n     * @return a new StatusDisplayOptions adapted to whichever preference changed.\n     */\n    fun make(preferences: SharedPreferences, key: String, account: AccountEntity) = when (key) {\n        PrefKeys.ANIMATE_GIF_AVATARS -> copy(\n            animateAvatars = preferences.getBoolean(key, false)\n        )\n        PrefKeys.MEDIA_PREVIEW_ENABLED -> copy(\n            mediaPreviewEnabled = account.mediaPreviewEnabled\n        )\n        PrefKeys.ABSOLUTE_TIME_VIEW -> copy(\n            useAbsoluteTime = preferences.getBoolean(key, false)\n        )\n        PrefKeys.SHOW_BOT_OVERLAY -> copy(\n            showBotOverlay = preferences.getBoolean(key, true)\n        )\n        PrefKeys.USE_BLURHASH -> copy(\n            useBlurhash = preferences.getBoolean(key, true)\n        )\n        PrefKeys.WELLBEING_HIDE_STATS_POSTS -> copy(\n            hideStats = preferences.getBoolean(key, false)\n        )\n        PrefKeys.ANIMATE_CUSTOM_EMOJIS -> copy(\n            animateEmojis = preferences.getBoolean(key, false)\n        )\n        PrefKeys.ALWAYS_SHOW_SENSITIVE_MEDIA -> copy(\n            showSensitiveMedia = account.alwaysShowSensitiveMedia\n        )\n        PrefKeys.ALWAYS_OPEN_SPOILER -> copy(\n            openSpoiler = account.alwaysOpenSpoiler\n        )\n        else -> {\n            this\n        }\n    }\n\n    companion object {\n        fun from(preferences: SharedPreferences, account: AccountEntity) = StatusDisplayOptions(\n            animateAvatars = preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false),\n            animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false),\n            mediaPreviewEnabled = account.mediaPreviewEnabled,\n            useAbsoluteTime = preferences.getBoolean(PrefKeys.ABSOLUTE_TIME_VIEW, false),\n            showBotOverlay = preferences.getBoolean(PrefKeys.SHOW_BOT_OVERLAY, true),\n            useBlurhash = preferences.getBoolean(PrefKeys.USE_BLURHASH, true),\n            cardViewMode = CardViewMode.NONE,\n            hideStats = preferences.getBoolean(PrefKeys.WELLBEING_HIDE_STATS_POSTS, false),\n            showStatsInline = preferences.getBoolean(PrefKeys.SHOW_STATS_INLINE, false),\n            showSensitiveMedia = account.alwaysShowSensitiveMedia,\n            openSpoiler = account.alwaysOpenSpoiler\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/StatusParsingHelper.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\n@file:JvmName(\"StatusParsingHelper\")\n\npackage com.keylesspalace.tusky.util\n\nimport android.text.Editable\nimport android.text.Html.TagHandler\nimport android.text.Spannable\nimport android.text.SpannableStringBuilder\nimport android.text.Spanned\nimport android.text.style.TypefaceSpan\nimport androidx.core.text.parseAsHtml\nimport org.xml.sax.XMLReader\n\n/**\n * parse a String containing html from the Mastodon api to Spanned\n */\n@JvmOverloads\nfun String.parseAsMastodonHtml(tagHandler: TagHandler? = tuskyTagHandler): Spanned {\n    return this.replace(\"<br> \", \"<br>&nbsp;\")\n        .replace(\"<br /> \", \"<br />&nbsp;\")\n        .replace(\"<br/> \", \"<br/>&nbsp;\")\n        .replace(\"<br>\\n\", \"<br/>\") // pixelfed quirk https://github.com/tuskyapp/Tusky/issues/4663\n        .replace(\"\\n\", \"<br/>\")\n        .replace(\"  \", \"&nbsp;&nbsp;\")\n        .parseAsHtml(tagHandler = tagHandler)\n        /* Html.fromHtml returns trailing whitespace if the html ends in a </p> tag, which\n         * most status contents do, so it should be trimmed. */\n        .trimTrailingWhitespace()\n}\n\nval tuskyTagHandler = TuskyTagHandler()\n\nopen class TuskyTagHandler : TagHandler {\n\n    class Code\n\n    override fun handleTag(opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader) {\n        when (tag) {\n            \"code\" -> {\n                if (opening) {\n                    start(output as SpannableStringBuilder, Code())\n                } else {\n                    end(\n                        output as SpannableStringBuilder,\n                        Code::class.java,\n                        TypefaceSpan(\"monospace\")\n                    )\n                }\n            }\n        }\n    }\n\n    /** @return the last span in [text] of type [kind], or null if that kind is not in text */\n    protected fun <T> getLast(text: Spanned, kind: Class<T>): Any? {\n        val spans = text.getSpans(0, text.length, kind)\n        return spans?.get(spans.size - 1)\n    }\n\n    /**\n     * Mark the start of a span of [text] with [mark] so it can be discovered later by [end].\n     */\n    protected fun start(text: SpannableStringBuilder, mark: Any) {\n        val len = text.length\n        text.setSpan(mark, len, len, Spannable.SPAN_MARK_MARK)\n    }\n\n    /**\n     * Set a [span] over the [text] from the point recently marked with [mark] to the end\n     * of the text.\n     */\n    protected fun <T> end(text: SpannableStringBuilder, mark: Class<T>, span: Any) {\n        val len = text.length\n        val obj = getLast(text, mark)\n        val where = text.getSpanStart(obj)\n        text.removeSpan(obj)\n        if (where != len) {\n            text.setSpan(span, where, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt",
    "content": "/* Copyright 2019 Joel Pyska\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.util\n\nimport android.content.Context\nimport android.graphics.Color\nimport android.text.InputFilter\nimport android.text.TextUtils\nimport android.view.View\nimport android.widget.ImageView\nimport android.widget.TextView\nimport androidx.annotation.DrawableRes\nimport androidx.core.graphics.drawable.toDrawable\nimport com.bumptech.glide.Glide\nimport com.google.android.material.color.MaterialColors\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.view.MediaPreviewImageView\nimport com.keylesspalace.tusky.viewdata.PollViewData\nimport com.keylesspalace.tusky.viewdata.buildDescription\nimport com.keylesspalace.tusky.viewdata.calculatePercent\nimport java.text.NumberFormat\nimport kotlin.math.min\n\nclass StatusViewHelper(private val itemView: View) {\n    private val absoluteTimeFormatter = AbsoluteTimeFormatter()\n\n    interface MediaPreviewListener {\n        fun onViewMedia(v: View?, idx: Int)\n        fun onContentHiddenChange(isShowing: Boolean)\n    }\n\n    fun setMediasPreview(\n        statusDisplayOptions: StatusDisplayOptions,\n        attachments: List<Attachment>,\n        sensitive: Boolean,\n        previewListener: MediaPreviewListener,\n        showingContent: Boolean,\n        mediaPreviewHeight: Int\n    ) {\n        val context = itemView.context\n        val mediaPreviews = arrayOf<MediaPreviewImageView>(\n            itemView.findViewById(R.id.status_media_preview_0),\n            itemView.findViewById(R.id.status_media_preview_1),\n            itemView.findViewById(R.id.status_media_preview_2),\n            itemView.findViewById(R.id.status_media_preview_3)\n        )\n\n        val mediaOverlays = arrayOf<ImageView>(\n            itemView.findViewById(R.id.status_media_overlay_0),\n            itemView.findViewById(R.id.status_media_overlay_1),\n            itemView.findViewById(R.id.status_media_overlay_2),\n            itemView.findViewById(R.id.status_media_overlay_3)\n        )\n\n        val sensitiveMediaWarning = itemView.findViewById<TextView>(\n            R.id.status_sensitive_media_warning\n        )\n        val sensitiveMediaShow = itemView.findViewById<View>(R.id.status_sensitive_media_button)\n        val mediaLabel = itemView.findViewById<TextView>(R.id.status_media_label)\n        if (statusDisplayOptions.mediaPreviewEnabled) {\n            // Hide the unused label.\n            mediaLabel.visibility = View.GONE\n        } else {\n            setMediaLabel(mediaLabel, attachments, sensitive, previewListener)\n            // Hide all unused views.\n            mediaPreviews[0].visibility = View.GONE\n            mediaPreviews[1].visibility = View.GONE\n            mediaPreviews[2].visibility = View.GONE\n            mediaPreviews[3].visibility = View.GONE\n            sensitiveMediaWarning.visibility = View.GONE\n            sensitiveMediaShow.visibility = View.GONE\n            return\n        }\n\n        val mediaPreviewUnloaded =\n            MaterialColors.getColor(context, R.attr.colorBackgroundAccent, Color.BLACK)\n                .toDrawable()\n\n        val n = min(attachments.size, Status.MAX_MEDIA_ATTACHMENTS)\n\n        for (i in 0 until n) {\n            val attachment = attachments[i]\n            val previewUrl = attachment.previewUrl\n            val description = attachment.description\n\n            if (TextUtils.isEmpty(description)) {\n                mediaPreviews[i].contentDescription = context.getString(R.string.action_view_media)\n            } else {\n                mediaPreviews[i].contentDescription = description\n            }\n\n            mediaPreviews[i].visibility = View.VISIBLE\n\n            if (TextUtils.isEmpty(previewUrl)) {\n                Glide.with(mediaPreviews[i])\n                    .load(mediaPreviewUnloaded)\n                    .centerInside()\n                    .into(mediaPreviews[i])\n            } else {\n                val placeholder = if (attachment.blurhash != null) {\n                    BlurhashDrawable(context, attachment.blurhash)\n                } else {\n                    mediaPreviewUnloaded\n                }\n                val meta = attachment.meta\n                val focus = meta?.focus\n                if (showingContent) {\n                    if (focus != null) { // If there is a focal point for this attachment:\n                        mediaPreviews[i].setFocalPoint(focus)\n\n                        Glide.with(mediaPreviews[i])\n                            .load(previewUrl)\n                            .placeholder(placeholder)\n                            .centerInside()\n                            .addListener(mediaPreviews[i])\n                            .into(mediaPreviews[i])\n                    } else {\n                        mediaPreviews[i].removeFocalPoint()\n\n                        Glide.with(mediaPreviews[i])\n                            .load(previewUrl)\n                            .placeholder(placeholder)\n                            .centerInside()\n                            .into(mediaPreviews[i])\n                    }\n                } else {\n                    mediaPreviews[i].removeFocalPoint()\n                    if (statusDisplayOptions.useBlurhash && attachment.blurhash != null) {\n                        val blurhashDrawable = BlurhashDrawable(context, attachment.blurhash)\n                        mediaPreviews[i].setImageDrawable(blurhashDrawable)\n                    } else {\n                        mediaPreviews[i].setImageDrawable(mediaPreviewUnloaded)\n                    }\n                }\n            }\n\n            val type = attachment.type\n            if (showingContent &&\n                (type === Attachment.Type.VIDEO) or (type === Attachment.Type.GIFV)\n            ) {\n                mediaOverlays[i].visibility = View.VISIBLE\n            } else {\n                mediaOverlays[i].visibility = View.GONE\n            }\n\n            mediaPreviews[i].setOnClickListener { v ->\n                previewListener.onViewMedia(v, i)\n            }\n\n            if (n <= 2) {\n                mediaPreviews[0].layoutParams.height = mediaPreviewHeight * 2\n                mediaPreviews[1].layoutParams.height = mediaPreviewHeight * 2\n            } else {\n                mediaPreviews[0].layoutParams.height = mediaPreviewHeight\n                mediaPreviews[1].layoutParams.height = mediaPreviewHeight\n                mediaPreviews[2].layoutParams.height = mediaPreviewHeight\n                mediaPreviews[3].layoutParams.height = mediaPreviewHeight\n            }\n        }\n        if (attachments.isEmpty()) {\n            sensitiveMediaWarning.visibility = View.GONE\n            sensitiveMediaShow.visibility = View.GONE\n        } else {\n            sensitiveMediaWarning.text = if (sensitive) {\n                context.getString(R.string.post_sensitive_media_title)\n            } else {\n                context.getString(R.string.post_media_hidden_title)\n            }\n\n            sensitiveMediaWarning.visibility = if (showingContent) View.GONE else View.VISIBLE\n            sensitiveMediaShow.visibility = if (showingContent) View.VISIBLE else View.GONE\n            sensitiveMediaShow.setOnClickListener { v ->\n                previewListener.onContentHiddenChange(false)\n                v.visibility = View.GONE\n                sensitiveMediaWarning.visibility = View.VISIBLE\n                setMediasPreview(\n                    statusDisplayOptions,\n                    attachments,\n                    sensitive,\n                    previewListener,\n                    false,\n                    mediaPreviewHeight\n                )\n            }\n            sensitiveMediaWarning.setOnClickListener { v ->\n                previewListener.onContentHiddenChange(true)\n                v.visibility = View.GONE\n                sensitiveMediaShow.visibility = View.VISIBLE\n                setMediasPreview(\n                    statusDisplayOptions,\n                    attachments,\n                    sensitive,\n                    previewListener,\n                    true,\n                    mediaPreviewHeight\n                )\n            }\n        }\n\n        // Hide any of the placeholder previews beyond the ones set.\n        for (i in n until Status.MAX_MEDIA_ATTACHMENTS) {\n            mediaPreviews[i].visibility = View.GONE\n        }\n    }\n\n    private fun setMediaLabel(\n        mediaLabel: TextView,\n        attachments: List<Attachment>,\n        sensitive: Boolean,\n        listener: MediaPreviewListener\n    ) {\n        if (attachments.isEmpty()) {\n            mediaLabel.visibility = View.GONE\n            return\n        }\n        mediaLabel.visibility = View.VISIBLE\n\n        // Set the label's text.\n        val context = mediaLabel.context\n        var labelText = getLabelTypeText(context, attachments[0].type)\n        if (sensitive) {\n            val sensitiveText = context.getString(R.string.post_sensitive_media_title)\n            labelText += \" ($sensitiveText)\"\n        }\n        mediaLabel.text = labelText\n\n        // Set the icon next to the label.\n        val drawableId = getLabelIcon(attachments[0].type)\n        mediaLabel.setCompoundDrawablesRelativeWithIntrinsicBounds(drawableId, 0, 0, 0)\n\n        mediaLabel.setOnClickListener { listener.onViewMedia(null, 0) }\n    }\n\n    private fun getLabelTypeText(context: Context, type: Attachment.Type): String {\n        return when (type) {\n            Attachment.Type.IMAGE -> context.getString(R.string.post_media_images)\n            Attachment.Type.GIFV, Attachment.Type.VIDEO -> context.getString(\n                R.string.post_media_video\n            )\n            Attachment.Type.AUDIO -> context.getString(R.string.post_media_audio)\n            else -> context.getString(R.string.post_media_attachments)\n        }\n    }\n\n    @DrawableRes\n    private fun getLabelIcon(type: Attachment.Type): Int {\n        return when (type) {\n            Attachment.Type.IMAGE -> R.drawable.ic_image_24dp\n            Attachment.Type.GIFV -> R.drawable.ic_gif_box_24dp\n            Attachment.Type.VIDEO -> R.drawable.ic_slideshow_24dp\n            Attachment.Type.AUDIO -> R.drawable.ic_music_box_24dp\n            else -> R.drawable.ic_attach_file_24dp\n        }\n    }\n\n    fun setupPollReadonly(\n        poll: PollViewData?,\n        emojis: List<Emoji>,\n        statusDisplayOptions: StatusDisplayOptions\n    ) {\n        val pollResults = listOf<TextView>(\n            itemView.findViewById(R.id.status_poll_option_result_0),\n            itemView.findViewById(R.id.status_poll_option_result_1),\n            itemView.findViewById(R.id.status_poll_option_result_2),\n            itemView.findViewById(R.id.status_poll_option_result_3)\n        )\n\n        val pollDescription = itemView.findViewById<TextView>(R.id.status_poll_description)\n\n        if (poll == null) {\n            for (pollResult in pollResults) {\n                pollResult.visibility = View.GONE\n            }\n            pollDescription.visibility = View.GONE\n        } else {\n            val timestamp = System.currentTimeMillis()\n\n            setupPollResult(poll, emojis, pollResults, statusDisplayOptions.animateEmojis)\n\n            pollDescription.visibility = View.VISIBLE\n            pollDescription.text = getPollInfoText(timestamp, poll, pollDescription, statusDisplayOptions.useAbsoluteTime)\n        }\n    }\n\n    private fun getPollInfoText(\n        timestamp: Long,\n        poll: PollViewData,\n        pollDescription: TextView,\n        useAbsoluteTime: Boolean\n    ): CharSequence {\n        val context = pollDescription.context\n\n        val votesText = if (poll.votersCount == null) {\n            val votes = NumberFormat.getNumberInstance().format(poll.votesCount.toLong())\n            context.resources.getQuantityString(R.plurals.poll_info_votes, poll.votesCount, votes)\n        } else {\n            val votes = NumberFormat.getNumberInstance().format(poll.votersCount.toLong())\n            context.resources.getQuantityString(R.plurals.poll_info_people, poll.votersCount, votes)\n        }\n        val pollDurationInfo = if (poll.expired) {\n            context.getString(R.string.poll_info_closed)\n        } else {\n            if (useAbsoluteTime) {\n                context.getString(\n                    R.string.poll_info_time_absolute,\n                    absoluteTimeFormatter.format(poll.expiresAt, false)\n                )\n            } else {\n                formatPollDuration(context, poll.expiresAt!!.time, timestamp)\n            }\n        }\n\n        return context.getString(R.string.poll_info_format, votesText, pollDurationInfo)\n    }\n\n    private fun setupPollResult(\n        poll: PollViewData,\n        emojis: List<Emoji>,\n        pollResults: List<TextView>,\n        animateEmojis: Boolean\n    ) {\n        val options = poll.options\n\n        for (i in 0 until Status.MAX_POLL_OPTIONS) {\n            if (i < options.size) {\n                val percent =\n                    calculatePercent(options[i].votesCount, poll.votersCount, poll.votesCount)\n\n                val pollOptionText =\n                    buildDescription(\n                        options[i].title,\n                        percent,\n                        options[i].voted,\n                        pollResults[i].context,\n                        pollResults[i]\n                    )\n                pollResults[i].text = pollOptionText.emojify(emojis, pollResults[i], animateEmojis)\n                pollResults[i].visibility = View.VISIBLE\n\n                val level = percent * 100\n                val optionColor = if (options[i].voted) {\n                    R.color.colorBackgroundHighlight\n                } else {\n                    R.color.colorBackgroundAccent\n                }\n\n                pollResults[i].background.level = level\n                pollResults[i].background.setTint(pollResults[i].context.getColor(optionColor))\n            } else {\n                pollResults[i].visibility = View.GONE\n            }\n        }\n    }\n\n    companion object {\n        val COLLAPSE_INPUT_FILTER = arrayOf<InputFilter>(SmartLengthInputFilter)\n        val NO_INPUT_FILTER = arrayOfNulls<InputFilter>(0)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/StringUtils.kt",
    "content": "@file:JvmName(\"StringUtils\")\n\npackage com.keylesspalace.tusky.util\n\nimport android.text.Spanned\nimport java.util.regex.Pattern\nimport kotlin.random.Random\n\nprivate const val POSSIBLE_CHARS = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\nconst val HASHTAG_EXPRESSION = \"([\\\\w_]*[\\\\p{Alpha}_][\\\\w_]*)\"\nval hashtagPattern: Pattern = Pattern.compile(HASHTAG_EXPRESSION, Pattern.CASE_INSENSITIVE or Pattern.MULTILINE)\n\nfun randomAlphanumericString(count: Int): String {\n    val chars = CharArray(count)\n    for (i in 0 until count) {\n        chars[i] = POSSIBLE_CHARS[Random.nextInt(POSSIBLE_CHARS.length)]\n    }\n    return String(chars)\n}\n\n/**\n * A < B (strictly) by length and then by content.\n * Examples:\n * \"abc\" < \"bcd\"\n * \"ab\"  < \"abc\"\n * \"cb\"  < \"abc\"\n * not: \"ab\" < \"ab\"\n * not: \"abc\" > \"cb\"\n */\nfun String.isLessThan(other: String): Boolean {\n    return when {\n        this.length < other.length -> true\n        this.length > other.length -> false\n        else -> this < other\n    }\n}\n\n/**\n * A <= B (strictly) by length and then by content.\n * Examples:\n * \"abc\" <= \"bcd\"\n * \"ab\"  <= \"abc\"\n * \"cb\"  <= \"abc\"\n * \"ab\"  <= \"ab\"\n * not: \"abc\" > \"cb\"\n */\nfun String.isLessThanOrEqual(other: String): Boolean {\n    return this == other || isLessThan(other)\n}\n\nfun Spanned.trimTrailingWhitespace(): Spanned {\n    var i = length\n    do {\n        i--\n    } while (i >= 0 && get(i).isWhitespace())\n    return subSequence(0, i + 1) as Spanned\n}\n\n/**\n * BidiFormatter.unicodeWrap is insufficient in some cases (see #1921)\n * So we force isolation manually\n * https://unicode.org/reports/tr9/#Explicit_Directional_Isolates\n */\nfun CharSequence.unicodeWrap(): String {\n    return \"\\u2068${this}\\u2069\"\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/ThemeUtils.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n@file:JvmName(\"ThemeUtils\")\n\npackage com.keylesspalace.tusky.util\n\nimport android.content.Context\nimport android.content.res.Configuration\nimport android.graphics.Color\nimport android.graphics.drawable.Drawable\nimport androidx.annotation.AttrRes\nimport androidx.appcompat.app.AppCompatDelegate\nimport com.google.android.material.color.MaterialColors\nimport com.keylesspalace.tusky.settings.AppTheme\n\n/**\n * Provides runtime compatibility to obtain theme information and re-theme views, especially where\n * the ability to do so is not supported in resource files.\n */\n\nfun setDrawableTint(context: Context, drawable: Drawable, @AttrRes attribute: Int) {\n    drawable.setTint(MaterialColors.getColor(context, attribute, Color.BLACK))\n}\n\nfun setAppNightMode(flavor: String?) {\n    when (flavor) {\n        AppTheme.NIGHT.value, AppTheme.BLACK.value -> AppCompatDelegate.setDefaultNightMode(\n            AppCompatDelegate.MODE_NIGHT_YES\n        )\n        AppTheme.DAY.value -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)\n        AppTheme.AUTO.value -> AppCompatDelegate.setDefaultNightMode(\n            AppCompatDelegate.MODE_NIGHT_AUTO_TIME\n        )\n        AppTheme.AUTO_SYSTEM.value, AppTheme.AUTO_SYSTEM_BLACK.value -> AppCompatDelegate.setDefaultNightMode(\n            AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM\n        )\n        else -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)\n    }\n}\n\nfun isBlack(config: Configuration, theme: String?): Boolean {\n    return when (theme) {\n        AppTheme.BLACK.value -> true\n        AppTheme.AUTO_SYSTEM_BLACK.value -> when (config.uiMode and Configuration.UI_MODE_NIGHT_MASK) {\n            Configuration.UI_MODE_NIGHT_NO -> false\n            Configuration.UI_MODE_NIGHT_YES -> true\n            else -> false\n        }\n        else -> false\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/ThrowableExtensions.kt",
    "content": "package com.keylesspalace.tusky.util\n\nimport android.content.Context\nimport com.keylesspalace.tusky.R\nimport java.io.IOException\nimport org.json.JSONException\nimport org.json.JSONObject\nimport retrofit2.HttpException\n\n/**\n * checks if this throwable indicates an error causes by a 4xx/5xx server response and\n * tries to retrieve the error message the server sent\n * @return the error message, or null if this is no server error or it had no error message\n */\nfun Throwable.getServerErrorMessage(): String? {\n    if (this is HttpException) {\n        val errorResponse = response()?.errorBody()?.string()\n        return if (!errorResponse.isNullOrBlank()) {\n            try {\n                JSONObject(errorResponse).getString(\"error\")\n            } catch (e: JSONException) {\n                null\n            }\n        } else {\n            null\n        }\n    }\n    return null\n}\n\n/** @return A drawable resource to accompany the error message for this throwable */\nfun Throwable.getDrawableRes(): Int = when (this) {\n    is IOException -> R.drawable.errorphant_offline\n    is HttpException -> R.drawable.errorphant_offline\n    else -> R.drawable.errorphant_error\n}\n\n/** @return A string error message for this throwable */\nfun Throwable.getErrorString(context: Context): String = getServerErrorMessage() ?: when (this) {\n    is IOException -> context.getString(R.string.error_network)\n    else -> context.getString(R.string.error_generic)\n}\n\nfun Throwable.isHttpNotFound(): Boolean = (this as? HttpException)?.code() == 404\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/TimestampUtils.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n@file:JvmName(\"TimestampUtils\")\n\npackage com.keylesspalace.tusky.util\n\nimport android.content.Context\nimport com.keylesspalace.tusky.R\nimport kotlin.math.abs\n\nprivate const val SECOND_IN_MILLIS: Long = 1000\nprivate const val MINUTE_IN_MILLIS = SECOND_IN_MILLIS * 60\nprivate const val HOUR_IN_MILLIS = MINUTE_IN_MILLIS * 60\nprivate const val DAY_IN_MILLIS = HOUR_IN_MILLIS * 24\nprivate const val YEAR_IN_MILLIS = DAY_IN_MILLIS * 365\n\n/**\n * This is a rough duplicate of [android.text.format.DateUtils.getRelativeTimeSpanString],\n * but even with the FORMAT_ABBREV_RELATIVE flag it wasn't abbreviating enough.\n */\nfun getRelativeTimeSpanString(context: Context, then: Long, now: Long): String {\n    var span = now - then\n    var future = false\n    if (abs(span) < SECOND_IN_MILLIS) {\n        return context.getString(R.string.status_created_at_now)\n    } else if (span < 0) {\n        future = true\n        span = -span\n    }\n    val format: Int\n    if (span < MINUTE_IN_MILLIS) {\n        span /= SECOND_IN_MILLIS\n        format = if (future) {\n            R.string.abbreviated_in_seconds\n        } else {\n            R.string.abbreviated_seconds_ago\n        }\n    } else if (span < HOUR_IN_MILLIS) {\n        span /= MINUTE_IN_MILLIS\n        format = if (future) {\n            R.string.abbreviated_in_minutes\n        } else {\n            R.string.abbreviated_minutes_ago\n        }\n    } else if (span < DAY_IN_MILLIS) {\n        span /= HOUR_IN_MILLIS\n        format = if (future) {\n            R.string.abbreviated_in_hours\n        } else {\n            R.string.abbreviated_hours_ago\n        }\n    } else if (span < YEAR_IN_MILLIS) {\n        span /= DAY_IN_MILLIS\n        format = if (future) {\n            R.string.abbreviated_in_days\n        } else {\n            R.string.abbreviated_days_ago\n        }\n    } else {\n        span /= YEAR_IN_MILLIS\n        format = if (future) {\n            R.string.abbreviated_in_years\n        } else {\n            R.string.abbreviated_years_ago\n        }\n    }\n    return context.getString(format, span)\n}\n\nfun formatPollDuration(context: Context, then: Long, now: Long): String {\n    var span = then - now\n    if (span < 0) {\n        span = 0\n    }\n    val format: Int\n    if (span < MINUTE_IN_MILLIS) {\n        span /= SECOND_IN_MILLIS\n        format = R.plurals.poll_timespan_seconds\n    } else if (span < HOUR_IN_MILLIS) {\n        span /= MINUTE_IN_MILLIS\n        format = R.plurals.poll_timespan_minutes\n    } else if (span < DAY_IN_MILLIS) {\n        span /= HOUR_IN_MILLIS\n        format = R.plurals.poll_timespan_hours\n    } else {\n        span /= DAY_IN_MILLIS\n        format = R.plurals.poll_timespan_days\n    }\n    return context.resources.getQuantityString(format, span.toInt(), span.toInt())\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/TouchDelegateHelper.kt",
    "content": "/* Copyright 2022 Tusky contributors\n\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\n@file:JvmName(\"TouchDelegateHelper\")\n\npackage com.keylesspalace.tusky.util\n\nimport android.graphics.Rect\nimport android.view.MotionEvent\nimport android.view.TouchDelegate\nimport android.view.View\nimport android.view.ViewGroup\n\n/**\n * Expands the touch area of the give row of views to fill the space in-between them, using a\n * [TouchDelegate].\n */\nfun ViewGroup.expandTouchSizeToFillRow(children: List<View>) {\n    addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->\n        touchDelegate = CompositeTouchDelegate(\n            this,\n            children.mapIndexed { i, view ->\n                val rect = Rect()\n                view.getHitRect(rect)\n                val left = children.getOrNull(i - 1)\n                if (left != null) {\n                    // extend half-way to previous view\n                    rect.left -= (view.left - left.right) / 2\n                }\n                val right = children.getOrNull(i + 1)\n                if (right != null) {\n                    // extend half-way to next view\n                    rect.right += (right.left - view.right) / 2\n                }\n                TouchDelegate(rect, view)\n            }\n        )\n    }\n}\n\nprivate class CompositeTouchDelegate(view: View, private val delegates: List<TouchDelegate>) :\n    TouchDelegate(Rect(), view) {\n\n    override fun onTouchEvent(event: MotionEvent): Boolean {\n        val x = event.x\n        val y = event.y\n        return delegates.fold(false) { res, delegate ->\n            event.setLocation(x, y)\n            delegate.onTouchEvent(event) || res\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/ViewBindingExtensions.kt",
    "content": "package com.keylesspalace.tusky.util\n\nimport android.view.LayoutInflater\nimport android.view.View\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.fragment.app.Fragment\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleEventObserver\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.viewbinding.ViewBinding\n\n/**\n * Original code: https://medium.com/@Zhuinden/simple-one-liner-viewbinding-in-fragments-and-activities-with-kotlin-961430c6c07c\n * Refactor: https://bladecoder.medium.com/viewlifecyclelazy-and-other-ways-to-avoid-view-memory-leaks-in-android-fragments-4aa982e6e579\n */\n\ninline fun <T : ViewBinding> AppCompatActivity.viewBinding(\n    crossinline bindingInflater: (LayoutInflater) -> T\n) = lazy(LazyThreadSafetyMode.NONE) {\n    bindingInflater(layoutInflater)\n}\n\nprivate class ViewLifecycleLazy<T : Any>(\n    private val fragment: Fragment,\n    private val initializer: (View) -> T\n) : Lazy<T>, LifecycleEventObserver {\n    private var cached: T? = null\n\n    override val value: T\n        get() {\n            return cached ?: run {\n                val newValue = initializer(fragment.requireView())\n                cached = newValue\n                fragment.viewLifecycleOwner.lifecycle.addObserver(this)\n                newValue\n            }\n        }\n\n    override fun isInitialized() = cached != null\n\n    override fun toString() = cached.toString()\n\n    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {\n        if (event == Lifecycle.Event.ON_DESTROY) {\n            cached = null\n        }\n    }\n}\n\nfun <T : ViewBinding> Fragment.viewBinding(viewBindingFactory: (View) -> T): Lazy<T> =\n    ViewLifecycleLazy(this, viewBindingFactory)\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/ViewDataUtils.kt",
    "content": "/*\n * Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\n@file:JvmName(\"ViewDataUtils\")\n\n/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.util\n\nimport androidx.paging.CombinedLoadStates\nimport androidx.paging.LoadState\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.entity.TrendingTag\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport com.keylesspalace.tusky.viewdata.TranslationViewData\nimport com.keylesspalace.tusky.viewdata.TrendingViewData\n\nfun Status.toViewData(\n    isShowingContent: Boolean,\n    isExpanded: Boolean,\n    isCollapsed: Boolean,\n    isDetailed: Boolean = false,\n    filter: Filter?,\n    translation: TranslationViewData? = null,\n) = StatusViewData.Concrete(\n    status = this,\n    isShowingContent = isShowingContent,\n    isCollapsed = isCollapsed,\n    isExpanded = isExpanded,\n    isDetailed = isDetailed,\n    translation = translation,\n).apply { this.filter = filter }\n\nfun List<TrendingTag>.toViewData(): List<TrendingViewData.Tag> {\n    val maxTrendingValue = flatMap { tag -> tag.history }\n        .mapNotNull { it.uses.toLongOrNull() }\n        .maxOrNull() ?: 1\n\n    return map { tag ->\n\n        val reversedHistory = tag.history.asReversed()\n\n        TrendingViewData.Tag(\n            name = tag.name,\n            usage = reversedHistory.mapNotNull { it.uses.toLongOrNull() },\n            accounts = reversedHistory.mapNotNull { it.accounts.toLongOrNull() },\n            maxTrendingValue = maxTrendingValue\n        )\n    }\n}\n\nfun CombinedLoadStates.isAnyLoading(): Boolean {\n    return this.refresh == LoadState.Loading || this.append == LoadState.Loading || this.prepend == LoadState.Loading\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/ViewExtensions.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.util\n\nimport android.os.Build\nimport android.util.Log\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.core.graphics.Insets\nimport androidx.core.view.OnApplyWindowInsetsListener\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsAnimationCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.WindowInsetsCompat.Type.systemBars\nimport androidx.core.view.updateLayoutParams\nimport androidx.core.view.updatePadding\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.viewpager2.widget.ViewPager2\nimport com.google.android.material.floatingactionbutton.FloatingActionButton\nimport com.keylesspalace.tusky.R\n\nfun View.show() {\n    this.visibility = View.VISIBLE\n}\n\nfun View.hide() {\n    this.visibility = View.GONE\n}\n\nfun View.visible(visible: Boolean, or: Int = View.GONE) {\n    this.visibility = if (visible) View.VISIBLE else or\n}\n\n/**\n * Reduce ViewPager2's sensitivity to horizontal swipes.\n */\nfun ViewPager2.reduceSwipeSensitivity() {\n    // ViewPager2 is very sensitive to horizontal motion when swiping vertically, and will\n    // trigger a page transition if the user's swipe is only a few tens of degrees off from\n    // vertical. This is a problem if the underlying content is a list that the user wants\n    // to scroll vertically -- it's far too easy to trigger an accidental horizontal swipe.\n    //\n    // One way to stop this is to reach in to ViewPager2's RecyclerView and adjust the amount\n    // of touch slop it has.\n    //\n    // See https://issuetracker.google.com/issues/139867645 and\n    // https://bladecoder.medium.com/fixing-recyclerview-nested-scrolling-in-opposite-direction-f587be5c1a04\n    // for more (the approach in that Medium article works, but is still quite sensitive to\n    // horizontal movement while scrolling).\n    try {\n        val recyclerViewField = ViewPager2::class.java.getDeclaredField(\"mRecyclerView\")\n        recyclerViewField.isAccessible = true\n        val recyclerView = recyclerViewField.get(this) as RecyclerView\n\n        val touchSlopField = RecyclerView::class.java.getDeclaredField(\"mTouchSlop\")\n        touchSlopField.isAccessible = true\n        val touchSlop = touchSlopField.get(recyclerView) as Int\n        // Experimentally, 2 seems to be a sweet-spot, requiring a downward swipe that's at least\n        // 45 degrees off the vertical to trigger a change. This is consistent with maximum angle\n        // supported to open the nav. drawer.\n        val scaleFactor = 2\n        touchSlopField.set(recyclerView, touchSlop * scaleFactor)\n    } catch (e: Exception) {\n        Log.w(\"reduceSwipeSensitivity\", e)\n    }\n}\n\n/**\n * TextViews with an ancestor RecyclerView can forget that they are selectable. Toggling\n * calls to [TextView.setTextIsSelectable] fixes this.\n *\n * @see https://issuetracker.google.com/issues/37095917\n */\nfun TextView.fixTextSelection() {\n    setTextIsSelectable(false)\n    post { setTextIsSelectable(true) }\n}\n\n/**\n * Makes sure the [RecyclerView] has the correct bottom padding set\n * and no system bars or floating action buttons cover the content when it is scrolled all the way up.\n * This must be called before window insets are applied (Activity.onCreate or Fragment.onViewCreated).\n * The RecyclerView needs to have clipToPadding set to false for this to work.\n * @param fab true if there is a [FloatingActionButton] above the RecyclerView\n */\nfun RecyclerView.ensureBottomPadding(fab: Boolean = false) {\n    val bottomPadding = if (fab) {\n        context.resources.getDimensionPixelSize(R.dimen.recyclerview_bottom_padding_actionbutton)\n    } else {\n        context.resources.getDimensionPixelSize(R.dimen.recyclerview_bottom_padding_no_actionbutton)\n    }\n\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {\n        ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->\n            val systemBarsInsets = insets.getInsets(systemBars())\n            view.updatePadding(bottom = bottomPadding + systemBarsInsets.bottom)\n            WindowInsetsCompat.Builder(insets)\n                .setInsets(systemBars(), Insets.of(systemBarsInsets.left, systemBarsInsets.top, systemBarsInsets.right, 0))\n                .build()\n        }\n    } else {\n        updatePadding(bottom = bottomPadding)\n    }\n}\n\n/** Makes sure a [FloatingActionButton] has the correct bottom margin set\n * so it is not covered by any system bars.\n */\nfun FloatingActionButton.ensureBottomMargin() {\n    ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->\n        val bottomInsets = insets.getInsets(systemBars()).bottom\n        val actionButtonMargin = resources.getDimensionPixelSize(R.dimen.fabMargin)\n        view.updateLayoutParams<ViewGroup.MarginLayoutParams> {\n            bottomMargin = bottomInsets + actionButtonMargin\n        }\n        insets\n    }\n}\n\n/**\n * Combines WindowInsetsAnimationCompat.Callback and OnApplyWindowInsetsListener\n * for easy implementation of layouts that animate with they keyboard.\n * The animation callback is only called when something animates, so it isn't suitable for initial setup.\n * The OnApplyWindowInsetsListener can do that, but the insets it supplies must not be used when an animation is ongoing,\n * as that messes with the animation.\n */\nfun View.setOnWindowInsetsChangeListener(listener: (WindowInsetsCompat) -> Unit) {\n    val callback = WindowInsetsCallback(listener)\n\n    ViewCompat.setWindowInsetsAnimationCallback(this, callback)\n    ViewCompat.setOnApplyWindowInsetsListener(this, callback)\n}\n\nprivate class WindowInsetsCallback(\n    private val listener: (WindowInsetsCompat) -> Unit,\n) : WindowInsetsAnimationCompat.Callback(DISPATCH_MODE_STOP),\n    OnApplyWindowInsetsListener {\n\n    var animationRunning = false\n    var deferredInsets: WindowInsetsCompat? = null\n\n    override fun onPrepare(animation: WindowInsetsAnimationCompat) {\n        animationRunning = true\n    }\n\n    override fun onProgress(\n        insets: WindowInsetsCompat,\n        runningAnimations: List<WindowInsetsAnimationCompat>,\n    ): WindowInsetsCompat {\n        listener(insets)\n        return WindowInsetsCompat.CONSUMED\n    }\n\n    override fun onApplyWindowInsets(\n        view: View,\n        insets: WindowInsetsCompat,\n    ): WindowInsetsCompat {\n        if (!animationRunning) {\n            listener(insets)\n            deferredInsets = null\n        } else {\n            deferredInsets = insets\n        }\n        return WindowInsetsCompat.CONSUMED\n    }\n\n    override fun onEnd(animation: WindowInsetsAnimationCompat) {\n        deferredInsets?.let { insets ->\n            listener(insets)\n            deferredInsets = null\n        }\n        animationRunning = false\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/twittertext/Regex.java",
    "content": "// Copyright 2018 Twitter, Inc.\n// Licensed under the Apache License, Version 2.0\n// http://www.apache.org/licenses/LICENSE-2.0\n\n// Tusky changed: slight adaptions for Mastodon compatibility\n\npackage com.keylesspalace.tusky.util.twittertext;\n\nimport java.util.Collection;\nimport java.util.Iterator;\nimport java.util.regex.Pattern;\nimport javax.annotation.Nonnull;\n\npublic class Regex {\n\n  protected Regex() {\n  }\n\n  private static final String URL_VALID_GTLD =\n    \"(?:(?:\" +\n    join(TldLists.GTLDS) +\n    \")(?=[^a-z0-9@+-]|$))\";\n  private static final String URL_VALID_CCTLD =\n    \"(?:(?:\" +\n    join(TldLists.CTLDS) +\n    \")(?=[^a-z0-9@+-]|$))\";\n\n  private static final String INVALID_CHARACTERS =\n    \"\\\\uFFFE\" +           // BOM\n    \"\\\\uFEFF\" +           // BOM\n    \"\\\\uFFFF\";            // Special\n\n  private static final String DIRECTIONAL_CHARACTERS =\n    \"\\\\u061C\" + // ARABIC LETTER MARK (ALM)\n    \"\\\\u200E\" + // LEFT-TO-RIGHT MARK (LRM)\n    \"\\\\u200F\" + // RIGHT-TO-LEFT MARK (RLM)\n    \"\\\\u202A\" + // LEFT-TO-RIGHT EMBEDDING (LRE)\n    \"\\\\u202B\" + // RIGHT-TO-LEFT EMBEDDING (RLE)\n    \"\\\\u202C\" + // POP DIRECTIONAL FORMATTING (PDF)\n    \"\\\\u202D\" + // LEFT-TO-RIGHT OVERRIDE (LRO)\n    \"\\\\u202E\" + // RIGHT-TO-LEFT OVERRIDE (RLO)\n    \"\\\\u2066\" + // LEFT-TO-RIGHT ISOLATE (LRI)\n    \"\\\\u2067\" + // RIGHT-TO-LEFT ISOLATE (RLI)\n    \"\\\\u2068\" + // FIRST STRONG ISOLATE (FSI)\n    \"\\\\u2069\";  // POP DIRECTIONAL ISOLATE (PDI)\n\n\n  private static final String UNICODE_SPACES = \"[\" +\n    \"\\\\u0009-\\\\u000d\" +     //  # White_Space # Cc   [5] <control-0009>..<control-000D>\n    \"\\\\u0020\" +             // White_Space # Zs       SPACE\n    \"\\\\u0085\" +             // White_Space # Cc       <control-0085>\n    \"\\\\u00a0\" +             // White_Space # Zs       NO-BREAK SPACE\n    \"\\\\u1680\" +             // White_Space # Zs       OGHAM SPACE MARK\n    \"\\\\u180E\" +             // White_Space # Zs       MONGOLIAN VOWEL SEPARATOR\n    \"\\\\u2000-\\\\u200a\" +     // # White_Space # Zs  [11] EN QUAD..HAIR SPACE\n    \"\\\\u2028\" +             // White_Space # Zl       LINE SEPARATOR\n    \"\\\\u2029\" +             // White_Space # Zp       PARAGRAPH SEPARATOR\n    \"\\\\u202F\" +             // White_Space # Zs       NARROW NO-BREAK SPACE\n    \"\\\\u205F\" +             // White_Space # Zs       MEDIUM MATHEMATICAL SPACE\n    \"\\\\u3000\" +             // White_Space # Zs       IDEOGRAPHIC SPACE\n  \"]\";\n\n  private static final String LATIN_ACCENTS_CHARS =\n      // Latin-1\n      \"\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff\" +\n          // Latin Extended A and B\n          \"\\\\u0100-\\\\u024f\" +\n          // IPA Extensions\n          \"\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b\" +\n          // Hawaiian\n          \"\\\\u02bb\" +\n          // Combining diacritics\n          \"\\\\u0300-\\\\u036f\" +\n          // Latin Extended Additional (mostly for Vietnamese)\n          \"\\\\u1e00-\\\\u1eff\";\n\n  private static final String CYRILLIC_CHARS = \"\\\\u0400-\\\\u04ff\";\n\n  // Generated from unicode_regex/unicode_regex_groups.scala, more inclusive than Java's \\p{L}\\p{M}\n  private static final String HASHTAG_LETTERS_AND_MARKS = \"\\\\p{L}\\\\p{M}\" +\n      \"\\\\u037f\\\\u0528-\\\\u052f\\\\u08a0-\\\\u08b2\\\\u08e4-\\\\u08ff\\\\u0978\\\\u0980\\\\u0c00\\\\u0c34\\\\u0c81\" +\n      \"\\\\u0d01\\\\u0ede\\\\u0edf\\\\u10c7\\\\u10cd\\\\u10fd-\\\\u10ff\\\\u16f1-\\\\u16f8\\\\u17b4\\\\u17b5\\\\u191d\" +\n      \"\\\\u191e\\\\u1ab0-\\\\u1abe\\\\u1bab-\\\\u1bad\\\\u1bba-\\\\u1bbf\\\\u1cf3-\\\\u1cf6\\\\u1cf8\\\\u1cf9\" +\n      \"\\\\u1de7-\\\\u1df5\\\\u2cf2\\\\u2cf3\\\\u2d27\\\\u2d2d\\\\u2d66\\\\u2d67\\\\u9fcc\\\\ua674-\\\\ua67b\\\\ua698\" +\n      \"-\\\\ua69d\\\\ua69f\\\\ua792-\\\\ua79f\\\\ua7aa-\\\\ua7ad\\\\ua7b0\\\\ua7b1\\\\ua7f7-\\\\ua7f9\\\\ua9e0-\" +\n      \"\\\\ua9ef\\\\ua9fa-\\\\ua9fe\\\\uaa7c-\\\\uaa7f\\\\uaae0-\\\\uaaef\\\\uaaf2-\\\\uaaf6\\\\uab30-\\\\uab5a\" +\n      \"\\\\uab5c-\\\\uab5f\\\\uab64\\\\uab65\\\\uf870-\\\\uf87f\\\\uf882\\\\uf884-\\\\uf89f\\\\uf8b8\\\\uf8c1-\" +\n      \"\\\\uf8d6\\\\ufa2e\\\\ufa2f\\\\ufe27-\\\\ufe2d\\\\ud800\\\\udee0\\\\ud800\\\\udf1f\\\\ud800\\\\udf50-\\\\ud800\" +\n      \"\\\\udf7a\\\\ud801\\\\udd00-\\\\ud801\\\\udd27\\\\ud801\\\\udd30-\\\\ud801\\\\udd63\\\\ud801\\\\ude00-\\\\ud801\" +\n      \"\\\\udf36\\\\ud801\\\\udf40-\\\\ud801\\\\udf55\\\\ud801\\\\udf60-\\\\ud801\\\\udf67\\\\ud802\\\\udc60-\\\\ud802\" +\n      \"\\\\udc76\\\\ud802\\\\udc80-\\\\ud802\\\\udc9e\\\\ud802\\\\udd80-\\\\ud802\\\\uddb7\\\\ud802\\\\uddbe\\\\ud802\" +\n      \"\\\\uddbf\\\\ud802\\\\ude80-\\\\ud802\\\\ude9c\\\\ud802\\\\udec0-\\\\ud802\\\\udec7\\\\ud802\\\\udec9-\\\\ud802\" +\n      \"\\\\udee6\\\\ud802\\\\udf80-\\\\ud802\\\\udf91\\\\ud804\\\\udc7f\\\\ud804\\\\udcd0-\\\\ud804\\\\udce8\\\\ud804\" +\n      \"\\\\udd00-\\\\ud804\\\\udd34\\\\ud804\\\\udd50-\\\\ud804\\\\udd73\\\\ud804\\\\udd76\\\\ud804\\\\udd80-\\\\ud804\" +\n      \"\\\\uddc4\\\\ud804\\\\uddda\\\\ud804\\\\ude00-\\\\ud804\\\\ude11\\\\ud804\\\\ude13-\\\\ud804\\\\ude37\\\\ud804\" +\n      \"\\\\udeb0-\\\\ud804\\\\udeea\\\\ud804\\\\udf01-\\\\ud804\\\\udf03\\\\ud804\\\\udf05-\\\\ud804\\\\udf0c\\\\ud804\" +\n      \"\\\\udf0f\\\\ud804\\\\udf10\\\\ud804\\\\udf13-\\\\ud804\\\\udf28\\\\ud804\\\\udf2a-\\\\ud804\\\\udf30\\\\ud804\" +\n      \"\\\\udf32\\\\ud804\\\\udf33\\\\ud804\\\\udf35-\\\\ud804\\\\udf39\\\\ud804\\\\udf3c-\\\\ud804\\\\udf44\\\\ud804\" +\n      \"\\\\udf47\\\\ud804\\\\udf48\\\\ud804\\\\udf4b-\\\\ud804\\\\udf4d\\\\ud804\\\\udf57\\\\ud804\\\\udf5d-\\\\ud804\" +\n      \"\\\\udf63\\\\ud804\\\\udf66-\\\\ud804\\\\udf6c\\\\ud804\\\\udf70-\\\\ud804\\\\udf74\\\\ud805\\\\udc80-\\\\ud805\" +\n      \"\\\\udcc5\\\\ud805\\\\udcc7\\\\ud805\\\\udd80-\\\\ud805\\\\uddb5\\\\ud805\\\\uddb8-\\\\ud805\\\\uddc0\\\\ud805\" +\n      \"\\\\ude00-\\\\ud805\\\\ude40\\\\ud805\\\\ude44\\\\ud805\\\\ude80-\\\\ud805\\\\udeb7\\\\ud806\\\\udca0-\\\\ud806\" +\n      \"\\\\udcdf\\\\ud806\\\\udcff\\\\ud806\\\\udec0-\\\\ud806\\\\udef8\\\\ud808\\\\udf6f-\\\\ud808\\\\udf98\\\\ud81a\" +\n      \"\\\\ude40-\\\\ud81a\\\\ude5e\\\\ud81a\\\\uded0-\\\\ud81a\\\\udeed\\\\ud81a\\\\udef0-\\\\ud81a\\\\udef4\\\\ud81a\" +\n      \"\\\\udf00-\\\\ud81a\\\\udf36\\\\ud81a\\\\udf40-\\\\ud81a\\\\udf43\\\\ud81a\\\\udf63-\\\\ud81a\\\\udf77\\\\ud81a\" +\n      \"\\\\udf7d-\\\\ud81a\\\\udf8f\\\\ud81b\\\\udf00-\\\\ud81b\\\\udf44\\\\ud81b\\\\udf50-\\\\ud81b\\\\udf7e\\\\ud81b\" +\n      \"\\\\udf8f-\\\\ud81b\\\\udf9f\\\\ud82f\\\\udc00-\\\\ud82f\\\\udc6a\\\\ud82f\\\\udc70-\\\\ud82f\\\\udc7c\\\\ud82f\" +\n      \"\\\\udc80-\\\\ud82f\\\\udc88\\\\ud82f\\\\udc90-\\\\ud82f\\\\udc99\\\\ud82f\\\\udc9d\\\\ud82f\\\\udc9e\\\\ud83a\" +\n      \"\\\\udc00-\\\\ud83a\\\\udcc4\\\\ud83a\\\\udcd0-\\\\ud83a\\\\udcd6\\\\ud83b\\\\ude00-\\\\ud83b\\\\ude03\\\\ud83b\" +\n      \"\\\\ude05-\\\\ud83b\\\\ude1f\\\\ud83b\\\\ude21\\\\ud83b\\\\ude22\\\\ud83b\\\\ude24\\\\ud83b\\\\ude27\\\\ud83b\" +\n      \"\\\\ude29-\\\\ud83b\\\\ude32\\\\ud83b\\\\ude34-\\\\ud83b\\\\ude37\\\\ud83b\\\\ude39\\\\ud83b\\\\ude3b\\\\ud83b\" +\n      \"\\\\ude42\\\\ud83b\\\\ude47\\\\ud83b\\\\ude49\\\\ud83b\\\\ude4b\\\\ud83b\\\\ude4d-\\\\ud83b\\\\ude4f\\\\ud83b\" +\n      \"\\\\ude51\\\\ud83b\\\\ude52\\\\ud83b\\\\ude54\\\\ud83b\\\\ude57\\\\ud83b\\\\ude59\\\\ud83b\\\\ude5b\\\\ud83b\" +\n      \"\\\\ude5d\\\\ud83b\\\\ude5f\\\\ud83b\\\\ude61\\\\ud83b\\\\ude62\\\\ud83b\\\\ude64\\\\ud83b\\\\ude67-\\\\ud83b\" +\n      \"\\\\ude6a\\\\ud83b\\\\ude6c-\\\\ud83b\\\\ude72\\\\ud83b\\\\ude74-\\\\ud83b\\\\ude77\\\\ud83b\\\\ude79-\\\\ud83b\" +\n      \"\\\\ude7c\\\\ud83b\\\\ude7e\\\\ud83b\\\\ude80-\\\\ud83b\\\\ude89\\\\ud83b\\\\ude8b-\\\\ud83b\\\\ude9b\\\\ud83b\" +\n      \"\\\\udea1-\\\\ud83b\\\\udea3\\\\ud83b\\\\udea5-\\\\ud83b\\\\udea9\\\\ud83b\\\\udeab-\\\\ud83b\\\\udebb\";\n\n  // Generated from unicode_regex/unicode_regex_groups.scala, more inclusive than Java's \\p{Nd}\n  private static final String HASHTAG_NUMERALS = \"\\\\p{Nd}\" +\n      \"\\\\u0de6-\\\\u0def\\\\ua9f0-\\\\ua9f9\\\\ud804\\\\udcf0-\\\\ud804\\\\udcf9\\\\ud804\\\\udd36-\\\\ud804\" +\n      \"\\\\udd3f\\\\ud804\\\\uddd0-\\\\ud804\\\\uddd9\\\\ud804\\\\udef0-\\\\ud804\\\\udef9\\\\ud805\\\\udcd0-\\\\ud805\" +\n      \"\\\\udcd9\\\\ud805\\\\ude50-\\\\ud805\\\\ude59\\\\ud805\\\\udec0-\\\\ud805\\\\udec9\\\\ud806\\\\udce0-\\\\ud806\" +\n      \"\\\\udce9\\\\ud81a\\\\ude60-\\\\ud81a\\\\ude69\\\\ud81a\\\\udf50-\\\\ud81a\\\\udf59\";\n\n  private static final String HASHTAG_SPECIAL_CHARS = \"_\" + //underscore\n      \"\\\\u200c\" + // ZERO WIDTH NON-JOINER (ZWNJ)\n      \"\\\\u200d\" + // ZERO WIDTH JOINER (ZWJ)\n      \"\\\\ua67e\" + // CYRILLIC KAVYKA\n      \"\\\\u05be\" + // HEBREW PUNCTUATION MAQAF\n      \"\\\\u05f3\" + // HEBREW PUNCTUATION GERESH\n      \"\\\\u05f4\" + // HEBREW PUNCTUATION GERSHAYIM\n      \"\\\\uff5e\" + // FULLWIDTH TILDE\n      \"\\\\u301c\" + // WAVE DASH\n      \"\\\\u309b\" + // KATAKANA-HIRAGANA VOICED SOUND MARK\n      \"\\\\u309c\" + // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK\n      \"\\\\u30a0\" + // KATAKANA-HIRAGANA DOUBLE HYPHEN\n      \"\\\\u30fb\" + // KATAKANA MIDDLE DOT\n      \"\\\\u3003\" + // DITTO MARK\n      \"\\\\u0f0b\" + // TIBETAN MARK INTERSYLLABIC TSHEG\n      \"\\\\u0f0c\" + // TIBETAN MARK DELIMITER TSHEG BSTAR\n      \"\\\\u00b7\";  // MIDDLE DOT\n\n  private static final String HASHTAG_LETTERS_NUMERALS =\n      HASHTAG_LETTERS_AND_MARKS + HASHTAG_NUMERALS + HASHTAG_SPECIAL_CHARS;\n  private static final String HASHTAG_LETTERS_SET = \"[\" + HASHTAG_LETTERS_AND_MARKS + \"]\";\n  private static final String HASHTAG_LETTERS_NUMERALS_SET = \"[\" + HASHTAG_LETTERS_NUMERALS + \"]\";\n\n  /* URL related hash regex collection */\n  private static final String URL_VALID_PRECEDING_CHARS =\n      \"(?:[^a-z0-9@＠$#＃\" + INVALID_CHARACTERS + \"]|[\" + DIRECTIONAL_CHARACTERS + \"]|^)\";\n\n  private static final String URL_VALID_CHARS = \"[a-z0-9\" + LATIN_ACCENTS_CHARS + \"]\";\n  private static final String URL_VALID_SUBDOMAIN =\n      \"(?>(?:\" + URL_VALID_CHARS + \"[\" + URL_VALID_CHARS + \"\\\\-_]*)?\" + URL_VALID_CHARS + \"\\\\.)\";\n  private static final String URL_VALID_DOMAIN_NAME =\n      \"(?:(?:\" + URL_VALID_CHARS + \"[\" + URL_VALID_CHARS + \"\\\\-]*)?\" + URL_VALID_CHARS + \"\\\\.)\";\n\n  private static final String PUNCTUATION_CHARS = \"-_!\\\"#$%&'\\\\(\\\\)*+,./:;<=>?@\\\\[\\\\]^`\\\\{|}~\";\n\n  // Any non-space, non-punctuation characters.\n  // \\p{Z} = any kind of whitespace or invisible separator.\n  private static final String URL_VALID_UNICODE_CHARS =\n      \"[^\" + PUNCTUATION_CHARS + \"\\\\s\\\\p{Z}\\\\p{InGeneralPunctuation}]\";\n  private static final String URL_VALID_UNICODE_DOMAIN_NAME =\n      \"(?:(?:\" + URL_VALID_UNICODE_CHARS + \"[\" + URL_VALID_UNICODE_CHARS + \"\\\\-]*)?\" +\n          URL_VALID_UNICODE_CHARS + \"\\\\.)\";\n\n  private static final String URL_PUNYCODE = \"(?:xn--[-0-9a-z]+)\";\n\n  private static final String URL_VALID_DOMAIN =\n    \"(?:\" +                                                   // optional sub-domain + domain + TLD\n        URL_VALID_SUBDOMAIN + \"*\" + URL_VALID_DOMAIN_NAME +   // e.g. twitter.com, foo.co.jp ...\n        \"(?:\" + URL_VALID_GTLD + \"|\" + URL_VALID_CCTLD + \"|\" + URL_PUNYCODE + \")\" +\n    \")\" +\n    \"|(?:\" + \"(?<=https?://)\" +\n      \"(?:\" +\n        \"(?:\" + URL_VALID_DOMAIN_NAME + URL_VALID_CCTLD + \")\" +  // protocol + domain + ccTLD\n          \"|(?:\" +\n            URL_VALID_UNICODE_DOMAIN_NAME +                      // protocol + unicode domain + TLD\n            \"(?:\" + URL_VALID_GTLD + \"|\" + URL_VALID_CCTLD + \")\" +\n          \")\" +\n      \")\" +\n    \")\" +\n    \"|(?:\" +                                                  // domain + ccTLD + '/'\n      URL_VALID_DOMAIN_NAME + URL_VALID_CCTLD + \"(?=/)\" +     // e.g. t.co/\n    \")\";\n\n  private static final String URL_VALID_PORT_NUMBER = \"[0-9]++\";\n\n  private static final String URL_VALID_GENERAL_PATH_CHARS =\n      \"[a-z0-9!\\\\*';:=\\\\+,.\\\\$/%#\\\\[\\\\]\\\\-\\\\u2013_~\\\\|&@\" +\n          LATIN_ACCENTS_CHARS + CYRILLIC_CHARS + \"]\";\n\n  /**\n   * Allow URL paths to contain up to two nested levels of balanced parens\n   *  1. Used in Wikipedia URLs like /Primer_(film)\n   *  2. Used in IIS sessions like /S(dfd346)/\n   *  3. Used in Rdio URLs like /track/We_Up_(Album_Version_(Edited))/\n   */\n  private static final String URL_BALANCED_PARENS = \"\\\\(\" +\n    \"(?:\" +\n      URL_VALID_GENERAL_PATH_CHARS + \"+\" +\n      \"|\" +\n      // allow one nested level of balanced parentheses\n      \"(?:\" +\n        URL_VALID_GENERAL_PATH_CHARS + \"*\" +\n        \"\\\\(\" +\n          URL_VALID_GENERAL_PATH_CHARS + \"+\" +\n        \"\\\\)\" +\n        URL_VALID_GENERAL_PATH_CHARS + \"*\" +\n      \")\" +\n    \")\" +\n  \"\\\\)\";\n\n  /**\n   * Valid end-of-path characters (so /foo. does not gobble the period).\n   *   2. Allow =&# for empty URL parameters and other URL-join artifacts\n   */\n  private static final String URL_VALID_PATH_ENDING_CHARS =\n      \"[a-z0-9=_#/\\\\-\\\\+\" + LATIN_ACCENTS_CHARS + CYRILLIC_CHARS + \"]|(?:\" +\n          URL_BALANCED_PARENS + \")\";\n\n  private static final String URL_VALID_PATH = \"(?:\" +\n    \"(?:\" +\n      URL_VALID_GENERAL_PATH_CHARS + \"*\" +\n      \"(?:\" + URL_BALANCED_PARENS + URL_VALID_GENERAL_PATH_CHARS + \"*)*\" +\n      URL_VALID_PATH_ENDING_CHARS +\n    \")|(?:@\" + URL_VALID_GENERAL_PATH_CHARS + \"+/)\" +\n  \")\";\n\n  private static final String URL_VALID_URL_QUERY_CHARS =\n      \"[a-z0-9!?\\\\*'\\\\(\\\\);:&=\\\\+\\\\$/%#\\\\[\\\\]\\\\-_\\\\.,~\\\\|@]\";\n  private static final String URL_VALID_URL_QUERY_ENDING_CHARS = \"[a-z0-9\\\\-_&=#/]\";\n  public static final String VALID_URL_PATTERN_STRING =\n  URL_VALID_PRECEDING_CHARS +\n    \"(\" +\n      \"https?://\" +\n      \"(\" + URL_VALID_DOMAIN + \")\" +\n      \"(?::(\" + URL_VALID_PORT_NUMBER + \"))?\" +\n      \"(/\" +\n        URL_VALID_PATH + \"*+\" +\n      \")?\" +\n      \"(\\\\?\" + URL_VALID_URL_QUERY_CHARS + \"*\" +\n              URL_VALID_URL_QUERY_ENDING_CHARS + \")?\" +\n    \")\";\n\n  private static final String AT_SIGNS_CHARS = \"@\\uFF20\";\n  private static final String DOLLAR_SIGN_CHAR = \"\\\\$\";\n  private static final String CASHTAG = \"[a-z]{1,6}(?:[._][a-z]{1,2})?\";\n\n  /* Begin public constants */\n\n  public static final Pattern INVALID_CHARACTERS_PATTERN;\n  public static final Pattern VALID_HASHTAG;\n  public static final int VALID_HASHTAG_GROUP_BEFORE = 1;\n  public static final int VALID_HASHTAG_GROUP_HASH = 2;\n  public static final int VALID_HASHTAG_GROUP_TAG = 3;\n  public static final Pattern INVALID_HASHTAG_MATCH_END;\n  public static final Pattern RTL_CHARACTERS;\n\n  public static final Pattern AT_SIGNS;\n  public static final Pattern VALID_MENTION_OR_LIST;\n  public static final int VALID_MENTION_OR_LIST_GROUP_BEFORE = 1;\n  public static final int VALID_MENTION_OR_LIST_GROUP_AT = 2;\n  public static final int VALID_MENTION_OR_LIST_GROUP_USERNAME = 3;\n  public static final int VALID_MENTION_OR_LIST_GROUP_LIST = 4;\n\n  public static final Pattern VALID_REPLY;\n  public static final int VALID_REPLY_GROUP_USERNAME = 1;\n\n  public static final Pattern INVALID_MENTION_MATCH_END;\n\n  /**\n   * Regex to extract URL (it also includes the text preceding the url).\n   *\n   * This regex does not reflect its name and {@link Regex#VALID_URL_GROUP_URL} match\n   * should be checked in order to match a valid url. This is not ideal, but the behavior is\n   * being kept to ensure backwards compatibility. Ideally this regex should be\n   * implemented with a negative lookbehind as opposed to a negated character class\n   * but lack of JS support increases maint overhead if the logic is different by\n   * platform.\n   */\n\n  public static final Pattern VALID_URL;\n  public static final int VALID_URL_GROUP_ALL          = 1;\n  public static final int VALID_URL_GROUP_BEFORE       = 2;\n  public static final int VALID_URL_GROUP_URL          = 3;\n  public static final int VALID_URL_GROUP_PROTOCOL     = 4;\n  public static final int VALID_URL_GROUP_DOMAIN       = 5;\n  public static final int VALID_URL_GROUP_PORT         = 6;\n  public static final int VALID_URL_GROUP_PATH         = 7;\n  public static final int VALID_URL_GROUP_QUERY_STRING = 8;\n\n  public static final Pattern VALID_TCO_URL;\n  public static final Pattern INVALID_URL_WITHOUT_PROTOCOL_MATCH_BEGIN;\n\n  public static final Pattern VALID_CASHTAG;\n  public static final int VALID_CASHTAG_GROUP_BEFORE = 1;\n  public static final int VALID_CASHTAG_GROUP_DOLLAR = 2;\n  public static final int VALID_CASHTAG_GROUP_CASHTAG = 3;\n\n  public static final Pattern VALID_DOMAIN;\n\n  // initializing in a static synchronized block,\n  // there appears to be thread safety issues with Pattern.compile in android\n  static {\n    synchronized (Regex.class) {\n      INVALID_CHARACTERS_PATTERN = Pattern.compile(\".*[\" + INVALID_CHARACTERS + \"].*\");\n      VALID_HASHTAG = Pattern.compile(\"(^|\\\\uFE0E|\\\\uFE0F|[^&\" + HASHTAG_LETTERS_NUMERALS +\n          \"])([#\\uFF03])(?![\\uFE0F\\u20E3])(\" + HASHTAG_LETTERS_NUMERALS_SET + \"*\" +\n          HASHTAG_LETTERS_SET + HASHTAG_LETTERS_NUMERALS_SET + \"*)\", Pattern.CASE_INSENSITIVE);\n      INVALID_HASHTAG_MATCH_END = Pattern.compile(\"^(?:[#＃]|://)\");\n      RTL_CHARACTERS = Pattern.compile(\"[\\u0600-\\u06FF\\u0750-\\u077F\\u0590-\\u05FF\\uFE70-\\uFEFF]\");\n      AT_SIGNS = Pattern.compile(\"[\" + AT_SIGNS_CHARS + \"]\");\n      VALID_MENTION_OR_LIST = Pattern.compile(\"([^a-z0-9_!#$%&*\" + AT_SIGNS_CHARS +\n          \"]|^|(?:^|[^a-z0-9_+~.-])RT:?)(\" + AT_SIGNS +\n          \"+)([a-z0-9_]{1,20})(/[a-z][a-z0-9_\\\\-]{0,24})?\", Pattern.CASE_INSENSITIVE);\n      VALID_REPLY = Pattern.compile(\"^(?:\" + UNICODE_SPACES + \"|\" + DIRECTIONAL_CHARACTERS + \")*\" +\n          AT_SIGNS + \"([a-z0-9_]{1,20})\", Pattern.CASE_INSENSITIVE);\n      INVALID_MENTION_MATCH_END =\n          Pattern.compile(\"^(?:[\" + AT_SIGNS_CHARS + LATIN_ACCENTS_CHARS + \"]|://)\");\n      INVALID_URL_WITHOUT_PROTOCOL_MATCH_BEGIN = Pattern.compile(\"[-_./]$\");\n\n      VALID_URL = Pattern.compile(VALID_URL_PATTERN_STRING, Pattern.CASE_INSENSITIVE);\n      VALID_TCO_URL = Pattern.compile(\"^https?://t\\\\.co/([a-z0-9]+)(?:\\\\?\" +\n          URL_VALID_URL_QUERY_CHARS + \"*\" + URL_VALID_URL_QUERY_ENDING_CHARS + \")?\",\n          Pattern.CASE_INSENSITIVE);\n      VALID_CASHTAG = Pattern.compile(\"(^|\" + UNICODE_SPACES + \"|\" + DIRECTIONAL_CHARACTERS + \")(\" +\n          DOLLAR_SIGN_CHAR + \")(\" + CASHTAG + \")\" + \"(?=$|\\\\s|\\\\p{Punct})\",\n          Pattern.CASE_INSENSITIVE);\n      VALID_DOMAIN = Pattern.compile(URL_VALID_DOMAIN, Pattern.CASE_INSENSITIVE);\n    }\n  }\n\n  private static String join(@Nonnull Collection<?> col) {\n    final StringBuilder sb = new StringBuilder();\n    final Iterator<?> iter = col.iterator();\n    if (iter.hasNext()) {\n      sb.append(iter.next().toString());\n    }\n    while (iter.hasNext()) {\n      sb.append(\"|\");\n      sb.append(iter.next().toString());\n    }\n    return sb.toString();\n  }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/util/twittertext/TldLists.java",
    "content": "// Copyright 2018 Twitter, Inc.\n// Licensed under the Apache License, Version 2.0\n// http://www.apache.org/licenses/LICENSE-2.0\n\npackage com.keylesspalace.tusky.util.twittertext;\n\nimport java.util.Arrays;\nimport java.util.List;\n\npublic final class TldLists {\n  private TldLists() {\n  }\n\n  public static final List<String> GTLDS = Arrays.asList(\n      \"삼성\",\n      \"닷컴\",\n      \"닷넷\",\n      \"香格里拉\",\n      \"餐厅\",\n      \"食品\",\n      \"飞利浦\",\n      \"電訊盈科\",\n      \"集团\",\n      \"通販\",\n      \"购物\",\n      \"谷歌\",\n      \"诺基亚\",\n      \"联通\",\n      \"网络\",\n      \"网站\",\n      \"网店\",\n      \"网址\",\n      \"组织机构\",\n      \"移动\",\n      \"珠宝\",\n      \"点看\",\n      \"游戏\",\n      \"淡马锡\",\n      \"机构\",\n      \"書籍\",\n      \"时尚\",\n      \"新闻\",\n      \"政府\",\n      \"政务\",\n      \"招聘\",\n      \"手表\",\n      \"手机\",\n      \"我爱你\",\n      \"慈善\",\n      \"微博\",\n      \"广东\",\n      \"工行\",\n      \"家電\",\n      \"娱乐\",\n      \"天主教\",\n      \"大拿\",\n      \"大众汽车\",\n      \"在线\",\n      \"嘉里大酒店\",\n      \"嘉里\",\n      \"商标\",\n      \"商店\",\n      \"商城\",\n      \"公益\",\n      \"公司\",\n      \"八卦\",\n      \"健康\",\n      \"信息\",\n      \"佛山\",\n      \"企业\",\n      \"中文网\",\n      \"中信\",\n      \"世界\",\n      \"ポイント\",\n      \"ファッション\",\n      \"セール\",\n      \"ストア\",\n      \"コム\",\n      \"グーグル\",\n      \"クラウド\",\n      \"みんな\",\n      \"คอม\",\n      \"संगठन\",\n      \"नेट\",\n      \"कॉम\",\n      \"همراه\",\n      \"موقع\",\n      \"موبايلي\",\n      \"كوم\",\n      \"كاثوليك\",\n      \"عرب\",\n      \"شبكة\",\n      \"بيتك\",\n      \"بازار\",\n      \"العليان\",\n      \"ارامكو\",\n      \"اتصالات\",\n      \"ابوظبي\",\n      \"קום\",\n      \"сайт\",\n      \"рус\",\n      \"орг\",\n      \"онлайн\",\n      \"москва\",\n      \"ком\",\n      \"католик\",\n      \"дети\",\n      \"zuerich\",\n      \"zone\",\n      \"zippo\",\n      \"zip\",\n      \"zero\",\n      \"zara\",\n      \"zappos\",\n      \"yun\",\n      \"youtube\",\n      \"you\",\n      \"yokohama\",\n      \"yoga\",\n      \"yodobashi\",\n      \"yandex\",\n      \"yamaxun\",\n      \"yahoo\",\n      \"yachts\",\n      \"xyz\",\n      \"xxx\",\n      \"xperia\",\n      \"xin\",\n      \"xihuan\",\n      \"xfinity\",\n      \"xerox\",\n      \"xbox\",\n      \"wtf\",\n      \"wtc\",\n      \"wow\",\n      \"world\",\n      \"works\",\n      \"work\",\n      \"woodside\",\n      \"wolterskluwer\",\n      \"wme\",\n      \"winners\",\n      \"wine\",\n      \"windows\",\n      \"win\",\n      \"williamhill\",\n      \"wiki\",\n      \"wien\",\n      \"whoswho\",\n      \"weir\",\n      \"weibo\",\n      \"wedding\",\n      \"wed\",\n      \"website\",\n      \"weber\",\n      \"webcam\",\n      \"weatherchannel\",\n      \"weather\",\n      \"watches\",\n      \"watch\",\n      \"warman\",\n      \"wanggou\",\n      \"wang\",\n      \"walter\",\n      \"walmart\",\n      \"wales\",\n      \"vuelos\",\n      \"voyage\",\n      \"voto\",\n      \"voting\",\n      \"vote\",\n      \"volvo\",\n      \"volkswagen\",\n      \"vodka\",\n      \"vlaanderen\",\n      \"vivo\",\n      \"viva\",\n      \"vistaprint\",\n      \"vista\",\n      \"vision\",\n      \"visa\",\n      \"virgin\",\n      \"vip\",\n      \"vin\",\n      \"villas\",\n      \"viking\",\n      \"vig\",\n      \"video\",\n      \"viajes\",\n      \"vet\",\n      \"versicherung\",\n      \"vermögensberatung\",\n      \"vermögensberater\",\n      \"verisign\",\n      \"ventures\",\n      \"vegas\",\n      \"vanguard\",\n      \"vana\",\n      \"vacations\",\n      \"ups\",\n      \"uol\",\n      \"uno\",\n      \"university\",\n      \"unicom\",\n      \"uconnect\",\n      \"ubs\",\n      \"ubank\",\n      \"tvs\",\n      \"tushu\",\n      \"tunes\",\n      \"tui\",\n      \"tube\",\n      \"trv\",\n      \"trust\",\n      \"travelersinsurance\",\n      \"travelers\",\n      \"travelchannel\",\n      \"travel\",\n      \"training\",\n      \"trading\",\n      \"trade\",\n      \"toys\",\n      \"toyota\",\n      \"town\",\n      \"tours\",\n      \"total\",\n      \"toshiba\",\n      \"toray\",\n      \"top\",\n      \"tools\",\n      \"tokyo\",\n      \"today\",\n      \"tmall\",\n      \"tkmaxx\",\n      \"tjx\",\n      \"tjmaxx\",\n      \"tirol\",\n      \"tires\",\n      \"tips\",\n      \"tiffany\",\n      \"tienda\",\n      \"tickets\",\n      \"tiaa\",\n      \"theatre\",\n      \"theater\",\n      \"thd\",\n      \"teva\",\n      \"tennis\",\n      \"temasek\",\n      \"telefonica\",\n      \"telecity\",\n      \"tel\",\n      \"technology\",\n      \"tech\",\n      \"team\",\n      \"tdk\",\n      \"tci\",\n      \"taxi\",\n      \"tax\",\n      \"tattoo\",\n      \"tatar\",\n      \"tatamotors\",\n      \"target\",\n      \"taobao\",\n      \"talk\",\n      \"taipei\",\n      \"tab\",\n      \"systems\",\n      \"symantec\",\n      \"sydney\",\n      \"swiss\",\n      \"swiftcover\",\n      \"swatch\",\n      \"suzuki\",\n      \"surgery\",\n      \"surf\",\n      \"support\",\n      \"supply\",\n      \"supplies\",\n      \"sucks\",\n      \"style\",\n      \"study\",\n      \"studio\",\n      \"stream\",\n      \"store\",\n      \"storage\",\n      \"stockholm\",\n      \"stcgroup\",\n      \"stc\",\n      \"statoil\",\n      \"statefarm\",\n      \"statebank\",\n      \"starhub\",\n      \"star\",\n      \"staples\",\n      \"stada\",\n      \"srt\",\n      \"srl\",\n      \"spreadbetting\",\n      \"spot\",\n      \"sport\",\n      \"spiegel\",\n      \"space\",\n      \"soy\",\n      \"sony\",\n      \"song\",\n      \"solutions\",\n      \"solar\",\n      \"sohu\",\n      \"software\",\n      \"softbank\",\n      \"social\",\n      \"soccer\",\n      \"sncf\",\n      \"smile\",\n      \"smart\",\n      \"sling\",\n      \"skype\",\n      \"sky\",\n      \"skin\",\n      \"ski\",\n      \"site\",\n      \"singles\",\n      \"sina\",\n      \"silk\",\n      \"shriram\",\n      \"showtime\",\n      \"show\",\n      \"shouji\",\n      \"shopping\",\n      \"shop\",\n      \"shoes\",\n      \"shiksha\",\n      \"shia\",\n      \"shell\",\n      \"shaw\",\n      \"sharp\",\n      \"shangrila\",\n      \"sfr\",\n      \"sexy\",\n      \"sex\",\n      \"sew\",\n      \"seven\",\n      \"ses\",\n      \"services\",\n      \"sener\",\n      \"select\",\n      \"seek\",\n      \"security\",\n      \"secure\",\n      \"seat\",\n      \"search\",\n      \"scot\",\n      \"scor\",\n      \"scjohnson\",\n      \"science\",\n      \"schwarz\",\n      \"schule\",\n      \"school\",\n      \"scholarships\",\n      \"schmidt\",\n      \"schaeffler\",\n      \"scb\",\n      \"sca\",\n      \"sbs\",\n      \"sbi\",\n      \"saxo\",\n      \"save\",\n      \"sas\",\n      \"sarl\",\n      \"sapo\",\n      \"sap\",\n      \"sanofi\",\n      \"sandvikcoromant\",\n      \"sandvik\",\n      \"samsung\",\n      \"samsclub\",\n      \"salon\",\n      \"sale\",\n      \"sakura\",\n      \"safety\",\n      \"safe\",\n      \"saarland\",\n      \"ryukyu\",\n      \"rwe\",\n      \"run\",\n      \"ruhr\",\n      \"rugby\",\n      \"rsvp\",\n      \"room\",\n      \"rogers\",\n      \"rodeo\",\n      \"rocks\",\n      \"rocher\",\n      \"rmit\",\n      \"rip\",\n      \"rio\",\n      \"ril\",\n      \"rightathome\",\n      \"ricoh\",\n      \"richardli\",\n      \"rich\",\n      \"rexroth\",\n      \"reviews\",\n      \"review\",\n      \"restaurant\",\n      \"rest\",\n      \"republican\",\n      \"report\",\n      \"repair\",\n      \"rentals\",\n      \"rent\",\n      \"ren\",\n      \"reliance\",\n      \"reit\",\n      \"reisen\",\n      \"reise\",\n      \"rehab\",\n      \"redumbrella\",\n      \"redstone\",\n      \"red\",\n      \"recipes\",\n      \"realty\",\n      \"realtor\",\n      \"realestate\",\n      \"read\",\n      \"raid\",\n      \"radio\",\n      \"racing\",\n      \"qvc\",\n      \"quest\",\n      \"quebec\",\n      \"qpon\",\n      \"pwc\",\n      \"pub\",\n      \"prudential\",\n      \"pru\",\n      \"protection\",\n      \"property\",\n      \"properties\",\n      \"promo\",\n      \"progressive\",\n      \"prof\",\n      \"productions\",\n      \"prod\",\n      \"pro\",\n      \"prime\",\n      \"press\",\n      \"praxi\",\n      \"pramerica\",\n      \"post\",\n      \"porn\",\n      \"politie\",\n      \"poker\",\n      \"pohl\",\n      \"pnc\",\n      \"plus\",\n      \"plumbing\",\n      \"playstation\",\n      \"play\",\n      \"place\",\n      \"pizza\",\n      \"pioneer\",\n      \"pink\",\n      \"ping\",\n      \"pin\",\n      \"pid\",\n      \"pictures\",\n      \"pictet\",\n      \"pics\",\n      \"piaget\",\n      \"physio\",\n      \"photos\",\n      \"photography\",\n      \"photo\",\n      \"phone\",\n      \"philips\",\n      \"phd\",\n      \"pharmacy\",\n      \"pfizer\",\n      \"pet\",\n      \"pccw\",\n      \"pay\",\n      \"passagens\",\n      \"party\",\n      \"parts\",\n      \"partners\",\n      \"pars\",\n      \"paris\",\n      \"panerai\",\n      \"panasonic\",\n      \"pamperedchef\",\n      \"page\",\n      \"ovh\",\n      \"ott\",\n      \"otsuka\",\n      \"osaka\",\n      \"origins\",\n      \"orientexpress\",\n      \"organic\",\n      \"org\",\n      \"orange\",\n      \"oracle\",\n      \"open\",\n      \"ooo\",\n      \"onyourside\",\n      \"online\",\n      \"onl\",\n      \"ong\",\n      \"one\",\n      \"omega\",\n      \"ollo\",\n      \"oldnavy\",\n      \"olayangroup\",\n      \"olayan\",\n      \"okinawa\",\n      \"office\",\n      \"off\",\n      \"observer\",\n      \"obi\",\n      \"nyc\",\n      \"ntt\",\n      \"nrw\",\n      \"nra\",\n      \"nowtv\",\n      \"nowruz\",\n      \"now\",\n      \"norton\",\n      \"northwesternmutual\",\n      \"nokia\",\n      \"nissay\",\n      \"nissan\",\n      \"ninja\",\n      \"nikon\",\n      \"nike\",\n      \"nico\",\n      \"nhk\",\n      \"ngo\",\n      \"nfl\",\n      \"nexus\",\n      \"nextdirect\",\n      \"next\",\n      \"news\",\n      \"newholland\",\n      \"new\",\n      \"neustar\",\n      \"network\",\n      \"netflix\",\n      \"netbank\",\n      \"net\",\n      \"nec\",\n      \"nba\",\n      \"navy\",\n      \"natura\",\n      \"nationwide\",\n      \"name\",\n      \"nagoya\",\n      \"nadex\",\n      \"nab\",\n      \"mutuelle\",\n      \"mutual\",\n      \"museum\",\n      \"mtr\",\n      \"mtpc\",\n      \"mtn\",\n      \"msd\",\n      \"movistar\",\n      \"movie\",\n      \"mov\",\n      \"motorcycles\",\n      \"moto\",\n      \"moscow\",\n      \"mortgage\",\n      \"mormon\",\n      \"mopar\",\n      \"montblanc\",\n      \"monster\",\n      \"money\",\n      \"monash\",\n      \"mom\",\n      \"moi\",\n      \"moe\",\n      \"moda\",\n      \"mobily\",\n      \"mobile\",\n      \"mobi\",\n      \"mma\",\n      \"mls\",\n      \"mlb\",\n      \"mitsubishi\",\n      \"mit\",\n      \"mint\",\n      \"mini\",\n      \"mil\",\n      \"microsoft\",\n      \"miami\",\n      \"metlife\",\n      \"merckmsd\",\n      \"meo\",\n      \"menu\",\n      \"men\",\n      \"memorial\",\n      \"meme\",\n      \"melbourne\",\n      \"meet\",\n      \"media\",\n      \"med\",\n      \"mckinsey\",\n      \"mcdonalds\",\n      \"mcd\",\n      \"mba\",\n      \"mattel\",\n      \"maserati\",\n      \"marshalls\",\n      \"marriott\",\n      \"markets\",\n      \"marketing\",\n      \"market\",\n      \"map\",\n      \"mango\",\n      \"management\",\n      \"man\",\n      \"makeup\",\n      \"maison\",\n      \"maif\",\n      \"madrid\",\n      \"macys\",\n      \"luxury\",\n      \"luxe\",\n      \"lupin\",\n      \"lundbeck\",\n      \"ltda\",\n      \"ltd\",\n      \"lplfinancial\",\n      \"lpl\",\n      \"love\",\n      \"lotto\",\n      \"lotte\",\n      \"london\",\n      \"lol\",\n      \"loft\",\n      \"locus\",\n      \"locker\",\n      \"loans\",\n      \"loan\",\n      \"llp\",\n      \"llc\",\n      \"lixil\",\n      \"living\",\n      \"live\",\n      \"lipsy\",\n      \"link\",\n      \"linde\",\n      \"lincoln\",\n      \"limo\",\n      \"limited\",\n      \"lilly\",\n      \"like\",\n      \"lighting\",\n      \"lifestyle\",\n      \"lifeinsurance\",\n      \"life\",\n      \"lidl\",\n      \"liaison\",\n      \"lgbt\",\n      \"lexus\",\n      \"lego\",\n      \"legal\",\n      \"lefrak\",\n      \"leclerc\",\n      \"lease\",\n      \"lds\",\n      \"lawyer\",\n      \"law\",\n      \"latrobe\",\n      \"latino\",\n      \"lat\",\n      \"lasalle\",\n      \"lanxess\",\n      \"landrover\",\n      \"land\",\n      \"lancome\",\n      \"lancia\",\n      \"lancaster\",\n      \"lamer\",\n      \"lamborghini\",\n      \"ladbrokes\",\n      \"lacaixa\",\n      \"kyoto\",\n      \"kuokgroup\",\n      \"kred\",\n      \"krd\",\n      \"kpn\",\n      \"kpmg\",\n      \"kosher\",\n      \"komatsu\",\n      \"koeln\",\n      \"kiwi\",\n      \"kitchen\",\n      \"kindle\",\n      \"kinder\",\n      \"kim\",\n      \"kia\",\n      \"kfh\",\n      \"kerryproperties\",\n      \"kerrylogistics\",\n      \"kerryhotels\",\n      \"kddi\",\n      \"kaufen\",\n      \"juniper\",\n      \"juegos\",\n      \"jprs\",\n      \"jpmorgan\",\n      \"joy\",\n      \"jot\",\n      \"joburg\",\n      \"jobs\",\n      \"jnj\",\n      \"jmp\",\n      \"jll\",\n      \"jlc\",\n      \"jio\",\n      \"jewelry\",\n      \"jetzt\",\n      \"jeep\",\n      \"jcp\",\n      \"jcb\",\n      \"java\",\n      \"jaguar\",\n      \"iwc\",\n      \"iveco\",\n      \"itv\",\n      \"itau\",\n      \"istanbul\",\n      \"ist\",\n      \"ismaili\",\n      \"iselect\",\n      \"irish\",\n      \"ipiranga\",\n      \"investments\",\n      \"intuit\",\n      \"international\",\n      \"intel\",\n      \"int\",\n      \"insure\",\n      \"insurance\",\n      \"institute\",\n      \"ink\",\n      \"ing\",\n      \"info\",\n      \"infiniti\",\n      \"industries\",\n      \"inc\",\n      \"immobilien\",\n      \"immo\",\n      \"imdb\",\n      \"imamat\",\n      \"ikano\",\n      \"iinet\",\n      \"ifm\",\n      \"ieee\",\n      \"icu\",\n      \"ice\",\n      \"icbc\",\n      \"ibm\",\n      \"hyundai\",\n      \"hyatt\",\n      \"hughes\",\n      \"htc\",\n      \"hsbc\",\n      \"how\",\n      \"house\",\n      \"hotmail\",\n      \"hotels\",\n      \"hoteles\",\n      \"hot\",\n      \"hosting\",\n      \"host\",\n      \"hospital\",\n      \"horse\",\n      \"honeywell\",\n      \"honda\",\n      \"homesense\",\n      \"homes\",\n      \"homegoods\",\n      \"homedepot\",\n      \"holiday\",\n      \"holdings\",\n      \"hockey\",\n      \"hkt\",\n      \"hiv\",\n      \"hitachi\",\n      \"hisamitsu\",\n      \"hiphop\",\n      \"hgtv\",\n      \"hermes\",\n      \"here\",\n      \"helsinki\",\n      \"help\",\n      \"healthcare\",\n      \"health\",\n      \"hdfcbank\",\n      \"hdfc\",\n      \"hbo\",\n      \"haus\",\n      \"hangout\",\n      \"hamburg\",\n      \"hair\",\n      \"guru\",\n      \"guitars\",\n      \"guide\",\n      \"guge\",\n      \"gucci\",\n      \"guardian\",\n      \"group\",\n      \"grocery\",\n      \"gripe\",\n      \"green\",\n      \"gratis\",\n      \"graphics\",\n      \"grainger\",\n      \"gov\",\n      \"got\",\n      \"gop\",\n      \"google\",\n      \"goog\",\n      \"goodyear\",\n      \"goodhands\",\n      \"goo\",\n      \"golf\",\n      \"goldpoint\",\n      \"gold\",\n      \"godaddy\",\n      \"gmx\",\n      \"gmo\",\n      \"gmbh\",\n      \"gmail\",\n      \"globo\",\n      \"global\",\n      \"gle\",\n      \"glass\",\n      \"glade\",\n      \"giving\",\n      \"gives\",\n      \"gifts\",\n      \"gift\",\n      \"ggee\",\n      \"george\",\n      \"genting\",\n      \"gent\",\n      \"gea\",\n      \"gdn\",\n      \"gbiz\",\n      \"gay\",\n      \"garden\",\n      \"gap\",\n      \"games\",\n      \"game\",\n      \"gallup\",\n      \"gallo\",\n      \"gallery\",\n      \"gal\",\n      \"fyi\",\n      \"futbol\",\n      \"furniture\",\n      \"fund\",\n      \"fun\",\n      \"fujixerox\",\n      \"fujitsu\",\n      \"ftr\",\n      \"frontier\",\n      \"frontdoor\",\n      \"frogans\",\n      \"frl\",\n      \"fresenius\",\n      \"free\",\n      \"fox\",\n      \"foundation\",\n      \"forum\",\n      \"forsale\",\n      \"forex\",\n      \"ford\",\n      \"football\",\n      \"foodnetwork\",\n      \"food\",\n      \"foo\",\n      \"fly\",\n      \"flsmidth\",\n      \"flowers\",\n      \"florist\",\n      \"flir\",\n      \"flights\",\n      \"flickr\",\n      \"fitness\",\n      \"fit\",\n      \"fishing\",\n      \"fish\",\n      \"firmdale\",\n      \"firestone\",\n      \"fire\",\n      \"financial\",\n      \"finance\",\n      \"final\",\n      \"film\",\n      \"fido\",\n      \"fidelity\",\n      \"fiat\",\n      \"ferrero\",\n      \"ferrari\",\n      \"feedback\",\n      \"fedex\",\n      \"fast\",\n      \"fashion\",\n      \"farmers\",\n      \"farm\",\n      \"fans\",\n      \"fan\",\n      \"family\",\n      \"faith\",\n      \"fairwinds\",\n      \"fail\",\n      \"fage\",\n      \"extraspace\",\n      \"express\",\n      \"exposed\",\n      \"expert\",\n      \"exchange\",\n      \"everbank\",\n      \"events\",\n      \"eus\",\n      \"eurovision\",\n      \"etisalat\",\n      \"esurance\",\n      \"estate\",\n      \"esq\",\n      \"erni\",\n      \"ericsson\",\n      \"equipment\",\n      \"epson\",\n      \"epost\",\n      \"enterprises\",\n      \"engineering\",\n      \"engineer\",\n      \"energy\",\n      \"emerck\",\n      \"email\",\n      \"education\",\n      \"edu\",\n      \"edeka\",\n      \"eco\",\n      \"eat\",\n      \"earth\",\n      \"dvr\",\n      \"dvag\",\n      \"durban\",\n      \"dupont\",\n      \"duns\",\n      \"dunlop\",\n      \"duck\",\n      \"dubai\",\n      \"dtv\",\n      \"drive\",\n      \"download\",\n      \"dot\",\n      \"doosan\",\n      \"domains\",\n      \"doha\",\n      \"dog\",\n      \"dodge\",\n      \"doctor\",\n      \"docs\",\n      \"dnp\",\n      \"diy\",\n      \"dish\",\n      \"discover\",\n      \"discount\",\n      \"directory\",\n      \"direct\",\n      \"digital\",\n      \"diet\",\n      \"diamonds\",\n      \"dhl\",\n      \"dev\",\n      \"design\",\n      \"desi\",\n      \"dentist\",\n      \"dental\",\n      \"democrat\",\n      \"delta\",\n      \"deloitte\",\n      \"dell\",\n      \"delivery\",\n      \"degree\",\n      \"deals\",\n      \"dealer\",\n      \"deal\",\n      \"dds\",\n      \"dclk\",\n      \"day\",\n      \"datsun\",\n      \"dating\",\n      \"date\",\n      \"data\",\n      \"dance\",\n      \"dad\",\n      \"dabur\",\n      \"cyou\",\n      \"cymru\",\n      \"cuisinella\",\n      \"csc\",\n      \"cruises\",\n      \"cruise\",\n      \"crs\",\n      \"crown\",\n      \"cricket\",\n      \"creditunion\",\n      \"creditcard\",\n      \"credit\",\n      \"cpa\",\n      \"courses\",\n      \"coupons\",\n      \"coupon\",\n      \"country\",\n      \"corsica\",\n      \"coop\",\n      \"cool\",\n      \"cookingchannel\",\n      \"cooking\",\n      \"contractors\",\n      \"contact\",\n      \"consulting\",\n      \"construction\",\n      \"condos\",\n      \"comsec\",\n      \"computer\",\n      \"compare\",\n      \"company\",\n      \"community\",\n      \"commbank\",\n      \"comcast\",\n      \"com\",\n      \"cologne\",\n      \"college\",\n      \"coffee\",\n      \"codes\",\n      \"coach\",\n      \"clubmed\",\n      \"club\",\n      \"cloud\",\n      \"clothing\",\n      \"clinique\",\n      \"clinic\",\n      \"click\",\n      \"cleaning\",\n      \"claims\",\n      \"cityeats\",\n      \"city\",\n      \"citic\",\n      \"citi\",\n      \"citadel\",\n      \"cisco\",\n      \"circle\",\n      \"cipriani\",\n      \"church\",\n      \"chrysler\",\n      \"chrome\",\n      \"christmas\",\n      \"chloe\",\n      \"chintai\",\n      \"cheap\",\n      \"chat\",\n      \"chase\",\n      \"charity\",\n      \"channel\",\n      \"chanel\",\n      \"cfd\",\n      \"cfa\",\n      \"cern\",\n      \"ceo\",\n      \"center\",\n      \"ceb\",\n      \"cbs\",\n      \"cbre\",\n      \"cbn\",\n      \"cba\",\n      \"catholic\",\n      \"catering\",\n      \"cat\",\n      \"casino\",\n      \"cash\",\n      \"caseih\",\n      \"case\",\n      \"casa\",\n      \"cartier\",\n      \"cars\",\n      \"careers\",\n      \"career\",\n      \"care\",\n      \"cards\",\n      \"caravan\",\n      \"car\",\n      \"capitalone\",\n      \"capital\",\n      \"capetown\",\n      \"canon\",\n      \"cancerresearch\",\n      \"camp\",\n      \"camera\",\n      \"cam\",\n      \"calvinklein\",\n      \"call\",\n      \"cal\",\n      \"cafe\",\n      \"cab\",\n      \"bzh\",\n      \"buzz\",\n      \"buy\",\n      \"business\",\n      \"builders\",\n      \"build\",\n      \"bugatti\",\n      \"budapest\",\n      \"brussels\",\n      \"brother\",\n      \"broker\",\n      \"broadway\",\n      \"bridgestone\",\n      \"bradesco\",\n      \"box\",\n      \"boutique\",\n      \"bot\",\n      \"boston\",\n      \"bostik\",\n      \"bosch\",\n      \"boots\",\n      \"booking\",\n      \"book\",\n      \"boo\",\n      \"bond\",\n      \"bom\",\n      \"bofa\",\n      \"boehringer\",\n      \"boats\",\n      \"bnpparibas\",\n      \"bnl\",\n      \"bmw\",\n      \"bms\",\n      \"blue\",\n      \"bloomberg\",\n      \"blog\",\n      \"blockbuster\",\n      \"blanco\",\n      \"blackfriday\",\n      \"black\",\n      \"biz\",\n      \"bio\",\n      \"bingo\",\n      \"bing\",\n      \"bike\",\n      \"bid\",\n      \"bible\",\n      \"bharti\",\n      \"bet\",\n      \"bestbuy\",\n      \"best\",\n      \"berlin\",\n      \"bentley\",\n      \"beer\",\n      \"beauty\",\n      \"beats\",\n      \"bcn\",\n      \"bcg\",\n      \"bbva\",\n      \"bbt\",\n      \"bbc\",\n      \"bayern\",\n      \"bauhaus\",\n      \"basketball\",\n      \"baseball\",\n      \"bargains\",\n      \"barefoot\",\n      \"barclays\",\n      \"barclaycard\",\n      \"barcelona\",\n      \"bar\",\n      \"bank\",\n      \"band\",\n      \"bananarepublic\",\n      \"banamex\",\n      \"baidu\",\n      \"baby\",\n      \"azure\",\n      \"axa\",\n      \"aws\",\n      \"avianca\",\n      \"autos\",\n      \"auto\",\n      \"author\",\n      \"auspost\",\n      \"audio\",\n      \"audible\",\n      \"audi\",\n      \"auction\",\n      \"attorney\",\n      \"athleta\",\n      \"associates\",\n      \"asia\",\n      \"asda\",\n      \"arte\",\n      \"art\",\n      \"arpa\",\n      \"army\",\n      \"archi\",\n      \"aramco\",\n      \"arab\",\n      \"aquarelle\",\n      \"apple\",\n      \"app\",\n      \"apartments\",\n      \"aol\",\n      \"anz\",\n      \"anquan\",\n      \"android\",\n      \"analytics\",\n      \"amsterdam\",\n      \"amica\",\n      \"amfam\",\n      \"amex\",\n      \"americanfamily\",\n      \"americanexpress\",\n      \"alstom\",\n      \"alsace\",\n      \"ally\",\n      \"allstate\",\n      \"allfinanz\",\n      \"alipay\",\n      \"alibaba\",\n      \"alfaromeo\",\n      \"akdn\",\n      \"airtel\",\n      \"airforce\",\n      \"airbus\",\n      \"aigo\",\n      \"aig\",\n      \"agency\",\n      \"agakhan\",\n      \"africa\",\n      \"afl\",\n      \"afamilycompany\",\n      \"aetna\",\n      \"aero\",\n      \"aeg\",\n      \"adult\",\n      \"ads\",\n      \"adac\",\n      \"actor\",\n      \"active\",\n      \"aco\",\n      \"accountants\",\n      \"accountant\",\n      \"accenture\",\n      \"academy\",\n      \"abudhabi\",\n      \"abogado\",\n      \"able\",\n      \"abc\",\n      \"abbvie\",\n      \"abbott\",\n      \"abb\",\n      \"abarth\",\n      \"aarp\",\n      \"aaa\",\n      \"onion\"\n  );\n\n  public static final List<String> CTLDS = Arrays.asList(\n      \"한국\",\n      \"香港\",\n      \"澳門\",\n      \"新加坡\",\n      \"台灣\",\n      \"台湾\",\n      \"中國\",\n      \"中国\",\n      \"გე\",\n      \"ລາວ\",\n      \"ไทย\",\n      \"ලංකා\",\n      \"ഭാരതം\",\n      \"ಭಾರತ\",\n      \"భారత్\",\n      \"சிங்கப்பூர்\",\n      \"இலங்கை\",\n      \"இந்தியா\",\n      \"ଭାରତ\",\n      \"ભારત\",\n      \"ਭਾਰਤ\",\n      \"ভাৰত\",\n      \"ভারত\",\n      \"বাংলা\",\n      \"भारोत\",\n      \"भारतम्\",\n      \"भारत\",\n      \"ڀارت\",\n      \"پاکستان\",\n      \"موريتانيا\",\n      \"مليسيا\",\n      \"مصر\",\n      \"قطر\",\n      \"فلسطين\",\n      \"عمان\",\n      \"عراق\",\n      \"سورية\",\n      \"سودان\",\n      \"تونس\",\n      \"بھارت\",\n      \"بارت\",\n      \"ایران\",\n      \"امارات\",\n      \"المغرب\",\n      \"السعودية\",\n      \"الجزائر\",\n      \"البحرين\",\n      \"الاردن\",\n      \"հայ\",\n      \"қаз\",\n      \"укр\",\n      \"срб\",\n      \"рф\",\n      \"мон\",\n      \"мкд\",\n      \"ею\",\n      \"бел\",\n      \"бг\",\n      \"ευ\",\n      \"ελ\",\n      \"zw\",\n      \"zm\",\n      \"za\",\n      \"yt\",\n      \"ye\",\n      \"ws\",\n      \"wf\",\n      \"vu\",\n      \"vn\",\n      \"vi\",\n      \"vg\",\n      \"ve\",\n      \"vc\",\n      \"va\",\n      \"uz\",\n      \"uy\",\n      \"us\",\n      \"um\",\n      \"uk\",\n      \"ug\",\n      \"ua\",\n      \"tz\",\n      \"tw\",\n      \"tv\",\n      \"tt\",\n      \"tr\",\n      \"tp\",\n      \"to\",\n      \"tn\",\n      \"tm\",\n      \"tl\",\n      \"tk\",\n      \"tj\",\n      \"th\",\n      \"tg\",\n      \"tf\",\n      \"td\",\n      \"tc\",\n      \"sz\",\n      \"sy\",\n      \"sx\",\n      \"sv\",\n      \"su\",\n      \"st\",\n      \"ss\",\n      \"sr\",\n      \"so\",\n      \"sn\",\n      \"sm\",\n      \"sl\",\n      \"sk\",\n      \"sj\",\n      \"si\",\n      \"sh\",\n      \"sg\",\n      \"se\",\n      \"sd\",\n      \"sc\",\n      \"sb\",\n      \"sa\",\n      \"rw\",\n      \"ru\",\n      \"rs\",\n      \"ro\",\n      \"re\",\n      \"qa\",\n      \"py\",\n      \"pw\",\n      \"pt\",\n      \"ps\",\n      \"pr\",\n      \"pn\",\n      \"pm\",\n      \"pl\",\n      \"pk\",\n      \"ph\",\n      \"pg\",\n      \"pf\",\n      \"pe\",\n      \"pa\",\n      \"om\",\n      \"nz\",\n      \"nu\",\n      \"nr\",\n      \"np\",\n      \"no\",\n      \"nl\",\n      \"ni\",\n      \"ng\",\n      \"nf\",\n      \"ne\",\n      \"nc\",\n      \"na\",\n      \"mz\",\n      \"my\",\n      \"mx\",\n      \"mw\",\n      \"mv\",\n      \"mu\",\n      \"mt\",\n      \"ms\",\n      \"mr\",\n      \"mq\",\n      \"mp\",\n      \"mo\",\n      \"mn\",\n      \"mm\",\n      \"ml\",\n      \"mk\",\n      \"mh\",\n      \"mg\",\n      \"mf\",\n      \"me\",\n      \"md\",\n      \"mc\",\n      \"ma\",\n      \"ly\",\n      \"lv\",\n      \"lu\",\n      \"lt\",\n      \"ls\",\n      \"lr\",\n      \"lk\",\n      \"li\",\n      \"lc\",\n      \"lb\",\n      \"la\",\n      \"kz\",\n      \"ky\",\n      \"kw\",\n      \"kr\",\n      \"kp\",\n      \"kn\",\n      \"km\",\n      \"ki\",\n      \"kh\",\n      \"kg\",\n      \"ke\",\n      \"jp\",\n      \"jo\",\n      \"jm\",\n      \"je\",\n      \"it\",\n      \"is\",\n      \"ir\",\n      \"iq\",\n      \"io\",\n      \"in\",\n      \"im\",\n      \"il\",\n      \"ie\",\n      \"id\",\n      \"hu\",\n      \"ht\",\n      \"hr\",\n      \"hn\",\n      \"hm\",\n      \"hk\",\n      \"gy\",\n      \"gw\",\n      \"gu\",\n      \"gt\",\n      \"gs\",\n      \"gr\",\n      \"gq\",\n      \"gp\",\n      \"gn\",\n      \"gm\",\n      \"gl\",\n      \"gi\",\n      \"gh\",\n      \"gg\",\n      \"gf\",\n      \"ge\",\n      \"gd\",\n      \"gb\",\n      \"ga\",\n      \"fr\",\n      \"fo\",\n      \"fm\",\n      \"fk\",\n      \"fj\",\n      \"fi\",\n      \"eu\",\n      \"et\",\n      \"es\",\n      \"er\",\n      \"eh\",\n      \"eg\",\n      \"ee\",\n      \"ec\",\n      \"dz\",\n      \"do\",\n      \"dm\",\n      \"dk\",\n      \"dj\",\n      \"de\",\n      \"cz\",\n      \"cy\",\n      \"cx\",\n      \"cw\",\n      \"cv\",\n      \"cu\",\n      \"cr\",\n      \"co\",\n      \"cn\",\n      \"cm\",\n      \"cl\",\n      \"ck\",\n      \"ci\",\n      \"ch\",\n      \"cg\",\n      \"cf\",\n      \"cd\",\n      \"cc\",\n      \"ca\",\n      \"bz\",\n      \"by\",\n      \"bw\",\n      \"bv\",\n      \"bt\",\n      \"bs\",\n      \"br\",\n      \"bq\",\n      \"bo\",\n      \"bn\",\n      \"bm\",\n      \"bl\",\n      \"bj\",\n      \"bi\",\n      \"bh\",\n      \"bg\",\n      \"bf\",\n      \"be\",\n      \"bd\",\n      \"bb\",\n      \"ba\",\n      \"az\",\n      \"ax\",\n      \"aw\",\n      \"au\",\n      \"at\",\n      \"as\",\n      \"ar\",\n      \"aq\",\n      \"ao\",\n      \"an\",\n      \"am\",\n      \"al\",\n      \"ai\",\n      \"ag\",\n      \"af\",\n      \"ae\",\n      \"ad\",\n      \"ac\"\n  );\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/view/AdaptiveTabLayout.kt",
    "content": "package com.keylesspalace.tusky.view\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.ViewGroup\nimport com.google.android.material.tabs.TabLayout\n\n/**\n * Workaround for \"auto\" mode not behaving as expected.\n *\n * Switches the tab display mode depending on available size: start out with \"scrollable\" but\n * if there is enough room switch to \"fixed\" (and re-measure).\n *\n * Idea taken from https://stackoverflow.com/a/44894143\n */\nclass AdaptiveTabLayout @JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = 0\n) : TabLayout(context, attrs, defStyleAttr) {\n\n    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {\n        tabMode = MODE_SCROLLABLE // make sure to only measure the \"minimum width\"\n        super.onMeasure(widthMeasureSpec, heightMeasureSpec)\n\n        if (tabCount < 2) {\n            return\n        }\n\n        val tabLayout = getChildAt(0) as ViewGroup\n        var widthOfAllTabs = 0\n        for (i in 0 until tabLayout.childCount) {\n            widthOfAllTabs += tabLayout.getChildAt(i).measuredWidth\n        }\n        if (widthOfAllTabs <= measuredWidth) {\n            // fill all space if there is enough room\n            tabMode = MODE_FIXED\n            super.onMeasure(widthMeasureSpec, heightMeasureSpec)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/view/BackgroundMessageView.kt",
    "content": "package com.keylesspalace.tusky.view\n\nimport android.content.Context\nimport android.text.method.LinkMovementMethod\nimport android.util.AttributeSet\nimport android.view.Gravity\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.widget.LinearLayout\nimport android.widget.TextView\nimport androidx.annotation.DrawableRes\nimport androidx.annotation.StringRes\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.ViewBackgroundMessageBinding\nimport com.keylesspalace.tusky.util.addDrawables\nimport com.keylesspalace.tusky.util.getDrawableRes\nimport com.keylesspalace.tusky.util.getErrorString\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.show\nimport com.keylesspalace.tusky.util.visible\n\n/**\n * This view is used for screens with content which may be empty or might have failed to download.\n */\nclass BackgroundMessageView @JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = 0\n) : LinearLayout(context, attrs, defStyleAttr) {\n\n    private val binding = ViewBackgroundMessageBinding.inflate(LayoutInflater.from(context), this)\n\n    init {\n        gravity = Gravity.CENTER_HORIZONTAL\n        orientation = VERTICAL\n\n        if (isInEditMode) {\n            setup(R.drawable.errorphant_offline, R.string.error_network) {}\n        }\n    }\n\n    fun setup(throwable: Throwable, listener: ((v: View) -> Unit)? = null) {\n        setup(throwable.getDrawableRes(), throwable.getErrorString(context), listener)\n    }\n\n    fun setup(\n        @DrawableRes imageRes: Int,\n        @StringRes messageRes: Int,\n        clickListener: ((v: View) -> Unit)? = null\n    ) = setup(imageRes, context.getString(messageRes), clickListener)\n\n    /**\n     * Setup image, message and button.\n     * If [clickListener] is `null` then the button will be hidden.\n     */\n    fun setup(\n        @DrawableRes imageRes: Int,\n        message: String,\n        clickListener: ((v: View) -> Unit)? = null\n    ) {\n        binding.messageTextView.text = message\n        binding.messageTextView.movementMethod = LinkMovementMethod.getInstance()\n        binding.imageView.setImageResource(imageRes)\n        binding.button.setOnClickListener(clickListener)\n        binding.button.visible(clickListener != null)\n        binding.helpTextCard.hide()\n    }\n\n    fun showHelp(@StringRes helpRes: Int) {\n        val size: Int = binding.helpText.textSize.toInt() + 2\n        val color = binding.helpText.currentTextColor\n        val text = context.getText(helpRes)\n        val textWithDrawables = addDrawables(text, color, size, context)\n\n        binding.helpText.setText(textWithDrawables, TextView.BufferType.SPANNABLE)\n\n        binding.helpTextCard.show()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/view/BezelImageView.kt",
    "content": "/* Copyright 2019 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\npackage com.keylesspalace.tusky.view\n\nimport android.content.Context\nimport android.graphics.Outline\nimport android.util.AttributeSet\nimport android.view.View\nimport android.view.ViewOutlineProvider\nimport com.mikepenz.materialdrawer.view.BezelImageView\n\n/**\n * override BezelImageView from MaterialDrawer library to provide custom outline\n */\nclass BezelImageView @JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyle: Int = 0\n) : BezelImageView(context, attrs, defStyle) {\n    override fun onSizeChanged(w: Int, h: Int, old_w: Int, old_h: Int) {\n        outlineProvider = CustomOutline(w, h)\n    }\n\n    private class CustomOutline(var width: Int, var height: Int) :\n        ViewOutlineProvider() {\n        override fun getOutline(view: View, outline: Outline) {\n            outline.setRoundRect(\n                0,\n                0,\n                width,\n                height,\n                if (width < height) width / 8f else height / 8f\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/view/ClickableSpanTextView.kt",
    "content": "/*\n * Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.view\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.graphics.Canvas\nimport android.graphics.Color\nimport android.graphics.Paint\nimport android.graphics.Path\nimport android.graphics.Rect\nimport android.graphics.RectF\nimport android.os.Build\nimport android.text.Selection\nimport android.text.Spannable\nimport android.text.Spanned\nimport android.text.style.ClickableSpan\nimport android.text.style.URLSpan\nimport android.util.AttributeSet\nimport android.util.Log\nimport android.view.MotionEvent\nimport android.view.MotionEvent.ACTION_CANCEL\nimport android.view.MotionEvent.ACTION_DOWN\nimport android.view.MotionEvent.ACTION_UP\nimport android.view.ViewConfiguration\nimport androidx.appcompat.widget.AppCompatTextView\nimport androidx.core.graphics.withSave\nimport androidx.core.view.doOnLayout\nimport com.keylesspalace.tusky.BuildConfig\nimport com.keylesspalace.tusky.R\nimport java.lang.Float.max\nimport java.lang.Float.min\nimport kotlin.math.abs\n\n/**\n * Displays text to the user with optional [ClickableSpan]s. Extends the touchable area of the spans\n * to ensure they meet the minimum size of 48dp x 48dp for accessibility requirements.\n *\n * If the touchable area of multiple spans overlap the touch is dispatched to the closest span.\n */\nclass ClickableSpanTextView @JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = android.R.attr.textViewStyle\n) : AppCompatTextView(context, attrs, defStyleAttr) {\n    /**\n     * Map of [RectF] that enclose the [ClickableSpan] without any additional touchable area. A span\n     * may extend over more than one line, so multiple entries in this map may point to the same\n     * span.\n     */\n    private val spanRects = mutableMapOf<RectF, ClickableSpan>()\n\n    /**\n     * Map of [RectF] that enclose the [ClickableSpan] with the additional touchable area. A span\n     * may extend over more than one line, so multiple entries in this map may point to the same\n     * span.\n     */\n    private val delegateRects = mutableMapOf<RectF, ClickableSpan>()\n\n    /**\n     * The [ClickableSpan] that is used for the point the user has touched. Null if the user is\n     * not tapping, or the point they have touched is not associated with a span.\n     */\n    private var clickedSpan: ClickableSpan? = null\n\n    /** The minimum size, in pixels, of a touchable area for accessibility purposes */\n    private val minDimenPx = resources.getDimensionPixelSize(R.dimen.minimum_touch_target)\n\n    /**\n     * Debugging helper. Normally false, set this to true to show a border around spans, and\n     * shade their touchable area.\n     */\n    private val showSpanBoundaries = false\n\n    /**\n     * Debugging helper. The paint to use to draw a span.\n     */\n    private lateinit var spanDebugPaint: Paint\n\n    /**\n     * Debugging helper. The paint to use to shade a span's touchable area.\n     */\n    private lateinit var paddingDebugPaint: Paint\n\n    init {\n        // Initialise debugging paints, if appropriate. Only ever present in debug builds, and\n        // is optimised out if showSpanBoundaries is false.\n        if (BuildConfig.DEBUG && showSpanBoundaries) {\n            spanDebugPaint = Paint()\n            spanDebugPaint.color = Color.BLACK\n            spanDebugPaint.style = Paint.Style.STROKE\n\n            paddingDebugPaint = Paint()\n            paddingDebugPaint.color = Color.MAGENTA\n            paddingDebugPaint.alpha = 50\n        }\n    }\n\n    override fun onTextChanged(\n        text: CharSequence?,\n        start: Int,\n        lengthBefore: Int,\n        lengthAfter: Int\n    ) {\n        super.onTextChanged(text, start, lengthBefore, lengthAfter)\n\n        // TextView tries to optimise the layout process, and will not perform a layout if the\n        // new text takes the same area as the old text (see TextView.checkForRelayout()). This\n        // can result in statuses using the wrong clickable areas as they are never remeasured.\n        // (https://github.com/tuskyapp/Tusky/issues/3596). Force a layout pass to ensure that\n        // the spans are measured correctly.\n        if (!isInLayout) requestLayout()\n\n        doOnLayout { measureSpans() }\n    }\n\n    /**\n     * Compute [Rect]s for each [ClickableSpan].\n     *\n     * Each span is associated with at least two Rects. One for the span itself, and one for the\n     * touchable area around the span.\n     *\n     * If the span runs over multiple lines there will be two Rects per line.\n     */\n    private fun measureSpans() {\n        spanRects.clear()\n        delegateRects.clear()\n\n        val spannedText = text as? Spanned ?: return\n\n        // The goal is to record all the [Rect]s associated with a span with the same fidelity\n        // that the user sees when they highlight text in the view to select it.\n        //\n        // There's no method in [TextView] or [Layout] that does exactly that. [Layout.getSelection]\n        // would be perfect, but it's not accessible. However, [Layout.getSelectionPath] is. That\n        // records the Rects between two characters in the string, and handles text that spans\n        // multiple lines, is bidirectional, etc.\n        //\n        // However, it records them in to a [Path], and a Path has no mechanism to extract the\n        // Rects saved in to it.\n        //\n        // So subclass Path with [RectRecordingPath], which records the data from calls to\n        // [addRect]. Pass that to `getSelectionPath` to extract all the Rects between start and\n        // end.\n        val rects = mutableListOf<RectF>()\n        val rectRecorder = RectRecordingPath(rects)\n\n        for (span in spannedText.getSpans(0, text.length - 1, ClickableSpan::class.java)) {\n            rects.clear()\n            val spanStart = spannedText.getSpanStart(span)\n            val spanEnd = spannedText.getSpanEnd(span)\n\n            // Collect all the Rects for this span\n            layout.getSelectionPath(spanStart, spanEnd, rectRecorder)\n\n            // Save them\n            for (rect in rects) {\n                // Adjust to account for the view's padding and gravity\n                rect.offset(totalPaddingLeft.toFloat(), totalPaddingTop.toFloat())\n                rect.bottom += extendedPaddingBottom\n\n                // The rect wraps just the span, with no additional touchable area. Save a copy.\n                spanRects[RectF(rect)] = span\n\n                // Adjust the rect to meet the minimum dimensions\n                if (rect.height() < minDimenPx) {\n                    val yOffset = (minDimenPx - rect.height()) / 2\n                    rect.top = max(0f, rect.top - yOffset)\n                    rect.bottom = min(rect.bottom + yOffset, bottom.toFloat())\n                }\n\n                if (rect.width() < minDimenPx) {\n                    val xOffset = (minDimenPx - rect.width()) / 2\n                    rect.left = max(0f, rect.left - xOffset)\n                    rect.right = min(rect.right + xOffset, right.toFloat())\n                }\n\n                // Save it\n                delegateRects[rect] = span\n            }\n        }\n    }\n\n    override fun dispatchTouchEvent(event: MotionEvent): Boolean {\n        // workaround to https://code.google.com/p/android/issues/detail?id=191430\n        // from https://stackoverflow.com/a/36740247\n        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O_MR1) {\n            val startSelection = selectionStart\n            val endSelection = selectionEnd\n\n            val content = text\n            if (content is Spannable && (startSelection < 0 || endSelection < 0)) {\n                Selection.setSelection(content as Spannable?, content.length)\n            } else if (startSelection != endSelection) {\n                if (event.actionMasked == ACTION_DOWN) {\n                    text = null\n                    text = content\n                }\n            }\n        }\n        return super.dispatchTouchEvent(event)\n    }\n\n    /**\n     * Handle some touch events.\n     *\n     * - [ACTION_DOWN]: Determine which, if any span, has been clicked, and save in clickedSpan\n     * - [ACTION_UP]: If a span was saved then dispatch the click to that span\n     * - [ACTION_CANCEL]: Clear the saved span\n     *\n     * Defer to the parent class for other touches.\n     */\n    @SuppressLint(\"ClickableViewAccessibility\")\n    override fun onTouchEvent(event: MotionEvent?): Boolean {\n        event ?: return super.onTouchEvent(null)\n        if (delegateRects.isEmpty()) return super.onTouchEvent(event)\n\n        when (event.action) {\n            ACTION_DOWN -> {\n                clickedSpan = null\n                val x = event.x\n                val y = event.y\n\n                // If the user has clicked directly on a span then use it, ignoring any overlap\n                for (entry in spanRects) {\n                    if (!entry.key.contains(x, y)) continue\n                    clickedSpan = entry.value\n                    Log.v(TAG, \"span click: ${(clickedSpan as URLSpan).url}\")\n                    return super.onTouchEvent(event)\n                }\n\n                // Otherwise, check to see if it's in a touchable area\n                var activeEntry: MutableMap.MutableEntry<RectF, ClickableSpan>? = null\n\n                for (entry in delegateRects) {\n                    if (entry == activeEntry) continue\n                    if (!entry.key.contains(x, y)) continue\n\n                    if (activeEntry == null) {\n                        activeEntry = entry\n                        continue\n                    }\n                    Log.v(\n                        TAG,\n                        \"Overlap: ${(entry.value as URLSpan).url} ${(activeEntry.value as URLSpan).url}\"\n                    )\n                    if (isClickOnFirst(entry.key, activeEntry.key, x, y)) {\n                        activeEntry = entry\n                    }\n                }\n                clickedSpan = activeEntry?.value\n                clickedSpan?.let { Log.v(TAG, \"padding click: ${(clickedSpan as URLSpan).url}\") }\n                return super.onTouchEvent(event)\n            }\n            ACTION_UP -> {\n                clickedSpan?.let {\n                    clickedSpan = null\n                    val duration = event.eventTime - event.downTime\n                    if (duration <= ViewConfiguration.getLongPressTimeout()) {\n                        it.onClick(this)\n                        return true\n                    }\n                }\n                return super.onTouchEvent(event)\n            }\n            ACTION_CANCEL -> {\n                clickedSpan = null\n                return super.onTouchEvent(event)\n            }\n            else -> return super.onTouchEvent(event)\n        }\n    }\n\n    /**\n     * Determine whether a click on overlapping rectangles should be attributed to the first or the\n     * second rectangle.\n     *\n     * When the user clicks on the overlap it has to be attributed to the \"best\" rectangle. The\n     * rectangles have equivalent z-order, so their \"closeness\" to the user in the Z-plane is not\n     * a consideration.\n     *\n     * The chosen rectangle depends on whether they overlap top/bottom (the top of one rect is\n     * not the same as the top of the other rect), or they overlap left/right (the tops of both\n     * rects are the same).\n     *\n     * In this example the rectangles overlap top/bottom because their top edges are not aligned.\n     *\n     * ```\n     *     +--------------+\n     *     |1             |\n     *     |      +--------------+\n     *     |      |2             |\n     *     |      |              |\n     *     |      |              |\n     *     +------|              |\n     *            |              |\n     *            +--------------+\n     * ```\n     *\n     * (Rectangle #1 being partially occluded by rectangle #2 is for clarity in the diagram, it\n     * does not affect the algorithm)\n     *\n     * Take the Y coordinate of the centre of each rectangle.\n     *\n     * ```\n     *     +--------------+\n     *     |1             |\n     *     |      +--------------+\n     *     |......|2             |  <-- Rect #1 centre line\n     *     |      |              |\n     *     |      |..............|  <-- Rect #2 centre line\n     *     +------|              |\n     *            |              |\n     *            +--------------+\n     * ```\n     *\n     * Take the Y position of the click, and determine which Y centre coordinate it is closest too.\n     * Whichever one is closest is the clicked rectangle.\n     *\n     * In these examples the left column of numbers is the Y coordinate, `*` marks the point where\n     * the user clicked.\n     *\n     * ```\n     * 0   +--------------+                  +--------------+\n     * 1   |1             |                  |1             |\n     * 2   |      +--------------+           |      +--------------+\n     * 3   |......|2  *          |           |......|2             |\n     * 4   |      |              |           |      |              |\n     * 5   |      |..............|           |      |*.............|\n     * 6   +------|              |           +------|              |\n     * 7          |              |                  |              |\n     * 8          +--------------+                  +--------------+\n     *\n     *     Rect #1 centre Y = 3\n     *     Rect #2 centre Y = 5\n     *     Click (*) Y      = 3              Click (*) Y      = 5\n     *     Result: Rect #1 is clicked        Result: Rect #2 is clicked\n     * ```\n     *\n     * The approach is the same if the rectangles overlap left/right, but the X coordinate of the\n     * centre of the rectangle is tested against the X coordinate of the click.\n     *\n     * @param first rectangle to test against\n     * @param second rectangle to test against\n     * @param x coordinate of user click\n     * @param y coordinate of user click\n     * @return true if the click was closer to the first rectangle than the second\n     */\n    private fun isClickOnFirst(first: RectF, second: RectF, x: Float, y: Float): Boolean {\n        Log.v(TAG, \"first: $first second: $second click: $x $y\")\n        val (firstDiff, secondDiff) = if (first.top == second.top) {\n            Log.v(TAG, \"left/right overlap\")\n            Pair(abs(first.centerX() - x), abs(second.centerX() - x))\n        } else {\n            Log.v(TAG, \"top/bottom overlap\")\n            Pair(abs(first.centerY() - y), abs(second.centerY() - y))\n        }\n        Log.d(TAG, \"firstDiff: $firstDiff secondDiff: $secondDiff\")\n        return firstDiff < secondDiff\n    }\n\n    override fun onDraw(canvas: Canvas) {\n        super.onDraw(canvas)\n\n        // Paint span boundaries. Optimised out on release builds, or debug builds where\n        // showSpanBoundaries is false.\n        if (BuildConfig.DEBUG && showSpanBoundaries) {\n            canvas.withSave {\n                for (entry in delegateRects) {\n                    drawRect(entry.key, paddingDebugPaint)\n                }\n\n                for (entry in spanRects) {\n                    drawRect(entry.key, spanDebugPaint)\n                }\n            }\n        }\n    }\n\n    companion object {\n        const val TAG = \"ClickableSpanTextView\"\n    }\n}\n\n/**\n * A [Path] that records the contents of all the [addRect] calls it receives.\n *\n * @param rects list to record the received [RectF]\n */\nprivate class RectRecordingPath(private val rects: MutableList<RectF>) : Path() {\n    override fun addRect(left: Float, top: Float, right: Float, bottom: Float, dir: Direction) {\n        rects.add(RectF(left, top, right, bottom))\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/view/ConfirmationBottomSheet.kt",
    "content": "package com.keylesspalace.tusky.view\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.content.SharedPreferences\nimport android.content.res.ColorStateList\nimport android.graphics.drawable.RippleDrawable\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.ArrayAdapter\nimport android.widget.Filter\nimport androidx.annotation.DrawableRes\nimport androidx.annotation.StringRes\nimport androidx.core.content.edit\nimport androidx.core.graphics.ColorUtils\nimport androidx.core.graphics.drawable.toDrawable\nimport androidx.core.os.bundleOf\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.setFragmentResult\nimport com.google.android.material.R as materialR\nimport com.google.android.material.bottomsheet.BottomSheetDialogFragment\nimport com.google.android.material.color.MaterialColors\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.BottomsheetConfirmationBinding\nimport com.keylesspalace.tusky.databinding.ItemReblogOptionBinding\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.settings.PrefKeys\nimport com.keylesspalace.tusky.util.getNonNullString\nimport com.keylesspalace.tusky.util.getSerializableCompat\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.viewBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass ConfirmationBottomSheet : BottomSheetDialogFragment(R.layout.bottomsheet_confirmation) {\n\n    @Inject\n    lateinit var prefs: SharedPreferences\n\n    private val binding by viewBinding(BottomsheetConfirmationBinding::bind)\n\n    private var selectedOption = Status.Visibility.PUBLIC\n\n    @SuppressLint(\"UseCompatTextViewDrawableApis\")\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        val mode: Mode = requireArguments().getSerializableCompat(ARG_MODE)!!\n        if (mode == Mode.REBLOG) {\n            selectedOption = Status.Visibility.valueOf(prefs.getNonNullString(PrefKeys.REBLOG_PRIVACY, Status.Visibility.PUBLIC.name))\n\n            binding.confirmTextView.setText(R.string.reblog_confirm)\n            binding.confirmTextView.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_repeat_24dp, 0, 0, 0)\n            binding.confirmTextView.compoundDrawableTintList = ColorStateList.valueOf(\n                MaterialColors.getColor(binding.confirmTextView, materialR.attr.colorPrimary)\n            )\n\n            binding.confirmButton.setText(R.string.action_reblog)\n\n            binding.confirmButton.setOnClickListener {\n                prefs.edit {\n                    putString(PrefKeys.REBLOG_PRIVACY, selectedOption.name)\n                }\n                setFragmentResult(KEY_CONFIRM, bundleOf(RESULT_VISIBILITY to selectedOption.name))\n                dismiss()\n            }\n\n            binding.reblogPrivacyDropdown.setAdapter(OptionsAdapter(view.context))\n\n            binding.reblogPrivacyLayout.setStartIconDrawable(selectedOption.getIcon())\n            binding.reblogPrivacyDropdown.setText(selectedOption.getName())\n\n            binding.reblogPrivacyDropdown.setOnItemClickListener { _, _, position, _ ->\n                selectedOption = reblogOptions.getOrElse(position) { Status.Visibility.PUBLIC }\n                binding.reblogPrivacyLayout.setStartIconDrawable(selectedOption.getIcon())\n                binding.reblogPrivacyDropdown.setText(selectedOption.getName())\n            }\n        } else {\n            binding.confirmTextView.setText(R.string.favourite_confirm)\n            binding.confirmTextView.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_star_24dp, 0, 0, 0)\n            binding.confirmTextView.compoundDrawableTintList = ColorStateList.valueOf(\n                requireContext().getColor(R.color.favoriteButtonActiveColor)\n            )\n\n            binding.reblogPrivacyLayout.hide()\n\n            binding.confirmButton.setText(R.string.action_favourite)\n\n            binding.confirmButton.setOnClickListener {\n                setFragmentResult(KEY_CONFIRM, bundleOf())\n                dismiss()\n            }\n        }\n        binding.cancelButton.setOnClickListener {\n            dismiss()\n        }\n    }\n\n    inner class OptionsAdapter(context: Context) : ArrayAdapter<Status.Visibility>(context, R.layout.item_reblog_option, reblogOptions) {\n        override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {\n            val item = getItem(position)\n            val view: View = convertView ?: run {\n                val layoutInflater = LayoutInflater.from(parent.context)\n                val binding = ItemReblogOptionBinding.inflate(layoutInflater)\n\n                binding.reblogOptionName.setText(item.getName())\n                binding.reblogOptionDescription.setText(item.getDescription())\n                binding.reblogOptionIcon.setImageResource(item.getIcon())\n                binding.root\n            }\n            if (item == selectedOption) {\n                // using the same color as MaterialAutoCompleteTextView.MaterialArrayAdapter which is not public unfortunately\n                val overlayColor = ColorUtils.setAlphaComponent(\n                    MaterialColors.getColor(view, materialR.attr.colorOnSurface),\n                    30\n                )\n                view.background = RippleDrawable(\n                    ColorStateList.valueOf(overlayColor),\n                    MaterialColors.getColor(view, materialR.attr.colorSecondaryContainer).toDrawable(),\n                    null\n                )\n            } else {\n                view.background = null\n            }\n            return view\n        }\n\n        override fun getFilter() = object : Filter() {\n            override fun performFiltering(constraint: CharSequence) = FilterResults().apply { count = 3 }\n\n            override fun publishResults(constraint: CharSequence, results: FilterResults) {\n                // noop\n            }\n        }\n    }\n\n    enum class Mode {\n        REBLOG,\n        FAVOURITE\n    }\n\n    companion object {\n        private const val TAG = \"ConfirmationBottomSheet\"\n\n        private const val KEY_CONFIRM = \"confirm\"\n        private const val ARG_MODE = \"mode\"\n        private const val RESULT_VISIBILITY = \"visibility\"\n\n        private val reblogOptions = listOf(Status.Visibility.PUBLIC, Status.Visibility.UNLISTED, Status.Visibility.PRIVATE)\n\n        fun Fragment.confirmReblog(preferences: SharedPreferences, onConfirmed: (Status.Visibility) -> Unit) {\n            if (preferences.getBoolean(PrefKeys.CONFIRM_REBLOGS, true)) {\n                val bottomSheet = ConfirmationBottomSheet()\n                bottomSheet.arguments = bundleOf(\n                    ARG_MODE to Mode.REBLOG\n                )\n                bottomSheet.show(childFragmentManager, TAG)\n                childFragmentManager.setFragmentResultListener(KEY_CONFIRM, this) { requestKey, result ->\n                    onConfirmed(Status.Visibility.valueOf(result.getString(RESULT_VISIBILITY)!!))\n                }\n            } else {\n                onConfirmed(Status.Visibility.PUBLIC)\n            }\n        }\n\n        fun Fragment.confirmFavourite(preferences: SharedPreferences, onConfirmed: () -> Unit) {\n            if (preferences.getBoolean(PrefKeys.CONFIRM_FAVOURITES, false)) {\n                val bottomSheet = ConfirmationBottomSheet()\n                bottomSheet.arguments = bundleOf(\n                    ARG_MODE to Mode.FAVOURITE\n                )\n                bottomSheet.show(childFragmentManager, TAG)\n                childFragmentManager.setFragmentResultListener(KEY_CONFIRM, this) { _, _ ->\n                    onConfirmed()\n                }\n            } else {\n                onConfirmed()\n            }\n        }\n\n        @StringRes\n        private fun Status.Visibility?.getName(): Int {\n            return when (this) {\n                Status.Visibility.PUBLIC -> R.string.post_privacy_public\n                Status.Visibility.UNLISTED -> R.string.post_privacy_unlisted\n                else -> R.string.post_privacy_followers_only\n            }\n        }\n\n        @StringRes\n        private fun Status.Visibility?.getDescription(): Int {\n            return when (this) {\n                Status.Visibility.PUBLIC -> R.string.reblog_privacy_public_description\n                Status.Visibility.UNLISTED -> R.string.reblog_privacy_unlisted_description\n                else -> R.string.reblog_privacy_followers_only_description\n            }\n        }\n\n        @DrawableRes\n        private fun Status.Visibility?.getIcon(): Int {\n            return when (this) {\n                Status.Visibility.PUBLIC -> R.drawable.ic_public_24dp\n                Status.Visibility.UNLISTED -> R.drawable.ic_lock_open_24dp\n                else -> R.drawable.ic_lock_24dp\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/view/EmojiPicker.kt",
    "content": "package com.keylesspalace.tusky.view\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport androidx.recyclerview.widget.GridLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\n\nclass EmojiPicker @JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null\n) : RecyclerView(context, attrs) {\n\n    init {\n        clipToPadding = false\n        layoutManager = GridLayoutManager(context, 3, GridLayoutManager.HORIZONTAL, false)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/view/GraphView.kt",
    "content": "/* Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.view\n\nimport android.content.Context\nimport android.graphics.Canvas\nimport android.graphics.Paint\nimport android.graphics.Path\nimport android.graphics.PathMeasure\nimport android.graphics.Rect\nimport android.util.AttributeSet\nimport android.view.View\nimport androidx.annotation.ColorInt\nimport androidx.annotation.Dimension\nimport androidx.core.content.res.use\nimport androidx.core.text.layoutDirection\nimport com.google.android.material.R as materialR\nimport com.google.android.material.color.MaterialColors\nimport com.keylesspalace.tusky.R\nimport java.util.Locale\nimport kotlin.math.max\n\nclass GraphView @JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = 0\n) : View(context, attrs, defStyleAttr) {\n    @get:ColorInt\n    @ColorInt\n    var primaryLineColor = 0\n\n    @get:ColorInt\n    @ColorInt\n    var secondaryLineColor = 0\n\n    @get:Dimension\n    var lineWidth = 0f\n\n    @get:ColorInt\n    @ColorInt\n    var graphColor = 0\n\n    @get:ColorInt\n    @ColorInt\n    var metaColor = 0\n\n    private var proportionalTrending = false\n\n    private lateinit var primaryLinePaint: Paint\n    private lateinit var secondaryLinePaint: Paint\n    private lateinit var primaryCirclePaint: Paint\n    private lateinit var secondaryCirclePaint: Paint\n    private lateinit var graphPaint: Paint\n    private lateinit var metaPaint: Paint\n\n    private lateinit var sizeRect: Rect\n    private var primaryLinePath: Path = Path()\n    private var secondaryLinePath: Path = Path()\n\n    private var isRtlLayout: Boolean = false\n\n    var maxTrendingValue: Long = 300\n    var primaryLineData: List<Long> = if (isInEditMode) {\n        listOf(30, 60, 70, 80, 130, 190, 80)\n    } else {\n        listOf(1, 1, 1, 1, 1, 1, 1)\n    }\n        set(value) {\n            field = value.map { max(1, it) }\n            if (isRtlLayout) {\n                field = field.reversed()\n            }\n            primaryLinePath.reset()\n            invalidate()\n        }\n\n    var secondaryLineData: List<Long> = if (isInEditMode) {\n        listOf(10, 20, 40, 60, 100, 132, 20)\n    } else {\n        listOf(1, 1, 1, 1, 1, 1, 1)\n    }\n        set(value) {\n            field = value.map { max(1, it) }\n            if (isRtlLayout) {\n                field = field.reversed()\n            }\n            secondaryLinePath.reset()\n            invalidate()\n        }\n\n    init {\n        initFromXML(attrs)\n        isRtlLayout = Locale.getDefault().layoutDirection == LAYOUT_DIRECTION_RTL\n    }\n\n    private fun initFromXML(attr: AttributeSet?) {\n        context.obtainStyledAttributes(attr, R.styleable.GraphView).use { a ->\n            primaryLineColor = a.getColor(\n                R.styleable.GraphView_primaryLineColor,\n                MaterialColors.getColor(this, materialR.attr.colorPrimary)\n            )\n\n            secondaryLineColor = a.getColor(\n                R.styleable.GraphView_secondaryLineColor,\n                context.getColor(R.color.warning_color)\n            )\n\n            lineWidth = a.getDimension(\n                R.styleable.GraphView_lineWidth,\n                context.resources.getDimension(R.dimen.graph_line_thickness)\n            )\n\n            graphColor = a.getColor(\n                R.styleable.GraphView_graphColor,\n                context.getColor(R.color.colorBackground)\n            )\n\n            metaColor = a.getColor(\n                R.styleable.GraphView_metaColor,\n                context.getColor(R.color.dividerColor)\n            )\n\n            proportionalTrending = a.getBoolean(\n                R.styleable.GraphView_proportionalTrending,\n                proportionalTrending\n            )\n        }\n\n        primaryLinePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {\n            color = primaryLineColor\n            strokeWidth = lineWidth\n            style = Paint.Style.STROKE\n        }\n\n        primaryCirclePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {\n            color = primaryLineColor\n            style = Paint.Style.FILL\n        }\n\n        secondaryLinePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {\n            color = secondaryLineColor\n            strokeWidth = lineWidth\n            style = Paint.Style.STROKE\n        }\n\n        secondaryCirclePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {\n            color = secondaryLineColor\n            style = Paint.Style.FILL\n        }\n\n        graphPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {\n            color = graphColor\n        }\n\n        metaPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {\n            color = metaColor\n            strokeWidth = 0f\n            style = Paint.Style.STROKE\n        }\n    }\n\n    private fun initializeVertices() {\n        sizeRect = Rect(0, 0, width, height)\n\n        initLine(primaryLineData, primaryLinePath)\n        initLine(secondaryLineData, secondaryLinePath)\n    }\n\n    private fun initLine(lineData: List<Long>, path: Path) {\n        val max = if (proportionalTrending) {\n            maxTrendingValue\n        } else {\n            max(primaryLineData.max(), 1)\n        }\n        val mainRatio = height.toFloat() / max.toFloat()\n\n        val ratioedData = lineData.map { it.toFloat() * mainRatio }\n\n        val pointDistance = dataSpacing(ratioedData)\n\n        /** X coord of the start of this path segment */\n        var startX = 0F\n\n        /** Y coord of the start of this path segment */\n        var startY = 0F\n\n        /** X coord of the end of this path segment */\n        var endX: Float\n\n        /** Y coord of the end of this path segment */\n        var endY: Float\n\n        /** X coord of bezier control point #1 */\n        var controlX1: Float\n\n        /** X coord of bezier control point #2 */\n        var controlX2: Float\n\n        // Draw cubic bezier curves between each pair of points.\n        ratioedData.forEachIndexed { index, magnitude ->\n            val x = pointDistance * index.toFloat()\n            val y = height.toFloat() - magnitude\n\n            if (index == 0) {\n                path.reset()\n                path.moveTo(x, y)\n                startX = x\n                startY = y\n            } else {\n                endX = x\n                endY = y\n\n                // X-coord for a control point is placed one third of the distance between the\n                // two points.\n                val offsetX = (endX - startX) / 3\n                controlX1 = startX + offsetX\n                controlX2 = endX - offsetX\n                path.cubicTo(controlX1, startY, controlX2, endY, x, y)\n\n                startX = x\n                startY = y\n            }\n        }\n    }\n\n    private fun dataSpacing(data: List<Any>) = width.toFloat() / max(data.size - 1, 1).toFloat()\n\n    override fun onDraw(canvas: Canvas) {\n        super.onDraw(canvas)\n\n        if (primaryLinePath.isEmpty && width > 0) {\n            initializeVertices()\n        }\n\n        canvas.apply {\n            drawRect(sizeRect, graphPaint)\n\n            val pointDistance = dataSpacing(primaryLineData)\n\n            // Vertical tick marks\n            for (i in 0 until primaryLineData.size + 1) {\n                drawLine(\n                    i * pointDistance,\n                    height.toFloat(),\n                    i * pointDistance,\n                    height - (height.toFloat() / 20),\n                    metaPaint\n                )\n            }\n\n            // X-axis\n            drawLine(0f, height.toFloat(), width.toFloat(), height.toFloat(), metaPaint)\n\n            // Data lines\n            drawLine(\n                canvas = canvas,\n                linePath = secondaryLinePath,\n                linePaint = secondaryLinePaint,\n                circlePaint = secondaryCirclePaint,\n                lineThickness = lineWidth,\n            )\n            drawLine(\n                canvas = canvas,\n                linePath = primaryLinePath,\n                linePaint = primaryLinePaint,\n                circlePaint = primaryCirclePaint,\n                lineThickness = lineWidth\n            )\n        }\n    }\n\n    private fun drawLine(\n        canvas: Canvas,\n        linePath: Path,\n        linePaint: Paint,\n        circlePaint: Paint,\n        lineThickness: Float\n    ) {\n        canvas.apply {\n            drawPath(\n                linePath,\n                linePaint\n            )\n\n            val pm = PathMeasure(linePath, false)\n\n            val dotPosition = if (isRtlLayout) 0f else pm.length\n\n            val coord = floatArrayOf(0f, 0f)\n            pm.getPosTan(dotPosition, coord, null)\n\n            drawCircle(coord[0], coord[1], lineThickness * 2f, circlePaint)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/view/HashtagPickerDialog.kt",
    "content": "/* Copyright 2025 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\n@file:JvmName(\"HashTagPickerDialog\")\n\npackage com.keylesspalace.tusky.view\n\nimport android.content.Context\nimport android.util.Log\nimport android.view.KeyEvent\nimport android.view.LayoutInflater\nimport android.view.WindowManager\nimport android.view.inputmethod.EditorInfo\nimport android.widget.TextView\nimport android.widget.TextView.OnEditorActionListener\nimport androidx.annotation.StringRes\nimport androidx.appcompat.app.AlertDialog\nimport androidx.core.widget.doOnTextChanged\nimport at.connyduck.calladapter.networkresult.fold\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.keylesspalace.tusky.components.compose.ComposeAutoCompleteAdapter\nimport com.keylesspalace.tusky.components.search.SearchType\nimport com.keylesspalace.tusky.databinding.DialogPickHashtagBinding\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.hashtagPattern\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.runBlocking\n\nfun Context.showHashtagPickerDialog(\n    api: MastodonApi,\n    @StringRes title: Int,\n    onHashtagSelected: (String) -> Unit\n) {\n    val dialogScope = CoroutineScope(Dispatchers.Main)\n    val dialogBinding = DialogPickHashtagBinding.inflate(LayoutInflater.from(this))\n    val autocompleteTextView = dialogBinding.pickHashtagEditText\n\n    val autoCompleteProvider = object : ComposeAutoCompleteAdapter.AutocompletionProvider {\n        override fun search(token: String): List<ComposeAutoCompleteAdapter.AutocompleteResult> {\n            return runBlocking {\n                api.search(query = token, type = SearchType.Hashtag.apiParameter, limit = 5)\n                    .fold({ searchResult ->\n                        searchResult.hashtags.map {\n                            ComposeAutoCompleteAdapter.AutocompleteResult.HashtagResult(\n                                it.name\n                            )\n                        }\n                    }, { e ->\n                        Log.e(\"HashtagPickerDialog\", \"Autocomplete search for $token failed\", e)\n                        emptyList()\n                    })\n            }\n        }\n    }\n\n    autocompleteTextView.setAdapter(\n        ComposeAutoCompleteAdapter(\n            autoCompleteProvider,\n            animateAvatar = false,\n            animateEmojis = false,\n            showBotBadge = false,\n            withDecoration = false\n        )\n    )\n\n    autocompleteTextView.setSelection(autocompleteTextView.length())\n\n    val dialog = MaterialAlertDialogBuilder(this)\n        .setTitle(title)\n        .setView(dialogBinding.root)\n        .setPositiveButton(android.R.string.ok) { _, _ ->\n            onHashtagSelected(autocompleteTextView.text.toString())\n        }\n        .setNegativeButton(android.R.string.cancel, null)\n        .setOnDismissListener {\n            dialogScope.cancel()\n        }\n        .create()\n\n    autocompleteTextView.doOnTextChanged { s, _, _, _ ->\n        dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = validateHashtag(s)\n    }\n\n    autocompleteTextView.setOnEditorActionListener(object : OnEditorActionListener {\n        override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean {\n            if (actionId == EditorInfo.IME_ACTION_DONE && validateHashtag(autocompleteTextView.text)) {\n                onHashtagSelected(autocompleteTextView.text.toString())\n                dialog.dismiss()\n                return true\n            }\n            return false\n        }\n    })\n\n    dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)\n    dialog.show()\n    dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = validateHashtag(autocompleteTextView.text)\n    autocompleteTextView.requestFocus()\n}\n\nprivate fun validateHashtag(input: CharSequence?): Boolean {\n    val trimmedInput = input?.trim() ?: \"\"\n    return trimmedInput.isNotEmpty() && hashtagPattern.matcher(trimmedInput).matches()\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/view/LicenseCard.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.view\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport androidx.core.content.res.use\nimport com.google.android.material.R as materialR\nimport com.google.android.material.card.MaterialCardView\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.CardLicenseBinding\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.openLink\n\nclass LicenseCard\n@JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = materialR.attr.materialCardViewFilledStyle\n) : MaterialCardView(context, attrs, defStyleAttr) {\n\n    init {\n        val binding = CardLicenseBinding.inflate(LayoutInflater.from(context), this)\n\n        val (name, license, link) = context.theme.obtainStyledAttributes(\n            attrs,\n            R.styleable.LicenseCard,\n            0,\n            0\n        ).use { a ->\n            Triple(\n                a.getString(R.styleable.LicenseCard_name),\n                a.getString(R.styleable.LicenseCard_license),\n                a.getString(R.styleable.LicenseCard_link)\n            )\n        }\n\n        binding.licenseCardName.text = name\n        binding.licenseCardLicense.text = license\n        if (link.isNullOrBlank()) {\n            binding.licenseCardLink.hide()\n        } else {\n            binding.licenseCardLink.text = link\n            setOnClickListener { context.openLink(link) }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/view/MediaPreviewImageView.kt",
    "content": "/* Copyright 2018 Jochem Raat <jchmrt@riseup.net>\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\npackage com.keylesspalace.tusky.view\n\nimport android.content.Context\nimport android.graphics.Matrix\nimport android.graphics.drawable.Drawable\nimport android.util.AttributeSet\nimport androidx.appcompat.widget.AppCompatImageView\nimport com.bumptech.glide.load.DataSource\nimport com.bumptech.glide.load.engine.GlideException\nimport com.bumptech.glide.request.RequestListener\nimport com.bumptech.glide.request.target.Target\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.util.FocalPointUtil\n\n/**\n * This is an extension of the standard android ImageView, which makes sure to update the custom\n * matrix when its size changes if a focal point is set.\n *\n * If a focal point is set on this view, it will use the FocalPointUtil to update the image\n * matrix each time the size of the view is changed. This is needed to ensure that the correct\n * cropping is maintained.\n *\n * However if there is no focal point set (e.g. it is null), then this view should simply\n * act exactly the same as an ordinary android ImageView.\n */\nopen class MediaPreviewImageView\n@JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = 0\n) : AppCompatImageView(context, attrs, defStyleAttr), RequestListener<Drawable> {\n    private var focus: Attachment.Focus? = null\n    private var focalMatrix: Matrix? = null\n\n    /**\n     * Set the focal point for this view.\n     */\n    fun setFocalPoint(focus: Attachment.Focus?) {\n        this.focus = focus\n        super.setScaleType(ScaleType.MATRIX)\n\n        if (focalMatrix == null) {\n            focalMatrix = Matrix()\n        }\n    }\n\n    /**\n     * Remove the focal point from this view (if there was one).\n     */\n    fun removeFocalPoint() {\n        super.setScaleType(ScaleType.CENTER_CROP)\n        focus = null\n    }\n\n    /**\n     * Overridden getScaleType method which returns CENTER_CROP if we have a focal point set.\n     *\n     * This is necessary because the Android transitions framework tries to copy the scale type\n     * from this view to the PhotoView when animating between this view and the detailed view of\n     * the image. Since the PhotoView does not support a MATRIX scale type, the app would crash\n     * if we simply passed that on, so instead we pretend that CENTER_CROP is still used here\n     * even if we have a focus point set.\n     */\n    override fun getScaleType(): ScaleType {\n        return if (focus != null) {\n            ScaleType.CENTER_CROP\n        } else {\n            super.getScaleType()\n        }\n    }\n\n    /**\n     * Overridden setScaleType method which only accepts the new type if we don't have a focal\n     * point set.\n     *\n     */\n    override fun setScaleType(type: ScaleType) {\n        if (focus != null) {\n            super.setScaleType(ScaleType.MATRIX)\n        } else {\n            super.setScaleType(type)\n        }\n    }\n\n    override fun onLoadFailed(\n        e: GlideException?,\n        model: Any?,\n        target: Target<Drawable>,\n        isFirstResource: Boolean\n    ): Boolean {\n        return false\n    }\n\n    override fun onResourceReady(\n        resource: Drawable,\n        model: Any,\n        target: Target<Drawable>?,\n        dataSource: DataSource,\n        isFirstResource: Boolean\n    ): Boolean {\n        recalculateMatrix(width, height, resource)\n        return false\n    }\n\n    /**\n     * Called when the size of the view changes, it calls the FocalPointUtil to update the\n     * matrix if we have a set focal point. It then reassigns the matrix to this imageView.\n     */\n    override fun onSizeChanged(width: Int, height: Int, oldWidth: Int, oldHeight: Int) {\n        recalculateMatrix(width, height, drawable)\n\n        super.onSizeChanged(width, height, oldWidth, oldHeight)\n    }\n\n    private fun recalculateMatrix(width: Int, height: Int, drawable: Drawable?) {\n        if (drawable != null && focus != null && focalMatrix != null) {\n            scaleType = ScaleType.MATRIX\n            FocalPointUtil.updateFocalPointMatrix(\n                width.toFloat(),\n                height.toFloat(),\n                drawable.intrinsicWidth.toFloat(),\n                drawable.intrinsicHeight.toFloat(),\n                focus as Attachment.Focus,\n                focalMatrix as Matrix\n            )\n            imageMatrix = focalMatrix\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/view/MediaPreviewLayout.kt",
    "content": "package com.keylesspalace.tusky.view\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.LinearLayout\nimport android.widget.TextView\nimport com.keylesspalace.tusky.R\nimport kotlin.math.roundToInt\n\n/**\n * Lays out a set of [MediaPreviewImageView]s keeping their aspect ratios into account.\n */\nclass MediaPreviewLayout(context: Context, attrs: AttributeSet? = null) :\n    ViewGroup(context, attrs) {\n\n    private val spacing = context.resources.getDimensionPixelOffset(R.dimen.preview_image_spacing)\n\n    /**\n     * An ordered list of aspect ratios used for layout. An image view for each aspect ratio passed\n     * will be attached. Supports up to 4, additional ones will be ignored.\n     */\n    var aspectRatios: List<Double> = emptyList()\n        set(value) {\n            field = value\n            attachImageViews()\n        }\n\n    private val imageViewCache = Array(4) {\n        LayoutInflater.from(context).inflate(R.layout.item_image_preview_overlay, this, false)\n    }\n\n    private var measuredOrientation = LinearLayout.VERTICAL\n\n    private fun attachImageViews() {\n        removeAllViews()\n        for (i in 0 until aspectRatios.size.coerceAtMost(imageViewCache.size)) {\n            addView(imageViewCache[i])\n        }\n    }\n\n    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {\n        val width = MeasureSpec.getSize(widthMeasureSpec)\n        val halfWidth = width / 2 - spacing / 2\n        var totalHeight = 0\n\n        when (childCount) {\n            1 -> {\n                val aspect = aspectRatios[0]\n                totalHeight += getChildAt(0).measureToAspect(width, aspect)\n            }\n            2 -> {\n                val aspect1 = aspectRatios[0]\n                val aspect2 = aspectRatios[1]\n\n                if ((aspect1 + aspect2) / 2 > 1.2) {\n                    // stack vertically\n                    measuredOrientation = LinearLayout.VERTICAL\n                    totalHeight += getChildAt(0).measureToAspect(width, aspect1.coerceAtLeast(1.8))\n                    totalHeight += spacing\n                    totalHeight += getChildAt(1).measureToAspect(width, aspect2.coerceAtLeast(1.8))\n                } else {\n                    // stack horizontally\n                    measuredOrientation = LinearLayout.HORIZONTAL\n                    val height = rowHeight(halfWidth, aspect1, aspect2)\n                    totalHeight += height\n                    getChildAt(0).measureExactly(halfWidth, height)\n                    getChildAt(1).measureExactly(halfWidth, height)\n                }\n            }\n            3 -> {\n                val aspect1 = aspectRatios[0]\n                val aspect2 = aspectRatios[1]\n                val aspect3 = aspectRatios[2]\n                if (aspect1 >= 1) {\n                    // |     1     |\n                    // -------------\n                    // |  2  |  3  |\n                    measuredOrientation = LinearLayout.VERTICAL\n                    totalHeight += getChildAt(0).measureToAspect(width, aspect1.coerceAtLeast(1.8))\n                    totalHeight += spacing\n                    val bottomHeight = rowHeight(halfWidth, aspect2, aspect3)\n                    totalHeight += bottomHeight\n                    getChildAt(1).measureExactly(halfWidth, bottomHeight)\n                    getChildAt(2).measureExactly(halfWidth, bottomHeight)\n                } else {\n                    // |     |  2  |\n                    // |  1  |-----|\n                    // |     |  3  |\n                    measuredOrientation = LinearLayout.HORIZONTAL\n                    val colHeight = getChildAt(0).measureToAspect(halfWidth, aspect1)\n                    totalHeight += colHeight\n                    val halfHeight = colHeight / 2 - spacing / 2\n                    getChildAt(1).measureExactly(halfWidth, halfHeight)\n                    getChildAt(2).measureExactly(halfWidth, halfHeight)\n                }\n            }\n            4 -> {\n                val aspect1 = aspectRatios[0]\n                val aspect2 = aspectRatios[1]\n                val aspect3 = aspectRatios[2]\n                val aspect4 = aspectRatios[3]\n                val topHeight = rowHeight(halfWidth, aspect1, aspect2)\n                totalHeight += topHeight\n                getChildAt(0).measureExactly(halfWidth, topHeight)\n                getChildAt(1).measureExactly(halfWidth, topHeight)\n                totalHeight += spacing\n                val bottomHeight = rowHeight(halfWidth, aspect3, aspect4)\n                totalHeight += bottomHeight\n                getChildAt(2).measureExactly(halfWidth, bottomHeight)\n                getChildAt(3).measureExactly(halfWidth, bottomHeight)\n            }\n        }\n\n        super.onMeasure(\n            widthMeasureSpec,\n            MeasureSpec.makeMeasureSpec(totalHeight, MeasureSpec.EXACTLY)\n        )\n    }\n\n    override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {\n        val width = r - l\n        val height = b - t\n        val halfWidth = width / 2 - spacing / 2\n        when (childCount) {\n            1 -> {\n                getChildAt(0).layout(0, 0, width, height)\n            }\n            2 -> {\n                if (measuredOrientation == LinearLayout.VERTICAL) {\n                    val y = imageViewCache[0].measuredHeight\n                    getChildAt(0).layout(0, 0, width, y)\n                    getChildAt(1).layout(\n                        0,\n                        y + spacing,\n                        width,\n                        y + spacing + getChildAt(1).measuredHeight\n                    )\n                } else {\n                    getChildAt(0).layout(0, 0, halfWidth, height)\n                    getChildAt(1).layout(halfWidth + spacing, 0, width, height)\n                }\n            }\n            3 -> {\n                if (measuredOrientation == LinearLayout.VERTICAL) {\n                    val y = getChildAt(0).measuredHeight\n                    getChildAt(0).layout(0, 0, width, y)\n                    getChildAt(1).layout(0, y + spacing, halfWidth, height)\n                    getChildAt(2).layout(halfWidth + spacing, y + spacing, width, height)\n                } else {\n                    val colHeight = getChildAt(0).measuredHeight\n                    getChildAt(0).layout(0, 0, halfWidth, colHeight)\n                    val halfHeight = colHeight / 2 - spacing / 2\n                    getChildAt(1).layout(halfWidth + spacing, 0, width, halfHeight)\n                    getChildAt(2).layout(\n                        halfWidth + spacing,\n                        halfHeight + spacing,\n                        width,\n                        colHeight\n                    )\n                }\n            }\n            4 -> {\n                val topHeight = (getChildAt(0).measuredHeight + getChildAt(1).measuredHeight) / 2\n                getChildAt(0).layout(0, 0, halfWidth, topHeight)\n                getChildAt(1).layout(halfWidth + spacing, 0, width, topHeight)\n                val bottomHeight =\n                    (imageViewCache[2].measuredHeight + imageViewCache[3].measuredHeight) / 2\n                getChildAt(2).layout(\n                    0,\n                    topHeight + spacing,\n                    halfWidth,\n                    topHeight + spacing + bottomHeight\n                )\n                getChildAt(3).layout(\n                    halfWidth + spacing,\n                    topHeight + spacing,\n                    width,\n                    topHeight + spacing + bottomHeight\n                )\n            }\n        }\n    }\n\n    inline fun forEachIndexed(action: (Int, MediaPreviewImageView, TextView) -> Unit) {\n        for (index in 0 until childCount) {\n            val wrapper = getChildAt(index)\n            action(\n                index,\n                wrapper.findViewById(R.id.preview_image_view),\n                wrapper.findViewById(R.id.preview_media_description_indicator)\n            )\n        }\n    }\n}\n\nprivate fun rowHeight(halfWidth: Int, aspect1: Double, aspect2: Double): Int {\n    return ((halfWidth / aspect1 + halfWidth / aspect2) / 2).roundToInt()\n}\n\nprivate fun View.measureToAspect(width: Int, aspect: Double): Int {\n    val height = (width / aspect).roundToInt()\n    measureExactly(width, height)\n    return height\n}\n\nprivate fun View.measureExactly(width: Int, height: Int) {\n    measure(\n        View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY),\n        View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY)\n    )\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/view/MuteAccountDialog.kt",
    "content": "@file:JvmName(\"MuteAccountDialog\")\n\npackage com.keylesspalace.tusky.view\n\nimport android.app.Activity\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.DialogMuteAccountBinding\n\nfun showMuteAccountDialog(\n    activity: Activity,\n    accountUsername: String,\n    onOk: (notifications: Boolean, duration: Int?) -> Unit\n) {\n    val binding = DialogMuteAccountBinding.inflate(activity.layoutInflater)\n    binding.warning.text = activity.getString(R.string.dialog_mute_warning, accountUsername)\n    binding.checkbox.isChecked = true\n\n    val durationLabels = activity.resources.getStringArray(R.array.mute_duration_names)\n    binding.durationDropDown.setSimpleItems(durationLabels)\n\n    var selectedDurationIndex = 0\n    binding.durationDropDown.setOnItemClickListener { _, _, position, _ ->\n        selectedDurationIndex = position\n    }\n    binding.durationDropDown.setText(durationLabels[selectedDurationIndex], false)\n\n    MaterialAlertDialogBuilder(activity)\n        .setView(binding.root)\n        .setPositiveButton(android.R.string.ok) { _, _ ->\n            val durationValues = activity.resources.getIntArray(R.array.mute_duration_values)\n\n            // workaround to make indefinite muting work with Mastodon 3.3.0\n            // https://github.com/tuskyapp/Tusky/issues/2107\n            val duration = if (selectedDurationIndex == 0) {\n                null\n            } else {\n                durationValues[selectedDurationIndex]\n            }\n\n            onOk(binding.checkbox.isChecked, duration)\n        }\n        .setNegativeButton(android.R.string.cancel, null)\n        .show()\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/view/SliderPreference.kt",
    "content": "package com.keylesspalace.tusky.view\n\nimport android.content.Context\nimport android.content.res.TypedArray\nimport android.graphics.drawable.Drawable\nimport android.util.AttributeSet\nimport androidx.appcompat.content.res.AppCompatResources\nimport androidx.preference.Preference\nimport androidx.preference.PreferenceViewHolder\nimport com.google.android.material.slider.LabelFormatter.LABEL_GONE\nimport com.google.android.material.slider.Slider\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.databinding.PrefSliderBinding\nimport com.keylesspalace.tusky.util.hide\nimport com.keylesspalace.tusky.util.show\nimport java.lang.Float.max\nimport java.lang.Float.min\n\n/**\n * Slider preference\n *\n * Similar to [androidx.preference.SeekBarPreference], but better because:\n *\n * - Uses a [Slider] instead of a [android.widget.SeekBar]. Slider supports float values, and step sizes\n *   other than 1.\n * - Displays the currently selected value in the Preference's summary, for consistency\n *   with platform norms.\n * - Icon buttons can be displayed at the start/end of the slider. Pressing them will\n *   increment/decrement the slider by `stepSize`.\n * - User can supply a custom formatter to format the summary value\n */\nclass SliderPreference @JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null,\n    defStyleAttr: Int = androidx.preference.R.attr.preferenceStyle,\n    defStyleRes: Int = 0\n) : Preference(context, attrs, defStyleAttr, defStyleRes),\n    Slider.OnChangeListener,\n    Slider.OnSliderTouchListener {\n\n    /** Backing property for `value` */\n    private var _value = 0F\n\n    /**\n     * @see Slider.getValue\n     * @see Slider.setValue\n     */\n    var value: Float = DEFAULT_VALUE\n        get() = _value\n        set(v) {\n            val clamped = max(max(v, valueFrom), min(v, valueTo))\n            if (clamped == field) return\n            _value = clamped\n            persistFloat(v)\n            notifyChanged()\n        }\n\n    /** @see Slider.setValueFrom */\n    var valueFrom: Float\n\n    /** @see Slider.setValueTo */\n    var valueTo: Float\n\n    /** @see Slider.setStepSize */\n    var stepSize: Float\n\n    /**\n     * Format string to be applied to values before setting the summary. For more control set\n     * [SliderPreference.formatter]\n     */\n    var format: String = DEFAULT_FORMAT\n\n    /**\n     * Function that will be used to format the summary. The default formatter formats using the\n     * value of the [SliderPreference.format] property.\n     */\n    var formatter: (Float) -> String = { format.format(it) }\n\n    /**\n     * Optional icon to show in a button at the start of the slide. If non-null the button is\n     * shown. Clicking the button decrements the value by one step.\n     */\n    var decrementIcon: Drawable? = null\n\n    /**\n     * Optional icon to show in a button at the end of the slider. If non-null the button is\n     * shown. Clicking the button increments the value by one step.\n     */\n    var incrementIcon: Drawable? = null\n\n    /** View binding */\n    private lateinit var binding: PrefSliderBinding\n\n    init {\n        // Using `widgetLayoutResource` here would be incorrect, as that tries to put the entire\n        // preference layout to the right of the title and summary.\n        layoutResource = R.layout.pref_slider\n\n        val a = context.obtainStyledAttributes(\n            attrs,\n            R.styleable.SliderPreference,\n            defStyleAttr,\n            defStyleRes\n        )\n\n        value = a.getFloat(R.styleable.SliderPreference_android_value, DEFAULT_VALUE)\n        valueFrom = a.getFloat(R.styleable.SliderPreference_android_valueFrom, DEFAULT_VALUE_FROM)\n        valueTo = a.getFloat(R.styleable.SliderPreference_android_valueTo, DEFAULT_VALUE_TO)\n        stepSize = a.getFloat(R.styleable.SliderPreference_android_stepSize, DEFAULT_STEP_SIZE)\n        format = a.getString(R.styleable.SliderPreference_format) ?: DEFAULT_FORMAT\n\n        val decrementIconResource = a.getResourceId(R.styleable.SliderPreference_iconStart, -1)\n        if (decrementIconResource != -1) {\n            decrementIcon = AppCompatResources.getDrawable(context, decrementIconResource)\n        }\n\n        val incrementIconResource = a.getResourceId(R.styleable.SliderPreference_iconEnd, -1)\n        if (incrementIconResource != -1) {\n            incrementIcon = AppCompatResources.getDrawable(context, incrementIconResource)\n        }\n\n        a.recycle()\n    }\n\n    override fun onGetDefaultValue(a: TypedArray, i: Int): Any {\n        return a.getFloat(i, DEFAULT_VALUE)\n    }\n\n    override fun onSetInitialValue(defaultValue: Any?) {\n        value = getPersistedFloat((defaultValue ?: DEFAULT_VALUE) as Float)\n    }\n\n    override fun onBindViewHolder(holder: PreferenceViewHolder) {\n        super.onBindViewHolder(holder)\n        binding = PrefSliderBinding.bind(holder.itemView)\n\n        binding.root.isClickable = false\n\n        binding.slider.clearOnChangeListeners()\n        binding.slider.clearOnSliderTouchListeners()\n        binding.slider.addOnChangeListener(this)\n        binding.slider.addOnSliderTouchListener(this)\n        binding.slider.value = value // sliderValue\n        binding.slider.valueTo = valueTo\n        binding.slider.valueFrom = valueFrom\n        binding.slider.stepSize = stepSize\n\n        // Disable the label, the value is shown in the preference summary\n        binding.slider.labelBehavior = LABEL_GONE\n        binding.slider.isEnabled = isEnabled\n\n        binding.summary.show()\n        binding.summary.text = formatter(value)\n\n        decrementIcon?.let { icon ->\n            binding.decrement.icon = icon\n            binding.decrement.show()\n            binding.decrement.setOnClickListener {\n                value -= stepSize\n            }\n        } ?: binding.decrement.hide()\n\n        incrementIcon?.let { icon ->\n            binding.increment.icon = icon\n            binding.increment.show()\n            binding.increment.setOnClickListener {\n                value += stepSize\n            }\n        } ?: binding.increment.hide()\n    }\n\n    override fun onValueChange(slider: Slider, value: Float, fromUser: Boolean) {\n        if (!fromUser) return\n        binding.summary.text = formatter(value)\n    }\n\n    override fun onStartTrackingTouch(slider: Slider) {\n        // Deliberately empty\n    }\n\n    override fun onStopTrackingTouch(slider: Slider) {\n        value = slider.value\n    }\n\n    companion object {\n        private const val TAG = \"SliderPreference\"\n        private const val DEFAULT_VALUE_FROM = 0F\n        private const val DEFAULT_VALUE_TO = 1F\n        private const val DEFAULT_VALUE = 0.5F\n        private const val DEFAULT_STEP_SIZE = 0.1F\n        private const val DEFAULT_FORMAT = \"%3.1f\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/view/TuskySwipeRefreshLayout.kt",
    "content": "/* Copyright 2024 Tusky contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\npackage com.keylesspalace.tusky.view\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout\nimport com.google.android.material.R as materialR\nimport com.google.android.material.color.MaterialColors\n\n/**\n * SwipeRefreshLayout does not allow theming of the color scheme,\n * so we use this class to still have a single point to change its colors.\n */\nclass TuskySwipeRefreshLayout @JvmOverloads constructor(\n    context: Context,\n    attrs: AttributeSet? = null\n) : SwipeRefreshLayout(context, attrs) {\n\n    init {\n        setColorSchemeColors(\n            MaterialColors.getColor(this, materialR.attr.colorPrimary)\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/viewdata/AttachmentViewData.kt",
    "content": "/* Copyright 2022 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.viewdata\n\nimport android.os.Parcelable\nimport com.keylesspalace.tusky.entity.Attachment\nimport kotlinx.parcelize.IgnoredOnParcel\nimport kotlinx.parcelize.Parcelize\n\n@Parcelize\ndata class AttachmentViewData(\n    val attachment: Attachment,\n    val statusId: String,\n    val statusUrl: String,\n    val sensitive: Boolean,\n    val isRevealed: Boolean\n) : Parcelable {\n\n    @IgnoredOnParcel\n    val id = attachment.id\n\n    companion object {\n        @JvmStatic\n        fun list(\n            status: StatusViewData.Concrete,\n            alwaysShowSensitiveMedia: Boolean = false\n        ): List<AttachmentViewData> {\n            return status.attachments.map { attachment ->\n                AttachmentViewData(\n                    attachment = attachment,\n                    statusId = status.actionableId,\n                    statusUrl = status.actionable.url!!,\n                    sensitive = status.actionable.sensitive,\n                    isRevealed = alwaysShowSensitiveMedia || !status.actionable.sensitive\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/viewdata/NotificationViewData.kt",
    "content": "/* Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\npackage com.keylesspalace.tusky.viewdata\n\nimport com.keylesspalace.tusky.entity.AccountWarning\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.entity.RelationshipSeveranceEvent\nimport com.keylesspalace.tusky.entity.Report\nimport com.keylesspalace.tusky.entity.TimelineAccount\n\nsealed class NotificationViewData {\n\n    abstract val id: String\n\n    abstract fun asStatusOrNull(): StatusViewData.Concrete?\n    abstract fun asPlaceholderOrNull(): LoadMore?\n\n    data class Concrete(\n        override val id: String,\n        val type: Notification.Type,\n        val account: TimelineAccount,\n        val statusViewData: StatusViewData.Concrete?,\n        val report: Report?,\n        val event: RelationshipSeveranceEvent?,\n        val moderationWarning: AccountWarning?\n    ) : NotificationViewData() {\n        override fun asStatusOrNull() = statusViewData\n\n        override fun asPlaceholderOrNull() = null\n    }\n\n    data class LoadMore(\n        override val id: String,\n        val isLoading: Boolean\n    ) : NotificationViewData() {\n        override fun asStatusOrNull() = null\n\n        override fun asPlaceholderOrNull() = this\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/viewdata/PollViewData.kt",
    "content": "/* Copyright 2019 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.viewdata\n\nimport android.content.Context\nimport android.text.Spannable\nimport android.text.SpannableStringBuilder\nimport android.text.Spanned\nimport android.text.style.DynamicDrawableSpan\nimport android.text.style.ImageSpan\nimport android.widget.TextView\nimport androidx.appcompat.content.res.AppCompatResources\nimport androidx.core.text.parseAsHtml\nimport com.google.android.material.color.MaterialColors\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.entity.Poll\nimport com.keylesspalace.tusky.entity.PollOption\nimport java.util.Date\nimport kotlin.math.roundToInt\n\ndata class PollViewData(\n    val id: String,\n    val expiresAt: Date?,\n    val expired: Boolean,\n    val multiple: Boolean,\n    val votesCount: Int,\n    val votersCount: Int?,\n    val options: List<PollOptionViewData>,\n    var voted: Boolean\n)\n\ndata class PollOptionViewData(\n    val title: String,\n    var votesCount: Int,\n    var selected: Boolean,\n    var voted: Boolean\n)\n\nfun calculatePercent(fraction: Int?, totalVoters: Int?, totalVotes: Int): Int {\n    return if (fraction == null || fraction == 0) {\n        0\n    } else {\n        val total = totalVoters ?: totalVotes\n        (fraction / total.toDouble() * 100).roundToInt()\n    }\n}\n\nfun buildDescription(title: String, percent: Int, voted: Boolean, context: Context, textView: TextView? = null): Spanned {\n    val builder =\n        SpannableStringBuilder(\n            context.getString(R.string.poll_percent_format, percent).parseAsHtml()\n        )\n    if (voted) {\n        builder.append(\" ✓ \")\n\n        if (textView != null) {\n            val size = (textView.textSize * 1.1).toInt()\n            val drawable = AppCompatResources.getDrawable(context, R.drawable.ic_check_circle_24dp)!!\n            drawable.setBounds(0, 0, size, size)\n            drawable.setTint(MaterialColors.getColor(textView, android.R.attr.textColorPrimary))\n            builder.setSpan(ImageSpan(drawable, DynamicDrawableSpan.ALIGN_CENTER), builder.length - 2, builder.length - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n        }\n    } else {\n        builder.append(\" \")\n    }\n    return builder.append(title)\n}\n\nfun Poll?.toViewData(): PollViewData? {\n    if (this == null) return null\n    return PollViewData(\n        id = id,\n        expiresAt = expiresAt,\n        expired = expired,\n        multiple = multiple,\n        votesCount = votesCount,\n        votersCount = votersCount,\n        options = options.mapIndexed { index, option ->\n            option.toViewData(\n                ownVotes.contains(index)\n            )\n        },\n        voted = voted\n    )\n}\n\nfun PollOption.toViewData(voted: Boolean): PollOptionViewData {\n    return PollOptionViewData(\n        title = title,\n        votesCount = votesCount ?: 0,\n        selected = false,\n        voted = voted\n    )\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/viewdata/StatusViewData.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\npackage com.keylesspalace.tusky.viewdata\n\nimport android.text.Spanned\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.entity.TimelineAccount\nimport com.keylesspalace.tusky.entity.Translation\nimport com.keylesspalace.tusky.util.parseAsMastodonHtml\nimport com.keylesspalace.tusky.util.shouldTrimStatus\n\nsealed interface TranslationViewData {\n    val data: Translation?\n\n    data class Loaded(override val data: Translation) : TranslationViewData\n\n    data object Loading : TranslationViewData {\n        override val data: Translation?\n            get() = null\n    }\n}\n\n/**\n * Created by charlag on 11/07/2017.\n *\n * Class to represent data required to display either a notification or a placeholder.\n * It is either a [StatusViewData.Concrete] or a [StatusViewData.LoadMore].\n */\nsealed class StatusViewData {\n    abstract val id: String\n    var filter: Filter? = null\n\n    data class Concrete(\n        val status: Status,\n        val isExpanded: Boolean,\n        val isShowingContent: Boolean,\n        /**\n         * Specifies whether the content of this post is currently limited in visibility to the first\n         * 500 characters or not.\n         *\n         * @return Whether the post is collapsed or fully expanded.\n         */\n        val isCollapsed: Boolean,\n        val isDetailed: Boolean = false,\n        val repliedToAccount: TimelineAccount? = null,\n        val translation: TranslationViewData? = null,\n    ) : StatusViewData() {\n        override val id: String\n            get() = status.id\n\n        val content: Spanned =\n            (translation?.data?.content ?: actionable.content).parseAsMastodonHtml()\n\n        val attachments: List<Attachment> =\n            actionable.attachments.translated { translation -> map { it.translated(translation) } }\n\n        val spoilerText: String =\n            actionable.spoilerText.translated { translation -> translation.spoilerText ?: this }\n\n        val poll = actionable.poll?.translated { translation ->\n            val translatedOptionsText = translation.poll?.options?.map { option ->\n                option.title\n            } ?: return@translated this\n            val translatedOptions = options.zip(translatedOptionsText) { option, translatedText ->\n                option.copy(title = translatedText)\n            }\n            copy(options = translatedOptions)\n        }\n\n        /**\n         * Specifies whether the content of this post is long enough to be automatically\n         * collapsed or if it should show all content regardless.\n         * Translated posts only show the button if the original post had it as well.\n         *\n         * @return Whether the post is collapsible or never collapsed.\n         */\n        val isCollapsible: Boolean = shouldTrimStatus(this.content) &&\n            (translation == null || shouldTrimStatus(actionable.content.parseAsMastodonHtml()))\n\n        val actionable: Status\n            get() = status.actionableStatus\n\n        val actionableId: String\n            get() = status.actionableStatus.id\n\n        val rebloggedAvatar: String?\n            get() = if (status.reblog != null) {\n                status.account.avatar\n            } else {\n                null\n            }\n\n        val rebloggingStatus: Status?\n            get() = if (status.reblog != null) status else null\n\n        val isReply: Boolean\n            get() = status.inReplyToAccountId != null\n\n        val isSelfReply: Boolean\n            get() = status.inReplyToAccountId == status.account.id\n\n        /** Helper for Java */\n        fun copyWithCollapsed(isCollapsed: Boolean): Concrete {\n            return copy(isCollapsed = isCollapsed)\n        }\n\n        private fun Attachment.translated(translation: Translation): Attachment {\n            val translatedDescription =\n                translation.mediaAttachments.find { it.id == id }?.description\n                    ?: return this\n            return copy(description = translatedDescription)\n        }\n\n        private inline fun <T> T.translated(mapper: T.(Translation) -> T): T =\n            if (translation is TranslationViewData.Loaded) {\n                mapper(translation.data)\n            } else {\n                this\n            }\n    }\n\n    data class LoadMore(\n        override val id: String,\n        val isLoading: Boolean\n    ) : StatusViewData()\n\n    fun asStatusOrNull() = this as? Concrete\n\n    fun asPlaceholderOrNull() = this as? LoadMore\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/viewdata/TrendingViewData.kt",
    "content": "/* Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.viewdata\n\nimport java.util.Date\n\nsealed interface TrendingViewData {\n    val id: String\n\n    data class Header(\n        val start: Date,\n        val end: Date\n    ) : TrendingViewData {\n        override val id: String = start.toString() + end.toString()\n    }\n\n    data class Tag(\n        val name: String,\n        val usage: List<Long>,\n        val accounts: List<Long>,\n        val maxTrendingValue: Long\n    ) : TrendingViewData {\n        override val id: String = name\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/viewmodel/AccountsInListViewModel.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.viewmodel\n\nimport android.util.Log\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport at.connyduck.calladapter.networkresult.fold\nimport at.connyduck.calladapter.networkresult.getOrDefault\nimport com.keylesspalace.tusky.entity.TimelineAccount\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.withoutFirstWhich\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.flow.update\nimport kotlinx.coroutines.launch\n\ndata class State(\n    val accounts: Result<List<TimelineAccount>>,\n    val searchResult: List<TimelineAccount>?\n)\n\n@HiltViewModel\nclass AccountsInListViewModel @Inject constructor(private val api: MastodonApi) : ViewModel() {\n\n    val state: Flow<State> get() = _state\n    private val _state = MutableStateFlow(\n        State(\n            accounts = Result.success(emptyList()),\n            searchResult = null\n        )\n    )\n\n    fun load(listId: String) {\n        val state = _state.value\n        if (state.accounts.isFailure || state.accounts.getOrThrow().isEmpty()) {\n            viewModelScope.launch {\n                val accounts = api.getAccountsInList(listId, 0)\n                _state.update { it.copy(accounts = accounts.toResult()) }\n            }\n        }\n    }\n\n    fun addAccountToList(listId: String, account: TimelineAccount) {\n        viewModelScope.launch {\n            api.addAccountToList(listId, listOf(account.id))\n                .fold(\n                    onSuccess = {\n                        _state.update { state ->\n                            state.copy(accounts = state.accounts.map { it + account })\n                        }\n                    },\n                    onFailure = {\n                        Log.i(\n                            AccountsInListViewModel::class.java.simpleName,\n                            \"Failed to add account to list: ${account.username}\"\n                        )\n                    }\n                )\n        }\n    }\n\n    fun deleteAccountFromList(listId: String, accountId: String) {\n        viewModelScope.launch {\n            api.deleteAccountFromList(listId, listOf(accountId))\n                .fold(\n                    onSuccess = {\n                        _state.update { state ->\n                            state.copy(\n                                accounts = state.accounts.map { accounts ->\n                                    accounts.withoutFirstWhich { it.id == accountId }\n                                }\n                            )\n                        }\n                    },\n                    onFailure = {\n                        Log.i(\n                            AccountsInListViewModel::class.java.simpleName,\n                            \"Failed to remove account from list: $accountId\"\n                        )\n                    }\n                )\n        }\n    }\n\n    private val currentQuery = MutableStateFlow(\"\")\n\n    fun search(query: String) {\n        currentQuery.value = query\n    }\n\n    init {\n        viewModelScope.launch {\n            // Use collectLatest to automatically cancel the previous search\n            currentQuery.collectLatest { query ->\n                val searchResult = when {\n                    query.isEmpty() -> null\n                    query.isBlank() -> emptyList()\n                    else -> api.searchAccounts(query, null, 10, true)\n                        .getOrDefault(emptyList())\n                }\n                _state.update { it.copy(searchResult = searchResult) }\n            }\n        }\n    }\n\n    private fun <T> NetworkResult<T>.toResult(): Result<T> = fold(\n        onSuccess = { Result.success(it) },\n        onFailure = { Result.failure(it) }\n    )\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/viewmodel/EditProfileViewModel.kt",
    "content": "/* Copyright 2018 Conny Duck\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.viewmodel\n\nimport android.app.Application\nimport android.net.Uri\nimport android.util.Log\nimport androidx.core.net.toUri\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport at.connyduck.calladapter.networkresult.fold\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.ProfileEditedEvent\nimport com.keylesspalace.tusky.components.instanceinfo.InstanceInfo\nimport com.keylesspalace.tusky.components.instanceinfo.InstanceInfoRepository\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.entity.Account\nimport com.keylesspalace.tusky.entity.StringField\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.Error\nimport com.keylesspalace.tusky.util.Loading\nimport com.keylesspalace.tusky.util.Resource\nimport com.keylesspalace.tusky.util.Success\nimport com.keylesspalace.tusky.util.getServerErrorMessage\nimport com.keylesspalace.tusky.util.randomAlphanumericString\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport java.io.File\nimport javax.inject.Inject\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.asFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport kotlinx.coroutines.flow.shareIn\nimport kotlinx.coroutines.launch\nimport okhttp3.MediaType.Companion.toMediaTypeOrNull\nimport okhttp3.MultipartBody\nimport okhttp3.RequestBody.Companion.asRequestBody\nimport okhttp3.RequestBody.Companion.toRequestBody\n\nprivate const val HEADER_FILE_NAME = \"header.png\"\nprivate const val AVATAR_FILE_NAME = \"avatar.png\"\n\ninternal data class ProfileDataInUi(\n    val displayName: String,\n    val note: String,\n    val locked: Boolean,\n    val fields: List<StringField>\n)\n\n@HiltViewModel\nclass EditProfileViewModel @Inject constructor(\n    private val mastodonApi: MastodonApi,\n    private val eventHub: EventHub,\n    private val application: Application,\n    private val accountManager: AccountManager,\n    instanceInfoRepo: InstanceInfoRepository\n) : ViewModel() {\n\n    private val activeAccount = accountManager.activeAccount!!\n\n    private val _profileData = MutableStateFlow(null as Resource<Account>?)\n    val profileData: StateFlow<Resource<Account>?> = _profileData.asStateFlow()\n\n    private val _avatarData = MutableStateFlow(null as Uri?)\n    val avatarData: StateFlow<Uri?> = _avatarData.asStateFlow()\n\n    private val _headerData = MutableStateFlow(null as Uri?)\n    val headerData: StateFlow<Uri?> = _headerData.asStateFlow()\n\n    private val _saveData = MutableStateFlow(null as Resource<Nothing>?)\n    val saveData: StateFlow<Resource<Nothing>?> = _saveData.asStateFlow()\n\n    val instanceData: Flow<InstanceInfo> = instanceInfoRepo::getUpdatedInstanceInfoOrFallback.asFlow()\n        .shareIn(viewModelScope, SharingStarted.Eagerly, replay = 1)\n\n    private val _isChanged = MutableStateFlow(false)\n    val isChanged = _isChanged.asStateFlow()\n\n    private var apiProfileAccount: Account? = null\n\n    fun obtainProfile() = viewModelScope.launch {\n        if (_profileData.value == null || _profileData.value is Error) {\n            _profileData.value = Loading()\n\n            mastodonApi.accountVerifyCredentials().fold(\n                { profile ->\n                    apiProfileAccount = profile\n                    _profileData.value = Success(profile)\n                },\n                {\n                    _profileData.value = Error()\n                }\n            )\n        }\n    }\n\n    fun getAvatarUri() = getCacheFileForName(AVATAR_FILE_NAME).toUri()\n\n    fun getHeaderUri() = getCacheFileForName(HEADER_FILE_NAME).toUri()\n\n    fun newAvatarPicked() {\n        _avatarData.value = getAvatarUri()\n    }\n\n    fun newHeaderPicked() {\n        _headerData.value = getHeaderUri()\n    }\n\n    internal fun dataChanged(newProfileData: ProfileDataInUi) {\n        _isChanged.value = getProfileDiff(apiProfileAccount, newProfileData).hasChanges()\n    }\n\n    internal fun save(newProfileData: ProfileDataInUi) {\n        if (_saveData.value is Loading || _profileData.value !is Success) {\n            return\n        }\n\n        _saveData.value = Loading()\n\n        val diff = getProfileDiff(apiProfileAccount, newProfileData)\n        if (!diff.hasChanges()) {\n            // if nothing has changed, there is no need to make an api call\n            _saveData.value = Success()\n            return\n        }\n\n        viewModelScope.launch {\n            val avatarFileBody: MultipartBody.Part? = diff.avatarFile?.let {\n                MultipartBody.Part.createFormData(\n                    \"avatar\",\n                    randomAlphanumericString(12),\n                    it.asRequestBody(\"image/png\".toMediaTypeOrNull())\n                )\n            }\n\n            val headerFileBody: MultipartBody.Part? = diff.headerFile?.let {\n                MultipartBody.Part.createFormData(\n                    \"header\",\n                    randomAlphanumericString(12),\n                    it.asRequestBody(\"image/png\".toMediaTypeOrNull())\n                )\n            }\n\n            val fieldsMap = diff.fields?.let { fields ->\n                buildMap {\n                    fields.forEachIndexed { index, field ->\n                        put(\"fields_attributes[$index][name]\", field.name.toRequestBody(MultipartBody.FORM))\n                        put(\"fields_attributes[$index][value]\", field.value.toRequestBody(MultipartBody.FORM))\n                    }\n                }\n            }.orEmpty()\n\n            mastodonApi.accountUpdateCredentials(\n                displayName = diff.displayName?.toRequestBody(MultipartBody.FORM),\n                note = diff.note?.toRequestBody(MultipartBody.FORM),\n                locked = diff.locked?.toString()?.toRequestBody(MultipartBody.FORM),\n                avatar = avatarFileBody,\n                header = headerFileBody,\n                fields = fieldsMap\n            ).fold(\n                { newAccountData ->\n                    accountManager.updateAccount(activeAccount, newAccountData)\n                    eventHub.dispatch(ProfileEditedEvent(newAccountData))\n                    _saveData.value = Success()\n                },\n                { throwable ->\n                    Log.d(TAG, \"failed updating profile\", throwable)\n                    _saveData.value = Error(errorMessage = throwable.getServerErrorMessage())\n                }\n            )\n        }\n    }\n\n    // cache activity state for rotation change\n    internal fun updateProfile(newProfileData: ProfileDataInUi) {\n        if (_profileData.value is Success) {\n            val newProfileSource = _profileData.value?.data?.source?.copy(\n                note = newProfileData.note,\n                fields = newProfileData.fields\n            )\n            val newProfile = _profileData.value?.data?.copy(\n                displayName = newProfileData.displayName,\n                locked = newProfileData.locked,\n                source = newProfileSource\n            )\n\n            _profileData.value = Success(newProfile)\n        }\n    }\n\n    private fun getProfileDiff(\n        oldProfileAccount: Account?,\n        newProfileData: ProfileDataInUi\n    ): DiffProfileData {\n        val displayName = if (oldProfileAccount?.displayName == newProfileData.displayName) {\n            null\n        } else {\n            newProfileData.displayName\n        }\n\n        val note = if (oldProfileAccount?.source?.note == newProfileData.note) {\n            null\n        } else {\n            newProfileData.note\n        }\n\n        val locked = if (oldProfileAccount?.locked == newProfileData.locked) {\n            null\n        } else {\n            newProfileData.locked\n        }\n\n        val avatarFile = if (_avatarData.value != null) {\n            getCacheFileForName(AVATAR_FILE_NAME)\n        } else {\n            null\n        }\n\n        val headerFile = if (_headerData.value != null) {\n            getCacheFileForName(HEADER_FILE_NAME)\n        } else {\n            null\n        }\n\n        // when one field changed, all have to be sent or they unchanged ones would get overridden\n        val fields = if (oldProfileAccount?.source?.fields == newProfileData.fields) {\n            null\n        } else {\n            newProfileData.fields\n        }\n\n        return DiffProfileData(displayName, note, locked, fields, headerFile, avatarFile)\n    }\n\n    private fun getCacheFileForName(filename: String): File {\n        return File(application.cacheDir, filename)\n    }\n\n    private data class DiffProfileData(\n        val displayName: String?,\n        val note: String?,\n        val locked: Boolean?,\n        val fields: List<StringField>?,\n        val headerFile: File?,\n        val avatarFile: File?\n    ) {\n        fun hasChanges() = displayName != null || note != null || locked != null ||\n            avatarFile != null || headerFile != null || fields != null\n    }\n\n    companion object {\n        private const val TAG = \"EditProfileViewModel\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/viewmodel/ListsViewModel.kt",
    "content": "/* Copyright 2017 Andrew Dawson\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport at.connyduck.calladapter.networkresult.fold\nimport com.keylesspalace.tusky.entity.MastoList\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.replacedFirstWhich\nimport com.keylesspalace.tusky.util.withoutFirstWhich\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport java.io.IOException\nimport java.net.ConnectException\nimport javax.inject.Inject\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharedFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.asSharedFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport kotlinx.coroutines.launch\n\n@HiltViewModel\ninternal class ListsViewModel @Inject constructor(private val api: MastodonApi) : ViewModel() {\n    enum class LoadingState {\n        INITIAL,\n        LOADING,\n        LOADED,\n        ERROR_NETWORK,\n        ERROR_OTHER\n    }\n\n    enum class Event {\n        CREATE_ERROR,\n        DELETE_ERROR,\n        UPDATE_ERROR\n    }\n\n    data class State(val lists: List<MastoList>, val loadingState: LoadingState)\n\n    private val _state = MutableStateFlow(State(listOf(), LoadingState.INITIAL))\n    val state: StateFlow<State> = _state.asStateFlow()\n\n    private val _events = MutableSharedFlow<Event>(\n        replay = 0,\n        extraBufferCapacity = 1,\n        onBufferOverflow = BufferOverflow.DROP_OLDEST\n    )\n    val events: SharedFlow<Event> = _events.asSharedFlow()\n\n    fun retryLoading() {\n        loadIfNeeded()\n    }\n\n    private fun loadIfNeeded() {\n        val state = _state.value\n        if (state.loadingState == LoadingState.LOADING || state.lists.isNotEmpty()) return\n        updateState {\n            copy(loadingState = LoadingState.LOADING)\n        }\n\n        viewModelScope.launch {\n            api.getLists().fold(\n                { lists ->\n                    updateState {\n                        copy(\n                            lists = lists,\n                            loadingState = LoadingState.LOADED\n                        )\n                    }\n                },\n                { err ->\n                    updateState {\n                        copy(\n                            loadingState = if (err is IOException || err is ConnectException) {\n                                LoadingState.ERROR_NETWORK\n                            } else {\n                                LoadingState.ERROR_OTHER\n                            }\n                        )\n                    }\n                }\n            )\n        }\n    }\n\n    fun createNewList(listName: String, exclusive: Boolean, replyPolicy: String) {\n        viewModelScope.launch {\n            api.createList(listName, exclusive, replyPolicy).fold(\n                { list ->\n                    updateState {\n                        copy(lists = lists + list)\n                    }\n                },\n                {\n                    sendEvent(Event.CREATE_ERROR)\n                }\n            )\n        }\n    }\n\n    fun updateList(listId: String, listName: String, exclusive: Boolean, replyPolicy: String) {\n        viewModelScope.launch {\n            api.updateList(listId, listName, exclusive, replyPolicy).fold(\n                { list ->\n                    updateState {\n                        copy(lists = lists.replacedFirstWhich(list) { it.id == listId })\n                    }\n                },\n                {\n                    sendEvent(Event.UPDATE_ERROR)\n                }\n            )\n        }\n    }\n\n    fun deleteList(listId: String) {\n        viewModelScope.launch {\n            api.deleteList(listId).fold(\n                {\n                    updateState {\n                        copy(lists = lists.withoutFirstWhich { it.id == listId })\n                    }\n                },\n                {\n                    sendEvent(Event.DELETE_ERROR)\n                }\n            )\n        }\n    }\n\n    private inline fun updateState(fn: State.() -> State) {\n        _state.value = fn(_state.value)\n    }\n\n    private suspend fun sendEvent(event: Event) {\n        _events.emit(event)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/worker/NotificationWorker.kt",
    "content": "/*\n * Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.worker\n\nimport android.app.Notification\nimport android.content.Context\nimport androidx.hilt.work.HiltWorker\nimport androidx.work.CoroutineWorker\nimport androidx.work.ForegroundInfo\nimport androidx.work.WorkerParameters\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.systemnotifications.NotificationFetcher\nimport com.keylesspalace.tusky.components.systemnotifications.NotificationService\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedInject\n\n@HiltWorker\nclass NotificationWorker @AssistedInject constructor(\n    @Assisted appContext: Context,\n    @Assisted params: WorkerParameters,\n    private val notificationsFetcher: NotificationFetcher,\n    notificationService: NotificationService,\n) : CoroutineWorker(appContext, params) {\n    val notification: Notification = notificationService.createWorkerNotification(\n        R.string.notification_notification_worker\n    )\n\n    override suspend fun doWork(): Result {\n        val accountId = inputData.getLong(KEY_ACCOUNT_ID, 0).takeIf { it != 0L }\n        notificationsFetcher.fetchAndShow(accountId)\n        return Result.success()\n    }\n\n    override suspend fun getForegroundInfo() = ForegroundInfo(\n        NotificationService.NOTIFICATION_ID_FETCH_NOTIFICATION,\n        notification\n    )\n\n    companion object {\n        const val KEY_ACCOUNT_ID = \"accountId\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/keylesspalace/tusky/worker/PruneCacheWorker.kt",
    "content": "/*\n * Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.worker\n\nimport android.app.Notification\nimport android.content.Context\nimport android.util.Log\nimport androidx.hilt.work.HiltWorker\nimport androidx.work.CoroutineWorker\nimport androidx.work.ForegroundInfo\nimport androidx.work.WorkerParameters\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.systemnotifications.NotificationService\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.DatabaseCleaner\nimport com.keylesspalace.tusky.util.deleteStaleCachedMedia\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedInject\n\n/** Prune the database cache of old statuses. */\n@HiltWorker\nclass PruneCacheWorker @AssistedInject constructor(\n    @Assisted private val appContext: Context,\n    @Assisted workerParams: WorkerParameters,\n    private val databaseCleaner: DatabaseCleaner,\n    private val accountManager: AccountManager,\n    val notificationService: NotificationService,\n) : CoroutineWorker(appContext, workerParams) {\n    val notification: Notification = notificationService.createWorkerNotification(\n        R.string.notification_prune_cache\n    )\n\n    override suspend fun doWork(): Result {\n        for (account in accountManager.accounts) {\n            Log.d(TAG, \"Pruning database using account ID: ${account.id}\")\n            databaseCleaner.cleanupOldData(account.id, MAX_HOMETIMELINE_ITEMS_IN_CACHE, MAX_NOTIFICATIONS_IN_CACHE)\n        }\n\n        deleteStaleCachedMedia(appContext.getExternalFilesDir(\"Tusky\"))\n\n        return Result.success()\n    }\n\n    override suspend fun getForegroundInfo() = ForegroundInfo(\n        NotificationService.NOTIFICATION_ID_PRUNE_CACHE,\n        notification\n    )\n\n    companion object {\n        private const val TAG = \"PruneCacheWorker\"\n        private const val MAX_HOMETIMELINE_ITEMS_IN_CACHE = 1000\n        private const val MAX_NOTIFICATIONS_IN_CACHE = 1000\n        const val PERIODIC_WORK_TAG = \"PruneCacheWorker_periodic\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/res/anim/activity_close_enter.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shareInterpolator=\"false\">\n    <!--\n        No-op.\n\n        If we had extend we could do a bit of a fancy translate but without it it we will have a\n        weird gap at the gap of the screen.\n\n        We put no-op alpha translation because otherwise Android will compose the other part of the\n        transition over the black background.\n    -->\n    <alpha\n        android:fromAlpha=\"1.0\"\n        android:toAlpha=\"1.0\"\n        android:fillEnabled=\"true\"\n        android:fillBefore=\"true\"\n        android:fillAfter=\"true\"\n        android:interpolator=\"@android:anim/linear_interpolator\"\n        android:startOffset=\"0\"\n        android:duration=\"450\" />\n</set>\n"
  },
  {
    "path": "app/src/main/res/anim/activity_close_exit.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shareInterpolator=\"false\"\n    android:zAdjustment=\"top\">\n    <alpha\n        android:fromAlpha=\"1.0\"\n        android:toAlpha=\"0.0\"\n        android:fillEnabled=\"true\"\n        android:fillBefore=\"true\"\n        android:fillAfter=\"true\"\n        android:interpolator=\"@android:anim/linear_interpolator\"\n        android:startOffset=\"35\"\n        android:duration=\"83\" />\n\n    <translate\n        android:fromXDelta=\"0\"\n        android:toXDelta=\"10%\"\n        android:fillEnabled=\"true\"\n        android:fillBefore=\"true\"\n        android:fillAfter=\"true\"\n        android:interpolator=\"@anim/fast_out_extra_slow_in\"\n        android:startOffset=\"0\"\n        android:duration=\"450\" />\n\n</set>\n"
  },
  {
    "path": "app/src/main/res/anim/activity_open_enter.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shareInterpolator=\"false\">\n    <alpha\n        android:fromAlpha=\"0.0\"\n        android:toAlpha=\"1.0\"\n        android:fillEnabled=\"true\"\n        android:fillBefore=\"true\"\n        android:fillAfter=\"true\"\n        android:interpolator=\"@android:anim/linear_interpolator\"\n        android:startOffset=\"50\"\n        android:duration=\"83\" />\n\n    <translate\n        android:fromXDelta=\"10%\"\n        android:toXDelta=\"0\"\n        android:fillEnabled=\"true\"\n        android:fillBefore=\"true\"\n        android:fillAfter=\"true\"\n        android:interpolator=\"@anim/fast_out_extra_slow_in\"\n        android:duration=\"450\" />\n\n</set>\n"
  },
  {
    "path": "app/src/main/res/anim/activity_open_exit.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shareInterpolator=\"false\">\n    <!--\n        No-op.\n\n        If we had extend we could do a bit of a fancy translate but without it it we will have a\n        weird gap at the gap of the screen.\n\n        We put no-op alpha translation because otherwise Android will compose the other part of the\n        transition over the black background.\n    -->\n    <alpha\n        android:fromAlpha=\"1.0\"\n        android:toAlpha=\"1.0\"\n        android:fillEnabled=\"true\"\n        android:fillBefore=\"true\"\n        android:fillAfter=\"true\"\n        android:interpolator=\"@android:anim/linear_interpolator\"\n        android:startOffset=\"0\"\n        android:duration=\"450\" />\n</set>\n"
  },
  {
    "path": "app/src/main/res/anim/fast_out_extra_slow_in.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2017 The Android Open Source Project\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  -->\n<pathInterpolator xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:pathData=\"M 0,0 C 0.05, 0, 0.133333, 0.06, 0.166666, 0.4 C 0.208333, 0.82, 0.25, 1, 1, 1\"/>\n"
  },
  {
    "path": "app/src/main/res/color/account_tab_font_color.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_pressed=\"false\" android:color=\"?android:attr/textColorPrimary\"/>\n    <item android:state_pressed=\"true\" android:color=\"?android:attr/textColorTertiary\"/>\n</selector>"
  },
  {
    "path": "app/src/main/res/color/color_background_transparent_60.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:alpha=\"0.6\" android:color=\"?android:colorBackground\" />\n</selector>\n"
  },
  {
    "path": "app/src/main/res/color/compound_button_color.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_checked=\"false\" android:color=\"?android:attr/textColorTertiary\"/>\n    <item android:state_checked=\"true\" android:color=\"?attr/colorPrimary\"/>\n</selector>\n"
  },
  {
    "path": "app/src/main/res/color/selectable_chip_background.xml",
    "content": "<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- Disabled -->\n    <item android:color=\"@android:color/transparent\" android:state_enabled=\"false\"/>\n\n    <!-- Selected -->\n    <item android:color=\"?attr/colorPrimary\" android:alpha=\"0.4\" android:state_selected=\"true\"/>\n    <item android:color=\"?attr/colorPrimary\" android:alpha=\"0.4\" android:state_checked=\"true\"/>\n\n    <!-- Not selected -->\n    <item android:color=\"?attr/colorSurface\" />\n</selector>\n"
  },
  {
    "path": "app/src/main/res/color/text_input_layout_box_stroke_color.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_focused=\"false\" android:color=\"?android:attr/textColorTertiary\"/>\n    <item android:state_focused=\"true\" android:color=\"?attr/colorPrimary\"/>\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/audio_file_preview.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"18dp\"\n    android:height=\"18dp\"\n    android:viewportWidth=\"720\"\n    android:viewportHeight=\"720\">\n  <path\n      android:pathData=\"m80,0c-22,0 -40.82,7.85 -56.48,23.52C7.85,39.18 0,58 0,80v560c0,22 7.85,40.82 23.52,56.48C39.18,712.15 58,720 80,720h560c22,0 40.82,-7.85 56.48,-23.52C712.15,680.82 720,662 720,640v-560c0,-22 -7.85,-40.82 -23.52,-56.48C680.82,7.85 662,0 640,0ZM383.44,148.75h93.91c6.65,0 12.22,2.22 16.72,6.72 4.5,4.5 6.8,10.07 6.8,16.72v46.95c0,6.65 -2.3,12.22 -6.8,16.72 -4.5,4.5 -10.07,6.8 -16.72,6.8h-70.39v234.69c0,25.82 -9.19,47.94 -27.58,66.33 -18.39,18.39 -40.51,27.58 -66.33,27.58 -25.82,0 -47.94,-9.19 -66.33,-27.58 -18.39,-18.39 -27.58,-40.51 -27.58,-66.33 0,-25.82 9.19,-47.94 27.58,-66.33 18.39,-18.39 40.51,-27.58 66.33,-27.58 9,0 17.29,1.13 24.92,3.28 7.63,2.15 14.99,5.38 22.03,9.69L360,172.19c0,-6.65 2.22,-12.22 6.72,-16.72 4.5,-4.5 10.07,-6.72 16.72,-6.72z\"\n      android:fillColor=\"?android:textColorTertiary\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/avatar_border.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"?android:attr/windowBackground\" />\n    <corners android:radius=\"7dp\"/>\n    <size android:height=\"52dp\" android:width=\"52dp\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/avatar_default.xml",
    "content": "<vector android:height=\"48dp\" android:viewportHeight=\"211.66667\"\n    android:viewportWidth=\"211.66666\" android:width=\"48dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillAlpha=\"1\" android:fillColor=\"#d9e1e8\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M25,0L186.667,0A25,25 0,0 1,211.667 25L211.667,186.667A25,25 0,0 1,186.667 211.667L25,211.667A25,25 0,0 1,0 186.667L0,25A25,25 0,0 1,25 0z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#00000000\"\n        android:strokeLineCap=\"round\" android:strokeLineJoin=\"round\" android:strokeWidth=\"0\"/>\n    <path android:fillAlpha=\"0.58823529\" android:fillColor=\"#9baec8\"\n        android:pathData=\"m139.619,113.342c11.68,3.648 12.384,9.062 22.905,-0.907 3.562,-4.085 4.005,-9.454 5.288,-12.341 4.894,-11.009 12.569,-15.71 14.896,-27.12 0.473,-16.199 -8.335,-26.588 -23.586,-29.709 -9.33,-0.806 -18.486,1.531 -27.214,11.566z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#00000000\"\n        android:strokeLineCap=\"butt\" android:strokeLineJoin=\"miter\" android:strokeWidth=\"0.26458332\"/>\n    <path android:fillAlpha=\"1\" android:fillColor=\"#c1cddb\"\n        android:pathData=\"m134.413,117.765c2.949,9.48 5.755,17.442 13.38,21.545 -2.306,1.694 -3.931,1.584 -6.237,1.814 -8.544,-1.912 -13.79,-5.54 -19.617,-11.679z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#c1cddb\"\n        android:strokeLineCap=\"round\" android:strokeLineJoin=\"round\" android:strokeWidth=\"3.5\"/>\n    <path android:fillAlpha=\"0.58823529\" android:fillColor=\"#9baec8\"\n        android:pathData=\"m72.047,113.342c-11.68,3.648 -12.384,9.062 -22.905,-0.907 -3.562,-4.085 -4.005,-9.454 -5.288,-12.341 -4.894,-11.009 -12.569,-15.71 -14.896,-27.12 -0.473,-16.199 8.335,-26.588 23.586,-29.709 9.33,-0.806 18.486,1.531 27.214,11.566z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#00000000\"\n        android:strokeLineCap=\"butt\" android:strokeLineJoin=\"miter\" android:strokeWidth=\"0.26458332\"/>\n    <path android:fillAlpha=\"1\" android:fillColor=\"#c1cddb\"\n        android:pathData=\"m76.129,117.765c-2.949,9.48 -5.755,17.442 -13.38,21.545 2.306,1.694 3.931,1.584 6.237,1.814 8.544,-1.912 13.79,-5.54 19.617,-11.679z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#c1cddb\"\n        android:strokeLineCap=\"round\" android:strokeLineJoin=\"round\" android:strokeWidth=\"3.5\"/>\n    <path android:fillAlpha=\"1\" android:fillColor=\"#a3b6cf\"\n        android:pathData=\"m105.498,44.172c18.166,0.996 32.248,10.811 37.76,31.977 1.938,10.481 1.118,21.686 -1.814,33.111 -3.378,10.226 -10.89,17.88 -19.05,24.493 -1.178,7.925 -1.131,7.769 -3.402,12.587 -7.086,13.578 -15.673,16.75 -22.34,19.91 -6.719,1.966 -12.521,2.096 -18.358,2.298l0.217,-13.364c2.802,-0.375 5.681,-0.362 8.197,-2.165 2.206,-1.549 3.108,-3.358 3.823,-5.205 1.404,-4.981 1.316,-8.966 -0,-12.133 -9.521,-6.272 -17.6,-16.195 -20.978,-26.42 -2.932,-11.425 -3.752,-22.63 -1.814,-33.111 5.511,-21.166 19.594,-30.981 37.76,-31.977z\"\n        android:strokeAlpha=\"0\" android:strokeColor=\"#00000000\"\n        android:strokeLineCap=\"butt\" android:strokeLineJoin=\"miter\" android:strokeWidth=\"0.26458332\"/>\n    <path android:fillColor=\"#00000000\"\n        android:pathData=\"m77.382,102.118c4.822,-10.083 12.948,-7.83 15.866,0.15\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#7c95b6\"\n        android:strokeLineCap=\"round\" android:strokeLineJoin=\"miter\" android:strokeWidth=\"2.08333325\"/>\n    <path android:fillColor=\"#00000000\"\n        android:pathData=\"m134.619,102.118c-4.822,-10.083 -12.948,-7.83 -15.866,0.15\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#7c95b6\"\n        android:strokeLineCap=\"round\" android:strokeLineJoin=\"miter\" android:strokeWidth=\"2.08333325\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/background_dialog_activity.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<inset xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:insetTop=\"@dimen/dialog_activity_vertical_inset\"\n    android:insetBottom=\"@dimen/dialog_activity_vertical_inset\">\n    <shape>\n        <corners android:radius=\"16dp\" />\n        <solid android:color=\"?android:attr/colorBackground\" />\n    </shape>\n</inset>\n"
  },
  {
    "path": "app/src/main/res/drawable/badge_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <corners android:radius=\"6dp\" />\n    <solid android:color=\"?attr/colorPrimary\" />\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable/bot_badge.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\nandroid:width=\"24dp\"\nandroid:height=\"24dp\"\nandroid:viewportWidth=\"24\"\nandroid:viewportHeight=\"24\">\n<path\n    android:pathData=\"M5.741,0L18.259,0A5.741,5.741 0,0 1,24 5.741L24,18.259A5.741,5.741 0,0 1,18.259 24L5.741,24A5.741,5.741 0,0 1,0 18.259L0,5.741A5.741,5.741 0,0 1,5.741 0z\"\n    android:fillColor=\"@color/botBadgeBackground\"\n    android:fillAlpha=\"0.75\"/>\n<path\n    android:pathData=\"m5.574,20.262q-0.757,0 -1.297,-0.539Q3.738,19.183 3.738,18.426l0,-9.18q0,-2.295 1.607,-3.902 1.607,-1.607 3.902,-1.607l5.508,0q2.295,0 3.902,1.607 1.607,1.607 1.607,3.902l0,9.18q0,0.757 -0.539,1.297Q19.183,20.262 18.426,20.262ZM5.574,18.426l12.852,0l0,-9.18q0,-1.515 -1.079,-2.593 -1.079,-1.079 -2.593,-1.079L9.246,5.574q-1.515,0 -2.593,1.079 -1.079,1.079 -1.079,2.593zM9.246,12q-0.757,0 -1.297,-0.539Q7.41,10.921 7.41,10.164q0,-0.757 0.539,-1.297 0.539,-0.539 1.297,-0.539 0.757,0 1.297,0.539 0.539,0.539 0.539,1.297 0,0.757 -0.539,1.297Q10.003,12 9.246,12ZM14.754,12q-0.757,0 -1.297,-0.539Q12.918,10.921 12.918,10.164q0,-0.757 0.539,-1.297 0.539,-0.539 1.297,-0.539 0.757,0 1.297,0.539 0.539,0.539 0.539,1.297 0,0.757 -0.539,1.297Q15.511,12 14.754,12ZM7.41,18.426l0,-1.836q0,-0.757 0.539,-1.297Q8.489,14.754 9.246,14.754l5.508,0q0.757,0 1.297,0.539 0.539,0.539 0.539,1.297l0,1.836l-1.836,0l0,-1.836l-1.836,0l0,1.836l-1.836,0l0,-1.836l-1.836,0l0,1.836zM5.574,18.426l12.852,0z\"\n    android:fillColor=\"@color/botBadgeForeground\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/card_image_placeholder.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"48dp\"\n    android:height=\"48dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"?android:attr/textColorTertiary\"\n        android:pathData=\"M6,2A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6M6,4H13V9H18V20H6V4M8,12V14H16V12H8M8,16V18H13V16H8Z\" />\n</vector>"
  },
  {
    "path": "app/src/main/res/drawable/conversation_thread_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <size android:width=\"4dp\" />\n    <solid android:color=\"?attr/dividerColor\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/description_bg_expanded.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <corners\n        android:topLeftRadius=\"6dp\"\n        android:topRightRadius=\"6dp\" />\n    <stroke\n        android:color=\"?attr/colorOutline\"\n        android:width=\"1dp\" />\n    <solid android:color=\"?attr/colorSurface\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/dialog_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<inset xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:insetLeft=\"16dp\"\n    android:insetTop=\"16dp\"\n    android:insetRight=\"16dp\"\n    android:insetBottom=\"16dp\">\n    <shape android:shape=\"rectangle\">\n        <corners android:radius=\"?attr/dialogCornerRadius\" />\n        <solid android:color=\"@color/colorBackground\" />\n    </shape>\n</inset>\n"
  },
  {
    "path": "app/src/main/res/drawable/elephant_friend.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"160dp\"\n    android:height=\"178dp\"\n    android:viewportWidth=\"520\"\n    android:viewportHeight=\"580\">\n  <path\n      android:pathData=\"M464.58,257.93c9,-0.87 16.14,-4.1 22.16,-9.94 0.35,-0.35 0.6,-0.8 0.9,-1.17 2.6,-3.1 4.94,-7.18 9.7,-6 8.63,2.17 9.46,19.48 8.04,27.45 -2.27,12.7 -15.7,28.74 -32.62,35.6 -12.25,4.96 -24.58,7.38 -37.55,7.56 -3.2,0.05 -5.85,1.06 -7.62,3.62 -11.13,16.1 -27.1,24.06 -45.85,27.12 -4.9,0.8 -6.02,2.84 -6.35,7.64 -1.16,16.88 4.23,31.18 14.22,44.6 7.1,9.5 12.35,20.34 19.04,30.18 10.18,14.96 17.16,31.45 23.9,48.05 2.45,6 3.75,12.48 5.46,18.75 2.57,9.45 -3.48,19.32 -14.44,25.83 -12.1,7.18 -25.26,10.55 -39.16,10.48 -5.64,-0.02 -9.43,3.12 -13.65,5.57 -3.18,1.85 -6,4.53 -8.57,7.23 -12.92,13.6 -28.9,20.17 -47.43,21.3 -8.83,0.53 -59.78,16.9 -123.24,8.78 -21.94,-2.82 -46.9,-7.1 -65.27,-15.48 -13.75,-6.3 -34.63,-21.73 -39.26,-36 -1.2,-3.7 -1.98,-3.43 -4.3,-2.18 -7.3,3.93 -15.16,4.83 -23.26,4.33 -14.96,-0.9 -26.27,-7.77 -33.72,-20.9 -5.6,-9.83 -9.05,-20.23 -8.48,-31.68 0.1,-2.2 -1.33,-2.7 -2.8,-3.43 -4.3,-2.08 -7.4,-5.33 -9.3,-9.68 -2.25,-5.15 -1.1,-8.83 3.95,-11.24 2.32,-1.1 2.5,-2.5 2.26,-4.65 -0.88,-8.4 2.67,-14.56 9.92,-18.62 6.56,-3.68 12.47,-1.43 14.5,5.84 1.18,4.23 2.5,6.9 7.75,6.54 4.86,-0.33 8.34,2.58 9.86,7.3 1.4,4.3 -1.13,10.6 -5.2,13.4 -1.88,1.28 -3.72,2.73 -5.8,3.6 -4.46,1.84 -4.5,5.17 -3.25,8.88 1.77,5.3 4.23,10.28 7.58,14.76 4.47,6 12.88,6.42 17.92,0.98 4.64,-5 5.95,-10.86 5.1,-17.6 -1.64,-13.3 -1.74,-26.68 0.23,-40 1.1,-7.43 3.4,-14.64 5.9,-21.7 7.34,-20.78 14.77,-41.55 30.63,-57.9 4.12,-4.24 8.4,-8.16 13.42,-11.32 1.3,-0.84 3.36,-1.62 0.95,-3.5 -6.4,-5.02 -7.04,-12.57 -8.6,-19.7 -0.43,-1.9 -0.85,-3.86 -0.8,-5.8 0.05,-3.8 -1,-6.2 -5.08,-7.56 -3.14,-1.04 -3.9,-4.64 -4,-7.85 -0.75,-23.95 4.8,-46.1 17.6,-66.64 10.64,-17.05 21.42,-33.95 33.88,-49.72 2.43,-3.07 5.1,-6.94 8.3,-9.25 2.47,-2.42 4.02,-5.3 3.25,-9.43 -2.45,-13.18 -4.05,-25.76 -2.9,-38.73 1.16,-12.8 12.96,-25.3 28.64,-18.68 2.1,0.88 3.03,-0.28 3.8,-1.85 5.56,-11.32 25.42,-26.14 35.6,-27.08 5.4,-0.5 11.06,3.56 12.63,10.08 1.06,4.38 2.12,6.15 7.37,4.7 5.6,-1.57 11.84,-1.57 15.74,4.57 1.37,2.14 2.5,4.48 1.77,6.92 -2.34,6.77 0.22,6.7 4.22,6.64 19.47,-0.34 36.57,11.34 52.55,22.58 4.43,3.12 7.88,7.36 11.35,11.43 9.5,11.2 18.47,22.87 29.36,32.8 8.34,7.58 17.73,13.18 29.46,13.54 1.8,0.06 3.6,0.16 5.38,0 9.7,-0.88 13.12,-7.9 8.15,-16.43 -3.77,-6.46 -9.08,-12 -11.58,-19.24 -3.07,-8.9 -4.93,-17.73 1.06,-26.2 1.36,-1.94 0.78,-3.72 0.17,-5.6 -1.98,-6.1 -0.9,-12.03 1.47,-17.67 1.57,-3.76 4.62,-6.53 9,-6.6 4.3,-0.04 8.12,1.35 10.13,5.58 1.33,2.8 2.57,5.65 3.64,8.55 1.63,4.44 5.64,6.35 9.57,3.78 2.73,-1.77 3.28,-4.88 5.76,-7 3.8,-3.24 7.8,-4.04 12.02,-1 4.23,3.04 6.86,7 6,12.5 -0.33,2.25 -0.96,4.45 -2.46,6.32 -3.24,4.02 -2.96,7.96 0.14,12.03 2.95,3.9 5.88,7.86 9,11.57C473.3,155 480.12,170 483.53,186.44c2.06,9.93 1.8,20.08 -0.46,30.13 -3.2,14.18 -8.4,27.4 -17.4,38.95 -0.37,0.48 -0.52,1.12 -1.1,2.4z\"\n      android:fillColor=\"@color/elephant_friend_border_color\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M434.05,70.75c-4.33,1.58 -7.75,1.33 -10.1,-1.72 -2.36,-3.08 -2.15,-7.75 0.5,-10.18 2.44,-2.23 6.73,-3.17 6.73,-3.17s-5.97,-18.84 -7.52,-24.82c-0.6,-2.52 -0.92,-5.7 4.3,-8.72 7.68,-4.42 15.2,-7.8 24.1,-10.7 3.28,-1.06 7.05,-0.3 8.7,2.68 4.12,11.28 7,21.06 10.66,32.28 3.1,9.54 -1.33,10.92 -4.82,13 -2.74,1.63 -6.45,2.92 -9.94,0.64 -3,-1.96 -3.2,-6.7 -2.07,-9.67 1.95,-3.74 8.18,-5.2 8.18,-5.2s-2.03,-6.4 -3.1,-9.5c-4.27,-12.07 -4.44,-9.3 -16.1,-4.23 -10.4,4.52 -9.9,5.07 -6.54,15.98 0.76,2.48 2.74,7.93 3.74,11.88 2.02,7.9 -1.32,9.48 -6.73,11.45zM357.86,54.52c-0.06,-6.67 9.1,-15.55 15.24,-15.43 2.4,0.03 4.03,1.26 5.13,3.2 5.96,10.4 11.24,21.16 17.7,31.3 2.23,3.47 1.18,6.97 -1.84,10.06 -3.42,3.48 -6.68,4.82 -11,1.6 -7.96,-5.9 -25.96,-26.6 -25.24,-30.74zM506.52,73.77c0.53,2.86 -2.1,4.22 -6.44,6.7 -5.93,3.4 -14.07,6.7 -20.86,10.55 -3.48,1.98 -7.18,4.66 -10.96,0.57 -3.46,-3.75 -3.74,-11.26 -0.4,-14.8 8.26,-8.74 16.8,-17.2 26.12,-24.83 3.9,-3.2 6.88,-2.52 8.86,2.1 2.4,5.6 3.3,11.57 3.68,19.7zM485.48,119.2c-10.47,0.63 -11.15,0.1 -12.55,-10.14 -0.86,-6.2 0.57,-8.46 6.56,-9.66 9.93,-2 19.34,-5.8 29.12,-8.33 6.37,-1.65 8.36,-0.26 8.5,6.3 0.17,6.6 -2.64,12.2 -6.38,17.08 -3.2,4.18 -24.45,4.7 -25.26,4.75zM405.4,26.1c0.38,7.18 1.68,23.77 1.65,24.9 -0.1,3.47 -0.96,6.85 -4.7,7.7 -3.56,0.83 -5.83,-2.2 -7.2,-4.75 -3.84,-7.16 -6.7,-14.8 -8.8,-22.66 -0.68,-2.53 -1.16,-5.1 -1.98,-7.55 -2.1,-6.2 -1.5,-9.24 3.5,-13.36 2.86,-2.38 5.83,-4.8 9.43,-6 4.92,-1.64 7.73,0.03 8.03,5.1 0.33,5.52 0.08,11.07 0.08,16.6z\"\n      android:fillColor=\"@color/elephant_friend_accent_color\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M237.55,461.68c-3.74,-4.52 -5.68,-10.24 -9.82,-14.5 -8.22,-8.45 -18.98,-11.4 -29.97,-12.43 -13.3,-1.25 -25.84,2.5 -37.3,9.43 -1.23,0.75 -4.1,1 -2.96,3.46 1.12,2.44 3.37,1.07 5.2,0.6 0.63,-0.17 1.3,-0.3 1.84,-0.64 12.76,-7.84 26.86,-6.72 39.83,-2.92 12.03,3.52 22.96,10.7 28.42,23.56 7.16,16.86 10.88,34.32 10.7,52.63 0,2.65 -0.3,4.42 -3.3,5.6 -7.93,3.1 -10.82,10.33 -7.84,18.34 0.33,0.87 0.67,1.73 1,2.6 -1.97,0.64 -2.25,-0.7 -2.8,-1.58 -3.06,-4.83 -7.6,-6.5 -13.04,-5.87 -5.22,0.6 -7.82,4.27 -9.36,8.86 -1.05,3.13 -1.84,6.34 -1.14,9.63 0.37,1.73 0.28,2.84 -1.7,3.23 -1.8,0.35 -2.7,-0.2 -3.1,-2.07 -0.83,-3.67 -3.48,-6 -6.05,-8.6 -7.77,-7.88 -17.46,-2.88 -19.98,6.12 -0.96,3.38 -2.3,3.72 -5.05,2.9 -2.5,-0.72 -5.07,-1.22 -7.54,-2.04 -11.78,-3.97 -14.72,-13.16 -14.2,-24.34 0.17,-3.45 -0.14,-6.85 -1.16,-10.15 -0.4,-1.32 -1.14,-2.53 -2.7,-2.4 -1.6,0.16 -2.1,1.5 -2,2.9 0.28,3.7 -1.95,9.37 -7.6,10.37C121,537 97.3,525.3 92.73,505.8c-1.64,-1.5 -3.04,-1.64 -4.8,-0.98 -1.07,0.4 -2.16,0.86 -3.04,1.55 -9.6,7.47 -20.4,8.52 -32.02,6.66 -6.1,-0.98 -11.44,-3.3 -15.46,-7.65 -9.14,-9.86 -13.94,-21.8 -14.97,-35.23 -0.2,-2.55 0.46,-4.92 2.46,-6.64 2.48,-2.13 4.33,-2.62 6.5,1.02 3.45,5.8 3.97,12.56 7.33,18.4 7.13,12.36 22.7,17.5 35,2.98 4.64,-5.47 4.54,-10.5 3.78,-16.98 -2.33,-20.22 -1.35,-40.16 4.53,-60.02 5.46,-18.4 13.88,-35.12 23.95,-51.2 5.25,-8.37 12.45,-15.13 20.4,-20.88 4.24,-3.1 10.25,-2.7 14.76,-5.88 1.4,-1 2.28,0.94 2.98,1.85 4.92,6.36 11.94,8.28 19.36,9.05 9.7,1 15.67,-4.7 19.8,-12.45 2.16,-4.04 3.35,-4.27 6.72,-1.1 3.13,2.94 6.97,5.32 11.15,6.9 1.4,0.54 2.73,1.28 4.2,0.65 1.43,-0.6 3.6,-0.34 4,-2.33 0.44,-2.22 -1.8,-2.45 -3.1,-3.13 -5.34,-2.84 -10.44,-6.04 -15.34,-9.6 -1.9,-1.4 -2.3,-2.74 -1.52,-4.94 3.85,-10.7 2.88,-21.9 2.96,-32.94 0,-2.66 -1.03,-5.73 -4.37,-5.4 -3.42,0.34 -2.4,3.4 -2.48,5.83 -0.34,10.57 0.2,48.52 -20.4,51.8 -5.6,0.88 -11.72,-3.87 -14.97,-7.55 -1.05,-1.2 -1.6,-2.82 -2.3,-4.3 -1.9,-3.97 -4.7,-4.7 -8.32,-2.28 -1.6,1.1 -3.16,2.3 -4.77,3.42 -6.07,4.18 -11.02,2.55 -13,-4.62 -2.12,-7.58 -2.73,-15.4 -2.9,-23.25 -0.18,-7.1 -0.37,-7.44 -7.23,-7.38 -3.63,0.02 -3.4,-2.65 -3.34,-4.76 0.3,-7.84 1.16,-15.63 3.16,-23.24 5.44,-20.78 15.25,-39.46 27.34,-57.06 9.98,-14.53 20.6,-28.52 32.6,-41.46 1.35,-1.46 2.53,-3.08 1.88,-5.25 -3.8,-12.62 -4.97,-25.52 -4.34,-38.64 0.18,-3.68 1.14,-7.06 3.14,-10.16 4.82,-7.47 11.9,-8.46 18.45,-2.54 4.23,3.82 5.38,3.75 7.42,-1.7 4.34,-11.62 13.95,-18.16 23.3,-25 1.14,-0.85 2.63,-1.3 4.03,-1.74 8.2,-2.65 11.25,-0.47 11.25,8.02 0,1.15 -0.07,2.3 -0.03,3.43 0.13,4.47 1.23,5.28 5.4,3.6 3.7,-1.5 7.53,-2.1 11.46,-2.12 2.42,0 5.3,-0.08 6.36,2.63 1,2.62 -0.22,5.13 -1.9,7.25 -1.02,1.28 -2.27,2.37 -3.23,3.67 -1.26,1.72 -1.58,3.66 -0.2,5.45 1.3,1.7 3.07,1.46 4.9,0.9 2.35,-0.7 4.7,-1.3 7.08,-1.85 5.5,-1.3 10.67,-0.84 16.25,0.93 22.57,7.14 39.55,21.56 53.67,39.85 10.63,13.77 21.63,27.04 37.92,34.54 8.35,3.85 16.9,6.37 26.37,6.2 15.5,-0.27 22.1,-14.73 14.75,-28.12 -2.35,-4.27 -5.4,-8.16 -8.04,-12.27 -3.88,-6 -10.2,-16.04 -5.6,-23.58 3.3,-5.45 5.37,-11.58 2.52,-18.9 -0.08,-1.6 -0.05,-3.35 0.46,-4.83 1.42,-4.12 5.42,-4.9 8.47,-1.8 1.54,1.56 2.3,3.5 2.8,5.62 0.98,4.25 2.27,8.28 7.44,9.2 5.6,0.97 10.84,0.58 14.68,-4.23 1.48,-1.85 3.28,-3.16 5.2,-4.4 1.44,-0.92 2.98,-1.45 4.56,-0.33 1.6,1.12 1.42,2.82 1.23,4.46 -0.2,1.65 -0.9,3.1 -1.9,4.44 -5.77,7.8 -5.23,16.43 2.02,22.87 23.06,20.5 30.33,46.86 26.25,76.12 -2.65,18.97 -11.78,35.84 -25.73,49.58 -2.2,2.18 -4.45,4.3 -6.68,6.46 -2.33,2.23 -3.93,2.15 -4.3,-1.4 -0.36,-3.5 -1.98,-6.5 -3.52,-9.58 -2.34,-4.65 -6.03,-6.72 -11.1,-6.17 -3.3,0.34 -8.26,5.75 -9.05,9.47 -3.08,14.45 -13.34,23.87 -27.43,26.86 -15.9,3.36 -30.32,1.14 -43.77,-8.18 -3.5,-2.43 -7,-4.17 -9.73,-8 -5.08,-7.13 -16.4,-6.98 -23.1,-0.75 -0.6,0.56 -1.48,1 -1.12,1.93 0.48,1.22 1.7,0.8 2.55,0.65 0.94,-0.16 1.8,-0.77 2.72,-1.1 5.43,-1.83 7.9,-1.44 13.27,2.3 -3.13,1.38 -6.1,2.42 -8.8,3.9 -15.9,8.8 -23.13,20.6 -18.48,36.6 1.56,5.37 3.22,10.8 8.85,13.87 3.24,1.77 2.84,3.92 -0.62,5.42 -3.44,1.5 -6.83,3.12 -10.25,4.65 -0.87,0.4 -2.22,0.47 -2.1,1.67 0.17,1.43 1.6,1.47 2.7,1.43 5.6,-0.17 11,-1.56 16.26,-3.22 3.9,-1.24 7.4,-1.2 11.37,0 12.8,3.8 23.85,4.72 37.07,3.7 4.57,-0.36 5.7,-1.85 5.04,6.07 -1.6,11.56 0.48,21.77 5.14,32.76 1.3,5.25 1.8,10.5 0.6,15.88 -0.85,3.8 -1.32,7.7 -1.27,11.6 0.03,2.27 -0.54,4.24 -3.2,4.77 -2.78,0.83 -2.32,3.13 -2.37,5.22 -0.17,7.17 -4.74,22.1 -8.8,28.5 -2.3,-2.82 -2.4,-6.32 -3.54,-9.36 -1.73,-4.62 -3.83,-9 -6.77,-12.94 -0.88,-1.17 -2.2,-2.94 -4.04,-1.66 -1.7,1.18 -0.24,2.68 0.23,3.94 9.64,25.54 15.33,51.83 14.55,79.25 -0.1,4.02 -1.04,8.04 -1.04,12.12 0,1.86 -0.92,2.67 -2.87,3.2 -11.3,3.13 -14.4,8.67 -11.5,20.46 0.5,1.98 -0.13,2.68 -1.68,3.32 -1.76,0.73 -2.25,-0.3 -2.74,-1.7 -0.43,-1.2 -1,-2.42 -1.74,-3.48 -3.22,-4.67 -8.8,-6.6 -13.74,-4.87 -5.05,1.8 -8.96,7.98 -8.8,14.03 0.02,1.28 0.7,3.1 0.1,3.75 -1.44,1.55 -3.4,1.9 -4.72,-0.53 -0.85,-1.58 -1.54,-3.24 -2.5,-4.73 -5.35,-8.23 -16.2,-9.3 -21.15,-0.74 -2.25,3.88 -3.3,5.1 -7.07,3.8 -5.44,-1.85 -10,-4.88 -13.63,-9.14 -3.86,-4.55 -2.3,-10.3 -2.3,-15.55 0.1,-20.53 1.55,-41.06 -0.07,-61.6 -0.5,-6.54 -2.04,-12.88 -3.3,-19.27 -0.45,-2.2 -0.6,-5.1 -3.8,-4.7 -3.36,0.44 -2.14,3.43 -2.3,5.55 -0.04,0.48 0.06,0.97 0.1,1.46 -1.97,6.44 -11.3,12.66 -17.7,11.78z\"\n      android:fillColor=\"@color/elephant_friend_body_color\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M370.76,415.57c1,-8.35 2,-16.7 2.98,-25.04 0.28,-2.4 -0.07,-4.88 0.88,-7.2 11.63,18.26 23.94,36.14 34.7,54.9 9.17,16 15.53,33.42 21.23,51 0.55,1.68 0.68,2.63 -1.66,2.85 -12.2,1.16 -16.57,7.23 -13.92,18.97 0.13,0.56 0.02,1.18 0.02,1.8 -2.04,0.28 -2.4,-1.26 -3.07,-2.23 -3.37,-4.92 -7.88,-6.6 -13.62,-5.1 -5.52,1.4 -9.5,4.85 -10.5,10.37 -0.68,3.88 -2.28,4.43 -5.52,3.85 -4.17,-0.74 -8.36,-1.36 -12.56,-1.97 -2.54,-0.37 -3.56,-1.5 -3.3,-4.3 1.32,-14.88 0.22,-29.66 -2.8,-44.27 -0.6,-2.87 -0.3,-5.22 0.94,-7.93 5.26,-11.42 10.02,-23.04 10.24,-35.9 0.07,-3.8 0,-7.65 -4.04,-9.8z\"\n      android:fillColor=\"@color/elephant_friend_dark_body_color_2\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M356.08,338.47c-7.7,0.43 -18.2,-2.36 -28.64,-4.5 -16.86,-3.44 -25.54,-20.38 -18.15,-35.16 4.42,-8.87 12.58,-13.95 22.5,-15.12 4.26,-0.5 7.23,3.35 10.35,5.82 5.75,4.55 12,8.16 19.3,8.75 14.3,1.16 28.3,-0.6 41.18,-7.27 9.55,-4.95 15.58,-13.08 18.27,-23.62 0.7,-2.78 1.5,-6.7 4.48,-6.78 3.67,-0.1 4.9,3.98 5.65,7.1 4.6,19.4 -3.52,40.9 -19.7,52.66 -6.42,4.68 -12.42,10.08 -20,12.93 -10.3,3.88 -21.1,5.1 -35.25,5.2z\"\n      android:fillColor=\"@color/elephant_friend_light_color_2\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M440,305c-3.6,-0.1 -3.5,-1.06 -3.58,-5.14 -0.32,-13.9 7.15,-20.92 14.32,-27.6 5.77,-5.37 11.57,-8.7 19.6,-9.65 8.85,-1.02 16.66,-5.3 22.36,-12.68 0.9,-1.16 1.73,-3.32 3.63,-2.48 1.62,0.72 2.38,2.66 2.6,4.5 0.92,7.78 -0.24,15.26 -3.5,22.4 -7.07,15.62 -27.1,24.16 -36.08,27 -6.98,2.23 -15.14,3.76 -19.34,3.65z\"\n      android:fillColor=\"@color/elephant_friend_light_color_1\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M237.55,461.68c6.07,-3.67 12.54,-6.74 17.7,-11.77 0.9,9.37 1.87,18.73 2.6,28.1 0.43,5.35 0.5,10.73 0.62,16.1 0.04,1.77 -0.06,3.6 -0.48,5.32 -0.7,2.85 -3.2,4.6 -5.63,4.7 -2.56,0.13 -1.87,-2.9 -2.13,-4.66 -2,-13.35 -6.65,-25.8 -12.7,-37.78zM31.56,456.6c-3.18,-1.1 -5.75,0.44 -8.2,2.1 -4.54,3.08 -6.36,2.92 -9.92,-1.35 -0.93,-1.1 -1.68,-2.4 -2.42,-3.65 -0.5,-0.84 -1,-1.88 -0.34,-2.75 0.95,-1.27 2.02,-0.18 3.06,0.1 3,0.82 6.4,4.16 8.85,2.05 2.36,-2.03 -1.6,-4.94 -2.08,-7.75 -0.7,-4 -1.72,-7.94 -1.6,-12.06 0.1,-3.6 2.05,-5.86 5.37,-6.68 3.62,-0.88 4.72,2.2 5.97,4.58 1.4,2.67 1.2,5.7 1.4,8.62 0.12,1.73 -0.6,3.82 1.47,4.78 1.8,0.84 2.96,-0.8 4.32,-1.6 1.54,-0.9 3.1,-1.96 4.77,-2.4 3.37,-0.88 5.83,1.87 4.8,5.12 -0.7,2.13 -13.23,10.96 -15.47,10.9z\"\n      android:fillColor=\"@color/elephant_friend_dark_body_color_2\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M320.74,552.86c0,-3.62 1.58,-6.17 3.95,-8.34 1.97,-1.8 4.1,-1.73 6.32,-0.54 2.6,1.4 3.5,4.16 3.66,6.55 0.17,2.4 -2.78,2.16 -4.55,2.68 -2.18,0.65 -4.42,1.1 -6.62,1.7 -2.04,0.53 -3.18,0.08 -2.76,-2.04zM211.12,555.75c0.62,-7.63 5.97,-12.05 11,-9.22 1.87,1.04 3.73,2.48 3.63,4.83 -0.1,2.32 -9,5.34 -11.57,6.4 -2,0.8 -3.7,0.78 -3.06,-2zM190.44,562.93c-1.76,-0.23 -10.18,0.22 -10.6,-2.52 -0.35,-2.33 1.4,-4.48 3.5,-6 2.27,-1.65 4.47,-1.77 6.75,-0.26 1.06,0.7 2.23,1.4 3.02,2.37 1.1,1.33 3.2,2.64 2.36,4.47 -0.8,1.78 -2.98,2.23 -5.04,1.96zM391.17,519.44c2.04,-6.24 7,-9.52 11.73,-8.35 2.15,0.53 3.55,2.03 3.88,3.9 0.42,2.34 -2.14,1.87 -3.42,2.47 -3.73,1.76 -7.83,1.28 -12.2,1.97zM302.64,557.6c-3.28,-0.47 -11.57,-0.97 -11.9,-2.4 -0.42,-1.8 1.33,-3.16 2.75,-4.2 4.6,-3.4 8.78,-2.1 10.7,3.23 1,2.82 0.55,3.43 -1.56,3.36zM420.1,510.42c-1.2,-5.6 0.16,-9.25 4.92,-11.44 1.9,-0.88 3.66,-0.63 4.82,0.74 1.2,1.43 -0.37,2.67 -1.28,3.7 -2.34,2.63 -4.96,4.94 -8.47,7zM356.97,530.9c-0.27,4.6 -2,7.9 -5.37,10.37 -0.64,0.46 -1.24,1.42 -2,0.94 -0.53,-0.33 -0.82,-1.35 -0.9,-2.1 -0.38,-4.45 3.08,-8.4 8.27,-9.2zM242.28,535.5c-0.73,3.33 -1.4,6.46 -4.55,7.58 -0.62,0.22 -0.98,-2.36 -0.68,-3.82 0.53,-2.58 1.12,-5.3 4.13,-5.85 1.8,-0.32 0.86,1.56 1.1,2.1z\"\n      android:fillColor=\"@color/elephant_friend_light_color_1\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M369.34,395.2c-0.36,10.82 -7.26,15.35 -17.1,11.05 -1.5,-0.65 -2.08,-0.66 -3.2,0.53 -7.24,7.7 -14.98,6.93 -20.1,-2.23 -1.5,-2.67 -2.45,-3.12 -5.43,-1.97 -7.26,2.82 -11.64,-0.6 -11.53,-8.5 0.06,-4.7 1.6,-8.96 4.12,-12.87 0.8,-1.26 2,-2.45 3.64,-1.64 1.92,0.95 0.28,2.3 -0.08,3.3 -1.25,3.6 -2.2,7.2 -2.02,11 0.18,3.53 2.2,3.96 4.5,2.1 2.1,-1.7 3.7,-4.08 5.5,-6.2 0.75,-0.88 1.4,-1.87 2.8,-1.45 1.32,0.4 1.52,1.5 1.67,2.7 0.63,4.87 2.5,9.06 6.5,12.16 2.58,2 4.4,1.93 5.47,-1.45 0.74,-2.32 1.6,-4.6 2.26,-6.96 0.8,-2.9 2.17,-3.03 4,-0.92 2.32,2.68 5.2,5.96 8.57,3.67 3.46,-2.35 1.47,-6.54 0.3,-9.9 -0.9,-2.64 -2.05,-5.16 -4,-7.24 -0.8,-0.84 -1.68,-1.75 -0.73,-2.96 0.7,-0.9 1.7,-0.6 2.7,-0.43 4.32,0.73 7.47,2.7 9.14,7.06 1.4,3.65 3.27,7.1 3.04,11.17zM257.8,234.95c0,3.1 0.06,5.4 -0.03,7.67 -0.05,1.25 -0.75,2.13 -2.06,2.38 -1.4,0.27 -2.43,-0.06 -3.33,-1.34 -8.95,-12.77 -2.18,-30.7 12.84,-33.9 7.24,-1.53 18.57,3.32 22.34,9.53 1.63,2.66 0.77,5.45 -0.96,7.1 -2.03,1.94 -3.08,-1.2 -4.62,-2.1 -3.3,-1.95 -6.58,-4.33 -10.2,-5.3 -6.54,-1.75 -12.92,3.24 -13.6,9.93 -0.24,2.27 -0.28,4.56 -0.36,6.02zM335.63,182.77c-0.4,3.9 0.7,6.67 1.5,9.5 0.5,1.72 0.1,3.34 -1.5,4.28 -1.32,0.8 -2.77,0.04 -3.48,-0.96 -3.8,-5.36 -6.13,-11.28 -4.57,-17.9 1.37,-5.78 5.48,-9.1 11.26,-10.22 7.58,-1.47 16.86,5.04 17.3,12.13 0.1,1.34 0.82,3.13 -1.05,3.9 -1.44,0.58 -2.48,-0.47 -3.45,-1.34 -1.58,-1.4 -3,-3.04 -4.72,-4.25 -2.7,-1.88 -5.8,-2.27 -8.88,-1.06 -3.2,1.27 -2.16,4.37 -2.42,5.93z\"\n      android:fillColor=\"@color/elephant_friend_border_color\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M334.32,456.65c0.4,3.22 -0.48,5.42 -2.9,6.2 -2.62,0.85 -4.6,-1 -5.16,-3.3 -1.23,-5.03 -2.02,-10.18 -2.83,-15.3 -0.3,-1.87 0.14,-3.75 2.42,-4.15 2.12,-0.36 3.48,1 4.1,2.76 1.63,4.77 3.06,9.6 4.38,13.8zM346.88,497.52c-0.37,3.22 -1.74,5.15 -4.26,5.35 -2.76,0.2 -4.25,-2.07 -4.25,-4.42 -0.02,-5.18 0.42,-10.37 0.83,-15.55 0.15,-1.88 1,-3.6 3.32,-3.45 2.14,0.14 3.16,1.77 3.33,3.64 0.48,5 0.73,10.04 1.03,14.42zM111.33,405.23c-1.5,2.88 -3.47,4.2 -5.9,3.47 -2.64,-0.8 -3.22,-3.44 -2.4,-5.64 1.85,-4.85 4.12,-9.54 6.35,-14.23 0.82,-1.7 2.23,-3 4.34,-2.03 1.95,0.9 2.3,2.78 1.8,4.6 -1.34,4.84 -2.9,9.64 -4.2,13.83zM125.06,433.6c-1.18,3.04 -3,4.56 -5.47,4.1 -2.74,-0.5 -3.6,-3.06 -3,-5.34 1.28,-5.02 3.02,-9.93 4.73,-14.83 0.62,-1.78 1.9,-3.23 4.1,-2.5 2.03,0.68 2.6,2.52 2.3,4.37 -0.82,4.97 -1.85,9.9 -2.67,14.22zM318.95,487.36c-0.07,3.25 -1.26,5.3 -3.74,5.72 -2.73,0.47 -4.42,-1.66 -4.64,-4 -0.5,-5.16 -0.55,-10.37 -0.6,-15.56 -0.04,-1.88 0.65,-3.68 2.97,-3.74 2.15,-0.07 3.3,1.47 3.66,3.3 0.92,4.96 1.65,9.95 2.35,14.28zM220.34,466.9c2.03,2.55 2.43,4.9 0.8,6.8 -1.8,2.1 -4.47,1.56 -6.14,-0.1 -3.7,-3.63 -7.06,-7.6 -10.44,-11.54 -1.23,-1.44 -1.85,-3.26 -0.1,-4.8 1.6,-1.42 3.47,-0.98 4.92,0.2 3.9,3.2 7.65,6.58 10.96,9.45zM218.05,505.25c0.7,3.18 0.02,5.45 -2.3,6.45 -2.54,1.1 -4.7,-0.58 -5.46,-2.8 -1.7,-4.9 -2.98,-9.95 -4.26,-14.98 -0.47,-1.83 -0.22,-3.74 2.02,-4.34 2.07,-0.57 3.56,0.65 4.33,2.36 2.07,4.6 3.94,9.27 5.65,13.3z\"\n      android:fillColor=\"@color/elephant_friend_dark_body_color_1\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M146.02,376.7c-1.1,4.03 -2.14,8.66 -3.63,13.13 -0.78,2.3 -2.78,3.84 -5.43,2.93 -2.74,-0.93 -3.6,-3 -2.78,-5.86 1.37,-4.75 3.28,-9.23 6.55,-13 0.98,-1.14 2.27,-2.02 3.87,-1.16 1.32,0.7 1.5,2.04 1.4,3.95zM133.8,239.83c1.24,-5.52 3.77,-10.15 7.84,-13.9 1.08,-1 2.33,-1.1 3.57,-0.23 1.22,0.86 1.73,2.12 1.23,3.43 -1.82,4.68 -3.67,9.36 -5.76,13.93 -0.7,1.54 -2.42,2.3 -4.18,1.58 -2.17,-0.88 -2.2,-3.04 -2.7,-4.8z\"\n      android:fillColor=\"@color/elephant_friend_dark_body_color_1\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M364.47,208.65c0.68,-3.4 2.7,-5.58 4.54,-7.8 2.75,-3.3 6.58,-5.2 10.03,-7.6 1.67,-1.14 3.5,-1.1 4.63,0.8 1.1,1.9 0.32,3.47 -1.46,4.5 -5.08,2.98 -9.5,6.58 -12.3,11.93 -0.7,1.33 -1.87,2.42 -3.55,1.87 -1.97,-0.65 -1.72,-2.5 -1.88,-3.7z\"\n      android:fillColor=\"@color/elephant_friend_border_color\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M162.8,248.16c-0.42,3.7 -0.44,6.67 -1.2,9.44 -0.72,2.68 -2.34,5.54 -5.74,4.5 -2.95,-0.9 -4,-3.72 -3.22,-6.74 0.8,-3.12 1.53,-6.34 3.8,-8.8 1.1,-1.2 2.46,-2.33 4.26,-1.6 1.73,0.7 2.12,2.3 2.1,3.2z\"\n      android:fillColor=\"@color/elephant_friend_dark_body_color_1\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M190.34,490.35c0.05,2.55 -0.43,4.5 -2.64,5.16 -2.07,0.64 -3.58,-0.8 -4.3,-2.45 -1.66,-3.87 -3.07,-7.86 -4.44,-11.86 -0.5,-1.44 -0.36,-3 1.1,-3.93 1.6,-1 2.87,-0.02 3.84,1.12 3.1,3.62 5.57,7.6 6.44,11.95zM130.17,363.58c-2.9,-0.2 -4,-2.12 -3.06,-4.66 2,-5.3 6.8,-8.15 11.1,-11.2 1.7,-1.2 3.38,0.36 3.4,2.66 0,2.32 -8.13,12.54 -10.33,13.05 -0.32,0.08 -0.64,0.1 -1.1,0.15z\"\n      android:fillColor=\"@color/elephant_friend_dark_body_color_1\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M179.53,216.1c-0.84,4 -2.6,7.82 -5.46,11.05 -1.5,1.7 -3.52,1.57 -5.38,0.5 -1.93,-1.1 -2.08,-2.97 -1.26,-4.7 1.84,-3.85 4.4,-7.22 7.88,-9.78 0.92,-0.67 2.04,-1.17 3.18,-0.4 1.08,0.74 1.1,1.9 1.03,3.32z\"\n      android:fillColor=\"@color/elephant_friend_dark_body_color_1\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M175.5,186.16c-1.3,3.68 -3.26,7.4 -6.47,10.23 -1.24,1.1 -2.8,0.47 -4.02,-0.48 -1.37,-1.08 -2.35,-2.67 -1.32,-4.22 2.05,-3.08 3.98,-6.37 7.17,-8.44 2.43,-1.57 4.7,-0.2 4.65,2.9z\"\n      android:fillColor=\"@color/elephant_friend_dark_body_color_1\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M386.26,211.43c0.38,-4.44 1.16,-8.6 3.12,-12.42 0.98,-1.9 2.6,-3.23 4.77,-2.26 2.48,1.1 1.68,3.02 0.77,4.95 -1.66,3.53 -3.06,7.2 -4.73,10.72 -0.57,1.18 -0.87,3.34 -2.8,2.72 -1.68,-0.54 -0.95,-2.52 -1.14,-3.7z\"\n      android:fillColor=\"@color/elephant_friend_border_color\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M404.98,200.06c0.27,-2.52 0.07,-5.14 2.68,-5.6 3.04,-0.52 2.94,2.3 3.4,4.27 0.53,2.2 1,4.43 1.52,6.64 0.44,1.85 0.72,3.75 -1.6,4.38 -2.45,0.67 -4.13,-0.43 -4.68,-2.94 -0.52,-2.37 -0.94,-4.76 -1.32,-6.74z\"\n      android:fillColor=\"@color/elephant_friend_border_color\"\n      android:fillType=\"evenOdd\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/elephant_friend_empty.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"140dp\"\n    android:height=\"159dp\"\n    android:viewportWidth=\"510\"\n    android:viewportHeight=\"580\">\n    <!-- Speech bubble background -->\n    <path\n        android:fillColor=\"@color/elephant_friend_accent_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M394.28,157.1c-7.35,-6.5 -13.58,-14.2 -15.95,-23.65 -10.08,-40.07 20.35,-70.8 51.32,-74.1 24.2,-2.57 47.07,6.67 60.52,22.02 27.04,30.86 16.45,74.4 -14.43,91.4 -19.06,10.46 -40.3,3.45 -46.95,3.2 -3.42,-0.13 -25.6,9.5 -32.5,13.88 -1.68,1.07 -3.52,1.98 -5.42,0.56 -2,-1.47 -1.18,-3.47 -0.7,-5.36 0.5,-2.05 6.17,-26.13 4.1,-27.95z\" />\n    <!-- Border, shadow -->\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M415.6,303.76c-1.72,1.5 -3.38,3.05 -5.08,4.58 -3.58,3.24 -14.12,2.94 -17.7,-0.44 -2.15,-2.03 -1.74,-3.02 1.04,-3.88 3.88,-1.2 7.66,-2.73 11.47,-4.17 15.35,-5.8 24.8,-17.05 28.94,-32.6 2.37,-8.9 -1.8,-13.55 -11,-13.94 -7.06,-0.3 -14,0.78 -20.95,1.45 -9.33,0.9 -18.55,0.57 -27.53,-2.26 -7.48,-2.37 -10.93,-7.27 -11.57,-14.84 -1.13,-13.3 -4.25,-33.32 -2.67,-39.85 1.52,-6.28 7,-20.6 5.78,-30.26 -1.18,-9.38 -4.67,-14.27 -7.74,-19.85 -3.2,-5.83 -5,-12.75 -6.97,-18.9 -5.04,-15.65 -11.93,-30.6 -23.7,-42.74 -7.07,-7.28 -15.15,-13.3 -22.8,-19.87 -5.32,-4.6 -11.2,-7.82 -18,-9.3 -3.1,-0.65 -4.23,-1.47 -3.4,-5.17 2.3,-10.25 -3,-16.46 -13.4,-16.5 -1.46,-0.02 -2.94,-0.08 -4.4,0.1 -3.8,0.48 -5.26,-0.44 -4.23,-4.78 2.02,-8.56 -4.18,-16.05 -12.95,-16.12 -6.58,-0.04 -13.02,0.92 -19.02,3.7 -2.42,1.12 -3.52,1.1 -4.72,-1.66 -2.43,-5.58 -6.8,-8.86 -13.04,-9.75 -12.25,-1.75 -22.9,1.67 -32.07,9.7 -9.78,8.53 -16.37,19.45 -21.2,31.25 -4.1,10.04 -9.46,18.37 -19.75,22.88 -2.8,1.23 -5.35,3.12 -7.84,4.95 -20.45,15 -36.96,33.6 -50.95,54.7 -9.9,14.93 -18.4,30.2 -22.3,47.94 -2.72,12.42 -5.2,24.87 -7.12,37.4 -2,12.93 -1.06,25.64 3.62,37.97 2.12,5.62 5.57,8.77 11.06,8.6 4.34,-0.16 5.3,1.77 6.14,5.52 2.27,9.9 5.9,19.05 17.13,22.2 1.76,0.5 2.48,1.3 0.87,3.05 -5.94,6.5 -11.04,13.64 -16.03,20.9 -10.44,15.25 -17.88,31.82 -21.53,49.87 -1.94,9.55 -2.54,19.4 1.98,28.76 1.06,2.18 1.1,4.64 1,7.16 -0.87,19.15 7.85,33.9 21.43,46.83 -7.8,4.47 -26.34,3.1 -32.96,-2.53 -1.27,-1.08 -2.46,-2.18 -1.26,-4.12 4.77,-7.68 1.6,-14 -3.58,-19.87 -5.1,-5.77 -9.94,-5.4 -14.1,1.15 -1.15,1.8 -2.08,2.9 -4.55,2.6 -5.7,-0.7 -9.83,2.58 -12.45,7.02 -2.95,4.97 -3.6,10.74 0.2,15.65 2.4,3.1 3.04,5.15 0.5,8.66 -3.02,4.2 -2.42,10.07 0.2,12.76 3.56,3.66 9.77,4.7 14.45,2.76 7.66,-3.16 5.8,-8.13 7.66,-8.3 1.86,-0.16 3.38,3.87 11.95,7.48 17.15,7.23 35.34,7.46 52.57,-1.77 2.18,-1.17 3.87,-1 4.3,1.77 0.73,4.83 1.38,9.6 0.26,14.54 -2.64,11.65 -2.5,23.3 1.52,34.64 1.13,3.2 0.5,4.16 -2.76,4.9 -9.27,2.17 -28.52,13.96 -20.37,24.95 12.32,16.6 64.27,23.74 88.46,25.13 17.28,1 80.47,1.1 98.78,-0.78 54.86,-5.65 104.97,-17.47 110.52,-31.5 5.54,-14.06 -18.83,-24.9 -24.63,-25.7 -3.63,-0.5 -3.84,-2.1 -3.06,-4.9 0.93,-3.28 1.96,-6.56 2.6,-9.9 2.88,-14.93 3.25,-30.08 3.88,-45.2 0.08,-1.93 -0.33,-3.98 1.2,-5.56 7.33,-7.6 11.5,-16.9 14.65,-26.76 0.9,-2.82 2.78,-4.44 5.44,-5.06 8.8,-2.05 16.87,-5.88 24.88,-9.88 5.4,-2.7 10.54,-5.68 14.96,-9.98 11.36,-11.03 10.58,-23.68 5.24,-36.94 -1.17,-2.9 -1.2,-5.5 -0.62,-8.5 1.65,-8.72 4.06,-16.95 9.53,-24.26 4.17,-5.6 6.2,-11.95 4.07,-19.32 -2.68,-9.35 -10.94,-12.2 -18.26,-5.84zM245.8,512.6c-3.24,-0.14 -27.22,-0.8 -39.35,0.44 -2.15,0.22 -3.5,-0.3 -3.46,-2.75 0.1,-5.04 -0.16,-10.08 1.02,-15.05 0.55,-2.33 1.74,-3.4 4.08,-3.14 12.18,1.3 24.3,1.13 36.34,-1.43 2.5,-0.53 3.15,0.9 3.32,2.95 0.4,5.18 0.75,10.37 1.3,15.54 0.26,2.6 -0.7,3.54 -3.25,3.43z\" />\n    <!-- Light body part -->\n    <path\n        android:fillColor=\"@color/elephant_friend_body_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M279.22,471.42c-10.37,3.92 -21.02,7 -31.83,9.33 -14.18,3.05 -28.5,4.7 -42.93,1.27 -5.1,-1.22 -6.84,0.05 -7.17,5.5 -0.5,8.62 -0.68,17.25 -0.92,25.87 -0.07,2.6 -0.5,5.14 -1.2,7.66 -0.4,1.4 -0.9,2.16 -2.47,2.5 -9.43,2.06 -13.78,7.97 -13.03,17.65 0.12,1.5 0.77,2.9 -1.3,3.54 -2.36,0.73 -4.25,1.83 -5.14,-2.2 -1.5,-6.9 -6.23,-10.83 -11.5,-10.77 -5.86,0.08 -9.53,3.6 -10.55,10.03 -0.24,1.52 0.85,4.24 -2.22,3.76 -2.34,-0.36 -5.53,-0.18 -5.45,-4.13 0.06,-2.64 -0.68,-5.14 -1.8,-7.54 -1.95,-4.13 -4.66,-7.13 -9.7,-6.64 -4.93,0.47 -9.5,1.56 -10.54,7.5 -0.5,2.9 -1.83,2.98 -3.95,1.46 -5.93,-4.24 -8.36,-10.68 -10.12,-17.25 -3.76,-14.07 -2.06,-28.3 1.36,-42.02 2.3,-9.23 -2.2,-14.2 -7.85,-19.44 -1.4,-1.28 -2.67,-1.77 -4.13,-0.13 -5.28,5.96 -12.45,8.2 -19.9,8.84 -8.02,0.72 -16.07,1.53 -24.25,-0.27 -6.38,-1.4 -11.9,-4.15 -17.35,-7.4 -3.48,-2.1 -4.26,-5.15 -2.8,-8.83 1.38,-3.48 4.4,-4.22 7.3,-1.8 11.86,9.9 28.6,11.16 42.12,3.2 3.7,-2.2 3.57,-4.12 0.4,-7.03 -10.24,-9.45 -17.1,-20.83 -19.24,-35.38 3.4,1.25 5.04,4.06 7.54,5.66 14.7,9.48 30.9,15.2 48.3,14.54 13.2,-0.52 29.47,-8.72 42.15,-28.47 7.02,-10.93 11.06,-22.32 15.47,-33.98 1.04,-2.74 1.8,-5.58 2.8,-8.33 1.6,-4.3 1.66,-8.3 -2.84,-12.08 -1.7,8.8 -5.64,16.5 -8.8,24.53 -5.66,14.4 -11.54,28.77 -22.86,39.94 -1.1,1.1 -3.88,-1.6 -3.95,-3.93 3.65,-4.67 4.83,-9.88 2.3,-15.56 -1.97,-4.45 -5.16,-8.2 -10.13,-7.87 -7.44,-0.32 -11.44,10.3 -12.8,11.2 -1.86,-0.5 -2.58,-0.82 -2.46,-1.82 0.4,-3.55 2.6,-8 2.08,-11.6 -0.92,-6.28 -4.25,-10.2 -9.75,-11.28 -5.4,-1.07 -11.47,1.53 -14.34,6.26 -0.84,1.38 -1.52,2.9 -2.1,4.4 -0.53,1.48 -0.37,3.35 -3,2.56 -2.2,-0.66 -2.6,-1.76 -2.32,-3.95 0.67,-5.1 0.43,-10.17 -3.16,-14.32 -3.74,-4.32 -8.46,-5.23 -13.74,-3.3 -5.14,1.87 -9.4,8.73 -9.46,13.83 -0.03,3.12 -1.9,3.1 -3.72,3.2 -2.9,0.15 -1.8,-2 -1.6,-3.46 1.55,-12.6 6.18,-23.93 12.3,-35.16 7.56,-13.88 15.37,-27.5 24.33,-40.52 3.64,-5.3 7.7,-10 13.6,-12.97 2.14,-1.1 3.23,-1.07 4.94,0.74 9.82,10.4 29.58,8.63 38.24,-2.8 7.92,-10.48 14.4,-21.63 18.4,-34.13 3,-9.4 3,-19.24 3.22,-29 0.1,-4.7 0.27,-9.42 -0.46,-14.13 -0.26,-1.68 -0.9,-3.1 -1.6,-4.55 -0.45,-0.93 -1.17,-1.63 -2.3,-1.46 -1.43,0.23 -1.72,1.4 -1.7,2.58 0.16,8.32 -1.25,16.54 -1.64,24.8 -0.65,13.9 -6.48,26.08 -11.67,38.5 -1.6,3.86 -4.14,7.36 -6.28,11 -3.85,6.6 -13.65,11.12 -21.3,10.03 -3.9,-0.56 -6.38,-2.9 -8.54,-5.92 -5.6,-7.9 -5.98,-8 -14.55,-3.3 -3.66,2 -7.37,3.35 -11.6,3.13 -3.42,-0.2 -5.72,-1.64 -7.1,-4.96 -2.3,-5.65 -3.1,-11.6 -4.16,-17.53 -1.06,-5.9 -2.2,-6.55 -7.9,-5.17 -8.1,1.96 -11.05,0.07 -11.63,-8.2 -2.78,-39.67 3.82,-77.05 25.98,-111.02 12.12,-18.56 25.57,-35.9 43.66,-48.8 6.42,-4.56 12.15,-10.13 19.2,-13.87 4.24,-2.26 7.54,-5.7 9.85,-9.94 4.18,-7.73 8.3,-15.5 12.37,-23.28 4.6,-8.78 10.3,-16.5 19.04,-21.67 4.9,-2.9 10.07,-4.14 15.75,-4.52 9.55,-0.65 15.02,7.32 11.64,16.74 -0.55,1.54 -1.87,3.07 -0.17,4.32 1.53,1.1 2.7,-0.47 3.7,-1.48 5.87,-5.86 13.33,-8.38 21.15,-10.25 4.28,-1 8.1,-0.6 11.18,2.83 2.75,3.05 3.85,6.22 0.05,9.2 -2.7,2.1 -3.02,5.35 -4.1,8.1 -1.2,3.07 1.36,3.2 3.36,2.43 4.5,-1.76 9.2,-2.1 13.92,-2.26 3.64,-0.13 6.83,1.14 8.6,4.53 1.12,2.13 -2.03,7.8 -2.55,8.6 -2.68,4.28 -2.55,4.38 2.4,4.88 11.46,1.17 21.7,4.95 30.23,13.15 6.1,5.85 12.9,10.9 18.8,17.05 9.33,9.76 15.03,21.52 19.55,34.02 1.2,3.36 2.54,6.7 3.72,10.07 0.47,1.34 1.2,3.18 -1.25,3.23 -7.78,0.17 -10.77,6.4 -12.8,11.83 -6.8,18.36 -2.75,43.02 18.2,53.4 1.64,0.8 1.97,1.82 2.15,3.37 1.82,15.66 3.45,31.35 5.6,46.97 3.02,21.67 11.1,41.1 27.12,56.53 5.08,4.9 11.43,6.24 18.6,6.8 6.46,0.5 9.8,-2.7 13.6,-6.3 2.44,-2.3 4.12,-1.64 5.9,0.86 2.92,4.14 3.55,8.9 0.06,13.13 -6.72,8.2 -9.5,17.6 -10.53,27.86 -0.34,3.43 -1.5,6.7 -3.45,9.57 -5.98,8.87 -15.2,8.46 -19.86,-1.12 -2.25,-4.6 -5.2,-5.67 -10.27,-5.96 -19.05,-1.08 -38.06,-3.04 -54.03,-15.28 -1.02,-0.8 -2,-1.65 -3.35,-2.8 2.26,-1.4 4.25,-2.72 6.3,-3.93 6.63,-3.9 10.87,-9.54 12.57,-17.1 1.08,-4.8 -1.28,-8.54 -6.13,-9.8 -5.72,-1.48 -11.4,-0.1 -16.93,0.72 -18.5,2.75 -32.6,-4.43 -44.13,-18.2 -6.16,-7.37 -10.08,-15.85 -12.8,-25 -0.55,-1.9 -0.16,-3.45 0.5,-5.14 3.7,-9.7 -2.85,-16.26 -9.9,-20.88 -1.56,-1.02 -3.48,-0.86 -5.2,-0.12 -1.25,0.54 -2.23,1.47 -2.18,2.96 0.04,1.4 1.12,1.8 2.3,2.1 4.33,1.15 6.5,4.8 8.62,8.14 1.95,3.1 0.45,5.02 -3.23,4.96 -21.47,-0.33 -39.34,13.85 -42.72,33.88 -1.03,6.08 0.26,11.96 1.48,17.85 -3.6,2.1 -6.02,1.48 -10.24,-2.67 -2.8,-3.36 -7.06,-4.18 -11,-6.62 1.13,3.12 4.65,3.44 5.06,6.34 0.15,1.66 -0.32,3.14 -0.95,4.68 -2,4.92 -0.93,7.65 3.9,10.42 6.57,3.78 13.94,5.37 21.23,6.63 5.6,0.97 10.93,2.93 16.56,3.6 19.9,10.77 41.28,15.3 63.8,14.66 4.28,-0.12 8.17,-2.1 12.23,-3.25 2.4,-0.7 4.1,-0.62 6.13,1.18 9.17,8.16 19.8,13.5 31.98,15.55 1.77,0.3 3.5,0.77 5.27,1.05 3.67,0.57 5.1,2.5 5.96,6.33 1.93,8.66 3,17.3 2.7,26.13 -1.02,23.5 -12.04,42.17 -28.75,57.7 -5.67,5.26 -13.34,8 -20.2,11.65 -5.68,3.04 -11.88,5.26 -17.85,7.84 -5.6,2.4 -11.3,3.76 -17.4,3.02z\" />\n    <!-- Further (darker) leg -->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_2\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M279.22,471.42c10.28,-2.2 31,-8.76 39.53,-13.88 15.54,-9.33 30.38,-26.6 38.56,-45.9 2.8,-6.6 4.07,-13.63 6.14,-20.42 1.6,8.36 -0.26,16.5 -1.88,24.6 -2.68,13.42 -6.86,26.16 -18.13,35.28 -1.77,1.43 -4.2,3.32 -2.35,6.14 1.8,2.72 4.05,0.22 6.67,-0.2 -0.63,14.65 -0.92,29.07 -5.2,43.06 -0.4,1.3 -1.17,2.33 -2.4,2.93 -4.9,2.4 -6.57,6.43 -6.3,11.65 0.1,1.32 0.52,3.26 -1.26,3.83 -1.5,0.48 -2.1,-1.28 -3.03,-2.1 -8.05,-6.85 -17.14,-3.58 -19.1,7.03 -0.4,2.23 -1.14,3.6 -3.45,3.97 -2.78,0.45 -2.6,-1.84 -3.18,-3.4 -2.16,-5.7 -6.1,-8.9 -12.32,-9.58 -6.35,-0.7 -9.8,2.8 -12.1,7.83 -1.3,2.84 -3.1,3.34 -5.83,2.87 -11.17,-1.92 -13.98,-5.16 -14.82,-16.36 -0.4,-5.35 -1.23,-10.68 -2.2,-15.95 -0.7,-4.03 0.65,-6.12 4.68,-6.8 5.2,-0.85 9.8,-3.38 14.57,-5.45 4.48,-1.94 5.6,-5.36 3.4,-9.13z\" />\n    <!-- Closer (brighter) tusk -->\n    <path\n        android:fillColor=\"@color/elephant_friend_light_color_2\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M249.68,262.06c3.5,-0.82 4.93,1.67 5.86,4.97 3.6,12.78 10.14,23.67 20.14,32.58 14,12.5 30.04,16.68 48.3,13.13 2.23,-0.44 4.53,-0.58 6.8,-0.57 4.1,0.04 5.33,2.14 3,5.52 -4,5.78 -8.6,10.78 -15.63,13.23 -7.17,2.52 -13.93,5.86 -21.84,6.23 -16.13,0.74 -32.02,-1.26 -46.68,-7.43 -12,-5.05 -23.18,-12.57 -32.14,-22.42 -3.85,-4.23 -2.73,-10.12 -2.02,-15.4 2.15,-15.97 17.82,-29.77 34.22,-29.82z\" />\n    <!-- Further (darker) tusk -->\n    <path\n        android:fillColor=\"@color/elephant_friend_light_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M386.24,295.4c-3.06,0.45 -4.2,-0.34 -5.38,-1.74 -8.34,-10 -11.94,-21.93 -14.35,-34.37 -0.4,-2.1 0.76,-2.4 2.2,-1.6 9.53,5.12 19.88,5.2 30.3,5.42 5.46,0.12 10.57,-1.34 15.8,-2.42 1.9,-0.4 3.78,-1.05 5.7,-1.24 6.18,-0.6 9.65,3.83 7.25,9.58 -3.34,8 -8.94,14.28 -16.45,18.6 -8.12,4.7 -17.02,7.06 -25.06,7.75z\" />\n    <!-- Further (darker) hand -->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_2\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M415.42,367.63c3.53,7.75 3.7,14.84 -1.1,21.63 -1.47,2.08 -2.6,3.8 -4.82,0.34 -2.13,-3.3 -5.82,-5.17 -9.16,-7.13 -3.4,-2 -7.63,-0.44 -10.03,3.4 -3.4,5.4 -3.34,11.18 -0.97,16.85 1.1,2.62 0.66,3.87 -1.82,4.83 -3.94,1.53 -7.83,3.18 -11.77,4.7 -3.52,1.37 -4.58,-0.35 -3.97,-3.52 0.7,-3.68 1.24,-7.33 1.4,-11.1 0.43,-10.68 -0.85,-21.07 -3.92,-31.3 -1.53,-5.1 -0.83,-5.73 4.46,-5 1.3,0.2 2.6,0.54 3.87,0.44 4.14,-0.33 6.56,0.94 8.54,5.16 4.2,8.94 16.8,10.77 25.28,4.26 1.28,-1 2.43,-2.14 4.04,-3.57z\" />\n    <!-- Shadow on the body under the head -->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M235.36,329.56c-4.9,2.3 -9.54,-0.06 -14.25,-0.8 -6.7,-1.02 -13.33,-2.44 -19.7,-4.93 -12,-4.72 -13.4,-7.95 -8.3,-19.3 2.5,-2.93 6.32,-0.56 9.12,-2.3 1.8,3.48 5.23,4.16 8.6,4.97 4.9,8.3 12.62,13.74 20.15,19.33 1.43,1.06 2.93,2.03 4.4,3.03z\" />\n    <!-- Lil thing on the tail -->\n    <path\n        android:fillColor=\"#7F90A4\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M29.1,436.15c0.18,-2.77 -0.3,-6.05 1.6,-8.98 1.46,-2.3 2.84,-3.05 4.6,-0.17 3.4,5.6 1.73,11.95 -4,15.13 -5.14,2.86 -4.4,7.85 -4.28,12.5 0.12,4.1 -2.63,8.4 -6.48,9.67 -3.95,1.3 -5.53,0.05 -5.24,-4.04 0.23,-3.2 1.85,-5.46 4.5,-7.1 1.9,-1.16 2.7,-2.1 0.24,-3.82 -1.63,-1.15 -2.64,-3.12 -4.28,-4.5 -2.75,-2.34 -2.9,-7.88 -0.46,-9.67 3.34,-2.43 6.07,-1.22 8.24,1.92 0.37,0.52 2.8,4.4 4.6,3.72 2.06,-0.77 0.83,-2.63 0.96,-4.67z\" />\n    <!-- Further (darker) eye whiteness-->\n    <path\n        android:fillColor=\"@color/elephant_friend_light_color_2\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M352.32,197.8c-15.1,-5.94 -17.93,-25.7 -15.68,-37.5 1,-5.23 1.8,-10.65 5.4,-14.95 2.45,-2.9 5.87,-3.17 7.35,-0.58 0.72,1.27 1.88,3.03 -1.13,3.43 -2.77,0.37 -3.95,2.48 -4.73,4.95 -3.13,9.84 -1.9,26.38 2.35,32.03 1.93,2.58 3.1,4.33 6.02,7.17 2.7,2.62 2.47,2.93 0.4,5.46z\" />\n    <path\n        android:fillColor=\"@color/elephant_friend_light_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M113.84,383.72c0.02,6.36 -0.75,6.95 -6.06,5.1 -2.14,-0.74 -4.16,-2.02 -6.35,-2.4 -4.78,-0.8 -3.77,-2.96 -1.96,-5.94 2.34,-3.86 5.7,-5.3 9.85,-4.28 4.17,1.03 4.24,4.8 4.52,7.52zM67.34,378.3c-2.27,-0.08 -0.84,-9.75 3.55,-11.8 4.3,-2 9.2,-0.32 11.33,3.1 1.98,3.2 1.1,11.72 -1.73,10.7 -2.27,-0.85 -7.85,-1.78 -13.16,-2zM393.28,396.27c0.18,-3.52 0.04,-7 3.72,-8.44 1.34,-0.52 8.55,7.1 8.54,8.64 -0.02,1.2 -8.14,7.03 -9.65,6.48 -3.38,-1.2 -1.88,-4.57 -2.62,-6.68zM137.77,397.7c-0.37,2.2 -1.43,4.63 -3.94,6.13 -0.57,0.34 -8.98,-6.25 -9,-6.88 -0.1,-2.22 5.47,-7.36 7.8,-7.23 2.6,0.14 5.22,3.88 5.14,7.98zM161.73,546.88c-2.15,-0.78 -6.73,1.67 -6.56,-3.93 0.13,-4.1 3.75,-7.33 7.26,-6.8 3.2,0.5 7.03,6.24 6.22,9.37 -0.4,1.56 -0.4,1.56 -6.92,1.36zM131.66,531.32c4.36,-0.1 8.77,6.83 6.85,10.74 -0.74,1.53 -1.95,0.9 -2.9,0.6 -2.02,-0.6 -3.97,-1.46 -5.94,-2.2 -2.3,-0.86 -5.52,-0.77 -4.6,-4.76 0.8,-3.6 3.42,-4.4 6.6,-4.38zM293.12,519.15c3.6,1.2 5.8,5.53 5.1,7.66 -0.8,2.48 -6.9,1.98 -8.64,1.9 -2.1,-0.13 -5.96,-1.66 -6.4,-3.37 -0.43,-1.6 0.95,-3.04 2.1,-4.16 1.38,-1.32 4.17,-3.24 7.84,-2.02zM320.45,517.26c2.46,0.8 5.4,1.4 5.67,4.47 0.25,3 -2.85,2.34 -4.63,3.04 -0.45,0.18 -0.92,0.35 -1.4,0.42 -1.84,0.28 -3.83,1.83 -5.5,0.35 -1.15,-1 -0.5,-2.84 0.3,-4.04 1.3,-2 2.78,-3.97 5.55,-4.24zM190.93,529.32c1.58,-0.08 2.62,0.53 2.2,2.25 -0.36,1.4 -0.93,2.77 -1.58,4.07 -1.38,2.76 -2.86,5.63 -6.32,6.02 -1.1,0.13 -0.9,-1.46 -0.83,-2.38 0.4,-4.83 3.67,-9.8 6.53,-9.96zM339.9,507.95c0.86,3.34 -0.14,4.58 -1.5,5.93 -1.1,-2.24 0.18,-3.46 1.5,-5.93z\" />\n    <!-- Dots inside the speech bubble -->\n    <path\n        android:fillColor=\"@color/elephant_friend_light_color_2\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M449.67,120.45c-0.56,6.07 -4.03,9.7 -8.44,9.42 -4.9,-0.32 -7.8,-3.82 -7.27,-8.78 0.45,-4.3 5.1,-8.1 9.58,-7.8 4.93,0.3 6.04,3.64 6.13,7.15zM479.33,123.64c-0.57,6.07 -4.03,9.7 -8.44,9.42 -4.9,-0.32 -7.8,-3.82 -7.28,-8.78 0.45,-4.28 5.1,-8.08 9.58,-7.8 4.93,0.32 6.04,3.65 6.13,7.16zM416.6,116.9c-0.58,6.06 -4.04,9.7 -8.45,9.4 -4.9,-0.3 -7.8,-3.8 -7.27,-8.77 0.45,-4.28 5.1,-8.08 9.58,-7.8 4.93,0.32 6.03,3.65 6.13,7.16z\" />\n    <!-- Closer eye border, fur on the chest, trunk inners -->\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M195.24,152.74c7.74,-11.83 18.38,-18.1 33.3,-15.86 16.5,2.5 27.95,10.5 30.4,25.3 3.8,22.83 -9.52,47.04 -37.8,49.3 -15,1.18 -27.8,-6.6 -33.2,-22.3 -5.08,-14.78 1.8,-28.04 7.3,-36.44zM233.13,336.23c-3.38,3.85 -4.73,8.13 -5.24,12.7 -0.2,1.73 -0.88,3.85 0.95,4.96 1.95,1.18 4.04,0.58 5.93,-0.66 2.84,-1.88 5.68,-3.77 8.6,-5.5 2.82,-1.66 4.3,-1.22 3.7,2.52 -1.02,6.47 0.4,12.64 2.83,18.6 2,4.88 6.94,5.66 10.4,1.6 2.55,-3 4.53,-6.36 6.14,-9.95 1.73,-3.87 4.12,-5.4 8.46,-3.1 4.98,2.6 6.83,1.5 8.35,-4.05 0.38,-1.4 0.65,-2.85 1,-4.27 0.34,-1.35 0,-3.3 1.95,-3.48 1.74,-0.15 3.12,1.1 3.77,2.64 2.08,4.84 1.66,9.83 -1.26,13.96 -2.9,4.1 -7.3,7 -12.64,5.4 -3.4,-1.03 -4.6,0.33 -6.08,2.78 -2.34,3.86 -4.54,8.03 -9.38,9.4 -9.73,2.77 -16.5,-1.07 -19.34,-10.9 -0.3,-1.1 -0.63,-2.2 -0.8,-3.33 -0.98,-6.03 -0.97,-6.04 -7.13,-4.43 -6.8,1.78 -11.85,-2.22 -11.2,-9.22 0.3,-3.02 1.43,-5.98 2.4,-8.9 0.54,-1.7 1.44,-3.3 2.33,-4.84 1.27,-2.2 3.04,-3.38 6.27,-1.93zM396.93,346.85c1.1,-8.24 4.9,-16.17 11.23,-22.87 1.35,-1.42 3.2,-2.32 5.2,-2.45 2.95,-0.2 4.2,1.35 3.64,4.25 -0.12,0.6 -0.54,1.17 -0.88,1.72 -3.8,6.24 -7.34,12.55 -6.02,20.32 0.07,0.45 -0.16,0.95 -0.25,1.43 -0.96,4.73 -3.7,7.37 -7.28,7 -3.46,-0.34 -5.76,-3.8 -5.64,-9.4z\" />\n    <!-- Stripes on the body -->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M339.6,394.63c-2.8,5.76 -5.05,12.45 -11.24,16.56 -1.6,1.04 -3.35,1.4 -4.9,-0.13 -1.4,-1.35 -1.2,-3.02 -0.4,-4.5 2.6,-4.88 5.2,-9.75 8,-14.5 1.23,-2.06 3.3,-3.22 5.84,-2.32 1.9,0.67 2.56,2.35 2.7,4.88zM99.37,195.3c0,5.1 -0.74,9.43 -1.8,13.7 -0.7,2.8 -2.47,4.76 -5.65,4 -3.27,-0.8 -3.62,-3.4 -2.94,-6.2 0.95,-3.96 1.85,-7.93 3.04,-11.82 0.76,-2.5 1,-6.24 4.72,-5.75 4,0.53 2.55,4.16 2.63,6.07zM306.3,404.28c-0.4,0.8 -0.8,2.3 -1.68,3.38 -2.87,3.52 -5.74,7.07 -8.97,10.24 -1.6,1.6 -4,3.56 -6.38,1.17 -2.1,-2.1 -0.64,-4.1 0.9,-5.97 3.17,-3.88 5.07,-8.74 9.14,-11.93 1.47,-1.13 3,-2.12 4.9,-1.1 1.4,0.76 2.08,2 2.1,4.2z\" />\n    <!-- Stripes on the trunk -->\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M348.56,246.42c0.34,0.05 1.82,0.1 3.2,0.53 1.93,0.6 2.9,2.2 2.56,4.15 -0.4,2.17 -2.1,2.8 -4.1,2.32 -5,-1.2 -9.1,1.4 -13.42,3.06 -1.2,0.47 -2.28,1.25 -3.46,1.75 -1.94,0.83 -3.96,1 -5.14,-1.1 -1.27,-2.24 0.28,-3.54 2.07,-4.67 5.27,-3.32 10.78,-5.92 18.3,-6.04z\" />\n    <!-- Some stripes on the body -->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M93.92,356.84c0.62,-4.05 2.12,-7.92 4.52,-11.26 2.05,-2.86 13.07,-8.75 11,-0.02 -0.9,3.88 -13.95,23.17 -15.52,11.28 0.87,-5.7 0.2,1.54 0,0zM293.28,451.9c-2.74,-0.2 -4.53,-0.6 -5.22,-2.56 -0.7,-1.95 0.73,-2.94 2.15,-3.84 4.1,-2.6 7.46,-6.24 11.86,-8.45 2.12,-1.06 3.98,-1.3 5.73,0.54 1.98,2.07 0.75,3.87 -0.58,5.6 -3.77,4.85 -9.4,6.57 -13.94,8.7zM157.6,506.77c-0.1,0.93 -0.1,2.24 -0.4,3.5 -0.5,2.28 -1.95,3.8 -4.36,3.85 -2.33,0.07 -3.6,-1.68 -4,-3.62 -1.13,-5.65 0,-11.33 1.05,-16.8 0.6,-3.12 3.28,-2.43 4.95,0.03 2.62,3.85 2.18,8.37 2.76,13.04zM121.98,171.47c0,4.06 -1.3,8 -1.03,12.08 0.15,2.4 -1.83,3.8 -4.16,3.9 -2.48,0.1 -3.32,-1.92 -3.55,-3.9 -0.8,-6.62 1.78,-12.7 3.4,-18.92 0.26,-0.94 1.18,-1.55 2.28,-1.5 1.32,0.1 2.18,0.96 2.38,2.1 0.4,2.05 0.47,4.16 0.68,6.24zM127.7,234.96c-0.1,1.63 -0.28,4.04 -0.38,6.46 -0.1,2.66 -1.78,3.8 -4.1,3.78 -2.47,-0.03 -4.1,-1.8 -3.97,-4.06 0.28,-4.8 0.3,-9.73 3.2,-13.94 0.83,-1.2 1.7,-2.65 3.37,-2.32 2.14,0.43 1.78,2.4 1.85,3.96 0.1,1.77 0.02,3.55 0.02,6.12zM177.7,488.12c-0.52,3.22 0.87,8.16 -4.78,7.6 -5.6,-0.57 -4,-5.25 -3.75,-8.8 0.15,-2.08 0.56,-4.17 1.07,-6.2 0.4,-1.62 1.35,-3 3.28,-3.08 1.93,-0.07 2.9,1.24 3.5,2.83 0.92,2.47 1.26,5 0.7,7.65zM272.2,445.54c-0.3,0.63 -0.48,1.5 -1,2.03 -4.33,4.35 -10.06,5.68 -15.74,6.93 -1.43,0.32 -2.77,-0.9 -3.1,-2.53 -0.34,-1.53 0.66,-2.5 1.86,-3.07 4.22,-2.06 8.47,-3.98 12.57,-6.3 2.18,-1.24 4.85,-0.65 5.4,2.94zM102.32,145.58c1.64,-5.07 4.9,-9.88 8.67,-14.37 0.64,-0.77 1.66,-1 2.65,-0.48 1,0.53 1.38,1.55 1.1,2.5 -1.63,5.42 -3.5,10.8 -6.2,15.78 -0.85,1.57 -2.84,1.46 -4.45,0.88 -1.67,-0.62 -1.83,-2.1 -1.78,-4.3z\" />\n    <!-- Stripes -->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M144.84,486.52c0,1.3 0.1,2.94 -0.03,4.55 -0.17,2.34 -1.25,4.17 -3.8,4.27 -2.65,0.1 -4.1,-2 -4,-4.07 0.23,-4.34 0,-8.8 1.37,-13.02 0.5,-1.5 1.36,-2.67 3.15,-2.47 1.52,0.17 2.25,1.36 2.45,2.68 0.4,2.56 0.57,5.15 0.87,8.06z\" />\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M81.02,341.44c1.3,-3.72 4.4,-17.26 11.34,-12.86 7.63,4.85 -12.85,22.17 -11.34,12.87 1.3,-3.7 -0.2,1.3 0,0zM107.94,313.03c0.88,-3.87 1.65,-7.9 4.5,-10.98 1.52,-1.63 3.36,-2.55 5.6,-1.08 2.35,1.54 1.9,3.58 0.87,5.53 -1.56,2.98 -3.24,5.9 -5.06,8.75 -0.9,1.44 -2.4,2.25 -4.18,1.52 -1.6,-0.66 -1.77,-2.14 -1.72,-3.74z\" />\n    <!-- Some dark stripes -->\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M342.43,271.95c-1.83,0 -3.2,0 -3.8,-1.48 -0.53,-1.25 0.2,-2.2 1.04,-3 4.12,-3.8 9.28,-5.16 14.6,-5.7 2.03,-0.2 4.25,0.87 4.33,3.64 0.06,2.56 -1.9,2.55 -3.7,2.87 -4.44,0.8 -8.7,2.26 -12.47,3.68zM202.22,302.22c-1.4,7.32 -5.82,2.58 -9.13,2.3 -2.34,-1.72 -4.7,-3.4 -6.98,-5.2 -1.35,-1.07 -2.27,-2.5 -1.12,-4.2 1,-1.46 2.65,-1.47 3.9,-0.6 4.2,2.98 9.44,4.16 13.32,7.7z\" />\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M356.13,286.15c-2.13,-0.24 -5.3,0.83 -5.03,-2.32 0.3,-3.4 3.6,-4.4 6.62,-4.34 2.07,0.03 4.6,0.8 4.2,3.6 -0.5,3.4 -3.13,3.7 -5.8,3.05z\" />\n    <!-- Closer (brighter) eye whiteness-->\n    <path\n        android:fillColor=\"@color/elephant_friend_light_color_2\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M249.37,187.45c-7.92,14.6 -25.8,23.77 -44.07,13.36 -8.45,-4.8 -11.9,-14.85 -11.95,-23.45 -0.1,-12.7 6.15,-22.22 16.36,-30.07 10.78,-8.3 34.38,-4.27 40.84,10.76 2.74,6.4 3.9,20.05 -1.17,29.4z\" />\n    <!-- Closer eye pupil -->\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M245.26,175.92c0.12,9.8 -6.64,19.24 -18.34,21.65 -12.87,2.66 -23.04,-5.27 -25.9,-15.54 -2.43,-8.64 3.8,-20.3 9.64,-25.97 6.9,-6.73 18.22,-7.67 25.9,-2.63 8.8,5.8 8.6,14.37 8.7,22.5z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/errorphant_error.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"200dp\"\n    android:height=\"153dp\"\n    android:viewportWidth=\"600\"\n    android:viewportHeight=\"460\">\n    <!-- Border -->\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M321.28,457.4c-12.3,0 -37.47,-6.95 -60.17,-29.47 -12.6,-12.53 -26.3,-21.46 -43.42,-27.73 -2.63,-0.96 -9.86,-2.85 -17.5,-4.86 -11.66,-3.05 -24.87,-6.5 -31.38,-9.04 -13.04,-5.1 -28.76,-14 -43.14,-24.46 -1.02,-0.75 -1.57,-1.06 -2.3,-1.1 -1.82,-0.04 -3.68,-0.07 -5.53,-0.07 -8.96,0 -18.5,0.65 -29.18,2 -6.8,0.84 -34.75,3.5 -41.1,2.12 -11,-2.4 -22.87,-3.7 -32.52,-15.17 -7.64,-9.08 -11.12,-19.6 -10.63,-32.18 0.36,-9.35 1.7,-26.2 6.68,-34.05l0.67,-1.06c4.8,-7.63 13.73,-21.84 28.02,-21.84 0.34,0 0.68,0 1.03,0.02 1.02,0.05 2.26,0.08 3.7,0.08 7.73,0 20.05,-0.74 30.14,-2.38 16.3,-2.65 17.26,-5.95 17.26,-5.98l0.1,-1.63c0.58,-8.3 1.43,-20.6 6.28,-28.1 -0.83,-0.32 -1.8,-0.77 -2.73,-1.5 -12.48,-9.97 -15.76,-20.93 -16.84,-34.32 -0.48,-6.1 0.05,-11.78 1.64,-17.4l0.03,-0.13c0.43,-1.54 0.53,-1.67 -0.14,-2.06 -9.97,-5.8 -15.37,-16.72 -5.3,-23.35 0.6,-0.4 0.3,-1.64 0.34,-2.7 0.02,-0.6 0.05,-1.2 0.1,-1.8 0.76,-7.43 3.88,-12.48 9.54,-15.44 2.66,-1.37 5.35,-2.07 8,-2.07 6.03,0 10.87,3.63 12.96,9.7 1.16,3.37 2.34,3.94 4.54,3.94 0.4,0 0.84,-0.03 1.3,-0.08 1.13,-0.13 2.13,-0.18 3.05,-0.18 4.54,0 7.57,2.4 9.9,5.64 3.43,4.77 5.56,10.2 0.66,17.1 -4,5.7 -10.02,8.3 -17.02,10.24 -1.23,0.34 -1.5,0.47 -1.58,2.15v0.12c-0.37,7.24 0.26,17.12 5.68,22.78 1.35,1.42 1.88,2.15 2.22,2.38 0.28,-0.26 0.84,-0.9 1.7,-2.43 8.93,-15.66 22.3,-37.78 35.42,-49.08 28.43,-25.4 76.36,-37 108.83,-37 24.22,0 52.2,6.3 76.8,17.3 9.6,4.3 17.9,8.76 25.42,13.65 1.9,1.25 4.13,1.98 6.44,2.7 8.9,2.7 13.9,10.18 12.82,19.1 3.34,-0.78 7.3,-1.6 11.3,-1.6 4.18,0 7.88,0.87 11.3,2.62 3.53,1.8 7.63,4.6 8.15,10.23 0.05,0.52 0.13,0.83 0.18,1 0.04,0 0.1,0 0.15,0 0.43,0 1.05,-0.1 1.9,-0.3 12.7,-2.87 25.33,-4.34 37.5,-4.34 11.6,0 23.18,1.32 34.4,3.93 10.1,2.34 18.22,5.1 25.6,8.7 6.36,3.1 6.6,7.85 6.18,10.4 -0.48,2.88 0.4,4.22 4.32,6.5 5.64,3.3 9.18,7.57 10.23,12.33 0.98,4.45 -0.2,9.25 -3.45,13.9 -1.18,1.68 -2.66,3.52 -4.7,4.4 -0.87,0.36 -1.27,0.66 -1.45,0.8 0.1,0.24 0.34,0.76 1.07,1.65 1.67,2.07 2.87,4.47 3.8,6.54 3.88,8.5 1.5,17.12 -6.2,22.5 -0.55,0.4 -1.12,0.78 -1.7,1.15 19.83,4.68 37.5,11.4 53.88,20.43 33.24,18.4 22.08,59.78 14.97,74.18 -4.9,9.94 -14.1,17.58 -24.62,20.45 -0.02,0.2 -0.02,0.58 0.05,1.3 1.67,15.82 -3.7,29.94 -15.95,41.95 -3.16,3.1 -3.52,5.05 -1.54,8.36 2.03,3.4 2.47,7.07 1.24,10.63 -1.87,5.4 -7.05,9.1 -10.92,10.6 -3.6,1.4 -7.32,2.1 -11.08,2.1 -4.3,0 -8.7,-0.92 -13.12,-2.72 -6.73,-2.75 -9.85,-8.4 -12.6,-13.36l-0.4,-0.7c-2.64,-4.76 -5.9,-7.54 -10.58,-9 -7.04,-2.23 -10.63,-6.94 -9.85,-12.94 0.77,-6.1 6.87,-11.87 13.3,-12.58 0.25,-0.03 0.5,-0.04 0.78,-0.04 0.64,0 1.28,0.08 1.83,0.15 0.33,0.05 0.64,0.08 0.9,0.1 0,-0.05 0,-0.1 0,-0.17 0.42,-4.64 -1.65,-6.03 -3.24,-6.67 -1.93,-0.78 -3.86,-1.57 -5.8,-2.36 -7.1,-2.92 -14.45,-5.94 -21.82,-8.17 -4.15,-1.24 -9.04,-4.14 -13.1,-1.85 -27.47,15.4 -63.35,20.64 -83.45,12.53 2.3,12.2 -0.4,25.7 -4,34.87 -5.3,13.6 -20.65,28.48 -37.1,29.84 -2.2,0.2 -4.6,0.3 -7.12,0.3z\" />\n    <!-- Speech bubble background -->\n    <path\n        android:fillColor=\"@color/elephant_friend_accent_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M391.52,111.36c-8.73,-4.53 -16.67,-10.5 -21.26,-19.1 -19.5,-36.4 2.8,-73.47 32.2,-84.1 23,-8.3 47.55,-4.8 64.37,6.84 33.84,23.44 34,68.18 7.96,92.03 -16.08,14.72 -38.5,13 -45.05,14.36 -3.35,0.68 -22.67,15.33 -28.36,21.22 -1.4,1.44 -2.97,2.76 -5.16,1.85 -2.32,-0.96 -2,-3.1 -1.98,-5.04 0,-2.1 -0.28,-26.8 -2.74,-28.07z\" />\n    <!-- Lighter body part -->\n    <path\n        android:fillColor=\"@color/elephant_friend_body_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M69.6,356.3c-5.73,-8.7 -19.5,-8.76 -24.82,0.05 -1.18,1.95 -2.48,1.28 -3.7,1 -2.07,-0.45 -4.18,-1.1 -4.1,-3.97 0.18,-5.66 -2.76,-9.95 -6.65,-13.6 -3.22,-3 -7.08,-4.68 -11.7,-3.47 -5.06,1.34 -4.73,-3.3 -6.2,-5.74 -1.56,-2.58 0.45,-3.45 2.56,-4.43 12.08,-5.62 13.63,-18.92 3.07,-27.3 -1.8,-1.43 -0.9,-2.26 -0.8,-4 0.84,-11.47 15,-28.07 21.86,-26.92 12.13,2.03 61.1,0 61.1,-12.66 0,-18.32 4.07,-24.24 9.4,-35.55 0.95,-2.02 1.7,-3.74 -1.2,-4.5 -12.15,-3.25 -18.16,-12.13 -21.06,-23.35 -2.28,-8.87 -3.1,-17.97 0.77,-26.77 0.98,-2.22 2.08,-4.6 4.92,-4.93 3.77,-0.44 5.73,2.27 4.84,6.97 -1.96,10.3 -0.7,20.06 4.67,29.18 3.1,5.27 9.45,8.6 13.92,7.7 1.6,-0.33 2.36,-0.8 3.17,-2.33 10.38,-19.3 19,-37.94 39.08,-53.72 37.87,-29.77 70.44,-32.55 97.17,-32.55 45.35,0 87.96,17.5 95.15,25.83 -11.14,3.8 -20.23,10.02 -28.45,17.45 -5.96,5.4 -10.9,11.7 -14.47,18.9 -1.56,3.16 -3.62,5 -7.27,5.66 -11.28,2 -22.37,4.95 -33.08,8.95 -17.87,6.68 -33.15,17.48 -46.26,31.17 -13.46,14.05 -22.82,30.32 -25.44,49.9 -1,7.45 0.6,10.16 7.9,12.46 1.8,0.57 1.86,1.4 1.58,2.82 -0.95,4.82 -0.8,9.7 -0.7,14.57 0.14,9.46 8.3,14.97 17.36,11.86 5.43,-1.86 9.5,-5.5 13,-9.9 7.64,9.83 20.6,9.16 29.07,-1.14 6.94,-8.44 12.32,-17.56 14.23,-28.47 0.42,-2.38 1.03,-4.68 -1.6,-5.95 -3.07,-1.5 -3.4,1.5 -4.43,3.12 -3.75,5.8 -5.07,12.7 -8.37,18.7 -3.42,6.22 -7.25,12.06 -14.84,13.94 -3.7,0.93 -6.4,0.08 -7.66,-3.9 -0.65,-2.1 -1.1,-5.13 -3.9,-4.96 -3.18,0.2 -6.4,1.37 -8.22,4.47 -1.87,3.2 -4.5,5.57 -7.93,6.92 -4.45,1.75 -7.74,0.02 -9,-4.6 -1.46,-5.37 -0.34,-10.67 0.66,-15.94 1.2,-6.37 0.74,-7.37 -5.55,-7.6 -3.83,-0.16 -4.8,-1.94 -5.3,-5.42 -1.4,-10.06 3.9,-17.97 8.25,-26.03 6.46,-12 15.9,-21.5 26.28,-30.5 15.37,-13.35 33.9,-18.88 52.62,-24.67 5.7,-1.77 11.74,-1.94 17.27,-4.9 3.57,-1.9 5.42,-4.7 7.13,-7.58 9.46,-16.04 22.5,-27.63 40.53,-33.23 1.98,-0.6 4.2,-0.7 6.3,-0.62 9.52,0.32 13.1,6.6 8.56,14.92 -0.78,1.43 -1.86,2.73 -2.4,4.22 -0.5,1.4 -2.26,2.88 -0.67,4.44 1.55,1.54 3.14,0.08 4.48,-0.57 5.24,-2.58 10.84,-3.38 16.56,-3.83 4.2,-0.34 7.74,1.32 11,3.55 3.6,2.45 3.12,6.53 -0.94,8.3 -1.66,0.73 -4.04,1.1 -3.3,3.34 0.86,2.65 3.22,1.34 5.02,0.77 5.85,-1.86 11.02,-0.03 15.7,3.2 2.9,2 3.03,4.66 -0.3,6.57 -2.55,1.46 -5.96,2.36 -4.6,6.23 1.3,3.7 4.16,6.8 8.15,6.97 13.5,0.57 23.78,7.23 32.93,16.24 2.63,2.58 5.95,4.48 8.23,8 -2.18,1.1 -4.04,0.43 -5.88,0.13 -12.5,-2 -23.3,1.74 -32.6,9.88 -3.86,3.35 -5.5,8.1 -6.13,12.98 -0.85,6.53 4.4,13.76 11.48,14.03 11.92,0.44 23.68,2.8 35.62,2.6 4.62,-0.06 8.8,-2.13 13.5,-3.94 1.5,12.74 6.87,23.74 12.65,34.73 8.35,15.86 20.1,28.36 36.77,34.92 22.44,8.85 34.3,40.07 25.13,60.53 -3.08,6.86 -8.52,12.25 -12.52,18.57 -2.76,4.38 -4.1,8.6 -1.64,13.25 2.26,4.3 -0.05,6.2 -3.6,7.08 -13,3.2 -20.02,0.87 -27.64,-11.32 -2.52,-4.02 -5.66,-7.08 -10.42,-8.2 -2.42,-0.58 -5.72,-1.6 -5.24,-4.06 0.65,-3.37 4.3,-5.7 7.6,-4.62 5.52,1.84 7.5,-0.47 8.54,-5.14 0.2,-0.26 0.3,-0.55 0.4,-0.87 0.63,-2.7 4.9,-3.34 4.16,-6.7 -1.03,-4.7 -3.6,-8.73 -6.6,-12.4 -5.77,-7 -12.74,-12.52 -21.36,-15.84 -5.74,-2.2 -11.82,-2.4 -17.78,-3.28 -2.42,-0.35 -4.73,-0.5 -4.2,-3.87 3.85,-7.1 6.87,-14.28 5.16,-22.7 -0.87,-4.27 -3.37,-5.35 -7.07,-4.56 -3.67,0.76 -7.3,1.8 -10.87,2.96 -17.76,5.8 -35.05,2.7 -51.7,-3.8 -5.15,-2 -10.2,-6 -11,-13.4 -0.7,-6.38 -5.26,-11.4 -10.52,-15.3 -1.34,-1 -2.92,-1.7 -4.46,-0.27 -1.58,1.43 -0.7,2.9 0.04,4.4 1.42,2.86 3.93,5.13 4.96,8.7 -4.48,0.26 -8.5,-0.5 -12.52,0.23 -13.87,2.54 -26.6,15.42 -20.08,32.27 0.36,0.94 1.87,1.92 0.46,2.94 -1.14,0.82 -2,-0.07 -2.88,-0.98 -6.13,-6.43 -9.6,-11.9 -17.46,-16.82 -1.64,-1.02 -0.26,-1.8 0.6,-2.56 9.15,-8.4 10.2,-15.07 4.03,-25.73 -3.64,-6.28 -2.94,-8.92 2.85,-13.65 6.3,-5.16 13.24,-8.12 21.55,-7.82 6.38,0.23 12.33,-1.2 17.42,-5.36 5.8,-4.77 8,-16.44 3.17,-21.03 -3.6,-3.44 -7.15,-7.06 -11.5,-9.74 -9.28,-5.7 -19.2,-4.6 -29,-2.65 -13.74,2.77 -25.8,8.4 -32.57,21.72 -4.28,8.42 -4.47,16.48 1.75,24.1 0.93,1.16 2.05,2.2 1.02,3.86 -4.24,6.82 -4.57,14.5 -4.62,22.14 -0.02,3.27 -1.04,3.68 -3.64,2.3 -6.06,-3.16 -12.72,-4.06 -19.38,-4.92 -1.76,-0.22 -4.1,-0.43 -4.64,1.66 -0.58,2.35 1.94,2.72 3.5,3.17 11.46,3.24 21.72,8.8 31.45,15.47 3.1,2.12 6.43,3.88 9.97,5.25 1.65,0.64 3.23,1.58 4.66,2.63 1.2,0.87 2.33,2.2 1.13,3.72 -1.3,1.62 -2.2,0.02 -3.2,-0.72 -3.6,-2.66 -7.78,-3.45 -12.08,-3 -8.3,0.9 -12.36,7.23 -9.82,15.53 1.2,3.92 1.26,5.22 -3.6,4.1 -7.13,-1.62 -12.6,1.03 -15.35,6.45 -3.26,6.48 -3.14,12.7 2.5,16.13 5.05,3.06 1.16,9.17 0.1,13.5 -1.7,6.83 -3.96,13.37 -1.1,21.64 3.06,8.8 13.08,19.8 12.14,20.82 0,0 -8.6,-7.64 -15.87,-14.15 -7.17,-6.43 -21,-18.34 -29.36,-23.58 -9.32,-5.86 -28.5,-12.07 -43.38,-13.65 -13.67,-1.44 -22.47,-4.1 -37.7,-10.97 -11.66,-5.25 -28.63,-19.36 -31.93,-20.23 -7.05,-1.87 -10.82,-2.45 -14.3,-2.45 -8.63,0 -34.66,5.76 -42.13,3.82 -1.6,-0.02 -3.2,0.58 -4.56,-0.75zM420.93,197.16c-0.24,-0.84 0.67,-1.47 1.2,-2.22 3.77,-5.33 3.78,-8.13 0,-13.15 -2.8,-3.74 -2.47,-4.4 1.98,-5.17 17.1,-2.97 42.73,-3.3 67.23,3.2 5.07,0.85 9.6,3.06 13.97,5.7 2.63,1.6 2.98,2.93 0.36,5.08 -3.75,3.1 -3.55,4.57 0.77,7.15 4.4,2.62 8.2,5.94 11.78,9.5 5.1,5.04 4.2,9.04 -2.6,11.7 -0.93,0.36 -1.9,0.6 -2.76,1.05 -4.6,2.4 -5.3,6.5 -1.78,10.25 2.34,2.5 4.82,4.87 6.92,7.56 3.08,3.95 2.6,6.92 -1.04,10.2 -4.1,3.67 -8.33,5.7 -14.24,3.87 -4.27,-1.3 -9.3,0.06 -13.65,0.58 -5.76,0.68 -6.3,-3.54 -10.32,-11.05 -6.53,-12.22 -16.73,-22.23 -28.2,-30.65 -8.96,-6.58 -18.9,-10.57 -29.6,-13.6z\" />\n    <!-- Closer (lighter) tusk -->\n    <path\n        android:fillColor=\"@color/elephant_friend_light_color_2\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M367,365c-5.62,-3.22 -12.82,-6.04 -18.2,-13.6 -2.02,-2.8 -2.67,-11.16 -2.17,-14.35 1.73,-11.04 12.7,-18.45 23.8,-16.7 3.8,0.58 6.42,2.86 8.56,5.17 10.5,11.33 24.06,15.2 38.78,16.66 12.5,1.24 24.8,0.75 36.6,-4.23 4.3,-1.8 4.3,1.12 3.97,3.94 -1.14,9.45 -7.24,15.76 -14.25,21.3 -9.04,7.13 -17.35,11.42 -30.92,12.56 -12.92,1.08 -34.5,-4.03 -46.19,-10.75z\" />\n    <!-- Further (darker) tusk -->\n    <path\n        android:fillColor=\"@color/elephant_friend_light_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M489.05,286.78c8.53,2.93 16.83,5.34 25.73,5.84 11.46,0.65 22.5,-0.88 33.27,-4.5 3.55,-1.2 3.46,0.85 2.86,2.74 -3.4,10.74 -9.5,19.5 -19.88,24.7 -2.45,1.24 -5.13,2.04 -7.76,2.88 -8.5,2.74 -14.32,-0.93 -19.8,-7.23 -6.36,-7.3 -10.17,-15.83 -14.4,-24.42z\" />\n    <!-- Further (darker) leg part-->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_2\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M521.15,285.08c-10.62,-0.05 -21.34,-1.6 -30.67,-7.75 -2.95,-1.94 -7.1,-12.07 -6.4,-15.37 0.5,-2.35 2.38,-1.63 3.68,-1.47 5.45,0.68 10.94,1.24 16.28,2.45 12.03,2.73 24.32,4.6 35.73,9.54 3.12,1.35 8.28,2.13 8.1,5.6 -0.18,3.48 -12.63,7.05 -26.72,6.98z\" />\n    <!-- Closer eye whiteness -->\n    <path\n        android:fillColor=\"@color/elephant_friend_light_color_2\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M307.15,290.35c-2.16,-1 -11.03,-13.56 -3.25,-23.94 11.47,-15.3 24.62,-23.65 47.68,-17.6 4.18,1.1 10.06,5.07 12.45,8.46 4.63,6.57 1.92,14.6 -5.87,16.43 -5.2,1.22 -13.14,1.58 -20.02,3.45 -6.97,1.9 -15.18,11.88 -23.14,13.56 -2.8,4.1 -5.34,2.1 -7.85,-0.35z\" />\n    <!-- Lil' thing on the tail-->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_2\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M78.46,151.37c0.96,-5.43 7,-1.63 5.7,-7.1 -1.1,-4.74 -0.97,-9.45 2.4,-13.4 2.78,-3.26 5.3,-3.13 8.2,0.04 2.6,2.85 2.92,6.35 3.3,9.96 0.63,5.8 0.8,5.77 6.05,3.27 5.02,-2.37 10.07,-1.92 13.32,1.04 2.16,1.97 2.72,4.04 0.8,6.38 -2.4,2.87 -4.7,5.77 -8.53,7.02 -3.03,1 -5.3,1.66 -8.2,-1.2 -4.23,-4.17 -10,-3.9 -14.03,0.2 -2.54,2.57 -9.7,-2.3 -9,-6.2z\" />\n    <!-- Eyedrop fill -->\n    <path\n        android:fillColor=\"@color/elephant_friend_accent_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M307.15,290.35c3.14,-1.97 5.2,0.92 7.85,0.36 -0.26,7.52 1.08,14.38 6.46,20.28 3.2,3.52 0.97,9.78 -3.76,12.32 -4.8,2.58 -11.38,0.7 -13.53,-3.92 -1.57,-3.36 -1.66,-6.9 -0.92,-10.48 1.28,-6.18 2.6,-12.36 3.9,-18.55z\" />\n    <!-- Small shadow at the bottom of the tusk -->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_2\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M459.46,357.55c4.5,2.6 9.65,1.97 14.47,2.82 18.8,3.3 32.48,13.36 37.03,31.44 2.25,8.94 -6.36,13.13 -9.36,14.08 3.07,-4.7 3.75,-8.56 3.8,-10.17 0.3,-6.3 -1.26,-11.65 -6.9,-15.6 -7,-4.9 -14.54,-8.7 -22.1,-12.47 -3.74,-1.86 -8.1,-2.38 -12.38,-2.3 -3.13,0.07 -6.15,-0.4 -9.94,-1.33 1.97,-2.36 3.67,-4.4 5.38,-6.45z\" />\n    <!-- Further eye whiteness-->\n    <path\n        android:fillColor=\"@color/elephant_friend_light_color_2\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M450.8,260.04c-7,0 -14,0.26 -20.97,-0.07 -8.43,-0.4 -10.94,-5.5 -6.68,-12.84 5.14,-8.82 13.86,-10.52 22.96,-11.36 6.47,-0.6 12.64,0.72 18.66,3.02 5.74,2.18 8.25,6.55 8.57,12.36 0.3,5.44 -2.8,8.83 -8.36,9.04 -4.72,0.18 -14.2,-0.1 -14.2,-0.16z\" />\n    <!-- Further leg part-->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_2\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M577.68,291.95c-7.1,-0.48 -14.1,3.47 -22.36,11.36 0.7,-4.76 3.92,-13.55 4.77,-16 0.7,-2.1 4.4,-3.03 7,-2.6 3.9,0.67 8.15,3.78 10.58,7.25z\" />\n    <!-- Fingers -->\n    <path\n        android:fillColor=\"@color/elephant_friend_light_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M283.18,382.77c-4.04,-3.35 -6.63,-6.3 -4.78,-11.25 1.56,-4.2 3.9,-7.02 8.8,-6.82 1.83,0.07 3.7,0.16 1.85,2.62 -3.32,4.4 -4.53,9.57 -5.87,15.45zM18.7,311.07c0.16,3.76 -1.36,6.56 -4.7,8.4 -2.17,1.17 -3,0.52 -2.7,-1.86 0.38,-3.2 0.67,-6.4 1.08,-9.6 0.24,-1.9 0.67,-4.34 2.9,-4.2 1.97,0.1 2.92,2.3 3.15,4.38 0.1,0.96 0.2,1.93 0.28,2.9zM312.4,347.97c-5.32,2.54 -10.6,3.83 -14.64,9.04 -0.3,-4.72 -0.6,-8.22 2.9,-10.15 3.73,-2.06 7.6,-1.9 11.73,1.12zM28.94,351c-3.7,-2.66 -8.33,-4.16 -10.83,-8.58 5.63,-1 8.32,0.55 11.04,6.08 0.46,0.87 0.5,1.7 -0.2,2.5zM62.3,357.75c-4.44,0.04 -8.86,2.5 -13.96,0.37 4.93,-3.02 9.36,-3.38 13.95,-0.37z\" />\n    <!-- Trunk inner part-->\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M510.95,411.05c4.92,-0.04 9.25,1.2 13.14,3.8 3.2,2.16 5,4.66 3.7,9 -1.37,4.6 -4.58,5.8 -8.68,6.46 -4.23,0.7 -5.76,-1.95 -7.2,-5.05 -1,-2.2 -1.9,-4.44 -3.94,-6.02 -1.9,-1.48 -5.42,-2.27 -3.96,-5.7 1.3,-3.02 4.25,-3.1 6.93,-2.48z\" />\n    <!-- Stripe on the trunk -->\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M474.3,297.4c0.12,2 -1.23,2.96 -2.84,3.43 -6.44,1.83 -12.63,4.12 -18.05,8.18 -1.06,0.8 -2.42,1.15 -3.56,0.05 -1.18,-1.14 -0.5,-2.37 0.1,-3.55 2.76,-5.57 14.32,-12.06 20.4,-11.5 2.2,0.2 3.75,1 3.97,3.4z\" />\n    <!-- Body stripes -->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M253.55,243.95c-2.75,-0.1 -4.37,-2.87 -2.58,-5.24 3.1,-4.12 6.53,-8.05 10.2,-11.68 1.88,-1.87 4.58,-1.78 6.5,0.44 1.78,2.03 0.78,3.93 -0.82,5.56 -2.83,2.9 -5.7,5.77 -8.6,8.6 -1.3,1.24 -2.8,2.23 -4.7,2.33zM257.65,136c2.96,-0.06 5,0.52 5.52,3.06 0.5,2.38 -1.25,3.76 -3.1,4.36 -5.13,1.67 -10.58,1.56 -15.9,2.1 -1.67,0.16 -3.15,-1.03 -3.36,-2.94 -0.2,-1.92 1.18,-2.98 2.68,-3.7 4.68,-2.2 9.87,-1.93 14.17,-2.87zM68.42,307c-2.6,-0.35 -5.36,-0.35 -5.72,-3.16 -0.35,-2.7 2.35,-3.17 4.3,-3.75 3.9,-1.16 7.84,-2.1 11.75,-3.14 2.14,-0.57 4,-0.27 4.74,2.05 0.7,2.15 -0.17,3.84 -2.2,4.82 -4.16,2 -8.74,2.3 -12.88,3.18zM87.55,284.7c-1.2,-0.3 -2.46,-0.55 -3.7,-0.94 -1.12,-0.35 -2.1,-0.98 -2.2,-2.3 -0.07,-1.33 0.8,-2.1 1.93,-2.48 4.6,-1.6 9.15,-3.32 13.8,-4.68 2.14,-0.62 4.45,-0.1 5.14,2.42 0.68,2.5 -0.92,3.97 -3.17,4.65 -3.87,1.17 -7.78,2.2 -11.8,3.34z\" />\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M46.94,291.37c-2.74,-0.76 -8.07,1.96 -8.54,-2.92 -0.42,-4.35 5,-3.4 8.04,-4.2 2.48,-0.67 5.13,-0.67 7.7,-1 2.02,-0.23 3.6,0.28 4.05,2.47 0.4,2 -0.4,3.4 -2.24,4.34 -2.73,1.4 -5.7,0.95 -9.02,1.3z\" />\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M188.7,176.74c-1.22,0.04 -2.3,-0.24 -2.84,-1.44 -0.58,-1.34 -0.12,-2.68 0.8,-3.56 3.83,-3.6 8.55,-5.18 13.7,-5.2 2,0 3.14,1.56 3.38,3.54 0.24,2.06 -0.77,3.54 -2.7,4 -4.1,1 -8.23,1.8 -12.34,2.66zM195.55,155.9c-2.3,0.25 -3.38,-0.06 -3.9,-1.26 -0.6,-1.34 -0.28,-2.64 0.9,-3.44 3.47,-2.38 7,-4.75 11.03,-6.07 2.16,-0.7 4.35,-0.52 5.26,2 0.82,2.28 -0.57,3.8 -2.5,4.6 -3.86,1.64 -7.83,3.05 -10.8,4.2z\" />\n    <!-- Trunk stripe -->\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M478.2,305.85c2.28,0.06 4.03,0.75 4.48,3.1 0.38,2 -0.9,2.83 -2.57,3.55 -2.68,1.16 -5.23,2.65 -7.95,3.76 -1.7,0.7 -3.67,0.9 -4.87,-0.92 -1.2,-1.8 0.3,-3 1.4,-4.18 2.63,-2.8 5.65,-4.92 9.52,-5.3z\" />\n    <!-- Body stripe -->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M174,166.22c-0.37,0.7 -0.53,1.42 -0.98,1.77 -3.33,2.54 -6.66,5.08 -10.12,7.46 -1.1,0.76 -2.56,0.66 -3.52,-0.52 -0.8,-0.96 -0.84,-2.24 -0.17,-3.2 2.43,-3.44 5.12,-6.73 9.32,-8.1 2.4,-0.8 4.43,-0.03 5.47,2.58z\" />\n    <!-- Trunk stripes-->\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M481.95,327.98c-1.52,0.34 -2.62,-0.4 -3.2,-1.53 -0.5,-1 0.13,-1.87 0.6,-2.72 0.17,-0.27 0.37,-0.58 0.63,-0.74 2.85,-1.73 5.35,-4.66 9.25,-2.98 1.3,0.56 2.1,1.86 1.5,3.22 -1.7,3.98 -5.7,4.06 -8.78,4.74z\" />\n    <!-- Eyes pupils -->\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M358.58,262.53c-0.7,3.86 -2.97,7.02 -7.42,8.13 -2.84,0.7 -5.78,1.34 -8.7,1.44 -6.93,0.25 -12.47,3.4 -17.58,7.65 -1.92,1.6 -4.04,2.6 -6.5,3.2 -3.66,0.86 -7.4,0.55 -9.42,-2.37 -2.1,-3.04 -2.2,-6.94 0.05,-10.5 6.9,-10.82 16.5,-17.12 29.6,-17.47 4.03,-0.1 8.12,-0.48 12.12,0.57 4.52,1.2 7.94,5.02 7.86,9.36zM434.48,255.97c-5.6,-0.44 -7.66,-5.72 -4.13,-10.2 2.05,-2.62 4.64,-4.93 8.03,-5.4 8.35,-1.2 16.7,-2.08 24.73,1.9 2.4,1.2 4.23,2.84 5.52,5.06 2.8,4.77 0.28,9.1 -5.3,9.18 -4.65,0.06 -9.3,0.02 -13.95,0.02 0,-0.16 -9.95,-0.17 -14.9,-0.55z\" />\n    <!--Body shadow -->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_2\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M69.6,356.35c-5.73,-8.7 -19.5,-8.75 -24.82,0.06 -1.18,1.96 -2.48,1.28 -3.7,1 -2.07,-0.45 -4.18,-1.08 -4.1,-3.96 0.18,-5.66 -2.76,-9.96 -6.65,-13.6 -3.22,-3 -7.08,-4.7 -11.7,-3.47 -5.06,1.32 -4.73,-3.32 -6.2,-5.76 -1.56,-2.57 0.45,-3.44 2.56,-4.42 12.08,-5.62 13.63,-18.92 3.07,-27.3 -0.75,-0.6 51.05,47.1 95.77,40.42 18.2,-2.72 42,28.28 71.76,34.45 43.22,8.95 93.8,17.9 92.2,22.07 -4.4,11.42 6,35.6 13,43.43 -0.9,1 -17.88,-14.02 -18.82,-14.62 -8.72,-5.54 -20,-18.82 -28.38,-24.06 -9.33,-5.86 -28.5,-12.07 -43.4,-13.65 -13.66,-1.44 -22.46,-4.1 -37.7,-10.97 -11.65,-5.25 -28.62,-19.36 -31.92,-20.23 -7.04,-1.87 -10.8,-2.45 -14.28,-2.45 -8.64,0 -34.67,5.77 -42.14,3.82 -1.6,-0.02 -3.2,0.57 -4.55,-0.75z\" />\n    <!-- Body stripes -->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M223.93,253.08c-2.75,-0.1 -4.38,-2.87 -2.6,-5.25 3.12,-4.12 6.54,-8.05 10.2,-11.7 1.9,-1.85 4.6,-1.77 6.53,0.45 1.77,2.03 0.77,3.94 -0.83,5.57 -2.84,2.9 -5.7,5.76 -8.6,8.58 -1.3,1.26 -2.8,2.24 -4.7,2.35zM247.83,223.7c-2.6,-0.88 -3.4,-4 -1,-5.77 4.15,-3.08 8.55,-5.9 13.1,-8.36 2.34,-1.27 4.9,-0.43 6.13,2.24 1.12,2.45 -0.38,4 -2.37,5.12 -3.55,2 -7.1,3.94 -10.7,5.83 -1.6,0.84 -3.3,1.37 -5.17,0.94zM283.5,345.85c0.48,2.7 -1.92,4.85 -4.63,3.6 -4.7,-2.18 -9.27,-4.7 -13.6,-7.52 -2.23,-1.45 -2.7,-4.1 -0.9,-6.42 1.63,-2.13 3.7,-1.55 5.64,-0.33 3.45,2.16 6.86,4.35 10.24,6.6 1.5,1 2.78,2.25 3.27,4.08zM255.92,350.23c0.9,2.58 -1.1,5.1 -3.97,4.3 -5,-1.36 -9.94,-3.1 -14.68,-5.15 -2.44,-1.06 -3.35,-3.6 -1.97,-6.2 1.26,-2.36 3.4,-2.14 5.52,-1.25 3.75,1.56 7.48,3.16 11.2,4.82 1.64,0.74 3.1,1.76 3.9,3.48zM245.3,330.43c0.83,2.6 -1.24,5.07 -4.1,4.2 -4.96,-1.5 -9.84,-3.36 -14.53,-5.54 -2.4,-1.14 -3.25,-3.7 -1.8,-6.25 1.32,-2.34 3.46,-2.06 5.55,-1.12 3.7,1.67 7.4,3.36 11.06,5.12 1.62,0.78 3.06,1.84 3.8,3.58z\" />\n    <!-- Speech bubble inner shape-->\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M462.95,64.68c-1.55,-2.12 -3.22,-3.86 -3.53,-6.85 -0.82,-7.74 -5.27,-12.75 -12.78,-14.1 -3.22,-0.57 -4.96,-2 -6.78,-4.42 -8.67,-11.47 -26.16,-10.7 -31.68,2.43 -3.56,8.46 -8.7,14.96 -14.5,21.56 -5.75,6.5 -5.12,11.94 1.3,17.82 6.27,5.75 9.45,5 16.98,3.64 2.18,-0.4 4.95,1.52 7.5,1.46 4.08,-0.1 10.03,-2.13 12.2,-0.14 2.2,2.03 -1.04,4.23 -2.26,6.07 -2.8,4.23 -4,4.35 -7,8.46 -1,1.42 -3.17,3.45 -0.58,5.6 1.96,1.65 5.65,-2.36 7.05,-3.7 5,-4.82 4.7,-6.7 9.7,-11.43 5.57,-5.27 10.23,-6.67 14.48,-10.84 5.1,1.27 7.7,0.17 9.33,-3.08 2.06,-4.1 3.67,-8.22 0.57,-12.47zM411.98,45.38c2.76,-5.76 7.75,-8.18 13.83,-8.8 3.22,-0.15 5.6,1.4 7.7,3.48 2.2,2.14 3.54,4.25 -0.55,5.84 -0.6,0.24 -1.4,0.5 -1.68,1 -5.16,9.36 -12.34,2.07 -18.55,2.1 -2.46,0 -1.3,-2.44 -0.74,-3.63zM404.98,79.25c-2.64,1.52 -4.68,-0.4 -6.36,-2.16 -1.93,-2.04 -4.4,-4.06 -2.78,-7.42 0.57,-1.17 1.38,-2.25 2.18,-3.3 5,-6.56 5.16,-6.5 8.96,0.62 1.2,2.3 2.9,4.33 4.36,6.48 -1.32,3 -3.96,4.37 -6.36,5.77zM410,58.6c-0.4,-3.42 1.83,-3.96 4.83,-3.96 2.74,1.27 8,0.64 8,4.7 0,3.83 -3.1,9.65 -6.55,9.5 -4.17,-0.17 -5.73,-5.78 -6.27,-10.24zM415.82,80.76c-0.5,-0.96 1.04,-3.45 2.08,-3.75 1.42,-0.42 5.46,1.4 5.2,2.84 -0.35,1.78 -6.45,2.54 -7.28,0.92zM423.98,75.23c-0.86,-0.47 -1.5,-0.68 -1.98,-1.1 -1.54,-1.37 -0.2,-2.6 0.64,-3.3 2.8,-2.35 2.5,-7.33 6.7,-8.2 1.1,-0.23 3.15,2 2.64,3.27 -1.6,3.9 -4.77,7.8 -8,9.33zM437.94,75.2c-0.8,2.1 0.13,5.75 -4.05,5.22 -1.54,-0.2 -4.3,-0.78 -3.7,-2.82 0.9,-2.87 3.08,-5.65 6.27,-6.1 2.14,-0.3 1.38,2.15 1.47,3.7zM437.21,61.98c-2.63,-0.27 -5.33,-3.6 -5.4,-6.62 -0.07,-2.52 2.3,-5.23 5.12,-5.1 4.3,0.2 2.6,3.62 2.83,5.9 0.25,2.5 1.2,6.2 -2.54,5.82zM442.89,82.15c-1.2,-0.68 -1.45,-4.35 -0.6,-5.4 1.18,-1.47 6.07,-1.6 6.4,0.25 0.22,1.16 -4.37,5.97 -5.8,5.15zM452.61,65.75c-0.6,2.42 -1,5.7 -3.88,6.2 -2.05,0.34 -4.25,-1.58 -4.45,-3.94 -0.3,-3.65 3.03,-3.6 5.06,-4.4 1.97,-0.14 3.82,-0.04 3.27,2.16zM447.71,58.81c-4.12,1.94 -3.15,-2.85 -3.13,-4.85 0.02,-1.78 -1.6,-5.34 2.1,-4.7 3.42,0.56 7.03,3.04 7.1,6.83 0.04,3.96 -3.94,1.73 -6.08,2.73zM454.51,75.25c-0.13,-4.13 1.48,-5.82 4,-7 0.8,3.95 1.25,5.82 -4,7z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/errorphant_offline.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"193dp\"\n    android:height=\"193dp\"\n    android:viewportWidth=\"580\"\n    android:viewportHeight=\"580\">\n    <!-- Further wire -->\n    <path\n        android:fillColor=\"@color/elephant_friend_accent_color\"\n        android:pathData=\"M484.83,519.5c-9.1,0 -16.77,-2.14 -19.06,-9.84 0,0 0.63,-5.44 1.63,-6.9 2.34,-3.43 8.96,-4.75 12.83,-4.52 7.96,0.47 27.3,0.4 42.58,-3.43 11.22,-2.8 21.66,-10.72 25.4,-19.24 2.26,-5.1 2,-10.1 -0.76,-15.22 -14.8,-27.44 -61.55,-33.1 -92.48,-36.83l-1.46,-0.17c-20.26,-2.45 -41.82,-4.27 -64.1,-5.4 -1.48,-0.07 -3.16,-0.24 -5.1,-0.43 -3.64,-0.37 -18.88,-1.33 -21.47,-0.03 0,0 -6.8,-13.94 -6.8,-13.94 7.33,-6.93 20.5,-5.6 30.13,-4.65 1.63,0.16 3.17,0.32 4.18,0.37 22.72,1.15 44.72,3 65.4,5.5l1.46,0.2c34.76,4.2 87.3,10.54 106.7,46.5 5.54,10.26 6.04,21.2 1.43,31.66 -6.1,13.88 -21,25.6 -37.96,29.85 -3.72,0.94 -15.95,3.7 -27.8,5.3 -4.94,0.67 -10.04,1.24 -14.74,1.24z\" />\n    <!-- Shadow and part of the border-->\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M340.08,43.43c6.84,-1.48 13.62,-3.16 20.66,-2.8 10.37,0.56 16.8,5.47 19.23,14.64 1.8,6.87 -1.47,11.84 -6.2,16 -2.7,2.4 -3.43,3.6 0.04,6.07 17.86,12.64 25.78,30.78 28.55,51.86 0.65,4.88 5.2,7.9 7.9,11.8 8.66,12.62 15.85,25.7 16.86,41.4 0.4,6.03 -1.05,11.48 -4.56,16.29 -1.45,1.97 -1.8,3.8 -1.27,6.06 1.55,6.5 -0.46,12.4 -3.57,17.9 -3.05,5.4 -7.76,7.14 -14.54,5.33 -3.03,-0.82 -3.9,0 -4.27,2.72 -0.84,6.16 -1.62,12.34 -2.67,18.47 -0.52,3 0.2,6.4 2.47,7.7 8.98,5.22 24.9,-2.13 35.84,-13.28 3.33,-3.38 9.7,-0.18 11.84,4.17 5.44,11.05 2.95,26.28 -5.4,35.32 -6.07,6.55 -17.98,16.66 -28.66,19.96 -2.6,0.8 1.35,6.88 2.37,9.8 3.28,9.44 5.6,19.13 8.1,28.77 0.87,3.37 0.04,5.58 -2.55,8.15 -8.35,8.3 -19,12.35 -29.48,16.6 -3.2,1.3 -3.22,2.14 -2,4.85 1.2,2.72 3.42,4.77 4.38,7.67 1.25,3.8 2.8,7.57 -0.43,10.96 -3.34,3.5 -7.64,4.6 -12.4,3.9 -3.47,-0.5 -6.3,-2.4 -9.2,-4.54 -1.5,9.4 -3.1,18.35 -4.34,27.37 -0.5,3.76 -1.5,7.32 -2.77,10.82 -0.75,2.1 -0.95,3.55 1.77,4.13 4.28,0.9 11.28,4.93 15,6.37 18.76,7.22 30.46,21.74 15.83,33.4 -13.17,10.5 -55.44,18.73 -80.1,22.87 -28.28,4.73 -94.9,-1.1 -110.73,-2.64 -23.76,-2.28 -47.1,-6.92 -70.17,-12.83 -7.97,-2.04 -15.74,-4.92 -23.56,-7.53 -7.15,-2.38 -12.6,-7.4 -17.87,-12.42 -4.15,-3.94 -3.2,-9.32 1.2,-12.9 7.2,-5.9 15.58,-8.94 24.5,-10.8 2.94,-0.63 4.5,-1.58 4.66,-5.06 0.38,-7.64 2.28,-15.1 3.9,-22.54 0.54,-2.5 0.16,-3.97 -2.02,-5.47 -12.7,-8.7 -24.6,-19.2 -29.45,-33.8 -1.9,-5.7 -0.42,-7.23 -4.76,-0.17 -4.36,7.08 -12.4,10.56 -21.1,15.42 -2,0.73 -1.63,2.34 -1.14,3.92 2.64,8.63 -0.4,15.6 -6.52,21.5 -3.2,3.1 -7.1,4.73 -11.52,2.93 -4.25,-1.72 -6,-5.4 -6,-9.7 0,-3.2 -0.9,-3.85 -4.08,-3.45 -6.15,0.77 -8.33,-3.2 -8.35,-9.54 -0.02,-3.7 1.58,-8.67 3.28,-10.26 2.34,-2.2 2,-2.9 -1.76,-5.8 -3.44,-2.66 1.53,-13.03 6.32,-14.9 5.26,-2.08 10.73,-2.6 15.73,0.56 2.3,1.44 3.8,1.1 5.8,-0.23 11.36,-7.38 17.37,-17.8 18.6,-31.25 1.08,-12.07 1.5,-24.15 2.67,-36.24 2.57,-26.28 9.53,-50 24.42,-71.86 9.14,-13.44 18.45,-26.58 30.06,-38 3.15,-3.1 6.58,-5.63 10.8,-7.15 2.5,-0.9 3.5,-2.1 0.7,-4.5 -5.93,-5.13 -6.55,-9.1 -2.78,-16.57 5.93,-11.74 13.8,-22.14 22.52,-31.94 22.3,-25.12 49.2,-44.27 78.63,-60.06 2.86,-1.54 3.8,-2.97 2.53,-6.17 -3.36,-8.43 -3.67,-16.9 -0.03,-25.45 4.4,-10.3 12.12,-15.77 23.13,-15.68 9.7,0.07 16.74,5.4 21.1,13.83 1.66,3.17 2.4,3.92 4.82,0.8 7.7,-9.94 18.35,-12.23 30.12,-11 10.46,1.1 16.24,12.3 11.35,21.7 -0.7,1.33 -1.85,2.5 -1.44,4.5z\" />\n    <!-- Speech bubble background -->\n    <path\n        android:fillColor=\"@color/elephant_friend_accent_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M560.64,152.37c9.82,18.94 2.83,49.58 -4.2,60.1 -8.5,12.7 -27.84,25.26 -51.5,22.92 -8.3,-0.83 -15.7,-2.08 -26.86,-9.13 -4.44,-2.8 -7.55,-1.95 -14.03,1.87 -6.03,3.56 -16.02,5.18 -18.24,2.8 -3.04,-3.27 1.13,-10.25 4.92,-17.07 3.78,-6.8 5.32,-7.76 3.5,-13.8 -0.57,-1.9 -9.68,-15.8 0.63,-41.7 8.73,-21.9 23.5,-33.83 48.8,-35.7 26.5,-1.96 48.3,12.93 57,29.7z\" />\n    <!-- Lightnings' border -->\n    <path\n        android:fillColor=\"#FDA201\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M405.28,504.42c-2.15,-0.07 -4.6,-2.17 -6.58,-4.97 -7.06,-9.93 -10.6,-18.1 -16.95,-28.33 -2,-3.2 -0.6,-6.08 2.34,-7.93 4.3,-2.72 3.24,-4.92 -0.2,-7.4 -5.8,-4.15 -10.93,-9.07 -16.15,-13.93 -5.18,-4.84 -6.54,-10.5 -4.56,-16.73 2.86,-9 6.4,-17.82 9.8,-26.67 1.15,-3.04 2.94,-4.28 6.62,-2.8 10.5,4.2 21.18,7.97 31.83,11.8 4.2,1.52 5.05,3.54 2.2,7.32 -2.97,3.95 -7.53,8.24 -7.6,12.46 -0.1,4.9 7.12,5.92 10.9,8.96 4.64,3.74 6.55,7.12 4.83,13.24 -4.62,16.42 -8.58,33.02 -12.82,49.55 -0.58,2.26 -0.84,4.82 -3.68,5.42zM471.96,422.6c17.67,1.02 17.95,-0.12 14.5,17.04 -1.83,9.04 -3.97,18.03 -5.53,27.1 -0.8,4.7 -3.9,8.87 -8.54,7.78 -10.8,-2.54 -12.4,-6.2 -19.87,10.08 -1.28,2.8 -3.26,12.98 -10,12.97 -3.64,0 -4.74,-3.66 -5.3,-6.76 -1.42,-7.67 -3.84,-25 -4.05,-25.9 -2.27,-9.63 -3.25,-11.82 8.96,-14.76 3.24,-0.78 3.46,-2.55 3.32,-5.1 -0.27,-4.73 -0.4,-9.46 -0.73,-14.18 -0.3,-4.47 1.86,-6.08 6.1,-6.86 7.96,-1.47 14.5,-1.8 21.13,-1.4zM384.9,509.3c-0.2,1.8 0.3,3.7 -1.74,4.45 -1.47,0.52 -2.74,-0.13 -3.86,-1.16 -0.87,-0.8 -1.8,-1.53 -2.74,-2.26 -3.17,-2.5 -6.08,-6.43 -9.6,-7.08 -4.37,-0.8 -5.5,4.9 -8.05,7.73 -3.36,3.76 -6,1.15 -8.5,-0.84 -5.84,-4.68 -8.92,-11.6 -13.57,-17.3 -4.62,-5.66 -9.26,-11.4 -12.23,-18.28 -1.5,-3.48 -1.55,-6.08 1.2,-8.93 5.18,-5.4 11.7,-8.85 18.06,-12.46 3.04,-1.74 6.48,-0.93 8.03,3.2 0.82,2.2 2.07,4.25 3.13,6.36 1.7,3.36 2.58,8.2 5.3,9.66 2.7,1.46 5.6,-3.3 8.74,-4.76 4.2,-1.97 6.78,-0.52 8.22,3.65 4.24,12.4 5.43,25.4 7.6,38z\" />\n    <!-- Inner orange wires -->\n    <path\n        android:fillColor=\"#FAA102\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M474.48,503.35c0.82,0.07 2.3,0.08 3.6,3.5 1,2.62 -0.97,6.08 -1.9,6.16 -6.05,0.57 -7.95,2.22 -11.6,6.75 -1.3,1.63 -7.25,6.53 -9.72,5.34 -2.37,-1.17 1.34,-5.9 3.2,-8.44 1.28,-1.74 0.28,-2.6 -1.38,-2.9 -2.37,-0.4 -9.68,2.07 -10.5,-1.48 -0.83,-3.75 7.5,-4.6 9.22,-6.23 -0.7,-2.72 -7.9,-5.96 -5.43,-9.55 1.67,-2.45 7.08,0.52 9.1,2.3 8.12,7.18 9.98,4.07 15.4,4.55zM365.5,547.35c-0.82,0.17 -2.24,0.6 -4.5,-2.27 -1.72,-2.2 -0.87,-6.1 0,-6.46 5.6,-2.33 6.93,-4.47 9.06,-9.88 0.76,-1.94 4.98,-8.4 7.7,-7.98 2.6,0.4 0.47,6 -0.56,9 -0.7,2.04 0.52,2.55 2.18,2.34 2.4,-0.3 8.64,-4.85 10.46,-1.7 1.93,3.34 -5.78,6.63 -6.93,8.7 1.5,2.38 9.3,3.34 8.03,7.5 -0.87,2.84 -6.9,1.6 -9.37,0.5 -9.9,-4.44 -10.74,-0.9 -16.07,0.25z\" />\n    <!-- Lighter body part -->\n    <path\n        android:fillColor=\"@color/elephant_friend_body_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M309.5,413.94c-3.87,0.1 -6.45,2.94 -9.34,4.83 -17.03,11.15 -35.34,18.28 -55.9,18.72 -5.75,0.12 -11.5,-0.2 -17.05,-2.1 -2.56,-0.88 -3.83,-2.15 -3.78,-5 0.13,-6.13 -1.2,-12.08 -2.72,-17.97 -0.45,-1.77 -1.34,-3.48 -2.3,-5.06 -0.6,-1.02 -1.66,-2.07 -3.1,-1.24 -1.33,0.77 -1.75,1.8 -1.3,3.52 2.83,10.93 1.48,21.9 0.12,32.87 -0.2,1.65 -1.24,2.38 -2.65,2.9 -7.22,2.65 -13.3,6.32 -13.45,15.24 -0.02,0.84 -0.34,1.5 -1.3,1.66 -1.1,0.16 -1.74,-0.42 -2.22,-1.3 -1.18,-2.2 -2.24,-4.44 -3.94,-6.33 -3.93,-4.36 -6.72,-4.9 -11.86,-2.13 -2.92,1.6 -5.4,3.62 -6.9,6.73 -0.58,1.24 -0.52,3.34 -2.9,2.95 -2.17,-0.36 -4.15,-0.6 -5.06,-3.27 -0.84,-2.44 -1.6,-4.95 -3.57,-7 -6.6,-6.84 -12.28,-7.2 -19.33,-0.9 -3.77,3.35 -4.7,3.26 -7.7,-0.93 -1.47,-2.07 -2.2,-4.4 -2.3,-6.98 -0.5,-13.3 0.3,-26.45 5.03,-39.1 0.8,-2.14 -3.3,-6.3 -8.4,-10.03 -9.7,-7.05 -19.72,-18.28 -25.2,-30.94 -1.97,-4.54 -3.15,-13.82 -5.52,-13.86 -1.5,-0.03 -3,6.1 -4.4,8.74 -5.24,9.93 -15.64,13.7 -24.34,19.95 -2.4,1.73 -4.68,0.87 -6.15,-1.87 -2.7,-5.04 -1.26,-9 3.44,-12.1 13.66,-8.98 21.7,-21.55 22.36,-38.14 0.8,-20.28 2.94,-40.34 8.24,-60 6.3,-23.35 16.82,-44.46 32.98,-62.64 4.75,-5.34 8.53,-11.54 14.2,-16.1 1.77,-1.43 3.6,-2.8 6.25,-4.88 -0.8,5.58 -1.58,10.1 -2.08,14.62 -0.84,7.7 3.3,13.64 10.76,14.8 3.47,0.55 3.67,1.72 3.45,4.85 -0.62,8.83 0.8,17.48 8.52,22.98 7.26,5.17 15.44,6.67 23.63,1.6 2.48,-1.52 2.93,0.27 3.74,1.73 6.48,11.82 15.54,21.3 26.44,29.1 0.63,0.45 1.17,1.1 1.86,1.4 2.4,1.05 4.56,-0.35 5.75,-1.8 1.13,-1.4 -0.93,-2.7 -2.18,-3.52 -11,-7.3 -18.04,-17.88 -24.32,-29.1 -2.2,-3.97 -3.03,-7.74 -0.56,-12.28 6.58,-12.12 9.08,-25.38 9.57,-39.06 0.04,-0.93 0.1,-1.88 -0.04,-2.8 -0.18,-1.3 -0.8,-2.5 -2.22,-2.63 -1.25,-0.13 -1.94,0.87 -2.28,1.97 -0.5,1.63 -1.17,3.26 -1.33,4.94 -1.3,14.1 -6.95,26.77 -13.2,39.16 -4.6,9.12 -13.63,11.57 -20.37,6.05 -3.15,-2.58 -4,-6.26 -4.68,-9.9 -0.7,-3.82 -1.34,-7.73 -1.24,-11.58 0.13,-4.95 -2.83,-6.93 -6.73,-7.34 -5.1,-0.53 -6.52,-3.4 -6.6,-7.84 -0.13,-7.76 2.36,-15.05 4.18,-22.43 1.62,-6.58 1.52,-7.28 -4.45,-10.3 -3.03,-1.53 -1.86,-4.2 -1.12,-6.13 1.78,-4.64 3.63,-9.36 6.26,-13.55 7.02,-11.2 14.6,-21.97 24.63,-30.9 16.75,-14.9 33.9,-29.3 53.54,-40.22 6.14,-3.4 12.3,-6.86 18.56,-10.1 2.4,-1.23 1.5,-3.07 1.22,-4.85 -1.08,-7.2 -3.98,-14.1 -2.87,-21.62 2.04,-13.8 10.8,-18.3 22.52,-16 7.66,1.53 11.43,9.06 14.18,16.2 0.8,2.1 0.36,5.04 3.28,5.63 3.02,0.6 4.84,-1.44 6.45,-3.72 3.27,-4.64 7.42,-8.46 12.2,-11.44 6.52,-4.06 13.5,-3.1 20.26,-0.7 3.2,1.13 4,6.4 1.52,9.78 -2.07,2.82 -3.33,5.92 -4.7,9.04 -1.56,3.62 -0.66,5.12 3.37,4.33 7.17,-1.4 14.35,-2.44 21.63,-3.2 5.6,-0.6 10.22,1.23 14.48,4.06 4.25,2.85 2.3,13.23 -2.84,16.8 -5.27,3.67 -5.47,5.68 -0.85,9.95 9.53,8.8 18.57,17.83 23.7,30.2 2.97,7.22 3.93,14.72 5.15,22.2 1.8,11.08 2.67,22.32 1.86,33.52 -0.4,5.8 -0.65,11.78 -2.6,17.4 -1.67,4.87 -0.9,9.9 -0.96,14.84 -0.22,17.26 -1.04,34.42 -3.84,51.54 -2.85,17.4 -6.84,34.4 -11.87,51.3 -5.1,17 -6.27,34.65 -4.46,52.25 0.83,8.02 2.4,16.42 9.23,22.3 0.8,0.7 1.22,1.8 1.76,2.74 1.26,2.2 3.94,4.33 1.67,7.03 -2.07,2.46 -5.18,1.78 -7.9,1.07 -1.45,-0.37 -2.75,-1.38 -4.06,-2.2 -4.9,-3.05 -10.4,-2.58 -14.56,1.34 -1.25,1.17 -2.4,2.46 -3.66,3.6 -1.43,1.3 -2.72,3.8 -4.93,2.56 -1.94,-1.1 -0.64,-3.44 -0.32,-5.2 0.43,-2.27 -0.6,-3.9 -1.94,-5.5 -2.5,-2.96 -4.73,-6.28 -7.65,-8.78 -7,-5.97 -11.13,-13.77 -14.66,-21.9 -3.86,-8.86 -10.1,-16.45 -13.13,-26.13 5.28,-0.78 10.92,-1.33 16.44,-2.48 13.84,-2.9 24.47,-9.7 28.55,-24.22 1.2,-4.32 1.2,-8.65 0.53,-12.96 -0.8,-5.2 -6.34,-8.24 -11.46,-7.1 -13.87,3.05 -27.7,5.82 -41.58,-0.6 -8.8,-4.05 -12.52,-12.2 -17.24,-19.57 -1.2,-1.86 1.15,-3.64 2.17,-5.33 5.57,-9.25 -0.1,-21.56 -10.14,-21.93 -1.08,-0.04 -2.16,0.18 -3.23,0.35 -2.1,0.32 -3.64,1.54 -3.57,3.65 0.08,2.65 2.33,1.85 3.93,1.88 6.58,0.1 8.67,2.55 7.87,9.66 -7.32,-7.13 -14.85,-4.88 -22.26,-0.57 -10.73,6.25 -18.93,14.95 -17.3,28.02 1.53,12.18 7.25,23.1 16.8,31.52 8.72,7.7 18.46,13.6 29.6,17.1 3.44,1.1 7.03,1.16 10.58,1.55 2.46,0.27 3.95,1.04 4.84,3.9 1.32,4.27 3.43,8.4 5.82,12.2 4.5,7.13 8.5,14.5 11.38,22.4 2.88,7.9 8.38,13.7 14.3,19.27 1.56,2.64 0.93,5.4 -0.7,7.44 -7.38,9.28 -14.28,19.06 -24.28,25.93 -1.6,1.1 -3.22,1.76 -5.17,1.47z\" />\n    <!-- Left for us (closer) tusk -->\n    <path\n        android:fillColor=\"@color/elephant_friend_light_color_2\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M317.07,314.53c-13.66,0.75 -26.3,-3.13 -37.78,-9.85 -12.04,-7.04 -22.98,-15.73 -26.86,-30.16 -1.56,-5.8 0.3,-11.34 3.68,-16.23 4.2,-6.1 9.77,-10.4 17.12,-12.05 5.1,-1.14 8.46,1.55 9.53,6.67 3.06,14.56 11.45,24.78 25.65,29.78 12.18,4.3 24.4,5.27 36.83,0.5 5.53,-2.13 8.3,0.5 7.78,6.4 -0.9,10.57 -9.3,20.07 -20.77,23.2 -4.96,1.34 -10.05,1.95 -15.2,1.73z\" />\n    <!-- Right for us (further) tusk -->\n    <path\n        android:fillColor=\"@color/elephant_friend_light_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M395.5,296.2c-2.5,-0.17 -3.73,-0.23 -4.97,-0.34 -3.57,-0.3 -4.74,-1.62 -3.26,-5.43 3.45,-8.84 4.5,-13.57 6.96,-22.73 0.78,-2.9 0.77,-4.5 4.75,-3.28 17.9,7.13 27.1,-6.64 38.43,-14.5 3,-1.66 3.58,0.47 4.12,2.45 2.94,10.6 0.68,19.75 -7.23,27.72 -9.67,9.72 -26.16,16.58 -38.8,16.1z\" />\n    <!-- Right for us (further) leg -->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_2\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M309.5,413.94c10.14,-6.57 17.2,-16.27 25.26,-24.93 2.6,-2.77 3.7,-6.38 4.9,-9.9 3.25,2.58 4.8,5.42 4,10.05 -1.14,6.48 3.7,9.8 9.96,7.72 3.58,-1.2 6.45,-3.52 9.5,-5.76 1.27,1.87 0.52,3.5 0.2,5.1 -2.36,11.73 -6.37,23.07 -8.32,34.9 -0.55,3.4 -2,5.23 -6.44,4.14 -7.45,-1.82 -14.2,2.76 -16.94,10.47 -0.67,1.88 -0.63,4.34 -3.46,4.18 -2.48,-0.14 -1.88,-2.54 -2.33,-4 -2.62,-8.46 -9.3,-10.9 -16.52,-5.8 -2.64,1.88 -5.3,3.9 -6.54,7.1 -0.68,1.76 -1.94,2.46 -3.63,2.2 -5.33,-0.8 -10.78,-0.52 -16,-2.66 -3.63,-1.5 -3.43,-4.38 -4,-7.2 -0.64,-3.1 1.9,-3.5 3.8,-4.4 8.86,-4.17 17.67,-8.44 25.74,-14.07 3.87,-2.7 4.02,-4.05 0.84,-7.1z\" />\n    <!-- Right for us (further) hand and ear-->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_2\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M379.6,334.7c-0.2,-9.38 1.5,-18.86 3.34,-28.32 0.45,-2.32 1.66,-3 4.03,-2.27 4.53,1.42 9.2,1.6 13.83,0.6 2.26,-0.5 3.46,0.2 4.2,2.4 2.85,8.54 6.5,16.82 8.36,25.7 0.46,2.2 0.65,3.67 -2.1,4.6 -6.25,2.13 -9.97,7.83 -9.58,14.27 0.1,1.48 0.45,2.7 -1.23,3.5 -1.62,0.8 -2.92,0.6 -4.2,-0.65 -3.75,-3.67 -8.17,-4.95 -13.25,-3.43 -2.06,0.6 -2.27,-0.7 -2.65,-2.15 -1.2,-4.6 -0.3,-9.3 -0.75,-14.26zM404.8,146c4.76,5.9 7.96,12.4 10.48,19.1 2.74,7.28 4.54,14.88 3.68,22.82 -0.3,2.85 -0.9,5.56 -4,6.82 -3.28,1.34 -3.4,3.47 -1.8,6.34 3.14,5.62 2.77,11.32 -0.07,16.96 -1.5,2.96 -8.94,4.9 -11.66,3.04 -1.6,-1.1 -1.1,-2.83 -0.97,-4.3 1.23,-14.5 2.45,-29.04 3.86,-43.55 0.7,-7.15 -0.15,-14.25 -0.17,-21.37 0,-1.78 -0.6,-3.66 0.63,-5.87z\" />\n    <!-- Lil' thing on a tail :3 -->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_2\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M51.52,396.74c0.43,-2.54 1.1,-6.2 1.68,-9.9 0.2,-1.23 0.3,-2.63 -1.12,-3.23 -1.57,-0.64 -2.23,0.58 -2.75,1.76 -1,2.3 -2.17,4.36 -4.08,5.67 -1.14,0.78 -3.46,0.75 -4.78,-0.32 -1.45,-1.15 -1.46,-4.5 -0.8,-5.66 1.9,-3.2 4.4,-4.7 7.1,-7.43 2.95,-2.97 2.54,-4.02 -1.5,-5.1 -2.06,-0.56 -4.63,-0.7 -4.78,-3.57 -0.15,-2.66 1.78,-4.14 3.87,-5.36 1.8,-1.05 3.76,-1.4 5.83,-1.27 5.07,0.3 5.65,1.1 4.22,6 -2.34,8 -1.04,11.46 6.18,16.34 2.75,1.86 4.46,8.95 2.84,12.9 -1.3,3.23 -3.68,5.8 -6.4,7.9 -2.08,1.63 -3.76,0.78 -4.77,-1.54 -0.84,-1.93 -0.64,-3.97 -0.75,-7.16z\" />\n    <!-- Lil' fingers -->\n    <path\n        android:fillColor=\"@color/elephant_friend_light_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M312.62,450.27c-2.06,-0.46 -5.12,0.7 -5.7,-1.1 -0.82,-2.5 2.33,-3.64 4.03,-5 3.94,-3.15 6.66,-2.98 8.7,0.15 2.13,3.22 1.33,5.05 -2.53,5.63 -1.53,0.23 -3.1,0.22 -4.5,0.32zM157.95,460.62c-5.3,-0.4 -9.72,-1.5 -14.06,-2.98 -2.02,-0.67 -1.86,-1.5 -0.45,-2.87 4.25,-4.1 8.5,-3.86 11.94,0.94 0.94,1.33 1.52,2.9 2.55,4.92zM174.74,463.44c1.64,-3.02 2.93,-4.8 5.17,-5.88 4.1,-1.94 7.56,-0.25 8.52,4.18 0.42,1.9 -0.87,1.67 -1.87,1.68 -3.67,0.06 -7.34,0.02 -11.8,0.02zM336.16,448.93c1.17,-5.2 4.6,-7.28 9.25,-7.9 0.8,-0.1 1.53,0.08 2.07,0.75 0.48,0.62 0.23,1.2 -0.2,1.63 -3.03,2.96 -5.6,6.8 -11.1,5.53zM391.76,359.1c-3.24,1.28 -6.07,1.93 -8.98,0.53 -0.94,-0.45 -2.2,-0.8 -1.97,-2.2 0.18,-1.06 1.22,-1.28 2.12,-1.5 3.43,-0.87 6.42,-0.48 8.84,3.18zM406.75,352.33c0,-5.14 1.85,-7.8 5.74,-8.94 0.8,-0.24 1.93,-0.62 2.46,0.5 0.4,0.8 -0.26,1.53 -0.8,2.02 -2.18,1.95 -4.42,3.83 -7.4,6.4zM209.56,454.67c-0.23,2.68 -3.84,6.76 -5.77,6.53 -1,-0.12 -1.2,-0.7 -1.16,-1.6 0.1,-1.9 4.42,-6.72 5.9,-6.55 1.04,0.12 1.15,0.78 1.02,1.62z\" />\n    <!-- Cross inside the speech bubble -->\n    <path\n        android:fillColor=\"#F45353\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M534.5,201.3c-0.05,1.62 -5.06,4.07 -6.87,5.16 -3.47,2.08 -6.9,4.23 -10.5,6.06 -3.32,1.7 -6.5,1.46 -8.1,-2.47 -1.65,-4.02 -6.47,-13.87 -6.47,-13.87s-8.8,5.63 -10.9,7.5c-2.45,2.23 -5.3,2.47 -7.54,0.35 -3.12,-2.97 -5.98,-6.35 -7.63,-10.44 -2.1,-5.12 -0.73,-8.4 4.3,-10.58 9.5,-4.25 8.57,-4.25 8.57,-4.25s0.94,0 -5.7,-8.16c-1.05,-1.52 -2.4,-2.9 -3.23,-4.53 -1.7,-3.44 -1.48,-6.54 2.1,-8.92 4.24,-2.83 8.37,-5.84 12.6,-8.72 3.92,-2.68 7.6,-1.25 8.83,3.33 0.27,1.03 4.82,13.3 4.82,13.3s3.28,-3.1 6.2,-6.6c2.96,-3.53 5.6,-6.68 9,-7.9 2.28,-0.84 5.9,1.65 7.12,3.17 3.27,4.1 7.4,8.32 10.23,12.75 2.3,3.6 0.2,6.83 -4,9.32 -3.86,2.27 -10.4,5.63 -14.6,7.62 3.72,4.45 8.52,10.54 9.96,12.94 0.98,1.6 1.78,2.35 1.8,4.95z\" />\n    <!-- Inner lightning part -->\n    <path\n        android:fillColor=\"#FDED01\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M392.36,474.27c-1.67,-3.3 -3.37,-5.32 2.46,-9.24 4.87,-3.28 3.88,-4.96 0.05,-8.64 -6.18,-5.92 -13.7,-11.35 -19.86,-16.35 -4.12,-3.36 -5.04,-8.04 -3.25,-12.74 1.84,-4.86 3.3,-9.92 4.43,-15 0.88,-3.92 1.57,-9.7 13.2,-4.5 16.55,7.4 13.85,9.62 8.22,20.8 -3.05,6.05 -2.17,9.5 4.6,11.84 9.85,4.25 12.58,6.6 11.1,14.06 -2.53,12.68 -7.05,41.66 -9.94,41.67 -2.45,0 -7.93,-15.82 -11,-21.9zM443.2,491.03c-2.34,-0.08 -2.85,-19.2 -3.6,-25.64 -0.4,-3.54 3.07,-6.3 5.6,-6.9 10.02,-2.28 10.67,-0.48 8.92,-10.75 -0.12,-0.7 -0.34,-1.38 -0.45,-2.08 -1.47,-9.52 -1,-11.12 8.5,-12.67 16.6,-2.7 17.4,-0.98 14.57,15.65 -0.7,4.2 -1.68,8.4 -2.1,12.63 -0.45,4.57 -2.8,6.07 -7.07,5.62 -12.44,-1.3 -14.94,2.13 -18.24,11.3 -0.83,2.32 -4.22,12.9 -6.12,12.83zM380.22,506.38c-2.67,1.2 -10.35,-9.17 -13.22,-10.96 -1.65,-1.02 -5.03,-2.06 -10.26,7.06 -1.2,2.94 -2.98,1.02 -4.18,-0.6 -6.08,-8.14 -12.07,-16.36 -18.26,-24.42 -2.83,-3.67 -5.9,-6.33 2.7,-11.64 9.4,-5.8 9.5,-5.05 16.23,9.2 3.83,8.1 6.77,9.04 12.77,3.96 2.78,-2.24 4.18,-1.42 5.24,1.4 2.14,5.7 11.4,24.9 8.98,26z\" />\n    <!-- Closer arm border and chest thingy -->\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M210.54,346.53c-1.04,-10.87 -1.55,-21.76 -1,-32.67 0.3,-6.02 0.06,-12.27 3.43,-17.66 0.7,-1.14 0.3,-4.48 3.4,-2.9 2.4,1.2 3.74,3.16 2.36,5.73 -3.3,6.14 -2.77,12.68 -2.3,19.18 0.75,10.23 1.36,20.45 1.57,30.7 0.13,6.7 -1.3,13.33 -2.94,19.6 -1.1,4.25 -6.76,6.1 -11.14,7.7 -14.25,5.15 -28.7,4.03 -43.18,1.05 -4.4,-0.9 -8.8,-1.9 -13.13,-3.14 -12.8,-3.64 -21.36,-14.9 -22.23,-29.2 -1.33,-21.93 3.8,-42.26 15.37,-60.96 2.07,-3.34 4.55,-6.32 7.7,-8.7 1.12,-0.88 2.48,-1.9 3.7,-0.52 1.15,1.3 0.18,2.68 -0.76,3.74 -11.3,12.77 -15.1,28.64 -18.66,44.64 -2.04,9.1 -0.17,17.94 1.43,26.8 0.28,1.57 1,2.22 2.96,1.74 10.44,-2.54 18.43,3.77 19.02,14.98 0.1,2.15 -0.02,3.95 2.7,4.6 2.68,0.6 3.1,-1.24 3.93,-2.92 4.6,-9.3 13.3,-10.46 20.12,-2.64 1.32,1.5 2.54,3.24 3.26,5.08 1.04,2.65 2.88,2.18 4.92,2 2.46,-0.2 1.8,-1.85 1.96,-3.36 0.86,-7.92 7.08,-13.4 14.82,-12.84 2.32,0.17 2.73,-0.7 2.72,-2.53 0,-2.5 0,-4.98 0,-7.47zM308.06,332.2c-0.12,6.25 -2.05,10.53 -6.22,13.6 -1.52,1.1 -3.7,2.1 -5.26,1.3 -4.14,-2.1 -6.18,-0.1 -8.64,2.88 -3.26,3.96 -7.98,4.98 -12.76,3.6 -4.4,-1.26 -5.85,-5.44 -6.63,-9.4 -0.6,-3 -1.15,-3.68 -4.4,-2.7 -9.76,2.93 -14.16,-1.63 -12,-11.66 1,-4.58 2.56,-8.65 6.57,-11.36 1.13,-0.77 2.5,-1.76 3.74,-0.3 1,1.17 0.15,2.4 -0.62,3.36 -2.62,3.28 -3.73,7.05 -4.08,11.2 -0.23,2.62 0.6,3.44 3.14,2.85 2,-0.47 3.8,-1.23 5.64,-2.13 5.07,-2.5 7.27,-1.12 7.55,4.4 0.08,1.86 0.33,3.73 0.8,5.5 1.24,4.95 4.83,5.96 8.48,2.23 1.82,-1.86 3.06,-4.3 4.58,-6.44 1.9,-2.7 4,-3.1 6.62,-0.78 3.23,2.9 4.34,2.52 6.06,-1.47 0.78,-1.8 0.67,-3.66 0.7,-5.5 0,-2.2 0.3,-4.33 2.96,-4.42 2.47,-0.08 3.38,1.84 3.66,4.04 0.1,0.77 0.13,1.54 0.1,1.2z\" />\n    <!-- Trunk stripe -->\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M372.7,246.14c-6.72,-2.18 -13.42,0 -20.2,1.85 -2.07,0.55 -4.3,0.64 -6.45,0.8 -0.93,0.06 -1.9,-0.37 -2.2,-1.4 -0.32,-1.08 0.37,-1.85 1.22,-2.25 8.34,-3.92 16.8,-7.33 26.32,-6.44 1.6,0.15 2.97,0.8 4.15,1.9 1.13,1.08 1.6,2.3 1,3.8 -0.63,1.53 -1.94,1.88 -3.84,1.74z\" />\n    <!-- Closer eye -->\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M286.42,191.5c-0.25,5.12 -3.8,9 -7.9,8.64 -4.02,-0.35 -7.08,-3.9 -6.9,-8.03 0.2,-4.75 4.3,-8.5 8.97,-8.18 3.56,0.24 6.02,3.44 5.82,7.6z\" />\n    <!-- Further eye -->\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M386.43,187.58c-0.06,3.9 -3.55,7.14 -7.63,7.06 -3.82,-0.08 -6.46,-3 -6.34,-7.05 0.14,-4.75 3.54,-8.84 7.25,-8.73 3.3,0.1 6.8,4.63 6.73,8.7z\" />\n    <!-- Body stripe -->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M220.7,121.5c-3.06,4.42 -5.13,10.57 -10.46,14.47 -1.03,0.75 -2.34,1 -3.45,0 -1.06,-0.92 -1.27,-2.26 -0.8,-3.42 2.25,-5.68 5.84,-10.54 9.74,-15.17 0.84,-1 2.2,-1.16 3.44,-0.54 1.5,0.76 1.54,2.2 1.52,4.66z\" />\n    <!-- Trunk stripe -->\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M356.87,266.8c-0.66,-0.13 -1.88,-0.28 -3.06,-0.6 -0.9,-0.26 -1.68,-0.86 -1.7,-1.94 0,-1.05 0.65,-1.7 1.6,-2.05 4.9,-1.86 9.88,-3.6 15.1,-4.36 2.24,-0.33 3.98,0.7 4.4,3.1 0.47,2.52 -1.06,3.74 -3.33,4.08 -4.13,0.62 -8.28,1.13 -13,1.77z\" />\n    <!-- Body stripes -->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M189.06,292.78c1.26,-4.3 3.43,-8.9 6.02,-13.28 0.6,-1 1.7,-1.37 2.85,-0.8 1.37,0.66 2.28,1.83 1.88,3.35 -1.2,4.63 -2.33,9.3 -4.73,13.5 -0.8,1.4 -2.04,2.48 -3.84,1.68 -1.57,-0.7 -2.17,-2.1 -2.17,-4.45zM198.63,185.98c-0.63,4.92 -2.85,9.2 -4.9,13.5 -0.66,1.33 -2.2,1.65 -3.68,1 -1.26,-0.58 -1.86,-1.58 -1.68,-3 0.62,-4.82 2.53,-9.23 4.37,-13.64 0.58,-1.4 1.85,-2.1 3.42,-1.76 2.12,0.5 2.25,2.3 2.47,3.9zM182.57,137.72c-2.2,-0.14 -3.55,-1.7 -2.52,-4 2.05,-4.5 4.26,-9 8.27,-12.18 1.23,-0.97 2.72,-1.88 4.22,-0.62 1.46,1.23 1.03,2.8 0.14,4.2 -2.14,3.43 -4.27,6.86 -6.46,10.25 -0.75,1.17 -1.6,2.33 -3.65,2.35zM129.1,250.15c1.57,-3.46 2.86,-7.78 5.6,-11.37 0.87,-1.13 2.3,-1.77 3.74,-1 1.53,0.85 2.22,2.4 1.6,3.97 -1.57,4.02 -3.28,8 -5.15,11.87 -0.62,1.28 -2.08,2 -3.6,1.42 -1.85,-0.7 -2.23,-2.38 -2.2,-4.9zM104.77,259.68c1.02,-4.7 3.63,-8.9 6.3,-13.1 0.7,-1.1 2.08,-1.3 3.35,-0.68 1.3,0.64 1.7,1.9 1.44,3.15 -1,5.1 -3.78,9.45 -6.2,13.92 -0.62,1.14 -2.1,1.3 -3.34,0.63 -1.46,-0.77 -1.5,-2.22 -1.55,-3.92zM196.4,405.28c0.33,-2.06 -0.65,-5.15 2.86,-5.25 3,-0.1 3.44,2.43 3.8,4.9 0.45,3.2 1.3,6.35 1.77,9.56 0.22,1.56 -0.16,3.2 -2.06,3.7 -1.83,0.46 -2.9,-0.64 -3.7,-2.1 -1.82,-3.35 -2.6,-6.95 -2.66,-10.82zM179.67,166.87c0.44,-5.7 2.9,-9.64 5.6,-13.45 0.94,-1.34 2.5,-1.94 4.1,-1.02 1.45,0.83 1.62,2.32 1.07,3.68 -1.54,3.88 -3.14,7.75 -4.92,11.52 -0.7,1.5 -2.18,2.23 -3.92,1.72 -1.65,-0.48 -1.94,-1.82 -1.93,-2.45zM189.68,317.63c-0.5,3.56 -0.88,7.1 -1.57,10.57 -0.33,1.66 -1.24,3.36 -3.44,3.03 -1.94,-0.3 -2.9,-1.72 -3.07,-3.58 -0.45,-4.6 1.1,-8.85 2.43,-13.12 0.48,-1.52 1.94,-1.97 3.45,-1.5 2.4,0.72 1.8,2.93 2.2,4.6zM130.33,224.68c-2.6,-0.24 -3.46,-1.8 -2.67,-3.9 1.44,-3.83 3.92,-7.07 6.97,-9.77 1.3,-1.13 3.18,-1.62 4.7,-0.2 1.46,1.4 1.22,3.15 0.2,4.7 -1.55,2.33 -3.16,4.63 -4.87,6.84 -1.1,1.4 -2.68,2.08 -4.33,2.34zM169.37,397.9c0,-1.08 -0.06,-2.17 0.02,-3.25 0.07,-1.35 0.73,-2.4 2.1,-2.73 1.48,-0.36 2.36,0.6 2.94,1.74 1.9,3.8 2.58,7.94 2.93,12.12 0.12,1.52 -0.92,2.72 -2.54,2.78 -1.8,0.08 -3.44,-0.6 -4.08,-2.46 -0.92,-2.64 -1.56,-5.36 -1.38,-8.2zM117.86,285.05c-0.43,3.52 -2.02,6.88 -3.73,10.17 -0.63,1.2 -1.73,2.28 -3.42,1.68 -1.5,-0.54 -2.22,-1.76 -2.12,-3.26 0.3,-4.27 2.1,-8.04 4.38,-11.56 0.74,-1.13 2.13,-1.3 3.38,-0.83 1.64,0.63 1.5,2.15 1.52,3.8zM175.57,295.8c-1.7,4.22 -3.23,8.28 -5,12.25 -0.47,1.1 -1.8,1.05 -2.93,0.7 -1.17,-0.34 -2.04,-1.23 -1.84,-2.38 0.78,-4.43 1.38,-8.97 4.38,-12.62 0.95,-1.15 2.26,-1.74 3.74,-0.86 1.15,0.68 1.8,1.7 1.65,2.9z\" />\n    <!-- Body stripe -->\n    <path\n        android:fillColor=\"@color/elephant_friend_dark_body_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M181.5,425.72c0,-0.68 -0.03,-1.15 0.02,-1.6 0.25,-2.13 0.2,-4.94 3,-4.93 2.4,0 3.3,2.43 3.5,4.74 0.2,2.6 1.3,5.1 0.78,7.77 -0.3,1.64 -1.06,3.03 -2.83,3.24 -1.84,0.22 -2.82,-1.08 -3.32,-2.63 -0.7,-2.2 -1.3,-4.44 -1.14,-6.58z\" />\n    <!-- Trunk stripe -->\n    <path\n        android:fillColor=\"@color/elephant_friend_border_color\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M366.4,283.86c-1.87,0.13 -3.4,-0.38 -4.03,-2.33 -0.58,-1.8 0.6,-2.86 1.86,-3.84 2.32,-1.82 5.02,-2.47 7.84,-2.08 1.95,0.26 3.48,1.53 3.62,3.64 0.14,2.24 -1.35,3.3 -3.4,3.63 -1.97,0.33 -3.94,0.64 -5.9,0.96z\" />\n    <!-- Closer arm fingers -->\n    <path\n        android:fillColor=\"@color/elephant_friend_light_color_1\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M140.6,354.95c4.73,0.06 9.56,5.57 9.4,10.45 -0.05,1.58 -0.64,2.17 -1.87,1.56 -4.02,-2.02 -8.16,-3.98 -10.1,-8.5 -1.2,-2.77 -0.6,-3.54 2.58,-3.5zM166.22,371.58c0.93,-3.5 3.02,-5.46 6.4,-5.54 4.37,-0.1 5.93,3.26 7.34,6.6 -1.4,0.72 -9.28,0.2 -13.74,-1.06zM198.66,371.1c-1.6,-0.1 -1.43,-0.54 -1.37,-1.52 0.13,-2.68 5,-7.9 7.56,-8.02 1.67,-0.07 3.13,0.75 3.68,2.27 2.08,5.77 -7.72,7.4 -9.88,7.28z\" />\n    <!-- ??? What's this?-->\n    <path\n        android:fillColor=\"#ADC7BA\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M175.7,372.76c1.42,-0.03 2.84,-0.07 4.26,-0.1\" />\n    <!-- Closer cable part -->\n    <path\n        android:fillColor=\"@color/elephant_friend_accent_color\"\n        android:pathData=\"M288.17,570.5c-12.3,0 -24.53,-1.8 -35.3,-6.22 -2.82,-1.16 -8.25,-3.4 -13.7,-7.3 -9.7,-1.62 -19.28,-4.92 -27.95,-9.94 -17.26,-10 -34.4,-25.67 -48.2,-38.26 -3.87,-3.54 -7.52,-7.78 -10.6,-10.45 -11.05,-9.57 -41.26,-24.33 -63.54,-24.33 -0.05,0 -0.1,0 -0.13,0 -21.1,0 -49.48,10.67 -61.18,26.37 -1.56,2.08 -5.9,5.54 -11.53,3.2 -6.9,-2.9 -7.12,-8.33 -5.3,-12.35C18.97,472.94 62.47,456 88.7,456c0.06,0 0.1,0 0.16,0 25.63,0 60.5,15.28 75.8,28.55 3.27,2.82 7.02,6.52 11,10.15 13.1,11.98 29.42,27.04 44.93,36 0.98,0.6 2,1.2 3,1.7 -2.25,-19.02 8.88,-44.9 38.96,-54.04 12.8,-3.88 25.97,2.37 34.4,16.27 9.1,14.93 14,33.56 0.5,47.4 -3.85,3.93 -8.5,7.16 -13.73,9.66 16.06,0.66 33,-2.57 45.4,-6.66 5.04,-1.65 14.67,-5.88 18.98,-7.65 5.9,-2.44 9.57,-3.24 14.94,-4.05 5.32,-0.8 7.05,12.32 5.2,15.9 -0.56,1.08 -8.24,3.48 -11.37,4.67 -1.68,0.64 -16.2,7.03 -21.88,8.9 -13.27,4.37 -30.1,7.67 -46.83,7.67zM246.81,539.1c14.85,1.46 29.3,-1.97 37.26,-10.14 6.54,-6.7 2.2,-16.86 -3.07,-25.54 -1.46,-2.37 -6.66,-9.04 -13,-7.12 -21.37,6.48 -27.76,24.98 -25.65,34.94 0.6,2.9 2.06,5.48 4.46,7.85z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_add_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M440,520L240,520Q223,520 211.5,508.5Q200,497 200,480Q200,463 211.5,451.5Q223,440 240,440L440,440L440,240Q440,223 451.5,211.5Q463,200 480,200Q497,200 508.5,211.5Q520,223 520,240L520,440L720,440Q737,440 748.5,451.5Q760,463 760,480Q760,497 748.5,508.5Q737,520 720,520L520,520L520,720Q520,737 508.5,748.5Q497,760 480,760Q463,760 451.5,748.5Q440,737 440,720L440,520Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_add_a_photo_32dp_filled.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"32dp\"\n    android:height=\"32dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M800,280Q783,280 771.5,268.5Q760,257 760,240L760,200L720,200Q703,200 691.5,188.5Q680,177 680,160Q680,143 691.5,131.5Q703,120 720,120L760,120L760,80Q760,63 771.5,51.5Q783,40 800,40Q817,40 828.5,51.5Q840,63 840,80L840,120L880,120Q897,120 908.5,131.5Q920,143 920,160Q920,177 908.5,188.5Q897,200 880,200L840,200L840,240Q840,257 828.5,268.5Q817,280 800,280ZM440,700Q515,700 567.5,647.5Q620,595 620,520Q620,445 567.5,392.5Q515,340 440,340Q365,340 312.5,392.5Q260,445 260,520Q260,595 312.5,647.5Q365,700 440,700ZM440,620Q398,620 369,591Q340,562 340,520Q340,478 369,449Q398,420 440,420Q482,420 511,449Q540,478 540,520Q540,562 511,591Q482,620 440,620ZM120,840Q87,840 63.5,816.5Q40,793 40,760L40,280Q40,247 63.5,223.5Q87,200 120,200L246,200L296,146Q307,134 322.5,127Q338,120 355,120L560,120Q577,120 588.5,131.5Q600,143 600,160L600,220Q600,245 617.5,262.5Q635,280 660,280L680,280L680,300Q680,325 697.5,342.5Q715,360 740,360L800,360Q817,360 828.5,371.5Q840,383 840,400L840,760Q840,793 816.5,816.5Q793,840 760,840L120,840Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_arrow_back_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:autoMirrored=\"true\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M313,520L509,716Q521,728 520.5,744Q520,760 508,772Q496,783 480,783.5Q464,784 452,772L188,508Q182,502 179.5,495Q177,488 177,480Q177,472 179.5,465Q182,458 188,452L452,188Q463,177 479.5,177Q496,177 508,188Q520,200 520,216.5Q520,233 508,245L313,440L760,440Q777,440 788.5,451.5Q800,463 800,480Q800,497 788.5,508.5Q777,520 760,520L313,520Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_arrow_drop_down_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M459,579L314,434Q311,431 309.5,427.5Q308,424 308,420Q308,412 313.5,406Q319,400 328,400L632,400Q641,400 646.5,406Q652,412 652,420Q652,422 646,434L501,579Q496,584 491,586Q486,588 480,588Q474,588 469,586Q464,584 459,579Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_arrow_drop_up_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M328,560Q319,560 313.5,554Q308,548 308,540Q308,538 314,526L459,381Q464,376 469,374Q474,372 480,372Q486,372 491,374Q496,376 501,381L646,526Q649,529 650.5,532.5Q652,536 652,540Q652,548 646.5,554Q641,560 632,560L328,560Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_attach_file_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M720,630Q720,734 647,807Q574,880 470,880Q366,880 293,807Q220,734 220,630L220,260Q220,185 272.5,132.5Q325,80 400,80Q475,80 527.5,132.5Q580,185 580,260L580,610Q580,656 548,688Q516,720 470,720Q424,720 392,688Q360,656 360,610L360,280Q360,263 371.5,251.5Q383,240 400,240Q417,240 428.5,251.5Q440,263 440,280L440,610Q440,623 448.5,631.5Q457,640 470,640Q483,640 491.5,631.5Q500,623 500,610L500,260Q499,218 470.5,189Q442,160 400,160Q358,160 329,189Q300,218 300,260L300,630Q299,701 349,750.5Q399,800 470,800Q540,800 589,750.5Q638,701 640,630L640,280Q640,263 651.5,251.5Q663,240 680,240Q697,240 708.5,251.5Q720,263 720,280L720,630Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_block_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:autoMirrored=\"true\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,800Q534,800 584,782.5Q634,765 676,732L228,284Q195,326 177.5,376Q160,426 160,480Q160,614 253,707Q346,800 480,800ZM732,676Q765,634 782.5,584Q800,534 800,480Q800,346 707,253Q614,160 480,160Q426,160 376,177.5Q326,195 284,228L732,676Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_bookmark_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"?android:attr/textColorTertiary\"\n        android:pathData=\"M480,720L312,792Q272,809 236,785.5Q200,762 200,719L200,200Q200,167 223.5,143.5Q247,120 280,120L680,120Q713,120 736.5,143.5Q760,167 760,200L760,719Q760,762 724,785.5Q688,809 648,792L480,720ZM480,632L680,718Q680,718 680,718Q680,718 680,718L680,200Q680,200 680,200Q680,200 680,200L280,200Q280,200 280,200Q280,200 280,200L280,718Q280,718 280,718Q280,718 280,718L480,632ZM480,200L280,200Q280,200 280,200Q280,200 280,200L280,200Q280,200 280,200Q280,200 280,200L680,200Q680,200 680,200Q680,200 680,200L680,200Q680,200 680,200Q680,200 680,200L480,200Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_bookmark_24dp_filled.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"@color/tusky_green\"\n        android:pathData=\"M480,720L312,792Q272,809 236,785.5Q200,762 200,719L200,200Q200,167 223.5,143.5Q247,120 280,120L680,120Q713,120 736.5,143.5Q760,167 760,200L760,719Q760,762 724,785.5Q688,809 648,792L480,720Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_bot_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    android:width=\"24dp\"\r\n    android:height=\"24dp\"\r\n    android:viewportWidth=\"960\"\r\n    android:viewportHeight=\"960\">\r\n    <path\r\n        android:fillColor=\"#fff\"\r\n        android:pathData=\"M200,840Q167,840 143.5,816.5Q120,793 120,760L120,360Q120,260 190,190Q260,120 360,120L600,120Q700,120 770,190Q840,260 840,360L840,760Q840,793 816.5,816.5Q793,840 760,840L200,840ZM200,760L280,760L280,760L360,760L360,760L440,760L440,760L520,760L520,760L600,760L600,760L680,760L680,760L760,760Q760,760 760,760Q760,760 760,760L760,360Q760,294 713,247Q666,200 600,200L360,200Q294,200 247,247Q200,294 200,360L200,760Q200,760 200,760Q200,760 200,760ZM360,480Q327,480 303.5,456.5Q280,433 280,400Q280,367 303.5,343.5Q327,320 360,320Q393,320 416.5,343.5Q440,367 440,400Q440,433 416.5,456.5Q393,480 360,480ZM600,480Q567,480 543.5,456.5Q520,433 520,400Q520,367 543.5,343.5Q567,320 600,320Q633,320 656.5,343.5Q680,367 680,400Q680,433 656.5,456.5Q633,480 600,480ZM280,760L280,680Q280,647 303.5,623.5Q327,600 360,600L600,600Q633,600 656.5,623.5Q680,647 680,680L680,760L600,760L600,680Q600,680 600,680Q600,680 600,680L520,680L520,760L440,760L440,680L360,680Q360,680 360,680Q360,680 360,680L360,760L280,760ZM200,760L760,760Q760,760 760,760Q760,760 760,760L760,760Q760,760 713,760Q666,760 600,760L360,760Q294,760 247,760Q200,760 200,760L200,760Q200,760 200,760Q200,760 200,760Z\"/>\r\n</vector>\r\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_bottom_navigation_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M200,840Q167,840 143.5,816.5Q120,793 120,760L120,200Q120,167 143.5,143.5Q167,120 200,120L760,120Q793,120 816.5,143.5Q840,167 840,200L840,760Q840,793 816.5,816.5Q793,840 760,840L200,840ZM200,600L760,600L760,200Q760,200 760,200Q760,200 760,200L200,200Q200,200 200,200Q200,200 200,200L200,600ZM200,680L200,760Q200,760 200,760Q200,760 200,760L760,760Q760,760 760,760Q760,760 760,760L760,680L200,680ZM200,680L200,680L200,760Q200,760 200,760Q200,760 200,760L200,760Q200,760 200,760Q200,760 200,760L200,680Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_bottom_navigation_24dp_mirrored.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"m200,120q-33,0 -56.5,23.5Q120,167 120,200v560q0,33 23.5,56.5 23.5,23.5 56.5,23.5h560q33,0 56.5,-23.5Q840,793 840,760v-560q0,-33 -23.5,-56.5Q793,120 760,120ZM200,360h560v400L200,760ZM200,280v-80h560v80zM200,280v-80z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_campaign_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M840,520L760,520Q743,520 731.5,508.5Q720,497 720,480Q720,463 731.5,451.5Q743,440 760,440L840,440Q857,440 868.5,451.5Q880,463 880,480Q880,497 868.5,508.5Q857,520 840,520ZM664,672Q674,658 690,656Q706,654 720,664L784,712Q798,722 800,738Q802,754 792,768Q782,782 766,784Q750,786 736,776L672,728Q658,718 656,702Q654,686 664,672ZM784,248L720,296Q706,306 690,304Q674,302 664,288Q654,274 656,258Q658,242 672,232L736,184Q750,174 766,176Q782,178 792,192Q802,206 800,222Q798,238 784,248ZM200,600L160,600Q127,600 103.5,576.5Q80,553 80,520L80,440Q80,407 103.5,383.5Q127,360 160,360L320,360L459,276Q479,264 499.5,276Q520,288 520,311L520,649Q520,672 499.5,684Q479,696 459,684L320,600L280,600L280,720Q280,737 268.5,748.5Q257,760 240,760Q223,760 211.5,748.5Q200,737 200,720L200,600ZM440,578L440,382L342,440L160,440Q160,440 160,440Q160,440 160,440L160,520Q160,520 160,520Q160,520 160,520L342,520L440,578ZM560,614L560,346Q587,370 603.5,404.5Q620,439 620,480Q620,521 603.5,555.5Q587,590 560,614ZM300,480L300,480L300,480Q300,480 300,480Q300,480 300,480L300,480Q300,480 300,480Q300,480 300,480L300,480L300,480Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_cancel_24dp_filled.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M480,536L596,652Q607,663 624,663Q641,663 652,652Q663,641 663,624Q663,607 652,596L536,480L652,364Q663,353 663,336Q663,319 652,308Q641,297 624,297Q607,297 596,308L480,424L364,308Q353,297 336,297Q319,297 308,308Q297,319 297,336Q297,353 308,364L424,480L308,596Q297,607 297,624Q297,641 308,652Q319,663 336,663Q353,663 364,652L480,536ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_check_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M382,606L721,267Q733,255 749,255Q765,255 777,267Q789,279 789,295.5Q789,312 777,324L410,692Q398,704 382,704Q366,704 354,692L182,520Q170,508 170.5,491.5Q171,475 183,463Q195,451 211.5,451Q228,451 240,463L382,606Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_check_box_outline_blank_18dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"18dp\"\n    android:height=\"18dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M200,840Q167,840 143.5,816.5Q120,793 120,760L120,200Q120,167 143.5,143.5Q167,120 200,120L760,120Q793,120 816.5,143.5Q840,167 840,200L840,760Q840,793 816.5,816.5Q793,840 760,840L200,840ZM200,760L760,760Q760,760 760,760Q760,760 760,760L760,200Q760,200 760,200Q760,200 760,200L200,200Q200,200 200,200Q200,200 200,200L200,760Q200,760 200,760Q200,760 200,760Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_check_circle_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M424,664L706,382L650,326L424,552L310,438L254,494L424,664ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,800Q614,800 707,707Q800,614 800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_chevron_right_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:autoMirrored=\"true\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M504,480L320,296L376,240L616,480L376,720L320,664L504,480Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_close_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"?android:attr/textColorSecondary\"\n        android:pathData=\"M480,536L284,732Q273,743 256,743Q239,743 228,732Q217,721 217,704Q217,687 228,676L424,480L228,284Q217,273 217,256Q217,239 228,228Q239,217 256,217Q273,217 284,228L480,424L676,228Q687,217 704,217Q721,217 732,228Q743,239 743,256Q743,273 732,284L536,480L732,676Q743,687 743,704Q743,721 732,732Q721,743 704,743Q687,743 676,732L480,536Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_comments_disabled_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M607,720L160,720Q127,720 103.5,696.5Q80,673 80,640L80,193Q80,193 80,193Q80,193 80,193L55,168Q43,156 43,139.5Q43,123 55,111Q67,99 83.5,99Q100,99 112,111L848,847Q860,859 860,875Q860,891 848,903Q836,915 819.5,915Q803,915 791,903L607,720ZM880,160L880,717Q880,731 868,736Q856,741 846,731L675,560L680,560Q697,560 708.5,548.5Q720,537 720,520Q720,503 708.5,491.5Q697,480 680,480L595,480L555,440L680,440Q697,440 708.5,428.5Q720,417 720,400Q720,383 708.5,371.5Q697,360 680,360L475,360L435,320L680,320Q697,320 708.5,308.5Q720,297 720,280Q720,263 708.5,251.5Q697,240 680,240L355,240L263,148Q253,138 251.5,127Q250,116 255,105Q260,94 269,87Q278,80 292,80L800,80Q833,80 856.5,103.5Q880,127 880,160ZM447,560L367,480L280,480Q263,480 251.5,491.5Q240,503 240,520Q240,537 251.5,548.5Q263,560 280,560L447,560ZM327,440L255,368L255,368Q248,373 244,381.5Q240,390 240,400Q240,417 251.5,428.5Q263,440 280,440L327,440Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_content_copy_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:autoMirrored=\"true\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M360,720Q327,720 303.5,696.5Q280,673 280,640L280,160Q280,127 303.5,103.5Q327,80 360,80L720,80Q753,80 776.5,103.5Q800,127 800,160L800,640Q800,673 776.5,696.5Q753,720 720,720L360,720ZM360,640L720,640Q720,640 720,640Q720,640 720,640L720,160Q720,160 720,160Q720,160 720,160L360,160Q360,160 360,160Q360,160 360,160L360,640Q360,640 360,640Q360,640 360,640ZM200,880Q167,880 143.5,856.5Q120,833 120,800L120,280Q120,263 131.5,251.5Q143,240 160,240Q177,240 188.5,251.5Q200,263 200,280L200,800Q200,800 200,800Q200,800 200,800L600,800Q617,800 628.5,811.5Q640,823 640,840Q640,857 628.5,868.5Q617,880 600,880L200,880ZM360,640Q360,640 360,640Q360,640 360,640L360,160Q360,160 360,160Q360,160 360,160L360,160Q360,160 360,160Q360,160 360,160L360,640Q360,640 360,640Q360,640 360,640Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_developer_mode_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M274,480L372,578Q384,590 383.5,606Q383,622 372,634Q360,646 343.5,646.5Q327,647 315,635L188,508Q176,496 176,480Q176,464 188,452L315,325Q327,313 343.5,313.5Q360,314 372,326Q383,338 383.5,354Q384,370 372,382L274,480ZM280,800L280,840Q280,840 280,840Q280,840 280,840L680,840Q680,840 680,840Q680,840 680,840L680,800L280,800ZM280,160L680,160L680,120Q680,120 680,120Q680,120 680,120L280,120Q280,120 280,120Q280,120 280,120L280,160ZM686,480L588,382Q576,370 576.5,354Q577,338 588,326Q600,314 616.5,313.5Q633,313 645,325L772,452Q784,464 784,480Q784,496 772,508L645,635Q633,647 616.5,646.5Q600,646 588,634Q577,622 576.5,606Q576,590 588,578L686,480ZM280,160L280,120Q280,120 280,120Q280,120 280,120L280,120Q280,120 280,120Q280,120 280,120L280,160ZM280,800L280,800L280,840Q280,840 280,840Q280,840 280,840L280,840Q280,840 280,840Q280,840 280,840L280,800ZM280,920Q247,920 223.5,896.5Q200,873 200,840L200,720Q200,703 211.5,691.5Q223,680 240,680Q257,680 268.5,691.5Q280,703 280,720L280,720L680,720L680,720Q680,703 691.5,691.5Q703,680 720,680Q737,680 748.5,691.5Q760,703 760,720L760,840Q760,873 736.5,896.5Q713,920 680,920L280,920ZM280,40L680,40Q713,40 736.5,63.5Q760,87 760,120L760,240Q760,257 748.5,268.5Q737,280 720,280Q703,280 691.5,268.5Q680,257 680,240L680,240L280,240L280,240Q280,257 268.5,268.5Q257,280 240,280Q223,280 211.5,268.5Q200,257 200,240L200,120Q200,87 223.5,63.5Q247,40 280,40Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_done_outline_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M381,720L805,296L748,240L380,607L211,437L154,494L381,720ZM324,776L98,550Q86,538 80.5,523.5Q75,509 75,494Q75,479 80.5,464Q86,449 98,437L154,381Q166,369 180.5,363Q195,357 211,357Q227,357 241.5,363Q256,369 268,381L381,494L691,183Q702,171 717,165.5Q732,160 747,160Q762,160 777,165.5Q792,171 804,182L861,238Q873,250 879,264.5Q885,279 885,295Q885,311 879.5,325.5Q874,340 862,352L438,776Q426,788 411,794Q396,800 381,800Q366,800 351,794Q336,788 324,776Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_download_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M480,623Q472,623 465,620.5Q458,618 452,612L308,468Q296,456 296.5,440Q297,424 308,412Q320,400 336.5,399.5Q353,399 365,411L440,486L440,200Q440,183 451.5,171.5Q463,160 480,160Q497,160 508.5,171.5Q520,183 520,200L520,486L595,411Q607,399 623.5,399.5Q640,400 652,412Q663,424 663.5,440Q664,456 652,468L508,612Q502,618 495,620.5Q488,623 480,623ZM240,800Q207,800 183.5,776.5Q160,753 160,720L160,640Q160,623 171.5,611.5Q183,600 200,600Q217,600 228.5,611.5Q240,623 240,640L240,720Q240,720 240,720Q240,720 240,720L720,720Q720,720 720,720Q720,720 720,720L720,640Q720,623 731.5,611.5Q743,600 760,600Q777,600 788.5,611.5Q800,623 800,640L800,720Q800,753 776.5,776.5Q753,800 720,800L240,800Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_drag_indicator_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"?android:attr/textColorPrimary\"\n        android:pathData=\"M360,800Q327,800 303.5,776.5Q280,753 280,720Q280,687 303.5,663.5Q327,640 360,640Q393,640 416.5,663.5Q440,687 440,720Q440,753 416.5,776.5Q393,800 360,800ZM600,800Q567,800 543.5,776.5Q520,753 520,720Q520,687 543.5,663.5Q567,640 600,640Q633,640 656.5,663.5Q680,687 680,720Q680,753 656.5,776.5Q633,800 600,800ZM360,560Q327,560 303.5,536.5Q280,513 280,480Q280,447 303.5,423.5Q327,400 360,400Q393,400 416.5,423.5Q440,447 440,480Q440,513 416.5,536.5Q393,560 360,560ZM600,560Q567,560 543.5,536.5Q520,513 520,480Q520,447 543.5,423.5Q567,400 600,400Q633,400 656.5,423.5Q680,447 680,480Q680,513 656.5,536.5Q633,560 600,560ZM360,320Q327,320 303.5,296.5Q280,273 280,240Q280,207 303.5,183.5Q327,160 360,160Q393,160 416.5,183.5Q440,207 440,240Q440,273 416.5,296.5Q393,320 360,320ZM600,320Q567,320 543.5,296.5Q520,273 520,240Q520,207 543.5,183.5Q567,160 600,160Q633,160 656.5,183.5Q680,207 680,240Q680,273 656.5,296.5Q633,320 600,320Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_edit_24dp_filled.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"@color/white\"\n        android:pathData=\"M160,840Q143,840 131.5,828.5Q120,817 120,800L120,703Q120,687 126,672.5Q132,658 143,647L648,143Q660,132 674.5,126Q689,120 705,120Q721,120 736,126Q751,132 762,144L817,200Q829,211 834.5,226Q840,241 840,256Q840,272 834.5,286.5Q829,301 817,313L313,817Q302,828 287.5,834Q273,840 257,840L160,840ZM704,312L760,256L704,200L648,256L704,312Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_edit_document_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M560,840L560,774Q560,766 563,758.5Q566,751 572,745L781,537Q790,528 801,524Q812,520 823,520Q835,520 846,524.5Q857,529 866,538L903,575Q911,584 915.5,595Q920,606 920,617Q920,628 916,639.5Q912,651 903,660L695,868Q689,874 681.5,877Q674,880 666,880L600,880Q583,880 571.5,868.5Q560,857 560,840ZM860,617L860,617L823,580L823,580L860,617ZM620,820L658,820L779,698L742,661L620,782L620,820ZM240,880Q207,880 183.5,856.5Q160,833 160,800L160,160Q160,127 183.5,103.5Q207,80 240,80L527,80Q543,80 557.5,86Q572,92 583,103L777,297Q788,308 794,322.5Q800,337 800,353L800,410Q800,427 788.5,438.5Q777,450 760,450Q743,450 731.5,438.5Q720,427 720,410L720,360L560,360Q543,360 531.5,348.5Q520,337 520,320L520,160L240,160Q240,160 240,160Q240,160 240,160L240,800Q240,800 240,800Q240,800 240,800L440,800Q457,800 468.5,811.5Q480,823 480,840Q480,857 468.5,868.5Q457,880 440,880L240,880ZM240,800L240,756Q240,740 240,725.5Q240,711 240,700L240,440L240,440L240,440L240,360L240,160L240,160Q240,160 240,160Q240,160 240,160L240,800Q240,800 240,800Q240,800 240,800ZM761,679L742,661L742,661L779,698L779,698L761,679Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_email_alternate_18dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\nandroid:width=\"18dp\"\nandroid:height=\"18dp\"\nandroid:viewportWidth=\"960\"\nandroid:viewportHeight=\"960\">\n<path\n    android:fillColor=\"?android:textColorTertiary\"\n    android:pathData=\"M480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480L880,538Q880,597 839.5,638.5Q799,680 740,680Q705,680 674,665Q643,650 622,622Q593,651 556.5,665.5Q520,680 480,680Q397,680 338.5,621.5Q280,563 280,480Q280,397 338.5,338.5Q397,280 480,280Q563,280 621.5,338.5Q680,397 680,480L680,538Q680,564 697,582Q714,600 740,600Q766,600 783,582Q800,564 800,538L800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800L640,800Q657,800 668.5,811.5Q680,823 680,840Q680,857 668.5,868.5Q657,880 640,880L480,880ZM480,600Q530,600 565,565Q600,530 600,480Q600,430 565,395Q530,360 480,360Q430,360 395,395Q360,430 360,480Q360,530 395,565Q430,600 480,600Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_email_alternate_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\nandroid:width=\"24dp\"\nandroid:height=\"24dp\"\nandroid:viewportWidth=\"960\"\nandroid:viewportHeight=\"960\">\n<path\n    android:fillColor=\"?android:textColorTertiary\"\n    android:pathData=\"M480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480L880,538Q880,597 839.5,638.5Q799,680 740,680Q705,680 674,665Q643,650 622,622Q593,651 556.5,665.5Q520,680 480,680Q397,680 338.5,621.5Q280,563 280,480Q280,397 338.5,338.5Q397,280 480,280Q563,280 621.5,338.5Q680,397 680,480L680,538Q680,564 697,582Q714,600 740,600Q766,600 783,582Q800,564 800,538L800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800L640,800Q657,800 668.5,811.5Q680,823 680,840Q680,857 668.5,868.5Q657,880 640,880L480,880ZM480,600Q530,600 565,565Q600,530 600,480Q600,430 565,395Q530,360 480,360Q430,360 395,395Q360,430 360,480Q360,530 395,565Q430,600 480,600Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_error_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M480,680Q497,680 508.5,668.5Q520,657 520,640Q520,623 508.5,611.5Q497,600 480,600Q463,600 451.5,611.5Q440,623 440,640Q440,657 451.5,668.5Q463,680 480,680ZM480,520Q497,520 508.5,508.5Q520,497 520,480L520,320Q520,303 508.5,291.5Q497,280 480,280Q463,280 451.5,291.5Q440,303 440,320L440,480Q440,497 451.5,508.5Q463,520 480,520ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,800Q614,800 707,707Q800,614 800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_feedback_24dp_filled.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M240,720L148,812Q129,831 104.5,820.5Q80,810 80,783L80,160Q80,127 103.5,103.5Q127,80 160,80L800,80Q833,80 856.5,103.5Q880,127 880,160L880,640Q880,673 856.5,696.5Q833,720 800,720L240,720ZM480,600Q497,600 508.5,588.5Q520,577 520,560Q520,543 508.5,531.5Q497,520 480,520Q463,520 451.5,531.5Q440,543 440,560Q440,577 451.5,588.5Q463,600 480,600ZM480,440Q497,440 508.5,428.5Q520,417 520,400L520,240Q520,223 508.5,211.5Q497,200 480,200Q463,200 451.5,211.5Q440,223 440,240L440,400Q440,417 451.5,428.5Q463,440 480,440Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_filter_alt_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M440,800Q423,800 411.5,788.5Q400,777 400,760L400,520L168,224Q153,204 163.5,182Q174,160 200,160L760,160Q786,160 796.5,182Q807,204 792,224L560,520L560,760Q560,777 548.5,788.5Q537,800 520,800L440,800Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_flag_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorPrimary\"\n    android:autoMirrored=\"true\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M280,560L280,800Q280,817 268.5,828.5Q257,840 240,840Q223,840 211.5,828.5Q200,817 200,800L200,200Q200,183 211.5,171.5Q223,160 240,160L527,160Q541,160 552,169Q563,178 566,192L576,240L760,240Q777,240 788.5,251.5Q800,263 800,280L800,600Q800,617 788.5,628.5Q777,640 760,640L553,640Q539,640 528,631Q517,622 514,608L504,560L280,560Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_format_size_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M560,280L420,280Q395,280 377.5,262.5Q360,245 360,220Q360,195 377.5,177.5Q395,160 420,160L820,160Q845,160 862.5,177.5Q880,195 880,220Q880,245 862.5,262.5Q845,280 820,280L680,280L680,740Q680,765 662.5,782.5Q645,800 620,800Q595,800 577.5,782.5Q560,765 560,740L560,280ZM200,480L140,480Q115,480 97.5,462.5Q80,445 80,420Q80,395 97.5,377.5Q115,360 140,360L380,360Q405,360 422.5,377.5Q440,395 440,420Q440,445 422.5,462.5Q405,480 380,480L320,480L320,740Q320,765 302.5,782.5Q285,800 260,800Q235,800 217.5,782.5Q200,765 200,740L200,480Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_gavel_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M200,760L600,760Q617,760 628.5,771.5Q640,783 640,800Q640,817 628.5,828.5Q617,840 600,840L200,840Q183,840 171.5,828.5Q160,817 160,800Q160,783 171.5,771.5Q183,760 200,760ZM329,589L216,476Q193,453 192.5,419.5Q192,386 215,363L244,334L472,560L443,589Q420,612 386,612Q352,612 329,589ZM640,392L414,164L443,135Q466,112 499.5,112.5Q533,113 556,136L669,249Q692,272 692,306Q692,340 669,363L640,392ZM796,772L302,278L358,222L852,716Q863,727 863,744Q863,761 852,772Q841,783 824,783Q807,783 796,772Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_gif_box_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M470,600Q483,600 491.5,591.5Q500,583 500,570L500,390Q500,377 491.5,368.5Q483,360 470,360Q457,360 448.5,368.5Q440,377 440,390L440,570Q440,583 448.5,591.5Q457,600 470,600ZM280,600L360,600Q377,600 388.5,588.5Q400,577 400,560L400,510Q400,497 391.5,488.5Q383,480 370,480Q357,480 348.5,488.5Q340,497 340,510L340,540Q340,540 340,540Q340,540 340,540L300,540Q300,540 300,540Q300,540 300,540L300,420Q300,420 300,420Q300,420 300,420L370,420Q383,420 391.5,411.5Q400,403 400,390Q400,377 391.5,368.5Q383,360 370,360L280,360Q263,360 251.5,371.5Q240,383 240,400L240,560Q240,577 251.5,588.5Q263,600 280,600ZM590,600Q603,600 611.5,591.5Q620,583 620,570L620,520L670,520Q683,520 691.5,511.5Q700,503 700,490Q700,477 691.5,468.5Q683,460 670,460L620,460L620,420L710,420Q723,420 731.5,411.5Q740,403 740,390Q740,377 731.5,368.5Q723,360 710,360L590,360Q577,360 568.5,368.5Q560,377 560,390L560,570Q560,583 568.5,591.5Q577,600 590,600ZM200,840Q167,840 143.5,816.5Q120,793 120,760L120,200Q120,167 143.5,143.5Q167,120 200,120L760,120Q793,120 816.5,143.5Q840,167 840,200L840,760Q840,793 816.5,816.5Q793,840 760,840L200,840ZM200,760L760,760Q760,760 760,760Q760,760 760,760L760,200Q760,200 760,200Q760,200 760,200L200,200Q200,200 200,200Q200,200 200,200L200,760Q200,760 200,760Q200,760 200,760ZM200,760Q200,760 200,760Q200,760 200,760L200,200Q200,200 200,200Q200,200 200,200L200,200Q200,200 200,200Q200,200 200,200L200,760Q200,760 200,760Q200,760 200,760Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_group_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M40,688Q40,654 57.5,625.5Q75,597 104,582Q166,551 230,535.5Q294,520 360,520Q426,520 490,535.5Q554,551 616,582Q645,597 662.5,625.5Q680,654 680,688L680,720Q680,753 656.5,776.5Q633,800 600,800L120,800Q87,800 63.5,776.5Q40,753 40,720L40,688ZM840,800L738,800Q749,782 754.5,761.5Q760,741 760,720L760,680Q760,636 735.5,595.5Q711,555 666,526Q717,532 762,546.5Q807,561 846,582Q882,602 901,626.5Q920,651 920,680L920,720Q920,753 896.5,776.5Q873,800 840,800ZM360,480Q294,480 247,433Q200,386 200,320Q200,254 247,207Q294,160 360,160Q426,160 473,207Q520,254 520,320Q520,386 473,433Q426,480 360,480ZM760,320Q760,386 713,433Q666,480 600,480Q589,480 572,477.5Q555,475 544,472Q571,440 585.5,401Q600,362 600,320Q600,278 585.5,239Q571,200 544,168Q558,163 572,161.5Q586,160 600,160Q666,160 713,207Q760,254 760,320ZM120,720L600,720L600,688Q600,677 594.5,668Q589,659 580,654Q526,627 471,613.5Q416,600 360,600Q304,600 249,613.5Q194,627 140,654Q131,659 125.5,668Q120,677 120,688L120,720ZM360,400Q393,400 416.5,376.5Q440,353 440,320Q440,287 416.5,263.5Q393,240 360,240Q327,240 303.5,263.5Q280,287 280,320Q280,353 303.5,376.5Q327,400 360,400ZM360,720L360,720L360,720Q360,720 360,720Q360,720 360,720Q360,720 360,720Q360,720 360,720Q360,720 360,720Q360,720 360,720Q360,720 360,720Q360,720 360,720ZM360,320Q360,320 360,320Q360,320 360,320Q360,320 360,320Q360,320 360,320Q360,320 360,320Q360,320 360,320Q360,320 360,320Q360,320 360,320Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_group_24dp_filled.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M40,688Q40,654 57.5,625.5Q75,597 104,582Q166,551 230,535.5Q294,520 360,520Q426,520 490,535.5Q554,551 616,582Q645,597 662.5,625.5Q680,654 680,688L680,720Q680,753 656.5,776.5Q633,800 600,800L120,800Q87,800 63.5,776.5Q40,753 40,720L40,688ZM738,800Q749,782 754.5,761.5Q760,741 760,720L760,680Q760,636 735.5,595.5Q711,555 666,526Q717,532 762,546.5Q807,561 846,582Q882,602 901,626.5Q920,651 920,680L920,720Q920,753 896.5,776.5Q873,800 840,800L738,800ZM360,480Q294,480 247,433Q200,386 200,320Q200,254 247,207Q294,160 360,160Q426,160 473,207Q520,254 520,320Q520,386 473,433Q426,480 360,480ZM760,320Q760,386 713,433Q666,480 600,480Q589,480 572,477.5Q555,475 544,472Q571,440 585.5,401Q600,362 600,320Q600,278 585.5,239Q571,200 544,168Q558,163 572,161.5Q586,160 600,160Q666,160 713,207Q760,254 760,320Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_heart_broken_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M160,340Q160,370 170.5,397Q181,424 208,458.5Q235,493 281,541Q327,589 398,661Q402,665 406.5,663.5Q411,662 412,657L431,480L431,480Q379,480 348,439.5Q317,399 331,350L369,217Q353,209 335.5,204.5Q318,200 300,200Q242,200 201,241Q160,282 160,340ZM800,340Q800,282 759,241Q718,200 660,200Q649,200 638,201.5Q627,203 616,207L592,280L592,280Q637,292 658.5,333.5Q680,375 666,420L614,595Q612,600 617.5,603.5Q623,607 628,602Q683,546 717,508.5Q751,471 769.5,442.5Q788,414 794,391Q800,368 800,340ZM666,420Q666,420 666,420Q666,420 666,420Q666,420 666,420Q666,420 666,420Q666,420 666,420Q666,420 666,420L666,420Q666,420 666,420Q666,420 666,420L666,420L666,420Q666,420 666,420Q666,420 666,420Q666,420 666,420Q666,420 666,420ZM331,350Q331,350 331,350Q331,350 331,350Q331,350 331,350Q331,350 331,350L331,350Q331,350 331,350Q331,350 331,350L331,350L331,350Q331,350 331,350Q331,350 331,350Q331,350 331,350Q331,350 331,350Q331,350 331,350Q331,350 331,350ZM481,814Q467,814 453.5,809Q440,804 429,794Q320,698 252,632.5Q184,567 145.5,517.5Q107,468 93.5,427Q80,386 80,340Q80,248 144,184Q208,120 300,120Q366,120 416,145.5Q466,171 452,219L415,349Q410,369 421.5,384.5Q433,400 453,400L520,400L494,654Q493,662 500.5,663Q508,664 510,657L584,412Q590,392 578,376Q566,360 546,360L480,360L541,179Q552,144 587,132Q622,120 660,120Q752,120 816,184Q880,248 880,340Q880,384 864,427Q848,470 808.5,522Q769,574 702.5,639.5Q636,705 534,794Q523,804 509,809Q495,814 481,814Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_help_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:autoMirrored=\"true\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M478,720Q499,720 513.5,705.5Q528,691 528,670Q528,649 513.5,634.5Q499,620 478,620Q457,620 442.5,634.5Q428,649 428,670Q428,691 442.5,705.5Q457,720 478,720ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,800Q614,800 707,707Q800,614 800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480ZM484,308Q509,308 527.5,324Q546,340 546,364Q546,386 532.5,403Q519,420 502,435Q479,455 461.5,479Q444,503 444,533Q444,547 454.5,556.5Q465,566 479,566Q494,566 504.5,556Q515,546 518,531Q522,510 536,493.5Q550,477 566,462Q589,440 605.5,414Q622,388 622,356Q622,305 580.5,272.5Q539,240 484,240Q446,240 411.5,256Q377,272 359,305Q352,317 354.5,330.5Q357,344 368,351Q382,359 397,356Q412,353 422,339Q433,324 449.5,316Q466,308 484,308Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_home_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M240,760L360,760L360,560Q360,543 371.5,531.5Q383,520 400,520L560,520Q577,520 588.5,531.5Q600,543 600,560L600,760L720,760L720,400Q720,400 720,400Q720,400 720,400L480,220Q480,220 480,220Q480,220 480,220L240,400Q240,400 240,400Q240,400 240,400L240,760ZM160,760L160,400Q160,381 168.5,364Q177,347 192,336L432,156Q453,140 480,140Q507,140 528,156L768,336Q783,347 791.5,364Q800,381 800,400L800,760Q800,793 776.5,816.5Q753,840 720,840L560,840Q543,840 531.5,828.5Q520,817 520,800L520,600Q520,600 520,600Q520,600 520,600L440,600Q440,600 440,600Q440,600 440,600L440,800Q440,817 428.5,828.5Q417,840 400,840L240,840Q207,840 183.5,816.5Q160,793 160,760ZM480,490L480,490L480,490Q480,490 480,490Q480,490 480,490L480,490L480,490L480,490L480,490Q480,490 480,490Q480,490 480,490L480,490Q480,490 480,490Q480,490 480,490L480,490Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_home_24dp_filled.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M160,760L160,400Q160,381 168.5,364Q177,347 192,336L432,156Q453,140 480,140Q507,140 528,156L768,336Q783,347 791.5,364Q800,381 800,400L800,760Q800,793 776.5,816.5Q753,840 720,840L600,840Q583,840 571.5,828.5Q560,817 560,800L560,600Q560,583 548.5,571.5Q537,560 520,560L440,560Q423,560 411.5,571.5Q400,583 400,600L400,800Q400,817 388.5,828.5Q377,840 360,840L240,840Q207,840 183.5,816.5Q160,793 160,760Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_image_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M200,840Q167,840 143.5,816.5Q120,793 120,760L120,200Q120,167 143.5,143.5Q167,120 200,120L760,120Q793,120 816.5,143.5Q840,167 840,200L840,760Q840,793 816.5,816.5Q793,840 760,840L200,840ZM200,760L760,760Q760,760 760,760Q760,760 760,760L760,200Q760,200 760,200Q760,200 760,200L200,200Q200,200 200,200Q200,200 200,200L200,760Q200,760 200,760Q200,760 200,760ZM200,760Q200,760 200,760Q200,760 200,760L200,200Q200,200 200,200Q200,200 200,200L200,200Q200,200 200,200Q200,200 200,200L200,760Q200,760 200,760Q200,760 200,760ZM280,680L680,680Q692,680 698,669Q704,658 696,648L586,501Q580,493 570,493Q560,493 554,501L450,640L376,541Q370,533 360,533Q350,533 344,541L264,648Q256,658 262,669Q268,680 280,680Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_info_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M480,680Q497,680 508.5,668.5Q520,657 520,640L520,480Q520,463 508.5,451.5Q497,440 480,440Q463,440 451.5,451.5Q440,463 440,480L440,640Q440,657 451.5,668.5Q463,680 480,680ZM480,360Q497,360 508.5,348.5Q520,337 520,320Q520,303 508.5,291.5Q497,280 480,280Q463,280 451.5,291.5Q440,303 440,320Q440,337 451.5,348.5Q463,360 480,360ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,800Q614,800 707,707Q800,614 800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_insert_chart_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M200,840Q167,840 143.5,816.5Q120,793 120,760L120,200Q120,167 143.5,143.5Q167,120 200,120L760,120Q793,120 816.5,143.5Q840,167 840,200L840,760Q840,793 816.5,816.5Q793,840 760,840L200,840ZM200,760L760,760Q760,760 760,760Q760,760 760,760L760,200Q760,200 760,200Q760,200 760,200L200,200Q200,200 200,200Q200,200 200,200L200,760Q200,760 200,760Q200,760 200,760ZM200,200L200,200Q200,200 200,200Q200,200 200,200L200,760Q200,760 200,760Q200,760 200,760L200,760Q200,760 200,760Q200,760 200,760L200,200Q200,200 200,200Q200,200 200,200ZM320,400Q303,400 291.5,411.5Q280,423 280,440L280,640Q280,657 291.5,668.5Q303,680 320,680Q337,680 348.5,668.5Q360,657 360,640L360,440Q360,423 348.5,411.5Q337,400 320,400ZM480,280Q463,280 451.5,291.5Q440,303 440,320L440,640Q440,657 451.5,668.5Q463,680 480,680Q497,680 508.5,668.5Q520,657 520,640L520,320Q520,303 508.5,291.5Q497,280 480,280ZM640,520Q623,520 611.5,531.5Q600,543 600,560L600,640Q600,657 611.5,668.5Q623,680 640,680Q657,680 668.5,668.5Q680,657 680,640L680,560Q680,543 668.5,531.5Q657,520 640,520Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_insert_chart_24dp_filled.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n  <path\n      android:fillColor=\"?attr/colorPrimary\"\n      android:pathData=\"M200,840Q167,840 143.5,816.5Q120,793 120,760L120,200Q120,167 143.5,143.5Q167,120 200,120L760,120Q793,120 816.5,143.5Q840,167 840,200L840,760Q840,793 816.5,816.5Q793,840 760,840L200,840ZM320,400Q303,400 291.5,411.5Q280,423 280,440L280,640Q280,657 291.5,668.5Q303,680 320,680Q337,680 348.5,668.5Q360,657 360,640L360,440Q360,423 348.5,411.5Q337,400 320,400ZM480,280Q463,280 451.5,291.5Q440,303 440,320L440,640Q440,657 451.5,668.5Q463,680 480,680Q497,680 508.5,668.5Q520,657 520,640L520,320Q520,303 508.5,291.5Q497,280 480,280ZM640,520Q623,520 611.5,531.5Q600,543 600,560L600,640Q600,657 611.5,668.5Q623,680 640,680Q657,680 668.5,668.5Q680,657 680,640L680,560Q680,543 668.5,531.5Q657,520 640,520Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_list_alt_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:autoMirrored=\"true\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M320,680Q337,680 348.5,668.5Q360,657 360,640Q360,623 348.5,611.5Q337,600 320,600Q303,600 291.5,611.5Q280,623 280,640Q280,657 291.5,668.5Q303,680 320,680ZM320,520Q337,520 348.5,508.5Q360,497 360,480Q360,463 348.5,451.5Q337,440 320,440Q303,440 291.5,451.5Q280,463 280,480Q280,497 291.5,508.5Q303,520 320,520ZM320,360Q337,360 348.5,348.5Q360,337 360,320Q360,303 348.5,291.5Q337,280 320,280Q303,280 291.5,291.5Q280,303 280,320Q280,337 291.5,348.5Q303,360 320,360ZM480,680L640,680Q657,680 668.5,668.5Q680,657 680,640Q680,623 668.5,611.5Q657,600 640,600L480,600Q463,600 451.5,611.5Q440,623 440,640Q440,657 451.5,668.5Q463,680 480,680ZM480,520L640,520Q657,520 668.5,508.5Q680,497 680,480Q680,463 668.5,451.5Q657,440 640,440L480,440Q463,440 451.5,451.5Q440,463 440,480Q440,497 451.5,508.5Q463,520 480,520ZM480,360L640,360Q657,360 668.5,348.5Q680,337 680,320Q680,303 668.5,291.5Q657,280 640,280L480,280Q463,280 451.5,291.5Q440,303 440,320Q440,337 451.5,348.5Q463,360 480,360ZM200,840Q167,840 143.5,816.5Q120,793 120,760L120,200Q120,167 143.5,143.5Q167,120 200,120L760,120Q793,120 816.5,143.5Q840,167 840,200L840,760Q840,793 816.5,816.5Q793,840 760,840L200,840ZM200,760L760,760Q760,760 760,760Q760,760 760,760L760,200Q760,200 760,200Q760,200 760,200L200,200Q200,200 200,200Q200,200 200,200L200,760Q200,760 200,760Q200,760 200,760ZM200,200L200,200Q200,200 200,200Q200,200 200,200L200,760Q200,760 200,760Q200,760 200,760L200,760Q200,760 200,760Q200,760 200,760L200,200Q200,200 200,200Q200,200 200,200Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_list_alt_24dp_filled.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:autoMirrored=\"true\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M320,680Q337,680 348.5,668.5Q360,657 360,640Q360,623 348.5,611.5Q337,600 320,600Q303,600 291.5,611.5Q280,623 280,640Q280,657 291.5,668.5Q303,680 320,680ZM320,520Q337,520 348.5,508.5Q360,497 360,480Q360,463 348.5,451.5Q337,440 320,440Q303,440 291.5,451.5Q280,463 280,480Q280,497 291.5,508.5Q303,520 320,520ZM320,360Q337,360 348.5,348.5Q360,337 360,320Q360,303 348.5,291.5Q337,280 320,280Q303,280 291.5,291.5Q280,303 280,320Q280,337 291.5,348.5Q303,360 320,360ZM480,680L640,680Q657,680 668.5,668.5Q680,657 680,640Q680,623 668.5,611.5Q657,600 640,600L480,600Q463,600 451.5,611.5Q440,623 440,640Q440,657 451.5,668.5Q463,680 480,680ZM480,520L640,520Q657,520 668.5,508.5Q680,497 680,480Q680,463 668.5,451.5Q657,440 640,440L480,440Q463,440 451.5,451.5Q440,463 440,480Q440,497 451.5,508.5Q463,520 480,520ZM480,360L640,360Q657,360 668.5,348.5Q680,337 680,320Q680,303 668.5,291.5Q657,280 640,280L480,280Q463,280 451.5,291.5Q440,303 440,320Q440,337 451.5,348.5Q463,360 480,360ZM200,840Q167,840 143.5,816.5Q120,793 120,760L120,200Q120,167 143.5,143.5Q167,120 200,120L760,120Q793,120 816.5,143.5Q840,167 840,200L840,760Q840,793 816.5,816.5Q793,840 760,840L200,840Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_local_fire_department_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M480,880Q346,880 253,787Q160,694 160,560Q160,447 227,343Q294,239 411,161Q433,146 456.5,159.5Q480,173 480,200L480,252Q480,286 503.5,309Q527,332 561,332Q578,332 593.5,324.5Q609,317 621,303Q629,293 641.5,290.5Q654,288 665,296Q728,341 764,411Q800,481 800,560Q800,694 707,787Q614,880 480,880ZM240,560Q240,612 261,658.5Q282,705 321,740Q320,735 320,731Q320,727 320,722Q320,690 332,662Q344,634 367,611L480,500L593,611Q616,634 628,662Q640,690 640,722Q640,727 640,731Q640,735 639,740Q678,705 699,658.5Q720,612 720,560Q720,510 701.5,465.5Q683,421 648,386Q648,386 648,386Q648,386 648,386Q628,399 606,405.5Q584,412 561,412Q499,412 453.5,371Q408,330 401,270L401,270Q401,270 401,270Q401,270 401,270Q323,336 281.5,410.5Q240,485 240,560ZM480,612L423,668Q412,679 406,693Q400,707 400,722Q400,754 423.5,777Q447,800 480,800Q513,800 536.5,777Q560,754 560,722Q560,706 554,692.5Q548,679 537,668L480,612Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_local_fire_department_24dp_filled.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M160,560Q160,447 227,343Q294,239 411,161Q433,146 456.5,159.5Q480,173 480,200L480,252Q480,286 503.5,309Q527,332 561,332Q578,332 593.5,324.5Q609,317 621,303Q629,293 641.5,290.5Q654,288 665,296Q728,341 764,411Q800,481 800,560Q800,648 757,720.5Q714,793 644,835Q661,811 670.5,782.5Q680,754 680,722Q680,682 665,646.5Q650,611 622,583L480,444L339,583Q310,612 295,647Q280,682 280,722Q280,754 289.5,782.5Q299,811 316,835Q246,793 203,720.5Q160,648 160,560ZM480,556L565,639Q582,656 591,677Q600,698 600,722Q600,771 565,805.5Q530,840 480,840Q430,840 395,805.5Q360,771 360,722Q360,699 369,677.5Q378,656 395,639L480,556Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_lock_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"@color/textColorDisabled\"\n        android:pathData=\"M240,880Q207,880 183.5,856.5Q160,833 160,800L160,400Q160,367 183.5,343.5Q207,320 240,320L280,320L280,240Q280,157 338.5,98.5Q397,40 480,40Q563,40 621.5,98.5Q680,157 680,240L680,320L720,320Q753,320 776.5,343.5Q800,367 800,400L800,800Q800,833 776.5,856.5Q753,880 720,880L240,880ZM240,800L720,800Q720,800 720,800Q720,800 720,800L720,400Q720,400 720,400Q720,400 720,400L240,400Q240,400 240,400Q240,400 240,400L240,800Q240,800 240,800Q240,800 240,800ZM480,680Q513,680 536.5,656.5Q560,633 560,600Q560,567 536.5,543.5Q513,520 480,520Q447,520 423.5,543.5Q400,567 400,600Q400,633 423.5,656.5Q447,680 480,680ZM360,320L600,320L600,240Q600,190 565,155Q530,120 480,120Q430,120 395,155Q360,190 360,240L360,320ZM240,800Q240,800 240,800Q240,800 240,800L240,400Q240,400 240,400Q240,400 240,400L240,400Q240,400 240,400Q240,400 240,400L240,800Q240,800 240,800Q240,800 240,800Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_lock_24dp_filled.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"?attr/colorPrimary\"\n        android:pathData=\"M240,880Q207,880 183.5,856.5Q160,833 160,800L160,400Q160,367 183.5,343.5Q207,320 240,320L280,320L280,240Q280,157 338.5,98.5Q397,40 480,40Q563,40 621.5,98.5Q680,157 680,240L680,320L720,320Q753,320 776.5,343.5Q800,367 800,400L800,800Q800,833 776.5,856.5Q753,880 720,880L240,880ZM480,680Q513,680 536.5,656.5Q560,633 560,600Q560,567 536.5,543.5Q513,520 480,520Q447,520 423.5,543.5Q400,567 400,600Q400,633 423.5,656.5Q447,680 480,680ZM360,320L600,320L600,240Q600,190 565,155Q530,120 480,120Q430,120 395,155Q360,190 360,240L360,320Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_lock_open_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M240,880Q207,880 183.5,856.5Q160,833 160,800L160,400Q160,367 183.5,343.5Q207,320 240,320L600,320L600,240Q600,190 565,155Q530,120 480,120Q438,120 406.5,145.5Q375,171 364,209Q360,223 347.5,231.5Q335,240 320,240Q303,240 291.5,229Q280,218 283,203Q297,134 352,87Q407,40 480,40Q563,40 621.5,98.5Q680,157 680,240L680,320L720,320Q753,320 776.5,343.5Q800,367 800,400L800,800Q800,833 776.5,856.5Q753,880 720,880L240,880ZM240,800L720,800Q720,800 720,800Q720,800 720,800L720,400Q720,400 720,400Q720,400 720,400L240,400Q240,400 240,400Q240,400 240,400L240,800Q240,800 240,800Q240,800 240,800ZM480,680Q513,680 536.5,656.5Q560,633 560,600Q560,567 536.5,543.5Q513,520 480,520Q447,520 423.5,543.5Q400,567 400,600Q400,633 423.5,656.5Q447,680 480,680ZM240,800Q240,800 240,800Q240,800 240,800L240,400Q240,400 240,400Q240,400 240,400L240,400Q240,400 240,400Q240,400 240,400L240,800Q240,800 240,800Q240,800 240,800Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_logout_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:autoMirrored=\"true\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M200,840Q167,840 143.5,816.5Q120,793 120,760L120,200Q120,167 143.5,143.5Q167,120 200,120L440,120Q457,120 468.5,131.5Q480,143 480,160Q480,177 468.5,188.5Q457,200 440,200L200,200Q200,200 200,200Q200,200 200,200L200,760Q200,760 200,760Q200,760 200,760L440,760Q457,760 468.5,771.5Q480,783 480,800Q480,817 468.5,828.5Q457,840 440,840L200,840ZM687,520L400,520Q383,520 371.5,508.5Q360,497 360,480Q360,463 371.5,451.5Q383,440 400,440L687,440L612,365Q601,354 601,338Q601,322 612,310Q623,298 640,297.5Q657,297 669,309L812,452Q824,464 824,480Q824,496 812,508L669,651Q657,663 640.5,662.5Q624,662 612,650Q601,638 601.5,621.5Q602,605 613,594L687,520Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_mail_24dp.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"@color/textColorDisabled\"\n    android:pathData=\"M160,800Q127,800 103.5,776.5Q80,753 80,720L80,240Q80,207 103.5,183.5Q127,160 160,160L800,160Q833,160 856.5,183.5Q880,207 880,240L880,720Q880,753 856.5,776.5Q833,800 800,800L160,800ZM800,320L501,507Q496,510 490.5,511.5Q485,513 480,513Q475,513 469.5,511.5Q464,510 459,507L160,320L160,720Q160,720 160,720Q160,720 160,720L800,720Q800,720 800,720Q800,720 800,720L800,320ZM480,440L800,240L160,240L480,440ZM160,320L160,330Q160,325 160,317.5Q160,310 160,301Q160,281 160,271Q160,261 160,272L160,240L160,240L160,272Q160,261 160,271.5Q160,282 160,301Q160,311 160,318.5Q160,326 160,330L160,320L160,720Q160,720 160,720Q160,720 160,720L160,720Q160,720 160,720Q160,720 160,720L160,320Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_mail_24dp_filled.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M160,800Q127,800 103.5,776.5Q80,753 80,720L80,240Q80,207 103.5,183.5Q127,160 160,160L800,160Q833,160 856.5,183.5Q880,207 880,240L880,720Q880,753 856.5,776.5Q833,800 800,800L160,800ZM480,513Q485,513 490.5,511.5Q496,510 501,507L784,330Q792,325 796,317.5Q800,310 800,301Q800,281 783,271Q766,261 748,272L480,440L212,272Q194,261 177,271.5Q160,282 160,301Q160,311 164,318.5Q168,326 176,330L459,507Q464,510 469.5,511.5Q475,513 480,513Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_manage_accounts_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M400,480Q334,480 287,433Q240,386 240,320Q240,254 287,207Q334,160 400,160Q466,160 513,207Q560,254 560,320Q560,386 513,433Q466,480 400,480ZM80,720L80,688Q80,655 97,626Q114,597 144,582Q202,553 264,536.5Q326,520 391,520L391,520Q408,520 419.5,532Q431,544 431,561Q431,578 419.5,589.5Q408,601 391,601Q391,601 391,601Q391,601 391,601Q335,601 282.5,615Q230,629 180,654Q170,659 165,668Q160,677 160,688L160,720L391,720Q408,720 419.5,731.5Q431,743 431,760Q431,777 419.5,788.5Q408,800 391,800L160,800Q127,800 103.5,776.5Q80,753 80,720ZM634,808L628,780Q616,775 605.5,769.5Q595,764 584,756L555,765Q542,769 529.5,764Q517,759 510,748L502,734Q495,722 497,708Q499,694 510,685L532,666Q530,652 530,640Q530,628 532,614L510,595Q499,586 497,572.5Q495,559 502,547L511,532Q518,521 530,516Q542,511 555,515L584,524Q595,516 605.5,510.5Q616,505 628,500L634,471Q637,457 647.5,448.5Q658,440 672,440L688,440Q702,440 712.5,449Q723,458 726,472L732,500Q744,505 754.5,511Q765,517 776,526L803,517Q817,512 830,517Q843,522 850,534L858,548Q865,560 863,574Q861,588 850,597L828,616Q830,628 830,641Q830,654 828,666L850,685Q861,694 863,707.5Q865,721 858,733L849,748Q842,759 830,764Q818,769 805,765L776,756Q765,764 754.5,769.5Q744,775 732,780L726,809Q723,823 712.5,831.5Q702,840 688,840L672,840Q658,840 647.5,831Q637,822 634,808ZM680,720Q713,720 736.5,696.5Q760,673 760,640Q760,607 736.5,583.5Q713,560 680,560Q647,560 623.5,583.5Q600,607 600,640Q600,673 623.5,696.5Q647,720 680,720ZM400,400Q433,400 456.5,376.5Q480,353 480,320Q480,287 456.5,263.5Q433,240 400,240Q367,240 343.5,263.5Q320,287 320,320Q320,353 343.5,376.5Q367,400 400,400ZM400,320Q400,320 400,320Q400,320 400,320Q400,320 400,320Q400,320 400,320Q400,320 400,320Q400,320 400,320Q400,320 400,320Q400,320 400,320ZM412,720L412,720L412,720Q412,720 412,720Q412,720 412,720Q412,720 412,720Q412,720 412,720Q412,720 412,720Q412,720 412,720Q412,720 412,720Q412,720 412,720Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_mood_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M620,440Q645,440 662.5,422.5Q680,405 680,380Q680,355 662.5,337.5Q645,320 620,320Q595,320 577.5,337.5Q560,355 560,380Q560,405 577.5,422.5Q595,440 620,440ZM340,440Q365,440 382.5,422.5Q400,405 400,380Q400,355 382.5,337.5Q365,320 340,320Q315,320 297.5,337.5Q280,355 280,380Q280,405 297.5,422.5Q315,440 340,440ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480ZM480,800Q614,800 707,707Q800,614 800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800ZM480,700Q538,700 587,672Q636,644 666,596Q672,584 665,572Q658,560 644,560L316,560Q302,560 295,572Q288,584 294,596Q324,644 373.5,672Q423,700 480,700Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_more_horiz_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"28dp\"\n    android:height=\"28dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M240,560Q207,560 183.5,536.5Q160,513 160,480Q160,447 183.5,423.5Q207,400 240,400Q273,400 296.5,423.5Q320,447 320,480Q320,513 296.5,536.5Q273,560 240,560ZM480,560Q447,560 423.5,536.5Q400,513 400,480Q400,447 423.5,423.5Q447,400 480,400Q513,400 536.5,423.5Q560,447 560,480Q560,513 536.5,536.5Q513,560 480,560ZM720,560Q687,560 663.5,536.5Q640,513 640,480Q640,447 663.5,423.5Q687,400 720,400Q753,400 776.5,423.5Q800,447 800,480Q800,513 776.5,536.5Q753,560 720,560Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_more_vert_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M480,800Q447,800 423.5,776.5Q400,753 400,720Q400,687 423.5,663.5Q447,640 480,640Q513,640 536.5,663.5Q560,687 560,720Q560,753 536.5,776.5Q513,800 480,800ZM480,560Q447,560 423.5,536.5Q400,513 400,480Q400,447 423.5,423.5Q447,400 480,400Q513,400 536.5,423.5Q560,447 560,480Q560,513 536.5,536.5Q513,560 480,560ZM480,320Q447,320 423.5,296.5Q400,273 400,240Q400,207 423.5,183.5Q447,160 480,160Q513,160 536.5,183.5Q560,207 560,240Q560,273 536.5,296.5Q513,320 480,320Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_music_box_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:pathData=\"M200,840q-33,0 -56.5,-23.5T120,760v-560q0,-33 23.5,-56.5T200,120h560q33,0 56.5,23.5T840,200v560q0,33 -23.5,56.5T760,840L200,840ZM200,760h560v-560L200,200v560Z\"\n        android:fillColor=\"?android:textColorTertiary\"/>\n    <path\n        android:pathData=\"m433.06,691.25q-38.73,0 -66.31,-27.58 -27.58,-27.58 -27.58,-66.31 0,-38.73 27.58,-66.31 27.58,-27.58 66.31,-27.58 13.5,0 24.94,3.23 11.44,3.23 22,9.68v-224.16q0,-9.98 6.75,-16.72 6.75,-6.75 16.72,-6.75h93.89q9.98,0 16.72,6.75 6.75,6.75 6.75,16.72v46.94q0,9.98 -6.75,16.72 -6.75,6.75 -16.72,6.75h-70.42v234.72q0,38.73 -27.58,66.31 -27.58,27.58 -66.31,27.58z\"\n        android:strokeWidth=\"0.586797\"\n        android:fillColor=\"?android:textColorTertiary\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_notifications_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\nandroid:width=\"24dp\"\nandroid:height=\"24dp\"\nandroid:viewportWidth=\"960\"\nandroid:viewportHeight=\"960\">\n<path\n    android:fillColor=\"#fff\"\n    android:pathData=\"M200,760Q183,760 171.5,748.5Q160,737 160,720Q160,703 171.5,691.5Q183,680 200,680L240,680L240,400Q240,317 290,252.5Q340,188 420,168L420,140Q420,115 437.5,97.5Q455,80 480,80Q505,80 522.5,97.5Q540,115 540,140L540,168Q620,188 670,252.5Q720,317 720,400L720,680L760,680Q777,680 788.5,691.5Q800,703 800,720Q800,737 788.5,748.5Q777,760 760,760L200,760ZM480,460L480,460L480,460L480,460Q480,460 480,460Q480,460 480,460Q480,460 480,460Q480,460 480,460ZM480,880Q447,880 423.5,856.5Q400,833 400,800L560,800Q560,833 536.5,856.5Q513,880 480,880ZM320,680L640,680L640,400Q640,334 593,287Q546,240 480,240Q414,240 367,287Q320,334 320,400L320,680Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_notifications_24dp_filled.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M200,760Q183,760 171.5,748.5Q160,737 160,720Q160,703 171.5,691.5Q183,680 200,680L240,680L240,400Q240,317 290,252.5Q340,188 420,168L420,140Q420,115 437.5,97.5Q455,80 480,80Q505,80 522.5,97.5Q540,115 540,140L540,168Q620,188 670,252.5Q720,317 720,400L720,680L760,680Q777,680 788.5,691.5Q800,703 800,720Q800,737 788.5,748.5Q777,760 760,760L200,760ZM480,880Q447,880 423.5,856.5Q400,833 400,800L560,800Q560,833 536.5,856.5Q513,880 480,880Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_notifications_active_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#000\"\n        android:pathData=\"M200,760Q183,760 171.5,748.5Q160,737 160,720Q160,703 171.5,691.5Q183,680 200,680L240,680L240,400Q240,317 290,252.5Q340,188 420,168L420,140Q420,115 437.5,97.5Q455,80 480,80Q505,80 522.5,97.5Q540,115 540,140L540,168Q620,188 670,252.5Q720,317 720,400L720,680L760,680Q777,680 788.5,691.5Q800,703 800,720Q800,737 788.5,748.5Q777,760 760,760L200,760ZM480,880Q447,880 423.5,856.5Q400,833 400,800L560,800Q560,833 536.5,856.5Q513,880 480,880ZM120,400Q103,400 91.5,387Q80,374 82,357Q90,282 124,217.5Q158,153 211,105Q224,94 240.5,95Q257,96 267,110Q277,124 275,140Q273,156 260,168Q221,205 196,254Q171,303 163,360Q161,377 149,388.5Q137,400 120,400ZM840,400Q823,400 811,388.5Q799,377 797,360Q789,303 764,254Q739,205 700,168Q687,156 685,140Q683,124 693,110Q703,96 719.5,95Q736,94 749,105Q802,153 836,217.5Q870,282 878,357Q880,374 868.5,387Q857,400 840,400Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_open_in_new_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:autoMirrored=\"true\">\n    <path\n        android:fillColor=\"?attr/colorPrimary\"\n        android:pathData=\"M200,840Q167,840 143.5,816.5Q120,793 120,760L120,200Q120,167 143.5,143.5Q167,120 200,120L440,120Q457,120 468.5,131.5Q480,143 480,160Q480,177 468.5,188.5Q457,200 440,200L200,200Q200,200 200,200Q200,200 200,200L200,760Q200,760 200,760Q200,760 200,760L760,760Q760,760 760,760Q760,760 760,760L760,520Q760,503 771.5,491.5Q783,480 800,480Q817,480 828.5,491.5Q840,503 840,520L840,760Q840,793 816.5,816.5Q793,840 760,840L200,840ZM760,256L416,600Q405,611 388,611Q371,611 360,600Q349,589 349,572Q349,555 360,544L704,200L600,200Q583,200 571.5,188.5Q560,177 560,160Q560,143 571.5,131.5Q583,120 600,120L800,120Q817,120 828.5,131.5Q840,143 840,160L840,360Q840,377 828.5,388.5Q817,400 800,400Q783,400 771.5,388.5Q760,377 760,360L760,256Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_palette_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M480,880Q398,880 325,848.5Q252,817 197.5,762.5Q143,708 111.5,635Q80,562 80,480Q80,397 112.5,324Q145,251 200.5,197Q256,143 330,111.5Q404,80 488,80Q568,80 639,107.5Q710,135 763.5,183.5Q817,232 848.5,298.5Q880,365 880,442Q880,557 810,618.5Q740,680 640,680L566,680Q557,680 553.5,685Q550,690 550,696Q550,708 565,730.5Q580,753 580,782Q580,832 552.5,856Q525,880 480,880ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480L480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480ZM260,520Q286,520 303,503Q320,486 320,460Q320,434 303,417Q286,400 260,400Q234,400 217,417Q200,434 200,460Q200,486 217,503Q234,520 260,520ZM380,360Q406,360 423,343Q440,326 440,300Q440,274 423,257Q406,240 380,240Q354,240 337,257Q320,274 320,300Q320,326 337,343Q354,360 380,360ZM580,360Q606,360 623,343Q640,326 640,300Q640,274 623,257Q606,240 580,240Q554,240 537,257Q520,274 520,300Q520,326 537,343Q554,360 580,360ZM700,520Q726,520 743,503Q760,486 760,460Q760,434 743,417Q726,400 700,400Q674,400 657,417Q640,434 640,460Q640,486 657,503Q674,520 700,520ZM480,800Q489,800 494.5,795Q500,790 500,782Q500,768 485,749Q470,730 470,692Q470,650 499,625Q528,600 570,600L640,600Q706,600 753,561.5Q800,523 800,442Q800,321 707.5,240.5Q615,160 488,160Q352,160 256,253Q160,346 160,480Q160,613 253.5,706.5Q347,800 480,800Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_person_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M480,480Q414,480 367,433Q320,386 320,320Q320,254 367,207Q414,160 480,160Q546,160 593,207Q640,254 640,320Q640,386 593,433Q546,480 480,480ZM160,720L160,688Q160,654 177.5,625.5Q195,597 224,582Q286,551 350,535.5Q414,520 480,520Q546,520 610,535.5Q674,551 736,582Q765,597 782.5,625.5Q800,654 800,688L800,720Q800,753 776.5,776.5Q753,800 720,800L240,800Q207,800 183.5,776.5Q160,753 160,720ZM240,720L720,720L720,688Q720,677 714.5,668Q709,659 700,654Q646,627 591,613.5Q536,600 480,600Q424,600 369,613.5Q314,627 260,654Q251,659 245.5,668Q240,677 240,688L240,720ZM480,400Q513,400 536.5,376.5Q560,353 560,320Q560,287 536.5,263.5Q513,240 480,240Q447,240 423.5,263.5Q400,287 400,320Q400,353 423.5,376.5Q447,400 480,400ZM480,320Q480,320 480,320Q480,320 480,320Q480,320 480,320Q480,320 480,320Q480,320 480,320Q480,320 480,320Q480,320 480,320Q480,320 480,320ZM480,720L480,720Q480,720 480,720Q480,720 480,720Q480,720 480,720Q480,720 480,720Q480,720 480,720Q480,720 480,720Q480,720 480,720Q480,720 480,720L480,720Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_person_add_24dp_mirrored.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"m240,440h80q17,0 28.5,-11.5Q360,417 360,400 360,383 348.5,371.5 337,360 320,360h-80v-80q0,-17 -11.5,-28.5Q217,240 200,240q-17,0 -28.5,11.5Q160,263 160,280v80L80,360q-17,0 -28.5,11.5Q40,383 40,400q0,17 11.5,28.5Q63,440 80,440h80v80q0,17 11.5,28.5 11.5,11.5 28.5,11.5 17,0 28.5,-11.5Q240,537 240,520ZM600,480q66,0 113,-47 47,-47 47,-113 0,-66 -47,-113 -47,-47 -113,-47 -66,0 -113,47 -47,47 -47,113 0,66 47,113 47,47 113,47zM920,720v-32q0,-34 -17.5,-62.5Q885,597 856,582 794,551 730,535.5 666,520 600,520q-66,0 -130,15.5 -64,15.5 -126,46.5 -29,15 -46.5,43.5Q280,654 280,688v32q0,33 23.5,56.5 23.5,23.5 56.5,23.5h480q33,0 56.5,-23.5Q920,753 920,720ZM840,720L360,720v-32q0,-11 5.5,-20 5.5,-9 14.5,-14 54,-27 109,-40.5 55,-13.5 111,-13.5 56,0 111,13.5 55,13.5 109,40.5 9,5 14.5,14 5.5,9 5.5,20zM600,400q-33,0 -56.5,-23.5Q520,353 520,320q0,-33 23.5,-56.5 23.5,-23.5 56.5,-23.5 33,0 56.5,23.5 23.5,23.5 23.5,56.5 0,33 -23.5,56.5Q633,400 600,400ZM600,320zM600,720z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_person_add_24dp_mirrored_filled.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:pathData=\"m240,440h80q17,0 28.5,-11.5Q360,417 360,400 360,383 348.5,371.5 337,360 320,360h-80v-80q0,-17 -11.5,-28.5Q217,240 200,240q-17,0 -28.5,11.5Q160,263 160,280v80L80,360q-17,0 -28.5,11.5Q40,383 40,400q0,17 11.5,28.5Q63,440 80,440h80v80q0,17 11.5,28.5 11.5,11.5 28.5,11.5 17,0 28.5,-11.5Q240,537 240,520ZM600,480q66,0 113,-47 47,-47 47,-113 0,-66 -47,-113 -47,-47 -113,-47 -66,0 -113,47 -47,47 -47,113 0,66 47,113 47,47 113,47zM920,720v-32q0,-34 -17.5,-62.5Q885,597 856,582 794,551 730,535.5 666,520 600,520q-66,0 -130,15.5 -64,15.5 -126,46.5 -29,15 -46.5,43.5Q280,654 280,688v32q0,33 23.5,56.5 23.5,23.5 56.5,23.5h480q33,0 56.5,-23.5Q920,753 920,720Z\"\n        android:fillColor=\"?attr/colorPrimary\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_person_remove_24dp_mirrored.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M240,360L80,360q-17,0 -28.5,11.5Q40,383 40,400q0,17 11.5,28.5Q63,440 80,440h160q17,0 28.5,-11.5Q280,417 280,400 280,383 268.5,371.5 257,360 240,360ZM560,480q66,0 113,-47 47,-47 47,-113 0,-66 -47,-113 -47,-47 -113,-47 -66,0 -113,47 -47,47 -47,113 0,66 47,113 47,47 113,47zM880,720v-32q0,-34 -17.5,-62.5Q845,597 816,582 754,551 690,535.5 626,520 560,520q-66,0 -130,15.5 -64,15.5 -126,46.5 -29,15 -46.5,43.5Q240,654 240,688v32q0,33 23.5,56.5 23.5,23.5 56.5,23.5h480q33,0 56.5,-23.5Q880,753 880,720ZM800,720L320,720v-32q0,-11 5.5,-20 5.5,-9 14.5,-14 54,-27 109,-40.5 55,-13.5 111,-13.5 56,0 111,13.5 55,13.5 109,40.5 9,5 14.5,14 5.5,9 5.5,20zM560,400q-33,0 -56.5,-23.5Q480,353 480,320q0,-33 23.5,-56.5 23.5,-23.5 56.5,-23.5 33,0 56.5,23.5 23.5,23.5 23.5,56.5 0,33 -23.5,56.5Q593,400 560,400ZM560,320zM560,720z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_photo_camera_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M480,700Q555,700 607.5,647.5Q660,595 660,520Q660,445 607.5,392.5Q555,340 480,340Q405,340 352.5,392.5Q300,445 300,520Q300,595 352.5,647.5Q405,700 480,700ZM480,620Q438,620 409,591Q380,562 380,520Q380,478 409,449Q438,420 480,420Q522,420 551,449Q580,478 580,520Q580,562 551,591Q522,620 480,620ZM160,840Q127,840 103.5,816.5Q80,793 80,760L80,280Q80,247 103.5,223.5Q127,200 160,200L286,200L336,146Q347,134 362.5,127Q378,120 395,120L565,120Q582,120 597.5,127Q613,134 624,146L674,200L800,200Q833,200 856.5,223.5Q880,247 880,280L880,760Q880,793 856.5,816.5Q833,840 800,840L160,840ZM160,760L800,760Q800,760 800,760Q800,760 800,760L800,280Q800,280 800,280Q800,280 800,280L638,280L565,200L395,200L322,280L160,280Q160,280 160,280Q160,280 160,280L160,760Q160,760 160,760Q160,760 160,760ZM480,520Q480,520 480,520Q480,520 480,520L480,520Q480,520 480,520Q480,520 480,520L480,520L480,520L480,520L480,520L480,520Q480,520 480,520Q480,520 480,520L480,520Q480,520 480,520Q480,520 480,520Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_public_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM440,798L440,720Q407,720 383.5,696.5Q360,673 360,640L360,600L168,408Q165,426 162.5,444Q160,462 160,480Q160,601 239.5,692Q319,783 440,798ZM716,696Q757,651 778.5,595.5Q800,540 800,480Q800,382 745.5,301Q691,220 600,184L600,200Q600,233 576.5,256.5Q553,280 520,280L440,280L440,360Q440,377 428.5,388.5Q417,400 400,400L320,400L320,480L560,480Q577,480 588.5,491.5Q600,503 600,520L600,640L640,640Q666,640 687,655.5Q708,671 716,696Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_radio_button_unchecked_18dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"18dp\"\n    android:height=\"18dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,800Q614,800 707,707Q800,614 800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_reblog_direct_24dp.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"@color/textColorDisabled\"\n    android:pathData=\"M160,800Q127,800 103.5,776.5Q80,753 80,720L80,240Q80,207 103.5,183.5Q127,160 160,160L800,160Q833,160 856.5,183.5Q880,207 880,240L880,720Q880,753 856.5,776.5Q833,800 800,800L160,800ZM800,320L501,507Q496,510 490.5,511.5Q485,513 480,513Q475,513 469.5,511.5Q464,510 459,507L160,320L160,720Q160,720 160,720Q160,720 160,720L800,720Q800,720 800,720Q800,720 800,720L800,320ZM480,440L800,240L160,240L480,440ZM160,320L160,330Q160,325 160,317.5Q160,310 160,301Q160,281 160,271Q160,261 160,272L160,240L160,240L160,272Q160,261 160,271.5Q160,282 160,301Q160,311 160,318.5Q160,326 160,330L160,320L160,720Q160,720 160,720Q160,720 160,720L160,720Q160,720 160,720Q160,720 160,720L160,320Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_repeat_18dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"18dp\"\n    android:height=\"18dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"?android:attr/textColorTertiary\"\n        android:pathData=\"M274,760L308,794Q320,806 319.5,822Q319,838 308,850Q296,862 279.5,862.5Q263,863 251,851L148,748Q142,742 139.5,735Q137,728 137,720Q137,712 139.5,705Q142,698 148,692L251,589Q263,577 279.5,577.5Q296,578 308,590Q319,602 319.5,618Q320,634 308,646L274,680L680,680Q680,680 680,680Q680,680 680,680L680,560Q680,543 691.5,531.5Q703,520 720,520Q737,520 748.5,531.5Q760,543 760,560L760,680Q760,713 736.5,736.5Q713,760 680,760L274,760ZM686,280L280,280Q280,280 280,280Q280,280 280,280L280,400Q280,417 268.5,428.5Q257,440 240,440Q223,440 211.5,428.5Q200,417 200,400L200,280Q200,247 223.5,223.5Q247,200 280,200L686,200L652,166Q640,154 640.5,138Q641,122 652,110Q664,98 680.5,97.5Q697,97 709,109L812,212Q818,218 820.5,225Q823,232 823,240Q823,248 820.5,255Q818,262 812,268L709,371Q697,383 680.5,382.5Q664,382 652,370Q641,358 640.5,342Q640,326 652,314L686,280Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_repeat_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"?android:attr/textColorTertiary\"\n        android:pathData=\"M274,760L308,794Q320,806 319.5,822Q319,838 308,850Q296,862 279.5,862.5Q263,863 251,851L148,748Q142,742 139.5,735Q137,728 137,720Q137,712 139.5,705Q142,698 148,692L251,589Q263,577 279.5,577.5Q296,578 308,590Q319,602 319.5,618Q320,634 308,646L274,680L680,680Q680,680 680,680Q680,680 680,680L680,560Q680,543 691.5,531.5Q703,520 720,520Q737,520 748.5,531.5Q760,543 760,560L760,680Q760,713 736.5,736.5Q713,760 680,760L274,760ZM686,280L280,280Q280,280 280,280Q280,280 280,280L280,400Q280,417 268.5,428.5Q257,440 240,440Q223,440 211.5,428.5Q200,417 200,400L200,280Q200,247 223.5,223.5Q247,200 280,200L686,200L652,166Q640,154 640.5,138Q641,122 652,110Q664,98 680.5,97.5Q697,97 709,109L812,212Q818,218 820.5,225Q823,232 823,240Q823,248 820.5,255Q818,262 812,268L709,371Q697,383 680.5,382.5Q664,382 652,370Q641,358 640.5,342Q640,326 652,314L686,280Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_repeat_active_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n  <path\n      android:pathData=\"m274,760 l34,34q12,12 11.5,28T308,850q-12,12 -28.5,12.5T251,851L148,748q-6,-6 -8.5,-13t-2.5,-15q0,-8 2.5,-15t8.5,-13l103,-103q12,-12 28.5,-11.5T308,590q11,12 11.5,28T308,646l-34,34h406v-120q0,-17 11.5,-28.5T720,520q17,0 28.5,11.5T760,560v120q0,33 -23.5,56.5T680,760L274,760ZM686,280L280,280v120q0,17 -11.5,28.5T240,440q-17,0 -28.5,-11.5T200,400v-120q0,-33 23.5,-56.5T280,200h406l-34,-34q-12,-12 -11.5,-28t11.5,-28q12,-12 28.5,-12.5T709,109l103,103q6,6 8.5,13t2.5,15q0,8 -2.5,15t-8.5,13L709,371q-12,12 -28.5,11.5T652,370q-11,-12 -11.5,-28t11.5,-28l34,-34Z\"\n      android:fillColor=\"?attr/colorPrimary\"/>\n  <path\n      android:pathData=\"M400.18,480a79.82,80.68 0,1 0,159.63 0a79.82,80.68 0,1 0,-159.63 0z\"\n      android:strokeWidth=\"40\"\n      android:fillColor=\"?attr/colorPrimary\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_reply_18dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\nandroid:width=\"18dp\"\nandroid:height=\"18dp\"\nandroid:viewportWidth=\"960\"\nandroid:viewportHeight=\"960\"\nandroid:autoMirrored=\"true\">\n<path\n    android:fillColor=\"?android:attr/textColorTertiary\"\n    android:pathData=\"M273,480L389,596Q401,608 400.5,624Q400,640 388,652Q376,663 360,663.5Q344,664 332,652L148,468Q136,456 136,440Q136,424 148,412L332,228Q343,217 359.5,217Q376,217 388,228Q400,240 400,256.5Q400,273 388,285L273,400L640,400Q723,400 781.5,458.5Q840,517 840,600L840,720Q840,737 828.5,748.5Q817,760 800,760Q783,760 771.5,748.5Q760,737 760,720L760,600Q760,550 725,515Q690,480 640,480L273,480Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_reply_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:autoMirrored=\"true\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M273,480L389,596Q401,608 400.5,624Q400,640 388,652Q376,663 360,663.5Q344,664 332,652L148,468Q136,456 136,440Q136,424 148,412L332,228Q343,217 359.5,217Q376,217 388,228Q400,240 400,256.5Q400,273 388,285L273,400L640,400Q723,400 781.5,458.5Q840,517 840,600L840,720Q840,737 828.5,748.5Q817,760 800,760Q783,760 771.5,748.5Q760,737 760,720L760,600Q760,550 725,515Q690,480 640,480L273,480Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_reply_all_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:autoMirrored=\"true\">\n    <path\n        android:fillColor=\"?android:attr/textColorTertiary\"\n        android:pathData=\"M193,440L349,596Q361,608 360.5,624Q360,640 348,652Q336,663 320,663.5Q304,664 292,652L108,468Q102,462 99.5,455Q97,448 97,440Q97,432 99.5,425Q102,418 108,412L292,228Q303,217 319.5,217Q336,217 348,228Q360,240 360,256.5Q360,273 348,285L193,440ZM433,480L549,596Q561,608 560.5,624Q560,640 548,652Q536,663 520,663.5Q504,664 492,652L308,468Q302,462 299.5,455Q297,448 297,440Q297,432 299.5,425Q302,418 308,412L492,228Q503,217 519.5,217Q536,217 548,228Q560,240 560,256.5Q560,273 548,285L433,400L680,400Q763,400 821.5,458.5Q880,517 880,600L880,720Q880,737 868.5,748.5Q857,760 840,760Q823,760 811.5,748.5Q800,737 800,720L800,600Q800,550 765,515Q730,480 680,480L433,480Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_schedule_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M520,464L520,320Q520,303 508.5,291.5Q497,280 480,280Q463,280 451.5,291.5Q440,303 440,320L440,479Q440,487 443,494.5Q446,502 452,508L584,640Q595,651 612,651Q629,651 640,640Q651,629 651,612Q651,595 640,584L520,464ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480ZM480,800Q613,800 706.5,706.5Q800,613 800,480Q800,347 706.5,253.5Q613,160 480,160Q347,160 253.5,253.5Q160,347 160,480Q160,613 253.5,706.5Q347,800 480,800Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_search_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M380,640Q271,640 195.5,564.5Q120,489 120,380Q120,271 195.5,195.5Q271,120 380,120Q489,120 564.5,195.5Q640,271 640,380Q640,424 626,463Q612,502 588,532L812,756Q823,767 823,784Q823,801 812,812Q801,823 784,823Q767,823 756,812L532,588Q502,612 463,626Q424,640 380,640ZM380,560Q455,560 507.5,507.5Q560,455 560,380Q560,305 507.5,252.5Q455,200 380,200Q305,200 252.5,252.5Q200,305 200,380Q200,455 252.5,507.5Q305,560 380,560Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_send_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:autoMirrored=\"true\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M792,517L176,777Q156,785 138,773.5Q120,762 120,740L120,220Q120,198 138,186.5Q156,175 176,183L792,443Q817,454 817,480Q817,506 792,517ZM200,680L674,480L200,280L200,420L440,480L200,540L200,680ZM200,680L200,480L200,280L200,420L200,420L200,540L200,540L200,680Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_settings_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M433,880Q406,880 386.5,862Q367,844 363,818L354,752Q341,747 329.5,740Q318,733 307,725L245,751Q220,762 195,753Q170,744 156,721L109,639Q95,616 101,590Q107,564 128,547L181,507Q180,500 180,493.5Q180,487 180,480Q180,473 180,466.5Q180,460 181,453L128,413Q107,396 101,370Q95,344 109,321L156,239Q170,216 195,207Q220,198 245,209L307,235Q318,227 330,220Q342,213 354,208L363,142Q367,116 386.5,98Q406,80 433,80L527,80Q554,80 573.5,98Q593,116 597,142L606,208Q619,213 630.5,220Q642,227 653,235L715,209Q740,198 765,207Q790,216 804,239L851,321Q865,344 859,370Q853,396 832,413L779,453Q780,460 780,466.5Q780,473 780,480Q780,487 780,493.5Q780,500 778,507L831,547Q852,564 858,590Q864,616 850,639L802,721Q788,744 763,753Q738,762 713,751L653,725Q642,733 630,740Q618,747 606,752L597,818Q593,844 573.5,862Q554,880 527,880L433,880ZM440,800L519,800L533,694Q564,686 590.5,670.5Q617,655 639,633L738,674L777,606L691,541Q696,527 698,511.5Q700,496 700,480Q700,464 698,448.5Q696,433 691,419L777,354L738,286L639,328Q617,305 590.5,289.5Q564,274 533,266L520,160L441,160L427,266Q396,274 369.5,289.5Q343,305 321,327L222,286L183,354L269,418Q264,433 262,448Q260,463 260,480Q260,496 262,511Q264,526 269,541L183,606L222,674L321,632Q343,655 369.5,670.5Q396,686 427,694L440,800ZM482,620Q540,620 581,579Q622,538 622,480Q622,422 581,381Q540,340 482,340Q423,340 382.5,381Q342,422 342,480Q342,538 382.5,579Q423,620 482,620ZM480,480L480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480L480,480Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_share_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M680,880Q630,880 595,845Q560,810 560,760Q560,754 563,732L282,568Q266,583 245,591.5Q224,600 200,600Q150,600 115,565Q80,530 80,480Q80,430 115,395Q150,360 200,360Q224,360 245,368.5Q266,377 282,392L563,228Q561,221 560.5,214.5Q560,208 560,200Q560,150 595,115Q630,80 680,80Q730,80 765,115Q800,150 800,200Q800,250 765,285Q730,320 680,320Q656,320 635,311.5Q614,303 598,288L317,452Q319,459 319.5,465.5Q320,472 320,480Q320,488 319.5,494.5Q319,501 317,508L598,672Q614,657 635,648.5Q656,640 680,640Q730,640 765,675Q800,710 800,760Q800,810 765,845Q730,880 680,880ZM680,800Q697,800 708.5,788.5Q720,777 720,760Q720,743 708.5,731.5Q697,720 680,720Q663,720 651.5,731.5Q640,743 640,760Q640,777 651.5,788.5Q663,800 680,800ZM200,520Q217,520 228.5,508.5Q240,497 240,480Q240,463 228.5,451.5Q217,440 200,440Q183,440 171.5,451.5Q160,463 160,480Q160,497 171.5,508.5Q183,520 200,520ZM680,240Q697,240 708.5,228.5Q720,217 720,200Q720,183 708.5,171.5Q697,160 680,160Q663,160 651.5,171.5Q640,183 640,200Q640,217 651.5,228.5Q663,240 680,240ZM680,760Q680,760 680,760Q680,760 680,760Q680,760 680,760Q680,760 680,760Q680,760 680,760Q680,760 680,760Q680,760 680,760Q680,760 680,760ZM200,480Q200,480 200,480Q200,480 200,480Q200,480 200,480Q200,480 200,480Q200,480 200,480Q200,480 200,480Q200,480 200,480Q200,480 200,480ZM680,200Q680,200 680,200Q680,200 680,200Q680,200 680,200Q680,200 680,200Q680,200 680,200Q680,200 680,200Q680,200 680,200Q680,200 680,200Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_slideshow_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M634,497Q643,491 643,480Q643,469 634,463L411,320Q401,313 390.5,319Q380,325 380,337L380,623Q380,635 390.5,641Q401,647 411,640L634,497ZM200,840Q167,840 143.5,816.5Q120,793 120,760L120,200Q120,167 143.5,143.5Q167,120 200,120L760,120Q793,120 816.5,143.5Q840,167 840,200L840,760Q840,793 816.5,816.5Q793,840 760,840L200,840ZM200,760L760,760Q760,760 760,760Q760,760 760,760L760,200Q760,200 760,200Q760,200 760,200L200,200Q200,200 200,200Q200,200 200,200L200,760Q200,760 200,760Q200,760 200,760ZM200,200L200,200Q200,200 200,200Q200,200 200,200L200,760Q200,760 200,760Q200,760 200,760L200,760Q200,760 200,760Q200,760 200,760L200,200Q200,200 200,200Q200,200 200,200Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_sort_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:autoMirrored=\"true\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M160,720Q143,720 131.5,708.5Q120,697 120,680Q120,663 131.5,651.5Q143,640 160,640L320,640Q337,640 348.5,651.5Q360,663 360,680Q360,697 348.5,708.5Q337,720 320,720L160,720ZM160,520Q143,520 131.5,508.5Q120,497 120,480Q120,463 131.5,451.5Q143,440 160,440L560,440Q577,440 588.5,451.5Q600,463 600,480Q600,497 588.5,508.5Q577,520 560,520L160,520ZM160,320Q143,320 131.5,308.5Q120,297 120,280Q120,263 131.5,251.5Q143,240 160,240L800,240Q817,240 828.5,251.5Q840,263 840,280Q840,297 828.5,308.5Q817,320 800,320L160,320Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_spellcheck_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M564,768L762,570Q773,559 790,559Q807,559 818,570Q829,581 829,598Q829,615 818,626L621,823Q609,835 594,841Q579,847 564,847Q549,847 534,841Q519,835 507,823L422,738Q411,727 411,710Q411,693 422,682Q433,671 450,671Q467,671 478,682L564,768ZM254,508L217,613Q212,625 202,632.5Q192,640 179,640Q157,640 145,622Q133,604 141,584L303,149Q308,136 319.5,128Q331,120 345,120L377,120Q391,120 402.5,128Q414,136 419,149L581,583Q589,604 576.5,622Q564,640 541,640Q527,640 516,632Q505,624 500,611L464,508L254,508ZM282,432L438,432L362,216L358,216L282,432Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_star_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"?android:attr/textColorTertiary\"\n        android:pathData=\"M354,673L480,597L606,674L573,530L684,434L538,421L480,285L422,420L276,433L387,530L354,673ZM480,691L314,791Q303,798 291,797Q279,796 270,789Q261,782 256,771.5Q251,761 254,748L298,559L151,432Q141,423 138.5,411.5Q136,400 140,389Q144,378 152,371Q160,364 174,362L368,345L443,167Q448,155 458.5,149Q469,143 480,143Q491,143 501.5,149Q512,155 517,167L592,345L786,362Q800,364 808,371Q816,378 820,389Q824,400 821.5,411.5Q819,423 809,432L662,559L706,748Q709,761 704,771.5Q699,782 690,789Q681,796 669,797Q657,798 646,791L480,691ZM480,490L480,490L480,490L480,490L480,490L480,490L480,490L480,490L480,490L480,490Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_star_24dp_filled.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"@color/favoriteButtonActiveColor\"\n        android:pathData=\"M480,691L314,791Q303,798 291,797Q279,796 270,789Q261,782 256,771.5Q251,761 254,748L298,559L151,432Q141,423 138.5,411.5Q136,400 140,389Q144,378 152,371Q160,364 174,362L368,345L443,167Q448,155 458.5,149Q469,143 480,143Q491,143 501.5,149Q512,155 517,167L592,345L786,362Q800,364 808,371Q816,378 820,389Q824,400 821.5,411.5Q819,423 809,432L662,559L706,748Q709,761 704,771.5Q699,782 690,789Q681,796 669,797Q657,798 646,791L480,691Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_tabs_24dp.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:height=\"24dp\"\n    android:width=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path android:fillColor=\"#000\" android:pathData=\"M22,14A2,2 0 0,1 20,16H4A2,2 0 0,1 2,14V10A2,2 0 0,1 4,8H20A2,2 0 0,1 22,10V14M4,14H8V10H4V14M10,14H14V10H10V14M16,14H20V10H16V14Z\" />\n</vector>"
  },
  {
    "path": "app/src/main/res/drawable/ic_tag_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#000\"\n        android:pathData=\"M360,640L327,771Q324,784 314,792Q304,800 290,800Q271,800 259,785Q247,770 252,752L280,640L171,640Q151,640 139,624.5Q127,609 132,590Q135,576 146,568Q157,560 171,560L300,560L340,400L231,400Q211,400 199,384.5Q187,369 192,350Q195,336 206,328Q217,320 231,320L360,320L393,189Q396,176 406,168Q416,160 430,160Q449,160 461,175Q473,190 468,208L440,320L600,320L633,189Q636,176 646,168Q656,160 670,160Q689,160 701,175Q713,190 708,208L680,320L789,320Q809,320 821,335.5Q833,351 828,370Q825,384 814,392Q803,400 789,400L660,400L620,560L729,560Q749,560 761,575.5Q773,591 768,610Q765,624 754,632Q743,640 729,640L600,640L567,771Q564,784 554,792Q544,800 530,800Q511,800 499,785Q487,770 492,752L520,640L360,640ZM380,560L540,560L580,400L420,400L380,560Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_translate_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M603,758L569,855Q565,866 555,873Q545,880 533,880Q513,880 500.5,863.5Q488,847 496,827L648,425Q653,414 663,407Q673,400 685,400L715,400Q727,400 737,407Q747,414 752,425L904,828Q912,847 900,863.5Q888,880 868,880Q855,880 845.5,873Q836,866 831,854L797,758L603,758ZM362,559L188,732Q177,743 160.5,743.5Q144,744 132,732Q121,721 121,704Q121,687 132,676L306,502Q271,467 242.5,422Q214,377 190,320L274,320Q294,359 314,388Q334,417 362,446Q395,413 430.5,353.5Q466,294 484,240L80,240Q63,240 51.5,228.5Q40,217 40,200Q40,183 51.5,171.5Q63,160 80,160L320,160L320,120Q320,103 331.5,91.5Q343,80 360,80Q377,80 388.5,91.5Q400,103 400,120L400,160L640,160Q657,160 668.5,171.5Q680,183 680,200Q680,217 668.5,228.5Q657,240 640,240L564,240Q543,312 501,388Q459,464 418,504L514,602L484,684L362,559ZM628,688L772,688L700,484L628,688Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_trip_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"?android:attr/textColorTertiary\"\n        android:pathData=\"M160,840Q127,840 103.5,816.5Q80,793 80,760L80,320Q80,287 103.5,263.5Q127,240 160,240L320,240L320,160Q320,127 343.5,103.5Q367,80 400,80L560,80Q593,80 616.5,103.5Q640,127 640,160L640,240L800,240Q833,240 856.5,263.5Q880,287 880,320L880,760Q880,793 856.5,816.5Q833,840 800,840L160,840ZM400,240L560,240L560,160Q560,160 560,160Q560,160 560,160L400,160Q400,160 400,160Q400,160 400,160L400,240ZM240,320L160,320Q160,320 160,320Q160,320 160,320L160,760Q160,760 160,760Q160,760 160,760L240,760L240,320ZM640,760L640,320L320,320L320,760L640,760ZM720,320L720,760L800,760Q800,760 800,760Q800,760 800,760L800,320Q800,320 800,320Q800,320 800,320L720,320ZM480,540L480,540L480,540L480,540L480,540L480,540L480,540L480,540L480,540L480,540Q480,540 480,540Q480,540 480,540L480,540Q480,540 480,540Q480,540 480,540L480,540L480,540L480,540L480,540L480,540L480,540L480,540L480,540L480,540Q480,540 480,540Q480,540 480,540L480,540Q480,540 480,540Q480,540 480,540Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_verified_18dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"18dp\"\n    android:height=\"18dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"?attr/colorPrimary\"\n        android:pathData=\"M438,508L380,451Q369,440 352.5,440Q336,440 324,452Q313,463 313,480Q313,497 324,508L410,594Q422,606 438,606Q454,606 466,594L636,424Q648,412 647.5,396Q647,380 636,368Q624,356 607.5,355.5Q591,355 579,367L438,508ZM326,870L268,772L158,748Q143,745 134,732.5Q125,720 127,705L138,592L63,506Q53,495 53,480Q53,465 63,454L138,368L127,255Q125,240 134,227.5Q143,215 158,212L268,188L326,90Q334,77 348,72.5Q362,68 376,74L480,118L584,74Q598,68 612,72.5Q626,77 634,90L692,188L802,212Q817,215 826,227.5Q835,240 833,255L822,368L897,454Q907,465 907,480Q907,495 897,506L822,592L833,705Q835,720 826,732.5Q817,745 802,748L692,772L634,870Q626,883 612,887.5Q598,892 584,886L480,842L376,886Q362,892 348,887.5Q334,883 326,870ZM378,798L480,754L584,798L640,702L750,676L740,564L814,480L740,394L750,282L640,258L582,162L480,206L376,162L320,258L210,282L220,394L146,480L220,564L210,678L320,702L378,798ZM480,480L480,480L480,480L480,480L480,480L480,480L480,480L480,480L480,480L480,480L480,480L480,480L480,480L480,480L480,480L480,480L480,480L480,480L480,480L480,480Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_visibility_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M480,640Q555,640 607.5,587.5Q660,535 660,460Q660,385 607.5,332.5Q555,280 480,280Q405,280 352.5,332.5Q300,385 300,460Q300,535 352.5,587.5Q405,640 480,640ZM480,568Q435,568 403.5,536.5Q372,505 372,460Q372,415 403.5,383.5Q435,352 480,352Q525,352 556.5,383.5Q588,415 588,460Q588,505 556.5,536.5Q525,568 480,568ZM480,760Q346,760 235.5,688Q125,616 61,498Q56,489 53.5,479.5Q51,470 51,460Q51,450 53.5,440.5Q56,431 61,422Q125,304 235.5,232Q346,160 480,160Q614,160 724.5,232Q835,304 899,422Q904,431 906.5,440.5Q909,450 909,460Q909,470 906.5,479.5Q904,489 899,498Q835,616 724.5,688Q614,760 480,760ZM480,460Q480,460 480,460Q480,460 480,460Q480,460 480,460Q480,460 480,460Q480,460 480,460Q480,460 480,460Q480,460 480,460Q480,460 480,460ZM480,680Q593,680 687.5,620.5Q782,561 832,460Q782,359 687.5,299.5Q593,240 480,240Q367,240 272.5,299.5Q178,359 128,460Q178,561 272.5,620.5Q367,680 480,680Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_visibility_off_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M607,333Q636,362 649.5,399Q663,436 659,475Q659,490 648,500.5Q637,511 622,511Q607,511 596.5,500.5Q586,490 586,475Q591,449 583,425Q575,401 558,384Q541,367 517,358Q493,349 466,354Q451,354 440.5,343Q430,332 430,317Q430,302 440.5,291.5Q451,281 466,281Q504,277 541,290.5Q578,304 607,333ZM480,240Q461,240 443,241.5Q425,243 407,247Q390,250 376.5,242Q363,234 358,218Q353,202 361.5,187Q370,172 386,169Q409,164 432.5,162Q456,160 480,160Q617,160 730.5,232Q844,304 904,426Q908,434 910,442.5Q912,451 912,460Q912,469 910.5,477.5Q909,486 905,494Q887,534 860.5,569Q834,604 802,633Q790,644 774,642Q758,640 748,626Q738,612 739.5,595.5Q741,579 753,568Q777,545 797,518Q817,491 832,460Q782,359 687.5,299.5Q593,240 480,240ZM480,760Q346,760 235,687.5Q124,615 60,497Q55,489 52.5,479.5Q50,470 50,460Q50,450 52,441Q54,432 59,423Q79,383 105.5,346.5Q132,310 166,280L83,196Q72,184 72.5,167.5Q73,151 84,140Q95,129 112,129Q129,129 140,140L820,820Q831,831 831.5,847.5Q832,864 820,876Q809,887 792,887Q775,887 764,876L624,738Q589,749 553,754.5Q517,760 480,760ZM222,336Q193,362 169,393Q145,424 128,460Q178,561 272.5,620.5Q367,680 480,680Q500,680 519,677.5Q538,675 558,672L522,634Q511,637 501,638.5Q491,640 480,640Q405,640 352.5,587.5Q300,535 300,460Q300,449 301.5,439Q303,429 306,418L222,336ZM541,429L541,429Q541,429 541,429Q541,429 541,429Q541,429 541,429Q541,429 541,429Q541,429 541,429Q541,429 541,429ZM390,504Q390,504 390,504Q390,504 390,504L390,504Q390,504 390,504Q390,504 390,504Q390,504 390,504Q390,504 390,504Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_volume_off_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:autoMirrored=\"true\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M671,783Q660,790 649,796Q638,802 626,807Q611,814 595.5,807Q580,800 574,784Q568,769 575.5,754.5Q583,740 598,733Q602,731 605.5,729Q609,727 613,725L480,592L480,703Q480,730 455.5,740.5Q431,751 412,732L280,600L160,600Q143,600 131.5,588.5Q120,577 120,560L120,400Q120,383 131.5,371.5Q143,360 160,360L248,360L84,196Q73,185 73,168Q73,151 84,140Q95,129 112,129Q129,129 140,140L820,820Q831,831 831,848Q831,865 820,876Q809,887 792,887Q775,887 764,876L671,783ZM760,479Q760,396 716,327.5Q672,259 598,225Q583,218 576,203.5Q569,189 574,174Q580,158 595.5,151Q611,144 627,151Q724,194 782,282Q840,370 840,479Q840,512 834,544.5Q828,577 817,607Q809,629 792.5,634.5Q776,640 762,635Q748,630 739.5,617Q731,604 739,587Q750,561 755,534.5Q760,508 760,479ZM591,337Q624,358 642,400Q660,442 660,480Q660,485 660,490Q660,495 659,500Q657,513 645,517Q633,521 623,511L572,460Q566,454 563,446.5Q560,439 560,431L560,354Q560,342 570.5,336.5Q581,331 591,337ZM390,278Q384,272 384,264Q384,256 390,250L412,228Q431,209 455.5,219.5Q480,230 480,257L480,320Q480,334 468,339Q456,344 446,334L390,278ZM400,606L400,512L328,440L328,440L200,440L200,520L314,520L400,606ZM364,476L364,476L364,476L364,476L364,476L364,476L364,476Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_volume_up_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:autoMirrored=\"true\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M760,479Q760,396 716,327.5Q672,259 598,225Q583,218 576,203.5Q569,189 574,174Q580,158 595.5,151Q611,144 627,151Q724,194 782,282.5Q840,371 840,479Q840,587 782,675.5Q724,764 627,807Q611,814 595.5,807Q580,800 574,784Q569,769 576,754.5Q583,740 598,733Q672,699 716,630.5Q760,562 760,479ZM280,600L160,600Q143,600 131.5,588.5Q120,577 120,560L120,400Q120,383 131.5,371.5Q143,360 160,360L280,360L412,228Q431,209 455.5,219.5Q480,230 480,257L480,703Q480,730 455.5,740.5Q431,751 412,732L280,600ZM660,480Q660,522 641,559.5Q622,597 591,621Q581,627 570.5,621.5Q560,616 560,604L560,354Q560,342 570.5,336.5Q581,331 591,337Q622,362 641,400Q660,438 660,480ZM400,354L314,440L200,440L200,520L314,520L400,606L400,354ZM300,480L300,480L300,480L300,480L300,480L300,480Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_whatshot_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M82,440Q97,288 210,184Q323,80 480,80Q563,80 635.5,111.5Q708,143 762.5,197.5Q817,252 848.5,324.5Q880,397 880,480Q880,562 848.5,635Q817,708 762.5,762.5Q708,817 635.5,848.5Q563,880 480,880Q427,880 377,867Q327,854 282,828Q264,818 262,799Q260,780 276,764Q285,755 299,753Q313,751 324,758Q361,778 400,789Q439,800 480,800Q613,800 706.5,706.5Q800,613 800,480Q800,347 706.5,253.5Q613,160 480,160Q357,160 267,240.5Q177,321 162,440Q160,457 148.5,468.5Q137,480 120,480Q103,480 91.5,468Q80,456 82,440ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480ZM640,456L640,520Q640,537 651.5,548.5Q663,560 680,560Q697,560 708.5,548.5Q720,537 720,520L720,360Q720,343 708.5,331.5Q697,320 680,320L520,320Q503,320 491.5,331.5Q480,343 480,360Q480,377 491.5,388.5Q503,400 520,400L584,400L438,546L346,469Q334,459 318.5,460Q303,461 292,472L139,625Q129,635 127.5,648.5Q126,662 133,674Q143,691 162,693Q181,695 195,681L322,554L414,631Q426,641 441.5,640Q457,639 468,628L640,456Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_whatshot_24dp_filled.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M480,880Q380,880 296.5,836Q213,792 158,718L322,554L414,631Q426,641 441.5,640Q457,639 468,628L640,456L640,520Q640,537 651.5,548.5Q663,560 680,560Q697,560 708.5,548.5Q720,537 720,520L720,360Q720,343 708.5,331.5Q697,320 680,320L520,320Q503,320 491.5,331.5Q480,343 480,360Q480,377 491.5,388.5Q503,400 520,400L584,400L438,546L346,469Q334,459 318.5,460Q303,461 292,472L116,648Q99,610 89.5,567.5Q80,525 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_zoom_in_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M340,420L300,420Q283,420 271.5,408.5Q260,397 260,380Q260,363 271.5,351.5Q283,340 300,340L340,340L340,300Q340,283 351.5,271.5Q363,260 380,260Q397,260 408.5,271.5Q420,283 420,300L420,340L460,340Q477,340 488.5,351.5Q500,363 500,380Q500,397 488.5,408.5Q477,420 460,420L420,420L420,460Q420,477 408.5,488.5Q397,500 380,500Q363,500 351.5,488.5Q340,477 340,460L340,420ZM380,640Q271,640 195.5,564.5Q120,489 120,380Q120,271 195.5,195.5Q271,120 380,120Q489,120 564.5,195.5Q640,271 640,380Q640,424 626,463Q612,502 588,532L812,756Q823,767 823,784Q823,801 812,812Q801,823 784,823Q767,823 756,812L532,588Q502,612 463,626Q424,640 380,640ZM380,560Q455,560 507.5,507.5Q560,455 560,380Q560,305 507.5,252.5Q455,200 380,200Q305,200 252.5,252.5Q200,305 200,380Q200,455 252.5,507.5Q305,560 380,560Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_zoom_out_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M320,420Q303,420 291.5,408.5Q280,397 280,380Q280,363 291.5,351.5Q303,340 320,340L440,340Q457,340 468.5,351.5Q480,363 480,380Q480,397 468.5,408.5Q457,420 440,420L320,420ZM380,640Q271,640 195.5,564.5Q120,489 120,380Q120,271 195.5,195.5Q271,120 380,120Q489,120 564.5,195.5Q640,271 640,380Q640,424 626,463Q612,502 588,532L812,756Q823,767 823,784Q823,801 812,812Q801,823 784,823Q767,823 756,812L532,588Q502,612 463,626Q424,640 380,640ZM380,560Q455,560 507.5,507.5Q560,455 560,380Q560,305 507.5,252.5Q455,200 380,200Q305,200 252.5,252.5Q200,305 200,380Q200,455 252.5,507.5Q305,560 380,560Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n  <group android:scaleX=\"0.1\"\n      android:scaleY=\"0.1\">\n    <group>\n\n      <path\n          android:pathData=\"m693.6,382.9c-2.3,-3.6 -1.4,-8.4 2,-11 9.2,-7.1 26.4,-20.1 35.9,-27.3 1.8,-1.4 4.1,-2 6.4,-1.6 2.3,0.4 4.3,1.6 5.5,3.5 6.3,9.5 11.3,20 14.7,31.2 0.6,2.2 0.3,4.6 -0.9,6.6 -1.2,2 -3.2,3.4 -5.4,3.8 -11.8,2.5 -33.1,6.9 -44.3,9.2 -4.1,0.8 -8.1,-1.4 -9.5,-5.3 -1.1,-3.3 -2.7,-6.3 -4.4,-9.2zM660.4,357.8c-4,-1.1 -6.7,-5 -6.1,-9.1 1.7,-12.9 5.3,-38.9 7.1,-52.4 0.3,-2.3 1.6,-4.3 3.4,-5.7 1.9,-1.3 4.2,-1.8 6.5,-1.4 12.5,2.7 24.5,7.2 35.5,13.4 2,1.1 3.4,3.1 3.9,5.3 0.5,2.2 0.1,4.6 -1.1,6.5 -7.4,11.4 -21.8,33.3 -29,44.2 -2.3,3.5 -6.9,4.8 -10.7,2.9 -3,-1.5 -6.2,-2.8 -9.5,-3.7zM618.6,362.7c-3.6,2 -8.1,1.1 -10.6,-2.2 -7,-9.1 -20.1,-26.4 -27.4,-36 -1.4,-1.8 -2,-4.2 -1.6,-6.5 0.4,-2.3 1.7,-4.3 3.7,-5.6 9.7,-6.1 20.5,-10.9 32,-14 2.2,-0.6 4.5,-0.2 6.5,1 1.9,1.2 3.3,3.1 3.7,5.4 2.5,11.7 6.8,32.8 9.2,44.2 0.9,4.2 -1.6,8.4 -5.7,9.7 -3.4,1 -6.7,2.4 -9.8,4.1z\"\n          android:fillColor=\"@color/icon_highlight\"/>\n      <path\n          android:pathData=\"m430.4,436.1c37.8,-14.9 80.9,-16.1 120.7,0.4 50.3,20.9 59.9,72.2 66.3,83.4 6.9,12 15.4,19.6 26.8,14.9 13.3,-5.5 9.6,-22.8 1.1,-37.7 -11.6,-20.4 -37.9,-41.8 -31.7,-71.4 3,-14.2 6.9,-24.3 9.8,-30.5 0.9,-1.6 2.7,-2.7 4.5,-2.7 1.9,-0 3.6,1 4.6,2.6 2.9,4.8 6.3,10.7 8.5,14.4 1.3,2.1 3.8,3.2 6.2,2.5 4.2,-1.1 10.9,-2.9 16.8,-4.5 2,-0.5 4.1,0.2 5.5,1.8 1.3,1.6 1.6,3.8 0.7,5.7 -2.8,5.7 -5.6,12.7 -5.6,17.8 0.1,31.9 24.6,26.8 49.8,56.4 25.2,29.6 55.9,85.4 10.6,140.1 -33.4,40.4 -76.3,50.7 -88.4,69.8 -12.1,19.2 -25.2,54.3 -7.1,94.3 18.1,40 43.9,102.5 46,155.1 0.8,20 -2.3,34.2 -4.9,42.5 -1,3 -3.1,5.8 -5.8,7.5 0.1,-0.6 -33.9,-6.6 -36.5,2h-6.6c0.1,-0.6 -33.3,-8.7 -35.9,0h-7.2c0,-0.3 -33.1,-8.6 -35.7,0h-6C534,987 525,964 518.3,953.5c-7.4,4.3 -15.7,7.7 -25,9.8 -7.4,1.6 -14.8,2.4 -22.1,2.5 -8.6,0.1 -28.1,29.2 -29.5,34.8l-3.9,-0c0.4,-1.1 -33.4,-8.7 -36,-0.1l-6.7,-0c0.1,-0.5 -33.2,-8.8 -35.8,-0.1l-7.2,-0c0,-0.1 -32.9,-8.7 -35.5,-0.1l-29.7,-0.1c-3.3,-0 -6.5,-1.1 -9.1,-3.2 -7.6,-6.2 -23.8,-21.5 -34.3,-47.4 -16.2,-0 -34.9,-2.6 -49.3,-11.9 -40.9,-26.5 -48.7,-63.1 -48.7,-63.1l4.3,-13.3 18.7,6.1c0,0 8.2,25.2 27.8,36.2 14.9,8.4 28.2,2.6 36.1,-2.9 -2.4,-30.2 3,-63.2 19.2,-100.2 14.8,-33.9 36.2,-57.4 57,-75.1 12.6,-0.3 20.8,-12.3 19.8,-15.5 -3,-23.4 -7.6,-65.3 -6.2,-90.3 2.3,-41.3 8,-88.7 36,-127.8 -5.3,-10 -10.6,-21.3 -12,-28.3 -2.6,-12.7 2.5,-20.9 10,-22.2 4.6,-0.7 8.8,2 12.7,7.6 0,-7.5 0.6,-16 2.4,-22.5 4.1,-15.1 12,-23 17.9,-22.8 6.4,0.2 11.4,9 12.6,20.6 3.2,-5.4 7.9,-11.2 13.9,-12.4 11.7,-2.4 16,7.7 16,15.6 -0,2.5 -0.4,5.5 -1.1,8.7z\"\n          android:fillColor=\"#9baec8\"/>\n      <path\n          android:pathData=\"m518.7,950c1.3,-12.4 2.2,-25.2 2.2,-36.4 0,-34.4 -20.1,-59.1 -20.1,-59.1 -4.4,-5.3 -3.6,-13.2 1.8,-17.6 5.3,-4.4 13.2,-3.6 17.6,1.8 0,0 25.7,31.3 25.7,75 0,29 -5.8,67.9 -8.9,87L527,1000.6c-6.8,0 -14.2,-6.2 -13.2,-12.9l0,-0c1.6,-10.4 3.5,-23.8 4.9,-37.7zM441.7,1000.5c3.2,-12.5 14.3,-65.5 -14.1,-115.6 -5.6,-9.9 -11.8,-16.2 -18.4,-19.8 -9.9,-5.3 -20.4,-4 -29.4,-0.9 -15.6,5.3 -27.3,16 -27.3,16v0c-5.1,4.7 -13,4.3 -17.7,-0.8 -4.7,-5.1 -4.3,-13 0.8,-17.7 0,0 15.5,-14.3 36.1,-21.3 15.1,-5.1 32.7,-6.3 49.3,2.6 10,5.4 19.8,14.5 28.3,29.5 18.3,32.1 22.5,65.3 22.1,91.1l-1.2,18.9 -0,0c-0.6,5.1 -1.9,8.9 -5.1,12.1 -3.2,3.2 -7.6,5.8 -12.2,5.8 -3.2,-0 -6.9,-0 -11.1,-0zM328.2,709.7c1,3.3 5.1,4 8.6,4.3 2.5,0.2 5.1,-0.2 7.3,-1.2 0.9,-0.4 1.7,-0.9 2,-1.8 0.1,-0.2 0.2,-0.5 0.2,-0.7 -0.5,-2.8 -0.7,-4.6 -0.7,-4.6 -0.6,-6.9 4.5,-12.9 11.4,-13.5 6.9,-0.6 12.9,4.5 13.5,11.4 0,0 1.1,18.6 11.1,28 6.2,5.7 12.4,3.4 16.5,0.9 0.3,-0.2 0.7,-0.4 1,-0.6 -0.7,-2.1 -1.3,-4.2 -1.8,-6.5 -1.6,-6.7 2.6,-13.4 9.4,-15 6.7,-1.6 13.4,2.6 15,9.4 2,8.5 5.4,14.1 10.1,16.6 5.5,2.9 12,0.9 15.8,-3.5 6.2,-7.2 5.7,-19.4 4.3,-31.3 -2.5,-21.8 -10.8,-43.1 -10.8,-43.1 -2.5,-6.4 0.7,-13.7 7.1,-16.2 6.4,-2.5 13.7,0.7 16.2,7.1 0,0 12.8,33.4 13.1,62.2 0.1,14.8 -3.2,28.3 -11,37.5 -11.2,13.1 -30.5,17.9 -46.6,9.3 -2.7,-1.4 -5.3,-3.2 -7.8,-5.5 -11.1,7.2 -29.5,13.9 -47.6,-2.9 -4.4,-4.1 -7.8,-9.2 -10.4,-14.5 -5.8,2.7 -12.4,3.9 -19.2,3.4 -10.7,-0.7 -20.8,-5.5 -26.7,-13.7 6.7,-5.7 13.4,-10.9 19.8,-15.5z\"\n          android:fillColor=\"#5c6d82\"/>\n      <path\n          android:pathData=\"m134.8,850.2c-2.5,-3.2 -4.1,-7.3 -3.2,-12.3 1.9,-10.5 15.1,-13.9 20.9,-7.6 2.7,3 4.2,6.7 5,10.3 2.5,-4.2 6.6,-8.3 13.1,-8.5 11.1,-0.4 15.4,13 10.1,22.5 -4.5,8 -12.3,12.7 -12.3,12.7l-23,7.2c-14,2.7 -30.9,-1.7 -27.2,-17.6 1.8,-7.8 9.2,-8.5 16.6,-6.7z\"\n          android:fillColor=\"#5c6e83\"/>\n      <path\n          android:pathData=\"m581.9,650.5c3.6,-2 8,-2.4 11.9,-1 9.3,3.3 31,8.9 53.5,-0.3 29.7,-12.2 51.3,-50.9 51.3,-50.9 0,0 10.2,24.4 4.1,46.4 -6.1,22 -32.6,62.1 -71.3,67 -38.7,4.9 -58.5,-7.8 -63.3,-27.8 -4,-16.2 4,-27.9 14,-33.5z\"\n          android:fillColor=\"#ffffff\"/>\n      <path\n          android:fillColor=\"#FF000000\"\n          android:pathData=\"m548.5,568c-3.6,-1.9 -7.4,-6.4 -9.9,-11.5 -3.1,-6.4 -4,-14.5 4.1,-19.8 5.6,-3.7 11.8,-1.7 17.1,1.6 6.9,4.2 12.7,11 14.8,17.1 2.3,6.5 9.4,10 15.9,7.7 6.5,-2.3 10,-9.4 7.7,-15.9 -4.5,-12.8 -17.7,-27.8 -33,-34.1 -11.8,-4.8 -24.7,-4.9 -36.3,2.7 -21.2,14 -21,34.8 -12.8,51.7 5.1,10.3 13.4,18.8 20.7,22.6 6.1,3.2 13.7,0.9 16.9,-5.2 3.2,-6.1 0.9,-13.7 -5.2,-16.9z\"/>\n    </group>\n  </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/launcher_monochrome.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:height=\"108dp\"\n    android:viewportHeight=\"1500\"\n    android:viewportWidth=\"1500\"\n    android:width=\"108dp\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"m857.9,551.2c-16.8,0.1 -32.2,9.3 -40.5,23.9 -0.5,0.8 -0.9,1.7 -1.3,2.5 -4.7,10.1 -11.1,26.1 -15.8,48.7 -8.3,-5.4 -17.4,-10.3 -27.5,-14.5 -47.2,-19.6 -97.3,-23.3 -144.5,-13.8 -2.6,-3.6 -5.6,-6.9 -9,-9.7 -10.5,-8.8 -24.7,-14.8 -43.6,-12 -8.9,-7 -18.9,-10.5 -29.3,-10.8 -9.8,-0.4 -20.9,2.2 -31.8,9.7 -10.3,7.1 -22.3,21 -29.7,42.9 -23.7,8.5 -43.8,33.1 -35.5,73.8 1.4,6.9 4.9,16.4 9.3,26.4 -30.4,53.3 -38.4,113.9 -41.4,167.8 -1.8,32.9 4,87.1 7.7,120.3 4.1,35.7 27,62.6 62.6,66.4 6,0.6 11.6,0.5 16.8,-0.4 9.8,9.7 22.6,16.1 38.5,17.8 14.7,1.6 26.5,-1 36.3,-5.5 8.2,4.4 17.7,6.9 28.7,7.1 2.5,0 4.9,-0 7.2,-0.2 1.6,0.2 3.3,0.2 5,0 8.6,-1 23.3,-3.3 33.7,-12 22,8.9 52.6,18.8 92.9,26.6 31.3,6 57.6,6.9 78.2,5.8 32.8,-1.8 59.7,-26.6 64.2,-59.1 0,-0.1 0,-0.2 0,-0.2 2.1,-15.9 8.3,-29.3 14.1,-38.6 1.5,-2.3 4.4,-3.7 7.4,-5.8 7.6,-5.3 16.9,-10.6 26.9,-16.7 24.7,-15.1 53.2,-34.4 78.3,-64.8 76,-91.7 28.1,-185.4 -14.2,-235 -12.7,-15 -25.3,-24.7 -36.8,-32.4 -4.4,-2.9 -8.5,-5.5 -12.4,-8 -2,-1.3 -4.9,-3.5 -6.4,-4.6l-0,-0.4 -0.1,-0.8c0.6,-1.7 2.1,-5.5 3.1,-7.5 0,-0 0,-0.1 0,-0.1 8.1,-16.5 5.8,-36.2 -5.9,-50.4 -11.2,-13.7 -29.1,-19.8 -46.3,-16 -8.7,-12.9 -23.4,-20.7 -39.2,-20.6zM858.2,591.2c2.5,-0 4.8,1.3 6,3.4 3.7,6.3 8.3,14 11.1,18.9 1.6,2.8 5,4.2 8.1,3.3 5.5,-1.5 14.2,-3.8 21.9,-5.9 2.6,-0.7 5.4,0.2 7.2,2.3 1.7,2.1 2.1,5 0.9,7.5 -3.7,7.5 -7.3,16.6 -7.3,23.4 0.1,41.7 32.3,35.1 65.3,73.9 33,38.8 73.2,111.9 13.8,183.6 -10.8,13.1 -22.4,23.7 -33.9,32.7 2,-4.5 3.5,-8.7 4.6,-12.6 8,-28.8 -5.3,-60.8 -5.3,-60.8 0,0 -28.3,50.7 -67.2,66.7 -30.6,12.6 -60.3,4 -71.5,-0.2 -3.6,-1.4 -7.5,-1.3 -11,0.3 -14.3,6.5 -26.9,22.6 -21.3,45.4 6.3,25.8 31.6,42.4 81,36.6 -4.9,10.8 -9.1,23.7 -11,38 -1.9,13.6 -13.1,23.9 -26.8,24.7 -18,1 -41,0.1 -68.5,-5.1 -36.1,-6.9 -63.4,-15.6 -83,-23.4 0.7,-4.1 1.1,-8.4 1.3,-12.8 0.9,-20.9 -3.5,-44.7 -7.9,-62.5 -2.7,-10.7 -13.5,-17.2 -24.3,-14.5 -10.7,2.7 -17.2,13.5 -14.5,24.3 3.6,14.6 7.5,34 6.8,51.1 -0.1,1.4 -0.1,2.8 -0.2,4.2 -1.5,8.1 -6.7,18.8 -23.8,18.5 -25.4,-0.4 -28.4,-37.6 -28.7,-43.5 0.2,6.1 0.2,45.7 -32.6,42.2 -28.6,-3.1 -29,-46.9 -28.5,-59.7 -0.8,11 -5,44.6 -26.8,42.2 -16.2,-1.7 -25.3,-15.1 -27.2,-31.2 -3.6,-31.3 -9.3,-82.5 -7.6,-113.6 3,-54.1 10.5,-116.2 47.2,-167.4 -6.9,-13.1 -13.9,-27.8 -15.8,-37.1 -3.4,-16.6 3.2,-27.4 13.1,-29 6,-1 11.6,2.6 16.7,10 0.1,-9.8 0.8,-20.9 3.1,-29.5 5.3,-19.8 15.7,-30.2 23.5,-29.9 8.4,0.3 14.9,11.8 16.5,27 4.2,-7.1 10.4,-14.7 18.2,-16.3 15.3,-3.1 21,10 21,20.5 -0,3.3 -0.6,7.3 -1.5,11.5 49.6,-19.6 106,-21.2 158.2,0.5 65.9,27.4 78.4,94.6 86.8,109.2 9,15.8 20.2,25.7 35.1,19.5 17.5,-7.2 12.6,-29.8 1.5,-49.3 -15.2,-26.7 -49.6,-54.7 -41.5,-93.5 3.9,-18.6 9,-31.8 12.9,-40 1.2,-2.1 3.5,-3.5 5.9,-3.5zM754.5,820.1c-4.6,-2.4 -9.4,-8.1 -12.5,-14.6 -3.9,-7.9 -5,-17.9 4.9,-24.5 6.9,-4.5 14.6,-1.9 21.2,2.1 8.8,5.4 16.2,14 18.9,21.8 3.2,9.1 13.2,13.9 22.3,10.8 9.1,-3.2 13.9,-13.2 10.8,-22.3 -5.9,-17 -23.5,-36.9 -43.9,-45.3 -15.8,-6.5 -33,-6.6 -48.6,3.7 -28.3,18.7 -28.1,46.6 -17.1,69.1 6.7,13.8 17.9,25 27.6,30.1 8.5,4.5 19.1,1.3 23.7,-7.3 4.5,-8.5 1.3,-19.1 -7.3,-23.7zM969.9,551.6c-4,-6.6 -2.3,-15.2 3.8,-19.9 16.2,-12.3 45.2,-34.3 61.8,-46.8 3.3,-2.5 7.6,-3.6 11.7,-2.9 4.1,0.7 7.8,3.1 10.1,6.6 10.7,16.1 19.2,33.9 25,53.1 1.2,4.1 0.7,8.5 -1.5,12.2 -2.2,3.7 -5.8,6.3 -10,7.1 -20.6,4.3 -56.7,11.7 -76.2,15.8 -7.3,1.5 -14.6,-2.5 -17.3,-9.5 -2.1,-5.5 -4.6,-10.7 -7.6,-15.6zM838.8,515.8c-6.6,3.6 -14.8,1.8 -19.3,-4.2 -12.1,-15.9 -34.3,-45.2 -47,-62 -2.6,-3.4 -3.6,-7.7 -2.8,-11.9 0.8,-4.2 3.3,-7.9 6.9,-10.1 16.6,-10.4 34.8,-18.5 54.4,-23.9 4,-1.1 8.4,-0.5 11.9,1.7 3.6,2.2 6.1,5.8 6.9,9.9 4.2,20.3 11.6,56.1 15.7,76 1.6,7.6 -2.8,15.1 -10.2,17.5 -5.8,1.9 -11.3,4.2 -16.5,7.1zM912,507.4c-7.3,-2 -12,-9.2 -10.9,-16.7 3.1,-22.6 9.2,-66.8 12.4,-90.3 0.6,-4.2 2.9,-7.9 6.3,-10.4 3.5,-2.4 7.8,-3.3 11.9,-2.4 21.4,4.6 41.7,12.3 60.5,22.8 3.7,2.1 6.3,5.5 7.4,9.6 1,4.1 0.3,8.4 -2.1,11.9 -13,19.8 -37.5,57.1 -50,76.2 -4.2,6.4 -12.4,8.6 -19.3,5.3 -5.2,-2.5 -10.6,-4.5 -16.1,-6.1z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/materialdrawer_shape_large.xml",
    "content": "<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\" >\n    <solid android:color=\"#000\"/>\n    <corners android:radius=\"7dp\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/materialdrawer_shape_small.xml",
    "content": "<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\" >\n    <solid android:color=\"#000\"/>\n    <corners android:radius=\"5dp\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/media_preview_outline.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <corners android:radius=\"8dp\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/media_warning_bg.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <corners android:radius=\"7dp\" />\n    <solid  android:color=\"@color/color_background_transparent_60\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/play_indicator.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"48dp\"\n    android:height=\"48dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n    <path\n        android:fillAlpha=\".8\"\n        android:fillColor=\"?attr/colorSurface\"\n        android:pathData=\"M480,480m-390,0a390,390 0,1 1,780 0a390,390 0,1 1,-780 0\"\n        android:strokeWidth=\"113.074\" />\n    <path\n        android:fillColor=\"?attr/colorPrimary\"\n        android:pathData=\"m426,630 l195,-125q14,-9 14,-25t-14,-25L426,330q-15,-10 -30.5,-1.5T380,355v250q0,18 15.5,26.5T426,630ZM480,880q-83,0 -156,-31.5T197,763q-54,-54 -85.5,-127T80,480q0,-83 31.5,-156T197,197q54,-54 127,-85.5T480,80q83,0 156,31.5T763,197q54,54 85.5,127T880,480q0,83 -31.5,156T763,763q-54,54 -127,85.5T480,880ZM480,800q134,0 227,-93t93,-227q0,-134 -93,-227t-227,-93q-134,0 -227,93t-93,227q0,134 93,227t227,93ZM480,480Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/poll_option_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<clip\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:drawable=\"@drawable/poll_option_shape\"\n    android:clipOrientation=\"horizontal\"\n    android:gravity=\"start|clip_horizontal|fill_vertical\"/>"
  },
  {
    "path": "app/src/main/res/drawable/poll_option_shape.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <corners android:radius=\"6dp\"/>\n    <solid android:color=\"?attr/colorBackgroundAccent\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/report_success_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" android:shape=\"oval\">\n    <solid android:color=\"?attr/colorPrimary\" />\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable/round_button.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <corners android:radius=\"10dp\" />\n    <solid android:color=\"#66000000\" />\n    <size\n        android:width=\"80dp\"\n        android:height=\"80dp\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/splashscreen.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_height=\"240dp\"\n    android:layout_width=\"240dp\">\n\n    <item android:drawable=\"@color/icon_background\" />\n\n    <item\n        android:drawable=\"@drawable/launcher_foreground\" />\n\n</layer-list>\n"
  },
  {
    "path": "app/src/main/res/drawable/status_divider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <size android:height=\"1dp\" />\n    <solid android:color=\"?attr/dividerColor\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/tab_icon_bookmarks.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_selected=\"true\"\n        android:drawable=\"@drawable/ic_bookmark_24dp_filled\" />\n    <item android:drawable=\"@drawable/ic_bookmark_24dp\" />\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/tab_icon_direct.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_selected=\"true\"\n        android:drawable=\"@drawable/ic_mail_24dp_filled\" />\n    <item android:drawable=\"@drawable/ic_mail_24dp\" />\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/tab_icon_home.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_selected=\"true\"\n        android:drawable=\"@drawable/ic_home_24dp_filled\" />\n    <item android:drawable=\"@drawable/ic_home_24dp\" />\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/tab_icon_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_selected=\"true\"\n        android:drawable=\"@drawable/ic_list_alt_24dp_filled\" />\n    <item android:drawable=\"@drawable/ic_list_alt_24dp\" />\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/tab_icon_local.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_selected=\"true\"\n        android:drawable=\"@drawable/ic_group_24dp_filled\" />\n    <item android:drawable=\"@drawable/ic_group_24dp\" />\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/tab_icon_notifications.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_selected=\"true\"\n        android:drawable=\"@drawable/ic_notifications_24dp_filled\" />\n    <item android:drawable=\"@drawable/ic_notifications_24dp\" />\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/tab_icon_trending_posts.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_selected=\"true\"\n        android:drawable=\"@drawable/ic_local_fire_department_24dp_filled\" />\n    <item android:drawable=\"@drawable/ic_local_fire_department_24dp\" />\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/tab_icon_trending_tags.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_selected=\"true\"\n        android:drawable=\"@drawable/ic_whatshot_24dp_filled\" />\n    <item android:drawable=\"@drawable/ic_whatshot_24dp\" />\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/tab_indicator_bottom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n  <item\n      android:left=\"16dp\"\n      android:right=\"16dp\">\n    <shape\n        android:shape=\"rectangle\">\n      <!-- Color is assigned programmatically with the value of \"tabIndicatorColor\". -->\n      <solid android:color=\"@android:color/white\"/>\n      <corners\n          android:bottomLeftRadius=\"3dp\"\n          android:bottomRightRadius=\"3dp\"\n          android:topLeftRadius=\"0dp\"\n          android:topRightRadius=\"0dp\"/>\n      <size android:height=\"3dp\"/>\n    </shape>\n  </item>\n</layer-list>\n"
  },
  {
    "path": "app/src/main/res/drawable/tab_indicator_top.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n  <item\n      android:left=\"16dp\"\n      android:right=\"16dp\">\n    <shape\n        android:shape=\"rectangle\">\n      <!-- Color is assigned programmatically with the value of \"tabIndicatorColor\". -->\n      <solid android:color=\"@android:color/white\"/>\n      <corners\n          android:bottomLeftRadius=\"0dp\"\n          android:bottomRightRadius=\"0dp\"\n          android:topLeftRadius=\"3dp\"\n          android:topRightRadius=\"3dp\"/>\n      <size android:height=\"3dp\"/>\n    </shape>\n  </item>\n</layer-list>\n"
  },
  {
    "path": "app/src/main/res/drawable/text_placeholder.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"?attr/placeholderColor\" />\n    <corners android:radius=\"6dp\"/>\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable/toolbar_icon_arrow_back_with_background.xml",
    "content": "<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"32dp\"\n    android:layout_height=\"32dp\">\n\n    <item>\n        <shape android:shape=\"oval\">\n            <size\n                android:width=\"32dp\"\n                android:height=\"32dp\" />\n            <solid android:color=\"?attr/toolbarIconBackgroundColor\" />\n        </shape>\n    </item>\n\n    <item\n        android:bottom=\"4dp\"\n        android:drawable=\"@drawable/ic_arrow_back_24dp\"\n        android:left=\"4dp\"\n        android:right=\"4dp\"\n        android:top=\"4dp\" />\n\n</layer-list>\n"
  },
  {
    "path": "app/src/main/res/drawable/toolbar_icon_more_with_background.xml",
    "content": "<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"32dp\"\n    android:layout_height=\"32dp\">\n\n    <item>\n        <shape android:shape=\"oval\">\n            <size\n                android:width=\"32dp\"\n                android:height=\"32dp\" />\n            <solid android:color=\"?attr/toolbarIconBackgroundColor\" />\n        </shape>\n    </item>\n\n    <item\n        android:bottom=\"4dp\"\n        android:drawable=\"@drawable/ic_more_vert_24dp\"\n        android:left=\"4dp\"\n        android:right=\"4dp\"\n        android:top=\"4dp\" />\n\n</layer-list>\n"
  },
  {
    "path": "app/src/main/res/drawable/tusky_notification_icon.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:height=\"24dp\"\n    android:viewportHeight=\"460\"\n    android:viewportWidth=\"460\"\n    android:width=\"24dp\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"m152.5,423.78c-10.93,-44.4 -37.22,-99.42 -23.82,-168.51 3.59,-18.53 15.96,-41.5 23.9,-54.91 1.43,-2.45 4.03,-3.99 6.88,-4.05 2.84,-0.06 5.51,1.35 7.05,3.74 6.06,9.28 14.52,22.38 19.49,30.08 2.42,3.75 7.04,5.44 11.32,4.14 8.27,-2.52 22.16,-6.76 33.52,-10.23 3.13,-0.95 6.52,0.04 8.65,2.52 2.13,2.48 2.58,5.99 1.15,8.93 -6.78,13.99 -13.69,30.78 -16.94,45.69 -10.53,48.28 41.55,67.22 63.85,119.5 0.43,1 0.84,2.01 1.23,3.01 -20.26,11.03 -42.78,18.71 -66.93,22.2 -23.75,3.43 -47.13,2.53 -69.36,-2.1zM271.94,182.43c-3.5,-6.07 -1.98,-13.78 3.56,-18.07 14.04,-10.86 39.05,-30.19 53.66,-41.49 3.09,-2.39 7.05,-3.38 10.9,-2.73 3.86,0.65 7.26,2.89 9.4,6.16 9.48,14.57 17,30.53 22.16,47.52 1.14,3.74 0.66,7.78 -1.32,11.15 -1.98,3.37 -5.28,5.76 -9.1,6.59 -18.06,3.93 -48.98,10.63 -66.32,14.38 -6.84,1.48 -13.72,-2.31 -16.11,-8.88 -1.84,-5.11 -4.13,-10 -6.82,-14.63zM173.02,125.96c1.36,6.86 -2.55,13.67 -9.16,15.96 -5.14,1.75 -10.07,3.96 -14.75,6.56 -6.13,3.39 -13.82,1.74 -18,-3.88 -10.61,-14.23 -29.51,-39.57 -40.55,-54.38 -2.34,-3.13 -3.26,-7.1 -2.54,-10.95 0.72,-3.84 3.01,-7.21 6.33,-9.29 14.72,-9.22 30.81,-16.46 47.9,-21.32 3.76,-1.07 7.79,-0.52 11.13,1.51 3.33,2.04 5.66,5.38 6.42,9.21 3.61,18.13 9.77,49.16 13.22,66.56zM217.45,140.31c-6.74,-1.88 -11.05,-8.45 -10.1,-15.38 2.78,-20.33 8.15,-59.61 11.05,-80.79 0.53,-3.86 2.64,-7.32 5.83,-9.56 3.19,-2.24 7.16,-3.05 10.97,-2.23 19.51,4.19 37.97,11.21 54.92,20.62 3.4,1.89 5.86,5.11 6.79,8.88 0.93,3.78 0.25,7.77 -1.89,11.02 -11.71,17.87 -33.46,51 -44.72,68.16 -3.84,5.86 -11.42,7.97 -17.74,4.95 -4.82,-2.32 -9.87,-4.22 -15.11,-5.67z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/tusky_quicksettings_icon.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"480\"\n    android:viewportWidth=\"480\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#000000\"\n        android:pathData=\"M240,0A240,240 0,0 0,0 240A240,240 0,0 0,240 480A240,240 0,0 0,480 240A240,240 0,0 0,240 0zM261.77,69.69C262.51,69.69 263.25,69.78 263.99,69.96C279.07,73.56 293.35,79.6 306.45,87.7C309.08,89.32 310.99,92.09 311.71,95.34C312.42,98.59 311.9,102.02 310.25,104.82C301.19,120.19 284.38,148.7 275.67,163.46C272.7,168.5 266.84,170.32 261.95,167.72C258.23,165.72 254.32,164.08 250.27,162.84C245.06,161.22 241.72,155.57 242.46,149.61C244.6,132.11 248.76,98.32 251,80.1C251.41,76.78 253.04,73.8 255.5,71.88C257.35,70.43 259.55,69.68 261.77,69.69zM194.32,83.56C196.55,83.39 198.78,83.99 200.72,85.3C203.3,87.05 205.1,89.92 205.69,93.22C208.48,108.82 213.24,135.51 215.91,150.49C216.96,156.39 213.94,162.25 208.82,164.22C204.85,165.73 201.04,167.63 197.42,169.87C192.68,172.79 186.74,171.36 183.5,166.53C175.3,154.29 160.68,132.49 152.15,119.74C150.34,117.05 149.63,113.63 150.19,110.33C150.74,107.02 152.52,104.12 155.08,102.34C166.46,94.4 178.9,88.18 192.12,84C192.84,83.77 193.58,83.62 194.32,83.56zM342.83,145.33C343.58,145.3 344.33,145.35 345.07,145.49C348.05,146.05 350.69,147.98 352.34,150.79C359.67,163.33 365.48,177.06 369.47,191.67C370.35,194.89 369.98,198.37 368.45,201.27C366.92,204.17 364.37,206.22 361.41,206.94C347.44,210.32 323.54,216.08 310.13,219.31C304.85,220.58 299.53,217.32 297.67,211.67C296.25,207.27 294.48,203.06 292.4,199.08C289.69,193.86 290.87,187.22 295.15,183.54C306,174.19 325.34,157.56 336.64,147.84C338.44,146.29 340.6,145.43 342.83,145.33zM205.43,211.01C207.63,210.96 209.69,212.17 210.88,214.23C215.56,222.22 222.11,233.48 225.95,240.1C227.83,243.33 231.4,244.79 234.7,243.66C241.1,241.49 251.83,237.85 260.62,234.87C263.04,234.05 265.66,234.89 267.31,237.03C268.95,239.17 269.3,242.18 268.2,244.71C262.96,256.75 257.62,271.2 255.1,284.02C246.96,325.56 287.23,341.85 304.47,386.83C304.81,387.69 305.12,388.56 305.43,389.42C289.76,398.91 272.35,405.52 253.67,408.52C235.31,411.47 217.23,410.7 200.05,406.71C191.6,368.52 171.27,321.18 181.63,261.74C184.41,245.8 193.97,226.04 200.11,214.5C201.22,212.39 203.23,211.07 205.43,211.01z\"\n        android:strokeColor=\"#ed0000\" android:strokeWidth=\"0\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_about.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.keylesspalace.tusky.AboutActivity\">\n\n    <include\n        android:id=\"@+id/includedToolbar\"\n        layout=\"@layout/toolbar_basic\" />\n\n    <FrameLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n        <androidx.core.widget.NestedScrollView\n            android:id=\"@+id/scrollView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:clipToPadding=\"false\"\n            android:textDirection=\"anyRtl\">\n\n            <androidx.constraintlayout.widget.ConstraintLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:focusableInTouchMode=\"true\"\n                android:gravity=\"center\"\n                android:orientation=\"vertical\"\n                android:paddingTop=\"16dp\"\n                android:paddingBottom=\"16dp\">\n\n                <ImageView\n                    android:id=\"@+id/logo\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:src=\"@mipmap/ic_launcher\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    tools:ignore=\"ContentDescription\" />\n\n                <TextView\n                    android:id=\"@+id/versionTextView\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"12dp\"\n                    android:textAppearance=\"@style/TextAppearance.AppCompat.Large\"\n                    android:textIsSelectable=\"true\"\n                    android:textStyle=\"normal\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@+id/logo\"\n                    tools:text=\"Tusky Test\" />\n\n                <TextView\n                    android:id=\"@+id/deviceInfoTitle\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"@dimen/text_content_margin\"\n                    android:layout_marginTop=\"4dp\"\n                    android:layout_marginEnd=\"@dimen/text_content_margin\"\n                    android:lineSpacingMultiplier=\"1.1\"\n                    android:text=\"@string/about_device_info_title\"\n                    android:textAppearance=\"@style/TextAppearance.AppCompat.Medium\"\n                    android:textColor=\"?android:attr/textColorPrimary\"\n                    android:textIsSelectable=\"true\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/versionTextView\"\n                    tools:text=\"Your device\" />\n\n                <TextView\n                    android:id=\"@+id/deviceInfo\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"4dp\"\n                    android:lineSpacingMultiplier=\"1.1\"\n                    android:textColor=\"?android:attr/textColorPrimary\"\n                    android:textIsSelectable=\"true\"\n                    app:layout_constraintEnd_toEndOf=\"@+id/deviceInfoTitle\"\n                    app:layout_constraintStart_toStartOf=\"@+id/deviceInfoTitle\"\n                    app:layout_constraintTop_toBottomOf=\"@id/deviceInfoTitle\" />\n\n                <TextView\n                    android:id=\"@+id/accountInfoTitle\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"8dp\"\n                    android:lineSpacingMultiplier=\"1.1\"\n                    android:text=\"@string/about_account_info_title\"\n                    android:textAppearance=\"@style/TextAppearance.AppCompat.Medium\"\n                    android:textColor=\"?android:attr/textColorPrimary\"\n                    android:textIsSelectable=\"true\"\n                    android:visibility=\"gone\"\n                    app:layout_constraintEnd_toStartOf=\"@+id/copyDeviceInfo\"\n                    app:layout_constraintStart_toStartOf=\"@+id/deviceInfo\"\n                    app:layout_constraintTop_toBottomOf=\"@id/deviceInfo\"\n                    tools:visibility=\"visible\" />\n\n                <TextView\n                    android:id=\"@+id/accountInfo\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"4dp\"\n                    android:lineSpacingMultiplier=\"1.1\"\n                    android:textColor=\"?android:attr/textColorPrimary\"\n                    android:textIsSelectable=\"true\"\n                    android:visibility=\"gone\"\n                    app:layout_constraintEnd_toEndOf=\"@+id/accountInfoTitle\"\n                    app:layout_constraintStart_toStartOf=\"@+id/accountInfoTitle\"\n                    app:layout_constraintTop_toBottomOf=\"@id/accountInfoTitle\"\n                    tools:text=\"\\@Tusky@mastodon.social\\nVersion: xxx\"\n                    tools:visibility=\"visible\" />\n\n                <ImageButton\n                    android:id=\"@+id/copyDeviceInfo\"\n                    style=\"@style/TuskyImageButton\"\n                    android:layout_width=\"48dp\"\n                    android:layout_height=\"48dp\"\n                    android:layout_marginEnd=\"@dimen/text_content_margin\"\n                    android:contentDescription=\"@string/about_copy\"\n                    app:layout_constraintBottom_toBottomOf=\"@+id/accountInfo\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:srcCompat=\"@drawable/ic_content_copy_24dp\" />\n\n                <TextView\n                    android:id=\"@+id/aboutPoweredByTusky\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginHorizontal=\"@dimen/text_content_margin\"\n                    android:layout_marginTop=\"16dp\"\n                    android:text=\"@string/about_powered_by_tusky\"\n                    android:textAppearance=\"@style/TextAppearance.AppCompat.Subhead\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@+id/accountInfo\" />\n\n                <com.keylesspalace.tusky.view.ClickableSpanTextView\n                    android:id=\"@+id/aboutLicenseInfoTextView\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginHorizontal=\"@dimen/text_content_margin\"\n                    android:layout_marginTop=\"24dp\"\n                    android:hyphenationFrequency=\"full\"\n                    android:lineSpacingMultiplier=\"1.2\"\n                    android:textIsSelectable=\"true\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@id/aboutPoweredByTusky\"\n                    tools:text=\"@string/about_tusky_license\" />\n\n                <com.keylesspalace.tusky.view.ClickableSpanTextView\n                    android:id=\"@+id/aboutWebsiteInfoTextView\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"24dp\"\n                    android:lineSpacingMultiplier=\"1.2\"\n                    android:textIsSelectable=\"true\"\n                    app:layout_constraintEnd_toEndOf=\"@+id/aboutLicenseInfoTextView\"\n                    app:layout_constraintStart_toStartOf=\"@+id/aboutLicenseInfoTextView\"\n                    app:layout_constraintTop_toBottomOf=\"@id/aboutLicenseInfoTextView\"\n                    tools:text=\"@string/about_project_site\" />\n\n                <com.keylesspalace.tusky.view.ClickableSpanTextView\n                    android:id=\"@+id/aboutBugsFeaturesInfoTextView\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"24dp\"\n                    android:lineSpacingMultiplier=\"1.2\"\n                    android:text=\"@string/about_bug_feature_request_site\"\n                    android:textIsSelectable=\"true\"\n                    app:layout_constraintEnd_toEndOf=\"@+id/aboutWebsiteInfoTextView\"\n                    app:layout_constraintStart_toStartOf=\"@+id/aboutWebsiteInfoTextView\"\n                    app:layout_constraintTop_toBottomOf=\"@id/aboutWebsiteInfoTextView\" />\n\n                <Button\n                    android:id=\"@+id/tuskyProfileButton\"\n                    style=\"@style/TuskyButton\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"24dp\"\n                    android:layout_marginEnd=\"@dimen/text_content_margin\"\n                    android:lineSpacingMultiplier=\"1.2\"\n                    android:maxWidth=\"320dp\"\n                    android:text=\"@string/about_tusky_account\"\n                    android:textSize=\"16sp\"\n                    app:layout_constraintEnd_toStartOf=\"@+id/aboutLicensesButton\"\n                    app:layout_constraintStart_toStartOf=\"@+id/aboutBugsFeaturesInfoTextView\"\n                    app:layout_constraintTop_toBottomOf=\"@id/aboutBugsFeaturesInfoTextView\" />\n\n                <Button\n                    android:id=\"@+id/aboutLicensesButton\"\n                    style=\"@style/TuskyButton.Outlined\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginEnd=\"@dimen/text_content_margin\"\n                    android:lineSpacingMultiplier=\"1.2\"\n                    android:maxWidth=\"320dp\"\n                    android:text=\"@string/title_licenses\"\n                    android:textAlignment=\"center\"\n                    android:textSize=\"16sp\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toEndOf=\"@+id/tuskyProfileButton\"\n                    app:layout_constraintTop_toTopOf=\"@+id/tuskyProfileButton\" />\n\n            </androidx.constraintlayout.widget.ConstraintLayout>\n\n        </androidx.core.widget.NestedScrollView>\n    </FrameLayout>\n\n    <include layout=\"@layout/item_status_bottom_sheet\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_account.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.keylesspalace.tusky.view.TuskySwipeRefreshLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/swipeToRefreshLayout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n        android:id=\"@+id/accountCoordinatorLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:fillViewport=\"true\"\n        android:textDirection=\"anyRtl\">\n\n        <com.google.android.material.appbar.AppBarLayout\n            android:id=\"@+id/accountAppBarLayout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:liftOnScroll=\"false\">\n\n            <com.google.android.material.appbar.CollapsingToolbarLayout\n                android:id=\"@+id/collapsingToolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:contentScrim=\"?attr/colorSurface\"\n                app:layout_scrollFlags=\"scroll|exitUntilCollapsed\"\n                app:statusBarScrim=\"?attr/colorSurface\"\n                app:titleEnabled=\"false\">\n\n                <ImageView\n                    android:id=\"@+id/accountHeaderImageView\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"180dp\"\n                    android:layout_alignTop=\"@+id/account_header_info\"\n                    android:background=\"?attr/colorPrimaryDark\"\n                    android:contentDescription=\"@string/label_header\"\n                    android:scaleType=\"centerCrop\"\n                    app:layout_collapseMode=\"parallax\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    tools:background=\"#000\" />\n\n                <androidx.constraintlayout.widget.ConstraintLayout\n                    android:id=\"@+id/accountHeaderInfoContainer\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"180dp\"\n                    android:background=\"?attr/colorSurface\"\n                    android:paddingStart=\"16dp\"\n                    android:paddingEnd=\"16dp\">\n\n                    <androidx.constraintlayout.widget.Guideline\n                        android:id=\"@+id/guideAvatar\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:orientation=\"vertical\"\n                        app:layout_constraintGuide_begin=\"@dimen/account_activity_avatar_size\" />\n\n                    <Button\n                        android:id=\"@+id/accountFollowButton\"\n                        style=\"@style/TuskyButton\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginTop=\"6dp\"\n                        android:ellipsize=\"end\"\n                        android:maxLines=\"1\"\n                        android:textSize=\"?attr/status_text_medium\"\n                        app:layout_constrainedWidth=\"true\"\n                        app:layout_constraintEnd_toEndOf=\"parent\"\n                        app:layout_constraintHorizontal_bias=\"1\"\n                        app:layout_constraintHorizontal_chainStyle=\"packed\"\n                        app:layout_constraintStart_toEndOf=\"@id/accountMuteButton\"\n                        app:layout_constraintTop_toTopOf=\"parent\"\n                        tools:text=\"Follow Requested\" />\n\n                    <com.google.android.material.button.MaterialButton\n                        android:id=\"@+id/accountSubscribeButton\"\n                        style=\"@style/TuskyButton.Outlined\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"0dp\"\n                        android:layout_marginStart=\"16dp\"\n                        android:layout_marginEnd=\"6dp\"\n                        android:minWidth=\"36dp\"\n                        android:paddingStart=\"10dp\"\n                        android:paddingEnd=\"10dp\"\n                        app:icon=\"@drawable/ic_notifications_24dp\"\n                        app:iconPadding=\"0dp\"\n                        app:iconSize=\"24dp\"\n                        app:layout_constrainedHeight=\"true\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/accountFollowButton\"\n                        app:layout_constraintEnd_toStartOf=\"@id/accountFollowButton\"\n                        app:layout_constraintHorizontal_bias=\"1\"\n                        app:layout_constraintHorizontal_chainStyle=\"packed\"\n                        app:layout_constraintStart_toStartOf=\"@id/accountMuteButton\"\n                        app:layout_constraintTop_toTopOf=\"@+id/accountFollowButton\" />\n\n                    <com.google.android.material.button.MaterialButton\n                        android:id=\"@+id/accountMuteButton\"\n                        style=\"@style/TuskyButton.Outlined\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"0dp\"\n                        android:layout_marginStart=\"16dp\"\n                        android:layout_marginEnd=\"6dp\"\n                        android:minWidth=\"36dp\"\n                        android:paddingStart=\"12dp\"\n                        android:paddingEnd=\"12dp\"\n                        app:icon=\"@drawable/ic_volume_up_24dp\"\n                        app:iconPadding=\"0dp\"\n                        app:layout_constrainedHeight=\"true\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/accountFollowButton\"\n                        app:layout_constraintEnd_toStartOf=\"@id/accountSubscribeButton\"\n                        app:layout_constraintHorizontal_bias=\"1\"\n                        app:layout_constraintHorizontal_chainStyle=\"packed\"\n                        app:layout_constraintStart_toStartOf=\"@id/guideAvatar\"\n                        app:layout_constraintTop_toTopOf=\"@+id/accountFollowButton\" />\n\n                    <TextView\n                        android:id=\"@+id/accountDisplayNameTextView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginTop=\"62dp\"\n                        android:textColor=\"?android:textColorPrimary\"\n                        android:textSize=\"?attr/status_text_large\"\n                        android:textStyle=\"normal|bold\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toTopOf=\"parent\"\n                        tools:text=\"Tusky Mastodon Client \" />\n\n                    <TextView\n                        android:id=\"@+id/accountUsernameTextView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"center_horizontal\"\n                        android:textColor=\"?android:textColorSecondary\"\n                        android:textSize=\"?attr/status_text_medium\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toBottomOf=\"@id/accountDisplayNameTextView\"\n                        tools:text=\"\\@Tusky\" />\n\n                    <ImageView\n                        android:id=\"@+id/accountLockedImageView\"\n                        android:layout_width=\"16sp\"\n                        android:layout_height=\"16sp\"\n                        android:layout_marginStart=\"4dp\"\n                        android:contentDescription=\"@string/description_account_locked\"\n                        android:visibility=\"gone\"\n                        app:layout_constraintBottom_toBottomOf=\"@+id/accountUsernameTextView\"\n                        app:layout_constraintStart_toEndOf=\"@+id/accountUsernameTextView\"\n                        app:layout_constraintTop_toTopOf=\"@+id/accountUsernameTextView\"\n                        app:srcCompat=\"@drawable/ic_lock_24dp\"\n                        app:tint=\"?android:textColorSecondary\"\n                        tools:visibility=\"visible\" />\n\n                    <com.google.android.material.chip.Chip\n                        android:id=\"@+id/accountFollowsYouTextView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginTop=\"6dp\"\n                        android:clickable=\"false\"\n                        android:focusable=\"false\"\n                        android:minHeight=\"@dimen/profile_badge_min_height\"\n                        android:text=\"@string/follows_you\"\n                        android:textSize=\"?attr/status_text_small\"\n                        android:visibility=\"gone\"\n                        app:chipBackgroundColor=\"#0000\"\n                        app:chipMinHeight=\"@dimen/profile_badge_min_height\"\n                        app:chipStrokeColor=\"?android:attr/textColorTertiary\"\n                        app:chipStrokeWidth=\"@dimen/profile_badge_stroke_width\"\n                        app:closeIconEnabled=\"false\"\n                        app:ensureMinTouchTargetSize=\"false\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toBottomOf=\"@id/accountUsernameTextView\"\n                        tools:visibility=\"visible\" />\n\n                    <com.google.android.material.chip.ChipGroup\n                        android:id=\"@+id/accountBadgeContainer\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginTop=\"6dp\"\n                        app:chipSpacingVertical=\"4dp\"\n                        app:layout_constraintStart_toEndOf=\"@id/accountUsernameTextView\"\n                        app:layout_constraintTop_toBottomOf=\"@id/accountFollowsYouTextView\"\n                        app:layout_goneMarginStart=\"0dp\" />\n\n                    <androidx.constraintlayout.widget.Barrier\n                        android:id=\"@+id/labelBarrier\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        app:barrierDirection=\"bottom\"\n                        app:constraint_referenced_ids=\"accountFollowsYouTextView,accountBadgeContainer\" />\n\n                    <com.google.android.material.textfield.TextInputLayout\n                        android:id=\"@+id/accountNoteTextInputLayout\"\n                        style=\"@style/TuskyTextInput\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginTop=\"16dp\"\n                        android:visibility=\"gone\"\n                        app:layout_constraintTop_toBottomOf=\"@id/labelBarrier\"\n                        tools:visibility=\"visible\">\n\n                        <com.google.android.material.textfield.TextInputEditText\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"wrap_content\"\n                            android:hint=\"@string/account_note_hint\"\n                            android:textDirection=\"firstStrong\" />\n\n                    </com.google.android.material.textfield.TextInputLayout>\n\n                    <TextView\n                        android:id=\"@+id/saveNoteInfo\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/account_note_saved\"\n                        android:textColor=\"?attr/colorPrimary\"\n                        android:visibility=\"gone\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toBottomOf=\"@id/accountNoteTextInputLayout\" />\n\n                    <com.keylesspalace.tusky.view.ClickableSpanTextView\n                        android:id=\"@+id/accountNoteTextView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:hyphenationFrequency=\"full\"\n                        android:lineSpacingMultiplier=\"1.1\"\n                        android:paddingTop=\"2dp\"\n                        android:textColor=\"?android:textColorTertiary\"\n                        android:textDirection=\"firstStrong\"\n                        android:textIsSelectable=\"true\"\n                        android:textSize=\"?attr/status_text_medium\"\n                        app:layout_constraintTop_toBottomOf=\"@id/saveNoteInfo\"\n                        app:layout_goneMarginTop=\"8dp\"\n                        tools:text=\"This is a test description. Descriptions can be quite looooong.\" />\n\n                    <androidx.recyclerview.widget.RecyclerView\n                        android:id=\"@+id/accountFieldList\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        app:layout_constraintTop_toBottomOf=\"@id/accountNoteTextView\"\n                        tools:itemCount=\"2\"\n                        tools:listitem=\"@layout/item_account_field\" />\n\n                    <TextView\n                        android:id=\"@+id/accountDateJoined\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginTop=\"8dp\"\n                        android:layout_marginBottom=\"8dp\"\n                        android:textColor=\"@color/textColorSecondary\"\n                        app:layout_constraintBottom_toTopOf=\"@id/accountRemoveView\"\n                        app:layout_constraintEnd_toEndOf=\"parent\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toBottomOf=\"@id/accountFieldList\"\n                        tools:text=\"April, 1971\" />\n\n                    <TextView\n                        android:id=\"@+id/accountRemoveView\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginTop=\"8dp\"\n                        android:layout_marginBottom=\"8dp\"\n                        android:hyphenationFrequency=\"full\"\n                        android:lineSpacingMultiplier=\"1.1\"\n                        android:text=\"@string/label_remote_account\"\n                        android:visibility=\"gone\"\n                        app:layout_constraintTop_toBottomOf=\"@id/accountDateJoined\"\n                        tools:visibility=\"visible\" />\n\n                    <androidx.constraintlayout.widget.ConstraintLayout\n                        android:id=\"@+id/accountMovedView\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginTop=\"4dp\"\n                        android:visibility=\"gone\"\n                        app:layout_constraintTop_toBottomOf=\"@id/accountRemoveView\"\n                        tools:visibility=\"visible\">\n\n                        <TextView\n                            android:id=\"@+id/accountMovedText\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_marginTop=\"8dp\"\n                            android:drawablePadding=\"6dp\"\n                            android:textSize=\"?attr/status_text_medium\"\n                            app:drawableStartCompat=\"@drawable/ic_trip_24dp\"\n                            app:layout_constraintStart_toStartOf=\"parent\"\n                            app:layout_constraintTop_toTopOf=\"parent\"\n                            tools:text=\"Account has moved\" />\n\n                        <ImageView\n                            android:id=\"@+id/accountMovedAvatar\"\n                            android:layout_width=\"48dp\"\n                            android:layout_height=\"48dp\"\n                            android:layout_centerVertical=\"true\"\n                            android:layout_marginTop=\"8dp\"\n                            android:layout_marginEnd=\"24dp\"\n                            android:layout_marginBottom=\"8dp\"\n                            android:importantForAccessibility=\"no\"\n                            app:layout_constraintBottom_toBottomOf=\"parent\"\n                            app:layout_constraintStart_toStartOf=\"parent\"\n                            app:layout_constraintTop_toBottomOf=\"@id/accountMovedText\"\n                            tools:src=\"@drawable/avatar_default\" />\n\n                        <TextView\n                            android:id=\"@+id/accountMovedDisplayName\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_marginStart=\"16dp\"\n                            android:ellipsize=\"end\"\n                            android:maxLines=\"1\"\n                            android:textColor=\"?android:textColorPrimary\"\n                            android:textSize=\"?attr/status_text_large\"\n                            android:textStyle=\"normal|bold\"\n                            app:layout_constraintBottom_toTopOf=\"@id/accountMovedUsername\"\n                            app:layout_constraintStart_toEndOf=\"@id/accountMovedAvatar\"\n                            app:layout_constraintTop_toTopOf=\"@id/accountMovedAvatar\"\n                            tools:text=\"Display name\" />\n\n                        <TextView\n                            android:id=\"@+id/accountMovedUsername\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_marginStart=\"16dp\"\n                            android:ellipsize=\"end\"\n                            android:maxLines=\"1\"\n                            android:textColor=\"?android:textColorSecondary\"\n                            android:textSize=\"?attr/status_text_medium\"\n                            app:layout_constraintBottom_toBottomOf=\"@id/accountMovedAvatar\"\n                            app:layout_constraintStart_toEndOf=\"@id/accountMovedAvatar\"\n                            app:layout_constraintTop_toBottomOf=\"@id/accountMovedDisplayName\"\n                            tools:text=\"\\@username\" />\n\n                    </androidx.constraintlayout.widget.ConstraintLayout>\n\n                    <LinearLayout\n                        android:id=\"@+id/accountStatuses\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:background=\"?attr/selectableItemBackgroundBorderless\"\n                        android:gravity=\"center_horizontal\"\n                        android:orientation=\"vertical\"\n                        app:layout_constraintEnd_toStartOf=\"@id/accountFollowing\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toBottomOf=\"@id/accountMovedView\">\n\n                        <TextView\n                            android:id=\"@+id/accountStatusesTextView\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_marginTop=\"8dp\"\n                            android:fontFamily=\"sans-serif-medium\"\n                            android:textColor=\"@color/account_tab_font_color\"\n                            android:textSize=\"?attr/status_text_medium\"\n                            tools:text=\"3000\" />\n\n                        <TextView\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:paddingBottom=\"6dp\"\n                            android:text=\"@string/title_posts\"\n                            android:textColor=\"@color/account_tab_font_color\"\n                            android:textSize=\"?attr/status_text_medium\" />\n\n                    </LinearLayout>\n\n                    <LinearLayout\n                        android:id=\"@+id/accountFollowing\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:background=\"?attr/selectableItemBackgroundBorderless\"\n                        android:gravity=\"center_horizontal\"\n                        android:orientation=\"vertical\"\n                        app:layout_constraintEnd_toStartOf=\"@id/accountFollowers\"\n                        app:layout_constraintStart_toEndOf=\"@id/accountStatuses\"\n                        app:layout_constraintTop_toBottomOf=\"@id/accountMovedView\">\n\n                        <TextView\n                            android:id=\"@+id/accountFollowingTextView\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_marginTop=\"8dp\"\n                            android:fontFamily=\"sans-serif-medium\"\n                            android:textColor=\"@color/account_tab_font_color\"\n                            android:textSize=\"?attr/status_text_medium\"\n                            tools:text=\"500\" />\n\n                        <TextView\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:paddingBottom=\"6dp\"\n                            android:text=\"@string/title_follows\"\n                            android:textColor=\"@color/account_tab_font_color\"\n                            android:textSize=\"?attr/status_text_medium\" />\n                    </LinearLayout>\n\n                    <LinearLayout\n                        android:id=\"@+id/accountFollowers\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:background=\"?attr/selectableItemBackgroundBorderless\"\n                        android:gravity=\"center_horizontal\"\n                        android:orientation=\"vertical\"\n                        app:layout_constraintEnd_toEndOf=\"parent\"\n                        app:layout_constraintStart_toEndOf=\"@id/accountFollowing\"\n                        app:layout_constraintTop_toBottomOf=\"@id/accountMovedView\">\n\n                        <TextView\n                            android:id=\"@+id/accountFollowersTextView\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_marginTop=\"8dp\"\n                            android:fontFamily=\"sans-serif-medium\"\n                            android:textColor=\"@color/account_tab_font_color\"\n                            android:textSize=\"?attr/status_text_medium\"\n                            tools:text=\"1234\" />\n\n                        <TextView\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:paddingBottom=\"6dp\"\n                            android:text=\"@string/title_followers\"\n                            android:textColor=\"@color/account_tab_font_color\"\n                            android:textSize=\"?attr/status_text_medium\" />\n                    </LinearLayout>\n\n                </androidx.constraintlayout.widget.ConstraintLayout>\n\n                <!-- correct size and color will be set programmatically -->\n                <View\n                    android:id=\"@+id/accountStatusBarScrim\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"100dp\"\n                    android:background=\"@android:color/transparent\"\n                    app:layout_collapseMode=\"pin\" />\n\n                <!-- top margin equal to statusbar size will be set programmatically -->\n                <com.google.android.material.appbar.MaterialToolbar\n                    android:id=\"@+id/accountToolbar\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_gravity=\"top\"\n                    android:background=\"@android:color/transparent\"\n                    app:contentInsetStartWithNavigation=\"0dp\"\n                    app:layout_collapseMode=\"pin\"\n                    app:layout_scrollFlags=\"scroll|enterAlways\" />\n\n            </com.google.android.material.appbar.CollapsingToolbarLayout>\n\n            <com.google.android.material.tabs.TabLayout\n                android:id=\"@+id/accountTabLayout\"\n                style=\"@style/TuskyTabAppearance\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:tabGravity=\"center\"\n                app:tabIndicator=\"@drawable/tab_indicator_top\"\n                app:tabIndicatorFullWidth=\"true\"\n                app:tabIndicatorHeight=\"4dp\"\n                app:tabMode=\"scrollable\" />\n\n        </com.google.android.material.appbar.AppBarLayout>\n\n        <androidx.viewpager2.widget.ViewPager2\n            android:id=\"@+id/accountFragmentViewPager\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:background=\"?android:windowBackground\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n            android:id=\"@+id/accountFloatingActionButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"bottom|end\"\n            android:layout_margin=\"16dp\"\n            android:contentDescription=\"@string/action_mention\"\n            app:srcCompat=\"@drawable/ic_edit_24dp_filled\"\n            app:tint=\"?attr/colorOnPrimary\" />\n\n        <include layout=\"@layout/item_status_bottom_sheet\" />\n\n        <ImageView\n            android:id=\"@+id/accountAvatarImageView\"\n            android:layout_width=\"@dimen/account_activity_avatar_size\"\n            android:layout_height=\"@dimen/account_activity_avatar_size\"\n            android:layout_marginStart=\"16dp\"\n            android:contentDescription=\"@string/label_avatar\"\n            android:padding=\"3dp\"\n            app:layout_anchor=\"@+id/accountHeaderInfoContainer\"\n            app:layout_anchorGravity=\"top\"\n            app:layout_scrollFlags=\"scroll\"\n            app:srcCompat=\"@drawable/avatar_default\" />\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n</com.keylesspalace.tusky.view.TuskySwipeRefreshLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_account_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.keylesspalace.tusky.components.accountlist.AccountListActivity\">\n\n    <include\n        android:id=\"@+id/includedToolbar\"\n        layout=\"@layout/toolbar_basic\" />\n\n    <androidx.fragment.app.FragmentContainerView\n        android:id=\"@+id/fragment_container\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n\n    <include layout=\"@layout/item_status_bottom_sheet\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_announcements.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <include\n        android:id=\"@+id/includedToolbar\"\n        layout=\"@layout/toolbar_basic\" />\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/progressBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:indeterminate=\"true\" />\n\n    <com.keylesspalace.tusky.view.TuskySwipeRefreshLayout\n        android:id=\"@+id/swipeRefreshLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n        <FrameLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/announcementsList\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:clipToPadding=\"false\"\n                android:paddingBottom=\"@dimen/recyclerview_bottom_padding_no_actionbutton\" />\n\n            <com.keylesspalace.tusky.view.BackgroundMessageView\n                android:id=\"@+id/errorMessageView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:layout_gravity=\"center\"\n                android:src=\"@android:color/transparent\"\n                android:visibility=\"gone\"\n                tools:src=\"@drawable/errorphant_error\"\n                tools:visibility=\"visible\" />\n        </FrameLayout>\n    </com.keylesspalace.tusky.view.TuskySwipeRefreshLayout>\n\n    <include layout=\"@layout/item_status_bottom_sheet\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_compose.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/activityCompose\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.google.android.material.appbar.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@android:color/transparent\"\n        android:fitsSystemWindows=\"true\">\n\n        <com.google.android.material.appbar.MaterialToolbar\n            android:id=\"@+id/toolbar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <ImageView\n                android:id=\"@+id/composeAvatar\"\n                android:layout_width=\"?attr/actionBarSize\"\n                android:layout_height=\"?attr/actionBarSize\"\n                android:layout_gravity=\"end\"\n                android:padding=\"8dp\"\n                tools:ignore=\"ContentDescription\" />\n            <!--content description will be set in code -->\n\n            <Spinner\n                android:id=\"@+id/composePostLanguageButton\"\n                style=\"@style/TuskyImageButton\"\n                android:layout_width=\"52dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"end\"\n                android:contentDescription=\"@string/description_post_language\"\n                android:padding=\"0dp\"\n                android:textColor=\"?android:attr/textColorTertiary\"\n                android:textSize=\"?attr/status_text_large\"\n                android:textStyle=\"bold\"\n                app:tooltipText=\"@string/description_post_language\" />\n\n            <ImageButton\n                android:id=\"@+id/atButton\"\n                style=\"@style/TuskyImageButton\"\n                android:layout_width=\"40dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"end\"\n                android:contentDescription=\"@string/at_symbol\"\n                android:padding=\"8dp\"\n                app:srcCompat=\"@drawable/ic_email_alternate_24dp\" />\n\n            <ImageButton\n                android:id=\"@+id/hashButton\"\n                style=\"@style/TuskyImageButton\"\n                android:layout_width=\"40dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"end\"\n                android:contentDescription=\"@string/hash_symbol\"\n                android:padding=\"8dp\"\n                app:srcCompat=\"@drawable/ic_tag_24dp\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/descriptionMissingWarningButton\"\n                style=\"@style/TuskyImageButton\"\n                android:layout_width=\"40dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"end\"\n                android:contentDescription=\"@string/hint_media_description_missing\"\n                android:padding=\"8dp\"\n                app:icon=\"@drawable/ic_comments_disabled_24dp\"\n                app:iconTint=\"@color/tusky_orange_light\"\n                app:tooltipText=\"@string/hint_media_description_missing\" />\n\n        </com.google.android.material.appbar.MaterialToolbar>\n\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <androidx.core.widget.NestedScrollView\n        android:id=\"@+id/composeMainScrollView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginBottom=\"@dimen/compose_bottom_bar_height\"\n        android:clipToPadding=\"false\"\n        android:paddingTop=\"8dp\"\n        android:paddingBottom=\"8dp\"\n        app:layout_behavior=\"com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\">\n\n            <TextView\n                android:id=\"@+id/composeUsernameView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginLeft=\"16dp\"\n                android:layout_marginRight=\"16dp\"\n                android:layout_marginBottom=\"0dp\"\n                android:textSize=\"?attr/status_text_small\"\n                android:textStyle=\"bold\"\n                android:visibility=\"gone\"\n                tools:text=\"Posting as @username@domain\"\n                tools:visibility=\"visible\" />\n\n            <TextView\n                android:id=\"@+id/composeReplyView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginLeft=\"16dp\"\n                android:layout_marginRight=\"16dp\"\n                android:layout_marginBottom=\"6dp\"\n                android:drawablePadding=\"6dp\"\n                android:textSize=\"?attr/status_text_small\"\n                android:textStyle=\"bold\"\n                android:visibility=\"gone\"\n                tools:text=\"Reply to @username\"\n                tools:visibility=\"visible\" />\n\n            <TextView\n                android:id=\"@+id/composeReplyContentView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"2dp\"\n                android:background=\"?attr/colorBackgroundAccent\"\n                android:lineSpacingMultiplier=\"1.1\"\n                android:paddingLeft=\"16dp\"\n                android:paddingTop=\"4dp\"\n                android:paddingRight=\"16dp\"\n                android:paddingBottom=\"4dp\"\n                android:textSize=\"?attr/status_text_small\"\n                android:visibility=\"gone\"\n                tools:text=\"Post content which may be preeettyy long, so please, make sure there's enough room for everything, okay? Not kidding. I wish Eugen answered me more often, sigh.\"\n                tools:visibility=\"visible\" />\n\n            <LinearLayout\n                android:id=\"@+id/composeContentWarningBar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\">\n\n                <androidx.emoji2.widget.EmojiEditText\n                    android:id=\"@+id/composeContentWarningField\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"8dp\"\n                    android:background=\"@android:color/transparent\"\n                    android:hint=\"@string/hint_content_warning\"\n                    android:inputType=\"text|textCapSentences\"\n                    android:lineSpacingMultiplier=\"1.1\"\n                    android:maxLines=\"1\"\n                    android:nestedScrollingEnabled=\"false\"\n                    android:paddingLeft=\"16dp\"\n                    android:paddingRight=\"16dp\"\n                    android:textColorHint=\"?android:attr/textColorTertiary\"\n                    android:textSize=\"?attr/status_text_medium\" />\n\n                <View\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"1dp\"\n                    android:layout_marginTop=\"8dp\"\n                    android:background=\"?android:attr/listDivider\" />\n\n            </LinearLayout>\n\n            <com.keylesspalace.tusky.components.compose.view.EditTextTyped\n                android:id=\"@+id/composeEditField\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"@null\"\n                android:completionThreshold=\"2\"\n                android:dropDownWidth=\"wrap_content\"\n                android:hint=\"@string/hint_compose\"\n                android:inputType=\"text|textMultiLine|textCapSentences\"\n                android:lineSpacingMultiplier=\"1.1\"\n                android:nestedScrollingEnabled=\"false\"\n                android:paddingLeft=\"16dp\"\n                android:paddingTop=\"8dp\"\n                android:paddingRight=\"16dp\"\n                android:paddingBottom=\"8dp\"\n                android:textColorHint=\"?android:attr/textColorTertiary\"\n                android:textSize=\"?attr/status_text_large\" />\n\n            <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/composeMediaPreviewBar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:scrollbars=\"none\"\n                android:visibility=\"gone\" />\n\n            <com.keylesspalace.tusky.components.compose.view.PollPreviewView\n                android:id=\"@+id/pollPreview\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:minWidth=\"@dimen/poll_preview_min_width\"\n                android:visibility=\"gone\"\n                tools:visibility=\"visible\" />\n\n        </LinearLayout>\n\n    </androidx.core.widget.NestedScrollView>\n\n    <LinearLayout\n        android:id=\"@+id/addMediaBottomSheet\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?attr/colorSurface\"\n        android:elevation=\"12dp\"\n        android:orientation=\"vertical\"\n        android:paddingStart=\"16dp\"\n        android:paddingTop=\"8dp\"\n        android:paddingEnd=\"16dp\"\n        android:paddingBottom=\"@dimen/compose_bottom_bar_height\"\n        app:behavior_hideable=\"true\"\n        app:behavior_peekHeight=\"0dp\"\n        app:layout_behavior=\"com.google.android.material.bottomsheet.BottomSheetBehavior\">\n\n        <TextView\n            android:id=\"@+id/actionPhotoTake\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:drawablePadding=\"8dp\"\n            android:padding=\"8dp\"\n            android:text=\"@string/action_photo_take\"\n            android:textSize=\"?attr/status_text_medium\"\n            app:drawableStartCompat=\"@drawable/ic_photo_camera_24dp\"\n            app:drawableTint=\"?android:attr/textColorTertiary\" />\n\n        <TextView\n            android:id=\"@+id/actionPhotoPick\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:drawablePadding=\"8dp\"\n            android:padding=\"8dp\"\n            android:text=\"@string/action_add_media\"\n            android:textSize=\"?attr/status_text_medium\"\n            app:drawableStartCompat=\"@drawable/ic_image_24dp\"\n            app:drawableTint=\"?android:attr/textColorTertiary\" />\n\n        <TextView\n            android:id=\"@+id/addPollTextActionTextView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:drawablePadding=\"8dp\"\n            android:padding=\"8dp\"\n            android:text=\"@string/action_add_poll\"\n            android:textSize=\"?attr/status_text_medium\"\n            app:drawableStartCompat=\"@drawable/ic_insert_chart_24dp\"\n            app:drawableTint=\"?android:attr/textColorTertiary\" />\n\n    </LinearLayout>\n\n    <com.keylesspalace.tusky.view.EmojiPicker\n        android:id=\"@+id/emojiView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?attr/colorSurface\"\n        android:elevation=\"12dp\"\n        android:paddingStart=\"16dp\"\n        android:paddingTop=\"8dp\"\n        android:paddingEnd=\"16dp\"\n        android:paddingBottom=\"@dimen/compose_bottom_bar_height\"\n        app:behavior_hideable=\"true\"\n        app:behavior_peekHeight=\"0dp\"\n        app:layout_behavior=\"com.google.android.material.bottomsheet.BottomSheetBehavior\" />\n\n    <com.keylesspalace.tusky.components.compose.view.ComposeOptionsView\n        android:id=\"@+id/composeOptionsBottomSheet\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?attr/colorSurface\"\n        android:elevation=\"12dp\"\n        android:paddingStart=\"24dp\"\n        android:paddingTop=\"12dp\"\n        android:paddingEnd=\"24dp\"\n        android:paddingBottom=\"@dimen/compose_bottom_bar_height\"\n        app:behavior_hideable=\"true\"\n        app:behavior_peekHeight=\"0dp\"\n        app:layout_behavior=\"com.google.android.material.bottomsheet.BottomSheetBehavior\" />\n\n    <com.keylesspalace.tusky.components.compose.view.ComposeScheduleView\n        android:id=\"@+id/composeScheduleView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?attr/colorSurface\"\n        android:elevation=\"12dp\"\n        android:paddingStart=\"16dp\"\n        android:paddingTop=\"8dp\"\n        android:paddingEnd=\"16dp\"\n        android:paddingBottom=\"@dimen/compose_bottom_bar_height\"\n        app:behavior_hideable=\"true\"\n        app:behavior_peekHeight=\"0dp\"\n        app:layout_behavior=\"com.google.android.material.bottomsheet.BottomSheetBehavior\" />\n\n    <LinearLayout\n        android:id=\"@+id/composeBottomBar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"bottom\"\n        android:background=\"?attr/colorSurface\"\n        android:elevation=\"12dp\"\n        android:gravity=\"center_vertical\"\n        android:paddingStart=\"@dimen/compose_bottom_bar_padding_horizontal\"\n        android:paddingTop=\"@dimen/compose_bottom_bar_padding_vertical\"\n        android:paddingEnd=\"@dimen/compose_bottom_bar_padding_horizontal\"\n        android:paddingBottom=\"@dimen/compose_bottom_bar_padding_vertical\">\n\n        <ImageButton\n            android:id=\"@+id/composeAddMediaButton\"\n            style=\"@style/TuskyImageButton\"\n            android:layout_width=\"36dp\"\n            android:layout_height=\"36dp\"\n            android:layout_marginEnd=\"4dp\"\n            android:contentDescription=\"@string/action_add_media\"\n            android:padding=\"4dp\"\n            app:srcCompat=\"@drawable/ic_attach_file_24dp\"\n            app:tooltipText=\"@string/action_add_media\" />\n\n        <ImageButton\n            android:id=\"@+id/composeToggleVisibilityButton\"\n            style=\"@style/TuskyImageButton\"\n            android:layout_width=\"36dp\"\n            android:layout_height=\"36dp\"\n            android:layout_marginEnd=\"4dp\"\n            android:contentDescription=\"@string/action_toggle_visibility\"\n            android:padding=\"4dp\"\n            app:tooltipText=\"@string/action_toggle_visibility\"\n            tools:src=\"@drawable/ic_public_24dp\" />\n\n        <ImageButton\n            android:id=\"@+id/composeHideMediaButton\"\n            style=\"@style/TuskyImageButton\"\n            android:layout_width=\"36dp\"\n            android:layout_height=\"36dp\"\n            android:layout_marginEnd=\"4dp\"\n            android:contentDescription=\"@string/action_hide_media\"\n            android:padding=\"4dp\"\n            app:tooltipText=\"@string/action_hide_media\"\n            tools:src=\"@drawable/ic_visibility_24dp\" />\n\n        <ImageButton\n            android:id=\"@+id/composeContentWarningButton\"\n            style=\"@style/TuskyImageButton\"\n            android:layout_width=\"36dp\"\n            android:layout_height=\"36dp\"\n            android:layout_marginEnd=\"4dp\"\n            android:contentDescription=\"@string/action_content_warning\"\n            android:padding=\"4dp\"\n            app:srcCompat=\"@drawable/ic_feedback_24dp_filled\"\n            app:tooltipText=\"@string/action_content_warning\" />\n\n        <ImageButton\n            android:id=\"@+id/composeEmojiButton\"\n            style=\"@style/TuskyImageButton\"\n            android:layout_width=\"36dp\"\n            android:layout_height=\"36dp\"\n            android:layout_marginEnd=\"4dp\"\n            android:contentDescription=\"@string/action_emoji_keyboard\"\n            android:padding=\"4dp\"\n            app:srcCompat=\"@drawable/ic_mood_24dp\"\n            app:tooltipText=\"@string/action_emoji_keyboard\" />\n\n        <ImageButton\n            android:id=\"@+id/composeScheduleButton\"\n            style=\"@style/TuskyImageButton\"\n            android:layout_width=\"36dp\"\n            android:layout_height=\"36dp\"\n            android:layout_marginEnd=\"4dp\"\n            android:contentDescription=\"@string/action_schedule_post\"\n            android:padding=\"4dp\"\n            app:srcCompat=\"@drawable/ic_schedule_24dp\"\n            app:tooltipText=\"@string/action_schedule_post\" />\n\n        <Space\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\" />\n\n        <TextView\n            android:id=\"@+id/composeCharactersLeftView\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:textColor=\"?android:textColorTertiary\"\n            android:textSize=\"?attr/status_text_medium\"\n            android:textStyle=\"bold\"\n            tools:text=\"500\" />\n\n        <com.keylesspalace.tusky.components.compose.view.TootButton\n            android:id=\"@+id/composeTootButton\"\n            style=\"@style/TuskyButton\"\n            android:layout_width=\"@dimen/toot_button_width\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"10dp\"\n            android:textSize=\"?attr/status_text_medium\"\n            app:iconGravity=\"textStart\"\n            app:iconSize=\"24dp\" />\n\n    </LinearLayout>\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_drafts.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".components.drafts.DraftsActivity\">\n\n    <include\n        android:id=\"@+id/includedToolbar\"\n        layout=\"@layout/toolbar_basic\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/draftsRecyclerView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:clipToPadding=\"false\"\n        android:paddingBottom=\"@dimen/recyclerview_bottom_padding_no_actionbutton\"\n        android:scrollbarStyle=\"outsideInset\"\n        android:scrollbars=\"vertical\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n\n    <com.keylesspalace.tusky.view.BackgroundMessageView\n        android:id=\"@+id/draftsErrorMessageView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:layout_gravity=\"center\"\n        android:src=\"@android:color/transparent\"\n        android:visibility=\"gone\"\n        tools:src=\"@drawable/errorphant_error\"\n        tools:visibility=\"visible\" />\n\n    <include\n        android:id=\"@+id/bottomSheet\"\n        layout=\"@layout/item_status_bottom_sheet\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_edit_filter.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.keylesspalace.tusky.components.filters.EditFilterActivity\">\n\n    <include\n        android:id=\"@+id/includedToolbar\"\n        layout=\"@layout/toolbar_basic\" />\n\n    <androidx.core.widget.NestedScrollView\n        android:id=\"@+id/scrollView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:clipToPadding=\"false\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"vertical\"\n            android:paddingStart=\"?android:attr/listPreferredItemPaddingStart\"\n            android:paddingEnd=\"?android:attr/listPreferredItemPaddingEnd\">\n\n            <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/filter_title_wrapper\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"16dp\"\n                android:hint=\"@string/label_filter_title\">\n\n                <com.google.android.material.textfield.TextInputEditText\n                    android:id=\"@+id/filterTitle\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:inputType=\"textNoSuggestions\" />\n\n            </com.google.android.material.textfield.TextInputLayout>\n\n            <TextView\n                style=\"@style/TextAppearance.Material3.TitleSmall\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"16dp\"\n                android:text=\"@string/label_filter_keywords\"\n                android:textColor=\"?attr/colorAccent\" />\n\n            <com.google.android.material.chip.ChipGroup\n                android:id=\"@+id/keywordChips\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n\n                <com.google.android.material.chip.Chip\n                    android:id=\"@+id/actionChip\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:checkable=\"false\"\n                    android:text=\"@string/action_add\"\n                    android:textColor=\"?attr/colorOnPrimary\"\n                    app:chipBackgroundColor=\"?attr/colorPrimary\"\n                    app:chipIcon=\"@drawable/ic_add_24dp\"\n                    app:chipIconEnabled=\"true\"\n                    app:chipIconTint=\"?attr/colorOnPrimary\"\n                    app:chipStrokeWidth=\"0dp\"\n                    app:closeIconEnabled=\"false\" />\n\n            </com.google.android.material.chip.ChipGroup>\n\n            <TextView\n                style=\"@style/TextAppearance.Material3.TitleSmall\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"16dp\"\n                android:text=\"@string/label_filter_action\"\n                android:textColor=\"?attr/colorAccent\" />\n\n            <RadioGroup\n                android:id=\"@+id/filter_action_group\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n\n                <RadioButton\n                    android:id=\"@+id/filter_action_blur\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:minHeight=\"48dp\"\n                    android:text=\"@string/filter_description_blur\" />\n\n                <RadioButton\n                    android:id=\"@+id/filter_action_warn\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:minHeight=\"48dp\"\n                    android:text=\"@string/filter_description_warn\" />\n\n                <RadioButton\n                    android:id=\"@+id/filter_action_hide\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:minHeight=\"48dp\"\n                    android:text=\"@string/filter_description_hide\" />\n\n            </RadioGroup>\n\n            <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/filterDurationInputLayout\"\n                style=\"@style/Widget.Material3.TextInputLayout.OutlinedBox.Dense.ExposedDropdownMenu\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"16dp\"\n                android:hint=\"@string/label_expires_after\">\n\n                <com.google.android.material.textfield.MaterialAutoCompleteTextView\n                    android:id=\"@+id/filterDurationDropDown\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:inputType=\"none\" />\n\n            </com.google.android.material.textfield.TextInputLayout>\n\n            <TextView\n                style=\"@style/TextAppearance.Material3.TitleSmall\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"16dp\"\n                android:text=\"@string/label_filter_context\"\n                android:textColor=\"?attr/colorAccent\" />\n\n            <com.google.android.material.materialswitch.MaterialSwitch\n                android:id=\"@+id/filter_context_home\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:minHeight=\"48dp\"\n                android:text=\"@string/title_home\" />\n\n            <com.google.android.material.materialswitch.MaterialSwitch\n                android:id=\"@+id/filter_context_notifications\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:minHeight=\"48dp\"\n                android:text=\"@string/title_notifications\" />\n\n            <com.google.android.material.materialswitch.MaterialSwitch\n                android:id=\"@+id/filter_context_public\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:minHeight=\"48dp\"\n                android:text=\"@string/pref_title_public_filter_keywords\" />\n\n            <com.google.android.material.materialswitch.MaterialSwitch\n                android:id=\"@+id/filter_context_thread\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:minHeight=\"48dp\"\n                android:text=\"@string/pref_title_thread_filter_keywords\" />\n\n            <com.google.android.material.materialswitch.MaterialSwitch\n                android:id=\"@+id/filter_context_account\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:minHeight=\"48dp\"\n                android:text=\"@string/pref_title_account_filter_keywords\" />\n\n            <LinearLayout\n                style=\"?android:attr/buttonBarStyle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:gravity=\"end\"\n                android:paddingStart=\"?android:attr/listPreferredItemPaddingStart\"\n                android:paddingEnd=\"?android:attr/listPreferredItemPaddingEnd\">\n\n                <Button\n                    android:id=\"@+id/filter_delete_button\"\n                    style=\"@style/TuskyButton.TextButton\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/action_delete\" />\n\n                <Button\n                    android:id=\"@+id/filter_save_button\"\n                    style=\"@style/TuskyButton.TextButton\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"8dp\"\n                    android:text=\"@string/action_save\" />\n\n            </LinearLayout>\n\n        </LinearLayout>\n    </androidx.core.widget.NestedScrollView>\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_edit_profile.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".EditProfileActivity\">\n\n    <include\n        android:id=\"@+id/includedToolbar\"\n        layout=\"@layout/toolbar_basic\" />\n\n    <androidx.core.widget.NestedScrollView\n        android:id=\"@+id/scrollView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:clipToPadding=\"false\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:focusableInTouchMode=\"true\">\n\n            <ImageView\n                android:id=\"@+id/headerPreview\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"200dp\"\n                android:contentDescription=\"@null\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n            <ImageButton\n                android:id=\"@+id/headerButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"200dp\"\n                android:background=\"#66000000\"\n                android:contentDescription=\"@string/label_header\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:srcCompat=\"@drawable/ic_add_a_photo_32dp_filled\" />\n\n            <ImageView\n                android:id=\"@+id/avatarPreview\"\n                android:layout_width=\"80dp\"\n                android:layout_height=\"80dp\"\n                android:layout_marginStart=\"16dp\"\n                android:contentDescription=\"@null\"\n                app:layout_constraintBottom_toBottomOf=\"@id/headerPreview\"\n                app:layout_constraintStart_toStartOf=\"@id/contentContainer\"\n                app:layout_constraintTop_toBottomOf=\"@id/headerPreview\" />\n\n            <ImageButton\n                android:id=\"@+id/avatarButton\"\n                android:layout_width=\"80dp\"\n                android:layout_height=\"80dp\"\n                android:layout_marginStart=\"16dp\"\n                android:background=\"@drawable/round_button\"\n                android:contentDescription=\"@string/label_avatar\"\n                android:elevation=\"4dp\"\n                app:layout_constraintBottom_toBottomOf=\"@id/headerPreview\"\n                app:layout_constraintStart_toStartOf=\"@id/contentContainer\"\n                app:layout_constraintTop_toBottomOf=\"@id/headerPreview\"\n                app:srcCompat=\"@drawable/ic_add_a_photo_32dp_filled\" />\n\n            <LinearLayout\n                android:id=\"@+id/contentContainer\"\n                android:layout_width=\"@dimen/timeline_width\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center_horizontal\"\n                android:orientation=\"vertical\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@id/avatarPreview\">\n\n                <com.google.android.material.textfield.TextInputLayout\n                    style=\"@style/TuskyTextInput\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"16dp\"\n                    android:layout_marginTop=\"16dp\"\n                    android:layout_marginEnd=\"16dp\"\n                    android:hint=\"@string/hint_display_name\">\n\n                    <com.google.android.material.textfield.TextInputEditText\n                        android:id=\"@+id/displayNameEditText\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:importantForAutofill=\"no\"\n                        android:lines=\"1\" />\n\n                </com.google.android.material.textfield.TextInputLayout>\n\n                <com.google.android.material.textfield.TextInputLayout\n                    android:id=\"@+id/noteEditTextLayout\"\n                    style=\"@style/TuskyTextInput\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"16dp\"\n                    android:layout_marginTop=\"16dp\"\n                    android:layout_marginEnd=\"16dp\"\n                    android:hint=\"@string/hint_note\"\n                    app:counterEnabled=\"true\"\n                    app:counterTextColor=\"?android:textColorTertiary\">\n\n                    <com.google.android.material.textfield.TextInputEditText\n                        android:id=\"@+id/noteEditText\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:importantForAutofill=\"no\" />\n\n                </com.google.android.material.textfield.TextInputLayout>\n\n                <com.google.android.material.checkbox.MaterialCheckBox\n                    android:id=\"@+id/lockedCheckBox\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"16dp\"\n                    android:layout_marginTop=\"30dp\"\n                    android:layout_marginEnd=\"16dp\"\n                    android:paddingStart=\"8dp\"\n                    android:paddingEnd=\"8dp\"\n                    android:text=\"@string/lock_account_label\"\n                    android:textSize=\"?attr/status_text_medium\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"16dp\"\n                    android:layout_marginEnd=\"16dp\"\n                    android:layout_marginBottom=\"24dp\"\n                    android:paddingStart=\"40dp\"\n                    android:paddingEnd=\"0dp\"\n                    android:text=\"@string/lock_account_label_description\"\n                    android:textSize=\"?attr/status_text_small\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"16dp\"\n                    android:layout_marginEnd=\"16dp\"\n                    android:layout_marginBottom=\"8dp\"\n                    android:text=\"@string/profile_metadata_label\"\n                    android:textSize=\"?attr/status_text_small\" />\n\n                <androidx.recyclerview.widget.RecyclerView\n                    android:id=\"@+id/fieldList\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:clipChildren=\"false\"\n                    android:nestedScrollingEnabled=\"false\" />\n\n                <Button\n                    android:id=\"@+id/addFieldButton\"\n                    style=\"@style/TuskyButton\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_gravity=\"end\"\n                    android:layout_marginStart=\"16dp\"\n                    android:layout_marginEnd=\"16dp\"\n                    android:layout_marginBottom=\"16dp\"\n                    android:drawablePadding=\"6dp\"\n                    android:text=\"@string/profile_metadata_add\"\n                    app:icon=\"@drawable/ic_add_24dp\"\n                    app:iconTint=\"?attr/colorOnPrimary\" />\n\n            </LinearLayout>\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n    </androidx.core.widget.NestedScrollView>\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/saveProgressBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:indeterminate=\"true\"\n        android:visibility=\"gone\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_filters.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.keylesspalace.tusky.components.filters.FiltersActivity\">\n\n    <include\n        android:id=\"@+id/includedToolbar\"\n        layout=\"@layout/toolbar_basic\" />\n\n    <com.keylesspalace.tusky.view.TuskySwipeRefreshLayout\n        android:id=\"@+id/swipeRefreshLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior\">\n\n        <FrameLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/filtersList\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:clipToPadding=\"false\"\n                android:paddingBottom=\"@dimen/recyclerview_bottom_padding_actionbutton\"\n                android:scrollbarStyle=\"outsideInset\"\n                android:scrollbars=\"vertical\"\n                app:layoutManager=\"androidx.recyclerview.widget.LinearLayoutManager\" />\n\n            <com.keylesspalace.tusky.view.BackgroundMessageView\n                android:id=\"@+id/messageView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:layout_gravity=\"center\" />\n        </FrameLayout>\n    </com.keylesspalace.tusky.view.TuskySwipeRefreshLayout>\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/progressBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:indeterminate=\"true\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/addFilterButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"16dp\"\n        android:contentDescription=\"@string/filter_addition_title\"\n        app:layout_anchor=\"@id/filtersList\"\n        app:layout_anchorGravity=\"bottom|end\"\n        app:srcCompat=\"@drawable/ic_add_24dp\"\n        app:tint=\"?attr/colorOnPrimary\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_followed_tags.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.keylesspalace.tusky.components.followedtags.FollowedTagsActivity\">\n\n    <include\n        android:id=\"@+id/includedToolbar\"\n        layout=\"@layout/toolbar_basic\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/followedTagsView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:clipToPadding=\"false\"\n        android:paddingBottom=\"@dimen/recyclerview_bottom_padding_actionbutton\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n        tools:itemCount=\"5\"\n        tools:listitem=\"@layout/item_followed_hashtag\" />\n\n    <com.keylesspalace.tusky.view.BackgroundMessageView\n        android:id=\"@+id/followedTagsMessageView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n        tools:visibility=\"gone\" />\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/followedTagsProgressBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:indeterminate=\"true\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n        tools:visibility=\"gone\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/fab\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"bottom|end\"\n        android:layout_margin=\"16dp\"\n        android:contentDescription=\"@string/action_follow_hashtag\"\n        app:srcCompat=\"@drawable/ic_tag_24dp\"\n        app:tint=\"?attr/colorOnPrimary\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_license.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:license=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".LicenseActivity\">\n\n    <include\n        android:id=\"@+id/includedToolbar\"\n        layout=\"@layout/toolbar_basic\" />\n\n    <ScrollView\n        android:id=\"@+id/scrollView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:clipToPadding=\"false\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:clipChildren=\"false\"\n            android:orientation=\"vertical\"\n            android:paddingBottom=\"12dp\"\n            android:textDirection=\"anyRtl\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"18dp\"\n                android:layout_marginTop=\"12dp\"\n                android:layout_marginEnd=\"18dp\"\n                android:gravity=\"center_vertical\"\n                android:lineSpacingMultiplier=\"1.1\"\n                android:text=\"@string/license_description\" />\n\n            <com.keylesspalace.tusky.view.LicenseCard\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"12dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"12dp\"\n                license:license=\"@string/license_apache_2\"\n                license:link=\"https://kotlinlang.org/\"\n                license:name=\"Kotlin\" />\n\n            <com.keylesspalace.tusky.view.LicenseCard\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"12dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"12dp\"\n                license:license=\"@string/license_apache_2\"\n                license:link=\"https://developer.android.com/jetpack/androidx\"\n                license:name=\"AndroidX\" />\n\n            <com.keylesspalace.tusky.view.LicenseCard\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"12dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"12dp\"\n                license:license=\"@string/license_apache_2\"\n                license:link=\"https://github.com/material-components/material-components-android\"\n                license:name=\"Material Components for Android\" />\n\n            <com.keylesspalace.tusky.view.LicenseCard\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"12dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"12dp\"\n                license:license=\"@string/license_apache_2\"\n                license:link=\"https://square.github.io/okhttp/\"\n                license:name=\"OkHttp\" />\n\n            <com.keylesspalace.tusky.view.LicenseCard\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"12dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"12dp\"\n                license:license=\"@string/license_apache_2\"\n                license:link=\"https://github.com/google/conscrypt\"\n                license:name=\"Conscrypt\" />\n\n            <com.keylesspalace.tusky.view.LicenseCard\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"12dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"12dp\"\n                license:license=\"@string/license_apache_2\"\n                license:link=\"https://square.github.io/retrofit/\"\n                license:name=\"Retrofit\" />\n\n            <com.keylesspalace.tusky.view.LicenseCard\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"12dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"12dp\"\n                license:license=\"@string/license_apache_2\"\n                license:link=\"https://github.com/square/moshi\"\n                license:name=\"Moshi\" />\n\n            <com.keylesspalace.tusky.view.LicenseCard\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"12dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"12dp\"\n                license:license=\"@string/license_apache_2\"\n                license:link=\"https://bumptech.github.io/glide/\"\n                license:name=\"Glide\" />\n\n            <com.keylesspalace.tusky.view.LicenseCard\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"12dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"12dp\"\n                license:license=\"@string/license_apache_2\"\n                license:link=\"https://dagger.dev/\"\n                license:name=\"Dagger 2\" />\n\n            <com.keylesspalace.tusky.view.LicenseCard\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"12dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"12dp\"\n                license:license=\"@string/license_apache_2\"\n                license:link=\"https://github.com/mikepenz/MaterialDrawer\"\n                license:name=\"MaterialDrawer\" />\n\n            <com.keylesspalace.tusky.view.LicenseCard\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"12dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"12dp\"\n                license:license=\"@string/license_apache_2\"\n                license:link=\"https://github.com/connyduck/SparkButton\"\n                license:name=\"SparkButton\" />\n\n            <com.keylesspalace.tusky.view.LicenseCard\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"12dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"12dp\"\n                license:license=\"@string/license_apache_2\"\n                license:link=\"https://github.com/chrisbanes/PhotoView\"\n                license:name=\"PhotoView\" />\n\n            <com.keylesspalace.tusky.view.LicenseCard\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"12dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"12dp\"\n                license:license=\"@string/license_apache_2\"\n                license:link=\"https://github.com/CanHub/Android-Image-Cropper\"\n                license:name=\"Android Image Cropper\" />\n\n            <com.keylesspalace.tusky.view.LicenseCard\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"12dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"12dp\"\n                license:license=\"@string/license_apache_2\"\n                license:link=\"https://github.com/penfeizhou/APNG4Android\"\n                license:name=\"APNG4Android\" />\n\n            <com.keylesspalace.tusky.view.LicenseCard\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"12dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"12dp\"\n                license:license=\"@string/license_apache_2\"\n                license:link=\"https://github.com/C1710/FileMojiCompat\"\n                license:name=\"FileMojiCompat\" />\n\n            <com.keylesspalace.tusky.view.LicenseCard\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"12dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"12dp\"\n                license:license=\"@string/license_cc_by_4\"\n                license:link=\"https://twemoji.twitter.com/\"\n                license:name=\"Twemoji\" />\n\n            <com.keylesspalace.tusky.view.LicenseCard\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"12dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"12dp\"\n                license:license=\"@string/license_cc_by_4\"\n                license:link=\"https://github.com/c1710/blobmoji\"\n                license:name=\"Blobmoji\" />\n\n            <com.keylesspalace.tusky.view.LicenseCard\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"12dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"12dp\"\n                license:license=\"@string/license_cc_by_sa_4\"\n                license:link=\"https://github.com/tuskyapp/artwork\"\n                license:name=\"Tusky elephant artwork\" />\n\n            <TextView\n                android:id=\"@+id/licenseApacheTextView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"18dp\"\n                android:layout_marginTop=\"12dp\"\n                android:layout_marginEnd=\"18dp\"\n                android:textSize=\"12sp\" />\n\n        </LinearLayout>\n\n    </ScrollView>\n\n    <include layout=\"@layout/item_status_bottom_sheet\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_lists.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <include\n            android:id=\"@+id/includedToolbar\"\n            layout=\"@layout/toolbar_basic\" />\n\n        <com.keylesspalace.tusky.view.TuskySwipeRefreshLayout\n            android:id=\"@+id/swipeRefreshLayout\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/includedToolbar\">\n\n            <FrameLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\">\n\n                <androidx.recyclerview.widget.RecyclerView\n                    android:id=\"@+id/listsRecycler\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:clipToPadding=\"false\"\n                    android:paddingBottom=\"@dimen/recyclerview_bottom_padding_actionbutton\" />\n\n                <com.keylesspalace.tusky.view.BackgroundMessageView\n                    android:id=\"@+id/messageView\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:visibility=\"gone\"\n                    tools:visibility=\"visible\" />\n            </FrameLayout>\n        </com.keylesspalace.tusky.view.TuskySwipeRefreshLayout>\n\n        <com.google.android.material.progressindicator.CircularProgressIndicator\n            android:id=\"@+id/progressBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:indeterminate=\"true\"\n            android:visibility=\"gone\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:visibility=\"visible\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/addListButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"16dp\"\n        android:contentDescription=\"@string/action_create_list\"\n        app:layout_anchor=\"@id/listsRecycler\"\n        app:layout_anchorGravity=\"bottom|end\"\n        app:srcCompat=\"@drawable/ic_add_24dp\"\n        app:tint=\"?attr/colorOnPrimary\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_login.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.keylesspalace.tusky.components.login.LoginActivity\">\n\n    <com.google.android.material.appbar.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:fitsSystemWindows=\"true\"\n        android:background=\"@android:color/transparent\">\n\n        <com.google.android.material.appbar.MaterialToolbar\n            android:id=\"@+id/toolbar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentTop=\"true\"\n            android:minHeight=\"?attr/actionBarSize\" />\n\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <ScrollView\n        android:id=\"@+id/loginScrollView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:fillViewport=\"true\"\n        android:clipToPadding=\"false\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:gravity=\"center\"\n            android:orientation=\"vertical\"\n            android:padding=\"16dp\">\n\n            <ImageView\n                android:id=\"@+id/loginLogo\"\n                android:layout_width=\"160dp\"\n                android:layout_height=\"178dp\"\n                android:layout_marginBottom=\"50dp\"\n                android:contentDescription=\"@null\"\n                app:srcCompat=\"@drawable/elephant_friend\" />\n\n            <LinearLayout\n                android:id=\"@+id/loginInputLayout\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:clipChildren=\"false\"\n                android:layout_marginBottom=\"16dp\"\n                android:orientation=\"vertical\">\n\n                <com.google.android.material.textfield.TextInputLayout\n                    android:id=\"@+id/domainTextInputLayout\"\n                    style=\"@style/TuskyTextInput\"\n                    android:layout_width=\"250dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:hint=\"@string/hint_domain\"\n                    app:errorEnabled=\"true\">\n\n                    <com.google.android.material.textfield.TextInputEditText\n                        android:id=\"@+id/domainEditText\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:ems=\"10\"\n                        android:inputType=\"textUri\" />\n                </com.google.android.material.textfield.TextInputLayout>\n\n                <com.google.android.material.button.MaterialButton\n                    android:id=\"@+id/loginButton\"\n                    style=\"@style/TuskyButton\"\n                    android:layout_width=\"250dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"8dp\"\n                    android:gravity=\"center\"\n                    android:text=\"@string/action_login\" />\n\n                <TextView\n                    android:id=\"@+id/whatsAnInstanceTextView\"\n                    android:layout_width=\"250dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:paddingTop=\"8dp\"\n                    android:text=\"@string/link_whats_an_instance\"\n                    android:textAlignment=\"center\" />\n            </LinearLayout>\n\n            <LinearLayout\n                android:id=\"@+id/loginLoadingLayout\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n                android:visibility=\"gone\">\n\n                <com.google.android.material.progressindicator.CircularProgressIndicator\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_gravity=\"center\"\n                    android:indeterminate=\"true\" />\n\n                <TextView\n                    android:layout_width=\"250dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:paddingTop=\"10dp\"\n                    android:text=\"@string/login_connection\"\n                    android:textAlignment=\"center\" />\n            </LinearLayout>\n\n        </LinearLayout>\n\n    </ScrollView>\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_login_webview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.google.android.material.appbar.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:fitsSystemWindows=\"true\"\n        app:liftOnScroll=\"false\">\n\n        <com.google.android.material.appbar.MaterialToolbar\n            android:id=\"@+id/loginToolbar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:minHeight=\"?attr/actionBarSize\" />\n\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/loginProgress\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:indeterminate=\"true\"\n        android:layout_gravity=\"center\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        app:layout_behavior=\"com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior\">\n\n        <WebView\n            android:id=\"@+id/loginWebView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0dp\"\n            android:layout_weight=\"1\" />\n\n        <TextView\n            android:id=\"@+id/loginRules\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"?android:attr/colorBackground\"\n            android:drawablePadding=\"8dp\"\n            android:foreground=\"?attr/selectableItemBackgroundBorderless\"\n            android:lineSpacingMultiplier=\"1.1\"\n            android:paddingHorizontal=\"24dp\"\n            android:paddingVertical=\"12dp\"\n            app:drawableStartCompat=\"@drawable/ic_info_24dp\"\n            tools:text=\"By logging in you agree to the rules of instance.example\" />\n\n    </LinearLayout>\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.drawerlayout.widget.DrawerLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/mainDrawerLayout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fitsSystemWindows=\"@bool/is_not_edge_to_edge\"\n    tools:context=\"com.keylesspalace.tusky.MainActivity\">\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n        android:id=\"@+id/mainCoordinatorLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <com.google.android.material.appbar.AppBarLayout\n            android:id=\"@+id/appBar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:fitsSystemWindows=\"@bool/is_edge_to_edge\"\n            app:liftOnScroll=\"false\"\n            app:statusBarForeground=\"?attr/colorSurface\">\n\n            <com.google.android.material.appbar.MaterialToolbar\n                android:id=\"@+id/mainToolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:minHeight=\"?attr/actionBarSize\"\n                app:contentInsetStartWithNavigation=\"0dp\"\n                app:layout_scrollFlags=\"scroll|enterAlways\"\n                app:navigationContentDescription=\"@string/action_open_drawer\" />\n\n            <com.google.android.material.appbar.MaterialToolbar\n                android:id=\"@+id/topNav\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"48dp\"\n                android:orientation=\"horizontal\"\n                android:paddingLeft=\"0dp\"\n                android:paddingRight=\"0dp\"\n                app:contentInsetStart=\"0dp\"\n                app:contentInsetStartWithNavigation=\"0dp\"\n                app:navigationContentDescription=\"@string/action_open_drawer\">\n\n                <com.keylesspalace.tusky.view.AdaptiveTabLayout\n                    android:id=\"@+id/tabLayout\"\n                    style=\"@style/TuskyTabAppearance\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:tabGravity=\"fill\"\n                    app:tabIndicator=\"@drawable/tab_indicator_top\"\n                    app:tabIndicatorFullWidth=\"true\"\n                    app:tabMaxWidth=\"0dp\"\n                    app:tabMode=\"scrollable\" />\n\n            </com.google.android.material.appbar.MaterialToolbar>\n\n        </com.google.android.material.appbar.AppBarLayout>\n\n        <androidx.viewpager2.widget.ViewPager2\n            android:id=\"@+id/viewPager\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:background=\"?attr/windowBackgroundColor\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n\n        <com.google.android.material.bottomappbar.BottomAppBar\n            android:id=\"@+id/bottomNav\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"@dimen/bottomAppBarHeight\"\n            android:layout_gravity=\"bottom\"\n            android:backgroundTint=\"?attr/colorSurface\"\n            app:buttonGravity=\"center_vertical\"\n            app:contentInsetStart=\"0dp\"\n            app:contentInsetStartWithNavigation=\"0dp\"\n            app:fabAlignmentMode=\"end\"\n            app:menuAlignmentMode=\"auto\"\n            app:navigationContentDescription=\"@string/action_open_drawer\">\n\n            <com.keylesspalace.tusky.view.AdaptiveTabLayout\n                android:id=\"@+id/bottomTabLayout\"\n                style=\"@style/TuskyTabAppearance\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"@dimen/bottomAppBarHeight\"\n                android:background=\"?attr/colorSurface\"\n                app:tabGravity=\"fill\"\n                app:tabIndicator=\"@drawable/tab_indicator_bottom\"\n                app:tabIndicatorFullWidth=\"true\"\n                app:tabIndicatorGravity=\"top\"\n                app:tabMode=\"scrollable\"\n                app:tabPaddingTop=\"0dp\" />\n\n        </com.google.android.material.bottomappbar.BottomAppBar>\n\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n            android:id=\"@+id/composeButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_margin=\"@dimen/fabMargin\"\n            android:contentDescription=\"@string/action_compose\"\n            app:layout_anchor=\"@id/viewPager\"\n            app:layout_anchorGravity=\"bottom|end\"\n            app:srcCompat=\"@drawable/ic_edit_24dp_filled\"\n            app:tint=\"?attr/colorOnPrimary\" />\n\n        <include layout=\"@layout/item_status_bottom_sheet\" />\n\n        <com.google.android.material.progressindicator.CircularProgressIndicator\n            android:id=\"@+id/progressBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:indeterminate=\"true\"\n            android:visibility=\"gone\" />\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n    <com.mikepenz.materialdrawer.widget.MaterialDrawerSliderView\n        android:id=\"@+id/mainDrawer\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"start\"\n        android:fitsSystemWindows=\"true\" />\n\n</androidx.drawerlayout.widget.DrawerLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_notification_policy.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".components.preference.notificationpolicies.NotificationPoliciesActivity\">\n\n    <include\n        android:id=\"@+id/includedToolbar\"\n        layout=\"@layout/toolbar_basic\" />\n\n    <androidx.fragment.app.FragmentContainerView\n        android:id=\"@+id/preferenceFragment\"\n        android:name=\"com.keylesspalace.tusky.components.preference.notificationpolicies.NotificationPoliciesFragment\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n\n    <com.keylesspalace.tusky.view.BackgroundMessageView\n        android:id=\"@+id/messageView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        tools:src=\"@drawable/errorphant_error\" />\n\n    <ProgressBar\n        android:id=\"@+id/progressBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_notification_request_details.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.keylesspalace.tusky.components.accountlist.AccountListActivity\">\n\n    <include\n        android:id=\"@+id/includedToolbar\"\n        layout=\"@layout/toolbar_basic\" />\n\n    <androidx.fragment.app.FragmentContainerView\n        android:id=\"@+id/fragmentContainer\"\n        android:name=\"com.keylesspalace.tusky.components.notifications.requests.details.NotificationRequestDetailsFragment\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n\n    <LinearLayout\n        android:id=\"@+id/bottomBar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"bottom\"\n        android:background=\"?attr/colorSurface\">\n\n        <Button\n            android:id=\"@+id/acceptButton\"\n            style=\"@style/TuskyButton\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginVertical=\"8dp\"\n            android:layout_marginStart=\"16dp\"\n            android:layout_marginEnd=\"8dp\"\n            android:layout_weight=\"1\"\n            android:text=\"@string/action_accept_notification_request\" />\n\n        <Button\n            android:id=\"@+id/dismissButton\"\n            style=\"@style/TuskyButton\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginVertical=\"8dp\"\n            android:layout_marginStart=\"8dp\"\n            android:layout_marginEnd=\"16dp\"\n            android:layout_weight=\"1\"\n            android:text=\"@string/action_dismiss_notification_request\" />\n\n    </LinearLayout>\n\n    <include layout=\"@layout/item_status_bottom_sheet\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_notification_requests.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.keylesspalace.tusky.components.notifications.requests.NotificationRequestsActivity\">\n\n    <include\n        android:id=\"@+id/includedToolbar\"\n        layout=\"@layout/toolbar_basic\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/notificationRequestsView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:clipToPadding=\"false\"\n        android:paddingBottom=\"@dimen/recyclerview_bottom_padding_no_actionbutton\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n        tools:itemCount=\"5\"\n        tools:listitem=\"@layout/item_notification_request\" />\n\n    <com.keylesspalace.tusky.view.BackgroundMessageView\n        android:id=\"@+id/notificationRequestsMessageView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n        tools:visibility=\"gone\" />\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/notificationRequestsProgressBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:indeterminate=\"true\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n        tools:visibility=\"gone\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_preferences.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.keylesspalace.tusky.components.preference.PreferencesActivity\">\n\n    <include\n        android:id=\"@+id/includedToolbar\"\n        layout=\"@layout/toolbar_basic\" />\n\n    <androidx.fragment.app.FragmentContainerView\n        android:id=\"@+id/fragment_container\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_report.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".components.report.ReportActivity\">\n\n    <include\n        android:id=\"@+id/includedToolbar\"\n        layout=\"@layout/toolbar_basic\" />\n\n    <androidx.viewpager2.widget.ViewPager2\n        android:id=\"@+id/wizard\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:overScrollMode=\"never\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n\n    <include layout=\"@layout/item_status_bottom_sheet\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_scheduled_status.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".components.scheduled.ScheduledStatusActivity\">\n\n    <include\n        android:id=\"@+id/includedToolbar\"\n        layout=\"@layout/toolbar_basic\" />\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n        <com.google.android.material.progressindicator.CircularProgressIndicator\n            android:id=\"@+id/progressBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            android:indeterminate=\"true\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\" />\n\n        <com.keylesspalace.tusky.view.TuskySwipeRefreshLayout\n            android:id=\"@+id/swipeRefreshLayout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <FrameLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\">\n\n                <androidx.recyclerview.widget.RecyclerView\n                    android:id=\"@+id/scheduledTootList\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\" />\n\n                <com.keylesspalace.tusky.view.BackgroundMessageView\n                    android:id=\"@+id/errorMessageView\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:layout_gravity=\"center\"\n                    android:visibility=\"gone\"\n                    tools:src=\"@drawable/errorphant_error\"\n                    tools:visibility=\"visible\" />\n            </FrameLayout>\n        </com.keylesspalace.tusky.view.TuskySwipeRefreshLayout>\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.keylesspalace.tusky.components.search.SearchActivity\">\n\n    <com.google.android.material.appbar.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:fitsSystemWindows=\"true\"\n        app:layout_collapseMode=\"pin\"\n        app:liftOnScroll=\"false\"\n        app:statusBarForeground=\"?attr/colorSurface\">\n\n        <com.google.android.material.appbar.MaterialToolbar\n            android:id=\"@+id/toolbar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:minHeight=\"?attr/actionBarSize\"\n            app:contentInsetStartWithNavigation=\"0dp\"\n            app:layout_scrollFlags=\"scroll|snap|enterAlways\" />\n\n        <com.google.android.material.tabs.TabLayout\n            android:id=\"@+id/tabs\"\n            style=\"@style/TuskyTabAppearance\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:tabGravity=\"fill\"\n            app:tabIndicator=\"@drawable/tab_indicator_top\"\n            app:tabIndicatorFullWidth=\"true\"\n            app:tabMaxWidth=\"0dp\"\n            app:tabMode=\"fixed\" />\n\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <androidx.viewpager2.widget.ViewPager2\n        android:id=\"@+id/pages\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n\n    <View\n        android:id=\"@+id/overlayPagesClickView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"@android:color/transparent\" />\n\n    <include layout=\"@layout/item_status_bottom_sheet\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_statuslist.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.keylesspalace.tusky.StatusListActivity\">\n\n    <include\n        android:id=\"@+id/includedToolbar\"\n        layout=\"@layout/toolbar_basic\" />\n\n    <androidx.fragment.app.FragmentContainerView\n        android:id=\"@+id/fragmentContainer\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n\n    <include layout=\"@layout/item_status_bottom_sheet\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_tab_preference.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <include\n        android:id=\"@+id/includedToolbar\"\n        layout=\"@layout/toolbar_basic\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/currentTabsRecyclerView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n        app:layout_constraintTop_toBottomOf=\"@id/appbar\" />\n\n    <View\n        android:id=\"@+id/scrim\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"?attr/scrimBackground\"\n        android:visibility=\"invisible\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/actionButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"bottom|end\"\n        android:layout_margin=\"@dimen/fabMargin\"\n        android:contentDescription=\"@string/action_add_tab\"\n        app:srcCompat=\"@drawable/ic_add_24dp\"\n        app:tint=\"?attr/colorOnPrimary\" />\n\n    <com.google.android.material.card.MaterialCardView\n        android:id=\"@+id/sheet\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"bottom|end\"\n        android:layout_margin=\"@dimen/fabMargin\"\n        android:visibility=\"invisible\"\n        app:strokeWidth=\"0dp\"\n        app:cardBackgroundColor=\"?attr/colorSurface\"\n        app:cardElevation=\"2dp\">\n\n        <LinearLayout\n            android:layout_width=\"240dp\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\">\n\n            <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/addTabRecyclerView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:overScrollMode=\"never\" />\n\n            <TextView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"48dp\"\n                android:layout_gravity=\"bottom\"\n                android:background=\"?attr/colorPrimary\"\n                android:drawablePadding=\"12dp\"\n                android:ellipsize=\"end\"\n                android:gravity=\"center_vertical\"\n                android:lines=\"1\"\n                android:paddingStart=\"8dp\"\n                android:paddingEnd=\"8dp\"\n                android:text=\"@string/action_add_tab\"\n                android:textColor=\"?attr/colorOnPrimary\"\n                android:textSize=\"?attr/status_text_large\"\n                app:drawableStartCompat=\"@drawable/ic_add_24dp\"\n                app:drawableTint=\"?attr/colorOnPrimary\" />\n        </LinearLayout>\n\n    </com.google.android.material.card.MaterialCardView>\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_trending.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.keylesspalace.tusky.components.trending.TrendingActivity\">\n\n    <include\n        android:id=\"@+id/includedToolbar\"\n        layout=\"@layout/toolbar_basic\" />\n\n    <androidx.fragment.app.FragmentContainerView\n        android:id=\"@+id/fragmentContainer\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n\n    <include layout=\"@layout/item_status_bottom_sheet\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_view_media.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@color/black\">\n\n    <androidx.viewpager2.widget.ViewPager2\n        android:id=\"@+id/viewPager\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <com.google.android.material.appbar.AppBarLayout\n        android:id=\"@+id/appBarLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@color/transparent_black\"\n        android:fitsSystemWindows=\"true\">\n\n        <com.google.android.material.appbar.MaterialToolbar\n            android:id=\"@+id/toolbar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@android:color/transparent\"\n            android:minHeight=\"?attr/actionBarSize\"\n            android:theme=\"@style/ViewMediaActivity.AppBarLayout\"\n            app:titleTextColor=\"@color/white\" />\n\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/progressBarShare\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:indeterminate=\"true\"\n        android:visibility=\"gone\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_view_thread.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"com.keylesspalace.tusky.components.viewthread.ViewThreadActivity\">\n\n    <include\n        android:id=\"@+id/includedToolbar\"\n        layout=\"@layout/toolbar_basic\" />\n\n    <androidx.fragment.app.FragmentContainerView\n        android:id=\"@+id/fragment_container\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n\n    <include layout=\"@layout/item_status_bottom_sheet\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/bottomsheet_confirmation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:paddingHorizontal=\"16dp\"\n    android:paddingBottom=\"16dp\">\n\n    <TextView\n        android:id=\"@+id/confirmTextView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"24dp\"\n        android:drawablePadding=\"8dp\"\n        android:textColor=\"?android:attr/textColorPrimary\"\n        android:textSize=\"24sp\"\n        app:drawableStartCompat=\"@drawable/ic_repeat_24dp\"\n        app:drawableTint=\"?attr/colorPrimary\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"@string/reblog_confirm\" />\n\n    <com.google.android.material.bottomsheet.BottomSheetDragHandleView\n        android:id=\"@+id/dragHandle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <com.google.android.material.textfield.TextInputLayout\n        android:id=\"@+id/reblogPrivacyLayout\"\n        style=\"@style/Widget.Material3.TextInputLayout.OutlinedBox.ExposedDropdownMenu\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"12dp\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/confirmTextView\">\n\n        <com.google.android.material.textfield.MaterialAutoCompleteTextView\n            android:id=\"@+id/reblogPrivacyDropdown\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:dropDownHeight=\"wrap_content\"\n            android:inputType=\"none\"\n            tools:text=\"public\" />\n\n    </com.google.android.material.textfield.TextInputLayout>\n\n    <Button\n        android:id=\"@+id/cancelButton\"\n        style=\"@style/TuskyButton.Outlined\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:text=\"@android:string/cancel\"\n        app:layout_constraintEnd_toStartOf=\"@id/confirm_button\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/reblogPrivacyLayout\" />\n\n    <Button\n        android:id=\"@+id/confirm_button\"\n        style=\"@style/TuskyButton\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginTop=\"8dp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/cancelButton\"\n        app:layout_constraintTop_toBottomOf=\"@id/reblogPrivacyLayout\"\n        tools:text=\"@string/action_reblog\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/card_license.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:layout_height=\"wrap_content\"\n    tools:layout_width=\"match_parent\"\n    tools:parentTag=\"com.google.android.material.card.MaterialCardView\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        android:orientation=\"vertical\"\n        android:paddingHorizontal=\"16dp\"\n        android:paddingVertical=\"8dp\">\n\n        <TextView\n            android:id=\"@+id/licenseCardName\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:fontFamily=\"sans-serif-medium\"\n            android:textColor=\"?android:attr/textColorSecondary\" />\n\n        <TextView\n            android:id=\"@+id/licenseCardLicense\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:textColor=\"?android:attr/textColorTertiary\" />\n\n        <TextView\n            android:id=\"@+id/licenseCardLink\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:textColor=\"?attr/colorPrimary\" />\n    </LinearLayout>\n\n</merge>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_add_poll.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.core.widget.NestedScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:paddingStart=\"16dp\"\n        android:paddingTop=\"8dp\"\n        android:paddingEnd=\"16dp\">\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/pollChoices\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:nestedScrollingEnabled=\"false\"\n            android:overScrollMode=\"never\"\n            app:layoutManager=\"androidx.recyclerview.widget.LinearLayoutManager\"\n            app:layout_constraintTop_toTopOf=\"parent\" />\n\n        <Button\n            android:id=\"@+id/addChoiceButton\"\n            style=\"@style/TuskyButton.Outlined\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"8dp\"\n            android:text=\"@string/add_poll_choice\"\n            app:layout_constraintBottom_toBottomOf=\"@id/pollDurationInputLayout\"\n            app:layout_constraintEnd_toStartOf=\"@id/pollDurationInputLayout\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"@id/pollDurationInputLayout\" />\n\n        <com.google.android.material.textfield.TextInputLayout\n            android:id=\"@+id/pollDurationInputLayout\"\n            style=\"@style/Widget.Material3.TextInputLayout.OutlinedBox.Dense.ExposedDropdownMenu\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"8dp\"\n            android:layout_marginTop=\"8dp\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toEndOf=\"@id/addChoiceButton\"\n            app:layout_constraintTop_toBottomOf=\"@id/pollChoices\">\n\n            <com.google.android.material.textfield.MaterialAutoCompleteTextView\n                android:id=\"@+id/pollDurationDropDown\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:inputType=\"none\" />\n\n        </com.google.android.material.textfield.TextInputLayout>\n\n        <CheckBox\n            android:id=\"@+id/multipleChoicesCheckBox\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"4dp\"\n            android:text=\"@string/poll_allow_multiple_choices\"\n            app:buttonTint=\"@color/compound_button_color\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/addChoiceButton\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</androidx.core.widget.NestedScrollView>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_filter.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:paddingLeft=\"20dp\"\n    android:paddingTop=\"16dp\"\n    android:paddingRight=\"20dp\">\n\n    <com.google.android.material.textfield.TextInputLayout\n        android:id=\"@+id/phraseInputLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:hint=\"@string/filter_add_description\"\n        app:layout_constraintTop_toTopOf=\"parent\">\n\n        <com.google.android.material.textfield.TextInputEditText\n            android:id=\"@+id/phraseEditText\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:importantForAutofill=\"no\"\n            android:inputType=\"text\" />\n\n    </com.google.android.material.textfield.TextInputLayout>\n\n    <CheckBox\n        android:id=\"@+id/phraseWholeWord\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"16dp\"\n        android:text=\"@string/filter_dialog_whole_word\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/phraseInputLayout\" />\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:text=\"@string/filter_dialog_whole_word_description\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/phraseWholeWord\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_focus.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <TextView\n        android:id=\"@+id/focusExplanation\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_horizontal\"\n        android:padding=\"24dp\"\n        android:gravity=\"center\"\n        android:textSize=\"18sp\"\n        android:text=\"@string/set_focus_description\" />\n\n    <FrameLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:id=\"@+id/imageContainer\">\n\n        <!-- todo add padding -->\n        <ImageView\n            android:id=\"@+id/imageView\"\n            android:contentDescription=\"@string/label_image\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n\n        <com.keylesspalace.tusky.components.compose.view.FocusIndicatorView\n            android:id=\"@+id/focusIndicator\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n\n    </FrameLayout>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/dialog_image_description.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:minHeight=\"400dp\"\n    android:orientation=\"vertical\">\n\n    <com.ortiz.touchview.TouchImageView\n        android:id=\"@+id/imageDescriptionView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_marginStart=\"?dialogPreferredPadding\"\n        android:layout_marginTop=\"?dialogPreferredPadding\"\n        android:layout_marginEnd=\"?dialogPreferredPadding\"\n        android:layout_weight=\"1\"\n        android:contentDescription=\"@string/post_media_image\" />\n\n    <com.google.android.material.textfield.TextInputLayout\n        style=\"@style/TuskyTextInput\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_marginStart=\"?dialogPreferredPadding\"\n        android:layout_marginTop=\"?dialogPreferredPadding\"\n        android:layout_marginEnd=\"?dialogPreferredPadding\"\n        android:layout_weight=\"1\"\n        app:counterEnabled=\"false\"\n        app:counterTextColor=\"?android:textColorTertiary\"\n        app:hintEnabled=\"false\">\n\n        <com.google.android.material.textfield.TextInputEditText\n            android:id=\"@+id/imageDescriptionText\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:gravity=\"start\"\n            android:importantForAutofill=\"no\"\n            android:inputType=\"textCapSentences|textMultiLine|textAutoCorrect\"\n            tools:hint=\"Description\" />\n\n    </com.google.android.material.textfield.TextInputLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:paddingLeft=\"20dp\"\n    android:paddingTop=\"16dp\"\n    android:paddingRight=\"20dp\">\n\n    <com.google.android.material.textfield.TextInputLayout\n        android:id=\"@+id/nameTextLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:hint=\"@string/hint_list_name\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\">\n\n        <com.google.android.material.textfield.TextInputEditText\n            android:id=\"@+id/nameText\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:importantForAutofill=\"no\"\n            android:inputType=\"text\" />\n\n    </com.google.android.material.textfield.TextInputLayout>\n\n    <com.google.android.material.checkbox.MaterialCheckBox\n        android:id=\"@+id/exclusiveCheckbox\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"16dp\"\n        android:text=\"@string/list_exclusive_label\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/nameTextLayout\" />\n\n    <com.google.android.material.textfield.TextInputLayout\n        android:id=\"@+id/replyPolicyInputLayout\"\n        style=\"@style/Widget.Material3.TextInputLayout.OutlinedBox.Dense.ExposedDropdownMenu\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"16dp\"\n        android:hint=\"@string/list_reply_policy_label\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/exclusiveCheckbox\">\n\n        <com.google.android.material.textfield.MaterialAutoCompleteTextView\n            android:id=\"@+id/replyPolicyDropDown\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:inputType=\"none\" />\n\n    </com.google.android.material.textfield.TextInputLayout>\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_mute_account.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:paddingLeft=\"20dp\"\n    android:paddingTop=\"20dp\"\n    android:paddingRight=\"20dp\">\n\n    <TextView\n        android:id=\"@+id/warning\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:paddingBottom=\"20dp\"\n        tools:text=\"@string/dialog_mute_warning\" />\n\n    <CheckBox\n        android:id=\"@+id/checkbox\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/dialog_mute_hide_notifications\"\n        android:textColor=\"@color/textColorTertiary\"\n        app:buttonTint=\"@color/compound_button_color\" />\n\n    <com.google.android.material.textfield.TextInputLayout\n        android:id=\"@+id/durationInputLayout\"\n        style=\"@style/Widget.Material3.TextInputLayout.OutlinedBox.Dense.ExposedDropdownMenu\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"16dp\"\n        android:hint=\"@string/label_duration\">\n\n        <com.google.android.material.textfield.MaterialAutoCompleteTextView\n            android:id=\"@+id/durationDropDown\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:inputType=\"none\" />\n\n    </com.google.android.material.textfield.TextInputLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_pick_hashtag.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingLeft=\"20dp\"\n    android:paddingTop=\"16dp\"\n    android:paddingRight=\"20dp\">\n\n    <com.google.android.material.textfield.TextInputLayout\n        android:id=\"@+id/pickHashtagInputLayout\"\n        style=\"@style/Widget.Material3.TextInputLayout.OutlinedBox.Dense.ExposedDropdownMenu\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:hint=\"@string/pick_hashtag_hint\"\n        app:endIconMode=\"none\">\n\n        <!-- textNoSuggestions is to disable spell check, it will auto-complete -->\n        <com.google.android.material.textfield.MaterialAutoCompleteTextView\n            android:id=\"@+id/pickHashtagEditText\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:completionThreshold=\"2\"\n            android:imeOptions=\"actionDone\"\n            android:inputType=\"textNoSuggestions\"\n            android:lines=\"1\" />\n\n    </com.google.android.material.textfield.TextInputLayout>\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/exo_player_control_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<!-- Copyright 2020 The Android Open Source Project\r\n\r\n     Licensed under the Apache License, Version 2.0 (the \"License\");\r\n     you may not use this file except in compliance with the License.\r\n     You may obtain a copy of the License at\r\n\r\n          http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n     Unless required by applicable law or agreed to in writing, software\r\n     distributed under the License is distributed on an \"AS IS\" BASIS,\r\n     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n     See the License for the specific language governing permissions and\r\n     limitations under the License.\r\n-->\r\n<!-- This file is \"magic\". Simply by existing in Tusky at this path, it overrides\r\n     the media3 default layout. This version is adapted from media3-ui-1.1.0. -->\r\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\">\r\n\r\n    <!-- 0dp dimensions are used to prevent this view from influencing the size of\r\n         the parent view if it uses \"wrap_content\". It is expanded to occupy the\r\n         entirety of the parent in code, after the parent's size has been\r\n         determined. See: https://github.com/google/ExoPlayer/issues/8726.\r\n    -->\r\n    <!-- Change from media3 default: hide \"dark curtain\" background element -->\r\n    <!--\r\n    <View android:id=\"@id/exo_controls_background\"\r\n        android:layout_width=\"0dp\"\r\n        android:layout_height=\"0dp\"\r\n        android:background=\"@color/exo_black_opacity_60\"/>\r\n    -->\r\n\r\n    <!-- Changes from media3 default: Background is gray rather than transparent; moved before (underneath on Z axis) exo_bottom_bar -->\r\n    <LinearLayout\r\n        android:id=\"@id/exo_center_controls\"\r\n        android:layout_width=\"match_parent\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_gravity=\"center\"\r\n        android:background=\"@color/exo_bottom_bar_background\"\r\n        android:gravity=\"center\"\r\n        android:padding=\"@dimen/exo_styled_controls_padding\"\r\n        android:clipToPadding=\"false\"\r\n        android:layoutDirection=\"ltr\">\r\n\r\n        <ImageButton android:id=\"@id/exo_prev\"\r\n            style=\"@style/ExoStyledControls.Button.Center.Previous\"/>\r\n\r\n        <include layout=\"@layout/exo_player_control_rewind_button\" />\r\n\r\n        <!-- Changes from media3 default: Different style to add more margins -->\r\n        <ImageButton android:id=\"@id/exo_play_pause\"\r\n            style=\"@style/TuskyExoPlayerPlayPause\"/>\r\n\r\n        <include layout=\"@layout/exo_player_control_ffwd_button\" />\r\n\r\n        <ImageButton android:id=\"@id/exo_next\"\r\n            style=\"@style/ExoStyledControls.Button.Center.Next\"/>\r\n\r\n    </LinearLayout>\r\n\r\n    <FrameLayout android:id=\"@id/exo_bottom_bar\"\r\n        android:layout_width=\"match_parent\"\r\n        android:layout_height=\"@dimen/exo_styled_bottom_bar_height\"\r\n        android:layout_marginTop=\"@dimen/exo_styled_bottom_bar_margin_top\"\r\n        android:layout_gravity=\"bottom\"\r\n        android:background=\"@color/exo_bottom_bar_background\"\r\n        android:layoutDirection=\"ltr\">\r\n\r\n        <LinearLayout android:id=\"@id/exo_time\"\r\n            android:layout_width=\"wrap_content\"\r\n            android:layout_height=\"wrap_content\"\r\n            android:paddingStart=\"@dimen/exo_styled_bottom_bar_time_padding\"\r\n            android:paddingEnd=\"@dimen/exo_styled_bottom_bar_time_padding\"\r\n            android:paddingLeft=\"@dimen/exo_styled_bottom_bar_time_padding\"\r\n            android:paddingRight=\"@dimen/exo_styled_bottom_bar_time_padding\"\r\n            android:layout_gravity=\"center_vertical|start\"\r\n            android:layoutDirection=\"ltr\">\r\n\r\n            <TextView android:id=\"@id/exo_position\"\r\n                style=\"@style/ExoStyledControls.TimeText.Position\"/>\r\n\r\n            <TextView\r\n                style=\"@style/ExoStyledControls.TimeText.Separator\"/>\r\n\r\n            <TextView android:id=\"@id/exo_duration\"\r\n                style=\"@style/ExoStyledControls.TimeText.Duration\"/>\r\n\r\n        </LinearLayout>\r\n\r\n        <LinearLayout android:id=\"@id/exo_basic_controls\"\r\n            android:layout_width=\"wrap_content\"\r\n            android:layout_height=\"wrap_content\"\r\n            android:layout_gravity=\"center_vertical|end\"\r\n            android:layoutDirection=\"ltr\">\r\n\r\n            <ImageButton android:id=\"@id/exo_vr\"\r\n                style=\"@style/ExoStyledControls.Button.Bottom.VR\"/>\r\n\r\n            <ImageButton android:id=\"@id/exo_shuffle\"\r\n                style=\"@style/ExoStyledControls.Button.Bottom.Shuffle\"/>\r\n\r\n            <ImageButton android:id=\"@id/exo_repeat_toggle\"\r\n                style=\"@style/ExoStyledControls.Button.Bottom.RepeatToggle\"/>\r\n\r\n            <ImageButton android:id=\"@id/exo_subtitle\"\r\n                style=\"@style/ExoStyledControls.Button.Bottom.CC\"/>\r\n\r\n            <ImageButton android:id=\"@id/exo_settings\"\r\n                style=\"@style/ExoStyledControls.Button.Bottom.Settings\"/>\r\n\r\n            <ImageButton android:id=\"@id/exo_fullscreen\"\r\n                style=\"@style/ExoStyledControls.Button.Bottom.FullScreen\"/>\r\n\r\n            <ImageButton android:id=\"@id/exo_overflow_show\"\r\n                style=\"@style/ExoStyledControls.Button.Bottom.OverflowShow\"/>\r\n\r\n        </LinearLayout>\r\n\r\n        <HorizontalScrollView android:id=\"@id/exo_extra_controls_scroll_view\"\r\n            android:layout_width=\"wrap_content\"\r\n            android:layout_height=\"wrap_content\"\r\n            android:layout_gravity=\"center_vertical|end\"\r\n            android:visibility=\"invisible\">\r\n\r\n            <LinearLayout android:id=\"@id/exo_extra_controls\"\r\n                android:layout_width=\"wrap_content\"\r\n                android:layout_height=\"wrap_content\"\r\n                android:layoutDirection=\"ltr\">\r\n\r\n                <ImageButton android:id=\"@id/exo_overflow_hide\"\r\n                    style=\"@style/ExoStyledControls.Button.Bottom.OverflowHide\"/>\r\n\r\n            </LinearLayout>\r\n\r\n        </HorizontalScrollView>\r\n\r\n    </FrameLayout>\r\n\r\n    <View android:id=\"@id/exo_progress_placeholder\"\r\n        android:layout_width=\"match_parent\"\r\n        android:layout_height=\"@dimen/exo_styled_progress_layout_height\"\r\n        android:layout_gravity=\"bottom\"\r\n        android:layout_marginBottom=\"@dimen/exo_styled_progress_margin_bottom\"/>\r\n\r\n    <LinearLayout android:id=\"@id/exo_minimal_controls\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_gravity=\"bottom|end\"\r\n        android:layout_marginBottom=\"@dimen/exo_styled_minimal_controls_margin_bottom\"\r\n        android:orientation=\"horizontal\"\r\n        android:gravity=\"center_vertical\"\r\n        android:layoutDirection=\"ltr\">\r\n\r\n        <ImageButton android:id=\"@id/exo_minimal_fullscreen\"\r\n            style=\"@style/ExoStyledControls.Button.Bottom.FullScreen\"/>\r\n\r\n    </LinearLayout>\r\n\r\n</merge>\r\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_account_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.keylesspalace.tusky.view.TuskySwipeRefreshLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/swipeRefreshLayout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <FrameLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/recyclerView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:clipToPadding=\"false\"\n            android:paddingBottom=\"@dimen/recyclerview_bottom_padding_no_actionbutton\" />\n\n        <com.google.android.material.progressindicator.CircularProgressIndicator\n            android:id=\"@+id/progressBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:indeterminate=\"true\" />\n\n        <com.keylesspalace.tusky.view.BackgroundMessageView\n            android:id=\"@+id/messageView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_gravity=\"center\" />\n    </FrameLayout>\n</com.keylesspalace.tusky.view.TuskySwipeRefreshLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_accounts_in_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:animateLayoutChanges=\"true\">\n\n    <androidx.appcompat.widget.SearchView\n        android:id=\"@+id/searchView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:imeOptions=\"actionSearch\"\n        android:lines=\"1\"\n        app:closeIcon=\"@drawable/ic_close_24dp\"\n        app:defaultQueryHint=\"@string/hint_search_people_list\"\n        app:iconifiedByDefault=\"false\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/accountsRecycler\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:layout_marginTop=\"8dp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/searchView\" />\n\n    <com.keylesspalace.tusky.view.BackgroundMessageView\n        android:id=\"@+id/messageView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:src=\"@android:color/transparent\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:src=\"@drawable/errorphant_error\"\n        tools:visibility=\"visible\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/accountsSearchRecycler\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:layout_marginTop=\"8dp\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/searchView\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_domain_blocks.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/progressBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:indeterminate=\"true\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/recyclerView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:clipToPadding=\"false\"\n        android:paddingBottom=\"@dimen/recyclerview_bottom_padding_no_actionbutton\" />\n\n    <com.keylesspalace.tusky.view.BackgroundMessageView\n        android:id=\"@+id/messageView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_lists_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/progressBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:indeterminate=\"true\"\n        android:visibility=\"gone\"\n        tools:visibility=\"gone\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/listsView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:visibility=\"gone\"\n        app:layoutManager=\"androidx.recyclerview.widget.LinearLayoutManager\"\n        tools:visibility=\"visible\" />\n\n    <com.keylesspalace.tusky.view.BackgroundMessageView\n        android:id=\"@+id/messageView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:src=\"@android:color/transparent\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:src=\"@drawable/errorphant_error\"\n        tools:visibility=\"visible\" />\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_notification_request_details.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/recyclerView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:clipToPadding=\"false\" />\n\n    <com.keylesspalace.tusky.view.BackgroundMessageView\n        android:id=\"@+id/statusView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:visibility=\"gone\" />\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/progressBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:indeterminate=\"true\" />\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_report_done.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".components.report.fragments.ReportStatusesFragment\">\n\n    <View\n        android:id=\"@+id/checkMark\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:layout_marginTop=\"56dp\"\n        android:background=\"@drawable/report_success_background\"\n        app:layout_constraintDimensionRatio=\"H,1:1\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintWidth_default=\"percent\"\n        app:layout_constraintWidth_percent=\"0.35\" />\n\n    <ImageView\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:scaleType=\"fitCenter\"\n        app:layout_constraintBottom_toBottomOf=\"@id/checkMark\"\n        app:layout_constraintEnd_toEndOf=\"@id/checkMark\"\n        app:layout_constraintHeight_percent=\"0.3\"\n        app:layout_constraintStart_toStartOf=\"@id/checkMark\"\n        app:layout_constraintTop_toTopOf=\"@id/checkMark\"\n        app:layout_constraintWidth_percent=\"0.22\"\n        app:srcCompat=\"@drawable/ic_check_24dp\"\n        tools:ignore=\"ContentDescription\" />\n\n    <TextView\n        android:id=\"@+id/textReported\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"48dp\"\n        android:gravity=\"center_horizontal\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_large\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/checkMark\"\n        app:layout_constraintWidth_percent=\"0.9\" />\n\n    <Button\n        android:id=\"@+id/buttonMute\"\n        style=\"@style/TuskyButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:minWidth=\"@dimen/min_report_button_width\"\n        android:text=\"@string/action_mute\"\n        app:layout_constraintBottom_toTopOf=\"@id/buttonBlock\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/textReported\"\n        app:layout_constraintVertical_chainStyle=\"packed\" />\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/progressMute\"\n        style=\"@style/Widget.Material3.CircularProgressIndicator.Small\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:indeterminate=\"true\"\n        app:layout_constraintBottom_toBottomOf=\"@id/buttonMute\"\n        app:layout_constraintEnd_toEndOf=\"@id/buttonMute\"\n        app:layout_constraintStart_toStartOf=\"@id/buttonMute\"\n        app:layout_constraintTop_toTopOf=\"@id/buttonMute\" />\n\n    <Button\n        android:id=\"@+id/buttonBlock\"\n        style=\"@style/TuskyButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:minWidth=\"@dimen/min_report_button_width\"\n        android:text=\"@string/action_block\"\n        app:layout_constraintBottom_toTopOf=\"@id/buttonDone\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/buttonMute\"\n        app:layout_constraintVertical_chainStyle=\"packed\" />\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/progressBlock\"\n        style=\"@style/Widget.Material3.CircularProgressIndicator.Small\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:indeterminate=\"true\"\n        app:layout_constraintBottom_toBottomOf=\"@id/buttonBlock\"\n        app:layout_constraintEnd_toEndOf=\"@id/buttonBlock\"\n        app:layout_constraintStart_toStartOf=\"@id/buttonBlock\"\n        app:layout_constraintTop_toTopOf=\"@id/buttonBlock\" />\n\n    <Button\n        android:id=\"@+id/buttonDone\"\n        style=\"@style/TuskyButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"32dp\"\n        android:minWidth=\"@dimen/min_report_button_width\"\n        android:text=\"@string/button_done\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/buttonBlock\"\n        app:layout_constraintVertical_chainStyle=\"packed\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_report_note.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".components.report.fragments.ReportStatusesFragment\">\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        app:layout_constraintBottom_toTopOf=\"@id/buttonReport\"\n        app:layout_constraintTop_toTopOf=\"parent\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <androidx.constraintlayout.widget.Guideline\n                android:id=\"@+id/guideBegin\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n                app:layout_constraintGuide_begin=\"16dp\" />\n\n            <androidx.constraintlayout.widget.Guideline\n                android:id=\"@+id/guideEnd\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n                app:layout_constraintGuide_end=\"16dp\" />\n\n            <TextView\n                android:id=\"@+id/reportDescription\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"16dp\"\n                android:lineSpacingMultiplier=\"1.1\"\n                android:text=\"@string/report_description_1\"\n                android:textColor=\"?android:textColorPrimary\"\n                android:textSize=\"?attr/status_text_small\"\n                app:layout_constraintEnd_toEndOf=\"@id/guideEnd\"\n                app:layout_constraintStart_toStartOf=\"@id/guideBegin\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n            <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/layoutAdditionalInfo\"\n                style=\"@style/TuskyTextInput\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"16dp\"\n                android:hint=\"@string/hint_additional_info\"\n                app:hintEnabled=\"true\"\n                app:layout_constraintEnd_toEndOf=\"@id/guideEnd\"\n                app:layout_constraintStart_toStartOf=\"@id/guideBegin\"\n                app:layout_constraintTop_toBottomOf=\"@id/reportDescription\">\n\n                <com.google.android.material.textfield.TextInputEditText\n                    android:id=\"@+id/editNote\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"top\"\n                    android:inputType=\"textCapSentences|textMultiLine\"\n                    android:minLines=\"4\" />\n\n            </com.google.android.material.textfield.TextInputLayout>\n\n            <TextView\n                android:id=\"@+id/reportDescriptionRemoteInstance\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"16dp\"\n                android:lineSpacingMultiplier=\"1.1\"\n                android:text=\"@string/report_description_remote_instance\"\n                android:textColor=\"?android:textColorPrimary\"\n                android:textSize=\"?attr/status_text_small\"\n                app:layout_constraintEnd_toEndOf=\"@id/guideEnd\"\n                app:layout_constraintStart_toStartOf=\"@id/guideBegin\"\n                app:layout_constraintTop_toBottomOf=\"@id/layoutAdditionalInfo\" />\n\n\n            <CheckBox\n                android:id=\"@+id/checkIsNotifyRemote\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"16dp\"\n                android:text=\"@string/report_remote_instance\"\n                android:textSize=\"?attr/status_text_medium\"\n                app:buttonTint=\"@color/compound_button_color\"\n                app:layout_constraintEnd_toEndOf=\"@id/guideEnd\"\n                app:layout_constraintStart_toStartOf=\"@id/guideBegin\"\n                app:layout_constraintTop_toBottomOf=\"@id/reportDescriptionRemoteInstance\" />\n\n            <com.google.android.material.progressindicator.CircularProgressIndicator\n                android:id=\"@+id/progressBar\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"48dp\"\n                android:indeterminate=\"true\"\n                android:visibility=\"gone\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@id/checkIsNotifyRemote\" />\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n    </ScrollView>\n\n    <Button\n        android:id=\"@+id/buttonBack\"\n        style=\"@style/TuskyButton.Outlined\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"16dp\"\n        android:text=\"@string/button_back\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintEnd_toStartOf=\"@id/buttonReport\"\n        tools:ignore=\"BackButton\" />\n\n    <Button\n        android:id=\"@+id/buttonReport\"\n        style=\"@style/TuskyButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"16dp\"\n        android:text=\"@string/action_report\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_report_statuses.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".components.report.fragments.ReportStatusesFragment\">\n\n    <com.keylesspalace.tusky.view.TuskySwipeRefreshLayout\n        android:id=\"@+id/swipeRefreshLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        app:layout_constraintBottom_toTopOf=\"@id/buttonContinue\"\n        app:layout_constraintTop_toTopOf=\"parent\">\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/recyclerView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n\n    </com.keylesspalace.tusky.view.TuskySwipeRefreshLayout>\n\n    <com.google.android.material.progressindicator.LinearProgressIndicator\n        android:id=\"@+id/progressBarTop\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:indeterminate=\"true\"\n        app:layout_constraintTop_toTopOf=\"@id/swipeRefreshLayout\" />\n\n    <com.google.android.material.progressindicator.LinearProgressIndicator\n        android:id=\"@+id/progressBarBottom\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:indeterminate=\"true\"\n        app:layout_constraintBottom_toBottomOf=\"@id/swipeRefreshLayout\" />\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/progressBarLoading\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:indeterminate=\"true\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@id/swipeRefreshLayout\"\n        app:layout_constraintEnd_toEndOf=\"@id/swipeRefreshLayout\"\n        app:layout_constraintStart_toStartOf=\"@id/swipeRefreshLayout\"\n        app:layout_constraintTop_toTopOf=\"@id/swipeRefreshLayout\" />\n\n    <Button\n        android:id=\"@+id/buttonCancel\"\n        style=\"@style/TuskyButton.Outlined\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"16dp\"\n        android:text=\"@android:string/cancel\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintEnd_toStartOf=\"@id/buttonContinue\" />\n\n    <Button\n        android:id=\"@+id/buttonContinue\"\n        style=\"@style/TuskyButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"16dp\"\n        android:text=\"@string/button_continue\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"@dimen/timeline_width\"\n    android:layout_height=\"match_parent\">\n\n    <com.keylesspalace.tusky.view.TuskySwipeRefreshLayout\n        android:id=\"@+id/swipeRefreshLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/searchRecyclerView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_gravity=\"center\"\n            android:background=\"?android:attr/windowBackground\"\n            android:clipToPadding=\"false\"\n            android:paddingBottom=\"@dimen/recyclerview_bottom_padding_no_actionbutton\"\n            tools:listitem=\"@layout/item_account\" />\n\n    </com.keylesspalace.tusky.view.TuskySwipeRefreshLayout>\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/searchProgressBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:indeterminate=\"true\"\n        android:visibility=\"gone\" />\n\n    <TextView\n        android:id=\"@+id/searchNoResultsText\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:text=\"@string/search_no_results\"\n        android:visibility=\"gone\" />\n\n    <com.google.android.material.progressindicator.LinearProgressIndicator\n        android:id=\"@+id/progressBarBottom\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"bottom\"\n        android:indeterminate=\"true\"\n        android:visibility=\"gone\" />\n\n</FrameLayout>\n\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_timeline.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"?android:attr/colorBackground\">\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/progressBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:indeterminate=\"true\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <com.keylesspalace.tusky.view.TuskySwipeRefreshLayout\n        android:id=\"@+id/swipeRefreshLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/recyclerView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:clipToPadding=\"false\" />\n\n    </com.keylesspalace.tusky.view.TuskySwipeRefreshLayout>\n\n    <com.keylesspalace.tusky.view.BackgroundMessageView\n        android:id=\"@+id/statusView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginBottom=\"?attr/actionBarSize\"\n        android:visibility=\"gone\"\n        tools:src=\"@drawable/errorphant_error\"\n        tools:visibility=\"visible\" />\n\n    <androidx.core.widget.ContentLoadingProgressBar\n        android:id=\"@+id/topProgressBar\"\n        style=\"@style/Widget.AppCompat.ProgressBar.Horizontal\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:indeterminate=\"true\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toTopOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_timeline_notifications.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright 2023 Tusky Contributors\n  ~\n  ~ This file is a part of Tusky.\n  ~\n  ~ This program is free software; you can redistribute it and/or modify it under the terms of the\n  ~ GNU General Public License as published by the Free Software Foundation; either version 3 of the\n  ~ License, or (at your option) any later version.\n  ~\n  ~ Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n  ~ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n  ~ Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License along with Tusky; if not,\n  ~ see <http://www.gnu.org/licenses>.\n  -->\n\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"?android:attr/colorBackground\">\n\n    <com.google.android.material.appbar.AppBarLayout\n        android:id=\"@+id/appBarOptions\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:liftOnScroll=\"false\">\n\n        <LinearLayout\n            android:id=\"@+id/topButtonsLayout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\">\n\n            <Button\n                android:id=\"@+id/buttonClear\"\n                style=\"@style/TuskyButton.TextButton\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"@string/notifications_clear\"\n                android:textSize=\"?attr/status_text_medium\" />\n\n            <Button\n                android:id=\"@+id/buttonFilter\"\n                style=\"@style/TuskyButton.TextButton\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:text=\"@string/notifications_apply_filter\"\n                android:textSize=\"?attr/status_text_medium\" />\n\n        </LinearLayout>\n\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <com.keylesspalace.tusky.view.TuskySwipeRefreshLayout\n        android:id=\"@+id/swipeRefreshLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/recyclerView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:clipToPadding=\"false\"\n            android:paddingBottom=\"@dimen/recyclerview_bottom_padding_actionbutton\" />\n\n    </com.keylesspalace.tusky.view.TuskySwipeRefreshLayout>\n\n    <com.keylesspalace.tusky.view.BackgroundMessageView\n        android:id=\"@+id/statusView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginBottom=\"?attr/actionBarSize\"\n        android:visibility=\"gone\" />\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/progressBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:indeterminate=\"true\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_trending_tags.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"?android:attr/colorBackground\">\n\n    <com.keylesspalace.tusky.view.TuskySwipeRefreshLayout\n        android:id=\"@+id/swipeRefreshLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/recyclerView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:clipToPadding=\"false\"\n            android:paddingBottom=\"@dimen/recyclerview_bottom_padding_no_actionbutton\" />\n\n    </com.keylesspalace.tusky.view.TuskySwipeRefreshLayout>\n\n    <com.keylesspalace.tusky.view.BackgroundMessageView\n        android:id=\"@+id/messageView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/progressBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:indeterminate=\"true\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_view_edits.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"?android:attr/colorBackground\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <ImageView\n                android:id=\"@+id/status_avatar\"\n                android:layout_width=\"48dp\"\n                android:layout_height=\"48dp\"\n                android:layout_marginStart=\"16dp\"\n                android:layout_marginTop=\"16dp\"\n                android:contentDescription=\"@string/action_view_profile\"\n                android:importantForAccessibility=\"no\"\n                android:scaleType=\"centerCrop\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                tools:src=\"@drawable/avatar_default\" />\n\n            <ImageView\n                android:id=\"@+id/status_avatar_inset\"\n                android:layout_width=\"24dp\"\n                android:layout_height=\"24dp\"\n                android:contentDescription=\"@null\"\n                android:importantForAccessibility=\"no\"\n                android:visibility=\"gone\"\n                app:layout_constraintBottom_toBottomOf=\"@id/status_avatar\"\n                app:layout_constraintEnd_toEndOf=\"@id/status_avatar\"\n                tools:src=\"#000\"\n                tools:visibility=\"visible\" />\n\n            <TextView\n                android:id=\"@+id/status_display_name\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"14dp\"\n                android:ellipsize=\"end\"\n                android:importantForAccessibility=\"no\"\n                android:maxLines=\"1\"\n                android:textColor=\"?android:textColorPrimary\"\n                android:textSize=\"?attr/status_text_large\"\n                android:textStyle=\"normal|bold\"\n                app:layout_constrainedWidth=\"true\"\n                app:layout_constraintStart_toEndOf=\"@id/status_avatar\"\n                app:layout_constraintTop_toTopOf=\"@+id/status_avatar\"\n                tools:ignore=\"SelectableText\"\n                tools:text=\"Ente r the void you foooooo\" />\n\n            <TextView\n                android:id=\"@+id/status_username\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:ellipsize=\"end\"\n                android:importantForAccessibility=\"no\"\n                android:maxLines=\"1\"\n                android:textColor=\"?android:textColorSecondary\"\n                android:textSize=\"?attr/status_text_medium\"\n                app:layout_constraintStart_toStartOf=\"@+id/status_display_name\"\n                app:layout_constraintTop_toBottomOf=\"@id/status_display_name\"\n                tools:ignore=\"SelectableText\"\n                tools:text=\"\\@Entenhausen@birbsarecooooooooooool.site\" />\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n        <com.keylesspalace.tusky.view.TuskySwipeRefreshLayout\n            android:id=\"@+id/swipeRefreshLayout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0dp\"\n            android:layout_marginTop=\"8dp\"\n            android:layout_weight=\"1\"\n            app:layout_behavior=\"com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@+id/status_avatar\"\n            app:layout_constraintVertical_weight=\"1\">\n\n            <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/recyclerView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:clipToPadding=\"false\"\n                android:paddingBottom=\"@dimen/recyclerview_bottom_padding_no_actionbutton\"\n                android:scrollbarStyle=\"outsideInset\"\n                android:scrollbars=\"vertical\" />\n        </com.keylesspalace.tusky.view.TuskySwipeRefreshLayout>\n    </LinearLayout>\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/initialProgressBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:contentDescription=\"@string/a11y_label_loading_thread\"\n        android:indeterminate=\"true\"\n        android:visibility=\"gone\" />\n\n    <com.keylesspalace.tusky.view.BackgroundMessageView\n        android:id=\"@+id/statusView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:visibility=\"gone\">\n\n    </com.keylesspalace.tusky.view.BackgroundMessageView>\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_view_image.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:clickable=\"true\"\n    android:focusable=\"true\">\n\n    <com.ortiz.touchview.TouchImageView\n        android:id=\"@+id/photoView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/progressBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_centerVertical=\"true\"\n        android:layout_gravity=\"center\"\n        android:indeterminate=\"true\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <!--    This should be inside CoordinatorLayout for two reasons:\n\n            1. TouchImageView really wants some constraints ans has no size otherwise\n            2. We don't want sheet to overlap with appbar but the only way to do it with autosizing\n            is to gibe parent some margin. -->\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_marginTop=\"70dp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\">\n\n        <LinearLayout\n            android:id=\"@+id/captionSheet\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@drawable/description_bg_expanded\"\n            android:orientation=\"vertical\"\n            app:behavior_peekHeight=\"@dimen/media_description_sheet_peek_height\"\n            app:layout_behavior=\"com.google.android.material.bottomsheet.BottomSheetBehavior\">\n\n            <com.google.android.material.bottomsheet.BottomSheetDragHandleView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\" />\n\n            <androidx.core.widget.NestedScrollView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n\n                <TextView\n                    android:id=\"@+id/mediaDescription\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:hyphenationFrequency=\"full\"\n                    android:lineSpacingMultiplier=\"1.1\"\n                    android:paddingLeft=\"8dp\"\n                    android:paddingRight=\"8dp\"\n                    android:paddingBottom=\"@dimen/media_description_sheet_bottom_padding\"\n                    android:textColor=\"?android:textColorPrimary\"\n                    android:textIsSelectable=\"true\"\n                    android:textSize=\"?attr/status_text_medium\"\n                    tools:text=\"Some media description which might get quite long so that it won't easily fit in one line\" />\n            </androidx.core.widget.NestedScrollView>\n        </LinearLayout>\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_view_thread.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\">\n\n        <com.google.android.material.progressindicator.LinearProgressIndicator\n            android:id=\"@+id/threadProgressBar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:contentDescription=\"@string/a11y_label_loading_thread\"\n            android:indeterminate=\"true\"\n            android:visibility=\"gone\" />\n\n        <com.keylesspalace.tusky.view.TuskySwipeRefreshLayout\n            android:id=\"@+id/swipeRefreshLayout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0dp\"\n            android:layout_weight=\"1\"\n            app:layout_behavior=\"com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior\">\n\n            <FrameLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\">\n\n                <androidx.recyclerview.widget.RecyclerView\n                    android:id=\"@+id/recyclerView\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:background=\"?android:attr/colorBackground\"\n                    android:clipToPadding=\"false\"\n                    android:paddingBottom=\"@dimen/recyclerview_bottom_padding_no_actionbutton\"\n                    android:scrollbarStyle=\"outsideOverlay\"\n                    android:scrollbars=\"vertical\" />\n\n                <com.keylesspalace.tusky.view.BackgroundMessageView\n                    android:id=\"@+id/statusView\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:layout_gravity=\"center\"\n                    android:visibility=\"gone\" />\n            </FrameLayout>\n        </com.keylesspalace.tusky.view.TuskySwipeRefreshLayout>\n    </LinearLayout>\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/initialProgressBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:contentDescription=\"@string/a11y_label_loading_thread\"\n        android:indeterminate=\"true\"\n        android:visibility=\"gone\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_view_video.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/videoContainer\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:clickable=\"true\"\n    android:focusable=\"true\">\n\n    <androidx.media3.ui.PlayerView\n        android:id=\"@+id/videoView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        app:hide_on_touch=\"false\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:show_next_button=\"false\"\n        app:show_previous_button=\"false\"\n        app:show_timeout=\"0\"\n        app:use_controller=\"false\" />\n\n    <ScrollView\n        android:id=\"@+id/mediaDescriptionScrollView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_marginTop=\"?attr/actionBarSize\"\n        android:layout_marginBottom=\"160dp\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintBottom_toBottomOf=\"parent\">\n\n        <TextView\n            android:id=\"@+id/mediaDescriptionTextView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"#60000000\"\n            android:hyphenationFrequency=\"full\"\n            android:lineSpacingMultiplier=\"1.1\"\n            android:padding=\"8dp\"\n            android:textAlignment=\"center\"\n            android:textColor=\"#eee\"\n            android:textSize=\"?attr/status_text_medium\"\n            tools:text=\"Some media description\" />\n\n    </ScrollView>\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/progressBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:indeterminate=\"true\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_account.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/account_container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"72dp\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:paddingStart=\"16dp\"\n    android:paddingEnd=\"16dp\">\n\n    <ImageView\n        android:id=\"@+id/account_avatar\"\n        android:layout_width=\"48dp\"\n        android:layout_height=\"48dp\"\n        android:layout_marginEnd=\"24dp\"\n        android:contentDescription=\"@string/action_view_profile\"\n        android:foregroundGravity=\"center_vertical\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:src=\"@drawable/avatar_default\" />\n\n    <ImageView\n        android:id=\"@+id/account_bot_badge\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:contentDescription=\"@null\"\n        android:importantForAccessibility=\"no\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@id/account_avatar\"\n        app:layout_constraintEnd_toEndOf=\"@id/account_avatar\"\n        app:srcCompat=\"@drawable/bot_badge\"\n        tools:src=\"#000\"\n        tools:visibility=\"visible\" />\n\n    <TextView\n        android:id=\"@+id/account_display_name\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_large\"\n        android:textStyle=\"normal|bold\"\n        app:layout_constraintBottom_toTopOf=\"@id/account_username\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/account_avatar\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintVertical_chainStyle=\"packed\"\n        tools:text=\"Display name\" />\n\n    <TextView\n        android:id=\"@+id/account_username\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/account_avatar\"\n        app:layout_constraintTop_toBottomOf=\"@id/account_display_name\"\n        tools:text=\"\\@username\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_account_field.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingTop=\"4dp\">\n\n    <!-- 30% width for the field name, 70% for the value -->\n    <TextView\n        android:id=\"@+id/accountFieldName\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:fontFamily=\"sans-serif-medium\"\n        android:gravity=\"center\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:textDirection=\"firstStrong\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintWidth_percent=\".3\"\n        tools:text=\"Field title\" />\n\n    <TextView\n        android:id=\"@+id/accountFieldValue\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"12dp\"\n        android:drawablePadding=\"6dp\"\n        android:gravity=\"center\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textIsSelectable=\"true\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:textDirection=\"firstStrong\"\n        app:layout_constrainedWidth=\"true\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@+id/accountFieldName\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"Field content. This can contain links and custom emojis\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_account_media.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <com.keylesspalace.tusky.components.account.media.SquareImageView\n        android:id=\"@+id/accountMediaImageView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:scaleType=\"centerCrop\" />\n\n    <ImageView\n        android:id=\"@+id/accountMediaImageViewOverlay\"\n        tools:ignore=\"ContentDescription\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\" />\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_add_poll_option.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <com.google.android.material.textfield.TextInputLayout\n        android:id=\"@+id/optionTextInputLayout\"\n        style=\"@style/TuskyTextInput\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_weight=\"1\">\n\n        <com.google.android.material.textfield.TextInputEditText\n            android:id=\"@+id/optionEditText\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\" />\n\n    </com.google.android.material.textfield.TextInputLayout>\n\n    <ImageButton\n        android:id=\"@+id/deleteButton\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"32dp\"\n        android:layout_height=\"32dp\"\n        android:layout_gravity=\"bottom\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginBottom=\"8dp\"\n        android:contentDescription=\"@string/action_remove\"\n        app:srcCompat=\"@drawable/ic_close_24dp\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_announcement.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <TextView\n        android:id=\"@+id/text\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:padding=\"8dp\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <com.google.android.material.chip.ChipGroup\n        android:id=\"@+id/chipGroup\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:padding=\"8dp\"\n        app:layout_constraintBottom_toTopOf=\"@id/announcementDate\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/text\">\n\n        <com.google.android.material.chip.Chip\n            android:id=\"@+id/addReactionChip\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:checkable=\"false\"\n            android:contentDescription=\"@string/action_add_reaction\"\n            android:textColor=\"?attr/colorOnPrimary\"\n            app:chipBackgroundColor=\"?attr/colorPrimary\"\n            app:chipIcon=\"@drawable/ic_add_24dp\"\n            app:chipIconTint=\"?attr/colorOnPrimary\"\n            app:chipStrokeWidth=\"0dp\"\n            app:closeIconEnabled=\"false\"\n            app:textEndPadding=\"0dp\"\n            app:textStartPadding=\"0dp\" />\n\n    </com.google.android.material.chip.ChipGroup>\n\n    <TextView\n        android:id=\"@+id/announcementDate\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:paddingHorizontal=\"8dp\"\n        android:paddingBottom=\"8dp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/chipGroup\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_autocomplete_account.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingStart=\"16dp\"\n    android:paddingTop=\"8dp\"\n    android:paddingEnd=\"16dp\"\n    android:paddingBottom=\"8dp\">\n\n    <ImageView\n        android:id=\"@+id/avatar\"\n        android:layout_width=\"48dp\"\n        android:layout_height=\"48dp\"\n        android:layout_marginEnd=\"24dp\"\n        android:foregroundGravity=\"center_vertical\"\n        android:importantForAccessibility=\"no\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:src=\"@drawable/avatar_default\" />\n\n    <ImageView\n        android:id=\"@+id/avatarBadge\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:contentDescription=\"@string/profile_badge_bot_text\"\n        app:layout_constraintBottom_toBottomOf=\"@id/avatar\"\n        app:layout_constraintEnd_toEndOf=\"@id/avatar\"\n        app:srcCompat=\"@drawable/bot_badge\" />\n\n    <TextView\n        android:id=\"@+id/displayName\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_large\"\n        android:textStyle=\"normal|bold\"\n        app:layout_constraintBottom_toTopOf=\"@id/username\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/avatar\"\n        app:layout_constraintTop_toTopOf=\"@id/avatar\"\n        app:layout_constraintVertical_chainStyle=\"packed\"\n        tools:text=\"Display name\" />\n\n    <TextView\n        android:id=\"@+id/username\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintBottom_toBottomOf=\"@id/avatar\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/avatar\"\n        app:layout_constraintTop_toBottomOf=\"@id/displayName\"\n        tools:text=\"\\@username\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_autocomplete_emoji.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\"\n    tools:ignore=\"UseCompoundDrawables\">\n\n    <ImageView\n        android:id=\"@+id/preview\"\n        android:layout_width=\"40dp\"\n        android:layout_height=\"40dp\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginBottom=\"8dp\"\n        android:importantForAccessibility=\"no\" />\n\n    <TextView\n        android:id=\"@+id/shortcode\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_weight=\"1\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_large\"\n        android:textStyle=\"normal|bold\"\n        tools:text=\":mastodon:\" />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_autocomplete_hashtag.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/hashtag\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:ellipsize=\"end\"\n    android:maxLines=\"1\"\n    android:paddingHorizontal=\"16dp\"\n    android:paddingVertical=\"12dp\"\n    android:textSize=\"?attr/status_text_medium\"\n    android:textStyle=\"normal|bold\"\n    tools:text=\"#Tusky\" />\n"
  },
  {
    "path": "app/src/main/res/layout/item_blocked_domain.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"72dp\"\n    android:gravity=\"center_vertical\"\n    android:paddingLeft=\"16dp\"\n    android:paddingRight=\"16dp\"\n    >\n\n    <ImageButton\n        android:id=\"@+id/blocked_domain_unblock\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"32dp\"\n        android:layout_height=\"32dp\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        android:contentDescription=\"@string/action_unmute\"\n        android:padding=\"4dp\"\n        app:srcCompat=\"@drawable/ic_volume_up_24dp\"\n        />\n\n    <TextView\n        android:id=\"@+id/blocked_domain\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        android:gravity=\"center_vertical\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        tools:text=\"instance.domain.tld\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_blocked_user.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"72dp\"\n    android:gravity=\"center_vertical\"\n    android:paddingStart=\"16dp\"\n    android:paddingEnd=\"16dp\">\n\n    <ImageView\n        android:id=\"@+id/blocked_user_avatar\"\n        android:layout_width=\"48dp\"\n        android:layout_height=\"48dp\"\n        android:contentDescription=\"@string/action_view_profile\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:src=\"@drawable/avatar_default\" />\n\n    <ImageView\n        android:id=\"@+id/blocked_user_bot_badge\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:contentDescription=\"@string/profile_badge_bot_text\"\n        app:layout_constraintBottom_toBottomOf=\"@id/blocked_user_avatar\"\n        app:layout_constraintEnd_toEndOf=\"@id/blocked_user_avatar\"\n        app:srcCompat=\"@drawable/bot_badge\" />\n\n    <TextView\n        android:id=\"@+id/blocked_user_display_name\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_large\"\n        android:textStyle=\"normal|bold\"\n        app:layout_constraintBottom_toTopOf=\"@id/blocked_user_username\"\n        app:layout_constraintEnd_toStartOf=\"@id/blocked_user_unblock\"\n        app:layout_constraintStart_toEndOf=\"@id/blocked_user_avatar\"\n        app:layout_constraintTop_toTopOf=\"@id/blocked_user_avatar\"\n        tools:text=\"Display name\" />\n\n    <TextView\n        android:id=\"@+id/blocked_user_username\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintBottom_toBottomOf=\"@id/blocked_user_avatar\"\n        app:layout_constraintEnd_toStartOf=\"@id/blocked_user_unblock\"\n        app:layout_constraintStart_toEndOf=\"@id/blocked_user_avatar\"\n        app:layout_constraintTop_toBottomOf=\"@id/blocked_user_display_name\"\n        tools:text=\"\\@username\" />\n\n    <ImageButton\n        android:id=\"@+id/blocked_user_unblock\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"32dp\"\n        android:layout_height=\"32dp\"\n        android:layout_alignParentEnd=\"true\"\n        android:layout_centerVertical=\"true\"\n        android:layout_marginStart=\"12dp\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        android:contentDescription=\"@string/action_unblock\"\n        android:padding=\"4dp\"\n        app:layout_constraintBottom_toBottomOf=\"@id/blocked_user_avatar\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@id/blocked_user_avatar\"\n        app:srcCompat=\"@drawable/ic_close_24dp\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_conversation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:sparkbutton=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/status_container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:clipChildren=\"false\"\n    android:clipToPadding=\"false\"\n    android:paddingStart=\"12dp\"\n    android:paddingEnd=\"14dp\">\n\n    <TextView\n        android:id=\"@+id/conversation_name\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"2dp\"\n        android:layout_marginTop=\"@dimen/status_reblogged_bar_padding_top\"\n        android:gravity=\"center_vertical\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:textStyle=\"normal|bold\"\n        app:layout_constraintLeft_toRightOf=\"parent\"\n        app:layout_constraintRight_toLeftOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"ConnyDuck boosted\"\n        tools:visibility=\"visible\" />\n\n    <ImageView\n        android:id=\"@+id/status_avatar_2\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"52dp\"\n        android:layout_marginTop=\"22dp\"\n        android:background=\"@drawable/avatar_border\"\n        android:contentDescription=\"@string/action_view_profile\"\n        android:padding=\"2dp\"\n        android:scaleType=\"centerCrop\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@id/status_avatar_1\"\n        tools:src=\"@drawable/avatar_default\" />\n\n    <ImageView\n        android:id=\"@+id/status_avatar_1\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"52dp\"\n        android:layout_marginTop=\"22dp\"\n        android:background=\"@drawable/avatar_border\"\n        android:contentDescription=\"@string/action_view_profile\"\n        android:padding=\"2dp\"\n        android:scaleType=\"centerCrop\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@id/status_avatar\"\n        tools:src=\"@drawable/avatar_default\" />\n\n    <ImageView\n        android:id=\"@+id/status_avatar\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"52dp\"\n        android:layout_marginTop=\"14dp\"\n        android:background=\"@drawable/avatar_border\"\n        android:contentDescription=\"@string/action_view_profile\"\n        android:padding=\"2dp\"\n        android:scaleType=\"centerCrop\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/conversation_name\"\n        tools:src=\"@drawable/avatar_default\" />\n\n    <ImageView\n        android:id=\"@+id/status_avatar_inset\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:contentDescription=\"@null\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@id/status_avatar\"\n        app:layout_constraintEnd_toEndOf=\"@id/status_avatar\"\n        tools:src=\"#000\"\n        tools:visibility=\"visible\" />\n\n    <TextView\n        android:id=\"@+id/status_display_name\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"10dp\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:textStyle=\"normal|bold\"\n        app:layout_constrainedWidth=\"true\"\n        app:layout_constraintEnd_toStartOf=\"@id/status_meta_info\"\n        app:layout_constraintHorizontal_bias=\"0\"\n        app:layout_constraintStart_toEndOf=\"@id/status_avatar\"\n        app:layout_constraintTop_toBottomOf=\"@id/conversation_name\"\n        tools:text=\"Ente r the void you foooooo\" />\n\n    <TextView\n        android:id=\"@+id/status_username\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:paddingStart=\"@dimen/status_display_name_padding_end\"\n        android:paddingEnd=\"@dimen/status_display_name_padding_end\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toStartOf=\"@id/status_meta_info\"\n        app:layout_constraintStart_toEndOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toTopOf=\"@id/status_display_name\"\n        tools:text=\"\\@Entenhausen@birbsarecooooooooooool.site\" />\n\n    <TextView\n        android:id=\"@+id/status_meta_info\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"4dp\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@id/status_display_name\"\n        tools:text=\"13:37\" />\n\n    <com.keylesspalace.tusky.view.ClickableSpanTextView\n        android:id=\"@+id/status_content_warning_description\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:visibility=\"gone\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_display_name\"\n        tools:text=\"content warning which is very long and it doesn't fit\"\n        tools:visibility=\"visible\" />\n\n    <Button\n        android:id=\"@+id/status_content_warning_button\"\n        style=\"@style/TuskyButton.Outlined\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:minWidth=\"150dp\"\n        android:minHeight=\"0dp\"\n        android:paddingLeft=\"16dp\"\n        android:paddingTop=\"4dp\"\n        android:paddingRight=\"16dp\"\n        android:paddingBottom=\"4dp\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:visibility=\"gone\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_content_warning_description\"\n        tools:text=\"@string/post_content_warning_show_more\"\n        tools:visibility=\"visible\" />\n\n    <com.keylesspalace.tusky.view.ClickableSpanTextView\n        android:id=\"@+id/status_content\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:focusable=\"true\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@id/status_content_warning_button\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_content_warning_button\"\n        tools:text=\"This is a status\" />\n\n    <Button\n        android:id=\"@+id/button_toggle_content\"\n        style=\"@style/TuskyButton.Outlined\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:minWidth=\"150dp\"\n        android:minHeight=\"0dp\"\n        android:paddingLeft=\"16dp\"\n        android:paddingTop=\"4dp\"\n        android:paddingRight=\"16dp\"\n        android:paddingBottom=\"4dp\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:visibility=\"gone\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_content\"\n        tools:text=\"@string/post_content_show_less\"\n        tools:visibility=\"visible\" />\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/status_media_preview_container\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"@dimen/status_media_preview_margin_top\"\n        android:background=\"@drawable/media_preview_outline\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/button_toggle_content\"\n        tools:visibility=\"gone\">\n\n        <include layout=\"@layout/item_media_preview\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/status_poll_options\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:nestedScrollingEnabled=\"false\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_media_preview_container\" />\n\n    <LinearLayout\n        android:id=\"@+id/status_poll_button_container\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"2dp\"\n        android:orientation=\"horizontal\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_poll_options\">\n\n        <Button\n            android:id=\"@+id/status_poll_button\"\n            style=\"@style/TuskyButton.Outlined\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\"\n            android:gravity=\"center\"\n            android:minHeight=\"0dp\"\n            android:paddingLeft=\"16dp\"\n            android:paddingTop=\"4dp\"\n            android:paddingRight=\"16dp\"\n            android:paddingBottom=\"4dp\"\n            android:text=\"@string/poll_vote\"\n            android:textSize=\"?attr/status_text_medium\" />\n\n        <Button\n            android:id=\"@+id/status_poll_results_button\"\n            style=\"@style/TuskyButton.Outlined\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_marginStart=\"6dp\"\n            android:layout_weight=\"1\"\n            android:gravity=\"center\"\n            android:minHeight=\"0dp\"\n            android:paddingLeft=\"16dp\"\n            android:paddingTop=\"4dp\"\n            android:paddingRight=\"16dp\"\n            android:paddingBottom=\"4dp\"\n            android:text=\"@string/poll_show_results\"\n            android:textSize=\"?attr/status_text_medium\" />\n\n    </LinearLayout>\n\n    <TextView\n        android:id=\"@+id/status_poll_description\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"6dp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_poll_button_container\"\n        tools:text=\"7 votes • 7 hours remaining\" />\n\n    <ImageButton\n        android:id=\"@+id/status_reply\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:layout_marginStart=\"-14dp\"\n        android:layout_marginTop=\"2dp\"\n        android:contentDescription=\"@string/action_reply\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toStartOf=\"@id/status_favourite\"\n        app:layout_constraintHorizontal_chainStyle=\"spread_inside\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_poll_description\"\n        app:srcCompat=\"@drawable/ic_reply_24dp\" />\n\n    <at.connyduck.sparkbutton.SparkButton\n        android:id=\"@+id/status_favourite\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:clipToPadding=\"false\"\n        android:contentDescription=\"@string/action_favourite\"\n        app:layout_constraintEnd_toStartOf=\"@id/status_bookmark\"\n        app:layout_constraintStart_toEndOf=\"@id/status_reply\"\n        app:layout_constraintTop_toTopOf=\"@id/status_reply\"\n        sparkbutton:activeImage=\"@drawable/ic_star_24dp_filled\"\n        sparkbutton:iconSize=\"24dp\"\n        sparkbutton:inactiveImage=\"@drawable/ic_star_24dp\"\n        sparkbutton:primaryColor=\"@color/tusky_orange\"\n        sparkbutton:secondaryColor=\"@color/tusky_orange_light\" />\n\n    <at.connyduck.sparkbutton.SparkButton\n        android:id=\"@+id/status_bookmark\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:clipToPadding=\"false\"\n        android:contentDescription=\"@string/action_bookmark\"\n        android:importantForAccessibility=\"no\"\n        app:layout_constraintEnd_toStartOf=\"@id/status_more\"\n        app:layout_constraintStart_toEndOf=\"@id/status_favourite\"\n        app:layout_constraintTop_toTopOf=\"@id/status_reply\"\n        sparkbutton:activeImage=\"@drawable/ic_bookmark_24dp_filled\"\n        sparkbutton:iconSize=\"24dp\"\n        sparkbutton:inactiveImage=\"@drawable/ic_bookmark_24dp\"\n        sparkbutton:primaryColor=\"@color/tusky_green_dark\"\n        sparkbutton:secondaryColor=\"@color/tusky_green_light\" />\n\n    <ImageButton\n        android:id=\"@+id/status_more\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:contentDescription=\"@string/action_more\"\n        app:layout_constraintBottom_toBottomOf=\"@id/status_reply\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/status_bookmark\"\n        app:layout_constraintTop_toTopOf=\"@id/status_reply\"\n        app:srcCompat=\"@drawable/ic_more_horiz_24dp\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_draft.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginBottom=\"8dp\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:paddingTop=\"4dp\"\n    android:paddingBottom=\"4dp\">\n\n    <TextView\n        android:id=\"@+id/draftSendingInfo\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:drawablePadding=\"4dp\"\n        android:fontFamily=\"sans-serif-medium\"\n        android:gravity=\"center_vertical\"\n        android:text=\"@string/drafts_post_failed_to_send\"\n        android:textColor=\"@color/tusky_red\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:drawableStartCompat=\"@drawable/ic_error_24dp\"\n        app:drawableTint=\"@color/tusky_red\"\n        app:layout_constraintEnd_toStartOf=\"@id/deleteButton\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/contentWarning\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:fontFamily=\"sans-serif-medium\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toStartOf=\"@id/deleteButton\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/draftSendingInfo\"\n        tools:text=\"Some content warning\" />\n\n    <TextView\n        android:id=\"@+id/content\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toStartOf=\"@id/deleteButton\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/contentWarning\"\n        tools:text=\"Some post content. May be very long.\" />\n\n    <ImageButton\n        android:id=\"@+id/deleteButton\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"32dp\"\n        android:layout_height=\"32dp\"\n        android:layout_gravity=\"center_vertical\"\n        android:layout_margin=\"12dp\"\n        android:contentDescription=\"@string/action_delete\"\n        android:padding=\"4dp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintVertical_bias=\"0\"\n        app:srcCompat=\"@drawable/ic_close_24dp\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/draftMediaPreview\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"8dp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"0\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/content\" />\n\n    <com.keylesspalace.tusky.components.compose.view.PollPreviewView\n        android:id=\"@+id/draftPoll\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginTop=\"8dp\"\n        android:minWidth=\"@dimen/poll_preview_min_width\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/draftMediaPreview\"\n        app:layout_goneMarginEnd=\"8dp\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_edit_field.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.google.android.material.card.MaterialCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginStart=\"16dp\"\n    app:strokeColor=\"?android:textColorTertiary\"\n    android:layout_marginEnd=\"16dp\"\n    android:layout_marginBottom=\"8dp\"\n    android:orientation=\"horizontal\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?android:colorBackground\"\n        android:orientation=\"vertical\"\n        android:paddingStart=\"16dp\"\n        android:paddingTop=\"8dp\"\n        android:paddingEnd=\"16dp\"\n        android:paddingBottom=\"8dp\">\n\n        <com.google.android.material.textfield.TextInputLayout\n            style=\"@style/TuskyTextInput\"\n            android:id=\"@+id/accountFieldNameTextLayout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:hint=\"@string/profile_metadata_label_label\"\n            app:counterTextColor=\"?android:textColorTertiary\">\n\n            <com.google.android.material.textfield.TextInputEditText\n                android:id=\"@+id/accountFieldNameText\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:importantForAutofill=\"no\" />\n\n        </com.google.android.material.textfield.TextInputLayout>\n\n        <com.google.android.material.textfield.TextInputLayout\n            style=\"@style/TuskyTextInput\"\n            android:id=\"@+id/accountFieldValueTextLayout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"4dp\"\n            android:hint=\"@string/profile_metadata_content_label\"\n            app:counterTextColor=\"?android:textColorTertiary\">\n\n            <com.google.android.material.textfield.TextInputEditText\n                android:id=\"@+id/accountFieldValueText\"\n                android:lineSpacingMultiplier=\"1.1\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:importantForAutofill=\"no\" />\n\n        </com.google.android.material.textfield.TextInputLayout>\n\n    </LinearLayout>\n\n</com.google.android.material.card.MaterialCardView>\n"
  },
  {
    "path": "app/src/main/res/layout/item_emoji_button.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ImageView xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/composeEmojiButton\"\n    android:background=\"?attr/selectableItemBackgroundBorderless\"\n    android:layout_width=\"40dp\"\n    android:layout_height=\"40dp\"\n    android:layout_margin=\"4dp\"\n    android:padding=\"4dp\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    tools:ignore=\"ContentDescription\" />"
  },
  {
    "path": "app/src/main/res/layout/item_filtered_notifications_info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:paddingHorizontal=\"14dp\"\n    android:paddingVertical=\"16dp\">\n\n    <TextView\n        android:id=\"@+id/notification_policy_summary_title\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n        android:text=\"@string/filtered_notifications\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textStyle=\"normal|bold\"\n        app:layout_constraintEnd_toStartOf=\"@id/notification_policy_summary_badge\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/notification_policy_summary_description\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n        android:textColor=\"?android:textColorSecondary\"\n        app:layout_constraintEnd_toStartOf=\"@id/notification_policy_summary_badge\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/notification_policy_summary_title\"\n        tools:text=\"@string/notifications_from_people_you_may_know\" />\n\n    <TextView\n        android:id=\"@+id/notification_policy_summary_badge\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@drawable/badge_background\"\n        android:paddingHorizontal=\"8dp\"\n        android:paddingVertical=\"4dp\"\n        android:textColor=\"?attr/colorOnPrimary\"\n        android:textStyle=\"normal|bold\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"24\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_follow.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingStart=\"14dp\"\n    android:paddingEnd=\"14dp\"\n    android:paddingBottom=\"8dp\">\n\n    <TextView\n        android:id=\"@+id/notificationText\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:drawablePadding=\"@dimen/status_info_drawable_padding_large\"\n        android:ellipsize=\"end\"\n        android:gravity=\"center_vertical\"\n        android:maxLines=\"1\"\n        android:paddingStart=\"@dimen/status_info_padding_large\"\n        android:paddingEnd=\"0dp\"\n        android:textColor=\"?android:textColorTertiary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:drawableStartCompat=\"@drawable/ic_person_add_24dp_mirrored_filled\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"Someone followed you\" />\n\n    <ImageView\n        android:id=\"@+id/notificationAvatar\"\n        android:layout_width=\"48dp\"\n        android:layout_height=\"48dp\"\n        android:layout_centerVertical=\"false\"\n        android:layout_marginTop=\"10dp\"\n        android:contentDescription=\"@string/action_view_profile\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/notificationText\"\n        tools:src=\"@drawable/avatar_default\" />\n\n    <ImageView\n        android:id=\"@+id/avatarBadge\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:contentDescription=\"@string/profile_badge_bot_text\"\n        app:layout_constraintBottom_toBottomOf=\"@id/notificationAvatar\"\n        app:layout_constraintEnd_toEndOf=\"@id/notificationAvatar\"\n        app:srcCompat=\"@drawable/bot_badge\" />\n\n    <TextView\n        android:id=\"@+id/notificationDisplayName\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"6dp\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:textStyle=\"normal|bold\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@+id/notificationAvatar\"\n        app:layout_constraintTop_toBottomOf=\"@id/notificationText\"\n        tools:text=\"Display name\" />\n\n    <TextView\n        android:id=\"@+id/notificationUsername\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/notificationAvatar\"\n        app:layout_constraintTop_toBottomOf=\"@id/notificationDisplayName\"\n        tools:text=\"\\@username\" />\n\n    <com.keylesspalace.tusky.view.ClickableSpanTextView\n        android:id=\"@+id/accountNote\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:hyphenationFrequency=\"full\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@+id/notificationUsername\"\n        app:layout_constraintTop_toBottomOf=\"@+id/notificationUsername\"\n        tools:text=\"Account note\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_follow_request.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingStart=\"?android:attr/listPreferredItemPaddingStart\"\n    android:paddingEnd=\"?android:attr/listPreferredItemPaddingEnd\"\n    android:paddingBottom=\"8dp\">\n\n    <TextView\n        android:id=\"@+id/notificationTextView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:drawablePadding=\"@dimen/status_info_drawable_padding_large\"\n        android:ellipsize=\"end\"\n        android:gravity=\"center_vertical\"\n        android:maxLines=\"1\"\n        android:paddingStart=\"@dimen/status_info_padding_large\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:drawableStartCompat=\"@drawable/ic_person_add_24dp_mirrored_filled\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:ignore=\"RtlSymmetry\"\n        tools:text=\"Someone requested to follow you\" />\n\n    <ImageView\n        android:id=\"@+id/avatar\"\n        android:layout_width=\"48dp\"\n        android:layout_height=\"48dp\"\n        android:layout_centerVertical=\"false\"\n        android:layout_marginTop=\"10dp\"\n        android:contentDescription=\"@string/action_view_profile\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/notificationTextView\"\n        tools:src=\"@drawable/avatar_default\" />\n\n    <ImageView\n        android:id=\"@+id/avatarBadge\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:contentDescription=\"@string/profile_badge_bot_text\"\n        app:layout_constraintBottom_toBottomOf=\"@id/avatar\"\n        app:layout_constraintEnd_toEndOf=\"@id/avatar\"\n        app:srcCompat=\"@drawable/bot_badge\" />\n\n    <TextView\n        android:id=\"@+id/displayNameTextView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"6dp\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:textStyle=\"normal|bold\"\n        app:layout_constraintEnd_toStartOf=\"@id/rejectButton\"\n        app:layout_constraintStart_toEndOf=\"@+id/avatar\"\n        app:layout_constraintTop_toBottomOf=\"@id/notificationTextView\"\n        tools:text=\"Display name\" />\n\n    <TextView\n        android:id=\"@+id/usernameTextView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toStartOf=\"@+id/rejectButton\"\n        app:layout_constraintStart_toEndOf=\"@id/avatar\"\n        app:layout_constraintTop_toBottomOf=\"@id/displayNameTextView\"\n        tools:text=\"\\@username\" />\n\n    <ImageButton\n        android:id=\"@+id/rejectButton\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:layout_marginStart=\"12dp\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        android:contentDescription=\"@string/action_reject\"\n        android:padding=\"4dp\"\n        app:layout_constraintBottom_toBottomOf=\"@id/avatar\"\n        app:layout_constraintEnd_toStartOf=\"@id/acceptButton\"\n        app:layout_constraintStart_toEndOf=\"@id/displayNameTextView\"\n        app:layout_constraintTop_toBottomOf=\"@+id/notificationTextView\"\n        app:srcCompat=\"@drawable/ic_close_24dp\" />\n\n    <ImageButton\n        android:id=\"@+id/acceptButton\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:layout_marginEnd=\"4dp\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        android:contentDescription=\"@string/action_accept\"\n        android:padding=\"4dp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@+id/rejectButton\"\n        app:srcCompat=\"@drawable/ic_check_24dp\" />\n\n    <com.keylesspalace.tusky.view.ClickableSpanTextView\n        android:id=\"@+id/account_note\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:hyphenationFrequency=\"full\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"@+id/acceptButton\"\n        app:layout_constraintStart_toStartOf=\"@+id/usernameTextView\"\n        app:layout_constraintTop_toBottomOf=\"@+id/rejectButton\"\n        tools:text=\"Account note\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_follow_requests_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:hyphenationFrequency=\"normal\"\n    android:lineSpacingMultiplier=\"1.1\"\n    android:paddingStart=\"16dp\"\n    android:paddingTop=\"8dp\"\n    android:paddingEnd=\"16dp\"\n    android:paddingBottom=\"8dp\"\n    tools:text=\"@string/follow_requests_info\" />\n"
  },
  {
    "path": "app/src/main/res/layout/item_followed_hashtag.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:minHeight=\"?android:attr/listPreferredItemHeightSmall\"\n    android:gravity=\"center_vertical\"\n    android:paddingStart=\"?android:attr/listPreferredItemPaddingStart\"\n    android:paddingEnd=\"?android:attr/listPreferredItemPaddingEnd\"\n    >\n\n    <TextView\n        android:id=\"@+id/followed_tag\"\n        android:layout_width=\"0dp\"\n        android:layout_weight=\"1\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center_vertical\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceListItemSmall\"\n        tools:text=\"hashtag\" />\n\n    <ImageButton\n        android:id=\"@+id/followed_tag_unfollow\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"32dp\"\n        android:layout_height=\"32dp\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        android:contentDescription=\"@string/action_unfollow\"\n        android:padding=\"4dp\"\n        app:srcCompat=\"@drawable/ic_person_remove_24dp_mirrored\"\n        />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_hashtag.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- Copied from android.R.layout.simple_list_item_1, because view binding does not work with\n     android.R.layout.* -->\n\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@android:id/text1\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:textAppearance=\"?android:attr/textAppearanceListItemSmall\"\n    android:gravity=\"center_vertical\"\n    android:paddingStart=\"?android:attr/listPreferredItemPaddingStart\"\n    android:paddingEnd=\"?android:attr/listPreferredItemPaddingEnd\"\n    android:minHeight=\"?android:attr/listPreferredItemHeightSmall\"\n    android:background=\"?attr/selectableItemBackground\"\n    tools:ignore=\"SelectableText\" />\n"
  },
  {
    "path": "app/src/main/res/layout/item_image_preview_overlay.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <com.keylesspalace.tusky.view.MediaPreviewImageView\n        android:id=\"@+id/preview_image_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:importantForAccessibility=\"no\"\n        tools:ignore=\"RtlSymmetry\"\n        tools:visibility=\"visible\" />\n\n    <TextView\n        android:id=\"@+id/preview_media_description_indicator\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:textColor=\"?android:attr/textColorSecondary\"\n        android:textSize=\"?attr/status_text_small\"\n        android:background=\"@drawable/media_warning_bg\"\n        android:contentDescription=\"@null\"\n        android:paddingLeft=\"5dp\"\n        android:paddingTop=\"3dp\"\n        android:paddingRight=\"5dp\"\n        android:paddingBottom=\"3dp\"\n        android:layout_margin=\"3dp\"\n        android:visibility=\"gone\"\n        android:text=\"@string/post_media_alt\"\n        app:layout_constraintEnd_toEndOf=\"@+id/preview_image_view\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/preview_image_view\"\n        app:tint=\"@color/white\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingLeft=\"?dialogPreferredPadding\"\n    android:paddingRight=\"?dialogPreferredPadding\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\"\n    android:minHeight=\"?android:attr/listPreferredItemHeightSmall\"\n    android:paddingStart=\"?android:attr/listPreferredItemPaddingStart\"\n    android:paddingEnd=\"?android:attr/listPreferredItemPaddingEnd\"\n    android:background=\"?attr/selectableItemBackground\"\n    tools:ignore=\"Overdraw\">\n\n    <TextView\n        android:id=\"@+id/list_name\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_weight=\"1\"\n        android:drawablePadding=\"8dp\"\n        android:gravity=\"center_vertical\"\n        android:textAppearance=\"?android:attr/textAppearanceListItemSmall\"\n        app:drawableStartCompat=\"@drawable/ic_list_alt_24dp\"\n        app:drawableTint=\"?android:attr/textColorSecondary\"\n        tools:text=\"Example list\" />\n\n    <ImageButton\n        android:id=\"@+id/more_button\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"32dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"8dp\"\n        android:background=\"?selectableItemBackgroundBorderless\"\n        android:contentDescription=\"@string/action_more\"\n        android:visibility=\"gone\"\n        app:srcCompat=\"@drawable/ic_more_horiz_24dp\" />\n\n    <ImageButton\n        android:id=\"@+id/add_button\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"32dp\"\n        android:layout_height=\"32dp\"\n        android:layout_marginStart=\"8dp\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        android:contentDescription=\"@string/action_add_to_list\"\n        android:visibility=\"gone\"\n        app:srcCompat=\"@drawable/ic_add_24dp\" />\n\n    <ImageButton\n        android:id=\"@+id/remove_button\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"32dp\"\n        android:layout_height=\"32dp\"\n        android:layout_marginStart=\"8dp\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        android:contentDescription=\"@string/action_remove_from_list\"\n        android:visibility=\"gone\"\n        app:srcCompat=\"@drawable/ic_close_24dp\" />\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_load_more.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"72dp\"\n    android:background=\"@color/dividerColorOther\">\n\n    <Button\n        android:id=\"@+id/loadMoreButton\"\n        style=\"@style/TuskyButton.TextButton\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:insetTop=\"0dp\"\n        android:insetBottom=\"0dp\"\n        android:text=\"@string/load_more_placeholder_text\"\n        android:textSize=\"?attr/status_text_large\"\n        android:textStyle=\"bold\" />\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/loadMoreProgressBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:indeterminate=\"true\" />\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_media_preview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:parentTag=\"androidx.constraintlayout.widget.ConstraintLayout\">\n\n    <com.keylesspalace.tusky.view.MediaPreviewLayout\n        android:id=\"@+id/status_media_preview\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        app:layout_constraintEnd_toStartOf=\"@+id/status_media_preview_1\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <ImageView\n        android:id=\"@+id/status_sensitive_media_button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"3dp\"\n        android:background=\"@drawable/media_warning_bg\"\n        android:contentDescription=\"@null\"\n        android:padding=\"@dimen/status_sensitive_media_button_padding\"\n        android:visibility=\"gone\"\n        app:layout_constraintStart_toStartOf=\"@+id/status_media_preview_container\"\n        app:layout_constraintTop_toTopOf=\"@+id/status_media_preview_container\"\n        app:srcCompat=\"@drawable/ic_visibility_24dp\"\n        app:tint=\"?android:attr/textColorSecondary\" />\n\n    <TextView\n        android:id=\"@+id/status_sensitive_media_warning\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@drawable/media_warning_bg\"\n        android:gravity=\"center\"\n        android:lineSpacingMultiplier=\"1.2\"\n        android:orientation=\"vertical\"\n        android:paddingLeft=\"12dp\"\n        android:paddingTop=\"8dp\"\n        android:paddingRight=\"12dp\"\n        android:paddingBottom=\"8dp\"\n        android:textAlignment=\"center\"\n        android:textColor=\"?android:attr/textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <com.google.android.material.card.MaterialCardView\n        android:id=\"@+id/status_media_label_container_0\"\n        style=\"@style/Widget.Material3.CardView.Filled\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\">\n\n        <TextView\n            android:id=\"@+id/status_media_label_0\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"?attr/selectableItemBackground\"\n            android:drawablePadding=\"4dp\"\n            android:ellipsize=\"end\"\n            android:gravity=\"center_vertical\"\n            android:importantForAccessibility=\"no\"\n            android:lineSpacingMultiplier=\"1.1\"\n            android:maxLines=\"10\"\n            android:paddingHorizontal=\"8dp\"\n            android:paddingVertical=\"4dp\"\n            android:textColor=\"?android:attr/textColorPrimary\"\n            android:textSize=\"?attr/status_text_medium\"\n            app:drawableTint=\"?android:attr/textColorPrimary\" />\n\n    </com.google.android.material.card.MaterialCardView>\n\n    <com.google.android.material.card.MaterialCardView\n        android:id=\"@+id/status_media_label_container_1\"\n        style=\"@style/Widget.Material3.CardView.Filled\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_media_label_container_0\">\n\n        <TextView\n            android:id=\"@+id/status_media_label_1\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"?attr/selectableItemBackground\"\n            android:drawablePadding=\"4dp\"\n            android:ellipsize=\"end\"\n            android:gravity=\"center_vertical\"\n            android:importantForAccessibility=\"no\"\n            android:lineSpacingMultiplier=\"1.1\"\n            android:maxLines=\"10\"\n            android:paddingHorizontal=\"8dp\"\n            android:paddingVertical=\"4dp\"\n            android:textColor=\"?android:attr/textColorPrimary\"\n            android:textSize=\"?attr/status_text_medium\"\n            app:drawableTint=\"?android:attr/textColorPrimary\" />\n\n    </com.google.android.material.card.MaterialCardView>\n\n    <com.google.android.material.card.MaterialCardView\n        android:id=\"@+id/status_media_label_container_2\"\n        style=\"@style/Widget.Material3.CardView.Filled\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_media_label_container_1\">\n\n        <TextView\n            android:id=\"@+id/status_media_label_2\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"4dp\"\n            android:background=\"?attr/selectableItemBackground\"\n            android:drawablePadding=\"4dp\"\n            android:ellipsize=\"end\"\n            android:gravity=\"center_vertical\"\n            android:importantForAccessibility=\"no\"\n            android:lineSpacingMultiplier=\"1.1\"\n            android:maxLines=\"10\"\n            android:paddingHorizontal=\"8dp\"\n            android:paddingVertical=\"4dp\"\n            android:textColor=\"?android:attr/textColorPrimary\"\n            android:textSize=\"?attr/status_text_medium\"\n            app:drawableTint=\"?android:attr/textColorPrimary\" />\n\n    </com.google.android.material.card.MaterialCardView>\n\n    <com.google.android.material.card.MaterialCardView\n        android:id=\"@+id/status_media_label_container_3\"\n        style=\"@style/Widget.Material3.CardView.Filled\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_media_label_container_2\">\n\n        <TextView\n            android:id=\"@+id/status_media_label_3\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"?attr/selectableItemBackground\"\n            android:drawablePadding=\"4dp\"\n            android:ellipsize=\"end\"\n            android:gravity=\"center_vertical\"\n            android:importantForAccessibility=\"no\"\n            android:lineSpacingMultiplier=\"1.1\"\n            android:maxLines=\"10\"\n            android:paddingHorizontal=\"8dp\"\n            android:paddingVertical=\"4dp\"\n            android:textColor=\"?android:attr/textColorPrimary\"\n            android:textSize=\"?attr/status_text_medium\"\n            app:drawableTint=\"?android:attr/textColorPrimary\" />\n\n    </com.google.android.material.card.MaterialCardView>\n\n</merge>\n"
  },
  {
    "path": "app/src/main/res/layout/item_moderation_warning_notification.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingStart=\"14dp\"\n    android:paddingTop=\"8dp\"\n    android:paddingEnd=\"14dp\"\n    android:paddingBottom=\"8dp\">\n\n    <ImageView\n        android:id=\"@+id/moderation_warning_icon\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:layout_marginStart=\"28dp\"\n        android:importantForAccessibility=\"no\"\n        android:src=\"@drawable/ic_gavel_24dp\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:tint=\"?android:textColorSecondary\" />\n\n    <TextView\n        android:id=\"@+id/moderation_warning_text\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"10dp\"\n        android:hyphenationFrequency=\"full\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:text=\"@string/moderation_warning\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/moderation_warning_icon\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/moderation_warning_description\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"10dp\"\n        android:hyphenationFrequency=\"full\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textColor=\"?android:textColorTertiary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/moderation_warning_icon\"\n        app:layout_constraintTop_toBottomOf=\"@id/moderation_warning_text\"\n        tools:text=\"@string/moderation_warning_action_none\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_muted_user.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingStart=\"16dp\"\n    android:paddingEnd=\"16dp\">\n\n    <ImageView\n        android:id=\"@+id/muted_user_avatar\"\n        android:layout_width=\"48dp\"\n        android:layout_height=\"48dp\"\n        android:layout_centerVertical=\"true\"\n        android:layout_marginTop=\"10dp\"\n        android:layout_marginBottom=\"10dp\"\n        android:contentDescription=\"@string/action_view_profile\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:src=\"@drawable/avatar_default\" />\n\n    <ImageView\n        android:id=\"@+id/muted_user_bot_badge\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:contentDescription=\"@string/profile_badge_bot_text\"\n        app:layout_constraintBottom_toBottomOf=\"@id/muted_user_avatar\"\n        app:layout_constraintEnd_toEndOf=\"@id/muted_user_avatar\"\n        app:srcCompat=\"@drawable/bot_badge\" />\n\n    <TextView\n        android:id=\"@+id/muted_user_display_name\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_large\"\n        android:textStyle=\"normal|bold\"\n        app:layout_constrainedWidth=\"true\"\n        app:layout_constraintBottom_toTopOf=\"@id/muted_user_username\"\n        app:layout_constraintEnd_toStartOf=\"@id/muted_user_unmute\"\n        app:layout_constraintStart_toEndOf=\"@id/muted_user_avatar\"\n        app:layout_constraintTop_toTopOf=\"@id/muted_user_avatar\"\n        tools:text=\"Display name\" />\n\n    <TextView\n        android:id=\"@+id/muted_user_username\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintBottom_toBottomOf=\"@id/muted_user_avatar\"\n        app:layout_constraintEnd_toEndOf=\"@id/muted_user_display_name\"\n        app:layout_constraintStart_toStartOf=\"@id/muted_user_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/muted_user_display_name\"\n        tools:text=\"\\@username\" />\n\n    <ImageButton\n        android:id=\"@+id/muted_user_unmute\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"48dp\"\n        android:layout_height=\"48dp\"\n        android:layout_marginStart=\"12dp\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        android:padding=\"4dp\"\n        app:layout_constraintBottom_toBottomOf=\"@id/muted_user_avatar\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:srcCompat=\"@drawable/ic_close_24dp\"\n        tools:ignore=\"ContentDescription\" />\n\n    <com.google.android.material.materialswitch.MaterialSwitch\n        android:id=\"@+id/muted_user_mute_notifications\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:text=\"@string/mute_notifications_switch\"\n        android:textColor=\"?android:textColorTertiary\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@id/muted_user_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/muted_user_username\"\n        app:switchPadding=\"8dp\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_network_state.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:gravity=\"center\"\n    android:padding=\"8dp\">\n\n    <TextView\n        android:id=\"@+id/errorMsg\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"/>\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/progressBar\"\n        android:layout_width=\"match_parent\"\n        android:indeterminate=\"true\"\n        android:layout_height=\"wrap_content\"/>\n\n    <Button\n        android:id=\"@+id/retryButton\"\n        style=\"@style/TuskyButton.TextButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/action_retry\"/>\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_notification_request.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingStart=\"16dp\"\n    android:paddingTop=\"10dp\"\n    android:paddingEnd=\"16dp\"\n    android:paddingBottom=\"10dp\">\n\n    <ImageView\n        android:id=\"@+id/notificationRequestAvatar\"\n        android:layout_width=\"48dp\"\n        android:layout_height=\"48dp\"\n        android:layout_centerVertical=\"true\"\n        android:importantForAccessibility=\"no\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:src=\"@drawable/avatar_default\" />\n\n    <TextView\n        android:id=\"@+id/notificationRequestBadge\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@drawable/badge_background\"\n        android:contentDescription=\"@string/profile_badge_bot_text\"\n        android:paddingHorizontal=\"8dp\"\n        android:textAlignment=\"center\"\n        android:textColor=\"?attr/colorOnPrimary\"\n        android:textStyle=\"bold\"\n        app:layout_constraintBottom_toBottomOf=\"@id/notificationRequestAvatar\"\n        app:layout_constraintEnd_toEndOf=\"@id/notificationRequestAvatar\"\n        tools:text=\"2\" />\n\n    <TextView\n        android:id=\"@+id/notificationRequestDisplayName\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_large\"\n        android:textStyle=\"normal|bold\"\n        app:layout_constrainedWidth=\"true\"\n        app:layout_constraintBottom_toTopOf=\"@id/notificationRequestUsername\"\n        app:layout_constraintEnd_toStartOf=\"@id/notificationRequestDismiss\"\n        app:layout_constraintStart_toEndOf=\"@id/notificationRequestAvatar\"\n        app:layout_constraintTop_toTopOf=\"@id/notificationRequestAvatar\"\n        tools:text=\"Display name\" />\n\n    <TextView\n        android:id=\"@+id/notificationRequestUsername\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintBottom_toBottomOf=\"@id/notificationRequestAvatar\"\n        app:layout_constraintEnd_toEndOf=\"@id/notificationRequestDisplayName\"\n        app:layout_constraintStart_toStartOf=\"@id/notificationRequestDisplayName\"\n        app:layout_constraintTop_toBottomOf=\"@id/notificationRequestDisplayName\"\n        tools:text=\"\\@username\" />\n\n    <ImageButton\n        android:id=\"@+id/notificationRequestDismiss\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"48dp\"\n        android:layout_height=\"48dp\"\n        android:layout_marginStart=\"12dp\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        android:contentDescription=\"@string/dismiss_notification_request\"\n        android:padding=\"4dp\"\n        app:layout_constraintBottom_toBottomOf=\"@id/notificationRequestAvatar\"\n        app:layout_constraintEnd_toStartOf=\"@id/notificationRequestAccept\"\n        app:layout_constraintTop_toTopOf=\"@id/notificationRequestAvatar\"\n        app:srcCompat=\"@drawable/ic_close_24dp\" />\n\n    <ImageButton\n        android:id=\"@+id/notificationRequestAccept\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"48dp\"\n        android:layout_height=\"48dp\"\n        android:layout_marginStart=\"12dp\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        android:contentDescription=\"@string/accept_notification_request\"\n        android:padding=\"4dp\"\n        app:layout_constraintBottom_toBottomOf=\"@id/notificationRequestAvatar\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@id/notificationRequestAvatar\"\n        app:srcCompat=\"@drawable/ic_check_24dp\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_notifications_load_state_footer_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2023 Tusky Contributors\n  ~\n  ~ This file is a part of Tusky.\n  ~\n  ~ This program is free software; you can redistribute it and/or modify it under the terms of the\n  ~ GNU General Public License as published by the Free Software Foundation; either version 3 of the\n  ~ License, or (at your option) any later version.\n  ~\n  ~ Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n  ~ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n  ~ Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License along with Tusky; if not,\n  ~ see <http://www.gnu.org/licenses>.\n  -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:padding=\"8dp\">\n\n    <androidx.core.widget.ContentLoadingProgressBar\n        android:id=\"@+id/progress_bar\"\n        style=\"?android:attr/progressBarStyle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" />\n\n    <TextView\n        android:id=\"@+id/error_msg\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:textAlignment=\"center\"\n        tools:text=\"@string/socket_timeout_exception\"/>\n\n    <Button\n        android:id=\"@+id/retry_button\"\n        style=\"@style/TuskyButton.Outlined\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:text=\"@string/action_retry\"/>\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_placeholder.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:sparkbutton=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:importantForAccessibility=\"noHideDescendants\">\n\n    <TextView\n        android:id=\"@+id/topPlaceholder\"\n        android:layout_width=\"200dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"14dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:background=\"@drawable/text_placeholder\"\n        android:lines=\"1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <ImageView\n        android:id=\"@+id/avatarPlaceholder\"\n        android:layout_width=\"@dimen/timeline_status_avatar_width\"\n        android:layout_height=\"@dimen/timeline_status_avatar_height\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"@dimen/account_avatar_margin\"\n        android:importantForAccessibility=\"no\"\n        android:src=\"@drawable/text_placeholder\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/topPlaceholder\" />\n\n    <TextView\n        android:id=\"@+id/namePlaceholder\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"14dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:background=\"@drawable/text_placeholder\"\n        android:lines=\"1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constrainedWidth=\"true\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/avatarPlaceholder\"\n        app:layout_constraintTop_toBottomOf=\"@id/topPlaceholder\" />\n\n    <TextView\n        android:id=\"@+id/contentPlaceholder\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"14dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:background=\"@drawable/text_placeholder\"\n        android:lines=\"3\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/avatarPlaceholder\"\n        app:layout_constraintTop_toBottomOf=\"@id/namePlaceholder\" />\n\n\n    <ImageButton\n        android:id=\"@+id/replyButtonPlaceholder\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:layout_marginStart=\"-14dp\"\n        android:layout_marginTop=\"2dp\"\n        android:clickable=\"false\"\n        android:importantForAccessibility=\"no\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toStartOf=\"@id/reblogButtonPlaceholder\"\n        app:layout_constraintHorizontal_chainStyle=\"spread_inside\"\n        app:layout_constraintStart_toStartOf=\"@id/namePlaceholder\"\n        app:layout_constraintTop_toBottomOf=\"@id/contentPlaceholder\"\n        app:srcCompat=\"@drawable/ic_reply_24dp\"\n        app:tint=\"?attr/placeholderColor\"\n        tools:ignore=\"NegativeMargin\" />\n\n    <ImageButton\n        android:id=\"@+id/reblogButtonPlaceholder\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:clickable=\"false\"\n        android:importantForAccessibility=\"no\"\n        app:layout_constraintEnd_toStartOf=\"@id/favouriteButtonPlaceholder\"\n        app:layout_constraintStart_toEndOf=\"@id/replyButtonPlaceholder\"\n        app:layout_constraintTop_toTopOf=\"@id/replyButtonPlaceholder\"\n        app:srcCompat=\"@drawable/ic_repeat_24dp\"\n        app:tint=\"?attr/placeholderColor\" />\n\n    <ImageButton\n        android:id=\"@+id/favouriteButtonPlaceholder\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:clickable=\"false\"\n        android:importantForAccessibility=\"no\"\n        app:layout_constraintEnd_toStartOf=\"@id/status_bookmark\"\n        app:layout_constraintStart_toEndOf=\"@id/reblogButtonPlaceholder\"\n        app:layout_constraintTop_toTopOf=\"@id/reblogButtonPlaceholder\"\n        app:srcCompat=\"@drawable/ic_star_24dp\"\n        app:tint=\"?attr/placeholderColor\" />\n\n    <ImageButton\n        android:id=\"@+id/status_bookmark\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:clickable=\"false\"\n        android:clipToPadding=\"false\"\n        android:importantForAccessibility=\"no\"\n        app:layout_constraintEnd_toStartOf=\"@id/moreButtonPlaceHolder\"\n        app:layout_constraintStart_toEndOf=\"@id/favouriteButtonPlaceholder\"\n        app:layout_constraintTop_toTopOf=\"@id/replyButtonPlaceholder\"\n        app:srcCompat=\"@drawable/ic_bookmark_24dp\"\n        app:tint=\"?attr/placeholderColor\"\n        sparkbutton:activeImage=\"@drawable/ic_bookmark_24dp_filled\" />\n\n    <ImageButton\n        android:id=\"@+id/moreButtonPlaceHolder\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:clickable=\"false\"\n        android:importantForAccessibility=\"no\"\n        app:layout_constraintBottom_toBottomOf=\"@id/replyButtonPlaceholder\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/status_bookmark\"\n        app:layout_constraintTop_toTopOf=\"@id/replyButtonPlaceholder\"\n        app:srcCompat=\"@drawable/ic_more_horiz_24dp\"\n        app:tint=\"?attr/placeholderColor\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_poll.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.google.android.material.card.MaterialCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginTop=\"6dp\"\n    app:cardCornerRadius=\"8dp\"\n    app:cardBackgroundColor=\"?android:attr/colorBackground\"\n    app:strokeColor=\"?attr/colorBackgroundAccent\">\n\n    <FrameLayout\n        android:id=\"@+id/pollLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingStart=\"4dp\"\n        android:paddingTop=\"4dp\"\n        android:paddingEnd=\"4dp\"\n        android:paddingBottom=\"4dp\">\n\n        <TextView\n            android:id=\"@+id/status_poll_option_result\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:ellipsize=\"end\"\n            android:lineSpacingMultiplier=\"1.1\"\n            android:maxLines=\"3\"\n            android:paddingStart=\"6dp\"\n            android:paddingEnd=\"6dp\"\n            android:textAlignment=\"viewStart\"\n            android:textColor=\"?android:attr/textColorPrimary\"\n            android:textSize=\"?attr/status_text_medium\"\n            tools:text=\"40%\" />\n\n        <RadioButton\n            android:id=\"@+id/status_poll_radio_button\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:lineSpacingMultiplier=\"1.1\"\n            android:paddingStart=\"4dp\"\n            android:paddingEnd=\"0dp\"\n            android:textColor=\"?android:attr/textColorPrimary\"\n            android:textSize=\"?attr/status_text_medium\"\n            app:buttonTint=\"@color/compound_button_color\"\n            tools:text=\"Option 1\" />\n\n        <CheckBox\n            android:id=\"@+id/status_poll_checkbox\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:lineSpacingMultiplier=\"1.1\"\n            android:paddingStart=\"4dp\"\n            android:paddingTop=\"2dp\"\n            android:paddingEnd=\"0dp\"\n            android:paddingBottom=\"2dp\"\n            android:textColor=\"?android:attr/textColorPrimary\"\n            android:textSize=\"?attr/status_text_medium\"\n            app:buttonTint=\"@color/compound_button_color\"\n            tools:text=\"Option 1\" />\n\n    </FrameLayout>\n</com.google.android.material.card.MaterialCardView>\n"
  },
  {
    "path": "app/src/main/res/layout/item_poll_preview_option.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:drawablePadding=\"4dp\"\n    android:ellipsize=\"end\"\n    android:focusableInTouchMode=\"false\"\n    android:gravity=\"center_vertical\"\n    android:lines=\"1\"\n    android:maxEms=\"20\"\n    app:drawableTint=\"?android:attr/textColorTertiary\" />"
  },
  {
    "path": "app/src/main/res/layout/item_preview_card.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<com.google.android.material.card.MaterialCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"0dp\"\n    android:layout_height=\"wrap_content\"\n    android:foreground=\"?attr/selectableItemBackground\"\n    android:id=\"@+id/status_card_view\"\n    style=\"@style/Widget.Material3.CardView.Filled\">\n\n    <LinearLayout\n        android:id=\"@+id/status_card_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:minHeight=\"@dimen/card_image_horizontal_width\"\n        android:gravity=\"center\"\n        android:orientation=\"vertical\">\n\n        <com.google.android.material.imageview.ShapeableImageView\n            android:id=\"@+id/card_image\"\n            android:layout_width=\"match_parent\"\n            android:layout_margin=\"1dp\"\n            android:layout_height=\"300dp\"\n            android:importantForAccessibility=\"no\"\n            android:scaleType=\"center\" />\n\n        <LinearLayout\n            android:id=\"@+id/card_info\"\n            android:paddingHorizontal=\"16dp\"\n            android:paddingVertical=\"8dp\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:gravity=\"center_vertical\"\n            android:orientation=\"vertical\">\n\n            <TextView\n                android:id=\"@+id/card_metadata\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"4dp\"\n                android:ellipsize=\"end\"\n                android:lineSpacingMultiplier=\"1.1\"\n                android:lines=\"1\"\n                android:textColor=\"?android:textColorSecondary\"\n                android:textSize=\"?attr/status_text_medium\" />\n\n            <TextView\n                android:id=\"@+id/card_title\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"4dp\"\n                android:ellipsize=\"end\"\n                android:fontFamily=\"sans-serif-medium\"\n                android:maxLines=\"2\"\n                android:textColor=\"?android:textColorSecondary\"\n                android:textSize=\"?attr/status_text_medium\" />\n\n            <TextView\n                android:id=\"@+id/card_author\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:ellipsize=\"end\"\n                android:lines=\"1\"\n                android:textColor=\"?android:textColorTertiary\"\n                android:textSize=\"?attr/status_text_medium\" />\n\n            <Button\n                android:id=\"@+id/card_author_button\"\n                style=\"@style/TuskyButton.TextButton\"\n                android:lineSpacingMultiplier=\"1.2\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                tools:text=\"more by Conny Duck\"/>\n\n        </LinearLayout>\n\n    </LinearLayout>\n</com.google.android.material.card.MaterialCardView>\n"
  },
  {
    "path": "app/src/main/res/layout/item_reblog_option.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- when using ConstraintLayout the dropdown this view is shown in gets sized wrong,\n     but it works with RelativeLayout ¯\\_(ツ)_/¯ -->\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:minHeight=\"72dp\"\n    android:paddingHorizontal=\"12dp\"\n    android:paddingVertical=\"6dp\">\n\n    <ImageView\n        android:id=\"@+id/reblogOptionIcon\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerVertical=\"true\"\n        android:importantForAccessibility=\"no\"\n        android:src=\"@drawable/ic_public_24dp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:tint=\"?android:attr/textColorPrimary\" />\n\n    <LinearLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentEnd=\"true\"\n        android:layout_centerVertical=\"true\"\n        android:layout_toEndOf=\"@id/reblogOptionIcon\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@+id/reblogOptionName\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"12dp\"\n            android:ellipsize=\"end\"\n            android:lines=\"1\"\n            android:textColor=\"?android:attr/textColorPrimary\"\n            android:textStyle=\"bold\"\n            tools:text=\"Public\" />\n\n        <TextView\n            android:id=\"@+id/reblogOptionDescription\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"12dp\"\n            android:layout_marginTop=\"4dp\"\n            android:ellipsize=\"end\"\n            android:lineSpacingMultiplier=\"1.1\"\n            android:maxLines=\"2\"\n            android:textColor=\"?android:attr/textColorTertiary\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            tools:text=\"Everywhere\" />\n    </LinearLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_removable.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"horizontal\">\n\n    <TextView\n        android:id=\"@+id/textPrimary\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"match_parent\"\n        android:layout_weight=\"0.91\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintEnd_toStartOf=\"@id/delete\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        android:paddingStart=\"8dp\"\n        android:paddingEnd=\"8dp\"\n        android:paddingTop=\"8dp\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:textColor=\"@color/textColorPrimary\"\n        />\n\n    <TextView\n        android:id=\"@+id/textSecondary\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"match_parent\"\n        android:layout_weight=\"0.91\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/textPrimary\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        android:paddingStart=\"8dp\"\n        android:paddingEnd=\"8dp\"\n        android:paddingBottom=\"8dp\"\n        android:textSize=\"?attr/status_text_small\"\n        android:textColor=\"@color/textColorTertiary\"\n        />\n\n    <ImageButton\n        android:id=\"@+id/delete\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"32dp\"\n        android:layout_height=\"32dp\"\n        android:layout_gravity=\"center_vertical\"\n        android:layout_margin=\"12dp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        android:contentDescription=\"@string/action_delete\"\n        android:padding=\"4dp\"\n        app:srcCompat=\"@drawable/ic_close_24dp\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_report_notification.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/notification_report\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"14dp\"\n    android:paddingEnd=\"14dp\"\n    android:paddingBottom=\"14dp\">\n\n    <TextView\n        android:id=\"@+id/notification_top_text\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:drawablePadding=\"@dimen/status_info_drawable_padding_large\"\n        android:ellipsize=\"end\"\n        android:gravity=\"center_vertical\"\n        android:maxLines=\"1\"\n        android:paddingStart=\"@dimen/status_info_padding_large\"\n        android:paddingEnd=\"0dp\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:drawableStartCompat=\"@drawable/ic_flag_24dp\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"Someone reported someone else\" />\n\n    <ImageView\n        android:id=\"@+id/notification_reportee_avatar\"\n        android:layout_width=\"48dp\"\n        android:layout_height=\"48dp\"\n        android:layout_marginTop=\"10dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:contentDescription=\"@string/action_view_profile\"\n        android:paddingEnd=\"12dp\"\n        android:paddingBottom=\"12dp\"\n        android:scaleType=\"centerCrop\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/notification_top_text\"\n        tools:ignore=\"RtlHardcoded,RtlSymmetry\"\n        tools:src=\"@drawable/avatar_default\" />\n\n    <ImageView\n        android:id=\"@+id/notification_reporter_avatar\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:contentDescription=\"@string/action_view_profile\"\n        app:layout_constraintBottom_toBottomOf=\"@id/notification_reportee_avatar\"\n        app:layout_constraintEnd_toEndOf=\"@id/notification_reportee_avatar\"\n        tools:src=\"@drawable/avatar_default\" />\n\n    <TextView\n        android:id=\"@+id/notification_summary\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"6dp\"\n        android:hyphenationFrequency=\"full\"\n        android:importantForAccessibility=\"no\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textColor=\"?android:textColorTertiary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintStart_toEndOf=\"@id/notification_reporter_avatar\"\n        app:layout_constraintTop_toBottomOf=\"@id/notification_top_text\"\n        tools:text=\"30 minutes ago · 2 posts attached\" />\n\n    <TextView\n        android:id=\"@+id/notification_category\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:hyphenationFrequency=\"full\"\n        android:importantForAccessibility=\"no\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textColor=\"?android:textColorTertiary\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:textStyle=\"bold\"\n        app:layout_constraintStart_toEndOf=\"@id/notification_reporter_avatar\"\n        app:layout_constraintTop_toBottomOf=\"@id/notification_summary\"\n        tools:text=\"Spam\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_report_status.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingTop=\"8dp\"\n    android:paddingBottom=\"8dp\">\n\n    <androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id/guideBegin\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        app:layout_constraintGuide_begin=\"8dp\" />\n\n    <TextView\n        android:id=\"@+id/statusContentWarningDescription\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:visibility=\"gone\"\n        app:layout_constraintEnd_toEndOf=\"@id/barrierEnd\"\n        app:layout_constraintStart_toStartOf=\"@id/guideBegin\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"content warning which is very long and it doesn't fit\"\n        tools:visibility=\"visible\" />\n\n    <Button\n        android:id=\"@+id/statusContentWarningButton\"\n        style=\"@style/TuskyButton.Outlined\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:minWidth=\"150dp\"\n        android:minHeight=\"0dp\"\n        android:paddingLeft=\"16dp\"\n        android:paddingTop=\"4dp\"\n        android:paddingRight=\"16dp\"\n        android:paddingBottom=\"4dp\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:visibility=\"gone\"\n        app:layout_constraintStart_toStartOf=\"@id/guideBegin\"\n        app:layout_constraintTop_toBottomOf=\"@id/statusContentWarningDescription\"\n        tools:text=\"@string/post_content_warning_show_more\"\n        tools:visibility=\"visible\" />\n\n    <TextView\n        android:id=\"@+id/statusContent\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_weight=\"1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toStartOf=\"@id/barrierEnd\"\n        app:layout_constraintStart_toStartOf=\"@id/guideBegin\"\n        app:layout_constraintTop_toBottomOf=\"@id/statusContentWarningButton\" />\n\n    <Button\n        android:id=\"@+id/buttonToggleContent\"\n        style=\"@style/TuskyButton.Outlined\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:minWidth=\"150dp\"\n        android:minHeight=\"0dp\"\n        android:paddingLeft=\"16dp\"\n        android:paddingTop=\"4dp\"\n        android:paddingRight=\"16dp\"\n        android:paddingBottom=\"4dp\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:visibility=\"gone\"\n        app:layout_constraintStart_toStartOf=\"@id/guideBegin\"\n        app:layout_constraintTop_toBottomOf=\"@id/statusContent\"\n        tools:text=\"@string/post_content_show_less\"\n        tools:visibility=\"visible\" />\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/status_media_preview_container\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"@dimen/status_media_preview_margin_top\"\n        android:layout_marginEnd=\"8dp\"\n        android:background=\"@drawable/media_preview_outline\"\n        app:layout_constraintEnd_toStartOf=\"@id/barrierEnd\"\n        app:layout_constraintStart_toStartOf=\"@id/guideBegin\"\n        app:layout_constraintTop_toBottomOf=\"@id/buttonToggleContent\"\n        tools:visibility=\"visible\">\n\n        <com.keylesspalace.tusky.view.MediaPreviewImageView\n            android:id=\"@+id/status_media_preview_0\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"@dimen/status_media_preview_height\"\n            android:scaleType=\"centerCrop\"\n            app:layout_constraintEnd_toStartOf=\"@+id/status_media_preview_1\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:ignore=\"ContentDescription\" />\n\n        <com.keylesspalace.tusky.view.MediaPreviewImageView\n            android:id=\"@+id/status_media_preview_1\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"@dimen/status_media_preview_height\"\n            android:layout_marginStart=\"4dp\"\n            android:scaleType=\"centerCrop\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toEndOf=\"@+id/status_media_preview_0\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:ignore=\"ContentDescription\" />\n\n\n        <com.keylesspalace.tusky.view.MediaPreviewImageView\n            android:id=\"@+id/status_media_preview_2\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"@dimen/status_media_preview_height\"\n            android:layout_marginTop=\"4dp\"\n            android:scaleType=\"centerCrop\"\n            app:layout_constraintEnd_toStartOf=\"@+id/status_media_preview_3\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@+id/status_media_preview_0\"\n            tools:ignore=\"ContentDescription\" />\n\n        <com.keylesspalace.tusky.view.MediaPreviewImageView\n            android:id=\"@+id/status_media_preview_3\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"@dimen/status_media_preview_height\"\n            android:layout_marginStart=\"4dp\"\n            android:layout_marginTop=\"4dp\"\n            android:scaleType=\"centerCrop\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toEndOf=\"@+id/status_media_preview_2\"\n            app:layout_constraintTop_toBottomOf=\"@+id/status_media_preview_1\"\n            tools:ignore=\"ContentDescription\" />\n\n        <ImageView\n            android:id=\"@+id/status_media_overlay_0\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:scaleType=\"center\"\n            app:layout_constraintBottom_toBottomOf=\"@+id/status_media_preview_0\"\n            app:layout_constraintEnd_toEndOf=\"@+id/status_media_preview_0\"\n            app:layout_constraintStart_toStartOf=\"@+id/status_media_preview_0\"\n            app:layout_constraintTop_toTopOf=\"@+id/status_media_preview_0\"\n            app:srcCompat=\"@drawable/play_indicator\"\n            tools:ignore=\"ContentDescription\" />\n\n        <ImageView\n            android:id=\"@+id/status_media_overlay_1\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:scaleType=\"center\"\n            app:layout_constraintBottom_toBottomOf=\"@+id/status_media_preview_1\"\n            app:layout_constraintEnd_toEndOf=\"@+id/status_media_preview_1\"\n            app:layout_constraintStart_toStartOf=\"@+id/status_media_preview_1\"\n            app:layout_constraintTop_toTopOf=\"@+id/status_media_preview_1\"\n            app:srcCompat=\"@drawable/play_indicator\"\n            tools:ignore=\"ContentDescription\" />\n\n        <ImageView\n            android:id=\"@+id/status_media_overlay_2\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:scaleType=\"center\"\n            app:layout_constraintBottom_toBottomOf=\"@+id/status_media_preview_2\"\n            app:layout_constraintEnd_toEndOf=\"@+id/status_media_preview_2\"\n            app:layout_constraintStart_toStartOf=\"@+id/status_media_preview_2\"\n            app:layout_constraintTop_toTopOf=\"@+id/status_media_preview_2\"\n            app:srcCompat=\"@drawable/play_indicator\"\n            tools:ignore=\"ContentDescription\" />\n\n        <ImageView\n            android:id=\"@+id/status_media_overlay_3\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:scaleType=\"center\"\n            app:layout_constraintBottom_toBottomOf=\"@+id/status_media_preview_3\"\n            app:layout_constraintEnd_toEndOf=\"@+id/status_media_preview_3\"\n            app:layout_constraintStart_toStartOf=\"@+id/status_media_preview_3\"\n            app:layout_constraintTop_toTopOf=\"@+id/status_media_preview_3\"\n            app:srcCompat=\"@drawable/play_indicator\"\n            tools:ignore=\"ContentDescription\" />\n\n        <ImageView\n            android:id=\"@+id/status_sensitive_media_button\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_margin=\"3dp\"\n            android:background=\"@drawable/media_warning_bg\"\n            android:contentDescription=\"@null\"\n            android:padding=\"@dimen/status_sensitive_media_button_padding\"\n            android:visibility=\"gone\"\n            app:layout_constraintLeft_toLeftOf=\"@+id/status_media_preview_container\"\n            app:layout_constraintTop_toTopOf=\"@+id/status_media_preview_container\"\n            app:srcCompat=\"@drawable/ic_visibility_24dp\"\n            app:tint=\"?android:attr/textColorSecondary\"\n            tools:visibility=\"visible\" />\n\n        <TextView\n            android:id=\"@+id/status_sensitive_media_warning\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@drawable/media_warning_bg\"\n            android:gravity=\"center\"\n            android:lineSpacingMultiplier=\"1.2\"\n            android:orientation=\"vertical\"\n            android:paddingLeft=\"12dp\"\n            android:paddingTop=\"8dp\"\n            android:paddingRight=\"12dp\"\n            android:paddingBottom=\"8dp\"\n            android:textAlignment=\"center\"\n            android:textColor=\"?android:attr/textColorSecondary\"\n            android:textSize=\"?attr/status_text_medium\"\n            android:visibility=\"gone\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\" />\n\n        <TextView\n            android:id=\"@+id/status_media_label\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"?attr/selectableItemBackground\"\n            android:drawablePadding=\"4dp\"\n            android:gravity=\"center_vertical\"\n            android:textSize=\"?attr/status_text_medium\"\n            android:visibility=\"gone\"\n            app:drawableTint=\"?android:attr/textColorTertiary\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n    <TextView\n        android:id=\"@+id/status_poll_option_result_0\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"6dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:background=\"@drawable/poll_option_background\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:paddingStart=\"6dp\"\n        android:paddingTop=\"2dp\"\n        android:paddingEnd=\"6dp\"\n        android:paddingBottom=\"2dp\"\n        android:textColor=\"?android:attr/textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toStartOf=\"@id/barrierEnd\"\n        app:layout_constraintStart_toStartOf=\"@id/guideBegin\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_media_preview_container\"\n        tools:text=\"40%\" />\n\n    <TextView\n        android:id=\"@+id/status_poll_option_result_1\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"6dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:background=\"@drawable/poll_option_background\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:paddingStart=\"6dp\"\n        android:paddingTop=\"2dp\"\n        android:paddingEnd=\"6dp\"\n        android:paddingBottom=\"2dp\"\n        android:textColor=\"?android:attr/textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toStartOf=\"@id/barrierEnd\"\n        app:layout_constraintStart_toStartOf=\"@id/guideBegin\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_poll_option_result_0\"\n        tools:text=\"10%\" />\n\n    <TextView\n        android:id=\"@+id/status_poll_option_result_2\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"6dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:background=\"@drawable/poll_option_background\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:paddingStart=\"6dp\"\n        android:paddingTop=\"2dp\"\n        android:paddingEnd=\"6dp\"\n        android:paddingBottom=\"2dp\"\n        android:textColor=\"?android:attr/textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toStartOf=\"@id/barrierEnd\"\n        app:layout_constraintStart_toStartOf=\"@id/guideBegin\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_poll_option_result_1\"\n        tools:text=\"20%\" />\n\n    <TextView\n        android:id=\"@+id/status_poll_option_result_3\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"6dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:background=\"@drawable/poll_option_background\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:paddingStart=\"6dp\"\n        android:paddingTop=\"2dp\"\n        android:paddingEnd=\"6dp\"\n        android:paddingBottom=\"2dp\"\n        android:textColor=\"?android:attr/textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toStartOf=\"@id/barrierEnd\"\n        app:layout_constraintStart_toStartOf=\"@id/guideBegin\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_poll_option_result_2\"\n        tools:text=\"30%\" />\n\n    <TextView\n        android:id=\"@+id/status_poll_description\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"6dp\"\n        android:layout_marginEnd=\"8dp\"\n        app:layout_constraintEnd_toEndOf=\"@id/barrierEnd\"\n        app:layout_constraintStart_toStartOf=\"@id/guideBegin\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_poll_option_result_3\"\n        tools:text=\"7 votes • 7 hours remaining\" />\n\n\n    <androidx.constraintlayout.widget.Barrier\n        android:id=\"@+id/barrierEnd\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        app:barrierDirection=\"start\"\n        app:constraint_referenced_ids=\"statusSelection,timestampInfo\" />\n\n    <TextView\n        android:id=\"@+id/timestampInfo\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"16dp\"\n        android:importantForAccessibility=\"no\"\n        android:textColor=\"?android:textColorTertiary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@id/barrierEnd\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"21 Dec 2018 18:45\" />\n\n    <CheckBox\n        android:id=\"@+id/statusSelection\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_vertical\"\n        android:layout_margin=\"16dp\"\n        app:buttonTint=\"@color/compound_button_color\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/timestampInfo\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_scheduled_status.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"horizontal\">\n\n    <TextView\n        android:id=\"@+id/text\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_weight=\"0.91\"\n        android:padding=\"8dp\"\n        android:textSize=\"?attr/status_text_medium\" />\n\n    <ImageButton\n        android:id=\"@+id/edit\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"32dp\"\n        android:layout_height=\"32dp\"\n        android:layout_gravity=\"center_vertical\"\n        android:layout_margin=\"12dp\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        android:contentDescription=\"@string/action_edit\"\n        android:padding=\"4dp\"\n        app:srcCompat=\"@drawable/ic_edit_24dp_filled\" />\n\n    <ImageButton\n        android:id=\"@+id/delete\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"32dp\"\n        android:layout_height=\"32dp\"\n        android:layout_gravity=\"center_vertical\"\n        android:layout_margin=\"12dp\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        android:contentDescription=\"@string/action_delete\"\n        android:padding=\"4dp\"\n        app:srcCompat=\"@drawable/ic_close_24dp\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_severed_relationship_notification.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingStart=\"14dp\"\n    android:paddingTop=\"8dp\"\n    android:paddingEnd=\"14dp\"\n    android:paddingBottom=\"8dp\">\n\n    <ImageView\n        android:id=\"@+id/severed_relationship_icon\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:layout_marginStart=\"28dp\"\n        android:importantForAccessibility=\"no\"\n        android:src=\"@drawable/ic_heart_broken_24\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:tint=\"?android:textColorSecondary\" />\n\n    <TextView\n        android:id=\"@+id/severed_relationship_text\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"10dp\"\n        android:hyphenationFrequency=\"full\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/severed_relationship_icon\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"You have blocked mastodon.example, removing 2 of your followers and 7 accounts you follow.\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_status.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:sparkbutton=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/status_container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:clipChildren=\"false\"\n    android:clipToPadding=\"false\"\n    android:focusable=\"true\">\n\n    <TextView\n        android:id=\"@+id/status_info\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"@dimen/status_reblogged_bar_padding_top\"\n        android:layout_marginEnd=\"14dp\"\n        android:drawablePadding=\"@dimen/status_info_drawable_padding_small\"\n        android:gravity=\"start\"\n        android:importantForAccessibility=\"no\"\n        android:paddingStart=\"@dimen/status_info_padding_small\"\n        android:textColor=\"?android:textColorTertiary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:drawableStartCompat=\"@drawable/ic_repeat_18dp\"\n        app:drawableTint=\"?android:textColorTertiary\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"0\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:ignore=\"RtlSymmetry\"\n        tools:text=\"ConnyDuck boosted\"\n        tools:visibility=\"visible\" />\n\n    <ImageView\n        android:id=\"@+id/status_avatar\"\n        android:layout_width=\"@dimen/timeline_status_avatar_width\"\n        android:layout_height=\"@dimen/timeline_status_avatar_height\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"@dimen/account_avatar_margin\"\n        android:contentDescription=\"@string/action_view_profile\"\n        android:importantForAccessibility=\"no\"\n        android:scaleType=\"centerCrop\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_info\"\n        tools:src=\"@drawable/avatar_default\" />\n\n    <ImageView\n        android:id=\"@+id/status_avatar_inset\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:contentDescription=\"@null\"\n        android:importantForAccessibility=\"no\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@id/status_avatar\"\n        app:layout_constraintEnd_toEndOf=\"@id/status_avatar\"\n        tools:src=\"#000\"\n        tools:visibility=\"visible\" />\n\n    <TextView\n        android:id=\"@+id/status_display_name\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"10dp\"\n        android:ellipsize=\"end\"\n        android:importantForAccessibility=\"no\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:textStyle=\"normal|bold\"\n        app:layout_constrainedWidth=\"true\"\n        app:layout_constraintEnd_toStartOf=\"@id/status_meta_info\"\n        app:layout_constraintHorizontal_bias=\"0\"\n        app:layout_constraintStart_toEndOf=\"@id/status_avatar\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_info\"\n        tools:text=\"Ente r the void you foooooo\" />\n\n    <TextView\n        android:id=\"@+id/status_username\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:ellipsize=\"end\"\n        android:importantForAccessibility=\"no\"\n        android:maxLines=\"1\"\n        android:paddingStart=\"@dimen/status_display_name_padding_end\"\n        android:paddingEnd=\"@dimen/status_display_name_padding_end\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toStartOf=\"@id/status_meta_info\"\n        app:layout_constraintStart_toEndOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toTopOf=\"@id/status_display_name\"\n        tools:text=\"\\@Entenhausen@birbsarecooooooooooool.site\" />\n\n    <TextView\n        android:id=\"@+id/status_meta_info\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"4dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:importantForAccessibility=\"no\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@id/status_display_name\"\n        tools:text=\"13:37\" />\n\n    <TextView\n        android:id=\"@+id/status_translation_status\"\n        style=\"@style/TextSizeSmall\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginEnd=\"10dp\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:maxLines=\"4\"\n        android:visibility=\"gone\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_username\"\n        tools:text=\"Translated from Lang by Service\"\n        tools:visibility=\"visible\" />\n\n    <Button\n        android:id=\"@+id/status_button_untranslate\"\n        style=\"@style/TuskyButton.TextButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"10dp\"\n        android:minHeight=\"0dp\"\n        android:paddingHorizontal=\"0dp\"\n        android:text=\"@string/action_show_original\"\n        android:visibility=\"gone\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_translation_status\"\n        tools:visibility=\"visible\" />\n\n    <com.keylesspalace.tusky.view.ClickableSpanTextView\n        android:id=\"@+id/status_content_warning_description\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"14dp\"\n        android:hyphenationFrequency=\"full\"\n        android:importantForAccessibility=\"no\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:visibility=\"gone\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_button_untranslate\"\n        tools:text=\"content warning which is very long and it doesn't fit\"\n        tools:visibility=\"visible\" />\n\n    <Button\n        android:id=\"@+id/status_content_warning_button\"\n        style=\"@style/TuskyButton.Outlined\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:importantForAccessibility=\"no\"\n        android:minWidth=\"150dp\"\n        android:minHeight=\"0dp\"\n        android:paddingLeft=\"16dp\"\n        android:paddingTop=\"4dp\"\n        android:paddingRight=\"16dp\"\n        android:paddingBottom=\"4dp\"\n        android:textOff=\"@string/post_content_warning_show_more\"\n        android:textOn=\"@string/post_content_warning_show_less\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:visibility=\"gone\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_content_warning_description\"\n        tools:text=\"@string/post_content_warning_show_more\"\n        tools:visibility=\"visible\" />\n\n    <com.keylesspalace.tusky.view.ClickableSpanTextView\n        android:id=\"@+id/status_content\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:focusable=\"true\"\n        android:hyphenationFrequency=\"full\"\n        android:importantForAccessibility=\"no\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@id/status_content_warning_button\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_content_warning_button\"\n        tools:text=\"This is a status\" />\n\n    <include\n        layout=\"@layout/item_preview_card\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"14dp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@+id/button_toggle_content\" />\n\n    <Button\n        android:id=\"@+id/button_toggle_content\"\n        style=\"@style/TuskyButton.Outlined\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:importantForAccessibility=\"no\"\n        android:minWidth=\"150dp\"\n        android:minHeight=\"0dp\"\n        android:paddingLeft=\"16dp\"\n        android:paddingTop=\"4dp\"\n        android:paddingRight=\"16dp\"\n        android:paddingBottom=\"4dp\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:visibility=\"gone\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_content\"\n        tools:text=\"@string/post_content_show_less\"\n        tools:visibility=\"visible\" />\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/status_media_preview_container\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"@dimen/status_media_preview_margin_top\"\n        android:layout_marginEnd=\"14dp\"\n        android:background=\"@drawable/media_preview_outline\"\n        android:importantForAccessibility=\"noHideDescendants\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_card_view\"\n        tools:visibility=\"visible\">\n\n        <include layout=\"@layout/item_media_preview\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/status_poll_options\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:nestedScrollingEnabled=\"false\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_media_preview_container\" />\n\n    <LinearLayout\n        android:id=\"@+id/status_poll_button_container\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"2dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:orientation=\"horizontal\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_poll_options\">\n\n        <Button\n            android:id=\"@+id/status_poll_button\"\n            style=\"@style/TuskyButton.Outlined\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\"\n            android:gravity=\"center\"\n            android:minHeight=\"0dp\"\n            android:paddingLeft=\"16dp\"\n            android:paddingTop=\"4dp\"\n            android:paddingRight=\"16dp\"\n            android:paddingBottom=\"4dp\"\n            android:text=\"@string/poll_vote\"\n            android:textSize=\"?attr/status_text_medium\" />\n\n        <Button\n            android:id=\"@+id/status_poll_results_button\"\n            style=\"@style/TuskyButton.Outlined\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_marginStart=\"6dp\"\n            android:layout_weight=\"1\"\n            android:gravity=\"center\"\n            android:minHeight=\"0dp\"\n            android:paddingLeft=\"16dp\"\n            android:paddingTop=\"4dp\"\n            android:paddingRight=\"16dp\"\n            android:paddingBottom=\"4dp\"\n            android:text=\"@string/poll_show_results\"\n            android:textSize=\"?attr/status_text_medium\" />\n\n    </LinearLayout>\n\n    <TextView\n        android:id=\"@+id/status_poll_description\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"6dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_poll_button_container\"\n        tools:text=\"7 votes • 7 hours remaining\" />\n\n    <com.keylesspalace.tusky.view.ClickableSpanTextView\n        android:id=\"@+id/status_trailing_hashtags_content\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:ellipsize=\"end\"\n        android:hyphenationFrequency=\"full\"\n        android:importantForAccessibility=\"no\"\n        android:singleLine=\"true\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textIsSelectable=\"true\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_poll_description\"\n        tools:text=\"#one #two #three #four #five #six #seven #eight #nine #ten\" />\n\n    <ImageButton\n        android:id=\"@+id/status_reply\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:layout_marginStart=\"-14dp\"\n        android:layout_marginTop=\"2dp\"\n        android:contentDescription=\"@string/action_reply\"\n        android:importantForAccessibility=\"no\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toStartOf=\"@id/status_inset\"\n        app:layout_constraintHorizontal_chainStyle=\"spread_inside\"\n        app:layout_constraintStart_toStartOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_trailing_hashtags_content\"\n        app:srcCompat=\"@drawable/ic_reply_24dp\"\n        tools:ignore=\"NegativeMargin\" />\n\n    <TextView\n        android:id=\"@+id/status_replies\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"45dp\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintBottom_toBottomOf=\"@id/status_reply\"\n        app:layout_constraintStart_toStartOf=\"@id/status_reply\"\n        app:layout_constraintTop_toTopOf=\"@id/status_reply\"\n        tools:text=\"1+\" />\n\n    <at.connyduck.sparkbutton.SparkButton\n        android:id=\"@+id/status_inset\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:clipToPadding=\"false\"\n        android:contentDescription=\"@string/action_reblog\"\n        android:importantForAccessibility=\"no\"\n        android:padding=\"4dp\"\n        app:layout_constraintEnd_toStartOf=\"@id/status_favourite\"\n        app:layout_constraintStart_toEndOf=\"@id/status_reply\"\n        app:layout_constraintTop_toTopOf=\"@id/status_reply\"\n        sparkbutton:activeImage=\"@drawable/ic_repeat_active_24dp\"\n        sparkbutton:iconSize=\"24dp\"\n        sparkbutton:inactiveImage=\"@drawable/ic_repeat_24dp\"\n        sparkbutton:primaryColor=\"@color/tusky_blue\"\n        sparkbutton:secondaryColor=\"@color/tusky_blue_lighter\" />\n\n    <TextView\n        android:id=\"@+id/status_insets\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"45dp\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintBottom_toBottomOf=\"@id/status_inset\"\n        app:layout_constraintStart_toStartOf=\"@id/status_inset\"\n        app:layout_constraintTop_toTopOf=\"@id/status_inset\"\n        tools:text=\"1+\" />\n\n    <at.connyduck.sparkbutton.SparkButton\n        android:id=\"@+id/status_favourite\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:clipToPadding=\"false\"\n        android:contentDescription=\"@string/action_favourite\"\n        android:importantForAccessibility=\"no\"\n        android:padding=\"4dp\"\n        app:layout_constraintEnd_toStartOf=\"@id/status_bookmark\"\n        app:layout_constraintStart_toEndOf=\"@id/status_inset\"\n        app:layout_constraintTop_toTopOf=\"@id/status_inset\"\n        sparkbutton:activeImage=\"@drawable/ic_star_24dp_filled\"\n        sparkbutton:iconSize=\"24dp\"\n        sparkbutton:inactiveImage=\"@drawable/ic_star_24dp\"\n        sparkbutton:primaryColor=\"@color/tusky_orange\"\n        sparkbutton:secondaryColor=\"@color/tusky_orange_light\" />\n\n    <TextView\n        android:id=\"@+id/status_favourites_count\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"45dp\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintBottom_toBottomOf=\"@id/status_inset\"\n        app:layout_constraintStart_toStartOf=\"@id/status_favourite\"\n        app:layout_constraintTop_toTopOf=\"@id/status_inset\"\n        tools:text=\"\" />\n\n    <at.connyduck.sparkbutton.SparkButton\n        android:id=\"@+id/status_bookmark\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:clipToPadding=\"false\"\n        android:contentDescription=\"@string/action_bookmark\"\n        android:importantForAccessibility=\"no\"\n        android:padding=\"4dp\"\n        app:layout_constraintEnd_toStartOf=\"@id/status_more\"\n        app:layout_constraintStart_toEndOf=\"@id/status_favourite\"\n        app:layout_constraintTop_toTopOf=\"@id/status_reply\"\n        sparkbutton:activeImage=\"@drawable/ic_bookmark_24dp_filled\"\n        sparkbutton:iconSize=\"24dp\"\n        sparkbutton:inactiveImage=\"@drawable/ic_bookmark_24dp\"\n        sparkbutton:primaryColor=\"@color/tusky_green_dark\"\n        sparkbutton:secondaryColor=\"@color/tusky_green_light\" />\n\n    <ImageButton\n        android:id=\"@+id/status_more\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:layout_gravity=\"end\"\n        android:contentDescription=\"@string/action_more\"\n        android:importantForAccessibility=\"no\"\n        app:layout_constraintBottom_toBottomOf=\"@id/status_reply\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/status_bookmark\"\n        app:layout_constraintTop_toTopOf=\"@id/status_reply\"\n        app:srcCompat=\"@drawable/ic_more_horiz_24dp\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_status_bottom_sheet.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/item_status_bottom_sheet\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"bottom\"\n    android:background=\"?android:colorBackground\"\n    android:orientation=\"vertical\"\n    app:behavior_hideable=\"true\"\n    app:layout_behavior=\"com.google.android.material.bottomsheet.BottomSheetBehavior\">\n\n    <TextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:gravity=\"center\"\n        android:paddingVertical=\"24dp\"\n        android:text=\"@string/performing_lookup_title\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_status_detailed.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:sparkbutton=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/status_container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:clipChildren=\"false\"\n    android:clipToPadding=\"false\">\n\n    <ImageView\n        android:id=\"@+id/status_avatar\"\n        android:layout_width=\"48dp\"\n        android:layout_height=\"48dp\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"14dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:contentDescription=\"@string/action_view_profile\"\n        android:importantForAccessibility=\"no\"\n        android:scaleType=\"centerCrop\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:src=\"@drawable/avatar_default\" />\n\n    <ImageView\n        android:id=\"@+id/status_avatar_inset\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:contentDescription=\"@null\"\n        android:importantForAccessibility=\"no\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@id/status_avatar\"\n        app:layout_constraintEnd_toEndOf=\"@id/status_avatar\"\n        tools:src=\"#000\"\n        tools:visibility=\"visible\" />\n\n    <TextView\n        android:id=\"@+id/status_display_name\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"10dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:ellipsize=\"end\"\n        android:importantForAccessibility=\"no\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:textStyle=\"normal|bold\"\n        app:layout_constrainedWidth=\"true\"\n        app:layout_constraintBottom_toTopOf=\"@id/status_username\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"0\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/status_avatar\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintVertical_chainStyle=\"packed\"\n        tools:text=\"Display Name\" />\n\n    <TextView\n        android:id=\"@+id/status_username\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:ellipsize=\"end\"\n        android:importantForAccessibility=\"no\"\n        android:maxLines=\"1\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constrainedWidth=\"true\"\n        app:layout_constraintBottom_toBottomOf=\"@id/status_avatar\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"0\"\n        app:layout_constraintStart_toEndOf=\"@id/status_avatar\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_display_name\"\n        tools:text=\"\\@ConnyDuck\\@mastodon.social\" />\n\n    <TextView\n        android:id=\"@+id/status_translation_status\"\n        style=\"@style/TextSizeSmall\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:visibility=\"gone\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_avatar\"\n        tools:text=\"Translated from blah using service\"\n        tools:visibility=\"visible\" />\n\n    <Button\n        android:id=\"@+id/status_button_untranslate\"\n        style=\"@style/TuskyButton.TextButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:minHeight=\"0dp\"\n        android:paddingHorizontal=\"0dp\"\n        android:text=\"@string/action_show_original\"\n        android:visibility=\"gone\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_translation_status\"\n        tools:visibility=\"visible\" />\n\n    <com.keylesspalace.tusky.view.ClickableSpanTextView\n        android:id=\"@+id/status_content_warning_description\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:hyphenationFrequency=\"full\"\n        android:importantForAccessibility=\"no\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textIsSelectable=\"true\"\n        android:textSize=\"?attr/status_text_large\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_button_untranslate\"\n        tools:text=\"CW this is a long long long long long long long long content warning\" />\n\n    <com.google.android.material.button.MaterialButton\n        android:id=\"@+id/status_content_warning_button\"\n        style=\"@style/TuskyButton.Outlined\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:importantForAccessibility=\"no\"\n        android:minWidth=\"160dp\"\n        android:minHeight=\"0dp\"\n        android:paddingLeft=\"16dp\"\n        android:paddingTop=\"4dp\"\n        android:paddingRight=\"16dp\"\n        android:paddingBottom=\"4dp\"\n        android:textSize=\"?attr/status_text_large\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/status_content_warning_description\"\n        tools:text=\"@string/post_content_warning_show_more\" />\n\n    <com.keylesspalace.tusky.view.ClickableSpanTextView\n        android:id=\"@+id/status_content\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:focusable=\"true\"\n        android:hyphenationFrequency=\"full\"\n        android:importantForAccessibility=\"no\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textIsSelectable=\"true\"\n        android:textSize=\"?attr/status_text_large\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/status_content_warning_button\"\n        tools:text=\"Status content. Can be pretty long. \" />\n\n    <include\n        layout=\"@layout/item_preview_card\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"14dp\"\n        app:layout_constraintTop_toBottomOf=\"@+id/status_content\" />\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/status_media_preview_container\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"12dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:background=\"@drawable/media_preview_outline\"\n        android:importantForAccessibility=\"noHideDescendants\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_card_view\">\n\n        <include layout=\"@layout/item_media_preview\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/status_poll_options\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:nestedScrollingEnabled=\"false\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_media_preview_container\" />\n\n    <LinearLayout\n        android:id=\"@+id/status_poll_button_container\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"2dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:orientation=\"horizontal\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_poll_options\">\n\n        <Button\n            android:id=\"@+id/status_poll_button\"\n            style=\"@style/TuskyButton.Outlined\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\"\n            android:gravity=\"center\"\n            android:minHeight=\"0dp\"\n            android:paddingLeft=\"16dp\"\n            android:paddingTop=\"4dp\"\n            android:paddingRight=\"16dp\"\n            android:paddingBottom=\"4dp\"\n            android:text=\"@string/poll_vote\"\n            android:textSize=\"?attr/status_text_medium\" />\n\n        <Button\n            android:id=\"@+id/status_poll_results_button\"\n            style=\"@style/TuskyButton.Outlined\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_marginStart=\"6dp\"\n            android:layout_weight=\"1\"\n            android:gravity=\"center\"\n            android:minHeight=\"0dp\"\n            android:paddingLeft=\"16dp\"\n            android:paddingTop=\"4dp\"\n            android:paddingRight=\"16dp\"\n            android:paddingBottom=\"4dp\"\n            android:text=\"@string/poll_show_results\"\n            android:textSize=\"?attr/status_text_medium\" />\n\n    </LinearLayout>\n\n    <TextView\n        android:id=\"@+id/status_poll_description\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"6dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_poll_button_container\"\n        tools:text=\"7 votes • 7 hours remaining\" />\n\n    <com.keylesspalace.tusky.view.ClickableSpanTextView\n        android:id=\"@+id/status_trailing_hashtags_content\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:hyphenationFrequency=\"full\"\n        android:importantForAccessibility=\"no\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textIsSelectable=\"true\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_poll_description\"\n        tools:text=\"#one #two #three #four #five #six #seven #eight #nine #ten\" />\n\n    <TextView\n        android:id=\"@+id/status_meta_info\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"10dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:drawablePadding=\"4dp\"\n        android:importantForAccessibility=\"no\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textColor=\"?android:textColorTertiary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_trailing_hashtags_content\"\n        tools:text=\"21 Dec 2018 18:45\" />\n\n    <View\n        android:id=\"@+id/status_info_divider\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0.5dp\"\n        android:layout_below=\"@id/status_meta_info\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"6dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:background=\"?android:attr/listDivider\"\n        android:importantForAccessibility=\"no\"\n        android:paddingStart=\"16dp\"\n        android:paddingEnd=\"16dp\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_meta_info\" />\n\n    <TextView\n        android:id=\"@+id/status_reblogs\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"6dp\"\n        android:background=\"?attr/selectableItemBackground\"\n        android:importantForAccessibility=\"no\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintStart_toStartOf=\"@id/status_info_divider\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_info_divider\"\n        tools:text=\"4 Boosts\"\n        tools:visibility=\"visible\" />\n\n    <TextView\n        android:id=\"@+id/status_favourites\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"12dp\"\n        android:layout_marginTop=\"6dp\"\n        android:background=\"?attr/selectableItemBackground\"\n        android:importantForAccessibility=\"no\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintStart_toEndOf=\"@id/status_reblogs\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_info_divider\"\n        app:layout_goneMarginStart=\"0dp\"\n        tools:text=\"8 Favorites\"\n        tools:visibility=\"visible\" />\n\n    <androidx.constraintlayout.widget.Barrier\n        android:id=\"@+id/status_counters_barrier\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        app:barrierDirection=\"bottom\"\n        app:constraint_referenced_ids=\"status_reblogs,status_favourites\" />\n\n\n    <ImageButton\n        android:id=\"@+id/status_reply\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:layout_marginTop=\"4dp\"\n        android:contentDescription=\"@string/action_reply\"\n        android:importantForAccessibility=\"no\"\n        android:padding=\"4dp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toStartOf=\"@id/status_inset\"\n        app:layout_constraintHorizontal_chainStyle=\"spread_inside\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_counters_barrier\"\n        app:srcCompat=\"@drawable/ic_reply_24dp\" />\n\n    <at.connyduck.sparkbutton.SparkButton\n        android:id=\"@+id/status_inset\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:clipToPadding=\"false\"\n        android:contentDescription=\"@string/action_reblog\"\n        android:importantForAccessibility=\"no\"\n        android:padding=\"4dp\"\n        app:layout_constraintEnd_toStartOf=\"@id/status_favourite\"\n        app:layout_constraintStart_toEndOf=\"@id/status_reply\"\n        app:layout_constraintTop_toTopOf=\"@id/status_reply\"\n        sparkbutton:activeImage=\"@drawable/ic_repeat_active_24dp\"\n        sparkbutton:iconSize=\"24dp\"\n        sparkbutton:inactiveImage=\"@drawable/ic_repeat_24dp\"\n        sparkbutton:primaryColor=\"@color/tusky_blue\"\n        sparkbutton:secondaryColor=\"@color/tusky_blue_lighter\" />\n\n    <at.connyduck.sparkbutton.SparkButton\n        android:id=\"@+id/status_favourite\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:clipToPadding=\"false\"\n        android:contentDescription=\"@string/action_favourite\"\n        android:importantForAccessibility=\"no\"\n        android:padding=\"4dp\"\n        app:layout_constraintEnd_toStartOf=\"@id/status_bookmark\"\n        app:layout_constraintStart_toEndOf=\"@id/status_inset\"\n        app:layout_constraintTop_toTopOf=\"@id/status_inset\"\n        sparkbutton:activeImage=\"@drawable/ic_star_24dp_filled\"\n        sparkbutton:iconSize=\"24dp\"\n        sparkbutton:inactiveImage=\"@drawable/ic_star_24dp\"\n        sparkbutton:primaryColor=\"@color/tusky_orange\"\n        sparkbutton:secondaryColor=\"@color/tusky_orange_light\" />\n\n    <at.connyduck.sparkbutton.SparkButton\n        android:id=\"@+id/status_bookmark\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:clipToPadding=\"false\"\n        android:contentDescription=\"@string/action_bookmark\"\n        android:importantForAccessibility=\"no\"\n        android:padding=\"4dp\"\n        app:layout_constraintEnd_toStartOf=\"@id/status_more\"\n        app:layout_constraintStart_toEndOf=\"@id/status_favourite\"\n        app:layout_constraintTop_toTopOf=\"@id/status_reply\"\n        sparkbutton:activeImage=\"@drawable/ic_bookmark_24dp_filled\"\n        sparkbutton:iconSize=\"24dp\"\n        sparkbutton:inactiveImage=\"@drawable/ic_bookmark_24dp\"\n        sparkbutton:primaryColor=\"@color/tusky_green_dark\"\n        sparkbutton:secondaryColor=\"@color/tusky_green_light\" />\n\n    <ImageButton\n        android:id=\"@+id/status_more\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"52dp\"\n        android:layout_height=\"48dp\"\n        android:contentDescription=\"@string/action_more\"\n        android:importantForAccessibility=\"no\"\n        android:padding=\"4dp\"\n        app:layout_constraintBottom_toBottomOf=\"@id/status_reply\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/status_bookmark\"\n        app:layout_constraintTop_toTopOf=\"@id/status_reply\"\n        app:srcCompat=\"@drawable/ic_more_horiz_24dp\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_status_edit.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\"\n    android:paddingLeft=\"16dp\"\n    android:paddingRight=\"16dp\"\n    android:paddingBottom=\"8dp\">\n\n    <TextView\n        android:id=\"@+id/status_edit_info\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:textStyle=\"bold\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"\\@Tusky edited 18th December 2022\" />\n\n    <com.keylesspalace.tusky.view.ClickableSpanTextView\n        android:id=\"@+id/status_edit_content_warning_description\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:hyphenationFrequency=\"full\"\n        android:importantForAccessibility=\"no\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:visibility=\"gone\"\n        app:layout_constraintEnd_toEndOf=\"@+id/status_edit_info\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/status_edit_info\"\n        tools:text=\"content warning which is very long and it doesn't fit\"\n        tools:visibility=\"visible\" />\n\n    <View\n        android:id=\"@+id/status_edit_content_warning_separator\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"1dp\"\n        android:layout_marginTop=\"4dp\"\n        android:background=\"?android:textColorPrimary\"\n        android:importantForAccessibility=\"no\"\n        app:layout_constraintEnd_toEndOf=\"@+id/status_edit_content_warning_description\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_edit_content_warning_description\" />\n\n    <TextView\n        android:id=\"@+id/status_edit_content\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:focusable=\"true\"\n        android:hyphenationFrequency=\"full\"\n        android:importantForAccessibility=\"no\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"@+id/status_edit_info\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_edit_content_warning_separator\"\n        tools:text=\"This is an edited status\" />\n\n    <com.keylesspalace.tusky.view.MediaPreviewLayout\n        android:id=\"@+id/status_edit_media_preview\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:background=\"@drawable/media_preview_outline\"\n        android:importantForAccessibility=\"noHideDescendants\"\n        app:layout_constraintEnd_toEndOf=\"@id/status_edit_info\"\n        app:layout_constraintStart_toStartOf=\"@+id/status_edit_content_warning_description\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_edit_content\" />\n\n    <TextView\n        android:id=\"@+id/status_edit_media_sensitivity\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:text=\"@string/post_sensitive_media_title\"\n        android:textColor=\"?android:attr/textColorTertiary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"@+id/status_edit_info\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_edit_media_preview\" />\n\n    <!-- hidden because as of Mastodon 4.0.2 we don't get this info via the api -->\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/status_edit_poll_options\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:nestedScrollingEnabled=\"false\"\n        app:layout_constraintEnd_toEndOf=\"@+id/status_edit_info\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_edit_media_sensitivity\" />\n\n    <TextView\n        android:id=\"@+id/status_edit_poll_description\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"6dp\"\n        android:layout_marginEnd=\"14dp\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:visibility=\"gone\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_edit_poll_options\"\n        tools:text=\"ends at 12:30\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_status_filtered.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/status_filtered_placeholder\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <TextView\n        android:id=\"@+id/status_filter_label\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginBottom=\"0dp\"\n        android:textAlignment=\"center\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        tools:text=\"Filter: MyFilter\" />\n\n    <Button\n        android:id=\"@+id/status_filter_show_anyway\"\n        style=\"@style/TuskyButton.TextButton\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"0dp\"\n        android:text=\"@string/status_filtered_show_anyway\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:textStyle=\"bold\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_status_notification.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--This applies only to favourite and rebnotificationsEnabledions.-->\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/notification_container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingLeft=\"14dp\"\n    android:paddingRight=\"14dp\"\n    android:paddingBottom=\"10dp\">\n\n    <TextView\n        android:id=\"@+id/notification_top_text\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginBottom=\"6dp\"\n        android:drawablePadding=\"@dimen/status_info_drawable_padding_large\"\n        android:ellipsize=\"end\"\n        android:gravity=\"center_vertical\"\n        android:maxLines=\"1\"\n        android:paddingStart=\"@dimen/status_info_padding_large\"\n        android:paddingEnd=\"0dp\"\n        android:textColor=\"?android:textColorSecondary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"Someone favourited your status\" />\n\n    <ImageView\n        android:id=\"@+id/notification_status_avatar\"\n        android:layout_width=\"48dp\"\n        android:layout_height=\"48dp\"\n        android:layout_marginTop=\"10dp\"\n        android:layout_marginBottom=\"14dp\"\n        android:contentDescription=\"@string/action_view_profile\"\n        android:scaleType=\"centerCrop\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/notification_top_text\"\n        tools:ignore=\"RtlHardcoded,RtlSymmetry\"\n        tools:src=\"@drawable/avatar_default\" />\n\n    <ImageView\n        android:id=\"@+id/notification_notification_avatar\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:contentDescription=\"@string/action_view_profile\"\n        app:layout_constraintBottom_toBottomOf=\"@id/notification_status_avatar\"\n        app:layout_constraintEnd_toEndOf=\"@id/notification_status_avatar\" />\n\n    <TextView\n        android:id=\"@+id/status_display_name\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"6dp\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:paddingStart=\"0dp\"\n        android:paddingEnd=\"@dimen/status_display_name_padding_end\"\n        android:paddingBottom=\"4dp\"\n        android:textColor=\"?android:textColorTertiary\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:textStyle=\"normal|bold\"\n        app:layout_constrainedWidth=\"true\"\n        app:layout_constraintEnd_toStartOf=\"@id/status_meta_info\"\n        app:layout_constraintHorizontal_bias=\"0\"\n        app:layout_constraintStart_toEndOf=\"@id/notification_notification_avatar\"\n        app:layout_constraintTop_toBottomOf=\"@id/notification_top_text\"\n        tools:text=\"Ente MM\" />\n\n    <TextView\n        android:id=\"@+id/status_username\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:paddingBottom=\"4dp\"\n        android:textColor=\"?android:textColorTertiary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toStartOf=\"@id/status_meta_info\"\n        app:layout_constraintStart_toEndOf=\"@id/status_display_name\"\n        app:layout_constraintTop_toTopOf=\"@+id/status_display_name\"\n        tools:text=\"\\@Entenhausen\" />\n\n    <TextView\n        android:id=\"@+id/status_meta_info\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:paddingBottom=\"4dp\"\n        android:textColor=\"?android:textColorTertiary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@+id/status_username\"\n        tools:text=\"13:37\" />\n\n    <com.keylesspalace.tusky.view.ClickableSpanTextView\n        android:id=\"@+id/notification_content_warning_description\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:hyphenationFrequency=\"full\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textColor=\"?android:textColorTertiary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/notification_status_avatar\"\n        app:layout_constraintTop_toBottomOf=\"@id/status_display_name\"\n        tools:text=\"Example CW text\" />\n\n    <Button\n        android:id=\"@+id/notification_content_warning_button\"\n        style=\"@style/TuskyButton.Outlined\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:minWidth=\"150dp\"\n        android:minHeight=\"0dp\"\n        android:paddingLeft=\"16dp\"\n        android:paddingTop=\"4dp\"\n        android:paddingRight=\"16dp\"\n        android:paddingBottom=\"4dp\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintStart_toEndOf=\"@id/notification_status_avatar\"\n        app:layout_constraintTop_toBottomOf=\"@id/notification_content_warning_description\"\n        tools:text=\"@string/post_content_warning_show_more\" />\n\n    <com.keylesspalace.tusky.view.ClickableSpanTextView\n        android:id=\"@+id/notification_content\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:hyphenationFrequency=\"full\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textColor=\"?android:textColorTertiary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/notification_status_avatar\"\n        app:layout_constraintTop_toBottomOf=\"@id/notification_content_warning_button\"\n        tools:text=\"Example status here\" />\n\n    <TextView\n        android:id=\"@+id/notification_attachment_info\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"6dp\"\n        android:drawablePadding=\"4dp\"\n        android:gravity=\"center_vertical\"\n        android:hyphenationFrequency=\"full\"\n        android:lineSpacingMultiplier=\"1.1\"\n        android:textColor=\"?android:textColorTertiary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:drawableTint=\"?android:textColorTertiary\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/notification_status_avatar\"\n        app:layout_constraintTop_toBottomOf=\"@id/notification_content\"\n        tools:drawableStart=\"@drawable/ic_attach_file_24dp\"\n        tools:text=\"3 media attachments\" />\n\n    <Button\n        android:id=\"@+id/button_toggle_notification_content\"\n        style=\"@style/TuskyButton.Outlined\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"14dp\"\n        android:layout_marginTop=\"4dp\"\n        android:minWidth=\"150dp\"\n        android:minHeight=\"0dp\"\n        android:paddingLeft=\"16dp\"\n        android:paddingTop=\"4dp\"\n        android:paddingRight=\"16dp\"\n        android:paddingBottom=\"4dp\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:layout_constraintStart_toEndOf=\"@id/notification_status_avatar\"\n        app:layout_constraintTop_toBottomOf=\"@id/notification_attachment_info\"\n        tools:text=\"@string/post_content_show_less\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_tab_preference.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?android:colorBackground\"\n    android:minHeight=\"?android:attr/listPreferredItemHeightSmall\"\n    android:orientation=\"horizontal\"\n    android:paddingStart=\"?android:attr/listPreferredItemPaddingStart\"\n    android:paddingTop=\"8dp\"\n    android:paddingEnd=\"?android:attr/listPreferredItemPaddingEnd\">\n\n    <ImageView\n        android:id=\"@+id/imageView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end\"\n        android:paddingTop=\"8dp\"\n        android:paddingBottom=\"8dp\"\n        app:layout_constraintBottom_toBottomOf=\"@id/textView\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:srcCompat=\"@drawable/ic_drag_indicator_24dp\"\n        tools:ignore=\"ContentDescription\" />\n\n    <TextView\n        android:id=\"@+id/textView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_weight=\"1\"\n        android:drawablePadding=\"12dp\"\n        android:paddingTop=\"8dp\"\n        android:paddingBottom=\"8dp\"\n        android:textAppearance=\"?android:attr/textAppearanceListItemSmall\"\n        app:drawableTint=\"?android:attr/textColorSecondary\"\n        app:layout_constraintBottom_toTopOf=\"@id/chipGroup\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/imageView\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_goneMarginBottom=\"8dp\"\n        tools:drawableStart=\"@drawable/ic_home_24dp_filled\"\n        tools:text=\"Home\" />\n\n    <ImageButton\n        android:id=\"@+id/removeButton\"\n        style=\"@style/TuskyImageButton\"\n        android:layout_width=\"32dp\"\n        android:layout_height=\"32dp\"\n        android:layout_gravity=\"end\"\n        android:layout_marginTop=\"4dp\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        android:contentDescription=\"@string/action_delete\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:srcCompat=\"@drawable/ic_close_24dp\" />\n\n    <com.google.android.material.chip.ChipGroup\n        android:id=\"@+id/chipGroup\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"8dp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\">\n\n        <com.google.android.material.chip.Chip\n            android:id=\"@+id/actionChip\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:checkable=\"false\"\n            android:text=\"@string/add_hashtag_title\"\n            android:textColor=\"?attr/colorOnPrimary\"\n            app:chipBackgroundColor=\"?attr/colorPrimary\"\n            app:chipIcon=\"@drawable/ic_add_24dp\"\n            app:chipIconEnabled=\"true\"\n            app:chipIconTint=\"?attr/colorOnPrimary\"\n            app:chipStrokeWidth=\"0dp\"\n            app:closeIconEnabled=\"false\" />\n\n    </com.google.android.material.chip.ChipGroup>\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_tab_preference_small.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/textView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"48dp\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:drawablePadding=\"12dp\"\n    android:ellipsize=\"end\"\n    android:gravity=\"center_vertical\"\n    android:lines=\"1\"\n    android:paddingStart=\"8dp\"\n    android:paddingEnd=\"8dp\"\n    android:textAppearance=\"?android:attr/textAppearanceListItemSmall\"\n    app:drawableStartCompat=\"@drawable/ic_home_24dp_filled\"\n    app:drawableTint=\"?android:attr/textColorSecondary\" />\n\n\n"
  },
  {
    "path": "app/src/main/res/layout/item_trending_cell.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/trending_container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:clipChildren=\"false\"\n    android:clipToPadding=\"false\"\n    android:focusable=\"true\"\n    android:importantForAccessibility=\"yes\"\n    android:padding=\"8dp\"\n    android:paddingStart=\"?android:attr/listPreferredItemPaddingStart\"\n    android:paddingEnd=\"?android:attr/listPreferredItemPaddingEnd\"\n    tools:layout_height=\"128dp\">\n\n    <com.keylesspalace.tusky.view.GraphView\n        android:id=\"@+id/graph\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"120dp\"\n        android:importantForAccessibility=\"no\"\n        app:graphColor=\"?android:colorBackground\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toStartOf=\"@id/current_usage\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:lineWidth=\"2sp\"\n        app:metaColor=\"?android:attr/textColorTertiary\"\n        app:primaryLineColor=\"?attr/colorPrimary\"\n        app:proportionalTrending=\"true\"\n        app:secondaryLineColor=\"@color/warning_color\" />\n\n    <TextView\n        android:id=\"@+id/current_usage\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:importantForAccessibility=\"no\"\n        android:paddingStart=\"8dp\"\n        android:textAlignment=\"textEnd\"\n        android:textAppearance=\"@style/TextAppearance.AppCompat.Small\"\n        android:textColor=\"?attr/colorPrimary\"\n        android:textSize=\"12sp\"\n        android:textStyle=\"normal\"\n        app:layout_constraintBottom_toTopOf=\"@id/current_accounts\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"1\"\n        app:layout_constraintStart_toEndOf=\"@id/graph\"\n        tools:ignore=\"RtlSymmetry\"\n        tools:text=\"12 345\" />\n\n    <TextView\n        android:id=\"@+id/current_accounts\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:importantForAccessibility=\"no\"\n        android:paddingStart=\"8dp\"\n        android:textAlignment=\"textEnd\"\n        android:textAppearance=\"@style/TextAppearance.AppCompat.Small\"\n        android:textColor=\"@color/warning_color\"\n        android:textSize=\"12sp\"\n        android:textStyle=\"normal\"\n        app:layout_constraintBottom_toBottomOf=\"@id/graph\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"1\"\n        app:layout_constraintStart_toEndOf=\"@id/graph\"\n        tools:ignore=\"RtlSymmetry\"\n        tools:text=\"13\" />\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/legend_container\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?android:colorBackground\"\n        android:backgroundTint=\"@color/color_background_transparent_60\"\n        android:backgroundTintMode=\"src_in\"\n        android:paddingTop=\"8dp\"\n        android:paddingBottom=\"8dp\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\">\n\n        <TextView\n            android:id=\"@+id/tag\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:ellipsize=\"end\"\n            android:importantForAccessibility=\"no\"\n            android:singleLine=\"true\"\n            android:textAlignment=\"textStart\"\n            android:textAppearance=\"?android:attr/textAppearanceListItem\"\n            android:textColor=\"?android:textColorPrimary\"\n            android:textStyle=\"normal\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:text=\"#itishashtagtuesdayitishashtagtuesday\" />\n\n        <TextView\n            android:id=\"@+id/total_usage\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"4dp\"\n            android:importantForAccessibility=\"no\"\n            android:textAlignment=\"textEnd\"\n            android:textAppearance=\"?android:attr/textAppearanceListItemSmall\"\n            android:textColor=\"?attr/colorPrimary\"\n            android:textStyle=\"normal|bold\"\n            app:layout_constraintHorizontal_chainStyle=\"spread_inside\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/tag\"\n            tools:text=\"12 34\" />\n\n        <TextView\n            android:id=\"@+id/usageLabel\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"5dp\"\n            android:importantForAccessibility=\"no\"\n            android:text=\"@string/total_usage\"\n            android:textAlignment=\"textEnd\"\n            android:textAppearance=\"?android:attr/textAppearanceListItemSecondary\"\n            android:textColor=\"?android:textColorTertiary\"\n            app:layout_constraintBottom_toBottomOf=\"@+id/total_usage\"\n            app:layout_constraintStart_toEndOf=\"@+id/total_usage\"\n            app:layout_constraintTop_toTopOf=\"@+id/total_usage\" />\n\n        <TextView\n            android:id=\"@+id/total_accounts\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"16dp\"\n            android:layout_marginTop=\"4dp\"\n            android:importantForAccessibility=\"no\"\n            android:textAlignment=\"textEnd\"\n            android:textAppearance=\"?android:attr/textAppearanceListItemSmall\"\n            android:textColor=\"@color/warning_color\"\n            android:textStyle=\"normal|bold\"\n            app:layout_constraintHorizontal_chainStyle=\"packed\"\n            app:layout_constraintStart_toEndOf=\"@id/usageLabel\"\n            app:layout_constraintTop_toBottomOf=\"@+id/tag\"\n            tools:text=\"498\" />\n\n        <TextView\n            android:id=\"@+id/accountsLabel\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"5dp\"\n            android:importantForAccessibility=\"no\"\n            android:text=\"@string/total_accounts\"\n            android:textAppearance=\"?android:attr/textAppearanceListItemSecondary\"\n            android:textColor=\"?android:textColorTertiary\"\n            app:layout_constraintBottom_toBottomOf=\"@+id/total_accounts\"\n            app:layout_constraintStart_toEndOf=\"@id/total_accounts\"\n            app:layout_constraintTop_toTopOf=\"@+id/total_accounts\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_trending_date.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/dates\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:minHeight=\"?android:attr/listPreferredItemHeightSmall\"\n    android:focusableInTouchMode=\"true\"\n    android:importantForAccessibility=\"yes\"\n    android:maxLines=\"1\"\n    android:paddingTop=\"16dp\"\n    android:paddingStart=\"?android:attr/listPreferredItemPaddingStart\"\n    android:paddingEnd=\"?android:attr/listPreferredItemPaddingEnd\"\n    android:textAppearance=\"?android:attr/textAppearanceListItem\"\n    android:textColor=\"?android:textColorTertiary\"\n    tools:text=\"@string/date_range\" />\n"
  },
  {
    "path": "app/src/main/res/layout/item_unknown_notification.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\nxmlns:app=\"http://schemas.android.com/apk/res-auto\"\nxmlns:tools=\"http://schemas.android.com/tools\"\nandroid:layout_width=\"match_parent\"\nandroid:layout_height=\"wrap_content\"\nandroid:orientation=\"vertical\"\nandroid:paddingStart=\"14dp\"\nandroid:paddingEnd=\"14dp\"\nandroid:paddingBottom=\"14dp\">\n\n<TextView\n    android:id=\"@+id/unknownNotificationTypeTitle\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginTop=\"8dp\"\n    android:drawablePadding=\"@dimen/status_info_drawable_padding_large\"\n    android:ellipsize=\"end\"\n    android:gravity=\"center_vertical\"\n    android:maxLines=\"1\"\n    android:paddingStart=\"@dimen/status_info_padding_large\"\n    android:paddingEnd=\"0dp\"\n    android:textColor=\"?android:textColorSecondary\"\n    android:textSize=\"?attr/status_text_medium\"\n    app:drawableStartCompat=\"@drawable/ic_help_24dp\"\n    app:layout_constraintStart_toStartOf=\"parent\"\n    app:layout_constraintTop_toTopOf=\"parent\"\n    android:text=\"@string/unknown_notification_type\" />\n\n<TextView\n    android:id=\"@+id/unknownNotificationType\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginStart=\"62dp\"\n    android:layout_marginTop=\"6dp\"\n    android:lineSpacingMultiplier=\"1.1\"\n    android:textColor=\"?android:textColorTertiary\"\n    android:textSize=\"?attr/status_text_medium\"\n    app:layout_constraintStart_toStartOf=\"parent\"\n    app:layout_constraintTop_toBottomOf=\"@id/unknownNotificationTypeTitle\"\n    tools:text=\"unknown_type\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/material_drawer_header.xml",
    "content": "<!-- this replaces the default material_drawer_header.xml from the MaterialDrawer library to enable rounded avatars -->\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/material_drawer_account_header\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"@dimen/material_drawer_account_header_height\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    tools:parentTag=\"androidx.constraintlayout.widget.ConstraintLayout\">\n\n    <androidx.appcompat.widget.AppCompatImageView\n        android:id=\"@+id/material_drawer_account_header_background\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/material_drawer_account_header_height\"\n        android:scaleType=\"centerCrop\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id/material_drawer_statusbar_guideline\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\"\n        app:layout_constraintGuide_begin=\"0dp\" />\n\n    <com.keylesspalace.tusky.view.BezelImageView\n        android:id=\"@+id/material_drawer_account_header_current\"\n        style=\"@style/BezelImageView\"\n        android:layout_width=\"@dimen/material_drawer_account_header_selected\"\n        android:layout_height=\"@dimen/material_drawer_account_header_selected\"\n        android:layout_marginStart=\"@dimen/material_drawer_vertical_padding\"\n        android:layout_marginTop=\"@dimen/material_drawer_account_header_horizontal_top\"\n        android:clickable=\"true\"\n        android:elevation=\"2dp\"\n        android:focusable=\"true\"\n        android:scaleType=\"fitCenter\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/material_drawer_statusbar_guideline\"\n        app:materialDrawerMaskDrawable=\"@drawable/materialdrawer_shape_large\" />\n\n    <androidx.appcompat.widget.AppCompatTextView\n        android:id=\"@+id/material_drawer_account_header_current_badge\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:elevation=\"4dp\"\n        android:fontFamily=\"sans-serif\"\n        android:gravity=\"center\"\n        android:lines=\"1\"\n        android:minWidth=\"20dp\"\n        android:paddingLeft=\"1dp\"\n        android:paddingRight=\"1dp\"\n        android:singleLine=\"true\"\n        android:textSize=\"@dimen/material_drawer_item_badge_text\"\n        app:layout_constraintBottom_toBottomOf=\"@id/material_drawer_account_header_current\"\n        app:layout_constraintStart_toStartOf=\"@id/material_drawer_account_header_current\"\n        tools:text=\"99\" />\n\n    <com.keylesspalace.tusky.view.BezelImageView\n        android:id=\"@+id/material_drawer_account_header_small_first\"\n        style=\"@style/BezelImageView\"\n        android:layout_width=\"@dimen/material_drawer_account_header_secondary\"\n        android:layout_height=\"@dimen/material_drawer_account_header_secondary\"\n        android:layout_marginTop=\"@dimen/material_drawer_account_header_horizontal_top\"\n        android:layout_marginEnd=\"@dimen/material_drawer_vertical_padding\"\n        android:clickable=\"true\"\n        android:elevation=\"2dp\"\n        android:focusable=\"true\"\n        android:scaleType=\"fitCenter\"\n        android:visibility=\"visible\"\n        app:layout_constraintEnd_toStartOf=\"@id/material_drawer_account_header_small_second\"\n        app:layout_constraintTop_toBottomOf=\"@+id/material_drawer_statusbar_guideline\" />\n\n    <androidx.appcompat.widget.AppCompatTextView\n        android:id=\"@+id/material_drawer_account_header_small_first_badge\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:elevation=\"4dp\"\n        android:fontFamily=\"sans-serif\"\n        android:gravity=\"center\"\n        android:lines=\"1\"\n        android:minWidth=\"20dp\"\n        android:paddingLeft=\"1dp\"\n        android:paddingRight=\"1dp\"\n        android:singleLine=\"true\"\n        android:textSize=\"@dimen/material_drawer_item_badge_small_text\"\n        app:layout_constraintBottom_toBottomOf=\"@id/material_drawer_account_header_small_first\"\n        app:layout_constraintStart_toStartOf=\"@id/material_drawer_account_header_small_first\"\n        tools:text=\"99\" />\n\n    <com.keylesspalace.tusky.view.BezelImageView\n        android:id=\"@+id/material_drawer_account_header_small_second\"\n        style=\"@style/BezelImageView\"\n        android:layout_width=\"@dimen/material_drawer_account_header_secondary\"\n        android:layout_height=\"@dimen/material_drawer_account_header_secondary\"\n        android:layout_marginTop=\"@dimen/material_drawer_account_header_horizontal_top\"\n        android:layout_marginEnd=\"@dimen/material_drawer_vertical_padding\"\n        android:clickable=\"true\"\n        android:elevation=\"2dp\"\n        android:focusable=\"true\"\n        android:scaleType=\"fitCenter\"\n        android:visibility=\"visible\"\n        app:layout_constraintEnd_toStartOf=\"@id/material_drawer_account_header_small_third\"\n        app:layout_constraintTop_toBottomOf=\"@+id/material_drawer_statusbar_guideline\" />\n\n    <androidx.appcompat.widget.AppCompatTextView\n        android:id=\"@+id/material_drawer_account_header_small_second_badge\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:elevation=\"4dp\"\n        android:fontFamily=\"sans-serif\"\n        android:gravity=\"center\"\n        android:lines=\"1\"\n        android:minWidth=\"20dp\"\n        android:paddingLeft=\"1dp\"\n        android:paddingRight=\"1dp\"\n        android:singleLine=\"true\"\n        android:textSize=\"@dimen/material_drawer_item_badge_small_text\"\n        app:layout_constraintBottom_toBottomOf=\"@id/material_drawer_account_header_small_second\"\n        app:layout_constraintStart_toStartOf=\"@id/material_drawer_account_header_small_second\"\n        tools:text=\"99\" />\n\n    <com.keylesspalace.tusky.view.BezelImageView\n        android:id=\"@+id/material_drawer_account_header_small_third\"\n        style=\"@style/BezelImageView\"\n        android:layout_width=\"@dimen/material_drawer_account_header_secondary\"\n        android:layout_height=\"@dimen/material_drawer_account_header_secondary\"\n        android:layout_marginTop=\"@dimen/material_drawer_account_header_horizontal_top\"\n        android:layout_marginEnd=\"@dimen/material_drawer_vertical_padding\"\n        android:clickable=\"true\"\n        android:elevation=\"2dp\"\n        android:focusable=\"true\"\n        android:scaleType=\"fitCenter\"\n        android:visibility=\"visible\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/material_drawer_statusbar_guideline\" />\n\n    <androidx.appcompat.widget.AppCompatTextView\n        android:id=\"@+id/material_drawer_account_header_small_third_badge\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:elevation=\"4dp\"\n        android:fontFamily=\"sans-serif\"\n        android:gravity=\"center\"\n        android:lines=\"1\"\n        android:minWidth=\"20dp\"\n        android:paddingLeft=\"1dp\"\n        android:paddingRight=\"1dp\"\n        android:singleLine=\"true\"\n        android:textSize=\"@dimen/material_drawer_item_badge_small_text\"\n        app:layout_constraintBottom_toBottomOf=\"@id/material_drawer_account_header_small_third\"\n        app:layout_constraintStart_toStartOf=\"@id/material_drawer_account_header_small_third\"\n        tools:text=\"99\" />\n\n    <androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id/material_drawer_text_guideline\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\"\n        app:layout_constraintGuide_end=\"@dimen/material_drawer_account_header_dropdown_guideline\" />\n\n    <androidx.appcompat.widget.AppCompatTextView\n        android:id=\"@+id/material_drawer_account_header_name\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"@dimen/material_drawer_vertical_padding\"\n        android:fontFamily=\"sans-serif-medium\"\n        android:lines=\"1\"\n        android:maxLines=\"1\"\n        android:textSize=\"@dimen/material_drawer_account_header_title\"\n        app:layout_constraintBottom_toTopOf=\"@id/material_drawer_account_header_email\"\n        app:layout_constraintEnd_toStartOf=\"@id/material_drawer_account_header_text_switcher\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/material_drawer_text_guideline\"\n        app:layout_constraintVertical_chainStyle=\"packed\" />\n\n    <androidx.appcompat.widget.AppCompatTextView\n        android:id=\"@+id/material_drawer_account_header_email\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"@dimen/material_drawer_vertical_padding\"\n        android:layout_marginBottom=\"@dimen/material_drawer_padding\"\n        android:fontFamily=\"sans-serif\"\n        android:lines=\"1\"\n        android:maxLines=\"1\"\n        android:textSize=\"@dimen/material_drawer_account_header_subtext\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toStartOf=\"@id/material_drawer_account_header_text_switcher\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/material_drawer_account_header_name\" />\n\n    <androidx.appcompat.widget.AppCompatImageView\n        android:id=\"@+id/material_drawer_account_header_text_switcher\"\n        android:layout_width=\"@dimen/material_drawer_account_header_dropdown\"\n        android:layout_height=\"@dimen/material_drawer_account_header_dropdown\"\n        android:layout_marginEnd=\"@dimen/material_drawer_vertical_padding\"\n        android:layout_marginBottom=\"@dimen/material_drawer_account_header_dropdown_margin_bottom\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\" />\n</merge>\n"
  },
  {
    "path": "app/src/main/res/layout/notifications_filter.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"200dp\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <ListView\n        android:id=\"@+id/listView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\" />\n\n    <Button\n        android:id=\"@+id/buttonApply\"\n        style=\"@style/TuskyButton.TextButton\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_weight=\"0\"\n        android:text=\"@string/filter_apply\"\n        android:textSize=\"?attr/status_text_medium\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/pref_slider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2018 The Android Open Source Project\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  -->\n\n<!-- Layout used by SeekBarPreference for the seekbar widget style. Minimally adapted for use\n     with Slider instead of SeekBar. -->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:minHeight=\"?android:attr/listPreferredItemHeightSmall\"\n    android:gravity=\"center_vertical\"\n    android:paddingStart=\"?android:attr/listPreferredItemPaddingStart\"\n    android:paddingEnd=\"?android:attr/listPreferredItemPaddingEnd\"\n    android:clipChildren=\"false\"\n    android:clipToPadding=\"false\"\n    android:baselineAligned=\"false\">\n\n    <include layout=\"@layout/image_frame\"/>\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginBottom=\"8dp\"\n        android:clipChildren=\"false\"\n        android:clipToPadding=\"false\">\n\n        <RelativeLayout\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"0dp\"\n            android:layout_weight=\"1\">\n\n            <TextView\n                android:id=\"@android:id/title\"\n                android:labelFor=\"@id/slider\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:singleLine=\"true\"\n                android:textAppearance=\"?android:attr/textAppearanceListItem\"\n                android:ellipsize=\"marquee\"\n                tools:ignore=\"LabelFor,SelectableText\" />\n\n            <TextView\n                android:id=\"@android:id/summary\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_below=\"@android:id/title\"\n                android:layout_alignStart=\"@android:id/title\"\n                android:layout_gravity=\"start\"\n                android:textAlignment=\"viewStart\"\n                android:textColor=\"?android:attr/textColorSecondary\"\n                android:maxLines=\"4\"\n                style=\"@style/PreferenceSummaryTextStyle\"\n                tools:ignore=\"SelectableText\" />\n\n        </RelativeLayout>\n\n        <!-- Using UnPressableLinearLayout as a workaround to disable the pressed state propagation\n        to the children of this container layout. Otherwise, the animated pressed state will also\n        play for the thumb in the AbsSeekBar in addition to the preference's ripple background.\n        The background of the SeekBar is also set to null to disable the ripple background -->\n        <androidx.preference.UnPressableLinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:gravity=\"center_vertical\"\n            android:paddingLeft=\"0dp\"\n            android:paddingStart=\"0dp\"\n            android:paddingRight=\"0dp\"\n            android:paddingEnd=\"0dp\"\n            android:clipChildren=\"false\"\n            android:clipToPadding=\"false\">\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/decrement\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:visibility=\"gone\"\n                style=\"@style/Widget.Material3.Button.IconButton\" />\n\n            <!-- The total height of the Seekbar widget's area should be 48dp - this allows for an\n            increased touch area so you do not need to exactly tap the thumb to move it. However,\n            setting the Seekbar height directly causes the thumb and seekbar to be misaligned on\n            API 22 and 23 - so instead we just set 15dp padding above and below, to account for the\n            18dp default height of the Seekbar thumb for a total of 48dp.\n            Note: we set 0dp padding at the start and end of this seekbar to allow it to properly\n            fit into the layout, but this means that there's no leeway on either side for touch\n            input - this might be something we should reconsider down the line. -->\n            <com.google.android.material.slider.Slider\n                android:id=\"@+id/slider\"\n                android:layout_width=\"0dp\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"wrap_content\"\n                android:paddingLeft=\"@dimen/preference_seekbar_padding_horizontal\"\n                android:paddingStart=\"@dimen/preference_seekbar_padding_horizontal\"\n                android:paddingRight=\"@dimen/preference_seekbar_padding_horizontal\"\n                android:paddingEnd=\"@dimen/preference_seekbar_padding_horizontal\"\n                android:paddingTop=\"@dimen/preference_seekbar_padding_vertical\"\n                android:paddingBottom=\"@dimen/preference_seekbar_padding_vertical\"\n                android:background=\"@null\"\n                app:trackColorActive=\"?attr/colorPrimary\"\n                app:trackColorInactive=\"?attr/colorSurface\"/>\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/increment\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:visibility=\"gone\"\n                style=\"@style/Widget.Material3.Button.IconButton\" />\n        </androidx.preference.UnPressableLinearLayout>\n    </LinearLayout>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/preference_material_switch.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Derived from https://github.com/androidx/androidx/blob/8cb282cc/preference/preference/res/layout/preference_widget_switch_compat.xml -->\n<com.google.android.material.materialswitch.MaterialSwitch xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/switchWidget\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@null\"\n    android:clickable=\"false\"\n    android:focusable=\"false\" />\n"
  },
  {
    "path": "app/src/main/res/layout/preference_notification_policy.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/notification_policy_value\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:textStyle=\"bold\" />\n"
  },
  {
    "path": "app/src/main/res/layout/search_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.appcompat.widget.SearchView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    app:searchHintIcon=\"@null\"\n    android:maxWidth=\"10000dp\" />"
  },
  {
    "path": "app/src/main/res/layout/simple_list_item_1.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Copyright (C) 2006 The Android Open Source Project\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-->\n\n<!-- Copied from platform so it will work with view binding -->\n\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@android:id/text1\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:textAppearance=\"?android:attr/textAppearanceListItemSmall\"\n    android:gravity=\"center_vertical\"\n    android:paddingStart=\"?android:attr/listPreferredItemPaddingStart\"\n    android:paddingEnd=\"?android:attr/listPreferredItemPaddingEnd\"\n    android:minHeight=\"?android:attr/listPreferredItemHeightSmall\" />\n"
  },
  {
    "path": "app/src/main/res/layout/toolbar_basic.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.google.android.material.appbar.AppBarLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/appbar\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:fitsSystemWindows=\"true\"\n    app:liftOnScroll=\"false\">\n\n    <com.google.android.material.appbar.MaterialToolbar\n        android:id=\"@+id/toolbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:minHeight=\"?attr/actionBarSize\" />\n\n</com.google.android.material.appbar.AppBarLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/view_background_message.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    tools:parentTag=\"android.widget.LinearLayout\">\n\n    <com.google.android.material.card.MaterialCardView\n        android:id=\"@+id/helpTextCard\"\n        style=\"@style/Widget.Material3.CardView.Filled\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"8dp\"\n        android:visibility=\"gone\"\n        app:cardBackgroundColor=\"?attr/colorSurface\">\n\n        <TextView\n            android:id=\"@+id/helpText\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_margin=\"16dp\"\n            android:lineSpacingMultiplier=\"1.1\"\n            android:textColor=\"@color/textColorPrimary\"\n            android:textSize=\"?attr/status_text_medium\"\n            tools:text=\"@string/help_empty_home\" />\n\n    </com.google.android.material.card.MaterialCardView>\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\"\n        android:gravity=\"center\"\n        android:orientation=\"vertical\">\n\n        <ImageView\n            android:id=\"@+id/imageView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"4dp\"\n            android:contentDescription=\"@null\"\n            android:scaleType=\"centerInside\"\n            tools:src=\"@drawable/errorphant_offline\" />\n\n        <com.keylesspalace.tusky.view.ClickableSpanTextView\n            android:id=\"@+id/messageTextView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:drawablePadding=\"16dp\"\n            android:lineSpacingMultiplier=\"1.1\"\n            android:paddingLeft=\"16dp\"\n            android:paddingTop=\"16dp\"\n            android:paddingRight=\"16dp\"\n            android:text=\"@string/error_network\"\n            android:textAlignment=\"center\"\n            android:textSize=\"?attr/status_text_medium\" />\n\n        <Button\n            android:id=\"@+id/button\"\n            style=\"@style/TuskyButton.Outlined\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"8dp\"\n            android:layout_marginBottom=\"4dp\"\n            android:text=\"@string/action_retry\" />\n\n    </LinearLayout>\n\n</merge>\n"
  },
  {
    "path": "app/src/main/res/layout/view_compose_options.xml",
    "content": "<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:layout_height=\"wrap_content\"\n    tools:layout_width=\"match_parent\"\n    tools:parentTag=\"RadioGroup\">\n\n    <RadioButton\n        android:id=\"@+id/publicRadioButton\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"4dp\"\n        android:layout_weight=\"1\"\n        android:button=\"@drawable/ic_public_24dp\"\n        android:paddingStart=\"10dp\"\n        android:paddingEnd=\"0dp\"\n        android:text=\"@string/visibility_public\"\n        android:textColor=\"?android:textColorTertiary\"\n        app:buttonTint=\"@color/compound_button_color\" />\n\n    <RadioButton\n        android:id=\"@+id/unlistedRadioButton\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:layout_weight=\"1\"\n        android:button=\"@drawable/ic_lock_open_24dp\"\n        android:paddingStart=\"10dp\"\n        android:paddingEnd=\"0dp\"\n        android:text=\"@string/visibility_unlisted\"\n        android:textColor=\"?android:textColorTertiary\"\n        app:buttonTint=\"@color/compound_button_color\" />\n\n    <RadioButton\n        android:id=\"@+id/privateRadioButton\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:layout_weight=\"1\"\n        android:button=\"@drawable/ic_lock_24dp\"\n        android:paddingStart=\"10dp\"\n        android:paddingEnd=\"0dp\"\n        android:text=\"@string/visibility_private\"\n        android:textColor=\"?android:textColorTertiary\"\n        app:buttonTint=\"@color/compound_button_color\" />\n\n    <RadioButton\n        android:id=\"@+id/directRadioButton\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_weight=\"1\"\n        android:button=\"@drawable/ic_mail_24dp\"\n        android:paddingStart=\"10dp\"\n        android:paddingEnd=\"0dp\"\n        android:text=\"@string/visibility_direct\"\n        android:textColor=\"?android:textColorTertiary\"\n        app:buttonTint=\"@color/compound_button_color\" />\n\n</merge>\n"
  },
  {
    "path": "app/src/main/res/layout/view_compose_schedule.xml",
    "content": "<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:parentTag=\"androidx.constraintlayout.widget.ConstraintLayout\">\n\n    <Button\n        android:id=\"@+id/resetScheduleButton\"\n        style=\"@style/TuskyButton.Outlined\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"16dp\"\n        android:text=\"@string/action_reset_schedule\"\n        app:layout_constraintBottom_toTopOf=\"@id/invalidScheduleWarning\"\n        app:layout_constraintStart_toStartOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/scheduledDateTime\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:drawablePadding=\"4dp\"\n        android:paddingStart=\"4dp\"\n        android:paddingEnd=\"4dp\"\n        android:paddingTop=\"4dp\"\n        android:paddingBottom=\"16dp\"\n        android:textColor=\"?android:textColorTertiary\"\n        android:textSize=\"?attr/status_text_medium\"\n        app:drawableTint=\"?attr/colorPrimary\"\n        app:layout_constraintBottom_toTopOf=\"@id/invalidScheduleWarning\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"1\"\n        app:layout_constraintStart_toEndOf=\"@id/resetScheduleButton\"\n        tools:text=\"2020/01/01 00:00:00\" />\n\n    <TextView\n        android:id=\"@+id/invalidScheduleWarning\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:drawablePadding=\"4dp\"\n        android:paddingStart=\"4dp\"\n        android:paddingEnd=\"4dp\"\n        android:paddingTop=\"4dp\"\n        android:paddingBottom=\"16dp\"\n        android:textColor=\"?android:textColorTertiary\"\n        android:textSize=\"?attr/status_text_medium\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"1\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        tools:text=\"@string/warning_scheduling_interval\" />\n\n</merge>\n"
  },
  {
    "path": "app/src/main/res/layout/view_poll_preview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    tools:parentTag=\"com.google.android.material.card.MaterialCardView\">\n\n    <LinearLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        android:paddingHorizontal=\"@dimen/poll_preview_padding_horizontal\"\n        android:paddingVertical=\"@dimen/poll_preview_padding_vertical\">\n\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:drawablePadding=\"4dp\"\n            android:gravity=\"center_vertical\"\n            android:text=\"@string/create_poll_title\"\n            android:textColor=\"?android:attr/textColorTertiary\"\n            android:textStyle=\"bold\"\n            app:drawableStartCompat=\"@drawable/ic_insert_chart_24dp\"\n            app:drawableTint=\"?android:attr/textColorTertiary\" />\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/pollPreviewOptions\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"4dp\"\n            android:nestedScrollingEnabled=\"false\"\n            android:overScrollMode=\"never\"\n            app:layoutManager=\"androidx.recyclerview.widget.LinearLayoutManager\" />\n\n        <TextView\n            android:id=\"@+id/pollDurationPreview\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"4dp\"\n            tools:text=\"5 Minutes\" />\n        \n    </LinearLayout>\n\n</merge>\n"
  },
  {
    "path": "app/src/main/res/layout-land/fragment_report_done.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".components.report.fragments.ReportStatusesFragment\">\n\n    <View\n        android:id=\"@+id/checkMark\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:layout_marginStart=\"48dp\"\n        android:background=\"@drawable/report_success_background\"\n        app:layout_constraintDimensionRatio=\"W,1:1\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintHeight_default=\"percent\"\n        app:layout_constraintHeight_percent=\"0.4\" />\n\n    <ImageView\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:scaleType=\"fitCenter\"\n        app:layout_constraintBottom_toBottomOf=\"@id/checkMark\"\n        app:layout_constraintEnd_toEndOf=\"@id/checkMark\"\n        app:layout_constraintHeight_default=\"percent\"\n        app:layout_constraintHeight_percent=\"0.25\"\n        app:layout_constraintStart_toStartOf=\"@id/checkMark\"\n        app:layout_constraintTop_toTopOf=\"@id/checkMark\"\n        app:srcCompat=\"@drawable/ic_check_24dp\"\n        tools:ignore=\"ContentDescription\" />\n\n    <TextView\n        android:id=\"@+id/textReported\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"48dp\"\n        android:gravity=\"center_horizontal\"\n        android:textColor=\"?android:textColorPrimary\"\n        android:textSize=\"?attr/status_text_large\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/checkMark\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        android:layout_marginStart=\"48dp\"\n        android:layout_marginEnd=\"16dp\"/>\n\n    <Button\n        android:id=\"@+id/buttonMute\"\n        style=\"@style/TuskyButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:minWidth=\"@dimen/min_report_button_width\"\n        android:text=\"@string/action_mute\"\n        app:layout_constraintBottom_toTopOf=\"@id/buttonBlock\"\n        app:layout_constraintEnd_toEndOf=\"@id/textReported\"\n        app:layout_constraintStart_toStartOf=\"@id/textReported\"\n        app:layout_constraintTop_toBottomOf=\"@id/textReported\"\n        app:layout_constraintVertical_chainStyle=\"packed\" />\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/progressMute\"\n        style=\"@style/Widget.Material3.CircularProgressIndicator.Small\"\n        android:layout_width=\"wrap_content\"\n        android:indeterminate=\"true\"\n        android:layout_height=\"wrap_content\"\n        app:layout_constraintBottom_toBottomOf=\"@id/buttonMute\"\n        app:layout_constraintEnd_toEndOf=\"@id/buttonMute\"\n        app:layout_constraintStart_toStartOf=\"@id/buttonMute\"\n        app:layout_constraintTop_toTopOf=\"@id/buttonMute\" />\n\n    <Button\n        android:id=\"@+id/buttonBlock\"\n        style=\"@style/TuskyButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:minWidth=\"@dimen/min_report_button_width\"\n        android:text=\"@string/action_block\"\n        app:layout_constraintBottom_toTopOf=\"@id/buttonDone\"\n        app:layout_constraintEnd_toEndOf=\"@id/textReported\"\n        app:layout_constraintStart_toStartOf=\"@id/textReported\"\n        app:layout_constraintTop_toBottomOf=\"@id/buttonMute\"\n        app:layout_constraintVertical_chainStyle=\"packed\" />\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/progressBlock\"\n        style=\"@style/Widget.Material3.CircularProgressIndicator.Small\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        app:layout_constraintBottom_toBottomOf=\"@id/buttonBlock\"\n        app:layout_constraintEnd_toEndOf=\"@id/buttonBlock\"\n        app:layout_constraintStart_toStartOf=\"@id/buttonBlock\"\n        app:layout_constraintTop_toTopOf=\"@id/buttonBlock\" />\n\n    <Button\n        android:id=\"@+id/buttonDone\"\n        style=\"@style/TuskyButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"32dp\"\n        android:minWidth=\"@dimen/min_report_button_width\"\n        android:text=\"@string/button_done\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"@id/textReported\"\n        app:layout_constraintStart_toStartOf=\"@id/textReported\"\n        app:layout_constraintTop_toBottomOf=\"@id/buttonBlock\"\n        app:layout_constraintVertical_chainStyle=\"packed\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout-land/item_trending_cell.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/trending_container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:clipChildren=\"false\"\n    android:clipToPadding=\"false\"\n    android:focusable=\"true\"\n    android:importantForAccessibility=\"yes\"\n    android:padding=\"8dp\"\n    android:paddingStart=\"?android:attr/listPreferredItemPaddingStart\"\n    android:paddingEnd=\"?android:attr/listPreferredItemPaddingEnd\"\n    tools:layout_height=\"128dp\">\n\n    <com.keylesspalace.tusky.view.GraphView\n        android:id=\"@+id/graph\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"120dp\"\n        android:importantForAccessibility=\"no\"\n        app:graphColor=\"?android:colorBackground\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toStartOf=\"@id/current_usage\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:lineWidth=\"2sp\"\n        app:metaColor=\"?android:attr/textColorTertiary\"\n        app:primaryLineColor=\"?attr/colorPrimary\"\n        app:proportionalTrending=\"true\"\n        app:secondaryLineColor=\"@color/warning_color\" />\n\n    <TextView\n        android:id=\"@+id/current_usage\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:importantForAccessibility=\"no\"\n        android:paddingStart=\"6dp\"\n        android:textAlignment=\"textEnd\"\n        android:textAppearance=\"@style/TextAppearance.AppCompat.Small\"\n        android:textColor=\"?attr/colorPrimary\"\n        android:textSize=\"12sp\"\n        android:textStyle=\"normal\"\n        app:layout_constrainedWidth=\"true\"\n        app:layout_constraintBottom_toTopOf=\"@id/current_accounts\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/graph\"\n        tools:ignore=\"RtlSymmetry\"\n        tools:text=\"12 345\" />\n\n    <TextView\n        android:id=\"@+id/current_accounts\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:importantForAccessibility=\"no\"\n        android:paddingStart=\"6dp\"\n        android:textAlignment=\"textEnd\"\n        android:textAppearance=\"@style/TextAppearance.AppCompat.Small\"\n        android:textColor=\"@color/warning_color\"\n        android:textSize=\"12sp\"\n        android:textStyle=\"normal\"\n        app:layout_constrainedWidth=\"true\"\n        app:layout_constraintBottom_toBottomOf=\"@id/graph\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/graph\"\n        tools:ignore=\"RtlSymmetry\"\n        tools:text=\"12 345\" />\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/legend_container\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?android:colorBackground\"\n        android:backgroundTint=\"@color/color_background_transparent_60\"\n        android:backgroundTintMode=\"src_in\"\n        android:paddingTop=\"8dp\"\n        android:paddingBottom=\"8dp\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\">\n\n        <TextView\n            android:id=\"@+id/tag\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:ellipsize=\"end\"\n            android:importantForAccessibility=\"no\"\n            android:singleLine=\"true\"\n            android:textAlignment=\"textStart\"\n            android:textAppearance=\"?android:attr/textAppearanceListItem\"\n            android:textColor=\"?android:textColorPrimary\"\n            android:textStyle=\"normal\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:text=\"#itishashtagtuesdayitishashtagtuesday\" />\n\n        <TextView\n            android:id=\"@+id/total_usage\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"4dp\"\n            android:importantForAccessibility=\"no\"\n            android:textAlignment=\"textEnd\"\n            android:textAppearance=\"?android:attr/textAppearanceListItemSmall\"\n            android:textColor=\"?attr/colorPrimary\"\n            android:textStyle=\"normal|bold\"\n            app:layout_constrainedWidth=\"false\"\n            app:layout_constraintEnd_toStartOf=\"@id/barrier2\"\n            app:layout_constraintHorizontal_chainStyle=\"spread_inside\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/tag\"\n            tools:text=\"12 345\" />\n\n        <TextView\n            android:id=\"@+id/usageLabel\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"5dp\"\n            android:importantForAccessibility=\"no\"\n            android:text=\"@string/total_usage\"\n            android:textAlignment=\"textEnd\"\n            android:textAppearance=\"?android:attr/textAppearanceListItemSecondary\"\n            android:textColor=\"?android:textColorTertiary\"\n            app:layout_constrainedWidth=\"false\"\n            app:layout_constraintBottom_toBottomOf=\"@+id/total_usage\"\n            app:layout_constraintTop_toTopOf=\"@+id/total_usage\"\n            app:layout_constraintStart_toEndOf=\"@id/barrier2\" />\n\n        <TextView\n            android:id=\"@+id/total_accounts\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:importantForAccessibility=\"no\"\n            android:textAlignment=\"textEnd\"\n            android:textAppearance=\"?android:attr/textAppearanceListItemSmall\"\n            android:textColor=\"@color/warning_color\"\n            android:textStyle=\"normal|bold\"\n            app:layout_constrainedWidth=\"false\"\n            app:layout_constraintEnd_toStartOf=\"@id/barrier2\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@+id/total_usage\"\n            tools:text=\"498\" />\n\n        <TextView\n            android:id=\"@+id/accountsLabel\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"5dp\"\n            android:importantForAccessibility=\"no\"\n            android:text=\"@string/total_accounts\"\n            android:textAppearance=\"?android:attr/textAppearanceListItemSecondary\"\n            android:textColor=\"?android:textColorTertiary\"\n            app:layout_constrainedWidth=\"true\"\n            app:layout_constraintBottom_toBottomOf=\"@+id/total_accounts\"\n            app:layout_constraintTop_toTopOf=\"@+id/total_accounts\"\n            app:layout_constraintStart_toEndOf=\"@id/barrier2\" />\n\n        <androidx.constraintlayout.widget.Barrier\n            android:id=\"@+id/barrier2\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            app:barrierDirection=\"end\"\n            app:constraint_referenced_ids=\"total_usage,total_accounts\"\n            tools:layout_editor_absoluteY=\"8dp\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout-sw640dp/fragment_timeline.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"?attr/windowBackgroundColor\">\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"640dp\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"center_horizontal\"\n        android:background=\"?android:attr/colorBackground\">\n\n        <com.google.android.material.progressindicator.CircularProgressIndicator\n            android:id=\"@+id/progressBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:indeterminate=\"true\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\" />\n\n        <com.keylesspalace.tusky.view.TuskySwipeRefreshLayout\n            android:id=\"@+id/swipeRefreshLayout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/recyclerView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:clipToPadding=\"false\" />\n\n        </com.keylesspalace.tusky.view.TuskySwipeRefreshLayout>\n\n        <com.keylesspalace.tusky.view.BackgroundMessageView\n            android:id=\"@+id/statusView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_marginBottom=\"?attr/actionBarSize\"\n            android:visibility=\"gone\"\n            tools:src=\"@drawable/errorphant_error\"\n            tools:visibility=\"visible\" />\n\n        <androidx.core.widget.ContentLoadingProgressBar\n            android:id=\"@+id/topProgressBar\"\n            style=\"@style/Widget.AppCompat.ProgressBar.Horizontal\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:indeterminate=\"true\"\n            android:visibility=\"gone\"\n            app:layout_constraintBottom_toTopOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout-sw640dp/fragment_timeline_notifications.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright 2023 Tusky Contributors\n  ~\n  ~ This file is a part of Tusky.\n  ~\n  ~ This program is free software; you can redistribute it and/or modify it under the terms of the\n  ~ GNU General Public License as published by the Free Software Foundation; either version 3 of the\n  ~ License, or (at your option) any later version.\n  ~\n  ~ Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n  ~ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n  ~ Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License along with Tusky; if not,\n  ~ see <http://www.gnu.org/licenses>.\n  -->\n\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"?attr/windowBackgroundColor\">\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n        android:layout_width=\"640dp\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"center_horizontal\"\n        android:background=\"?android:attr/colorBackground\">\n\n        <com.google.android.material.appbar.AppBarLayout\n            android:id=\"@+id/appBarOptions\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:liftOnScroll=\"false\">\n\n            <LinearLayout\n                android:id=\"@+id/topButtonsLayout\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\">\n\n                <Button\n                    android:id=\"@+id/buttonClear\"\n                    style=\"@style/TuskyButton.TextButton\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_weight=\"1\"\n                    android:text=\"@string/notifications_clear\"\n                    android:textSize=\"?attr/status_text_medium\" />\n\n                <Button\n                    android:id=\"@+id/buttonFilter\"\n                    style=\"@style/TuskyButton.TextButton\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_weight=\"1\"\n                    android:text=\"@string/notifications_apply_filter\"\n                    android:textSize=\"?attr/status_text_medium\" />\n\n            </LinearLayout>\n\n        </com.google.android.material.appbar.AppBarLayout>\n\n        <com.keylesspalace.tusky.view.TuskySwipeRefreshLayout\n            android:id=\"@+id/swipeRefreshLayout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n            <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/recyclerView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:background=\"?android:attr/colorBackground\"\n                android:clipToPadding=\"false\"\n                android:paddingBottom=\"@dimen/recyclerview_bottom_padding_actionbutton\" />\n\n        </com.keylesspalace.tusky.view.TuskySwipeRefreshLayout>\n\n        <com.keylesspalace.tusky.view.BackgroundMessageView\n            android:id=\"@+id/statusView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_gravity=\"center\"\n            android:visibility=\"gone\"\n            tools:visibility=\"visible\" />\n\n        <com.google.android.material.progressindicator.CircularProgressIndicator\n            android:id=\"@+id/progressBar\"\n            android:layout_width=\"wrap_content\"\n            android:indeterminate=\"true\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\" />\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout-sw640dp/fragment_view_thread.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"?attr/windowBackgroundColor\">\n\n    <com.keylesspalace.tusky.view.TuskySwipeRefreshLayout\n        android:id=\"@+id/swipeRefreshLayout\"\n        android:layout_width=\"640dp\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"center_horizontal|top\"\n        app:layout_behavior=\"com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"vertical\">\n\n            <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/recyclerView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"0dp\"\n                android:layout_weight=\"1\"\n                android:background=\"?android:attr/colorBackground\"\n                android:clipToPadding=\"false\"\n                android:paddingBottom=\"@dimen/recyclerview_bottom_padding_no_actionbutton\"\n                android:scrollbarStyle=\"outsideOverlay\"\n                android:scrollbars=\"vertical\" />\n\n            <com.google.android.material.progressindicator.LinearProgressIndicator\n                android:id=\"@+id/threadProgressBar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:contentDescription=\"@string/a11y_label_loading_thread\"\n                android:indeterminate=\"true\"\n                android:visibility=\"gone\" />\n\n            <com.keylesspalace.tusky.view.BackgroundMessageView\n                android:id=\"@+id/statusView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:layout_gravity=\"center\"\n                android:visibility=\"gone\"\n                tools:visibility=\"visible\" />\n        </LinearLayout>\n    </com.keylesspalace.tusky.view.TuskySwipeRefreshLayout>\n\n    <com.google.android.material.progressindicator.CircularProgressIndicator\n        android:id=\"@+id/initialProgressBar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:contentDescription=\"@string/a11y_label_loading_thread\"\n        android:indeterminate=\"true\"\n        android:visibility=\"gone\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/menu/account_toolbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item android:id=\"@+id/action_open_in_web\"\n        android:title=\"@string/action_open_in_web\"\n        app:showAsAction=\"never\" />\n\n    <item android:id=\"@+id/action_open_as\"\n        android:title=\"@string/action_open_as\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/action_account_share\"\n        android:title=\"@string/action_share\">\n        <menu>\n            <item\n                android:id=\"@+id/action_share_account_link\"\n                android:title=\"@string/action_share_account_link\" />\n            <item\n                android:id=\"@+id/action_share_account_username\"\n                android:title=\"@string/action_share_account_username\" />\n        </menu>\n    </item>\n\n    <item android:id=\"@+id/action_mute\"\n        android:title=\"@string/action_mute\"\n        app:showAsAction=\"never\" />\n\n    <item android:id=\"@+id/action_block\"\n        android:title=\"@string/action_block\"\n        app:showAsAction=\"never\" />\n\n    <item android:id=\"@+id/action_add_or_remove_from_list\"\n        android:title=\"@string/action_add_or_remove_from_list\"\n        app:showAsAction=\"never\" />\n\n    <item android:id=\"@+id/action_mute_domain\"\n        android:title=\"@string/action_mute_domain\"\n        app:showAsAction=\"never\" />\n\n    <item android:id=\"@+id/action_show_reblogs\"\n        android:title=\"@string/action_hide_reblogs\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/action_refresh\"\n        android:title=\"@string/action_refresh\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/action_report\"\n        android:title=\"@string/action_report\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/activity_announcements.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/action_refresh\"\n        android:title=\"@string/action_refresh\"\n        app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/action_search\"\n        android:title=\"@string/action_search\"\n        android:icon=\"@drawable/ic_search_24dp\"\n        app:showAsAction=\"ifRoom\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/activity_notification_requests.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/open_settings\"\n        android:title=\"@string/open_settings\"\n        android:icon=\"@drawable/ic_settings_24dp\"\n        app:showAsAction=\"ifRoom\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/activity_scheduled_status.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/action_refresh\"\n        android:title=\"@string/action_refresh\"\n        app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/conversation_more.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item\n        android:id=\"@+id/status_mute_conversation\"\n        android:title=\"@string/action_mute_conversation\" />\n    <item\n        android:id=\"@+id/status_unmute_conversation\"\n        android:title=\"@string/action_unmute_conversation\" />\n    <item\n        android:id=\"@+id/conversation_delete\"\n        android:title=\"@string/action_delete_conversation\" />\n\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/edit_profile_toolbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/action_save\"\n        android:icon=\"@drawable/ic_done_outline_24dp\"\n        android:title=\"@string/action_save\"\n        app:showAsAction=\"always\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/fragment_account_media.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/action_refresh\"\n        android:title=\"@string/action_refresh\"\n        app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/fragment_conversations.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/action_refresh\"\n        android:title=\"@string/action_refresh\"\n        app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/fragment_notifications.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright 2023 Tusky Contributors\n  ~\n  ~ This file is a part of Tusky.\n  ~\n  ~ This program is free software; you can redistribute it and/or modify it under the terms of the\n  ~ GNU General Public License as published by the Free Software Foundation; either version 3 of the\n  ~ License, or (at your option) any later version.\n  ~\n  ~ Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n  ~ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n  ~ Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License along with Tusky; if not,\n  ~ see <http://www.gnu.org/licenses>.\n  -->\n\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/action_refresh\"\n        android:title=\"@string/action_refresh\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/action_edit_notification_filter\"\n        android:title=\"@string/notifications_apply_filter\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/action_clear_notifications\"\n        android:title=\"@string/notifications_clear\"\n        app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/fragment_report_statuses.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/action_refresh\"\n        android:title=\"@string/action_refresh\"\n        app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/fragment_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/action_refresh\"\n        android:title=\"@string/action_refresh\"\n        app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/fragment_timeline.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/action_refresh\"\n        android:title=\"@string/action_refresh\"\n        app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/fragment_view_edits.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/action_refresh\"\n        android:title=\"@string/action_refresh\"\n        app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/fragment_view_thread.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item android:id=\"@+id/action_open_in_web\"\n        android:title=\"@string/action_open_in_web\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/action_reveal\"\n        android:title=\"@string/expand_collapse_all_posts\"\n        app:showAsAction=\"ifRoom\"\n        android:icon=\"@drawable/ic_visibility_24dp\" />\n\n    <item\n        android:id=\"@+id/action_refresh\"\n        android:title=\"@string/action_refresh\"\n        app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/list_actions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item\n        android:id=\"@+id/list_edit\"\n        android:title=\"@string/action_add_or_remove_from_list\" />\n    <item\n        android:id=\"@+id/list_update\"\n        android:title=\"@string/action_rename_list\" />\n    <item\n        android:id=\"@+id/list_delete\"\n        android:title=\"@string/action_delete_list\" />\n\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/search_toolbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n        android:id=\"@+id/action_search\"\n        android:actionLayout=\"@layout/search_view\"\n        android:title=\"@string/action_search\"\n        app:actionViewClass=\"androidx.appcompat.widget.SearchView\"\n        app:searchIcon=\"@drawable/ic_search_24dp\"\n        app:showAsAction=\"always\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/status_more.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item\n        android:id=\"@+id/status_share\"\n        android:title=\"@string/action_share\">\n        <menu>\n            <item\n                android:id=\"@+id/post_share_link\"\n                android:title=\"@string/post_share_link\" />\n            <item\n                android:id=\"@+id/post_share_content\"\n                android:title=\"@string/post_share_content\" />\n        </menu>\n    </item>\n    <item\n        android:id=\"@+id/status_copy_link\"\n        android:title=\"@string/action_copy_link\" />\n    <item\n        android:id=\"@+id/status_translate\"\n        android:title=\"@string/action_translate\" />\n    <item\n        android:id=\"@+id/status_open_as\"\n        android:title=\"@string/action_open_as\" />\n    <item\n        android:id=\"@+id/status_download_media\"\n        android:title=\"@string/download_media\" />\n    <item\n        android:id=\"@+id/status_mute_conversation\"\n        android:title=\"@string/action_mute_conversation\" />\n\n    <group>\n        <item\n            android:id=\"@+id/status_mute\"\n            android:title=\"@string/action_mute\" />\n        <item\n            android:id=\"@+id/status_block\"\n            android:title=\"@string/action_block\" />\n        <item\n            android:id=\"@+id/status_report\"\n            android:title=\"@string/action_report\" />\n    </group>\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/status_more_for_user.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item\n        android:id=\"@+id/status_share\"\n        android:title=\"@string/action_share\">\n        <menu>\n            <item\n                android:id=\"@+id/post_share_link\"\n                android:title=\"@string/post_share_link\" />\n            <item\n                android:id=\"@+id/post_share_content\"\n                android:title=\"@string/post_share_content\" />\n        </menu>\n    </item>\n    <item\n        android:id=\"@+id/status_copy_link\"\n        android:title=\"@string/action_copy_link\" />\n    <item\n        android:id=\"@+id/status_translate\"\n        android:title=\"@string/action_translate\" />\n    <item\n        android:id=\"@+id/status_open_as\"\n        android:title=\"@string/action_open_as\" />\n    <item\n        android:id=\"@+id/status_reblog_private\"\n        android:title=\"@string/reblog_private\"\n        android:visible=\"false\" />\n    <item\n        android:id=\"@+id/status_unreblog_private\"\n        android:title=\"@string/unreblog_private\"\n        android:visible=\"false\" />\n    <item\n        android:id=\"@+id/status_mute_conversation\"\n        android:title=\"@string/action_mute_conversation\" />\n    <item\n        android:id=\"@+id/status_edit\"\n        android:title=\"@string/action_edit\" />\n    <item\n        android:id=\"@+id/status_delete\"\n        android:title=\"@string/action_delete\" />\n    <item\n        android:id=\"@+id/status_delete_and_redraft\"\n        android:title=\"@string/action_delete_and_redraft\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/view_hashtag_toolbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n        android:id=\"@+id/action_follow_hashtag\"\n        android:title=\"@string/action_follow\"\n        app:showAsAction=\"ifRoom\"\n        app:iconTint=\"?attr/colorOnSurface\"\n        android:icon=\"@drawable/ic_person_add_24dp_mirrored\" />\n\n    <item\n        android:id=\"@+id/action_unfollow_hashtag\"\n        android:title=\"@string/action_unfollow\"\n        app:showAsAction=\"ifRoom\"\n        app:iconTint=\"?attr/colorOnSurface\"\n        android:icon=\"@drawable/ic_person_remove_24dp_mirrored\" />\n\n    <item\n        android:id=\"@+id/action_mute_hashtag\"\n        android:title=\"@string/action_mute\"\n        app:showAsAction=\"ifRoom\"\n        app:iconTint=\"?attr/colorOnSurface\"\n        android:icon=\"@drawable/ic_volume_off_24dp\" />\n\n    <item\n        android:id=\"@+id/action_unmute_hashtag\"\n        android:title=\"@string/action_unmute\"\n        app:showAsAction=\"ifRoom\"\n        app:iconTint=\"?attr/colorOnSurface\"\n        android:icon=\"@drawable/ic_volume_up_24dp\" />\n\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/view_media_toolbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/action_download\"\n        android:icon=\"@drawable/ic_download_24dp\"\n        android:title=\"@string/dialog_download_image\"\n        app:showAsAction=\"ifRoom\" />\n    <item\n        android:id=\"@+id/action_share_media\"\n        android:icon=\"@drawable/ic_share_24dp\"\n        android:title=\"@string/action_share\"\n        app:showAsAction=\"ifRoom\" />\n    <item\n        android:id=\"@+id/action_copy_media_link\"\n        android:title=\"@string/action_copy_link\"\n        app:showAsAction=\"never\" />\n    <item\n        android:id=\"@+id/action_open_status\"\n        android:title=\"@string/action_open_post\"\n        app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "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\" android:layout_height=\"108dp\" android:layout_width=\"108dp\">\n    <background android:drawable=\"@color/icon_background\"/>\n    <foreground android:drawable=\"@drawable/launcher_foreground\" />\n    <monochrome android:drawable=\"@drawable/launcher_monochrome\"/>\n</adaptive-icon>\n"
  },
  {
    "path": "app/src/main/res/raw/apache.txt",
    "content": "Apache License\n\nVersion 2.0, January 2004\n\nhttp://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, and distribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\na. You must give any other recipients of the Work or Derivative Works a copy of this License; and\nb. You must cause any modified files to carry prominent notices stating that You changed the files; and\nc. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\nd. If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\nYou may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability."
  },
  {
    "path": "app/src/main/res/raw/isrg_root_x1.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\nTzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\ncmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\nWhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\nZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\nMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\nh77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\nA5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\nT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\nB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\nB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\nKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\nOlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\njh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\nqHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\nrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\nHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\nhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\nubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\nNFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\nORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\nTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\njNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\noyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\nmRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\nemyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "app/src/main/res/raw/isrg_root_x2.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw\nCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg\nR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00\nMDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT\nZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw\nEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW\n+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9\nItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T\nAQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI\nzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW\ntL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1\n/q4AaOeMSQ+2b1tbFfLn\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "app/src/main/res/values/actions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <item name=\"action_expand_collapse_cw\" type=\"id\" />\n    <item name=\"action_reply\" type=\"id\" />\n    <item name=\"action_favourite\" type=\"id\" />\n    <item name=\"action_unfavourite\" type=\"id\" />\n    <item name=\"action_bookmark\" type=\"id\" />\n    <item name=\"action_unbookmark\" type=\"id\" />\n    <item name=\"action_reblog\" type=\"id\" />\n    <item name=\"action_unreblog\" type=\"id\" />\n    <item name=\"action_open_profile\" type=\"id\" />\n    <item name=\"action_open_media_1\" type=\"id\" />\n    <item name=\"action_open_media_2\" type=\"id\" />\n    <item name=\"action_open_media_3\" type=\"id\" />\n    <item name=\"action_open_media_4\" type=\"id\" />\n    <item name=\"action_open_mention\" type=\"id\" />\n    <item name=\"action_expand_cw\" type=\"id\" />\n    <item name=\"action_collapse_cw\" type=\"id\" />\n    <item name=\"action_links\" type=\"id\" />\n    <item name=\"action_mentions\" type=\"id\" />\n    <item name=\"action_hashtags\" type=\"id\" />\n    <item name=\"action_open_reblogger\" type=\"id\" />\n    <item name=\"action_open_reblogged_by\" type=\"id\" />\n    <item name=\"action_open_faved_by\" type=\"id\" />\n    <item name=\"action_more\" type=\"id\" />\n    <item name=\"action_untranslate\" type=\"id\" />\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <declare-styleable name=\"ClickableSpanTextView\">\n        <!-- Necessary to support tools:text in Android Studio layout designer -->\n        <attr name=\"android:text\"/>\n    </declare-styleable>\n\n    <attr name=\"licenseCardStyle\" format=\"reference\" />\n\n    <declare-styleable name=\"LicenseCard\">\n        <attr name=\"name\" format=\"string|reference\" />\n        <attr name=\"license\" format=\"string|reference\" />\n        <attr name=\"link\" format=\"string|reference\" />\n        <attr name=\"description\" format=\"string|reference\" />\n    </declare-styleable>\n\n    <declare-styleable name=\"GraphView\">\n        <attr name=\"primaryLineColor\" format=\"reference|color\" />\n        <attr name=\"secondaryLineColor\" format=\"reference|color\" />\n        <attr name=\"lineWidth\" format=\"dimension\" />\n        <attr name=\"graphColor\" format=\"reference|color\" />\n        <attr name=\"metaColor\" format=\"reference|color\" />\n        <attr name=\"proportionalTrending\" format=\"boolean\" />\n    </declare-styleable>\n\n    <declare-styleable name=\"SliderPreference\">\n        <attr name=\"android:value\" format=\"string|reference\" />\n        <attr name=\"android:valueFrom\" format=\"string|reference\" />\n        <attr name=\"android:valueTo\" format=\"string|reference\" />\n        <attr name=\"android:stepSize\" format=\"string|reference\" />\n        <attr name=\"format\" format=\"string|reference\" />\n        <attr name=\"iconStart\" format=\"reference\" />\n        <attr name=\"iconEnd\" format=\"reference\" />\n    </declare-styleable>\n\n    <!--Themed Attributes-->\n    <attr name=\"colorBackgroundAccent\" format=\"reference|color\" />\n    <attr name=\"colorBackgroundHighlight\" format=\"reference|color\" />\n    <attr name=\"textColorDisabled\" format=\"reference|color\" />\n    <attr name=\"iconColor\" format=\"reference|color\" />\n    <attr name=\"windowBackgroundColor\" format=\"reference|color\" />\n    <attr name=\"dividerColor\" format=\"reference|color\" />\n    <attr name=\"toolbarIconBackgroundColor\" format=\"reference|color\" />\n    <attr name=\"placeholderColor\" format=\"reference|color\" />\n\n    <attr name=\"status_text_small\" format=\"dimension\" />\n    <attr name=\"status_text_medium\" format=\"dimension\" />\n    <attr name=\"status_text_large\" format=\"dimension\" />\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- the original Tusky Blue, but for better contrast tusky_blue_light and tusky_blue_dark should be used in the ui-->\n    <color name=\"tusky_blue\">#2b90d9</color>\n    <color name=\"tusky_blue_light\">#3c9add</color>\n    <color name=\"tusky_blue_dark\">#217aba</color>\n    <color name=\"tusky_blue_lighter\">#56a7e1</color>\n    <color name=\"tusky_orange\">#ca8f04</color>\n    <color name=\"tusky_orange_light\">#fab207</color>\n    <color name=\"tusky_green_dark\">#00731B</color>\n    <color name=\"tusky_green\">#19a341</color>\n    <color name=\"tusky_green_light\">#25d069</color>\n    <color name=\"tusky_green_lighter\">#CCFFD8</color>\n    <color name=\"tusky_red\">#DF1553</color>\n    <color name=\"tusky_red_lighter\">#FF7287</color>\n\n    <color name=\"white\">#fff</color>\n    <color name=\"black\">#000</color>\n\n    <color name=\"notification_color\">@color/tusky_blue</color>\n\n    <!-- the number roughly corresponds to the % lightness of the grey -->\n    <color name=\"tusky_grey_05\">#070b14</color>\n    <color name=\"tusky_grey_10\">#16191f</color>\n    <color name=\"tusky_grey_15\">#21222c</color>\n    <color name=\"tusky_grey_20\">#282c37</color>\n    <color name=\"tusky_grey_25\">#313543</color>\n    <color name=\"tusky_grey_30\">#444b5d</color>\n    <color name=\"tusky_grey_40\">#596378</color>\n    <color name=\"tusky_grey_50\">#6e7b92</color>\n    <color name=\"tusky_grey_70\">#9baec8</color>\n    <color name=\"tusky_grey_80\">#b9c8d8</color>\n    <color name=\"tusky_grey_90\">#d9e1e8</color>\n    <color name=\"tusky_grey_95\">#ebeff4</color>\n\n    <color name=\"tusky_grey_blue_light\">#94bada</color>\n    <color name=\"tusky_grey_blue_dark\">#305879</color>\n\n    <color name=\"transparent_tusky_blue\">#8c2b90d9</color>\n    <color name=\"transparent_black\">#8f000000</color>\n    <color name=\"transparent_tusky_grey_10\">#CC16191f</color>\n    <color name=\"header_background_filter_dark\">#44000000</color>\n    <color name=\"header_background_filter_light\">#66FFFFFF</color>\n    <color name=\"transparent_statusbar_background\">#44000000</color>\n\n    <!-- colors used in the elephant friend drawables -->\n    <color name=\"elephant_friend_border_color\">#121419</color>\n    <color name=\"elephant_friend_accent_color\">?attr/colorPrimary</color>\n    <color name=\"elephant_friend_body_color\">#9BAEC8</color>\n    <color name=\"elephant_friend_dark_body_color_1\">#8192A6</color>\n    <color name=\"elephant_friend_dark_body_color_2\">#7F90A4</color>\n    <color name=\"elephant_friend_light_color_1\">#CAD4E0</color>\n    <color name=\"elephant_friend_light_color_2\">#d9e1e8</color>\n\n    <!-- colors used in the app icon -->\n    <color name=\"icon_background\">#09497b</color>\n    <color name=\"icon_highlight\">#39acff</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <dimen name=\"status_display_name_padding_end\">4dp</dimen>\n    <dimen name=\"status_reblogged_bar_padding_top\">8dp</dimen>\n    <dimen name=\"status_media_preview_margin_top\">8dp</dimen>\n    <dimen name=\"status_media_preview_height\">100dp</dimen>\n    <dimen name=\"status_detail_media_preview_height\">130dp</dimen>\n    <dimen name=\"compose_media_preview_margin\">8dp</dimen>\n    <dimen name=\"compose_media_preview_margin_bottom\">0dp</dimen>\n    <dimen name=\"compose_media_preview_size\">120dp</dimen>\n    <dimen name=\"account_avatar_margin\">14dp</dimen>\n    <dimen name=\"tab_page_margin\">16dp</dimen>\n    <dimen name=\"status_line_margin_start\">36dp</dimen>\n    <dimen name=\"text_content_margin\">16dp</dimen>\n    <dimen name=\"status_sensitive_media_button_padding\">5dp</dimen>\n\n    <dimen name=\"card_image_vertical_height\">210dp</dimen>\n    <dimen name=\"card_image_horizontal_width\">100dp</dimen>\n\n    <dimen name=\"compose_activity_snackbar_elevation\">16dp</dimen>\n\n    <dimen name=\"account_activity_scroll_title_visible_height\">200dp</dimen>\n    <dimen name=\"account_activity_avatar_size\">100dp</dimen>\n\n    <dimen name=\"timeline_width\">-1px</dimen> <!-- match_parent -->\n\n    <item name=\"wrap_content\" format=\"integer\" type=\"dimen\">-2</item>\n\n    <dimen name=\"selected_drag_item_elevation\">12dp</dimen>\n\n    <dimen name=\"avatar_radius_94dp\">11.75dp</dimen> <!-- 1/8 of 100dp - 2 * 3dp padding -->\n    <dimen name=\"avatar_radius_80dp\">10dp</dimen> <!-- 1/8 of 80dp -->\n    <dimen name=\"avatar_radius_48dp\">6dp</dimen> <!-- 1/8 of 48dp -->\n    <dimen name=\"avatar_radius_42dp\">5.25dp</dimen> <!-- 1/8 of 42dp -->\n    <dimen name=\"avatar_radius_36dp\">4.5dp</dimen> <!-- 1/8 of 36dp -->\n    <dimen name=\"avatar_radius_24dp\">3dp</dimen> <!-- 1/8 of 24dp -->\n    <dimen name=\"min_report_button_width\">160dp</dimen>\n    <dimen name=\"account_avatar_background_radius\">14dp</dimen>\n\n    <!-- default radius of card (12dp) minus 1dp frame -->\n    <dimen name=\"inner_card_radius\">11dp</dimen>\n\n    <dimen name=\"poll_preview_padding_vertical\">8dp</dimen>\n    <dimen name=\"poll_preview_padding_horizontal\">16dp</dimen>\n    <dimen name=\"poll_preview_min_width\">120dp</dimen>\n\n    <dimen name=\"adaptive_bitmap_inner_size\">74dp</dimen>\n    <dimen name=\"adaptive_bitmap_outer_size\">108dp</dimen>\n\n    <dimen name=\"fabMargin\">16dp</dimen>\n\n    <dimen name=\"avatar_toolbar_nav_icon_size\">36dp</dimen>\n\n    <dimen name=\"profile_media_spacing\">3dp</dimen>\n\n    <dimen name=\"profile_media_audio_icon_padding\">16dp</dimen>\n\n    <dimen name=\"preview_image_spacing\">4dp</dimen>\n\n    <dimen name=\"graph_line_thickness\">1dp</dimen>\n\n    <dimen name=\"minimum_touch_target\">48dp</dimen>\n\n    <dimen name=\"timeline_status_avatar_height\">48dp</dimen>\n    <dimen name=\"timeline_status_avatar_width\">48dp</dimen>\n\n    <dimen name=\"profile_badge_stroke_width\">1dp</dimen>\n    <dimen name=\"profile_badge_min_height\">24dp</dimen>\n    <dimen name=\"profile_badge_icon_size\">18dp</dimen>\n    <dimen name=\"profile_badge_icon_start_padding\">8dp</dimen>\n    <dimen name=\"profile_badge_icon_end_padding\">0dp</dimen>\n\n    <dimen name=\"account_swiperefresh_distance\">64dp</dimen>\n\n    <dimen name=\"fallback_emoji_size\">16sp</dimen>\n\n    <!-- 56dp + 16dp padding on top and bottom -->\n    <dimen name=\"recyclerview_bottom_padding_actionbutton\">88dp</dimen>\n    <dimen name=\"recyclerview_bottom_padding_no_actionbutton\">32dp</dimen>\n\n    <dimen name=\"dialog_inset\">24dp</dimen>\n\n    <dimen name=\"media_description_sheet_bottom_padding\">16dp</dimen>\n    <dimen name=\"media_description_sheet_peek_height\">90dp</dimen>\n\n    <dimen name=\"bottomAppBarHeight\">64dp</dimen>\n\n    <!-- padding + drawablePadding + drawable size must be 62dp to align with the 14dp padding and the 48dp avatar -->\n    <!-- paddings for when the status info has a large (24dp) icon -->\n    <dimen name=\"status_info_drawable_padding_large\">10dp</dimen>\n    <dimen name=\"status_info_padding_large\">28dp</dimen>\n    <!-- paddings for when the status info has a small (18dp) icon -->\n    <dimen name=\"status_info_drawable_padding_small\">6dp</dimen>\n    <dimen name=\"status_info_padding_small\">38dp</dimen>\n\n    <dimen name=\"compose_bottom_bar_height\">56dp</dimen>\n    <dimen name=\"compose_bottom_bar_padding_vertical\">4dp</dimen>\n    <dimen name=\"compose_bottom_bar_padding_horizontal\">8dp</dimen>\n\n    <dimen name=\"dialog_activity_vertical_inset\">64dp</dimen>\n\n    <dimen name=\"conversation_placeholder_more_button_inset\">14dp</dimen>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/donottranslate.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"tusky_website\" translatable=\"false\">https://tusky.app</string>\n    <string name=\"about_app_version\">%1$s %2$s</string>\n\n    <string name=\"oauth_scheme\" translatable=\"false\">oauth2redirect</string>\n    <string name=\"preferences_file_key\" translatable=\"false\">com.keylesspalace.tusky.PREFERENCES</string>\n\n    <string name=\"at_symbol\" translatable=\"false\">\\@</string>\n    <string name=\"hash_symbol\" translatable=\"false\">#</string>\n    <string name=\"hashtag_format\" translatable=\"false\">#%1$s</string>\n\n    <string name=\"emoji_shortcode_format\" translatable=\"false\">:%1$s:</string>\n    <string name=\"post_timestamp_with_edited_indicator\" translatable=\"false\">%1$s *</string>\n    <string name=\"metadata_joiner\" translatable=\"false\">\" • \"</string>\n    <string name=\"date_range\" translatable=\"false\">%1$s — %2$s</string>\n\n    <string-array name=\"post_privacy_values\">\n        <item>public</item>\n        <item>unlisted</item>\n        <item>private</item>\n    </string-array>\n\n    <string-array name=\"reply_privacy_values\">\n        <item>match_default_post_visibility</item>\n        <item>public</item>\n        <item>unlisted</item>\n        <item>private</item>\n        <item>direct</item>\n    </string-array>\n\n    <string-array name=\"post_text_size_values\">\n        <item>smallest</item>\n        <item>small</item>\n        <item>medium</item>\n        <item>large</item>\n        <item>largest</item>\n    </string-array>\n\n    <string-array name=\"language_entries\">\n        <item>@string/system_default</item>\n        <item>Bahasa Indonesia</item>\n        <item>Català</item>\n        <item>Čeština</item>\n        <item>Cymraeg</item>\n        <item>Deutsch</item>\n        <item>English (UK)</item>\n        <item>English (US)</item>\n        <item>Esperanto</item>\n        <item>Español</item>\n        <item>Euskara</item>\n        <item>Français</item>\n        <item>Frysk</item>\n        <item>Gaeilge</item>\n        <item>Gàidhlig</item>\n        <item>Galego</item>\n        <item>íslenska</item>\n        <item>Italiano</item>\n        <item>latviešu valoda</item>\n        <item>Lëtzebuergesch</item>\n        <item>Magyar</item>\n        <item>Nederlands</item>\n        <item>Norsk</item>\n        <item>Occitan</item>\n        <item>Polski</item>\n        <item>Português (Brasil)</item>\n        <item>Português (Portugal)</item>\n        <item>slovenski jezik</item>\n        <item>slovenský jazyk</item>\n        <item>Suomi</item>\n        <item>Svenska</item>\n        <item>Taqbaylit</item>\n        <item>Tiếng Việt</item>\n        <item>Türkçe</item>\n        <item>Беларуская</item>\n        <item>български</item>\n        <item>Русский</item>\n        <item>Українська</item>\n        <item>العربية</item>\n        <item>کوردیی ناوەندی</item>\n        <item>বাংলা (বাংলাদেশ)</item>\n        <item>বাংলা (ভারত)</item>\n        <item>فارسی</item>\n        <item>हिंदी</item>\n        <item>संस्कृतम्</item>\n        <item>ଓଡ଼ିଆ</item> <!-- or: Odia -->\n        <item>தமிழ்</item>\n        <item>ภาษาไทย</item>\n        <item>한국어</item>\n        <item>中文(台灣)</item>\n        <item>中文(新加坡)</item>\n        <item>中文(澳門)</item>\n        <item>中文(简体)</item>\n        <item>中文(香港)</item>\n        <item>日本語</item>\n        <item>ⵜⴰⵎⴰⵣⵉⵖⵜ</item>\n        <item>Ελληνικά</item>\n        <item>മലയാളം</item>\n        <item>සිංහල</item>\n    </string-array>\n\n    <string-array name=\"language_values\">\n        <item>default</item>\n        <item>in</item>\n        <item>ca</item>\n        <item>cs</item>\n        <item>cy</item>\n        <item>de</item>\n        <item>en-GB</item>\n        <item>en</item>\n        <item>eo</item>\n        <item>es</item>\n        <item>eu</item>\n        <item>fr</item>\n        <item>fy</item>\n        <item>ga</item>\n        <item>gd</item>\n        <item>gl</item>\n        <item>is</item>\n        <item>it</item>\n        <item>lv</item>\n        <item>lb</item>\n        <item>hu</item>\n        <item>nl</item>\n        <item>nb-NO</item>\n        <item>oc</item>\n        <item>pl</item>\n        <item>pt-BR</item>\n        <item>pt-PT</item>\n        <item>sl</item>\n        <item>sk</item>\n        <item>fi</item>\n        <item>sv</item>\n        <item>kab</item>\n        <item>vi</item>\n        <item>tr</item>\n        <item>be</item>\n        <item>bg</item>\n        <item>ru</item>\n        <item>uk</item>\n        <item>ar</item>\n        <item>ckb</item>\n        <item>bn-BD</item>\n        <item>bn-IN</item>\n        <item>fa</item>\n        <item>hi</item>\n        <item>sa</item>\n        <item>or</item>\n        <item>ta</item>\n        <item>th</item>\n        <item>ko</item>\n        <item>zh-TW</item>\n        <item>zh-SG</item>\n        <item>zh-MO</item>\n        <item>zh-CN</item>\n        <item>zh-HK</item>\n        <item>ja</item>\n        <item>ber</item>\n        <item>el</item>\n        <item>ml</item>\n        <item>si</item>\n    </string-array>\n\n    <string-array name=\"pref_main_nav_position_options\">\n        <item>@string/pref_main_nav_position_option_top</item>\n        <item>@string/pref_main_nav_position_option_bottom</item>\n    </string-array>\n\n    <string-array name=\"pref_main_nav_position_values\">\n        <item>top</item>\n        <item>bottom</item>\n    </string-array>\n\n    <string-array name=\"pref_show_self_username_values\">\n        <item>always</item>\n        <item>disambiguate</item>\n        <item>never</item>\n    </string-array>\n\n    <string name=\"description_status\" translatable=\"false\">\n        <!--\n         %1$s|display_name %2$s|CW?; %3$s|content?, %15$s|poll?, %4$s|date,\n         %6$s|reposted_by?; %7$s|username, %5$s|edited?, %16$s|translated?, %8$s|reposted?, %9$s|favorited?,\n         %10$s|bookmarked?, %11$s|media?; %12$s|visibility, %13$s|fav_number?,\n         %14$s|reblog_number?\n         -->\n        %1$s; %2$s; %3$s, %15$s, %4$s, %6$s; %7$s, %5$s, %16$s, %8$s, %9$s, %10$s, %11$s; %12$s, %13$s, %14$s\n    </string>\n\n    <string-array name=\"rick_roll_domains\" translatable=\"false\">\n        <item>gab.com</item>\n        <item>gab.ai</item>\n        <item>spinster.xyz</item>\n        <item>truthsocial.com</item>\n    </string-array>\n\n    <string name=\"rick_roll_url\">https://www.youtube.com/watch?v=dQw4w9WgXcQ</string>\n\n\n    <string-array name=\"poll_duration_names\">\n        <item>@string/duration_5_min</item>\n        <item>@string/duration_30_min</item>\n        <item>@string/duration_1_hour</item>\n        <item>@string/duration_6_hours</item>\n        <item>@string/duration_1_day</item>\n        <item>@string/duration_3_days</item>\n        <item>@string/duration_7_days</item>\n        <item>@string/duration_14_days</item>\n        <item>@string/duration_30_days</item>\n        <item>@string/duration_60_days</item>\n        <item>@string/duration_90_days</item>\n        <item>@string/duration_180_days</item>\n        <item>@string/duration_365_days</item>\n    </string-array>\n\n    <integer-array name=\"poll_duration_values\"> <!-- values in seconds, corresponding to poll_duration_names -->\n        <item>300</item>\n        <item>1800</item>\n        <item>3600</item>\n        <item>21600</item>\n        <item>86400</item>\n        <item>259200</item>\n        <item>604800</item>\n        <item>1209600</item>\n        <item>2592000</item>\n        <item>5184000</item>\n        <item>7776000</item>\n        <item>15552000</item>\n        <item>31536000</item>\n    </integer-array>\n\n    <string name=\"poll_percent_format\"><!-- 15% --> &lt;b>%1$d%%&lt;/b></string>\n\n    <string-array name=\"mute_duration_names\">\n        <item>@string/duration_indefinite</item>\n        <item>@string/duration_1_hour</item>\n        <item>@string/duration_6_hours</item>\n        <item>@string/duration_1_day</item>\n        <item>@string/duration_7_days</item>\n        <item>@string/duration_30_days</item>\n        <item>@string/duration_180_days</item>\n    </string-array>\n\n    <integer-array name=\"mute_duration_values\"> <!-- values in seconds, corresponding to mute_duration_names -->\n        <item>0</item>\n        <item>3600</item>\n        <item>21600</item>\n        <item>86400</item>\n        <item>604800</item>\n        <item>2592000</item>\n        <item>15552000</item>\n    </integer-array>\n\n    <string-array name=\"filter_duration_names\">\n        <item>@string/duration_indefinite</item>\n        <item>@string/duration_5_min</item>\n        <item>@string/duration_30_min</item>\n        <item>@string/duration_1_hour</item>\n        <item>@string/duration_6_hours</item>\n        <item>@string/duration_1_day</item>\n        <item>@string/duration_3_days</item>\n        <item>@string/duration_7_days</item>\n    </string-array>\n\n    <integer-array name=\"filter_duration_values\"> <!-- values in seconds, corresponding to mute_duration_names -->\n        <item>0</item>\n        <item>300</item>\n        <item>1800</item>\n        <item>3600</item>\n        <item>21600</item>\n        <item>86400</item>\n        <item>259200</item>\n        <item>604800</item>\n    </integer-array>\n\n    <string-array name=\"reading_order_names\">\n        <item>@string/pref_reading_order_oldest_first</item>\n        <item>@string/pref_reading_order_newest_first</item>\n    </string-array>\n\n    <string-array name=\"reading_order_values\">\n        <item>OLDEST_FIRST</item>\n        <item>NEWEST_FIRST</item>\n    </string-array>\n\n    <string name=\"url_domain_notifier\" translatable=\"false\">(🔗 %1$s)</string>\n\n    <string-array name=\"notification_policy_value\">\n        <item>accept</item>\n        <item>filter</item>\n        <item>drop</item>\n    </string-array>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/ids.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <item name=\"pin\" type=\"id\" />\n    <item name=\"custom_emoji_targets_tag\" type=\"id\" />\n</resources>"
  },
  {
    "path": "app/src/main/res/values/string-arrays.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string-array name=\"app_theme_names\">\n        <item>@string/app_them_dark</item>\n        <item>@string/app_theme_light</item>\n        <item>@string/app_theme_black</item>\n        <item>@string/app_theme_auto</item>\n        <item>@string/app_theme_system</item>\n        <item>@string/app_theme_system_black</item>\n    </string-array>\n\n    <string-array name=\"post_privacy_names\">\n        <item>@string/post_privacy_public</item>\n        <item>@string/post_privacy_unlisted</item>\n        <item>@string/post_privacy_followers_only</item>\n    </string-array>\n\n    <string-array name=\"reply_privacy_names\">\n        <item>@string/pref_match_default_post_privacy</item>\n        <item>@string/post_privacy_public</item>\n        <item>@string/post_privacy_unlisted</item>\n        <item>@string/post_privacy_followers_only</item>\n        <item>@string/post_privacy_direct</item>\n    </string-array>\n\n    <string-array name=\"post_text_size_names\">\n        <item>@string/post_text_size_smallest</item>\n        <item>@string/post_text_size_small</item>\n        <item>@string/post_text_size_medium</item>\n        <item>@string/post_text_size_large</item>\n        <item>@string/post_text_size_largest</item>\n    </string-array>\n\n    <string-array name=\"pref_show_self_username_names\">\n        <item>@string/pref_show_self_username_always</item>\n        <item>@string/pref_show_self_username_disambiguate</item>\n        <item>@string/pref_show_self_username_never</item>\n    </string-array>\n\n    <string-array name=\"filter_contexts\">\n        <item>@string/title_home</item>\n        <item>@string/title_notifications</item>\n        <item>@string/pref_title_public_filter_keywords</item>\n        <item>@string/pref_title_thread_filter_keywords</item>\n        <item>@string/pref_title_account_filter_keywords</item>\n    </string-array>\n\n    <string-array name=\"filter_actions\">\n        <item>@string/filter_action_blur</item>\n        <item>@string/filter_action_warn</item>\n        <item>@string/filter_action_hide</item>\n    </string-array>\n\n    <!-- Order must be synchronized with MastoList.ReplyPolicy -->\n    <string-array name=\"list_reply_policies_display\">\n        <item>@string/list_reply_policy_none</item>\n        <item>@string/list_reply_policy_list</item>\n        <item>@string/list_reply_policy_followed</item>\n    </string-array>\n\n    <string-array name=\"notification_policy_options\">\n        <item>@string/notification_policy_accept</item>\n        <item>@string/notification_policy_filter</item>\n        <item>@string/notification_policy_ignore</item>\n    </string-array>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<!--\n  ~ Copyright 2023 Tusky Contributors\n  ~\n  ~ This file is a part of Tusky.\n  ~\n  ~ This program is free software; you can redistribute it and/or modify it under the terms of the\n  ~ GNU General Public License as published by the Free Software Foundation; either version 3 of the\n  ~ License, or (at your option) any later version.\n  ~\n  ~ Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n  ~ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n  ~ Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License along with Tusky; if not,\n  ~ see <http://www.gnu.org/licenses>.\n  -->\n\n<resources>\n\n    <string name=\"error_generic\">An error occurred.</string>\n    <string name=\"error_network\">A network error occurred. Please check your connection and try again.</string>\n    <string name=\"error_empty\">This cannot be empty.</string>\n    <string name=\"error_invalid_domain\">Invalid domain entered</string>\n    <string name=\"error_failed_app_registration\">Failed authenticating with that instance. If this persists, try \"Login in Browser\" from the menu.</string>\n    <string name=\"error_no_web_browser_found\">Couldn\\'t find a web browser to use.</string>\n    <string name=\"error_authorization_unknown\">An unidentified authorization error occurred. If this persists, try \"Login in Browser\" from the menu.</string>\n    <string name=\"error_authorization_denied\">Authorization was denied. If you\\'re sure that you supplied the correct credentials, try \"Login in Browser\" from the menu.</string>\n    <string name=\"error_retrieving_oauth_token\">Failed getting a login token. If this persists, try \"Login in Browser\" from the menu.</string>\n    <string name=\"error_loading_account_details\">Failed loading account details</string>\n    <string name=\"error_could_not_load_login_page\">Could not load the login page.</string>\n    <string name=\"error_compose_character_limit\">The post is too long!</string>\n    <string name=\"error_multimedia_size_limit\">Video and audio files cannot exceed %1$s MB in size.</string>\n\n    <string name=\"error_image_edit_failed\">The image could not be edited.</string>\n    <string name=\"error_media_upload_type\">That type of file cannot be uploaded.</string>\n    <string name=\"error_media_upload_opening\">That file could not be opened.</string>\n    <string name=\"error_media_upload_permission\">Permission to read media is required.</string>\n    <string name=\"error_media_download_permission\">Permission to store media is required.</string>\n    <string name=\"error_media_upload_image_or_video\">Images and videos cannot both be attached to the same post.</string>\n    <string name=\"error_media_upload_sending\">The upload failed.</string>\n    <string name=\"error_media_upload_sending_fmt\">The upload failed: %1$s</string>\n    <string name=\"error_sender_account_gone\">Error sending post.</string>\n    <string name=\"error_following_hashtag_format\">Error following #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Error unfollowing #%1$s</string>\n    <string name=\"error_following_hashtags_unsupported\">This instance does not support following hashtags.</string>\n    <string name=\"error_muting_hashtag_format\">Error muting #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Error unmuting #%1$s</string>\n    <string name=\"error_blocking_domain\">Failed to mute %1$s: %2$s</string>\n    <string name=\"error_unblocking_domain\">Failed to unmute %1$s: %2$s</string>\n    <string name=\"error_status_source_load\">Failed to load the status source from the server.</string>\n    <string name=\"error_deleting_filter\">Error deleting filter \\'%1$s\\'</string>\n    <string name=\"error_saving_filter\">Error saving filter \\'%1$s\\'</string>\n\n    <string name=\"title_login\">Login</string>\n    <string name=\"title_home\">Home</string>\n    <string name=\"title_notifications\">Notifications</string>\n    <string name=\"title_public_local\">Local</string>\n    <string name=\"title_public_trending_hashtags\">Trending hashtags</string>\n    <string name=\"title_public_trending_statuses\">Trending posts</string>\n    <string name=\"title_public_federated\">Federated</string>\n    <string name=\"title_direct_messages\">Direct messages</string>\n    <string name=\"title_tab_preferences\">Tabs</string>\n    <string name=\"title_view_thread\">Thread</string>\n    <string name=\"title_posts\">Posts</string>\n    <string name=\"title_posts_with_replies\">With replies</string>\n    <string name=\"title_posts_pinned\">Pinned</string>\n    <string name=\"title_follows\">Follows</string>\n    <string name=\"title_followers\">Followers</string>\n    <string name=\"title_favourites\">Favorites</string>\n    <string name=\"title_bookmarks\">Bookmarks</string>\n    <string name=\"title_mutes\">Muted users</string>\n    <string name=\"title_blocks\">Blocked users</string>\n    <string name=\"title_domain_mutes\">Hidden domains</string>\n    <string name=\"title_follow_requests\">Follow requests</string>\n    <string name=\"title_edit_profile\">Edit your profile</string>\n    <string name=\"title_drafts\">Drafts</string>\n    <string name=\"title_scheduled_posts\">Scheduled posts</string>\n    <string name=\"title_announcements\">Announcements</string>\n    <string name=\"title_licenses\">Licenses</string>\n    <string name=\"title_followed_hashtags\">Followed hashtags</string>\n    <string name=\"title_edits\">Edits</string>\n\n    <string name=\"dialog_follow_hashtag_title\">Follow hashtag</string>\n    <string name=\"follow_hashtag_success\">Followed hashtag %1$s</string>\n\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s boosted</string>\n    <string name=\"post_replied\">Replied</string>\n    <string name=\"post_replied_format\">In reply to %1$s</string>\n    <string name=\"post_replied_self\">Continued thread</string>\n    <string name=\"post_sensitive_media_title\">Sensitive content</string>\n    <string name=\"post_media_hidden_title\">Media hidden</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"post_sensitive_media_directions\">Click to view</string>\n    <string name=\"post_content_warning_show_more\">Show more</string>\n    <string name=\"post_content_warning_show_less\">Show less</string>\n    <string name=\"post_content_show_more\">Expand</string>\n    <string name=\"post_content_show_less\">Collapse</string>\n    <string name=\"post_edited\">Edited %1$s</string>\n\n    <string name=\"message_empty\">Nothing here.</string>\n    <string name=\"footer_empty\">Nothing here. Pull down to refresh!</string>\n\n    <string name=\"notification_reblog_format\">%1$s boosted your post</string>\n    <string name=\"notification_favourite_format\">%1$s favorited your post</string>\n    <string name=\"notification_follow_format\">%1$s followed you</string>\n    <string name=\"notification_follow_request_format\">%1$s requested to follow you</string>\n    <string name=\"notification_sign_up_format\">%1$s signed up</string>\n    <string name=\"notification_subscription_format\">%1$s just posted</string>\n    <string name=\"notification_update_format\">%1$s edited their post</string>\n    <string name=\"notification_report_format\">New report on %1$s</string>\n    <string name=\"notification_header_report_format\">%1$s reported %2$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d posts attached</string>\n\n    <string name=\"report_username_format\">Report @%1$s</string>\n    <string name=\"report_comment_hint\">Additional comments?</string>\n\n    <string name=\"action_quick_reply\">Quick Reply</string>\n    <string name=\"action_reply\">Reply</string>\n    <string name=\"action_reblog\">Boost</string>\n    <string name=\"action_reblog_private\">Followers-Only Boost</string>\n    <string name=\"action_reblog_public\">Public Boost</string>\n    <string name=\"action_reblog_unlisted\">Unlisted Boost</string>\n    <string name=\"action_unreblog\">Remove boost</string>\n    <string name=\"action_favourite\">Favorite</string>\n    <string name=\"action_unfavourite\">Remove favorite</string>\n    <string name=\"action_bookmark\">Bookmark</string>\n    <string name=\"action_unbookmark\">Remove bookmark</string>\n    <string name=\"action_more\">More</string>\n    <string name=\"action_compose\">Compose</string>\n    <string name=\"action_login\">Login with Tusky</string>\n    <string name=\"action_browser_login\">Login with Browser</string>\n    <string name=\"action_logout\">Log out</string>\n    <string name=\"action_logout_confirm\">Are you sure you want to log out of %1$s? This will delete all local data of the account, including drafts and preferences.</string>\n    <string name=\"action_post_failed\">Upload failed</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Your post failed to upload and has been saved to drafts.\\n\\nEither the server could not be contacted, or it rejected the post.</item>\n        <item quantity=\"other\">Your posts failed to upload and have been saved to drafts.\\n\\nEither the server could not be contacted, or it rejected the posts.</item>\n    </plurals>\n    <string name=\"action_post_failed_show_drafts\">Show drafts</string>\n    <string name=\"action_post_failed_do_nothing\">Dismiss</string>\n    <string name=\"action_follow\">Follow</string>\n    <string name=\"action_unfollow\">Unfollow</string>\n    <string name=\"action_block\">Block</string>\n    <string name=\"action_unblock\">Unblock</string>\n    <string name=\"action_share_account_link\">Share link to account</string>\n    <string name=\"action_share_account_username\">Share username of account</string>\n    <string name=\"action_hide_reblogs\">Hide boosts</string>\n    <string name=\"action_show_reblogs\">Show boosts</string>\n    <string name=\"pref_title_show_self_boosts\">Show self-boosts</string>\n    <string name=\"pref_title_show_self_boosts_description\">Someone boosting their own post</string>\n    <string name=\"action_report\">Report</string>\n    <string name=\"action_edit\">Edit</string>\n    <string name=\"action_delete\">Delete</string>\n    <string name=\"action_delete_conversation\">Delete conversation</string>\n    <string name=\"action_delete_and_redraft\">Delete and re-draft</string>\n    <string name=\"action_discard\">Discard changes</string>\n    <string name=\"action_continue_edit\">Continue editing</string>\n    <string name=\"action_send\">TOOT</string>\n    <string name=\"action_send_public\">TOOT!</string>\n    <string name=\"action_retry\">Retry</string>\n    <string name=\"action_close\">Close</string>\n    <string name=\"action_view_profile\">Profile</string>\n    <string name=\"action_view_preferences\">Preferences</string>\n    <string name=\"action_view_account_preferences\">Account preferences</string>\n    <string name=\"action_view_favourites\">Favorites</string>\n    <string name=\"action_view_bookmarks\">Bookmarks</string>\n    <string name=\"action_view_mutes\">Muted users</string>\n    <string name=\"action_view_blocks\">Blocked users</string>\n    <string name=\"action_view_domain_mutes\">Hidden domains</string>\n    <string name=\"action_view_follow_requests\">Follow requests</string>\n    <string name=\"action_view_media\">Media</string>\n    <string name=\"action_open_in_web\">Open in browser</string>\n    <string name=\"action_add_media\">Add media</string>\n    <string name=\"action_add_poll\">Add poll</string>\n    <string name=\"action_photo_take\">Take photo</string>\n    <string name=\"action_share\">Share</string>\n    <string name=\"action_mute\">Mute</string>\n    <string name=\"action_unmute\">Unmute</string>\n    <string name=\"action_unmute_desc\">Unmute %1$s</string>\n    <string name=\"action_mute_domain\">Mute %1$s</string>\n    <string name=\"action_unmute_domain\">Unmute %1$s</string>\n    <string name=\"action_mute_conversation\">Mute conversation</string>\n    <string name=\"action_unmute_conversation\">Unmute conversation</string>\n    <string name=\"action_mention\">Mention</string>\n    <string name=\"action_hide_media\">Hide media</string>\n    <string name=\"action_open_drawer\">Open drawer</string>\n    <string name=\"action_save\">Save</string>\n    <string name=\"action_edit_profile\">Edit profile</string>\n    <string name=\"action_edit_own_profile\">Edit</string>\n    <string name=\"action_undo\">Undo</string>\n    <string name=\"action_accept\">Accept</string>\n    <string name=\"action_reject\">Reject</string>\n    <string name=\"action_search\">Search</string>\n    <string name=\"action_access_drafts\">Drafts</string>\n    <string name=\"action_access_scheduled_posts\">Scheduled posts</string>\n    <string name=\"action_toggle_visibility\">Post visibility</string>\n    <string name=\"action_content_warning\">Content warning</string>\n    <string name=\"action_emoji_keyboard\">Emoji keyboard</string>\n    <string name=\"action_schedule_post\">Schedule Post</string>\n    <string name=\"action_reset_schedule\">Reset</string>\n    <string name=\"action_add_tab\">Add Tab</string>\n    <string name=\"action_links\">Links</string>\n    <string name=\"action_mentions\">Mentions</string>\n    <string name=\"action_hashtags\">Hashtags</string>\n    <string name=\"action_follow_hashtag\">Follow a new hashtag</string>\n    <string name=\"action_open_reblogger\">Open boost author</string>\n    <string name=\"action_open_reblogged_by\">Show boosts</string>\n    <string name=\"action_open_faved_by\">Show favorites</string>\n    <string name=\"action_dismiss\">Dismiss</string>\n    <string name=\"action_details\">Details</string>\n    <string name=\"action_add_reaction\">add reaction</string>\n\n    <string name=\"title_hashtags_dialog\">Hashtags</string>\n    <string name=\"title_mentions_dialog\">Mentions</string>\n    <string name=\"title_links_dialog\">Links</string>\n    <string name=\"action_open_media_n\">Open media #%1$d</string>\n\n    <string name=\"download_image\">Downloading %1$s</string>\n\n    <string name=\"action_copy_link\">Copy the link</string>\n    <string name=\"action_open_as\">Open as %1$s</string>\n    <string name=\"action_share_as\">Share as …</string>\n    <string name=\"action_translate\">Translate</string>\n    <string name=\"action_show_original\">Show original</string>\n    <string name=\"download_media\">Download media</string>\n    <string name=\"downloading_media\">Downloading media</string>\n\n    <string name=\"send_post_link_to\">Share post URL to…</string>\n    <string name=\"send_post_content_to\">Share post to…</string>\n    <string name=\"send_account_link_to\">Share account URL to…</string>\n    <string name=\"send_account_username_to\">Share account username to…</string>\n    <string name=\"send_media_to\">Share media to…</string>\n    <string name=\"account_username_copied\">Username copied</string>\n    <string name=\"url_copied\">Url copied</string>\n\n    <string name=\"confirmation_reported\">Sent!</string>\n    <string name=\"confirmation_unblocked\">User unblocked</string>\n    <string name=\"confirmation_unmuted\">User unmuted</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s unhidden</string>\n    <string name=\"confirmation_hashtag_unfollowed\">#%1$s unfollowed</string>\n    <string name=\"confirmation_hashtag_copied\">\\'#%1$s\\' copied</string>\n\n    <string name=\"reply_sending\">Sending…</string>\n    <string name=\"reply_sending_long\">Your reply is being sent.</string>\n\n    <string name=\"hint_domain\">Which instance?</string>\n    <string name=\"hint_compose\">What\\'s happening?</string>\n    <string name=\"hint_content_warning\">Content warning</string>\n    <string name=\"hint_display_name\">Display name</string>\n    <string name=\"hint_note\">Bio</string>\n    <string name=\"hint_search\">Search…</string>\n    <string name=\"hint_media_description_missing\">Media should have a description.</string>\n\n    <string name=\"search_no_results\">No results</string>\n\n    <string name=\"label_quick_reply\">Reply…</string>\n    <string name=\"label_avatar\">Avatar</string>\n    <string name=\"label_header\">Header</string>\n    <string name=\"label_image\">Image</string>\n\n    <string name=\"link_whats_an_instance\">What\\'s an instance?</string>\n\n    <string name=\"login_connection\">Connecting…</string>\n\n    <string name=\"dialog_whats_an_instance\">The address or domain of any instance can be entered here, such as mastodon.social, icosahedron.website, social.tchncs.de, and <a href=\"https://instances.social\">more!</a>\\n\\nIf you don\\'t yet have an account, you can enter the name of the instance you\\'d like to join and create an account there.\\n\\nAn instance is a single place where your account is hosted, but you can easily communicate with and follow folks on other instances as though you were on the same site.\\n\\nMore info can be found at <a href=\"https://joinmastodon.org\">joinmastodon.org</a>.</string>\n    <string name=\"dialog_title_finishing_media_upload\">Finishing Media Upload</string>\n    <string name=\"dialog_message_uploading_media\">Uploading…</string>\n    <string name=\"dialog_download_image\">Download</string>\n    <string name=\"dialog_message_cancel_follow_request\">Revoke the follow request?</string>\n    <string name=\"dialog_unfollow_warning\">Unfollow this account?</string>\n    <string name=\"dialog_follow_warning\">Follow this account?</string>\n    <string name=\"dialog_delete_post_warning\">Delete this post?</string>\n    <string name=\"dialog_redraft_post_warning\">Delete and re-draft this post?</string>\n    <string name=\"dialog_delete_conversation_warning\">Delete this conversation?</string>\n    <string name=\"mute_domain_warning\">Are you sure you want to block all of %1$s? You will not see content from that domain in any public timelines or in your notifications. Your followers from that domain will be removed.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Hide entire domain</string>\n    <string name=\"dialog_block_warning\">Block @%1$s?</string>\n    <string name=\"dialog_mute_warning\">Mute @%1$s?</string>\n    <string name=\"dialog_mute_hide_notifications\">Hide notifications</string>\n\n    <string name=\"visibility_public\">Public: Post to public timelines</string>\n    <string name=\"visibility_unlisted\">Unlisted: Do not show in public timelines</string>\n    <string name=\"visibility_private\">Followers-Only: Post to followers only</string>\n    <string name=\"visibility_direct\">Direct: Post to mentioned users only</string>\n\n    <string name=\"pref_title_edit_notification_settings\">Notifications</string>\n    <string name=\"pref_title_notifications_enabled\">Notifications</string>\n    <string name=\"pref_title_notification_alerts\">Alerts</string>\n    <string name=\"pref_title_notification_alert_sound\">Notify with a sound</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Notify with vibration</string>\n    <string name=\"pref_title_notification_alert_light\">Notify with light</string>\n    <string name=\"pref_title_notification_filters\">Enabled notification types</string>\n\n    <string name=\"pref_title_appearance_settings\">Appearance</string>\n    <string name=\"pref_title_app_theme\">App theme</string>\n    <string name=\"pref_title_timelines\">Timelines</string>\n    <string name=\"pref_title_timeline_filters\">Filters</string>\n    <string name=\"pref_title_per_timeline_preferences\">Per-timeline preferences</string>\n\n    <string name=\"app_them_dark\">Dark</string>\n    <string name=\"app_theme_light\">Light</string>\n    <string name=\"app_theme_black\">Black</string>\n    <string name=\"app_theme_auto\">Automatic at sunset</string>\n    <string name=\"app_theme_system\">Use System Design</string>\n    <string name=\"app_theme_system_black\">Use System Design (black)</string>\n\n    <string name=\"pref_title_browser_settings\">Browser</string>\n    <string name=\"pref_title_custom_tabs\">Use Chrome Custom Tabs</string>\n    <string name=\"pref_title_language\">Language</string>\n    <string name=\"pref_title_bot_overlay\">Show indicator for bots</string>\n    <string name=\"pref_title_animate_gif_avatars\">Animate GIF avatars</string>\n    <string name=\"pref_title_gradient_for_media\">Show colorful gradients for hidden media</string>\n    <string name=\"pref_title_animate_custom_emojis\">Animate custom emojis</string>\n\n    <string name=\"pref_title_post_filter\">Timeline filtering</string>\n    <string name=\"pref_title_post_tabs\">Home timeline</string>\n    <string name=\"pref_title_show_boosts\">Show boosts</string>\n    <string name=\"pref_title_show_replies\">Show replies</string>\n    <string name=\"pref_title_show_media_preview\">Download media previews</string>\n    <string name=\"pref_title_proxy_settings\">Proxy</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP proxy</string>\n    <string name=\"pref_title_http_proxy_enable\">Enable HTTP proxy</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP proxy server</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP proxy port</string>\n    <string name=\"pref_title_http_proxy_port_message\">Port should be between %1$d and %2$d</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Disabled</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;not set></string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;invalid></string>\n\n    <string name=\"pref_default_post_privacy\">Post privacy (synced with server)</string>\n    <string name=\"pref_default_post_language\">Posting language (synced with server)</string>\n    <string name=\"pref_default_reply_privacy\">Reply privacy (not synced with server)</string>\n    <string name=\"pref_default_reply_privacy_explanation\">The pre-selected privacy will depend on the post you are replying to.</string>\n    <string name=\"pref_default_media_sensitivity\">Always mark media as sensitive (synced with server)</string>\n    <string name=\"pref_match_default_post_privacy\">Match default post privacy</string>\n    <string name=\"pref_publishing\">Posting defaults</string>\n    <string name=\"pref_failed_to_sync\">Failed to sync preferences</string>\n\n    <string name=\"pref_main_nav_position\">Main navigation position</string>\n    <string name=\"pref_main_nav_position_option_top\">Top</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Bottom</string>\n\n\n    <string name=\"post_privacy_public\">Public</string>\n    <string name=\"post_privacy_unlisted\">Unlisted</string>\n    <string name=\"post_privacy_followers_only\">Followers-only</string>\n    <string name=\"post_privacy_direct\">Direct</string>\n\n    <string name=\"pref_ui_text_size\">UI text size</string>\n    <string name=\"pref_post_text_size\">Post text size</string>\n\n    <string name=\"post_text_size_smallest\">Smallest</string>\n    <string name=\"post_text_size_small\">Small</string>\n    <string name=\"post_text_size_medium\">Medium</string>\n    <string name=\"post_text_size_large\">Large</string>\n    <string name=\"post_text_size_largest\">Largest</string>\n\n    <string name=\"pref_show_self_username_always\">Always</string>\n    <string name=\"pref_show_self_username_disambiguate\">When multiple accounts logged in</string>\n    <string name=\"pref_show_self_username_never\">Never</string>\n\n    <string name=\"notification_mention_name\">New mentions</string>\n    <string name=\"notification_mention_descriptions\">Notifications about new mentions</string>\n    <string name=\"notification_follow_name\">New followers</string>\n    <string name=\"notification_follow_description\">Notifications about new followers</string>\n    <string name=\"notification_follow_request_name\">Follow requests</string>\n    <string name=\"notification_follow_request_description\">Notifications about follow requests</string>\n    <string name=\"notification_boost_name\">Boosts</string>\n    <string name=\"notification_boost_description\">Notifications when your posts get boosted</string>\n    <string name=\"notification_favourite_name\">Favorites</string>\n    <string name=\"notification_favourite_description\">Notifications when your posts get marked as favorite</string>\n    <string name=\"notification_poll_name\">Poll results</string>\n    <string name=\"notification_poll_description\">Notifications about polls that have ended</string>\n    <string name=\"notification_subscription_name\">New posts</string>\n    <string name=\"notification_subscription_description\">Notifications when somebody you\\'re subscribed to published a new post</string>\n    <string name=\"notification_sign_up_name\">Sign ups</string>\n    <string name=\"notification_sign_up_description\">Notifications about new users</string>\n    <string name=\"notification_update_name\">Post edits</string>\n    <string name=\"notification_update_description\">Notifications when posts you\\'ve interacted with are edited</string>\n    <string name=\"notification_report_name\">Reports</string>\n    <string name=\"notification_severed_relationship_name\">Lost connections</string>\n    <string name=\"notification_moderation_warning_name\">Moderation warnings</string>\n    <string name=\"notification_report_description\">Notifications about moderation reports</string>\n    <string name=\"notification_listenable_worker_name\">Background activity</string>\n    <string name=\"notification_listenable_worker_description\">Notifications when Tusky is working in the background</string>\n    <string name=\"notification_unknown_name\">Unknown</string>\n    <string name=\"notification_unknown_description\">Unknown notification type</string>\n\n    <string name=\"notification_channel_other\">Other</string>\n    <string name=\"notification_channel_other_description\">Other notifications, like lost connections and moderation warnings</string>\n\n    <string name=\"notification_channel_admin\">Admin</string>\n    <string name=\"notification_channel_admin_description\">Admin notifications, like new reports or signups</string>\n\n    <string name=\"notification_mention_format\">%1$s mentioned you</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s and %4$d others</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, and %3$s</string>\n    <string name=\"notification_summary_small\">%1$s and %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d new interaction</item>\n        <item quantity=\"other\">%1$d new interactions</item>\n    </plurals>\n    <string name=\"notification_notification_worker\">Fetching notifications…</string>\n    <string name=\"notification_prune_cache\">Cache maintenance…</string>\n\n    <string name=\"description_account_locked\">Locked Account</string>\n\n    <string name=\"about_title_activity\">About</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_device_info_title\">Your device</string>\n    <string name=\"about_device_info\">%1$s %2$s\\nAndroid version: %3$s\\nSDK version: %4$d</string>\n    <string name=\"about_account_info_title\">Your account</string>\n    <string name=\"about_account_info\">\\@%1$s\\@%2$s\\nVersion: %3$s</string>\n    <string name=\"about_powered_by_tusky\">Powered by Tusky</string>\n    <string name=\"about_tusky_license\">Tusky is free and open-source software.\n        It is licensed under the GNU General Public License Version 3.\n        You can view the license here: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">Project website: https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Bug reports &amp; feature requests:\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Tusky\\'s Profile</string>\n\n    <string name=\"post_share_content\">Share content of post</string>\n    <string name=\"post_share_link\">Share link to post</string>\n    <string name=\"post_media_image\">Image</string>\n    <string name=\"post_media_images\">Images</string>\n    <string name=\"post_media_video\">Video</string>\n    <string name=\"post_media_audio\">Audio</string>\n    <string name=\"post_media_attachments\">Attachments</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"status_created_at_now\">now</string>\n    <string name=\"status_filtered_show_anyway\">Show anyway</string>\n    <string name=\"status_filter_placeholder_label_format\">Filtered: %1$s</string>\n\n    <string name=\"state_follow_requested\">Follow requested</string>\n\n    <!--These are for timestamps on posts. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">in %1$dy</string>\n    <string name=\"abbreviated_in_days\">in %1$dd</string>\n    <string name=\"abbreviated_in_hours\">in %1$dh</string>\n    <string name=\"abbreviated_in_minutes\">in %1$dm</string>\n    <string name=\"abbreviated_in_seconds\">in %1$ds</string>\n    <string name=\"abbreviated_years_ago\">%1$dy</string>\n    <string name=\"abbreviated_days_ago\">%1$dd</string>\n    <string name=\"abbreviated_hours_ago\">%1$dh</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n\n    <string name=\"follows_you\">Follows you</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Always show sensitive media</string>\n    <string name=\"pref_title_alway_open_spoiler\">Always expand posts marked with content warnings</string>\n    <string name=\"title_media\">Media</string>\n    <string name=\"replying_to\">Replying to @%1$s</string>\n    <string name=\"load_more_placeholder_text\">Load more</string>\n\n    <string name=\"pref_title_public_filter_keywords\">Public timelines</string>\n    <string name=\"pref_title_thread_filter_keywords\">Conversations</string>\n    <string name=\"pref_title_account_filter_keywords\">Profiles</string>\n    <string name=\"filter_addition_title\">Add filter</string>\n    <string name=\"filter_edit_title\">Edit filter</string>\n    <string name=\"filter_dialog_remove_button\">Remove</string>\n    <string name=\"filter_dialog_update_button\">Update</string>\n    <string name=\"filter_dialog_whole_word\">Whole word</string>\n    <string name=\"filter_dialog_whole_word_description\">When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word</string>\n    <string name=\"filter_add_description\">Phrase to filter</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n\n    <string name=\"add_account_name\">Add Account</string>\n    <string name=\"add_account_description\">Add new Mastodon Account</string>\n\n    <string name=\"action_lists\">Lists</string>\n    <string name=\"title_lists\">Lists</string>\n    <string name=\"error_create_list\">Could not create list</string>\n    <string name=\"error_rename_list\">Could not update list</string>\n    <string name=\"error_delete_list\">Could not delete list</string>\n    <string name=\"action_create_list\">Create list</string>\n    <string name=\"action_rename_list\">Update list</string>\n    <string name=\"action_delete_list\">Delete list</string>\n    <string name=\"hint_search_people_list\">Search for people you follow</string>\n    <string name=\"action_add_to_list\">Add account to the list</string>\n    <string name=\"action_remove_from_list\">Remove account from the list</string>\n    <string name=\"action_add_or_remove_from_list\">Add or remove from list</string>\n    <string name=\"failed_to_add_to_list\">Failed to add the account to the list</string>\n    <string name=\"failed_to_remove_from_list\">Failed to remove the account from the list</string>\n\n    <string name=\"compose_active_account_description\">Posting as %1$s</string>\n\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"other\">Describe contents for visually impaired (%1$d character limit)</item>\n    </plurals>\n    <string name=\"set_focus_description\">Tap or drag the circle to choose the focal point which will always be visible in thumbnails.</string>\n    <string name=\"action_set_caption\">Set caption</string>\n    <string name=\"action_set_focus\">Set focus point</string>\n    <string name=\"action_edit_image\">Edit image</string>\n    <string name=\"action_remove\">Remove</string>\n    <string name=\"lock_account_label\">Lock account</string>\n    <string name=\"lock_account_label_description\">Requires you to manually approve followers</string>\n    <string name=\"compose_delete_draft\">Delete draft?</string>\n    <string name=\"compose_save_draft\">Save draft?</string>\n    <string name=\"compose_save_draft_loses_media\">Save draft? (Attachments will be uploaded again when you restore the draft.)</string>\n    <string name=\"compose_unsaved_changes\">You have unsaved changes.</string>\n    <string name=\"send_post_notification_title\">Sending post…</string>\n    <string name=\"send_post_notification_error_title\">Error sending post</string>\n    <string name=\"send_post_notification_channel_name\">Sending Posts</string>\n    <string name=\"send_post_notification_cancel_title\">Sending cancelled</string>\n    <string name=\"send_post_notification_saved_content\">A copy of the post has been saved to your drafts</string>\n    <string name=\"action_compose_shortcut\">Compose</string>\n\n    <string name=\"error_no_custom_emojis\">Your instance %1$s does not have any custom emojis</string>\n    <string name=\"emoji_style\">Emoji style</string>\n    <string name=\"system_default\">System default</string>\n    <string name=\"download_fonts\">You\\'ll need to download these emoji sets first</string>\n    <string name=\"performing_lookup_title\">Performing lookup…</string>\n    <string name=\"expand_collapse_all_posts\">Expand/Collapse all posts</string>\n    <string name=\"action_open_post\">Open post</string>\n    <string name=\"restart_required\">App restart required</string>\n    <string name=\"restart_emoji\">You\\'ll need to restart Tusky in order to apply these changes</string>\n    <string name=\"later\">Later</string>\n    <string name=\"restart\">Restart</string>\n    <string name=\"caption_systememoji\">Your device\\'s default emoji set</string>\n    <string name=\"caption_blobmoji\">The Blob emojis known from Android 4.4–7.1</string>\n    <string name=\"caption_twemoji\">Mastodon\\'s standard emoji set</string>\n    <string name=\"caption_notoemoji\">Google\\'s current emoji set</string>\n\n    <string name=\"download_failed\">Download failed</string>\n\n    <string name=\"profile_badge_bot_text\">Bot</string>\n    <string name=\"account_moved_description\">%1$s has moved to:</string>\n\n    <string name=\"reblog_private\">Boost to original audience</string>\n    <string name=\"unreblog_private\">Unboost</string>\n\n    <string name=\"license_description\">Tusky contains code and assets from the following open source projects:</string>\n    <string name=\"license_apache_2\">Licensed under the Apache License (copy below)</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n\n    <string name=\"profile_metadata_label\">Profile metadata</string>\n    <string name=\"profile_metadata_add\">add data</string>\n    <string name=\"profile_metadata_label_label\">Label</string>\n    <string name=\"profile_metadata_content_label\">Content</string>\n\n    <string name=\"pref_title_absolute_time\">Use absolute time</string>\n\n    <string name=\"label_remote_account\">Information below may reflect the user\\'s profile incompletely. Press to open full profile in browser.</string>\n\n    <string name=\"unpin_action\">Unpin</string>\n    <string name=\"pin_action\">Pin</string>\n    <string name=\"failed_to_pin\">Failed to Pin</string>\n    <string name=\"failed_to_unpin\">Failed to Unpin</string>\n\n    <plurals name=\"favs\">\n        <item quantity=\"one\">%1$s Favorite</item>\n        <item quantity=\"other\">%1$s Favorites</item>\n    </plurals>\n\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\">%1$s Boost</item>\n        <item quantity=\"other\">%1$s Boosts</item>\n    </plurals>\n\n    <string name=\"label_translating\">Translating…</string>\n    <string name=\"label_translated\">Translated from %1$s with %2$s</string>\n\n    <string name=\"title_reblogged_by\">Boosted by</string>\n    <string name=\"title_favourited_by\">Favorited by</string>\n\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s and %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s and %3$d more</string>\n\n    <string name=\"description_post_media\">\n        Media: %1$s\n    </string>\n    <string name=\"description_post_cw\">\n        Content warning: %1$s\n    </string>\n    <string name=\"description_post_media_no_description_placeholder\">\n        No description\n    </string>\n    <string name=\"description_post_edited\">\n        Edited\n    </string>\n    <string name=\"description_post_reblogged\">\n        Reblogged\n    </string>\n    <string name=\"description_post_favourited\">\n        Favorited\n    </string>\n    <string name=\"description_post_bookmarked\">\n        Bookmarked\n    </string>\n    <string name=\"description_visibility_public\">\n        Public\n    </string>\n    <string name=\"description_visibility_unlisted\">\n        Unlisted\n    </string>\n    <string name=\"description_visibility_private\">\n        Followers\n    </string>\n    <string name=\"description_visibility_direct\">\n        Direct\n    </string>\n    <string name=\"description_poll\">\n        Poll with choices: %1$s, %2$s, %3$s, %4$s; %5$s\n    </string>\n    <string name=\"description_post_language\">Post language</string>\n    <string name=\"description_login\">Works in most cases. No data is leaked to other apps.</string>\n    <string name=\"description_browser_login\">May support additional authentication methods, but requires a supported browser.</string>\n\n    <string name=\"hint_list_name\">List name</string>\n\n    <string name=\"add_hashtag_title\">Add hashtag</string>\n    <string name=\"pick_hashtag_hint\">Hashtag without #</string>\n    <string name=\"hashtags\">Hashtags</string>\n    <string name=\"select_list_title\">Select list</string>\n    <string name=\"select_list_manage\">Manage lists</string>\n    <string name=\"list_exclusive_label\">Hide from the home timeline</string>\n    <string name=\"list\">List</string>\n    <string name=\"notifications_clear\">Delete</string>\n    <string name=\"notifications_apply_filter\">Filter</string>\n    <string name=\"filter_apply\">Apply</string>\n\n    <string name=\"muting_hashtag_success_format\">Muting hashtag #%1$s as a warning</string>\n    <string name=\"unmuting_hashtag_success_format\">Unmuting hashtag #%1$s</string>\n    <string name=\"action_view_filter\">View filter</string>\n    <string name=\"following_hashtag_success_format\">Now following hashtag #%1$s</string>\n    <string name=\"unfollowing_hashtag_success_format\">No longer following hashtag #%1$s</string>\n\n    <string name=\"compose_shortcut_long_label\">Compose post</string>\n    <string name=\"compose_shortcut_short_label\">Compose</string>\n\n    <string name=\"notification_clear_text\">Are you sure you want to permanently clear all your notifications?</string>\n    <string name=\"compose_preview_image_description\">Actions for image %1$s</string>\n\n    <!-- 15 votes • 1 hour left -->\n    <string name=\"poll_info_format\">%1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s vote</item>\n        <item quantity=\"other\">%1$s votes</item>\n    </plurals>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s person</item>\n        <item quantity=\"other\">%1$s people</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">ends at %1$s</string>\n    <string name=\"poll_info_closed\">closed</string>\n\n    <string name=\"poll_vote\">Vote</string>\n    <string name=\"poll_show_results\">Show results</string>\n\n    <string name=\"poll_ended_voted\">A poll you have voted in has ended</string>\n    <string name=\"poll_ended_created\">A poll you created has ended</string>\n\n    <!--These are for timestamps on polls -->\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d day left</item>\n        <item quantity=\"other\">%1$d days left</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d hour left</item>\n        <item quantity=\"other\">%1$d hours left</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d minute left</item>\n        <item quantity=\"other\">%1$d minutes left</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d second left</item>\n        <item quantity=\"other\">%1$d seconds left</item>\n    </plurals>\n\n    <string name=\"button_continue\">Continue</string>\n    <string name=\"button_back\">Back</string>\n    <string name=\"button_done\">Done</string>\n    <string name=\"report_sent_success\">Successfully reported @%1$s</string>\n    <string name=\"hint_additional_info\">Additional comments</string>\n    <string name=\"report_remote_instance\">Forward to %1$s</string>\n    <string name=\"failed_report\">Failed to report</string>\n    <string name=\"failed_fetch_posts\">Failed to fetch posts</string>\n    <string name=\"report_description_1\">The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:</string>\n    <string name=\"report_description_remote_instance\">The account is from another server. Send an anonymized copy of the report there as well?</string>\n    <string name=\"title_accounts\">Accounts</string>\n    <string name=\"failed_search\">Failed to search</string>\n\n    <string name=\"pref_title_enable_swipe_for_tabs\">Enable swipe gesture to switch between tabs</string>\n    <string name=\"pref_title_show_stat_inline\">Show post statistics in timeline</string>\n    <string name=\"pref_title_show_notifications_filter\">Show Notifications filter</string>\n\n    <string name=\"create_poll_title\">Poll</string>\n    <string name=\"label_duration\">Duration</string>\n    <string name=\"label_expires_after\">Expires after</string>\n    <string name=\"duration_indefinite\">Indefinite</string>\n    <string name=\"duration_5_min\">5 minutes</string>\n    <string name=\"duration_30_min\">30 minutes</string>\n    <string name=\"duration_1_hour\">1 hour</string>\n    <string name=\"duration_6_hours\">6 hours</string>\n    <string name=\"duration_1_day\">1 day</string>\n    <string name=\"duration_3_days\">3 days</string>\n    <string name=\"duration_7_days\">7 days</string>\n    <string name=\"duration_14_days\">14 days</string>\n    <string name=\"duration_30_days\">30 days</string>\n    <string name=\"duration_60_days\">60 days</string>\n    <string name=\"duration_90_days\">90 days</string>\n    <string name=\"duration_180_days\">180 days</string>\n    <string name=\"duration_365_days\">365 days</string>\n    <string name=\"duration_no_change\">(No change)</string>\n    <string name=\"add_poll_choice\">Add choice</string>\n    <string name=\"poll_allow_multiple_choices\">Multiple choices</string>\n    <string name=\"poll_new_choice_hint\">Choice %1$d</string>\n    <string name=\"edit_poll\">Edit</string>\n    <string name=\"post_lookup_error_format\">Error looking up post %1$s</string>\n\n    <string name=\"no_drafts\">You don\\'t have any drafts.</string>\n    <string name=\"no_scheduled_posts\">You don\\'t have any scheduled posts.</string>\n    <string name=\"no_announcements\">There are no announcements.</string>\n    <string name=\"no_lists\">You don\\'t have any lists.</string>\n    <string name=\"warning_scheduling_interval\">Mastodon has a minimum scheduling interval of 5 minutes.</string>\n    <string name=\"pref_title_show_self_username\">Show username in toolbars</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Show link previews in timelines</string>\n    <string name=\"pref_title_confirm_reblogs\">Show confirmation before boosting</string>\n    <string name=\"pref_title_confirm_favourites\">Show confirmation before favoriting</string>\n    <string name=\"pref_title_confirm_follows\">Show confirmation before following</string>\n    <string name=\"pref_title_hide_top_toolbar\">Hide the title of the top toolbar</string>\n    <string name=\"pref_title_wellbeing_mode\">Wellbeing</string>\n    <string name=\"account_note_hint\">Your private note about this account</string>\n    <string name=\"account_note_saved\">Saved!</string>\n\n    <string name=\"wellbeing_mode_notice\">Some information that might affect your mental wellbeing will be hidden. This includes:\n\\n\\n- Favorite/Boost/Follow notifications\n\\n- Favorite/Boost count on posts\n\\n- Follower/Post stats on profiles\n\\n\\nPush-notifications will not be affected, but you can review your notification preferences manually.</string>\n    <string name=\"review_notifications\">Review Notifications</string>\n    <string name=\"limit_notifications\">Limit timeline notifications</string>\n    <string name=\"wellbeing_hide_stats_posts\">Hide quantitative stats on posts</string>\n    <string name=\"wellbeing_hide_stats_profile\">Hide quantitative stats on profiles</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">You cannot upload more than %1$d media attachment.</item>\n        <item quantity=\"other\">You cannot upload more than %1$d media attachments.</item>\n    </plurals>\n    <string name=\"dialog_delete_list_warning\">Do you really want to delete the list %1$s?</string>\n    <string name=\"drafts_post_failed_to_send\">This post failed to send!</string>\n\n    <string name=\"drafts_failed_loading_reply\">Failed loading Reply information</string>\n    <string name=\"draft_deleted\">Draft deleted</string>\n    <string name=\"drafts_post_reply_removed\">The post you drafted a reply to has been removed</string>\n\n    <string name=\"follow_requests_info\">Even though your account is not locked, the %1$s staff thought you might want to review follow requests from these accounts manually.</string>\n\n    <string name=\"action_subscribe_account\">Subscribe</string>\n    <string name=\"action_unsubscribe_account\">Unsubscribe</string>\n\n    <string name=\"tusky_compose_post_quicksetting_label\">Compose Post</string>\n\n    <string name=\"account_date_joined\">Joined %1$s</string>\n\n    <string name=\"saving_draft\">Saving draft…</string>\n\n    <string name=\"delete_scheduled_post_warning\">Delete this scheduled post?</string>\n\n    <string name=\"instance_rule_info\">By logging in you agree to the rules of %1$s.</string>\n    <string name=\"instance_rule_title\">%1$s rules</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n\n    <string name=\"report_category_violation\">Rule violation</string>\n    <string name=\"report_category_spam\">Spam</string>\n    <string name=\"report_category_legal\">Legal</string>\n    <string name=\"report_category_other\">Other</string>\n\n    <string name=\"action_unfollow_hashtag_format\">Unfollow #%1$s?</string>\n    <string name=\"action_refresh\">Refresh</string>\n    <string name=\"mute_notifications_switch\">Mute notifications</string>\n\n    <!-- Reading order preference -->\n    <string name=\"pref_title_reading_order\">Reading order</string>\n    <string name=\"pref_reading_order_oldest_first\">Oldest first</string>\n    <string name=\"pref_reading_order_newest_first\">Newest first</string>\n\n    <string name=\"status_edit_info\">Edited: %1$s</string>\n    <string name=\"status_created_info\">Created: %1$s</string>\n    <string name=\"error_missing_edits\">Your server knows that this post was edited, but does not have a copy of the edits, so they can\\'t be shown to you.\\n\\nThis is <a href=\"https://github.com/mastodon/mastodon/issues/25398\">Mastodon issue #25398</a>.</string>\n    <string name=\"a11y_label_loading_thread\">Loading thread</string>\n\n    <!--@knossos@fosstodon.org created 2023-01-07 -->\n    <string name=\"accessibility_talking_about_tag\">%1$d people are talking about hashtag %2$s</string>\n    <string name=\"total_usage\">Total usage</string>\n    <string name=\"total_accounts\">Total accounts</string>\n\n    <!-- User friendly error messages for different network errors -->\n    <string name=\"socket_timeout_exception\">Contacting your server took too long</string>\n\n    <!-- Error messages, displayed in snackbars, when something failed -->\n    <string name=\"ui_error_unknown\">unknown reason</string>\n    <string name=\"ui_error_bookmark\">Bookmarking post failed: %1$s</string>\n    <string name=\"ui_error_clear_notifications\">Clearing notifications failed: %1$s</string>\n    <string name=\"ui_error_favourite\">Favoriting post failed: %1$s</string>\n    <string name=\"ui_error_reblog\">Boosting post failed: %1$s</string>\n    <string name=\"ui_error_vote\">Voting in poll failed: %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">Accepting follow request failed: %1$s</string>\n    <string name=\"ui_error_reject_follow_request\">Rejecting follow request failed: %1$s</string>\n    <string name=\"ui_error_translate\">Could not translate: %1$s</string>\n\n    <!-- Success messages, displayed in snackbars, when an action succeeded -->\n    <string name=\"ui_success_accepted_follow_request\">Follow request accepted</string>\n    <string name=\"ui_success_rejected_follow_request\">Follow request blocked</string>\n\n    <string name=\"hint_filter_title\">My filter</string>\n    <string name=\"label_filter_title\">Title</string>\n    <string name=\"filter_action_blur\">Blur</string>\n    <string name=\"filter_action_warn\">Warn</string>\n    <string name=\"filter_action_hide\">Hide</string>\n    <string name=\"filter_description_blur\">Hide media with a warning</string>\n    <string name=\"filter_description_warn\">Hide entire post with a warning</string>\n    <string name=\"filter_description_hide\">Hide completely</string>\n    <string name=\"label_filter_action\">Filter action</string>\n    <string name=\"label_filter_context\">Filter contexts</string>\n    <string name=\"label_filter_keywords\">Keywords or phrases to filter</string>\n    <string name=\"action_add\">Add</string>\n    <string name=\"filter_keyword_display_format\">%1$s (whole word)</string>\n    <string name=\"filter_keyword_addition_title\">Add keyword</string>\n    <string name=\"filter_edit_keyword_title\">Edit keyword</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n\n    <string name=\"help_empty_home\">This is your <b>home timeline</b>. It shows the recent posts of the accounts you follow.\\n\\nTo explore accounts you can either discover them in one of the other timelines. For example the local timeline of your instance {{group}}. Or you can search them by name {{search}}; for example search for Tusky to find our Mastodon account.</string>\n    <string name=\"help_empty_conversations\">Here are your <b>private messages</b>; sometimes called conversations or direct messages (DM).\\n\\nPrivate messages are created by setting the visibility {{public}} of a post to {{mail}} <i>Direct</i> and mentioning one or more users in the text.\\n\\nFor example you can start on the profile view of an account and tap the create button {{edit}} and change the visibility.\\n\\nNote that messages on the Fediverse are not end-to-end encrypted. Do not share any sensitive information.</string>\n    <string name=\"help_empty_lists\">This is your <b>lists view</b>. You can define a number of private lists and add accounts to that.\\n\\nNOTE that you can only add accounts you follow to your lists.\\n\\nThese lists can be used as a tab in Account preferences {{manage_accounts}} {{chevron_right}} Tabs.</string>\n\n    <string name=\"load_newest_notifications\">Load newest notifications</string>\n    <string name=\"about_copy\">Copy version and device information</string>\n    <string name=\"about_copied\">Copied version and device information</string>\n    <string name=\"error_media_playback\">Playback failed: %1$s</string>\n    <string name=\"dialog_delete_filter_text\">Delete filter \\'%1$s\\'?\"</string>\n    <string name=\"dialog_delete_filter_positive_action\">Delete</string>\n    <string name=\"dialog_save_profile_changes_message\">Do you want to save your profile changes?</string>\n\n    <string name=\"list_reply_policy_none\">No one</string>\n    <string name=\"list_reply_policy_list\">Members of the list</string>\n    <string name=\"list_reply_policy_followed\">Any followed user</string>\n    <string name=\"list_reply_policy_label\">Show replies to</string>\n\n    <string name=\"unknown_notification_type\">Unknown notification type</string>\n\n    <string name=\"preview_card_by_author\">By %1$s</string>\n    <string name=\"preview_card_more_by_author\">More by %1$s</string>\n\n    <string name=\"notification_policies_title\">Notification Policies</string>\n    <string name=\"notification_policies_filter_out\">Manage notifications from…</string>\n\n    <string name=\"notification_policies_filter_dont_follow_title\">People you don\\'t follow</string>\n    <string name=\"notification_policies_filter_dont_follow_description\">Until you manually approve them</string>\n    <string name=\"notification_policies_filter_not_following_title\">People not following you</string>\n    <string name=\"notification_policies_filter_not_following_description\">Including people who have been following you fewer than 3 days</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">New accounts</string>\n    <string name=\"unknown_notification_filter_new_accounts_description\">Created within the past 30 days</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_title\">Unsolicited private mentions</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_description\">Filtered unless it\\'s in reply to your own mention or if you follow the sender</string>\n    <string name=\"unknown_notification_filter_moderated_accounts\">Moderated accounts</string>\n    <string name=\"unknown_notification_filter_moderated_accounts_description\">Limited by server moderators</string>\n\n    <string name=\"notification_policies_not_supported\">This feature is only supported on Mastodon servers running v4.3.0 or later.</string>\n    <string name=\"filtered_notifications\">Filtered notifications</string>\n    <string name=\"notifications_from_people_you_may_know\">Notifications from %1$d people you may know</string>\n\n    <string name=\"notification_policy_accept\">Accept</string>\n    <string name=\"notification_policy_filter\">Filter</string>\n    <string name=\"notification_policy_ignore\">Ignore</string>\n    <string name=\"filtered_notifications_title\">Filtered Notifications</string>\n    <string name=\"accept_notification_request\">Accept notification request</string>\n    <string name=\"dismiss_notification_request\">Dismiss notification request</string>\n    <string name=\"open_settings\">Open preferences</string>\n    <string name=\"notifications_from\">Notifications from %1$s</string>\n    <string name=\"action_accept_notification_request\">Accept</string>\n    <string name=\"action_dismiss_notification_request\">Dismiss</string>\n\n    <string name=\"relationship_severance_event_title\">Connection lost</string>\n    <string name=\"relationship_severance_event_account_suspension\">An admin from %1$s has suspended %2$s, which means you can no longer receive updates from them or interact with them.</string>\n    <string name=\"relationship_severance_event_domain_block\">An admin from %1$s has blocked %2$s, including %3$s of your followers and %4$s you follow.</string>\n    <string name=\"relationship_severance_event_user_domain_block\">You have blocked %1$s, removing %2$s of your followers and %3$s you follow.</string>\n    <plurals name=\"accounts\">\n        <item quantity=\"one\">%1$s account</item>\n        <item quantity=\"other\">%1$s accounts</item>\n    </plurals>\n\n    <string name=\"moderation_warning\">You have received a moderation warning.</string>\n\n    <string name=\"moderation_warning_action_delete_statuses\">Some of your posts have been removed.</string>\n    <string name=\"moderation_warning_action_disable\">Your account has been disabled.</string>\n    <string name=\"moderation_warning_action_mark_statuses_as_sensitive\">Some of your posts have been marked as sensitive.</string>\n    <string name=\"moderation_warning_action_none\">Your account has received a moderation warning.</string>\n    <string name=\"moderation_warning_action_sensitive\">Your posts will be marked as sensitive from now on.</string>\n    <string name=\"moderation_warning_action_silence\">Your account has been limited.</string>\n    <string name=\"moderation_warning_action_suspend\">Your account has been suspended.</string>\n\n    <string name=\"unknown_notification_type_explanation\">Tusky does not recognize this notification type and can\\'t show it to you. Your server\\'s web interface may be able to do so. Please also inform the Tusky developers so they can add support for this type! </string>\n\n    <string name=\"poll\">Poll</string>\n    <plurals name=\"media_attachments\">\n        <item quantity=\"one\">%1$s media attachment</item>\n        <item quantity=\"other\">%1$s media attachments</item>\n    </plurals>\n\n    <string name=\"notification_info_reply\">Reply</string>\n    <string name=\"notification_info_private_mention\">Private mention</string>\n    <string name=\"notification_info_mention\">Mention</string>\n    <string name=\"notification_info_private_reply\">Private reply</string>\n\n    <string name=\"yes\">Yes</string>\n    <string name=\"no\">No</string>\n    <string name=\"confirm_dismiss_caption\">Discard caption changes?</string>\n\n    <string name=\"unblock_success\">Unblocked %1$s</string>\n    <string name=\"unmute_success\">Unmuted %1$s</string>\n    <string name=\"block_failure\">Failed blocking %1$s: %2$s</string>\n    <string name=\"mute_failure\">Failed muting %1$s: %2$s</string>\n    <string name=\"unblock_failure\">Failed unblocking %1$s: %2$s</string>\n    <string name=\"unmute_failure\">Failed unmuting %1$s: %2$s</string>\n    <string name=\"accept_follow_request_failure\">Failed accepting follow request from %1$s: %2$s</string>\n    <string name=\"reject_follow_request_failure\">Failed rejecting follow request from %1$s: %2$s</string>\n\n    <string name=\"reblog_privacy_public_description\">Everyone can see your boost</string>\n    <string name=\"reblog_privacy_unlisted_description\">Same as public but it will never be shown in public timelines</string>\n    <string name=\"reblog_privacy_followers_only_description\">Only your followers can see your boost</string>\n\n    <string name=\"reblog_confirm\">Boost this post?</string>\n    <string name=\"favourite_confirm\">Favorite this post?</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <style name=\"TextSizeSmallest\">\n        <item name=\"status_text_small\">10sp</item>\n        <item name=\"status_text_medium\">12sp</item>\n        <item name=\"status_text_large\">14sp</item>\n    </style>\n\n    <style name=\"TextSizeSmall\">\n        <item name=\"status_text_small\">12sp</item>\n        <item name=\"status_text_medium\">14sp</item>\n        <item name=\"status_text_large\">16sp</item>\n    </style>\n\n    <style name=\"TextSizeMedium\">\n        <item name=\"status_text_small\">14sp</item>\n        <item name=\"status_text_medium\">16sp</item>\n        <item name=\"status_text_large\">18sp</item>\n    </style>\n\n    <style name=\"TextSizeLarge\">\n        <item name=\"status_text_small\">16sp</item>\n        <item name=\"status_text_medium\">18sp</item>\n        <item name=\"status_text_large\">20sp</item>\n    </style>\n\n    <style name=\"TextSizeLargest\">\n        <item name=\"status_text_small\">18sp</item>\n        <item name=\"status_text_medium\">20sp</item>\n        <item name=\"status_text_large\">22sp</item>\n    </style>\n\n    <style name=\"SplashTheme\" parent=\"Theme.SplashScreen\">\n        <item name=\"windowSplashScreenAnimatedIcon\">@drawable/splashscreen</item>\n        <item name=\"windowSplashScreenBackground\">@color/tusky_grey_20</item>\n    </style>\n\n    <style name=\"TuskyTheme\" parent=\"TuskyBaseTheme\" />\n\n    <style name=\"TuskyDialogActivityTheme\" parent=\"@style/TuskyTheme\" />\n\n    <style name=\"TuskyBaseTheme\" parent=\"Theme.Material3.DayNight.NoActionBar\">\n        <!-- Provide default text sizes. These are overwritten in BaseActivity, but\n             if they are missing then the Android Studio layout preview crashes\n             with java.lang.reflect.InvocationTargetException -->\n        <item name=\"status_text_small\">14sp</item>\n        <item name=\"status_text_medium\">16sp</item>\n        <item name=\"status_text_large\">18sp</item>\n\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorOnPrimary\">@color/colorOnPrimary</item>\n\n        <item name=\"colorSecondary\">@color/colorSecondary</item>\n        <item name=\"colorOnSecondary\">@color/white</item>\n\n        <item name=\"colorPrimaryContainer\">@color/colorPrimary</item>\n        <item name=\"colorOnPrimaryContainer\">@color/colorOnPrimary</item>\n\n        <item name=\"colorSurface\">@color/colorSurface</item>\n        <item name=\"colorSurfaceVariant\">@color/colorSurface</item>\n\n        <item name=\"colorSurfaceContainerLowest\">@color/colorSurface</item>\n        <item name=\"colorSurfaceContainerLow\">@color/colorSurface</item>\n        <item name=\"colorSurfaceContainer\">@color/colorSurface</item>\n        <item name=\"colorSurfaceContainerHigh\">@color/colorSurface</item>\n        <item name=\"colorSurfaceContainerHighest\">@color/colorSurface</item>\n\n        <!-- used for e.g. selected menu items -->\n        <item name=\"colorSecondaryContainer\">@color/colorSecondaryContainer</item>\n\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n\n        <item name=\"android:colorBackground\">@color/colorBackground</item>\n        <item name=\"colorBackgroundAccent\">@color/colorBackgroundAccent</item>\n        <item name=\"colorBackgroundHighlight\">@color/colorBackgroundHighlight</item>\n        <item name=\"windowBackgroundColor\">@color/windowBackground</item>\n\n        <item name=\"android:textColorPrimary\">@color/textColorPrimary</item>\n        <item name=\"android:textColorSecondary\">@color/textColorSecondary</item>\n        <item name=\"android:textColorTertiary\">@color/textColorTertiary</item>\n\n        <item name=\"iconColor\">@color/iconColor</item>\n        <item name=\"colorOutline\">@color/iconColor</item>\n        <item name=\"colorOutlineVariant\">@color/dividerColor</item>\n\n        <item name=\"android:listDivider\">@drawable/status_divider</item>\n        <item name=\"dividerColor\">@color/dividerColor</item>\n\n        <item name=\"textColorDisabled\">@color/textColorDisabled</item>\n\n        <item name=\"materialDrawerStyle\">@style/TuskyDrawerStyle</item>\n        <item name=\"materialDrawerHeaderStyle\">@style/TuskyDrawerHeaderStyle</item>\n\n        <item name=\"snackbarButtonStyle\">@style/TuskyButton.TextButton</item>\n\n        <!-- for dialogs created with MaterialALertDialogBuilder -->\n        <item name=\"materialAlertDialogTheme\">@style/TuskyMaterialDialogOverlay</item>\n        <!-- for dialogs opened from preferences -->\n        <item name=\"alertDialogTheme\">@style/TuskyAlertDialog</item>\n        <item name=\"dialogCornerRadius\">16dp</item>\n\n        <item name=\"materialTimePickerTheme\">@style/TuskyTimePickerOverlay</item>\n        <item name=\"materialCalendarTheme\">@style/TuskyDatePickerOverlay</item>\n\n        <item name=\"minTouchTargetSize\">32dp</item> <!-- this affects RadioButton size -->\n        <item name=\"elevationOverlayEnabled\">false</item> <!-- disable the automatic tinting of surfaces with elevation in dark mode -->\n\n        <item name=\"swipeRefreshLayoutProgressSpinnerBackgroundColor\">?attr/colorSurface</item>\n\n        <item name=\"chipStyle\">@style/Widget.Material3.Chip.Filter</item>\n\n        <item name=\"preferenceTheme\">@style/TuskyPreferenceTheme</item>\n\n        <item name=\"homeAsUpIndicator\">@drawable/ic_arrow_back_24dp</item>\n        <item name=\"searchViewStyle\">@style/TuskySearchViewStyle</item>\n\n        <item name=\"toolbarIconBackgroundColor\">@color/toolbarIconBackgroundColor</item>\n        <item name=\"placeholderColor\">@color/placeholderColor</item>\n\n    </style>\n\n    <style name=\"TuskyBlackThemeBase\" parent=\"TuskyBaseTheme\">\n        <item name=\"colorPrimaryDark\">@color/tusky_grey_05</item>\n\n        <item name=\"colorOnPrimary\">@color/black</item>\n\n        <item name=\"android:colorBackground\">@color/black</item>\n        <item name=\"windowBackgroundColor\">@color/black</item>\n\n        <item name=\"colorSurface\">@color/tusky_grey_10</item>\n        <item name=\"colorSurfaceVariant\">@color/tusky_grey_10</item>\n\n        <item name=\"colorSurfaceContainerLowest\">@color/tusky_grey_10</item>\n        <item name=\"colorSurfaceContainerLow\">@color/tusky_grey_10</item>\n        <item name=\"colorSurfaceContainer\">@color/tusky_grey_10</item>\n        <item name=\"colorSurfaceContainerHigh\">@color/tusky_grey_10</item>\n        <item name=\"colorSurfaceContainerHighest\">@color/tusky_grey_10</item>\n\n        <item name=\"iconColor\">@color/tusky_grey_40</item>\n        <item name=\"colorBackgroundHighlight\">@color/tusky_grey_40</item>\n        <item name=\"colorBackgroundAccent\">@color/tusky_grey_20</item>\n\n        <item name=\"dividerColor\">@color/tusky_grey_20</item>\n        <item name=\"colorOutlineVariant\">@color/tusky_grey_20</item>\n\n        <item name=\"toolbarIconBackgroundColor\">@color/transparent_tusky_grey_10</item>\n        <item name=\"placeholderColor\">@color/tusky_grey_30</item>\n    </style>\n\n    <style name=\"TuskyBlackTheme\" parent=\"TuskyBlackThemeBase\" />\n\n    <style name=\"ViewMediaActivity.AppBarLayout\" parent=\"ThemeOverlay.AppCompat\">\n        <item name=\"android:colorControlNormal\">@color/white</item>\n        <item name=\"colorControlNormal\">@color/white</item>\n    </style>\n\n    <style name=\"TuskyDialogFragment\" parent=\"@style/ThemeOverlay.Material3.Dialog\">\n        <item name=\"android:windowBackground\">@drawable/dialog_background</item>\n        <item name=\"android:backgroundDimAmount\">0.5</item>\n    </style>\n\n    <style name=\"TuskyAlertDialog\" parent=\"@style/ThemeOverlay.Material3.Dialog.Alert\">\n        <item name=\"android:windowBackground\">@drawable/dialog_background</item>\n        <item name=\"android:backgroundDimAmount\">0.5</item>\n    </style>\n\n    <style name=\"TuskyMaterialDialogOverlay\" parent=\"@style/ThemeOverlay.Material3.MaterialAlertDialog\">\n        <item name=\"alertDialogStyle\">@style/TuskyMaterialDialog</item>\n        <item name=\"android:backgroundDimAmount\">0.5</item>\n    </style>\n\n    <style name=\"TuskyMaterialDialog\" parent=\"@style/MaterialAlertDialog.Material3\">\n        <item name=\"shapeAppearance\">@style/ShapeAppearance.Material3.Corner.Large</item>\n        <item name=\"backgroundTint\">@color/colorBackground</item>\n    </style>\n\n    <style name=\"TuskyTimePickerOverlay\" parent=\"@style/ThemeOverlay.MaterialComponents.TimePicker\">\n        <item name=\"materialTimePickerStyle\">@style/TuskyTimePicker</item>\n    </style>\n    <style name=\"TuskyTimePicker\" parent=\"@style/Widget.Material3.MaterialTimePicker\">\n        <item name=\"shapeAppearance\">@style/ShapeAppearance.Material3.Corner.Large</item>\n        <item name=\"backgroundTint\">@color/colorBackground</item>\n    </style>\n\n    <style name=\"TuskyDatePickerOverlay\" parent=\"@style/ThemeOverlay.MaterialComponents.MaterialCalendar\">\n        <item name=\"materialCalendarStyle\">@style/TuskyDatePicker</item>\n    </style>\n    <style name=\"TuskyDatePicker\" parent=\"@style/Widget.Material3.MaterialCalendar\">\n        <item name=\"shapeAppearance\">@style/ShapeAppearance.Material3.Corner.Large</item>\n        <item name=\"backgroundTint\">@color/colorBackground</item>\n    </style>\n\n    <style name=\"TuskyTabAppearance\" parent=\"Widget.Material3.TabLayout\">\n        <item name=\"tabIndicatorHeight\">4dp</item>\n    </style>\n\n    <style name=\"TuskyPreferenceTheme\" parent=\"@style/PreferenceThemeOverlay\">\n        <item name=\"switchPreferenceCompatStyle\">@style/TuskySwitchPreference</item>\n        <item name=\"dialogPreferenceStyle\">@style/TuskyDialogPreference</item>\n    </style>\n\n    <style name=\"TuskyDialogPreference\" parent=\"@style/Preference.DialogPreference.Material\">\n        <item name=\"singleLineTitle\">false</item>\n    </style>\n\n    <style name=\"TuskySwitchPreference\" parent=\"@style/Preference.SwitchPreferenceCompat.Material\">\n        <item name=\"widgetLayout\">@layout/preference_material_switch</item>\n        <item name=\"singleLineTitle\">false</item>\n    </style>\n\n    <style name=\"TuskyImageButton\" parent=\"@style/Widget.MaterialComponents.Button.UnelevatedButton\">\n        <item name=\"android:tint\">?android:attr/textColorTertiary</item>\n        <item name=\"android:background\">?attr/selectableItemBackgroundBorderless</item>\n    </style>\n\n    <style name=\"TuskyButton\" parent=\"Widget.Material3.Button\">\n        <item name=\"shapeAppearance\">@style/ShapeAppearance.Material3.Corner.Small</item>\n    </style>\n\n    <style name=\"TuskyButton.Outlined\" parent=\"Widget.Material3.Button.OutlinedButton\">\n        <item name=\"strokeColor\">?attr/colorBackgroundAccent</item>\n        <item name=\"shapeAppearance\">@style/ShapeAppearance.Material3.Corner.Small</item>\n    </style>\n\n    <style name=\"TuskyButton.TextButton\" parent=\"Widget.Material3.Button.TextButton\">\n        <item name=\"shapeAppearance\">@style/ShapeAppearance.Material3.Corner.Small</item>\n    </style>\n\n    <style name=\"TuskyTextInput\" parent=\"@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense\">\n        <item name=\"boxStrokeColor\">@color/text_input_layout_box_stroke_color</item>\n        <item name=\"android:textColorHint\">?android:attr/textColorTertiary</item>\n    </style>\n\n    <style name=\"TuskyDrawerStyle\" parent =\"Widget.MaterialDrawerStyle\">\n        <item name=\"materialDrawerBackground\">?android:colorBackground</item>\n        <item name=\"materialDrawerPrimaryIcon\">?iconColor</item>\n        <item name=\"materialDrawerSecondaryIcon\">?iconColor</item>\n        <item name=\"materialDrawerDividerColor\">?dividerColor</item>\n    </style>\n\n    <style name=\"TuskyDrawerHeaderStyle\" parent =\"Widget.MaterialDrawerHeaderStyle\">\n        <item name=\"materialDrawerHeaderSelectionText\">?android:textColorPrimary</item>\n        <item name=\"materialDrawerHeaderSelectionSubtext\">?android:textColorPrimary</item>\n    </style>\n\n    <!-- customize the shape of the avatars in account selection list -->\n    <style name=\"BezelImageView\">\n        <item name=\"materialDrawerMaskDrawable\">@drawable/materialdrawer_shape_small</item>\n        <item name=\"materialDrawerDrawCircularShadow\">false</item>\n    </style>\n\n    <!-- Used in exo_player_control_view.xml. Unmodified values are 5dp each -->\n    <style name=\"TuskyExoPlayerPlayPause\" parent=\"ExoStyledControls.Button.Center.PlayPause\">\n        <item name=\"android:layout_marginLeft\">20dp</item>\n        <item name=\"android:layout_marginRight\">20dp</item>\n    </style>\n\n    <style name=\"TuskySearchViewStyle\" parent=\"Widget.Material3.SearchView\">\n        <item name=\"searchIcon\">@drawable/ic_search_24dp</item>\n        <item name=\"closeIcon\">@drawable/ic_close_24dp</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/theme_colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">@color/tusky_blue_dark</color>\n    <color name=\"colorSecondary\">@color/tusky_blue_dark</color>\n    <color name=\"colorSurface\">@color/tusky_grey_95</color>\n    <color name=\"colorPrimaryDark\">@color/tusky_grey_70</color>\n\n    <color name=\"colorOnPrimary\">@color/white</color>\n\n    <color name=\"colorBackground\">@color/white</color>\n    <color name=\"windowBackground\">@color/tusky_grey_80</color>\n\n    <color name=\"colorSecondaryContainer\">@color/tusky_grey_blue_light</color>\n\n    <color name=\"textColorPrimary\">@color/tusky_grey_10</color>\n    <color name=\"textColorSecondary\">@color/tusky_grey_20</color>\n    <color name=\"textColorTertiary\">@color/tusky_grey_30</color>\n    <color name=\"textColorDisabled\">@color/tusky_grey_70</color>\n\n    <color name=\"iconColor\">@color/tusky_grey_50</color>\n\n    <color name=\"colorBackgroundAccent\">@color/tusky_grey_70</color>\n    <color name=\"colorBackgroundHighlight\">@color/tusky_grey_50</color>\n    <color name=\"dividerColor\">@color/tusky_grey_70</color>\n    <color name=\"dividerColorOther\">@color/tusky_grey_90</color>\n\n    <color name=\"favoriteButtonActiveColor\">@color/tusky_orange_light</color>\n\n    <color name=\"warning_color\">@color/tusky_red</color>\n\n    <color name=\"headerBackgroundFilter\">@color/header_background_filter_light</color>\n\n    <bool name=\"lightNavigationBar\">true</bool>\n\n    <color name=\"botBadgeForeground\">@color/tusky_grey_20</color>\n    <color name=\"botBadgeBackground\">@color/white</color>\n\n    <color name=\"toolbarIconBackgroundColor\">#CCEBEFF4</color>\n\n    <color name=\"placeholderColor\">@color/tusky_grey_90</color>\n\n    <!-- colors used to show inserted/deleted text -->\n    <color name=\"view_edits_background_insert\">@color/tusky_green_lighter</color>\n    <color name=\"view_edits_background_delete\">@color/tusky_red_lighter</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/toot_button.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <bool name=\"show_small_toot_button\">true</bool>\n    <dimen name=\"toot_button_width\">48dp</dimen>\n    <dimen name=\"toot_button_horizontal_padding\">12dp</dimen>\n\n</resources>"
  },
  {
    "path": "app/src/main/res/values/values.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <integer name=\"profile_media_column_count\">3</integer>\n\n    <integer name=\"trending_column_count\">1</integer>\n\n    <bool name=\"is_edge_to_edge\">false</bool>\n    <bool name=\"is_not_edge_to_edge\">true</bool>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ar/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">وقع هناك خطأ.</string>\n    <string name=\"error_network\">حدث خطأ في الشبكة. يرجى التحقق من اتصالك ثم أعد المحاولة!</string>\n    <string name=\"error_empty\">لا يجب أن يترك هذا الحقل فارغا.</string>\n    <string name=\"error_invalid_domain\">اسم النطاق الذي قمتَ بإدخاله غير صالح</string>\n    <string name=\"error_failed_app_registration\">أخففت المصادقة مع مثيل الخادم هذا. إذا استمرت هذه المشكلة، جرب تسجيل الدخول عبر المتصفح من القائمة.</string>\n    <string name=\"error_no_web_browser_found\">تعذر العثور على متصفح ويب صالح للإستعمال.</string>\n    <string name=\"error_authorization_unknown\">لقد وقع هناك خطأ مجهول في التصريح. إن استمرّ ذلك، يُرجى إعادة محاولة التسجيل بمساعدة متصفح الويب وذلك عبر القائمة.</string>\n    <string name=\"error_authorization_denied\">تم رفض التصريح.</string>\n    <string name=\"error_retrieving_oauth_token\">فشل الحصول على رمز الولوج.</string>\n    <string name=\"error_compose_character_limit\">إنّ المنشور طويل جدا!</string>\n    <string name=\"error_media_upload_type\">لا يمكن تحميل هذا النوع من الملفات.</string>\n    <string name=\"error_media_upload_opening\">تعذر فتح ذاك الملف.</string>\n    <string name=\"error_media_upload_permission\">التصريح لازم لقراءة الوسائط.</string>\n    <string name=\"error_media_download_permission\">التصريح لازم للإحتفاظ بالوسائط.</string>\n    <string name=\"error_media_upload_image_or_video\">لا يمكنك إرفاق كلا من الصور والفيديوهات في نفس المنشور في آن واحد.</string>\n    <string name=\"error_media_upload_sending\">اخفقت عملية الرفع.</string>\n    <string name=\"error_sender_account_gone\">خطأ عند إرسال المنشور.</string>\n    <string name=\"title_home\">الرئيسي</string>\n    <string name=\"title_notifications\">الاشعارات</string>\n    <string name=\"title_public_local\">المحلي</string>\n    <string name=\"title_public_federated\">الفدرالي</string>\n    <string name=\"title_direct_messages\">الرسائل المباشرة</string>\n    <string name=\"title_tab_preferences\">الألسنة</string>\n    <string name=\"title_view_thread\">خيط</string>\n    <string name=\"title_posts\">المنشورات</string>\n    <string name=\"title_posts_with_replies\">بالردود</string>\n    <string name=\"title_posts_pinned\">المدبّسة</string>\n    <string name=\"title_follows\">المتابَعون</string>\n    <string name=\"title_followers\">المتابِعون</string>\n    <string name=\"title_favourites\">المفضلة</string>\n    <string name=\"title_mutes\">الحسابات المكتومة</string>\n    <string name=\"title_blocks\">الحسابات المحظورة</string>\n    <string name=\"title_follow_requests\">طلبات المتابعة</string>\n    <string name=\"title_edit_profile\">عدل ملفك التعريفي</string>\n    <string name=\"title_drafts\">المسودات</string>\n    <string name=\"title_licenses\">الرّخص</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">شاركه %1$s</string>\n    <string name=\"post_sensitive_media_title\">محتوى حساس</string>\n    <string name=\"post_media_hidden_title\">وسائط مخفية</string>\n    <string name=\"post_sensitive_media_directions\">اضغط للعرض</string>\n    <string name=\"post_content_warning_show_more\">اعرض المزيد</string>\n    <string name=\"post_content_warning_show_less\">اعرض أقل</string>\n    <string name=\"post_content_show_more\">توسيع</string>\n    <string name=\"post_content_show_less\">تصغير</string>\n    <string name=\"message_empty\">لا شيء هنا.</string>\n    <string name=\"footer_empty\">لا يوجد شيء هنا. إسحب إلى أسفل للإنعاش!</string>\n    <string name=\"notification_reblog_format\">شارك %1$s منشورك</string>\n    <string name=\"notification_favourite_format\">أعجِب %1$s بمنشورك</string>\n    <string name=\"notification_follow_format\">%1$s يتبعك</string>\n    <string name=\"report_username_format\">أبلغ عن @%1$s</string>\n    <string name=\"report_comment_hint\">تعليقات إضافية؟</string>\n    <string name=\"action_quick_reply\">رد سريع</string>\n    <string name=\"action_reply\">رد</string>\n    <string name=\"action_reblog\">شارك</string>\n    <string name=\"action_unreblog\">إلغاء إعادة المشاركة</string>\n    <string name=\"action_favourite\">تفضيل</string>\n    <string name=\"action_unfavourite\">إزالة المفضلة</string>\n    <string name=\"action_more\">المزيد</string>\n    <string name=\"action_compose\">حرر</string>\n    <string name=\"action_login\">الولوج باستخدام Tusky</string>\n    <string name=\"action_logout\">خروج</string>\n    <string name=\"action_logout_confirm\">متأكد مِن أنك تود الخروج من الحساب %1$s؟</string>\n    <string name=\"action_follow\">إتبع</string>\n    <string name=\"action_unfollow\">إلغاء المتابعة</string>\n    <string name=\"action_block\">قم بحظره</string>\n    <string name=\"action_unblock\">إلغاء الحظر</string>\n    <string name=\"action_hide_reblogs\">إخفاء المشاركات</string>\n    <string name=\"action_show_reblogs\">إظهار المشاركات</string>\n    <string name=\"action_report\">أبلغ عنه</string>\n    <string name=\"action_delete\">إحذف</string>\n    <string name=\"action_send\">بَوّق</string>\n    <string name=\"action_send_public\">بوّق!</string>\n    <string name=\"action_retry\">أعد المحاولة</string>\n    <string name=\"action_close\">إغلاق</string>\n    <string name=\"action_view_profile\">الملف التعريفي</string>\n    <string name=\"action_view_preferences\">التفضيلات</string>\n    <string name=\"action_view_account_preferences\">اعدادات الحساب</string>\n    <string name=\"action_view_favourites\">المفضلة</string>\n    <string name=\"action_view_mutes\">المستخدمون المكتومون</string>\n    <string name=\"action_view_blocks\">المستخدمون المحظورون</string>\n    <string name=\"action_view_follow_requests\">طلبات المتابعة</string>\n    <string name=\"action_view_media\">وسائط</string>\n    <string name=\"action_open_in_web\">إفتح في متصفح</string>\n    <string name=\"action_add_media\">إضافة وسائط</string>\n    <string name=\"action_photo_take\">أخذ صورة</string>\n    <string name=\"action_share\">شارك</string>\n    <string name=\"action_mute\">أكتم</string>\n    <string name=\"action_unmute\">إلغاء الكتم</string>\n    <string name=\"action_mention\">أذكر</string>\n    <string name=\"action_hide_media\">إخفاء الوسائط</string>\n    <string name=\"action_open_drawer\">إفتح الدرج</string>\n    <string name=\"action_save\">إحفظ</string>\n    <string name=\"action_edit_profile\">تعديل الملف التعريفي</string>\n    <string name=\"action_edit_own_profile\">تعديل</string>\n    <string name=\"action_undo\">إلغاء</string>\n    <string name=\"action_accept\">موافقة</string>\n    <string name=\"action_reject\">رفض</string>\n    <string name=\"action_search\">البحث</string>\n    <string name=\"action_access_drafts\">المسودات</string>\n    <string name=\"action_toggle_visibility\">كيفية عرض المنشور</string>\n    <string name=\"action_content_warning\">تحذير عن المحتوى</string>\n    <string name=\"action_emoji_keyboard\">لوحة مفاتيح الإيموجي</string>\n    <string name=\"action_add_tab\">إضافة لسان</string>\n    <string name=\"action_links\">الروابط</string>\n    <string name=\"action_mentions\">الإشارات</string>\n    <string name=\"action_hashtags\">الوسوم</string>\n    <string name=\"action_open_reblogged_by\">اعرض المشاركات</string>\n    <string name=\"action_open_faved_by\">اعرض المفضلات</string>\n    <string name=\"title_hashtags_dialog\">الوسوم</string>\n    <string name=\"title_mentions_dialog\">الإشارات</string>\n    <string name=\"title_links_dialog\">الروابط</string>\n    <string name=\"download_image\">تنزيل %1$s</string>\n    <string name=\"action_copy_link\">إنسخ الرابط</string>\n    <string name=\"action_open_as\">إفتحه كـ %1$s</string>\n    <string name=\"action_share_as\">شاركه كـ…</string>\n    <string name=\"send_post_link_to\">شارك رابط التبويق مع…</string>\n    <string name=\"send_post_content_to\">شارك التبويق على…</string>\n    <string name=\"send_media_to\">شارك الوسيط مع…</string>\n    <string name=\"confirmation_reported\">تم إرساله!</string>\n    <string name=\"confirmation_unblocked\">تم فك الحجب عن الحساب</string>\n    <string name=\"confirmation_unmuted\">لم يعد الحساب مكتومًا</string>\n    <string name=\"hint_domain\">أي مثيل خادم؟</string>\n    <string name=\"hint_compose\">ما الجديد؟</string>\n    <string name=\"hint_content_warning\">تحذير عن المحتوى</string>\n    <string name=\"hint_display_name\">الإسم العلني</string>\n    <string name=\"hint_note\">السيرة</string>\n    <string name=\"hint_search\">البحث عن…</string>\n    <string name=\"search_no_results\">لم يتم العثور على أية نتائج</string>\n    <string name=\"label_quick_reply\">رد…</string>\n    <string name=\"label_avatar\">صورة الملف التعريفي</string>\n    <string name=\"label_header\">صورة رأس الصفحة</string>\n    <string name=\"link_whats_an_instance\">ماذا نعني بمثيل الخادم؟</string>\n    <string name=\"login_connection\">الإتصال جارٍ…</string>\n    <string name=\"dialog_whats_an_instance\">بإمكانك إدخال عنوان أي مثيل خادوم ماستدون هنا. على سبيل المثال mastodon.social أو icosahedron.website أو social.tchncs.de أوالإطلاع على <a href=\"https://instances.social\">لاكتشاف المزيد !</a> \\u0020\n\\n \\u0020\n\\n إن كنت لا تملك حسابا بإمكانك إدخال اسم مثيل خادوم تريد الانضمام إليه قصد إنشاء حسابك عليه. \\u0020\n\\n \\u0020\n\\n نعني بمثيل الخادوم المكان الذي استُضِيف فيه حسابك و يمكنك التواصل مع أصدقائك و متابعيك و كأنكم على موقع واحد و ذلك حتى و إن كانت حساباتهم مُستضافة على مثيلات خوادم أخرى. \\u0020\n\\n \\u0020\n\\n للمزيد مِن التفاصيل إطّلع على <a href=\"https://joinmastodon.org\">joinmastodon.org</a>. </string>\n    <string name=\"dialog_title_finishing_media_upload\">تتمة رفع الوسائط</string>\n    <string name=\"dialog_message_uploading_media\">الإرسال جارٍ…</string>\n    <string name=\"dialog_download_image\">تنزيل</string>\n    <string name=\"dialog_message_cancel_follow_request\">هل تريد رفض طلب المتابعة؟</string>\n    <string name=\"dialog_unfollow_warning\">هل تود إلغاء متابعة هذا الحساب؟</string>\n    <string name=\"dialog_delete_post_warning\">هل تريد حذف هذا التبويق؟</string>\n    <string name=\"visibility_public\">للعامة: ينشر على الخيوط العمومية</string>\n    <string name=\"visibility_unlisted\">غير مدرج: لا يُعرَض على الخيوط العمومية</string>\n    <string name=\"visibility_private\">لمتابعيك فقط: يُنشر إلى متابعيك فقط</string>\n    <string name=\"visibility_direct\">مباشر: يُنشر إلى المستخدمين المشار إليهم فقط</string>\n    <string name=\"pref_title_edit_notification_settings\">تعديل الاشعارات</string>\n    <string name=\"pref_title_notifications_enabled\">الإخطارات</string>\n    <string name=\"pref_title_notification_alerts\">التنبيهات</string>\n    <string name=\"pref_title_notification_alert_sound\">إعلام بالصوت</string>\n    <string name=\"pref_title_notification_alert_vibrate\">إعلام بالاهتزار</string>\n    <string name=\"pref_title_notification_alert_light\">إعلام بالضوء</string>\n    <string name=\"pref_title_notification_filters\">أخطرني عندما</string>\n    <string name=\"pref_title_appearance_settings\">المظهر</string>\n    <string name=\"pref_title_app_theme\">مظهر التطبيق</string>\n    <string name=\"pref_title_timelines\">الخيوط الزمنية</string>\n    <string name=\"pref_title_timeline_filters\">عوامل التصفية</string>\n    <string name=\"app_them_dark\">داكنة</string>\n    <string name=\"app_theme_light\">فاتحة</string>\n    <string name=\"app_theme_black\">سوداء</string>\n    <string name=\"app_theme_auto\">تلقائي عند غروب الشمس</string>\n    <string name=\"app_theme_system\">استخدم مظهر النظام</string>\n    <string name=\"pref_title_browser_settings\">المتصفح</string>\n    <string name=\"pref_title_custom_tabs\">إخفاء زر المتابعة أثناء تمرير الصفحة</string>\n    <string name=\"pref_title_language\">اللغة</string>\n    <string name=\"pref_title_post_filter\">تصفية الخيوط</string>\n    <string name=\"pref_title_post_tabs\">الخيط الرئيس</string>\n    <string name=\"pref_title_show_boosts\">عرض المُعاد نشرها</string>\n    <string name=\"pref_title_show_replies\">عرض الردود</string>\n    <string name=\"pref_title_show_media_preview\">إظهار معاينات الوسائط</string>\n    <string name=\"pref_title_proxy_settings\">البروكسي</string>\n    <string name=\"pref_title_http_proxy_settings\">بروكسي HTTP</string>\n    <string name=\"pref_title_http_proxy_enable\">تفعيل بروكسي HTTP</string>\n    <string name=\"pref_title_http_proxy_server\">خادوم بروكسي HTTP</string>\n    <string name=\"pref_title_http_proxy_port\">منفذ بروكسي HTTP</string>\n    <string name=\"pref_default_post_privacy\">الخصوصية الإفتراضية للنشر</string>\n    <string name=\"pref_default_media_sensitivity\">تعيين الوسائط كمحتوى حساس دائمًا</string>\n    <string name=\"pref_publishing\">النشر</string>\n    <string name=\"pref_failed_to_sync\">فَشِلَت عملية مزامنة الخيارات</string>\n    <string name=\"post_privacy_public\">للعامة</string>\n    <string name=\"post_privacy_unlisted\">غير مدرج</string>\n    <string name=\"post_privacy_followers_only\">للمُتابِعين فقط</string>\n    <string name=\"pref_post_text_size\">حجم الخط</string>\n    <string name=\"post_text_size_smallest\">صغير جدا</string>\n    <string name=\"post_text_size_small\">صغير</string>\n    <string name=\"post_text_size_medium\">متوسط</string>\n    <string name=\"post_text_size_large\">عريض</string>\n    <string name=\"post_text_size_largest\">عريض جدا</string>\n    <string name=\"notification_mention_name\">إشارات جديدة</string>\n    <string name=\"notification_mention_descriptions\">الإخطارات عندما يشار إليك</string>\n    <string name=\"notification_follow_name\">متابِعون جدد</string>\n    <string name=\"notification_follow_description\">إخطارات عند تلقي متابعين جدد</string>\n    <string name=\"notification_boost_name\">المشاركات</string>\n    <string name=\"notification_boost_description\">إشعاري عندما يقوم أحدهم بإعادة نشر منشوراتي</string>\n    <string name=\"notification_favourite_name\">المفضلة</string>\n    <string name=\"notification_favourite_description\">الإشعار عندما يقوم أحدهم بإضافة منشوراتك إلى مفضلاته</string>\n    <string name=\"notification_mention_format\">%1$s أشار إليك</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s و %4$d آخرون</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, و %3$s</string>\n    <string name=\"notification_summary_small\">%1$s و %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"zero\">%1$d تفاعلات جديدة</item>\n        <item quantity=\"one\">تفاعل جديد</item>\n        <item quantity=\"two\">تفاعلين جديدين</item>\n        <item quantity=\"few\">%1$d تفاعلات جديدة</item>\n        <item quantity=\"many\">%1$d تفاعلات جديدة</item>\n        <item quantity=\"other\">%1$d تفاعلات جديدة</item>\n    </plurals>\n    <string name=\"description_account_locked\">حساب مقفل</string>\n    <string name=\"about_title_activity\">عن التطبيق</string>\n    <string name=\"about_tusky_version\">توسكي %1$s</string>\n    <string name=\"about_tusky_license\">Tuksy برنامج حر و مفتوح المصدر. مطور تحت رخصة GNU General Public License Version 3. يمكنكم الإطلاع على الرخصة على : https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">موقع ويب المشروع: https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">تقارير الأخطاء وطلبات التحسينات:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">الملف الشخصي لتوسكي</string>\n    <string name=\"post_share_content\">شارك محتوى التبويق</string>\n    <string name=\"post_share_link\">شارك الرابط إلى التبويق</string>\n    <string name=\"post_media_images\">صور</string>\n    <string name=\"post_media_video\">فيديو</string>\n    <string name=\"state_follow_requested\">طلب متابعة</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">في %1$dy</string>\n    <string name=\"abbreviated_in_days\">في %1$dd</string>\n    <string name=\"abbreviated_in_hours\">في %1$dh</string>\n    <string name=\"abbreviated_in_minutes\">في %1$dm</string>\n    <string name=\"abbreviated_in_seconds\">في %1$ds</string>\n    <string name=\"abbreviated_years_ago\">%1$dس</string>\n    <string name=\"abbreviated_days_ago\">%1$dأيام</string>\n    <string name=\"abbreviated_hours_ago\">%1$dسا</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dد</string>\n    <string name=\"abbreviated_seconds_ago\">%1$dثا</string>\n    <string name=\"follows_you\">يتبعك الآن</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">أظهر دائما المحتوى الحساس</string>\n    <string name=\"title_media\">الوسائط</string>\n    <string name=\"replying_to\">ردًا على @%1$s</string>\n    <string name=\"load_more_placeholder_text\">حمِّل المزيد</string>\n    <string name=\"pref_title_public_filter_keywords\">الخطوط الزمنية العمومية</string>\n    <string name=\"pref_title_thread_filter_keywords\">المحادثات</string>\n    <string name=\"filter_addition_title\">إضافة عامل تصفية</string>\n    <string name=\"filter_edit_title\">تعديل عامل التصفية</string>\n    <string name=\"filter_dialog_remove_button\">إزالة</string>\n    <string name=\"filter_dialog_update_button\">تحديث</string>\n    <string name=\"filter_add_description\">العبارة التي يلزم تصفيتها</string>\n    <string name=\"add_account_name\">إضافة حساب</string>\n    <string name=\"add_account_description\">إضافة حساب ماستدون جديد</string>\n    <string name=\"action_lists\">القوائم</string>\n    <string name=\"title_lists\">القوائم</string>\n    <string name=\"error_create_list\">لا يمكن إنشاء قائمة</string>\n    <string name=\"error_rename_list\">تعذّر تحديث القائمة</string>\n    <string name=\"error_delete_list\">لا يمكن حذف القائمة</string>\n    <string name=\"action_create_list\">إنشاء قائمة</string>\n    <string name=\"action_rename_list\">تحديث القائمة</string>\n    <string name=\"action_delete_list\">حذف القائمة</string>\n    <string name=\"hint_search_people_list\">البحث عن أشخاص قصد متابعتهم</string>\n    <string name=\"action_add_to_list\">إضافة الحساب إلى القائمة</string>\n    <string name=\"action_remove_from_list\">إزالة الحساب مِن القائمة</string>\n    <string name=\"compose_active_account_description\">النشر بإسم %1$s</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"zero\">وصف لضعاف البصر\n\\n(%1$d أحرف على أقصى تقدير)</item>\n        <item quantity=\"one\">وصف لضعاف البصر\n\\n(حرف واحد على أقصى تقدير)</item>\n        <item quantity=\"two\">وصف لضعاف البصر\n\\n(حرفان على أقصى تقدير)</item>\n        <item quantity=\"few\">وصف لضعاف البصر\n\\n(%1$d حروف على أقصى تقدير)</item>\n        <item quantity=\"many\">وصف لضعاف البصر\n\\n(%1$d حرفًا على أقصى تقدير)</item>\n        <item quantity=\"other\">وصف لضعاف البصر\n\\n(%1$d حرف على أقصى تقدير)</item>\n    </plurals>\n    <string name=\"action_set_caption\">إضافة شرح</string>\n    <string name=\"action_remove\">حذف</string>\n    <string name=\"lock_account_label\">تجميد الحساب</string>\n    <string name=\"lock_account_label_description\">يتطلب منك قبول طلبات المتابَعة يدويا</string>\n    <string name=\"compose_save_draft\">هل تود الإحتفاظ بالمسودة ؟</string>\n    <string name=\"send_post_notification_title\">جارٍ إرسال التبويق…</string>\n    <string name=\"send_post_notification_error_title\">خطأ أثناء عملية إرسال التبويق</string>\n    <string name=\"send_post_notification_channel_name\">إرسال المنشورات</string>\n    <string name=\"send_post_notification_cancel_title\">أُلغيَ الإرسال</string>\n    <string name=\"send_post_notification_saved_content\">تم الاحتفاظ بنسخة مِن التبويق في مسوداتك</string>\n    <string name=\"action_compose_shortcut\">حرر</string>\n    <string name=\"error_no_custom_emojis\">لا يحتوي مثيل خادومكم %1$s على أية حزمة إيموجي مخصصة</string>\n    <string name=\"emoji_style\">نوع الإيموجي</string>\n    <string name=\"system_default\">الإفتراضي في النظام</string>\n    <string name=\"download_fonts\">يجب عليك أولا تنزيل حزمة الإيموجي هذه</string>\n    <string name=\"performing_lookup_title\">البحث جارٍ …</string>\n    <string name=\"expand_collapse_all_posts\">توسيع/طي كافة المنشورات</string>\n    <string name=\"action_open_post\">افتح التبويق</string>\n    <string name=\"restart_required\">مطلوب إعادة تشغيل التطبيق</string>\n    <string name=\"restart_emoji\">إعادة تشغيل توسكي مطلوبة قصد تفعيل التعديلات</string>\n    <string name=\"later\">لاحقًا</string>\n    <string name=\"restart\">إعادة التشغيل</string>\n    <string name=\"caption_systememoji\">مجموعة الإيموجي المُدمَجة في جهازك</string>\n    <string name=\"caption_blobmoji\">إيموجيات الفقاقيع المعروفة على أندرويد 4.4–7.1</string>\n    <string name=\"caption_twemoji\">مجموعة الإيموجي الخاصة بماستدون</string>\n    <string name=\"download_failed\">فشلت عملية التنزيل</string>\n    <string name=\"profile_badge_bot_text\">روبوت</string>\n    <string name=\"account_moved_description\">إنتقَلَ %1$s إلى :</string>\n    <string name=\"reblog_private\">إعادة النشر إلى الجمهور الأصلي</string>\n    <string name=\"unreblog_private\">إلغاء إعادة النشر</string>\n    <string name=\"license_description\">يحتوي توسكي على شيفرة وأوصول صادرة مِن المشاريع المفتوحة التالية :</string>\n    <string name=\"license_apache_2\">مرخص تحت رخصة أباتشي (النسخة أسفله)</string>\n    <string name=\"license_cc_by_4\">المشاع الإبداعي CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">المشاع الإبداعي CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">البيانات الوصفية للملف الشخصي</string>\n    <string name=\"profile_metadata_add\">إضافة بيانات</string>\n    <string name=\"profile_metadata_label_label\">الوسم</string>\n    <string name=\"profile_metadata_content_label\">المحتوى</string>\n    <string name=\"pref_title_absolute_time\">استخدام الوقت المطلق</string>\n    <string name=\"label_remote_account\">المعلومات الواردة أدناه قد لا تعكس الملف الكامل للمستخدم. اضغط لفتحه على المتصفح.</string>\n    <string name=\"unpin_action\">فك التدبيس</string>\n    <string name=\"pin_action\">ثبت</string>\n    <string name=\"title_reblogged_by\">شوركت بواسطة</string>\n    <string name=\"title_favourited_by\">قام بإضافته إلى المفضلة</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s و %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s و %2$s و %3$d آخَرون</string>\n    <string name=\"description_post_media\">الوسائط: %1$s</string>\n    <string name=\"description_post_cw\">تحذير عن المحتوى: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">مِن دون وصف</string>\n    <string name=\"description_post_reblogged\">أعاد تدوينه</string>\n    <string name=\"description_visibility_public\">للعامة</string>\n    <string name=\"description_visibility_unlisted\">غير مُدرَج</string>\n    <string name=\"description_visibility_private\">المتابِعون</string>\n    <string name=\"description_visibility_direct\">مباشر</string>\n    <string name=\"hint_list_name\">اسم القائمة</string>\n    <string name=\"action_delete_and_redraft\">حذف وإعادة الصياغة</string>\n    <string name=\"action_open_reblogger\">إظهار صاحب إعادة النشر</string>\n    <string name=\"action_open_media_n\">افتح الوسيط #%1$d</string>\n    <string name=\"download_media\">نزّل الوسائط</string>\n    <string name=\"downloading_media\">جارٍ تنزيل الوسائط</string>\n    <string name=\"dialog_redraft_post_warning\">هل تريد حذف وإعادة صياغة هذا التبويق؟</string>\n    <string name=\"description_post_favourited\">تم تفضيله</string>\n    <string name=\"pick_hashtag_hint\">وسم بدون #</string>\n    <string name=\"notifications_clear\">مسح</string>\n    <string name=\"notifications_apply_filter\">عامل تصفية</string>\n    <string name=\"filter_apply\">طَبِّق</string>\n    <string name=\"compose_shortcut_long_label\">تحرير منشور</string>\n    <string name=\"compose_shortcut_short_label\">كتابة</string>\n    <string name=\"notification_clear_text\">هل تريد حقا مسح كافة إشعاراتك؟</string>\n    <string name=\"poll_info_time_absolute\">ينتهي في %1$s</string>\n    <string name=\"poll_info_closed\">انتهى</string>\n    <string name=\"poll_vote\">صَوِّت</string>\n    <string name=\"notification_poll_name\">استطلاعات الرأي</string>\n    <string name=\"notification_poll_description\">الإشعارات المتعلقة باستطلاعات الرأي التي انتهت</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"zero\">%1$s صوت</item>\n        <item quantity=\"one\">%1$s صوت</item>\n        <item quantity=\"two\">صوتين</item>\n        <item quantity=\"few\">%1$s أصوات</item>\n        <item quantity=\"many\">%1$s أصوات</item>\n        <item quantity=\"other\">%1$s أصوات</item>\n    </plurals>\n    <string name=\"poll_ended_voted\">لقد انتهى استطلاع رأي قد أبديت بصوتك فيه</string>\n    <string name=\"poll_ended_created\">لقد انتهى استطلاع رأي قمتَ بإنشائه</string>\n    <plurals name=\"favs\">\n        <item quantity=\"zero\"><b>%1$s</b> مفضلة</item>\n        <item quantity=\"one\"><b>%1$s</b> مفضلة</item>\n        <item quantity=\"two\"><b>%1$s</b> مفضلتين</item>\n        <item quantity=\"few\"><b>%1$s</b> مفضلة</item>\n        <item quantity=\"many\"><b>%1$s</b> مفضلات</item>\n        <item quantity=\"other\"><b>%1$s</b> مفضلات</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"zero\">لا إعادة نشر</item>\n        <item quantity=\"one\">إعادة نشر واحدة</item>\n        <item quantity=\"two\">أعيد نشره مرّتان</item>\n        <item quantity=\"few\"><b>%1$s</b> إعادات نشر</item>\n        <item quantity=\"many\"><b>%1$s</b> إعادة نشر</item>\n        <item quantity=\"other\"><b>%1$s</b> إعادة نشر</item>\n    </plurals>\n    <string name=\"pref_title_bot_overlay\">إظهار علامة البوتات</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"zero\">%1$d أيام متبقية</item>\n        <item quantity=\"one\">%1$d يوم متبقي</item>\n        <item quantity=\"two\">%1$d يومين متبقيين</item>\n        <item quantity=\"few\">%1$d أيام متبقية</item>\n        <item quantity=\"many\">%1$d أيام متبقية</item>\n        <item quantity=\"other\">%1$d أيام متبقية</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"zero\">%1$d ساعات متبقية</item>\n        <item quantity=\"one\">%1$d ساعة متبقية</item>\n        <item quantity=\"two\">%1$d ساعتان متبقيتان</item>\n        <item quantity=\"few\">%1$d ساعات متبقية</item>\n        <item quantity=\"many\">%1$d ساعات متبقية</item>\n        <item quantity=\"other\">%1$d ساعات متبقية</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"zero\">%1$d دقائق متبقية</item>\n        <item quantity=\"one\">%1$d دقيقة متبقية</item>\n        <item quantity=\"two\">%1$d دقيقتان متبقيتان</item>\n        <item quantity=\"few\">%1$d دقائق متبقية</item>\n        <item quantity=\"many\">%1$d دقائق متبقية</item>\n        <item quantity=\"other\">%1$d دقائق متبقية</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"zero\">%1$d ثوان متبقية</item>\n        <item quantity=\"one\">%1$d ثانية متبقية</item>\n        <item quantity=\"two\">%1$d ثانيتان متبقيتان</item>\n        <item quantity=\"few\">%1$d ثوان متبقية</item>\n        <item quantity=\"many\">%1$d ثوان متبقية</item>\n        <item quantity=\"other\">%1$d ثوان متبقية</item>\n    </plurals>\n    <string name=\"compose_preview_image_description\">إجراءات على الصورة %1$s</string>\n    <string name=\"caption_notoemoji\">حزمة الإيموجي الحالية لـ غوغل</string>\n    <string name=\"title_domain_mutes\">النطاقات المخفية</string>\n    <string name=\"action_view_domain_mutes\">النطاقات المخفية</string>\n    <string name=\"action_mute_domain\">اكتم %1$s</string>\n    <string name=\"confirmation_domain_unmuted\">لم يعُد %1$s مخفيا</string>\n    <string name=\"mute_domain_warning_dialog_ok\">اخفِ كافة النطاق</string>\n    <string name=\"pref_title_animate_gif_avatars\">تنشيط الصور المتحركة GIF للحسابات</string>\n    <string name=\"button_continue\">واصل</string>\n    <string name=\"button_back\">العودة</string>\n    <string name=\"button_done\">تم</string>\n    <string name=\"report_sent_success\">تم الابلاغ عن @%1$s بنجاح</string>\n    <string name=\"hint_additional_info\">تعليقات إضافية</string>\n    <string name=\"report_remote_instance\">أعد تحويله إلى %1$s</string>\n    <string name=\"failed_report\">فشل الابلاغ</string>\n    <string name=\"failed_fetch_posts\">فشلت عملية جلب المنشورات</string>\n    <string name=\"filter_dialog_whole_word\">الكلمة كاملة</string>\n    <string name=\"description_poll\">استطلاع رأي بالخيارات: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"mute_domain_warning\">هل أنت متأكد من أنك تريد حجب كافة %1$s؟ سوف لن يكون باستطاعتك رؤية أي محتوى قادم من هذا النطاق بعد الآن ، لا في الخيوط الزمنية العامة ولا في إخطاراتك. سيتم إزالة متابِعيك الذين هم على هذا النطاق.</string>\n    <string name=\"report_description_1\">سيتم إرسال التقرير إلى مشرفي خادمك. يمكنك تقديم تفسير عن سبب الإبلاغ عن الحساب أدناه:</string>\n    <string name=\"report_description_remote_instance\">هذا الحساب ينتسب إلى خادم آخر. هل تريد إرسال نسخة مجهولة من التقرير إلى هناك أيضا؟</string>\n    <string name=\"title_accounts\">الحسابات</string>\n    <string name=\"failed_search\">فشل البحث</string>\n    <string name=\"action_add_poll\">إضافة استطلاع رأي</string>\n    <string name=\"pref_title_alway_open_spoiler\">افتح دائما المنشورات التي تحتوي على محتوى حساس</string>\n    <string name=\"create_poll_title\">استطلاع رأي</string>\n    <string name=\"duration_5_min\">5 دقائق</string>\n    <string name=\"duration_30_min\">30 دقيقة</string>\n    <string name=\"duration_1_hour\">ساعة واحدة</string>\n    <string name=\"duration_6_hours\">6 ساعات</string>\n    <string name=\"duration_1_day\">يوم واحد</string>\n    <string name=\"duration_3_days\">3 أيام</string>\n    <string name=\"duration_7_days\">7 أيام</string>\n    <string name=\"add_poll_choice\">ضف خيارا</string>\n    <string name=\"poll_allow_multiple_choices\">خيارات متعددة</string>\n    <string name=\"poll_new_choice_hint\">الخيار %1$d</string>\n    <string name=\"edit_poll\">تعديل</string>\n    <string name=\"filter_dialog_whole_word_description\">عندما تكون الكلمة أو العبارة أبجدية رقمية فقط ، فلن يتم تطبيقها إلا إذا كانت مطابقة للكلمة بأكملها</string>\n    <string name=\"poll_info_format\"> <!-- 15 votes • 1 hour left --> %1$s • %2$s</string>\n    <string name=\"title_scheduled_posts\">المنشورات المُبَرمَجة</string>\n    <string name=\"action_edit\">تعديل</string>\n    <string name=\"action_access_scheduled_posts\">المنشورات المُبَرمَجة</string>\n    <string name=\"action_schedule_post\">برمجة تبويق</string>\n    <string name=\"action_reset_schedule\">صفّر</string>\n    <string name=\"post_lookup_error_format\">خطأ أثناء البحث عن منشور %1$s</string>\n    <string name=\"title_bookmarks\">الفواصل المرجعية</string>\n    <string name=\"action_bookmark\">أضفه إلى الفواصل المرجعية</string>\n    <string name=\"action_view_bookmarks\">الفواصل المرجعية</string>\n    <string name=\"about_powered_by_tusky\">مدعوم بِـ Tusky</string>\n    <string name=\"description_post_bookmarked\">أضيف إلى الفواصل المرجعية</string>\n    <string name=\"select_list_title\">اختر قائمة</string>\n    <string name=\"list\">القائمة</string>\n    <string name=\"no_drafts\">ليس لديك أية مسودات.</string>\n    <string name=\"no_scheduled_posts\">ليس لديك أية منشورات مُبرمَجة للنشر.</string>\n    <string name=\"warning_scheduling_interval\">تُقدّر أدنى فترة لبرمجة النشر في ماستدون بـ 5 دقائق.</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">تمكين حركات السحب للانتقال بين الألسنة</string>\n    <string name=\"pref_title_confirm_reblogs\">أظهر نافذة للتأكيد قبل إعادة النشر</string>\n    <string name=\"pref_title_show_cards_in_timelines\">أظهر معاينات الروابط على الخيوط</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"zero\">لا شخص</item>\n        <item quantity=\"one\">شخص واحد</item>\n        <item quantity=\"two\">شخصان</item>\n        <item quantity=\"few\">%1$s أشخاص</item>\n        <item quantity=\"many\">%1$s أشخاص</item>\n        <item quantity=\"other\">%1$s أشخاص</item>\n    </plurals>\n    <string name=\"notification_follow_request_description\">إشعارات عن طلبات المتابعة</string>\n    <string name=\"notification_follow_request_name\">طلبات المتابَعة</string>\n    <string name=\"dialog_mute_warning\">أتريد كتم @%1$s؟</string>\n    <string name=\"dialog_block_warning\">حجب @%1$s؟</string>\n    <string name=\"action_unmute_conversation\">ألغِ كتم المحادثة</string>\n    <string name=\"action_mute_conversation\">اكتم المحادثة</string>\n    <string name=\"notification_follow_request_format\">%1$s طلبَ متابعتك</string>\n    <string name=\"hashtags\">الوسوم</string>\n    <string name=\"add_hashtag_title\">إضافة وسم</string>\n    <string name=\"pref_title_gradient_for_media\">اظهر ألوانا متدرّجة للوسائط المخفية</string>\n    <string name=\"pref_main_nav_position\">موضع شريط التنقل الرئيسي</string>\n    <string name=\"pref_main_nav_position_option_bottom\">الأسفل</string>\n    <string name=\"pref_main_nav_position_option_top\">الأعلى</string>\n    <string name=\"action_unmute_domain\">إلغاء كتم %1$s</string>\n    <string name=\"dialog_mute_hide_notifications\">أخفِ الإشعارات</string>\n    <string name=\"action_unmute_desc\">إلغاء كتم %1$s</string>\n    <string name=\"pref_title_hide_top_toolbar\">إخفاء عنوان شريط الأدوات العلوي</string>\n    <string name=\"title_announcements\">الاعلانات</string>\n    <string name=\"dialog_delete_list_warning\">أتريد حقا حذف القائمة %1$s؟</string>\n    <string name=\"drafts_post_failed_to_send\">فشلت عملية إرسال التبويق!</string>\n    <string name=\"draft_deleted\">حُذفَت المسودة</string>\n    <string name=\"action_subscribe_account\">اشترك</string>\n    <string name=\"action_unsubscribe_account\">إلغاء الإشتراك</string>\n    <string name=\"notification_subscription_format\">نشر %1$s للتوّ</string>\n    <string name=\"action_delete_conversation\">احذف المحادثة</string>\n    <string name=\"dialog_delete_conversation_warning\">هل تريد حذف هذه المحادثة؟</string>\n    <string name=\"notification_subscription_name\">منشورات جديدة</string>\n    <string name=\"post_media_attachments\">مرفقات</string>\n    <string name=\"label_duration\">المدة</string>\n    <string name=\"no_announcements\">لا توجد إعلانات.</string>\n    <string name=\"account_note_hint\">ملاحظتك الخاصة عن هذا الحساب</string>\n    <string name=\"account_note_saved\">تم حفظها!</string>\n    <string name=\"review_notifications\">راجع الإشعارات</string>\n    <string name=\"post_media_audio\">صوت</string>\n    <string name=\"drafts_post_reply_removed\">لقد حُذِف التبويق الذي حررت من أجله مسودة الرد</string>\n    <string name=\"pref_title_animate_custom_emojis\">حرّك الإيموجيات المخصصة</string>\n    <string name=\"wellbeing_hide_stats_posts\">إخفاء الإحصائيات الكمية عن المنشورات</string>\n    <string name=\"wellbeing_hide_stats_profile\">إخفاء الإحصائيات الكمية عن الملفات التعريفية</string>\n    <string name=\"action_unbookmark\">احذف الفاصلة المرجعية</string>\n    <string name=\"pref_title_confirm_favourites\">إظهار تأكيد قبل الإضافة إلى المفضلة</string>\n    <string name=\"drafts_failed_loading_reply\">فشل في تحميل معلومات الرد</string>\n    <string name=\"duration_indefinite\">غير محددة</string>\n    <string name=\"limit_notifications\">وضع حد لإشعارات الخيط الزمني</string>\n    <string name=\"duration_14_days\">14 يومًا</string>\n    <string name=\"duration_30_days\">30 يومًا</string>\n    <string name=\"duration_60_days\">60 يومًا</string>\n    <string name=\"duration_90_days\">90 يومًا</string>\n    <string name=\"duration_180_days\">180 يومًا</string>\n    <string name=\"duration_365_days\">365 يومًا</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">تحرير منشور</string>\n    <string name=\"notification_sign_up_name\">حسابات جديدة</string>\n    <string name=\"title_login\">تسجيل الدخول</string>\n    <string name=\"notification_sign_up_format\">قام %1$s بإنشاء حساب</string>\n    <string name=\"notification_update_name\">منشورات تم تعديلها</string>\n    <string name=\"notification_update_format\">قام %1$s بتعديل منشوره</string>\n    <string name=\"a11y_label_loading_thread\">تحميل خيط المحادثة</string>\n    <string name=\"hint_media_description_missing\">يجب أن تضع وصفًا للوسائط.</string>\n    <string name=\"error_multimedia_size_limit\">لا يمكن أن يتجاوز حجم ملفات الفيديو والصوت %1$s ميغا بايت.</string>\n    <string name=\"error_image_edit_failed\">لا يمكن تحرير الصورة.</string>\n    <string name=\"title_edits\">التعديلات</string>\n    <string name=\"pref_show_self_username_never\">أبداً</string>\n    <string name=\"notification_subscription_description\">تشغيل الاشعارات عندما يقوم شخص انت مشترك معه بنشر منشور جديد</string>\n    <string name=\"notification_update_description\">ارسال إشعار عند تحرير المنشورات التي تفاعلت معها</string>\n    <string name=\"notification_report_name\">شكاوي</string>\n    <string name=\"notification_report_description\">ارسال إشعار عن شكاوى المدراء</string>\n    <string name=\"set_focus_description\">اضغط على الدائرة أو اسحبها لاختيار النقطة المحورية التي ستكون مرئية دائمًا في الصور المصغرة.</string>\n    <string name=\"compose_save_draft_loses_media\">حفظ المسودة؟ (سيتم رفع المرفقات مرة أخرى عند استعادة المسودة.)</string>\n    <string name=\"compose_unsaved_changes\">لديك تعديلات لم تحفظ.</string>\n    <string name=\"no_lists\">ليس لديك أي قوائم.</string>\n    <string name=\"post_edited\">عدَّلَ %1$s</string>\n    <string name=\"notification_report_format\">شكوى جديدة عن %1$s</string>\n    <string name=\"status_edit_info\">عدّله %1$s</string>\n    <string name=\"status_created_info\">أنشأه %1$s</string>\n    <string name=\"wellbeing_mode_notice\">سيتم إخفاء بعض المعلومات التي قد تؤثر على صحتك العقلية. هذا يتضمن:\n\\n\n\\n- المفضلة/المشاركات/متابعة الاشعارات\n\\n- المفضلة/عدد المشاركات على المنشور\n\\n- إحصائيات المتابعين/و الاحصائات على المنشورات في الملفات الشخصية\n\\n\n\\nلن تتأثر الاشعارات، ولكن يمكنك مراجعة اعدادات الاشعارات يدويا.</string>\n    <string name=\"confirmation_hashtag_unfollowed\">#%1$s الغاء متابعة</string>\n    <string name=\"pref_title_http_proxy_port_message\">المنفذ (port) يجب ان يكون بين %2$d و %1$d</string>\n    <string name=\"action_add_or_remove_from_list\">إضافة أو إزالة من القائمة</string>\n    <string name=\"failed_to_add_to_list\">فشل إضافة الحساب إلى القائمة</string>\n    <string name=\"description_post_edited\">تم تعديله</string>\n    <string name=\"duration_no_change\">(لا تعديل)</string>\n    <string name=\"pref_title_show_self_username\">إظهار اسم المستخدم في أشرطة الأدوات</string>\n    <string name=\"follow_requests_info\">على الرغم ان حسابك غير مقفل، اعتقد فريق %1$s أنك قد ترغب في مراجعة طلبات المتابعة من هذه الحسابات يدويًا.</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"zero\">لا يمكنك رفع أكثر من %1$d مرفق.</item>\n        <item quantity=\"one\">لا يمكنك رفع أكثر من %1$d مرفق.</item>\n        <item quantity=\"two\">لا يمكنك رفع أكثر من %1$d مرفقان.</item>\n        <item quantity=\"few\">لا يمكنك رفع أكثر من %1$d مرفقات.</item>\n        <item quantity=\"many\">لا يمكنك رفع أكثر من %1$d مرفقات.</item>\n        <item quantity=\"other\">لا يمكنك رفع أكثر من %1$d مرفقات.</item>\n    </plurals>\n    <string name=\"saving_draft\">جار حفظ المسودة …</string>\n    <string name=\"instance_rule_title\">%1$s شروط</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"pref_default_post_language\">لغة النشر الافتراضية</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"report_category_spam\">مزعجة</string>\n    <string name=\"report_category_other\">اخرى</string>\n    <string name=\"error_muting_hashtag_format\">خطأ في كتم صوت %1$s#</string>\n    <string name=\"error_unmuting_hashtag_format\">خطأ في إلغاء كتم صوت %1$s#</string>\n    <string name=\"notification_sign_up_description\">ارسال إشعار عندما يقوم مستخدم جديد بالتسجيل</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"failed_to_unpin\">فشل إلغاء التثبيت</string>\n    <string name=\"error_following_hashtags_unsupported\">مثيل الخادم هذا لا يدعم متابعة الوسوم.</string>\n    <string name=\"action_discard\">تجاهل التعديلات</string>\n    <string name=\"action_continue_edit\">الاستمرار في التعديل</string>\n    <string name=\"pref_show_self_username_always\">دائماً</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"notification_header_report_format\">%1$s أبلغ عن %2$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d منشورات ملحقة</string>\n    <string name=\"failed_to_pin\">فشل التثبيت</string>\n    <string name=\"instance_rule_info\">بتسجيل الدخول، أنت توافق على %1$s.</string>\n    <string name=\"description_post_language\">لغة المنشور</string>\n    <string name=\"delete_scheduled_post_warning\">هل تريد حذف هذا المنشور المُبَرمَج؟</string>\n    <string name=\"action_set_focus\">ضبط نقطة التركيز</string>\n    <string name=\"action_edit_image\">تعديل الصورة</string>\n    <string name=\"action_add_reaction\">إضافة رد فعل</string>\n    <string name=\"action_share_account_link\">مشاركة رابط الحساب</string>\n    <string name=\"action_share_account_username\">مشاركة اسم مستخدم الحساب</string>\n    <string name=\"send_account_link_to\">شارك رابط الحساب الى…</string>\n    <string name=\"send_account_username_to\">شارك اسم مستخدم الحساب إلى…</string>\n    <string name=\"account_username_copied\">تم نسخ اسم المستخدم</string>\n    <string name=\"pref_show_self_username_disambiguate\">عند تسجيل الدخول إلى حسابات متعددة</string>\n    <string name=\"status_created_at_now\">الآن</string>\n    <string name=\"failed_to_remove_from_list\">فشل إزالة الحساب من القائمة</string>\n    <string name=\"action_unfollow_hashtag_format\">الغاء متابعة #%1$s ؟</string>\n    <string name=\"mute_notifications_switch\">كتم الاشعارات</string>\n    <string name=\"error_following_hashtag_format\">خطأ في متابعة %1$s#</string>\n    <string name=\"error_unfollowing_hashtag_format\">خطأ في إلغاء متابعة %1$s#</string>\n    <string name=\"title_followed_hashtags\">الوسوم المتابَعة</string>\n    <string name=\"error_status_source_load\">فشل تحميل مصدر المنشور من الخادم.</string>\n    <string name=\"report_category_violation\">انتهاك الشروط</string>\n    <string name=\"pref_title_wellbeing_mode\">الرفاهية</string>\n    <string name=\"account_date_joined\">انضم في %1$s</string>\n    <string name=\"action_dismiss\">تجاهل</string>\n    <string name=\"action_details\">تفاصيل</string>\n    <string name=\"error_loading_account_details\">فشلت عملية تحميل تفاصيل الحساب</string>\n    <string name=\"error_could_not_load_login_page\">فشل الوصول الى صفحة تسجيل الدخول.</string>\n    <string name=\"action_post_failed\">فشل التحميل</string>\n    <string name=\"action_post_failed_show_drafts\">إظهار المسودات</string>\n    <string name=\"action_post_failed_do_nothing\">تخطي</string>\n    <string name=\"pref_title_reading_order\">ترتيب القراءة</string>\n    <string name=\"pref_summary_http_proxy_disabled\">مُعطَّل</string>\n    <string name=\"pref_reading_order_oldest_first\">الأقدم أولاً</string>\n    <string name=\"pref_reading_order_newest_first\">الأحدث أولاً</string>\n    <string name=\"action_browser_login\">الولوج باستخدام متصفح</string>\n    <string name=\"title_public_trending_hashtags\">الوسوم المتداولة</string>\n    <string name=\"accessibility_talking_about_tag\">هناك %1$d أشخاص يتحدثون عن الوسم %2$s</string>\n    <string name=\"total_usage\">الاستخدام الإجمالي</string>\n    <string name=\"ui_error_unknown\">سبب مجهول</string>\n    <string name=\"socket_timeout_exception\">طال الاتصال بخادمك كثيرًا</string>\n    <string name=\"action_add\">إضافة</string>\n    <string name=\"dialog_follow_hashtag_title\">تابِع الوسم</string>\n    <string name=\"pref_ui_text_size\">حجم خط واجهة المستخدم</string>\n    <string name=\"label_image\">صورة</string>\n    <string name=\"about_account_info_title\">حسابُك</string>\n    <string name=\"post_media_image\">صورة</string>\n    <string name=\"about_copy\">نسخ معلومات الإصدار والجهاز</string>\n    <string name=\"notification_listenable_worker_name\">النشاط في الخلفية</string>\n    <string name=\"about_device_info_title\">جهازك</string>\n    <string name=\"action_refresh\">أنعِش</string>\n    <string name=\"notification_notification_worker\">جارٍ جلب الإشعارات…</string>\n    <string name=\"app_theme_system_black\">استخدم حُلّة النظام (أسوَد)</string>\n    <string name=\"notification_unknown_name\">مجهول</string>\n    <string name=\"total_accounts\">الحسابات</string>\n    <string name=\"list_exclusive_label\">أخفيه مِن الخيط الرئيسي</string>\n    <string name=\"dialog_save_profile_changes_message\">هل تريد حفط التغييرات التي طرأت على ملفك التعريفي؟</string>\n    <string name=\"dialog_delete_filter_text\">أتريد حذف عامل التصفية ”%1$s“؟</string>\n    <string name=\"dialog_delete_filter_positive_action\">حذف</string>\n    <string name=\"select_list_manage\">إدارة القوائم</string>\n    <string name=\"status_filtered_show_anyway\">أظهره على أي حال</string>\n    <string name=\"filter_description_hide\">إخفاء بالكامل</string>\n    <string name=\"ui_success_accepted_follow_request\">تم قبول طلب المتابَعة</string>\n    <string name=\"title_public_trending_statuses\">المنشورات المتداوَلة</string>\n    <string name=\"label_filter_title\">التسمية</string>\n    <string name=\"ui_success_rejected_follow_request\">تم رفض طلب المتابَعة</string>\n    <string name=\"filter_action_warn\">تحذير</string>\n    <string name=\"filter_action_hide\">إخفاء</string>\n    <string name=\"filter_description_warn\">إخفاء وراء تحذير</string>\n    <string name=\"filter_keyword_addition_title\">إضافة كلمة مفتاحية</string>\n    <string name=\"filter_edit_keyword_title\">تعديل الكلمة المفتاحية</string>\n    <string name=\"pref_title_account_filter_keywords\">الملفات التعريفية</string>\n    <string name=\"pref_title_show_stat_inline\">إظهار إحصائيات المنشورات في الخيوط الزمنية</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"error_media_upload_sending_fmt\">فَشِلَ التحميل: %1$s</string>\n    <string name=\"load_newest_notifications\">تحميل الإشعارات الجديدة</string>\n    <string name=\"compose_delete_draft\">أتريد حذف المسودّة؟</string>\n    <string name=\"about_copied\">تم نسخ معلومات الإصدار والجهاز</string>\n    <string name=\"list_reply_policy_none\">لا أحد</string>\n    <string name=\"list_reply_policy_list\">أعضاء القائمة</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-be/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_empty\">Не можа быць пустым.</string>\n    <string name=\"error_invalid_domain\">Уведзены недапушчальны дамен</string>\n    <string name=\"error_failed_app_registration\">Памылка праверкі сапраўднасці на гэтым серверы. Калі праблема застаецца, паспрабуйце ўвайсці з браўзера з меню.</string>\n    <string name=\"error_no_web_browser_found\">Браўзер не знойдзены.</string>\n    <string name=\"error_authorization_denied\">Аўтарызацыя была адхілена. Калі ўпэўнены што ўвялі сапраўдныя ўліковыя даныя, паспрабуйце ўвайсці з браўзера з меню.</string>\n    <string name=\"error_loading_account_details\">Дэталі ўліковага запісу не атрыманы</string>\n    <string name=\"error_generic\">Здарылася памылка.</string>\n    <string name=\"error_network\">Здарылася сеткавая памылка. Калі ласка, праверце злучэнне і паспрабуйце зноў.</string>\n    <string name=\"error_authorization_unknown\">Адбылася невядомая памылка праверкі сапраўднасці. Калі праблема застаецца, паспрабуйце ўвайсці з браўзера з меню.</string>\n    <string name=\"error_retrieving_oauth_token\">Токен уваходу не атрыманы. Калі праблема застаецца, паспрабуйце ўвайсці з браўзера з меню.</string>\n    <string name=\"error_compose_character_limit\">Допіс занадта доўгі!</string>\n    <string name=\"error_multimedia_size_limit\">Памер відэа- ды аўдыяфайлаў не можа перавышаць %1$s Мб.</string>\n    <string name=\"error_media_upload_type\">Немагчыма запампаваць файл гэтага тыпу.</string>\n    <string name=\"error_media_upload_opening\">Немагчыма адкрыць гэты файл.</string>\n    <string name=\"error_media_download_permission\">Патрабуецца дазвол на захаванне медыя.</string>\n    <string name=\"error_media_upload_image_or_video\">Немагчыма адначасова прымацаваць выяву ды відэа да допісу.</string>\n    <string name=\"error_media_upload_sending\">Запампоўка не атрымалася.</string>\n    <string name=\"error_unfollowing_hashtag_format\">Памылка адпіскі ад #%1$s</string>\n    <string name=\"error_following_hashtags_unsupported\">Гэты сервер не падтрымлівае падпіску на хэштэгі.</string>\n    <string name=\"error_muting_hashtag_format\">Памылка ігнаравання #%1$s</string>\n    <string name=\"error_could_not_load_login_page\">Немагчыма загрузіць старонку ўваходу.</string>\n    <string name=\"error_image_edit_failed\">Немагчыма рэдагаваць выяву.</string>\n    <string name=\"error_media_upload_permission\">Патрабуецца дазвол на чытанне медыя.</string>\n    <string name=\"error_sender_account_gone\">Памылка дасылання допісу.</string>\n    <string name=\"error_following_hashtag_format\">Памылка падпіскі на #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Памылка адмены ігнаравання #%1$s</string>\n    <string name=\"error_status_source_load\">Не атрымалася загрузіць крыніцу статусу з сервера.</string>\n    <string name=\"title_login\">Уваход</string>\n    <string name=\"title_home\">Галоўная</string>\n    <string name=\"title_notifications\">Апавяшчэнні</string>\n    <string name=\"title_public_local\">Лакальная</string>\n    <string name=\"title_public_federated\">Глабальная</string>\n    <string name=\"title_direct_messages\">Асабістыя паведамленні</string>\n    <string name=\"title_tab_preferences\">Укладкі</string>\n    <string name=\"title_view_thread\">Ланцуг</string>\n    <string name=\"title_posts\">Допісы</string>\n    <string name=\"title_posts_with_replies\">З адказамі</string>\n    <string name=\"title_follows\">Падпіскі</string>\n    <string name=\"title_followers\">Падпісчыкі</string>\n    <string name=\"title_favourites\">Абраныя</string>\n    <string name=\"title_bookmarks\">Закладкі</string>\n    <string name=\"title_domain_mutes\">Схаваныя дамены</string>\n    <string name=\"title_follow_requests\">Запыты на падпіску</string>\n    <string name=\"title_edit_profile\">Рэдагаваць профіль</string>\n    <string name=\"title_drafts\">Чарнавікі</string>\n    <string name=\"title_scheduled_posts\">Запланаваныя допісы</string>\n    <string name=\"title_posts_pinned\">Замацаваныя</string>\n    <string name=\"title_mutes\">Ігнаруемыя карыстальнікі</string>\n    <string name=\"title_blocks\">Заблакаваныя карыстальнікі</string>\n    <string name=\"title_announcements\">Аб\\'явы</string>\n    <string name=\"title_licenses\">Ліцэнзіі</string>\n    <string name=\"title_followed_hashtags\">Падпіскі на хэштэгі</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s пашырыў(-ла)</string>\n    <string name=\"post_sensitive_media_title\">Далікатнае змесціва</string>\n    <string name=\"post_media_hidden_title\">Медыя схаванае</string>\n    <string name=\"post_content_show_more\">Разгарнуць</string>\n    <string name=\"report_comment_hint\">Дадатковыя каментарыі?</string>\n    <string name=\"post_sensitive_media_directions\">Націсніце для прагляду</string>\n    <string name=\"post_content_warning_show_more\">Паказаць больш</string>\n    <string name=\"post_content_warning_show_less\">Паказаць менш</string>\n    <string name=\"post_content_show_less\">Згарнуць</string>\n    <string name=\"post_edited\">Рэдагаваны %1$s</string>\n    <string name=\"message_empty\">Тут нічога няма.</string>\n    <string name=\"footer_empty\">Тут нічога няма. Пацягніце ўніз, каб абнавіць!</string>\n    <string name=\"notification_reblog_format\">%1$s пашырыў(-ла) ваш допіс</string>\n    <string name=\"notification_favourite_format\">%1$s падабаўся ваш допіс</string>\n    <string name=\"notification_follow_format\">%1$s падпісаўся(-лася) на вас</string>\n    <string name=\"notification_follow_request_format\">%1$s запытаў(-ла) падпіску на вас</string>\n    <string name=\"notification_sign_up_format\">%1$s зарэгістраваўся(-лася)</string>\n    <string name=\"notification_subscription_format\">Новы допіс ад %1$s</string>\n    <string name=\"notification_update_format\">%1$s адрэдагаваў(-ла) свой допіс</string>\n    <string name=\"notification_report_format\">Новая скарга на %1$s</string>\n    <string name=\"notification_header_report_format\">%1$s скардзіцца на %2$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d допісаў дададзена</string>\n    <string name=\"report_username_format\">Паскардзіцца на @%1$s</string>\n    <string name=\"action_quick_reply\">Хуткі адказ</string>\n    <string name=\"action_reply\">Адказаць</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"action_reblog\">Пашырыць</string>\n    <string name=\"action_unreblog\">Скасаваць пашырэнне</string>\n    <string name=\"action_favourite\">Упадабаць</string>\n    <string name=\"action_unfavourite\">Выдаліць з абраных</string>\n    <string name=\"action_bookmark\">Дадаць у закладкі</string>\n    <string name=\"action_delete\">Выдаліць</string>\n    <string name=\"action_search\">Пошук</string>\n    <string name=\"action_content_warning\">Папярэджанне пра змесціва</string>\n    <string name=\"action_emoji_keyboard\">Клавіятура эмодзі</string>\n    <string name=\"action_access_drafts\">Чарнавікі</string>\n    <string name=\"action_access_scheduled_posts\">Запланаваныя допісы</string>\n    <string name=\"action_toggle_visibility\">Бачнасць допісаў</string>\n    <string name=\"action_hashtags\">Хэштэгі</string>\n    <string name=\"action_open_reblogger\">Адкрыць аўтара пашырэння</string>\n    <string name=\"action_open_reblogged_by\">Паказаць пашырэнні</string>\n    <string name=\"action_open_faved_by\">Паказаць абраныя</string>\n    <string name=\"title_hashtags_dialog\">Хэштэгі</string>\n    <string name=\"title_mentions_dialog\">Згадкі</string>\n    <string name=\"action_dismiss\">Адхіліць</string>\n    <string name=\"action_details\">Дэталі</string>\n    <string name=\"title_links_dialog\">Спасылкі</string>\n    <string name=\"action_open_media_n\">Адкрыць медыя #%1$d</string>\n    <string name=\"action_add_reaction\">дадаць рэакцыю</string>\n    <string name=\"download_image\">Спампоўка %1$s</string>\n    <string name=\"action_share_as\">Абагуліць як…</string>\n    <string name=\"download_media\">Спампаваць медыя</string>\n    <string name=\"downloading_media\">Медыя пампуецца</string>\n    <string name=\"send_post_content_to\">Падзяліцца допісам з…</string>\n    <string name=\"send_media_to\">Падзяліцца медыя з…</string>\n    <string name=\"send_post_link_to\">Падзяліцца URL допісу з…</string>\n    <string name=\"confirmation_reported\">Даслана!</string>\n    <string name=\"confirmation_unblocked\">Карыстальнік разблакаваны</string>\n    <string name=\"hint_domain\">Які сервер?</string>\n    <string name=\"hint_compose\">Што адбываецца?</string>\n    <string name=\"hint_content_warning\">Папярэджанне пра змесціва</string>\n    <string name=\"hint_display_name\">Бачнае імя</string>\n    <string name=\"dialog_title_finishing_media_upload\">Заканчваецца запампоўка медыя</string>\n    <string name=\"visibility_public\">Публічны: Дасылаць у публічныя стужкі</string>\n    <string name=\"visibility_unlisted\">Не ў стужках: Не паказваць у публічных стужках</string>\n    <string name=\"visibility_private\">Толькі падпісчыкі: Дасылаць толькі да падпісчыкаў</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Апавяшчаць з вібрацыяй</string>\n    <string name=\"pref_title_notification_alert_light\">Апавяшчаць святлом</string>\n    <string name=\"pref_title_notification_filters\">Апавяшчаць калі</string>\n    <string name=\"pref_title_timeline_filters\">Фільтры</string>\n    <string name=\"app_them_dark\">Цёмная</string>\n    <string name=\"app_theme_light\">Светлая</string>\n    <string name=\"app_theme_black\">Чорная</string>\n    <string name=\"app_theme_auto\">Аўтаматычна па захадзе сонца</string>\n    <string name=\"app_theme_system\">Выкарыстоўваць сістэмную тэму</string>\n    <string name=\"pref_title_browser_settings\">Браўзер</string>\n    <string name=\"pref_title_custom_tabs\">Выкарыстоўваць укладкі браўзера Chrome</string>\n    <string name=\"pref_title_animate_gif_avatars\">Анімаваць GIF-аватаркі</string>\n    <string name=\"pref_title_language\">Мова</string>\n    <string name=\"pref_title_bot_overlay\">Паказваць індыкатар для ботаў</string>\n    <string name=\"pref_title_gradient_for_media\">Паказваць каляровыя градыенты замест скрытых медыя</string>\n    <string name=\"pref_title_animate_custom_emojis\">Анімаваць уласныя эмодзі</string>\n    <string name=\"pref_title_post_filter\">Фільтраванне стужкі</string>\n    <string name=\"pref_title_post_tabs\">Укладкі</string>\n    <string name=\"pref_title_show_replies\">Паказваць адказы</string>\n    <string name=\"pref_title_show_media_preview\">Спампаваць медыя для наступнага прагляду</string>\n    <string name=\"pref_title_proxy_settings\">Проксі</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP проксі</string>\n    <string name=\"pref_title_http_proxy_enable\">Уключыць HTTP проксі</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP проксі сервер</string>\n    <string name=\"pref_publishing\">Публікацыя (сінхранізавана з серверам)</string>\n    <string name=\"pref_failed_to_sync\">Не атрымалася сінхранізаваць налады</string>\n    <string name=\"pref_main_nav_position\">Месца для галоўнай навігацыі</string>\n    <string name=\"pref_main_nav_position_option_top\">Зверху</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Знізу</string>\n    <string name=\"post_privacy_public\">Публічныя</string>\n    <string name=\"post_privacy_unlisted\">Схаваныя</string>\n    <string name=\"post_privacy_followers_only\">Толькі для падпісчыкаў</string>\n    <string name=\"post_text_size_small\">Маленькі</string>\n    <string name=\"pref_show_self_username_disambiguate\">Калі вы ўвайшлі ў некалькі ўліковых запісаў</string>\n    <string name=\"pref_show_self_username_never\">Ніколі</string>\n    <string name=\"post_text_size_medium\">Сярэдні</string>\n    <string name=\"post_text_size_large\">Вялікі</string>\n    <string name=\"post_text_size_largest\">Найбольшы</string>\n    <string name=\"pref_show_self_username_always\">Заўсёды</string>\n    <string name=\"notification_follow_request_name\">Запыты на падпіску</string>\n    <string name=\"notification_follow_request_description\">Апавяшчаць аб запытах на падпіску</string>\n    <string name=\"notification_boost_name\">Пашырэнні</string>\n    <string name=\"notification_boost_description\">Апавяшчаць аб пашырэнні Вашых допісаў</string>\n    <string name=\"notification_favourite_name\">Упадабаныя</string>\n    <string name=\"notification_report_name\">Скаргі</string>\n    <string name=\"notification_report_description\">Апавяшчаць аб мадэрацыйных скаргах</string>\n    <string name=\"notification_sign_up_name\">Рэгістрацыі</string>\n    <string name=\"notification_sign_up_description\">Апавяшчаць аб новых карыстальніках</string>\n    <string name=\"notification_update_name\">Рэдагаванні допісу</string>\n    <string name=\"notification_update_description\">Апавяшчаць, калі допісы, з якімі Вы ўзаемадзейнічалі, рэдагаваны</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d новае ўзаемадзеянне</item>\n        <item quantity=\"few\">%1$d новых узаемадзеянняў</item>\n        <item quantity=\"many\">%1$d новых узаемадзеянняў</item>\n        <item quantity=\"other\">%1$d новых узаемадзеянняў</item>\n    </plurals>\n    <string name=\"description_account_locked\">Заблакаваны ўліковы запіс</string>\n    <string name=\"dialog_whats_an_instance\">Сюды можна ўвесці адрас або дамен любога сервера, напрыклад mastodon.social, icosahedron.website, social.tchncs.de ды <a href=\"https://instances.social\">больш!</a> \\u0020\n\\n \\u0020\n\\nКалі ў вас яшчэ няма ўліковага запісу, вы можаце ўвесці назву сервера, да якога вы жадаеце далучыцца, і стварыць там уліковы запіс. \\u0020\n\\n \\u0020\n\\nСервер — гэта месца, дзе размяшчаецца ваш уліковы запіс, але вы можаце лёгка размаўляць з людзьмі і падпісвацца на іх на іншых серверах, нібыта вы знаходзіцеся на тым жа сайце. \\u0020\n\\n \\u0020\n\\nПадрабязней на <a href=\"https://joinmastodon.org\">joinmastodon.org</a>. </string>\n    <string name=\"action_unbookmark\">Выдаліць з закладак</string>\n    <string name=\"action_more\">Разгарнуць</string>\n    <string name=\"action_compose\">Напісаць</string>\n    <string name=\"action_login\">Увайсці з Tusky</string>\n    <string name=\"action_logout\">Выхад</string>\n    <string name=\"action_logout_confirm\">Вы ўпэўнены, што жадаеце выйсці з уліковага запісу %1$s? У выніку будуць выдалены ўсе лакальныя даныя уліковага запісу разам з чарнавікамі і наладамі.</string>\n    <string name=\"action_follow\">Падпісацца</string>\n    <string name=\"action_unfollow\">Адпісацца</string>\n    <string name=\"action_block\">Заблакаваць</string>\n    <string name=\"action_unblock\">Разблакаваць</string>\n    <string name=\"action_hide_reblogs\">Схаваць пашырэнні</string>\n    <string name=\"action_show_reblogs\">Паказаць пашырэнні</string>\n    <string name=\"action_report\">Паскардзіцца</string>\n    <string name=\"action_edit\">Рэдагаваць</string>\n    <string name=\"action_delete_conversation\">Выдаліць размову</string>\n    <string name=\"action_delete_and_redraft\">Выдаліць і перастварыць</string>\n    <string name=\"action_send\">ПАШЫРЫЦЬ</string>\n    <string name=\"action_send_public\">ПАШЫРЫЦЬ!</string>\n    <string name=\"action_retry\">Паўтарыць</string>\n    <string name=\"action_close\">Закрыць</string>\n    <string name=\"action_view_profile\">Профіль</string>\n    <string name=\"action_view_preferences\">Налады</string>\n    <string name=\"action_view_account_preferences\">Налады ўліковага запісу</string>\n    <string name=\"action_view_favourites\">Абраныя</string>\n    <string name=\"action_view_bookmarks\">Закладкі</string>\n    <string name=\"action_view_mutes\">Ігнаруемыя карыстальнікі</string>\n    <string name=\"action_view_blocks\">Заблакаваныя карыстальнікі</string>\n    <string name=\"action_view_domain_mutes\">Схаваныя дамены</string>\n    <string name=\"action_view_follow_requests\">Запыты на падпіску</string>\n    <string name=\"action_view_media\">Медыя</string>\n    <string name=\"action_open_in_web\">Адкрыць у браўзеры</string>\n    <string name=\"action_add_media\">Дадаць медыя</string>\n    <string name=\"action_add_poll\">Дадаць апытанне</string>\n    <string name=\"action_photo_take\">Зрабіць здымак</string>\n    <string name=\"action_share\">Абагуліць</string>\n    <string name=\"action_mute\">Ігнараваць</string>\n    <string name=\"action_unmute\">Скасаваць ігнараванне</string>\n    <string name=\"action_unmute_desc\">Скасаваць ігнараванне %1$s</string>\n    <string name=\"action_mute_domain\">Ігнараваць %1$s</string>\n    <string name=\"action_unmute_domain\">Адмяніць ігнараванне %1$s</string>\n    <string name=\"action_mute_conversation\">Ігнараваць размову</string>\n    <string name=\"action_unmute_conversation\">Паказаць размову</string>\n    <string name=\"action_mention\">Згадаць</string>\n    <string name=\"action_hide_media\">Схаваць медыя</string>\n    <string name=\"action_open_drawer\">Адкрыць меню</string>\n    <string name=\"action_save\">Захаваць</string>\n    <string name=\"action_edit_profile\">Рэдагаваць профіль</string>\n    <string name=\"action_edit_own_profile\">Рэдагаваць</string>\n    <string name=\"action_undo\">Скасаваць</string>\n    <string name=\"action_accept\">Прыняць</string>\n    <string name=\"action_reject\">Адхіліць</string>\n    <string name=\"action_schedule_post\">Запланаваць допіс</string>\n    <string name=\"action_reset_schedule\">Скінуць</string>\n    <string name=\"action_add_tab\">Дадаць укладку</string>\n    <string name=\"action_links\">Спасылкі</string>\n    <string name=\"action_mentions\">Згадкі</string>\n    <string name=\"action_copy_link\">Капіяваць спасылку</string>\n    <string name=\"action_open_as\">Адкрыць як %1$s</string>\n    <string name=\"confirmation_unmuted\">Прыхоўванне карыстальніка скасавана</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s адкрыты</string>\n    <string name=\"confirmation_hashtag_unfollowed\">адпісаны(-ая) ад #%1$s</string>\n    <string name=\"hint_note\">Пра сябе</string>\n    <string name=\"hint_search\">Пошук…</string>\n    <string name=\"hint_media_description_missing\">Медыя павінна мець апісанне.</string>\n    <string name=\"search_no_results\">Няма рэзультатаў</string>\n    <string name=\"label_quick_reply\">Адказаць…</string>\n    <string name=\"label_avatar\">Аватар</string>\n    <string name=\"label_header\">Загаловак</string>\n    <string name=\"link_whats_an_instance\">Што такое сервер?</string>\n    <string name=\"login_connection\">Злучэнне…</string>\n    <string name=\"dialog_message_uploading_media\">Запампоўваецца…</string>\n    <string name=\"dialog_download_image\">Спампаваць</string>\n    <string name=\"dialog_message_cancel_follow_request\">Адклікаць запыт на падпіску?</string>\n    <string name=\"dialog_unfollow_warning\">Адпісацца ад гэтага ўліковага запісу?</string>\n    <string name=\"dialog_delete_post_warning\">Выдаліць гэты допіс?</string>\n    <string name=\"dialog_redraft_post_warning\">Выдаліць і перапісаць гэты допіс?</string>\n    <string name=\"dialog_delete_conversation_warning\">Выдаліць гэтую размову?</string>\n    <string name=\"mute_domain_warning\">Вы ўпэўнены, што жадаеце заблакаваць усё з %1$s? Вы не пабачыце допісы з гэтага дамена ва ўсіх агульнадаступных стужках або ў сваіх апавяшчэннях. Вашыя падпісчыкі з гэтага дамену будуць выдаленыя.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Схаваць дамен цалкам</string>\n    <string name=\"dialog_block_warning\">Заблакаваць @%1$s?</string>\n    <string name=\"dialog_mute_warning\">Ігнараваць %1$s?</string>\n    <string name=\"dialog_mute_hide_notifications\">Схаваць апавяшчэнні</string>\n    <string name=\"visibility_direct\">Асабіста: Дасылаць толькі для згаданых карыстальнікаў</string>\n    <string name=\"pref_title_edit_notification_settings\">Апавяшчэнні</string>\n    <string name=\"pref_title_notifications_enabled\">Апавяшчэнні</string>\n    <string name=\"pref_title_notification_alerts\">Апавяшчэнні</string>\n    <string name=\"pref_title_notification_alert_sound\">Апавяшчаць з гукам</string>\n    <string name=\"pref_title_appearance_settings\">Выгляд</string>\n    <string name=\"pref_title_app_theme\">Тэма</string>\n    <string name=\"pref_title_timelines\">Стужкі</string>\n    <string name=\"pref_title_show_boosts\">Паказаць пашырэнні</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP проксі порт</string>\n    <string name=\"pref_title_http_proxy_port_message\">Порт павінен быць паміж %1$d і %2$d</string>\n    <string name=\"pref_default_post_privacy\">Прыватнасць допісаў па змаўчанні</string>\n    <string name=\"pref_default_post_language\">Мова допісаў па змаўчанні</string>\n    <string name=\"pref_default_media_sensitivity\">Лічыць усе медыя далікатнымі</string>\n    <string name=\"pref_post_text_size\">Памер шрыфту допісу</string>\n    <string name=\"post_text_size_smallest\">Найменшы</string>\n    <string name=\"notification_mention_name\">Новыя згадкі</string>\n    <string name=\"notification_mention_descriptions\">Апавяшчаць аб новых згадках</string>\n    <string name=\"notification_follow_name\">Новыя падпісчыкі</string>\n    <string name=\"notification_follow_description\">Апавяшчаць аб новых падпісчыках</string>\n    <string name=\"notification_favourite_description\">Паведамляць, калі вашыя допісы ўпадабаюць</string>\n    <string name=\"notification_poll_name\">Апытанні</string>\n    <string name=\"notification_poll_description\">Апавяшчаць аб заканчэнні апытанняў</string>\n    <string name=\"notification_subscription_name\">Новыя допісы</string>\n    <string name=\"notification_subscription_description\">Апавяшчаць аб новых допісах карыстальнікаў, на якіх Вы падпісаны</string>\n    <string name=\"notification_mention_format\">%1$s узгадаў(-ла) Вас</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s ды %3$s</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s ды %4$d іншых</string>\n    <string name=\"notification_summary_small\">%1$s ды %2$s</string>\n    <string name=\"about_title_activity\">Пра праграму</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_powered_by_tusky\">Зроблена Tusky</string>\n    <string name=\"about_project_site\">Вэбсайт праекту:\n\\n https://tusky.app</string>\n    <string name=\"about_tusky_account\">Профіль Tusky</string>\n    <string name=\"post_share_content\">Падзяліцца зместам допісу</string>\n    <string name=\"post_share_link\">Падзяліцца спасылкай на допіс</string>\n    <string name=\"post_media_images\">Выявы</string>\n    <string name=\"post_media_video\">Відэа</string>\n    <string name=\"post_media_audio\">Аўдыё</string>\n    <string name=\"post_media_attachments\">Далучэнні</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"status_created_at_now\">зараз</string>\n    <string name=\"state_follow_requested\">Запыт на падпіску</string>\n    <string name=\"abbreviated_in_years\">праз %1$dг</string>\n    <string name=\"abbreviated_in_days\">праз %1$dд</string>\n    <string name=\"abbreviated_in_hours\">праз %1$dгад</string>\n    <string name=\"abbreviated_in_minutes\">праз %1$dхв</string>\n    <string name=\"abbreviated_in_seconds\">праз %1$dс</string>\n    <string name=\"abbreviated_years_ago\">%1$dг</string>\n    <string name=\"abbreviated_days_ago\">%1$dд</string>\n    <string name=\"abbreviated_hours_ago\">%1$dгад</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dхв</string>\n    <string name=\"abbreviated_seconds_ago\">%1$dс</string>\n    <string name=\"title_media\">Медыя</string>\n    <string name=\"pref_title_alway_open_spoiler\">Заўсёды разгортваць допіс з далікатным зместам</string>\n    <string name=\"replying_to\">Адказ для @%1$s</string>\n    <string name=\"pref_title_public_filter_keywords\">Публічныя стужкі</string>\n    <string name=\"pref_title_thread_filter_keywords\">Размовы</string>\n    <string name=\"load_more_placeholder_text\">загрузіць больш</string>\n    <string name=\"about_tusky_license\">Tusky — свабодная праграма з адкрытым зыходным кодам. Зроблена пад GNU General Public License Version 3. Вы можаце паглядзець ліцэнзію тут: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <string name=\"about_bug_feature_request_site\">Справаздачы аб памылках і пажаданні:\n\\n https://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"filter_addition_title\">Дадаць фільтр</string>\n    <string name=\"follows_you\">Вашы падпісчыкі</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Заўсёды паказваць далікатны змест</string>\n    <string name=\"filter_edit_title\">Рэдагаваць фільтр</string>\n    <string name=\"filter_dialog_remove_button\">Выдаліць</string>\n    <string name=\"filter_dialog_update_button\">Абнавіць</string>\n    <string name=\"filter_dialog_whole_word\">Цэлае слова</string>\n    <string name=\"filter_dialog_whole_word_description\">Калі ключавое слова ці фраза складаецца толькі з літар і лічбаў, то будзе ўлічвацца толькі ўсё слова</string>\n    <string name=\"title_edits\">Рэдагаванні</string>\n    <string name=\"failed_to_add_to_list\">Не атрымалася дадаць уліковы запіс у спіс</string>\n    <string name=\"action_add_or_remove_from_list\">Дадаць ці выдаліць са спіса</string>\n    <string name=\"license_apache_2\">Выкарыстоўваецца ліцэнзія Apache License (копія знізу)</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"action_add_to_list\">Дадаць уліковы запіс у спіс</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Апісанне змесціва для людзей з дэфектам зроку (ліміт у %1$d сімвал)</item>\n        <item quantity=\"few\">Апісанне змесціва для людзей з дэфектам зроку (ліміт у %1$d сімвалы)</item>\n        <item quantity=\"many\">Апісанне змесціва для людзей з дэфектам зроку (ліміт у %1$d сімвалаў)</item>\n        <item quantity=\"other\">Апісанне змесціва для людзей з дэфектам зроку (ліміт у %1$d сімвалаў)</item>\n    </plurals>\n    <string name=\"compose_save_draft_loses_media\">Захаваць чарнавік? (Далучэнні будуць запампаваныя зноў, калі Вы аднавіце чарнавік.)</string>\n    <string name=\"performing_lookup_title\">Выконваю пошук…</string>\n    <string name=\"caption_notoemoji\">Бягучы набор эмодзі ад Google</string>\n    <string name=\"caption_twemoji\">Тыповы набор эмодзі Mastodon</string>\n    <string name=\"download_failed\">Не атрымалася спампаваць</string>\n    <string name=\"unreblog_private\">Скасаваць пашырэнне</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"pin_action\">Замацаваць</string>\n    <string name=\"unpin_action\">Адмацаваць</string>\n    <string name=\"failed_to_pin\">Не атрымалася замацаваць</string>\n    <string name=\"failed_to_unpin\">Не атрымалася адмацаваць</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s і яшчэ %3$d</string>\n    <string name=\"action_discard\">Скасаваць змены</string>\n    <string name=\"action_continue_edit\">Працягнуць рэдагаванне</string>\n    <string name=\"hint_search_people_list\">Пошук сярод вашых падпісак</string>\n    <string name=\"add_account_name\">Дадаць уліковы запіс</string>\n    <string name=\"action_remove_from_list\">Выдаліць уліковы запіс са спіса</string>\n    <string name=\"compose_active_account_description\">Публікаваць як %1$s</string>\n    <string name=\"set_focus_description\">Націсніце або перацягніце кола каб абраць пункт фокусу, які будзе заўсёды бачны на паменшаных выявах.</string>\n    <string name=\"action_set_caption\">Задаць подпіс</string>\n    <string name=\"action_set_focus\">Задаць пункт фокуса</string>\n    <string name=\"action_edit_image\">Рэдагаваць выяву</string>\n    <string name=\"failed_to_remove_from_list\">Не атрымалася выдаліць уліковы запіс са спіса</string>\n    <string name=\"send_post_notification_channel_name\">Дасыланне допісаў</string>\n    <string name=\"later\">Пазней</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> абраны</item>\n        <item quantity=\"few\"><b>%1$s</b> абраныя</item>\n        <item quantity=\"many\"><b>%1$s</b> абраных</item>\n        <item quantity=\"other\"><b>%1$s</b> абраных</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">Пашырылі</string>\n    <string name=\"profile_metadata_label\">Метазвесткі профілю</string>\n    <string name=\"title_favourited_by\">Упадабалі</string>\n    <string name=\"add_account_description\">Дадаць уліковы запіс Mastodon</string>\n    <string name=\"action_lists\">Спісы</string>\n    <string name=\"title_lists\">Спісы</string>\n    <string name=\"error_create_list\">Не атрымалася стварыць спіс</string>\n    <string name=\"error_rename_list\">Не атрымалася перайменаваць спіс</string>\n    <string name=\"error_delete_list\">Не атрымалася выдаліць спіс</string>\n    <string name=\"action_create_list\">Стварыць спіс</string>\n    <string name=\"action_rename_list\">Перайменаваць спіс</string>\n    <string name=\"action_delete_list\">Выдаліць спіс</string>\n    <string name=\"filter_add_description\">Фільтраваць фразу</string>\n    <string name=\"action_remove\">Выдаліць</string>\n    <string name=\"lock_account_label\">Заблакаваць уліковы запіс</string>\n    <string name=\"compose_save_draft\">Захаваць чарнавік?</string>\n    <string name=\"send_post_notification_title\">Дасыланне допісу…</string>\n    <string name=\"send_post_notification_error_title\">Памылка пры дасыланні допісу</string>\n    <string name=\"lock_account_label_description\">Вам прыйдзецца ўручную зацвярджаць падпісчыкаў</string>\n    <string name=\"action_compose_shortcut\">Напісаць</string>\n    <string name=\"send_post_notification_cancel_title\">Дасыланне скасаванае</string>\n    <string name=\"send_post_notification_saved_content\">Копія допісу захавана ў Вашых чарнавіках</string>\n    <string name=\"error_no_custom_emojis\">Ваш сервер %1$s не мае ўласных эмодзі</string>\n    <string name=\"emoji_style\">Стыль эмодзі</string>\n    <string name=\"system_default\">Сістэмнае значэнне па змаўчанні</string>\n    <string name=\"caption_systememoji\">Тыповы набор эмодзі прылады</string>\n    <string name=\"caption_blobmoji\">Эмодзі Blob з Android 4.4–7.1</string>\n    <string name=\"download_fonts\">Спачатку трэба спампаваць гэтыя наборы эмодзі</string>\n    <string name=\"profile_metadata_add\">дадаць звесткі</string>\n    <string name=\"profile_metadata_label_label\">Пазнака</string>\n    <string name=\"profile_metadata_content_label\">Змест</string>\n    <string name=\"pref_title_absolute_time\">Паказваць абсалютны час</string>\n    <string name=\"label_remote_account\">Інфармацыя ніжэй можа не паказваць поўны профіль карыстальніка. Націсніце, каб адкрыць поўны профіль у браўзеры.</string>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> пашыраны</item>\n        <item quantity=\"few\"><b>%1$s</b> пашырана</item>\n        <item quantity=\"many\"><b>%1$s</b> пашыраных</item>\n        <item quantity=\"other\"><b>%1$s</b> пашыраных</item>\n    </plurals>\n    <string name=\"compose_unsaved_changes\">У Вас засталіся незахаваныя змены.</string>\n    <string name=\"expand_collapse_all_posts\">Разгарнуць/згарнуць допісы</string>\n    <string name=\"action_open_post\">Адкрыць допіс</string>\n    <string name=\"restart_required\">Патрэбна перазапусціць праграму</string>\n    <string name=\"restart_emoji\">Патрэбна перазапусціць Tusky, каб прымяніць гэтыя змены</string>\n    <string name=\"profile_badge_bot_text\">Бот</string>\n    <string name=\"account_moved_description\">%1$s пераехаў(-ла) да:</string>\n    <string name=\"restart\">Перазапусціць</string>\n    <string name=\"reblog_private\">Пашырыць для пачатковай аўдыторыі</string>\n    <string name=\"license_description\">Tusky змяшчае код і рэсурсы з наступных праграм з адкрытым зыходным кодам:</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s і %2$s</string>\n    <string name=\"description_post_media\">Медыя: %1$s</string>\n    <string name=\"description_post_cw\">Папярэджанне пра змесціва: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Няма апісання</string>\n    <string name=\"description_visibility_private\">Падпісчыкі</string>\n    <string name=\"description_visibility_direct\">Асабіста</string>\n    <string name=\"description_visibility_unlisted\">Не ў стужках</string>\n    <string name=\"hashtags\">Хэштэгі</string>\n    <string name=\"hint_list_name\">Назва спіса</string>\n    <string name=\"add_hashtag_title\">Дадаць хэштэг</string>\n    <string name=\"description_post_reblogged\">Пашырана</string>\n    <string name=\"description_poll\">Апытанне з варыянтамі: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"pick_hashtag_hint\">Хэштэг без #</string>\n    <string name=\"description_post_edited\">Зменена</string>\n    <string name=\"description_post_bookmarked\">Дададзена ў закладкі</string>\n    <string name=\"description_post_favourited\">Упадабана</string>\n    <string name=\"description_visibility_public\">Публічны</string>\n    <string name=\"description_post_language\">Мова допісу</string>\n    <string name=\"select_list_title\">Выбраць спіс</string>\n    <string name=\"list\">Спіс</string>\n    <string name=\"notifications_clear\">Ачысціць</string>\n    <string name=\"notifications_apply_filter\">Фільтр</string>\n    <string name=\"duration_365_days\">365 дзён</string>\n    <string name=\"duration_no_change\">(Без змен)</string>\n    <string name=\"compose_shortcut_long_label\">Стварыць допіс</string>\n    <string name=\"compose_shortcut_short_label\">Стварыць</string>\n    <string name=\"notification_clear_text\">Вы ўпэўнены, што жадаеце выдаліць усе апавяшчэнні?</string>\n    <string name=\"compose_preview_image_description\">Дзеянні для выявы %1$s</string>\n    <string name=\"button_done\">Гатова</string>\n    <string name=\"report_sent_success\">Скарга на @%1$s адпраўлена</string>\n    <string name=\"hint_additional_info\">Дадатковыя каментары</string>\n    <string name=\"title_accounts\">Уліковыя запісы</string>\n    <string name=\"failed_search\">Пошук не атрымаўся</string>\n    <string name=\"create_poll_title\">Апытанне</string>\n    <string name=\"duration_1_day\">1 дзень</string>\n    <string name=\"duration_3_days\">3 дні</string>\n    <string name=\"button_continue\">Працягнуць</string>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">Засталася %1$d хвіліна</item>\n        <item quantity=\"few\">Засталося %1$d хвіліны</item>\n        <item quantity=\"many\">Засталося %1$d хвілін</item>\n        <item quantity=\"other\">Засталося %1$d хвілін</item>\n    </plurals>\n    <string name=\"report_remote_instance\">Пераслаць да %1$s</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Уключыць пераключэнне паміж укладкамі жэстам чыркання</string>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">Засталася %1$d секунда</item>\n        <item quantity=\"few\">Засталося %1$d секунды</item>\n        <item quantity=\"many\">Засталося %1$d секунд</item>\n        <item quantity=\"other\">Засталося %1$d секунд</item>\n    </plurals>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s голас</item>\n        <item quantity=\"few\">%1$s галасы</item>\n        <item quantity=\"many\">%1$s галасоў</item>\n        <item quantity=\"other\">%1$s галасоў</item>\n    </plurals>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s чалавек</item>\n        <item quantity=\"few\">%1$s чалавекі</item>\n        <item quantity=\"many\">%1$s людзей</item>\n        <item quantity=\"other\">%1$s людзей</item>\n    </plurals>\n    <string name=\"label_duration\">Працягласць</string>\n    <string name=\"button_back\">Назад</string>\n    <string name=\"failed_report\">Не атрымалася адправіць скаргу</string>\n    <string name=\"failed_fetch_posts\">Не атрымалася дастаць допісы</string>\n    <string name=\"report_description_1\">Скарга будзе даслана да мадэратара Вашага сервера. Ніжэй можна дадаць тлумачэнне, чаму Вы скардзіцеся на гэты ўліковы запіс:</string>\n    <string name=\"report_description_remote_instance\">Гэты ўліковы запіс з іншага сервера. Даслаць ананімную копію скаргі туды таксама?</string>\n    <string name=\"duration_indefinite\">Бясконца</string>\n    <string name=\"duration_5_min\">5 хвілін</string>\n    <string name=\"duration_30_min\">30 хвілін</string>\n    <string name=\"action_share_account_link\">Падзяліцца спасылкай на ўліковы запіс</string>\n    <string name=\"action_share_account_username\">Падзяліцца імем уліковага запісу карыстальніка</string>\n    <string name=\"send_account_link_to\">Падзяліцца URL уліковага запісу праз…</string>\n    <string name=\"send_account_username_to\">Падзяліцца імем карыстальніка ўліковага запісу праз…</string>\n    <string name=\"account_username_copied\">Імя карыстальніка скапіявана</string>\n    <string name=\"filter_apply\">Прымяніць</string>\n    <string name=\"poll_info_format\"> <!-- 15 галасоў • 1 гадзіна засталася --> %1$s • %2$s</string>\n    <string name=\"poll_info_time_absolute\">завяршыцца ў %1$s</string>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">Засталася %1$d гадзіна</item>\n        <item quantity=\"few\">Засталося %1$d гадзіны</item>\n        <item quantity=\"many\">Засталося %1$d гадзін</item>\n        <item quantity=\"other\">Засталося %1$d гадзін</item>\n    </plurals>\n    <string name=\"duration_1_hour\">1 гадзіну</string>\n    <string name=\"poll_info_closed\">скончаны</string>\n    <string name=\"poll_ended_voted\">Апытанне, у якім Вы ўдзельнічалі, скончана</string>\n    <string name=\"poll_ended_created\">Створанае Вамі апытанне скончана</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">Застаўся %1$d дзень</item>\n        <item quantity=\"few\">Засталося %1$d дні</item>\n        <item quantity=\"many\">Засталося %1$d дзён</item>\n        <item quantity=\"other\">Засталося %1$d дзён</item>\n    </plurals>\n    <string name=\"duration_6_hours\">6 гадзін</string>\n    <string name=\"duration_7_days\">7 дзён</string>\n    <string name=\"duration_14_days\">14 дзён</string>\n    <string name=\"duration_30_days\">30 дзён</string>\n    <string name=\"duration_60_days\">60 дзён</string>\n    <string name=\"duration_90_days\">90 дзён</string>\n    <string name=\"duration_180_days\">180 дзён</string>\n    <string name=\"poll_vote\">Галасаваць</string>\n    <string name=\"a11y_label_loading_thread\">Спампоўваю стужку</string>\n    <string name=\"wellbeing_mode_notice\">Некаторая інфармацыя, якая можа ўплываць на Ваш псіхічны стан, будзе скрыта. Гэта ўключае:\n\\n\n\\n- Апавяшчэнні аб Упадабаннях/Пашырэннях/Падпісках\n\\n- Колькасць Упадабанняў/Пашырэнняў у допісах\n\\n- Статыстыка ў профілях пра Падпісчыкаў/Допісы\n\\n\n\\nНа Push-паведамленні гэта не ўплывае, але Вы можаце праглядзець налады апавяшчэнняў уручную.</string>\n    <string name=\"poll_allow_multiple_choices\">Некалькі варыянтаў</string>\n    <string name=\"add_poll_choice\">Дадаць варыянт</string>\n    <string name=\"edit_poll\">Змяніць</string>\n    <string name=\"post_lookup_error_format\">Памылка пошуку допісу %1$s</string>\n    <string name=\"account_date_joined\">Далучыўся(-лася) %1$s</string>\n    <string name=\"account_note_saved\">Захавана!</string>\n    <string name=\"status_edit_info\">%1$s адрэдагаваў(-ла)</string>\n    <string name=\"status_created_info\">%1$s стварыў(-ла)</string>\n    <string name=\"pref_title_hide_top_toolbar\">Схаваць загаловак верхняй панэлі інструментаў</string>\n    <string name=\"account_note_hint\">Ваша асабістая нататка пра гэты ўліковы запіс</string>\n    <string name=\"pref_title_confirm_favourites\">Патрабаваць пацвярджэнне перад упадабаннем</string>\n    <string name=\"pref_title_confirm_reblogs\">Патрабаваць пацвярджэнне перад пашырэннем</string>\n    <string name=\"pref_title_wellbeing_mode\">Дабрабыт</string>\n    <string name=\"drafts_failed_loading_reply\">Немагчыма атрымаць інфармацыю пра адказ</string>\n    <string name=\"draft_deleted\">Чарнавік выдалены</string>\n    <string name=\"report_category_spam\">Спам</string>\n    <string name=\"report_category_other\">Іншае</string>\n    <string name=\"action_unfollow_hashtag_format\">Не сачыць за #%1$s?</string>\n    <string name=\"action_subscribe_account\">Падпісацца</string>\n    <string name=\"action_unsubscribe_account\">Адпісацца</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Стварыць допіс</string>\n    <string name=\"saving_draft\">Захоўваю чарнавік…</string>\n    <string name=\"drafts_post_reply_removed\">Допіс, для якога Вы стварылі чарнавік адказу, выдалены</string>\n    <string name=\"follow_requests_info\">Нягледзячы на тое што Ваш уліковы запіс не закрыты, кіраўнікі %1$s вырашылі, што Вы, магчыма, пажадаеце праглядзець запыты на падпіску ад гэтых уліковых запісаў уручную.</string>\n    <string name=\"no_lists\">У Вас няма спісаў.</string>\n    <string name=\"no_drafts\">У Вас няма чарнавікоў.</string>\n    <string name=\"no_scheduled_posts\">У Вас няма запланаваных допісаў.</string>\n    <string name=\"no_announcements\">Няма аб\\'яў.</string>\n    <string name=\"pref_title_show_self_username\">Паказваць імя карыстальніка на панэлях інструментаў</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Паказваць папярэдні прагляд спасылак у стужках</string>\n    <string name=\"review_notifications\">Праглядзець апавяшчэнні</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Вы не можаце запампаваць больш за %1$d медыя далучэнне.</item>\n        <item quantity=\"few\">Вы не можаце запампаваць больш за %1$d медыя далучэнні.</item>\n        <item quantity=\"many\">Вы не можаце запампаваць больш за %1$d медыя далучэнняў.</item>\n        <item quantity=\"other\">Вы не можаце запампаваць больш за %1$d медыя далучэнняў.</item>\n    </plurals>\n    <string name=\"dialog_delete_list_warning\">Вы ўпэўнены, што жадаеце выдаліць спіс %1$s?</string>\n    <string name=\"limit_notifications\">Абмежаванне апавяшчэнняў у стужцы</string>\n    <string name=\"wellbeing_hide_stats_posts\">Схаваць колькасную статыстыку допісаў</string>\n    <string name=\"wellbeing_hide_stats_profile\">Схаваць колькасную статыстыку профіляў</string>\n    <string name=\"report_category_violation\">Парушэнне правіла</string>\n    <string name=\"instance_rule_title\">Правілы %1$s</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"delete_scheduled_post_warning\">Выдаліць гэты запланаваны допіс?</string>\n    <string name=\"instance_rule_info\">Увайшоўшы, Вы пагаджаецеся з правіламі %1$s.</string>\n    <string name=\"poll_new_choice_hint\">Варыянт %1$d</string>\n    <string name=\"drafts_post_failed_to_send\">Не атрымалася даслаць гэты допіс!</string>\n    <string name=\"mute_notifications_switch\">Бязгучныя апавяшчэнні</string>\n    <string name=\"warning_scheduling_interval\">Найменшы час планавання ў Mastodon складае 5 хвілін.</string>\n    <string name=\"pref_reading_order_oldest_first\">Спачатку старэйшыя</string>\n    <string name=\"pref_title_reading_order\">Кірунак чытання</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Адключана</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;нядзейсны&gt;</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;не задана&gt;</string>\n    <string name=\"pref_reading_order_newest_first\">Спачатку навейшыя</string>\n    <string name=\"dialog_follow_hashtag_title\">Падпісацца на хэштэг</string>\n    <string name=\"action_post_failed\">Не атрымалася запампаваць</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Не атрымалася запампаваць ваш допіс і ён быў захаваны ў чарнавік.\n\\n\n\\nАльбо не атрымалася злучыцца з серверам ці ён адхіліў допіс.</item>\n        <item quantity=\"few\"/>\n        <item quantity=\"many\"/>\n        <item quantity=\"other\"/>\n    </plurals>\n    <string name=\"action_post_failed_show_drafts\">Паказаць чарнавікі</string>\n    <string name=\"action_post_failed_do_nothing\">Адмяніць</string>\n    <string name=\"description_login\">Працуе амаль заўсёды. Даныя не ўцякаюць у іншыя праграмы.</string>\n    <string name=\"action_browser_login\">Увайсці з браўзера</string>\n    <string name=\"notification_unknown_name\">Невядома</string>\n    <string name=\"status_filtered_show_anyway\">Усё роўна паказаць</string>\n    <string name=\"status_filter_placeholder_label_format\">Адфільтрована: %1$s</string>\n    <string name=\"pref_title_account_filter_keywords\">Профілі</string>\n    <string name=\"title_public_trending_hashtags\">Папулярныя хэштэгі</string>\n    <string name=\"description_browser_login\">Можа падтрымліваць дадатковыя метады праверкі сапраўднасці, але для гэтага патрэбны адпаведны браузер.</string>\n    <string name=\"post_media_image\">Відарыс</string>\n    <string name=\"action_refresh\">Абнавіць</string>\n    <string name=\"select_list_manage\">Кіраванне спісамі</string>\n    <string name=\"total_usage\">Усяго выкарыстана</string>\n    <string name=\"total_accounts\">Усяго ўліковых запісаў</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d людзей кажуць пра хэштэг %2$s</string>\n    <string name=\"pref_title_show_stat_inline\">Паказваць статыстыку допісаў у стужцы</string>\n    <string name=\"ui_error_reblog\">Не атрымалася пашырыць допіс: %1$s</string>\n    <string name=\"hint_filter_title\">Мой фільтр</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"ui_error_bookmark\">Не атрымалася дадаць допіс да закладак: %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">Не атрымалася пацвердзіць запыт на падпіску: %1$s</string>\n    <string name=\"ui_success_accepted_follow_request\">Запыт на падпіску пацверджаны</string>\n    <string name=\"ui_success_rejected_follow_request\">Запыт на падпіску заблакіраваны</string>\n    <string name=\"ui_error_clear_notifications\">Не атрымалася ачысціць апавяшчэнні: %1$s</string>\n    <string name=\"ui_error_unknown\">невядомая прычына</string>\n    <string name=\"label_filter_title\">Загаловак</string>\n    <string name=\"filter_action_hide\">Схаваць</string>\n    <string name=\"filter_description_hide\">Схаваць поўнасцю</string>\n    <string name=\"label_filter_context\">Фільтраваць кантэкст</string>\n    <string name=\"label_filter_keywords\">Ключавыя словы альбо фразы для фільтравання</string>\n    <string name=\"action_add\">Дадаць</string>\n    <string name=\"filter_keyword_display_format\">%1$s (цэлае слова)</string>\n    <string name=\"filter_keyword_addition_title\">Дадаць ключавое слова</string>\n    <string name=\"filter_edit_keyword_title\">Змяніць ключавое слова</string>\n    <string name=\"reply_sending_long\">Ваш адказ адасланы.</string>\n    <string name=\"reply_sending\">Адсылаю…</string>\n    <string name=\"label_image\">Рысунак</string>\n    <string name=\"action_translate\">Перакласці</string>\n    <string name=\"action_show_original\">Паказаць арыгінал</string>\n    <string name=\"title_public_trending_statuses\">Папулярныя допісы</string>\n    <string name=\"error_blocking_domain\">Не атрымалася заблакіраваць %1$s: %2$s</string>\n    <string name=\"error_unblocking_domain\">Не атрымалася разблакіраваць %1$s: %2$s</string>\n    <string name=\"pref_title_per_timeline_preferences\">Налады па стужкам</string>\n    <string name=\"pref_title_show_self_boosts\">Паказаць самацытаванне</string>\n    <string name=\"pref_title_show_self_boosts_description\">Нехта цытуе ўласныя допісы</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-ber/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"title_tab_preferences\">ⵉⵛⵛⴰⵔⴻⵏ</string>\n    <string name=\"action_view_account_preferences\">ⵉⵖⴻⵡⵡⴰⵕⴻⵏ ⵏ ⵓⵎⵉⴸⴰⵏ</string>\n    <string name=\"action_view_preferences\">ⵉⵖⴻⵡⵡⴰⵕⴻⵏ</string>\n    <string name=\"pref_title_proxy_settings\">ⴰⵒⵕⵓⴽⵙⵉ</string>\n    <string name=\"action_view_blocks\">ⵉⵎⵙⴻⵇⴷⴰⵛⴻⵏ ⵜⵙⵡⴰⵃⵍⴻⵎ</string>\n    <string name=\"action_view_favourites\">ⵉⵙⵎⴻⵏⵢⵉⴼⴻⵏ</string>\n    <string name=\"action_view_profile\">ⴰⵎⴻⵖⵏⵓ</string>\n    <string name=\"action_close\">ⵎⴷⴻⵍ</string>\n    <string name=\"error_generic\">ⵝⴻⵍⵍⴰ ⴷ ⵝⵓⵛⴹⴰ.</string>\n    <string name=\"title_lists\">ⵝⴰⴲⴸⴰⵔⵉⵏ</string>\n    <string name=\"action_lists\">ⵝⵉⴲⴸⴰⵔⵉⵏ</string>\n    <string name=\"about_title_activity\">ⵖⴻⴼ</string>\n    <string name=\"action_reset_schedule\">ⵡⴻⵏⵏⴻⵣ ⵝⵉⴽⴻⵍⵜ ⵏⵏⵉⴸⴻⵏ</string>\n    <string name=\"action_search\">ⵏⴰⴸⵉ</string>\n    <string name=\"action_edit_profile\">ⵣⵔⴻⴳ ⴰⵎⴰⵖⵏⵓ</string>\n    <string name=\"action_logout\">ⴼⴼⴻⵖ</string>\n    <string name=\"title_drafts\">ⵉⵔⴻⵡⵡⴰⵢⴻⵏ</string>\n    <string name=\"title_favourites\">ⵉⵙⵎⴻⵏⵢⵉⴼⴻⵏ</string>\n    <string name=\"button_back\">ⵓⵖⴰⵍ</string>\n    <string name=\"button_continue\">ⴽⴻⵎⵎⴻⵍ</string>\n    <string name=\"filter_dialog_update_button\">ⵍⵇⴻⵎ</string>\n    <string name=\"filter_dialog_remove_button\">ⴽⴽⴻⵙ</string>\n    <string name=\"action_send_public\">ⵊⴻⵡⵡⴻⵇ!</string>\n    <string name=\"action_send\">ⵊⴻⵡⵡⴻⵇ</string>\n    <string name=\"action_login\">ⵇⵇⴻⵏ ⵖⴻⵔ ⵎⴰⵚⵟⵓⴷⵓⵏ</string>\n    <string name=\"link_whats_an_instance\">ⴸ ⴰⵛⵓ ⵓⴸ ⵜⵜⵓⵎⵎⴰⵏⵜ?</string>\n    <string name=\"notification_favourite_name\">ⵉⵙⵎⴻⵏⵢⵉⴼⴻⵏ</string>\n    <string name=\"action_remove\">ⴽⴽⴻⵙ</string>\n    <string name=\"action_access_drafts\">ⵉⵔⴻⵡⵡⴰⵢⴻⵏ</string>\n    <string name=\"title_blocks\">ⵉⵎⵙⴻⵇⴷⴰⵛⴻⵏ ⵜⵙⵡⴰⵃⵍⴻⵎ</string>\n    <string name=\"pref_title_post_tabs\">ⵉⵛⵛⴰⵔⴻⵏ</string>\n    <string name=\"hint_domain\">ⴰⵏⵜⴰ ⵝⵓⵎⵎⴰⵏⵜ?</string>\n    <string name=\"add_account_description\">ⵔⵏⵓ ⵢⵉⵡⴻⵏ ⵏ ⵓⵎⵉⴹⴰⵏ ⴰⵎⴰⵢⵏⵓⵝ ⵏ ⵎⴰⵚⵟⵓⴷⵓⵏ</string>\n    <string name=\"add_account_name\">ⵔⵏⵓ ⴰⵎⵉⴹⴰⵏ</string>\n    <string name=\"hint_compose\">ⴸⴰⵛⵓ ⵉⴳⴻⵍⵍⴰⵏ ⴸ ⴰⵎⴰⵢⵏⵓⵝ?</string>\n    <string name=\"action_schedule_post\">ⵙⵖⵉⵡⴻⵙ ⵝⵉⵊⴻⵡⵡⵉⵇⵝⴰ</string>\n    <string name=\"action_access_scheduled_posts\">ⵝⵉⵊⴻⵡⵡⵉⵇⵉⵏ ⵢⴻⵜⵜⵖⴰⵙⵖⴰⵡⵙⴻⵏ</string>\n    <string name=\"title_scheduled_posts\">ⵝⵉⵊⴻⵡⵡⵉⵇⵉⵏ ⵢⴻⵜⵜⵖⴰⵙⵖⴰⵡⵙⴻⵏ</string>\n    <string name=\"title_bookmarks\">ⵝⵉⵛⵔⴰⴹ</string>\n    <string name=\"action_view_bookmarks\">ⵝⵉⵛⵔⴰⴹ</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-bg/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"title_view_thread\">Нишка</string>\n    <string name=\"drafts_post_reply_removed\">Публикацията, на която сте изготвили отговор, е премахната</string>\n    <string name=\"duration_1_hour\">1 час</string>\n    <string name=\"duration_30_min\">30 минути</string>\n    <string name=\"duration_5_min\">5 минути</string>\n    <string name=\"duration_indefinite\">Неопределено</string>\n    <string name=\"label_duration\">Продължителност</string>\n    <string name=\"create_poll_title\">Анкета</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Активиране на плъзгащия жест за превключване между раздели</string>\n    <string name=\"failed_search\">Търсенето бе неуспешно</string>\n    <string name=\"title_accounts\">Акаунти</string>\n    <string name=\"report_description_remote_instance\">Акаунтът е от друг сървър. Да изпратите ли и там анонимно копие на доклада?</string>\n    <string name=\"report_description_1\">Докладът ще бъде изпратен на модератора на вашия сървър. Можете да предоставите обяснение защо докладвате този акаунт по-долу:</string>\n    <string name=\"failed_fetch_posts\">Извличането на публикации бе неуспешно</string>\n    <string name=\"failed_report\">Докладването бе неуспешно</string>\n    <string name=\"report_remote_instance\">Препращане към %1$s</string>\n    <string name=\"hint_additional_info\">Допълнителни коментари</string>\n    <string name=\"report_sent_success\">Успешно докладване на @%1$s</string>\n    <string name=\"button_done\">Готово</string>\n    <string name=\"button_back\">Назад</string>\n    <string name=\"button_continue\">Продължаване</string>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">Остава %1$d секунда</item>\n        <item quantity=\"other\">Остават %1$d секунди</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">Остава %1$d минута</item>\n        <item quantity=\"other\">Остават %1$d минути</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">Остава %1$d час</item>\n        <item quantity=\"other\">Остават %1$d часа</item>\n    </plurals>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">Остава %1$d ден</item>\n        <item quantity=\"other\">Остават %1$d дни</item>\n    </plurals>\n    <string name=\"poll_ended_created\">Анкета, която създадохте, приключи</string>\n    <string name=\"poll_ended_voted\">Анкета, в която сте гласували, приключи</string>\n    <string name=\"poll_vote\">Гласуване</string>\n    <string name=\"poll_info_closed\">затворено</string>\n    <string name=\"poll_info_time_absolute\">завършва в %1$s</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s човек</item>\n        <item quantity=\"other\">%1$s човека</item>\n    </plurals>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s глас</item>\n        <item quantity=\"other\">%1$s гласа</item>\n    </plurals>\n    <string name=\"poll_info_format\"> \\u0020<!-- 15 votes • 1 hour left --> \\u0020%1$s • %2$s</string>\n    <string name=\"compose_preview_image_description\">Действия за изображение %1$s</string>\n    <string name=\"notification_clear_text\">Сигурни ли сте, че искате да изчистите окончателно всичките си известия?</string>\n    <string name=\"compose_shortcut_short_label\">Композиране</string>\n    <string name=\"compose_shortcut_long_label\">Композиране на публикация</string>\n    <string name=\"filter_apply\">Прилагане</string>\n    <string name=\"notifications_apply_filter\">Филтриране</string>\n    <string name=\"notifications_clear\">Изчистване</string>\n    <string name=\"list\">Списък</string>\n    <string name=\"select_list_title\">Избиране на списък</string>\n    <string name=\"hashtags\">Хаштагове</string>\n    <string name=\"pick_hashtag_hint\">Хаштаг без #</string>\n    <string name=\"add_hashtag_title\">Добавяне на хаштаг</string>\n    <string name=\"hint_list_name\">Име на списък</string>\n    <string name=\"description_poll\">Анкета с избори: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"description_visibility_direct\">Директно</string>\n    <string name=\"description_visibility_private\">Последователи</string>\n    <string name=\"description_visibility_public\">Публично</string>\n    <string name=\"description_post_bookmarked\">Отметнато</string>\n    <string name=\"description_post_favourited\">Поставено в любими</string>\n    <string name=\"description_post_reblogged\">Реблог</string>\n    <string name=\"description_post_media_no_description_placeholder\">Няма описание</string>\n    <string name=\"description_post_cw\">Предупреждение за съдържание: %1$s</string>\n    <string name=\"description_post_media\">Мултимедия: %1$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s и %3$d други</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s и %2$s</string>\n    <string name=\"title_favourited_by\">Поставено в любими от</string>\n    <string name=\"title_reblogged_by\">Споделено от</string>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> Споделяне</item>\n        <item quantity=\"other\"><b>%1$s</b> Споделяния</item>\n    </plurals>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> Любимо</item>\n        <item quantity=\"other\"><b>%1$s</b> Любими</item>\n    </plurals>\n    <string name=\"pin_action\">Закачане</string>\n    <string name=\"unpin_action\">Разкачане</string>\n    <string name=\"label_remote_account\">Информацията по-долу може да отразява непълно потребителския профил. Натиснете, за да отворите пълен профил в браузъра.</string>\n    <string name=\"pref_title_absolute_time\">Използване на абсолютно време</string>\n    <string name=\"profile_metadata_content_label\">Съдържание</string>\n    <string name=\"profile_metadata_label_label\">Етикет</string>\n    <string name=\"profile_metadata_add\">добавяне на данни</string>\n    <string name=\"profile_metadata_label\">Профилни метаданни</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_apache_2\">Лицензиран под лиценза Apache (копие по-долу)</string>\n    <string name=\"license_description\">Tusky съдържа код и активи от следните проекти с отворен код:</string>\n    <string name=\"unreblog_private\">Отсподеляне</string>\n    <string name=\"reblog_private\">Споделяне с оригиналната аудитория</string>\n    <string name=\"account_moved_description\">%1$s се премести в:</string>\n    <string name=\"profile_badge_bot_text\">Бот</string>\n    <string name=\"download_failed\">Изтеглянето се провали</string>\n    <string name=\"caption_notoemoji\">Текущият набор от емоджита на Google</string>\n    <string name=\"download_fonts\">Първо ще трябва да изтеглите тези емоджи комплекти</string>\n    <string name=\"caption_twemoji\">Стандартният емоджи комплект на Mastodon</string>\n    <string name=\"caption_blobmoji\">Blob емоджитата, известни от Android 4.4–7.1</string>\n    <string name=\"caption_systememoji\">Емоджи комплектът по подразбиране в устройство ви</string>\n    <string name=\"restart\">Рестартиране</string>\n    <string name=\"later\">По-късно</string>\n    <string name=\"restart_emoji\">Ще трябва да рестартирате Tusky, за да приложите тези промени</string>\n    <string name=\"restart_required\">Изисква се рестартиране на приложението</string>\n    <string name=\"action_open_post\">Отваряне на публикация</string>\n    <string name=\"expand_collapse_all_posts\">Разгъване/сгъване на всички публикации</string>\n    <string name=\"performing_lookup_title\">Извършва се търсене…</string>\n    <string name=\"system_default\">По подразбиране от системата</string>\n    <string name=\"emoji_style\">Стил на емоджи</string>\n    <string name=\"error_no_custom_emojis\">Инстанцията ви %1$s няма персонализирани емоджита</string>\n    <string name=\"action_compose_shortcut\">Композиране</string>\n    <string name=\"send_post_notification_saved_content\">Копие от публикацията е запазено във вашите чернови</string>\n    <string name=\"send_post_notification_cancel_title\">Изпращането е отменено</string>\n    <string name=\"send_post_notification_channel_name\">Изпращане на публикации</string>\n    <string name=\"send_post_notification_error_title\">Грешка при изпращане на публикация</string>\n    <string name=\"send_post_notification_title\">Изпращане на публикация…</string>\n    <string name=\"compose_save_draft\">Запазване на чернова?</string>\n    <string name=\"lock_account_label_description\">Изисква ръчно одобряване на последователи</string>\n    <string name=\"lock_account_label\">Заключване на акаунт</string>\n    <string name=\"action_remove\">Премахване</string>\n    <string name=\"action_set_caption\">Задаване на надпис</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Опишете за хора със зрителни увреждания (ограничение до %1$d знак)</item>\n        <item quantity=\"other\">Опишете за хора със зрителни увреждания (ограничение до %1$d знака)</item>\n    </plurals>\n    <string name=\"compose_active_account_description\">Публикуване като %1$s</string>\n    <string name=\"action_remove_from_list\">Премахване на акаунт от списъка</string>\n    <string name=\"action_add_to_list\">Добавяне на акаунт към списъка</string>\n    <string name=\"hint_search_people_list\">Търсене на хора, които следвате</string>\n    <string name=\"action_delete_list\">Изтриване на списъка</string>\n    <string name=\"action_rename_list\">Обновяване на списъка</string>\n    <string name=\"action_create_list\">Създаване на списък</string>\n    <string name=\"error_delete_list\">Списъкът не можа да се изтрие</string>\n    <string name=\"error_create_list\">Списъкът не можа да се създаде</string>\n    <string name=\"error_rename_list\">Списъкът не можа да се обнови</string>\n    <string name=\"title_lists\">Списъци</string>\n    <string name=\"action_lists\">Списъци</string>\n    <string name=\"add_account_description\">Добавяне на нов Mastodon акаунт</string>\n    <string name=\"add_account_name\">Добавяне на акаунт</string>\n    <string name=\"filter_add_description\">Фраза за филтриране</string>\n    <string name=\"filter_dialog_whole_word_description\">Когато ключовата дума или фраза е само буквено-цифрова, тя ще бъде приложена само ако съответства на цялата дума</string>\n    <string name=\"filter_dialog_whole_word\">Цяла дума</string>\n    <string name=\"filter_dialog_update_button\">Обновяване</string>\n    <string name=\"filter_dialog_remove_button\">Премахване</string>\n    <string name=\"filter_edit_title\">Редакция на филтър</string>\n    <string name=\"filter_addition_title\">Добавяне на филтър</string>\n    <string name=\"pref_title_thread_filter_keywords\">Разговори</string>\n    <string name=\"pref_title_public_filter_keywords\">Публични емисии</string>\n    <string name=\"load_more_placeholder_text\">зареждане на още</string>\n    <string name=\"replying_to\">Отговаряне на @%1$s</string>\n    <string name=\"title_media\">Мултимедия</string>\n    <string name=\"pref_title_alway_open_spoiler\">Винаги разгъване на публикации, маркирани с предупреждения за съдържание</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Винаги показване на деликатно съдържание</string>\n    <string name=\"follows_you\">Следва ви</string>\n    <string name=\"abbreviated_seconds_ago\">%1$dс</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dм</string>\n    <string name=\"abbreviated_hours_ago\">%1$dч</string>\n    <string name=\"abbreviated_days_ago\">%1$dд</string>\n    <string name=\"abbreviated_years_ago\">%1$dг</string>\n    <string name=\"abbreviated_in_seconds\">след %1$dс</string>\n    <string name=\"abbreviated_in_minutes\">след %1$dм</string>\n    <string name=\"abbreviated_in_hours\">след %1$dч</string>\n    <string name=\"abbreviated_in_years\">след %1$dг</string>\n    <string name=\"abbreviated_in_days\">след %1$dд</string>\n    <string name=\"state_follow_requested\">Заявено последване</string>\n    <string name=\"post_media_attachments\">Прикачени файлове</string>\n    <string name=\"post_media_audio\">Аудио</string>\n    <string name=\"post_media_video\">Видео</string>\n    <string name=\"post_media_images\">Изображения</string>\n    <string name=\"post_share_link\">Споделяне на връзка към публикация</string>\n    <string name=\"post_share_content\">Споделяне на съдържание на публикация</string>\n    <string name=\"about_tusky_account\">Профилът на Tusky</string>\n    <string name=\"about_bug_feature_request_site\">Доклади за грешки и заявки за функции:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_project_site\">Уебсайт на проекта: https://tusky.app</string>\n    <string name=\"about_tusky_license\">Tusky е свободен софтуер с отворен код. Той е лицензиран под Общият публичен лиценз на GNU Версия 3. Можете да видите лиценза тук: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <string name=\"about_powered_by_tusky\">Осъществено от Tusky</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_title_activity\">Относно</string>\n    <string name=\"description_account_locked\">Заключен акаунт</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d ново взаимодействие</item>\n        <item quantity=\"other\">%1$d нови взаимодействия</item>\n    </plurals>\n    <string name=\"notification_summary_small\">%1$s и %2$s</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, и %3$s</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s и %4$d други</string>\n    <string name=\"notification_mention_format\">%1$s ви спомена</string>\n    <string name=\"notification_subscription_description\">Известия, когато някой, за когото сте абонирани, публикува</string>\n    <string name=\"notification_subscription_name\">Нови публикации</string>\n    <string name=\"notification_poll_description\">Известия за приключили анкети</string>\n    <string name=\"notification_poll_name\">Анкети</string>\n    <string name=\"notification_favourite_description\">Известия, когато публикациите ви бъдат означени като любими</string>\n    <string name=\"notification_favourite_name\">Любими</string>\n    <string name=\"notification_boost_description\">Известия, когато публикациите ви се споделят</string>\n    <string name=\"post_text_size_smallest\">Най-малък</string>\n    <string name=\"description_visibility_unlisted\">Скрито</string>\n    <string name=\"pref_title_post_tabs\">Начална емисия</string>\n    <string name=\"pref_title_post_filter\">Филтриране на емисия</string>\n    <string name=\"pref_title_animate_custom_emojis\">Анимиране на персонализирани емоджита</string>\n    <string name=\"pref_title_gradient_for_media\">Показване на цветни градиенти за скрита мултимедия</string>\n    <string name=\"pref_title_animate_gif_avatars\">Анимиране на GIF аватари</string>\n    <string name=\"pref_title_bot_overlay\">Показване на индикатор за ботове</string>\n    <string name=\"pref_title_language\">Език</string>\n    <string name=\"pref_title_custom_tabs\">Използване на персонализирани раздели чрез Chrome</string>\n    <string name=\"pref_title_browser_settings\">Браузър</string>\n    <string name=\"app_theme_system\">Използване на системния дизайн</string>\n    <string name=\"app_theme_auto\">Автоматично при залез</string>\n    <string name=\"app_theme_black\">Черно</string>\n    <string name=\"app_theme_light\">Светло</string>\n    <string name=\"app_them_dark\">Тъмно</string>\n    <string name=\"pref_title_timeline_filters\">Филтри</string>\n    <string name=\"pref_title_timelines\">Емисии</string>\n    <string name=\"pref_title_app_theme\">Тема на приложение</string>\n    <string name=\"pref_title_appearance_settings\">Външен вид</string>\n    <string name=\"pref_title_notification_filters\">Уведомете ме когато</string>\n    <string name=\"pref_title_notification_alert_light\">Уведомяване със светлина</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Уведомяване с вибрация</string>\n    <string name=\"pref_title_notification_alert_sound\">Уведомяване със звук</string>\n    <string name=\"pref_title_notification_alerts\">Сигнали</string>\n    <string name=\"pref_title_notifications_enabled\">Известия</string>\n    <string name=\"pref_title_edit_notification_settings\">Известия</string>\n    <string name=\"visibility_direct\">Директно: Публикуване само за споменатите потребители</string>\n    <string name=\"visibility_private\">Само за последователи: Публикуване само за последователи</string>\n    <string name=\"visibility_public\">Публично: Публикуване в публични емисии</string>\n    <string name=\"dialog_mute_hide_notifications\">Скриване на известия</string>\n    <string name=\"dialog_mute_warning\">Заглушаване на @%1$s?</string>\n    <string name=\"dialog_block_warning\">Блокиране на @%1$s?</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Скриване на целия домейн</string>\n    <string name=\"mute_domain_warning\">Сигурни ли сте, че искате да блокирате всички от %1$s? Няма да виждате съдържание от този домейн в нито една публична емисия или във вашите известия. Последователите ви от този домейн ще бъдат премахнати.</string>\n    <string name=\"dialog_redraft_post_warning\">Да се изтрие и преработи ли тази публикация?</string>\n    <string name=\"dialog_delete_post_warning\">Да се изтрие ли тази публикация?</string>\n    <string name=\"dialog_unfollow_warning\">Отследване на този акаунт?</string>\n    <string name=\"dialog_message_cancel_follow_request\">Да се отмени ли заявката за последване?</string>\n    <string name=\"dialog_download_image\">Изтегляне</string>\n    <string name=\"dialog_message_uploading_media\">Качване…</string>\n    <string name=\"dialog_title_finishing_media_upload\">Завършване на мултимедийно качване</string>\n    <string name=\"dialog_whats_an_instance\">Тук може да се въведе адресът или домейнът на която и да е инстанция, като mastodon.social, icosahedron.website, social.tchncs.de и <a href=\"https://instances.social\">други!</a> \\u0020\n\\n \\u0020\n\\nАко все още нямате акаунт, можете да въведете името на инстанцията, към която искате да се присъедините, и да създадете акаунт там. \\u0020\n\\n \\u0020\n\\nИнстанцията е единично място, където се хоства акаунтът ви, но можете лесно да комуникирате и да следвате хора в други инстанции, сякаш сте на същия сайт. \\u0020\n\\n \\u0020\n\\nПовече информация можете да намерите на <a href=\"https://joinmastodon.org\">joinmastodon.org</a>. </string>\n    <string name=\"login_connection\">Свързване…</string>\n    <string name=\"link_whats_an_instance\">Какво е инстанция?</string>\n    <string name=\"label_header\">Заглавна част</string>\n    <string name=\"label_avatar\">Аватар</string>\n    <string name=\"label_quick_reply\">Отговор…</string>\n    <string name=\"search_no_results\">Няма резултати</string>\n    <string name=\"hint_search\">Търсене…</string>\n    <string name=\"hint_note\">Био</string>\n    <string name=\"hint_display_name\">Показвано име</string>\n    <string name=\"hint_content_warning\">Предупреждение за съдържание</string>\n    <string name=\"hint_compose\">Какво се случва?</string>\n    <string name=\"hint_domain\">Коя инстанция?</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s е разкрит</string>\n    <string name=\"confirmation_unmuted\">Потребителят е раззаглушен</string>\n    <string name=\"confirmation_unblocked\">Потребителят е деблокиран</string>\n    <string name=\"confirmation_reported\">Изпратено!</string>\n    <string name=\"send_media_to\">Споделяне на мултимедия в…</string>\n    <string name=\"send_post_content_to\">Споделяне на публикация в…</string>\n    <string name=\"send_post_link_to\">Споделяне на URL адреса на публикацията в…</string>\n    <string name=\"downloading_media\">Теглене на мултимедия</string>\n    <string name=\"download_media\">Изтегляне на мултимедия</string>\n    <string name=\"action_share_as\">Споделяне като …</string>\n    <string name=\"action_open_as\">Отваряне като %1$s</string>\n    <string name=\"action_copy_link\">Копиране на връзката</string>\n    <string name=\"download_image\">Изтегляне на %1$s</string>\n    <string name=\"action_open_media_n\">Отваряне на мултимедия #%1$d</string>\n    <string name=\"title_links_dialog\">Връзки</string>\n    <string name=\"title_mentions_dialog\">Споменавания</string>\n    <string name=\"title_hashtags_dialog\">Хаштагове</string>\n    <string name=\"action_open_faved_by\">Показване на любими</string>\n    <string name=\"action_open_reblogged_by\">Показване на споделяния</string>\n    <string name=\"action_open_reblogger\">Отваряне на споделилия автор</string>\n    <string name=\"action_hashtags\">Хаштагове</string>\n    <string name=\"action_mentions\">Споменавания</string>\n    <string name=\"action_links\">Връзки</string>\n    <string name=\"action_add_tab\">Добавяне на раздел</string>\n    <string name=\"action_reset_schedule\">Нулиране</string>\n    <string name=\"action_schedule_post\">Планиране на публикация</string>\n    <string name=\"action_emoji_keyboard\">Емоджи клавиатура</string>\n    <string name=\"action_content_warning\">Предупреждение за съдържание</string>\n    <string name=\"action_toggle_visibility\">Видимост на публикация</string>\n    <string name=\"action_access_scheduled_posts\">Планирани публикации</string>\n    <string name=\"action_access_drafts\">Чернови</string>\n    <string name=\"action_search\">Търсене</string>\n    <string name=\"action_reject\">Отхвърляне</string>\n    <string name=\"action_accept\">Приемане</string>\n    <string name=\"action_undo\">Отмяна</string>\n    <string name=\"action_edit_own_profile\">Редакция</string>\n    <string name=\"action_edit_profile\">Редакция на профил</string>\n    <string name=\"action_save\">Запазване</string>\n    <string name=\"action_open_drawer\">Отваряне на чекмедже</string>\n    <string name=\"action_hide_media\">Скриване на мултимедия</string>\n    <string name=\"action_mention\">Споменаване</string>\n    <string name=\"action_unmute_conversation\">Раззаглушаване на разговор</string>\n    <string name=\"action_mute_conversation\">Заглушаване на разговор</string>\n    <string name=\"action_unmute_domain\">Раззаглушаване на %1$s</string>\n    <string name=\"action_mute_domain\">Заглушаване на %1$s</string>\n    <string name=\"action_unmute_desc\">Раззаглушаване на %1$s</string>\n    <string name=\"action_unmute\">Раззаглушаване</string>\n    <string name=\"action_mute\">Заглушаване</string>\n    <string name=\"action_share\">Споделяне</string>\n    <string name=\"action_photo_take\">Снимане</string>\n    <string name=\"action_add_poll\">Добавяне на анкета</string>\n    <string name=\"action_add_media\">Добавяне на мултимедия</string>\n    <string name=\"action_open_in_web\">Отваряне в браузъра</string>\n    <string name=\"action_view_media\">Мултимедия</string>\n    <string name=\"action_view_follow_requests\">Заявки за последване</string>\n    <string name=\"action_view_domain_mutes\">Скрити домейни</string>\n    <string name=\"action_view_blocks\">Блокирани потребители</string>\n    <string name=\"action_view_mutes\">Заглушени потребители</string>\n    <string name=\"action_view_bookmarks\">Отметки</string>\n    <string name=\"action_view_favourites\">Любими</string>\n    <string name=\"action_view_account_preferences\">Предпочитания за акаунта</string>\n    <string name=\"action_view_preferences\">Предпочитания</string>\n    <string name=\"action_view_profile\">Профил</string>\n    <string name=\"action_close\">Затваряне</string>\n    <string name=\"action_retry\">Повторен опит</string>\n    <string name=\"action_send_public\">ПУБЛИКУВАНЕ!</string>\n    <string name=\"action_send\">ИЗПРАЩАНЕ</string>\n    <string name=\"action_delete_and_redraft\">Изтриване и преработване</string>\n    <string name=\"action_delete\">Изтриване</string>\n    <string name=\"action_edit\">Редакция</string>\n    <string name=\"action_report\">Докладване</string>\n    <string name=\"action_show_reblogs\">Показване на споделяния</string>\n    <string name=\"action_hide_reblogs\">Скриване на споделяния</string>\n    <string name=\"action_unblock\">Деблокиране</string>\n    <string name=\"action_block\">Блокиране</string>\n    <string name=\"action_unfollow\">Отследване</string>\n    <string name=\"action_follow\">Последване</string>\n    <string name=\"action_logout_confirm\">Сигурни ли сте, че искате да излезете от %1$s? Това ще изтрие всички локални данни на акаунта, включително чернови и предпочитания.</string>\n    <string name=\"action_logout\">Излизане</string>\n    <string name=\"action_login\">Вписване с Tusky</string>\n    <string name=\"action_compose\">Композиране</string>\n    <string name=\"action_more\">Още</string>\n    <string name=\"action_unfavourite\">Премахване от любими</string>\n    <string name=\"action_bookmark\">Отмятане</string>\n    <string name=\"action_favourite\">Поставяне в любими</string>\n    <string name=\"action_unreblog\">Премахване на споделяне</string>\n    <string name=\"action_reblog\">Споделяне</string>\n    <string name=\"action_reply\">Отговор</string>\n    <string name=\"action_quick_reply\">Бърз отговор</string>\n    <string name=\"report_comment_hint\">Допълнителни коментари?</string>\n    <string name=\"report_username_format\">Докладване на @%1$s</string>\n    <string name=\"notification_subscription_format\">%1$s току-що публикува</string>\n    <string name=\"notification_follow_request_format\">%1$s поиска да ви последва</string>\n    <string name=\"notification_follow_format\">%1$s ви последва</string>\n    <string name=\"notification_favourite_format\">%1$s постави вашата публикация в любими</string>\n    <string name=\"notification_reblog_format\">%1$s сподели вашата публикация</string>\n    <string name=\"footer_empty\">Нищо тук. Дръпнете надолу, за да опресните!</string>\n    <string name=\"message_empty\">Нищо тук.</string>\n    <string name=\"post_content_show_less\">Сгъване</string>\n    <string name=\"post_content_show_more\">Разгъване</string>\n    <string name=\"post_content_warning_show_less\">Покажи по-малко</string>\n    <string name=\"post_content_warning_show_more\">Покажи повече</string>\n    <string name=\"post_sensitive_media_directions\">Щракнете за преглед</string>\n    <string name=\"post_media_hidden_title\">Мултимедията е скрита</string>\n    <string name=\"post_sensitive_media_title\">Деликатно съдържание</string>\n    <string name=\"post_boosted_format\">%1$s сподели</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"title_licenses\">Лицензи</string>\n    <string name=\"title_announcements\">Оповестявания</string>\n    <string name=\"title_scheduled_posts\">Планирани публикации</string>\n    <string name=\"title_drafts\">Чернови</string>\n    <string name=\"title_edit_profile\">Редакция на профила ви</string>\n    <string name=\"title_follow_requests\">Заявки за последване</string>\n    <string name=\"title_domain_mutes\">Скрити домейни</string>\n    <string name=\"title_blocks\">Блокирани потребители</string>\n    <string name=\"title_mutes\">Заглушени потребители</string>\n    <string name=\"title_bookmarks\">Отметки</string>\n    <string name=\"title_favourites\">Любими</string>\n    <string name=\"title_followers\">Последователи</string>\n    <string name=\"title_follows\">Последвани</string>\n    <string name=\"title_posts_pinned\">Закачени</string>\n    <string name=\"title_posts_with_replies\">С отговори</string>\n    <string name=\"title_posts\">Публикации</string>\n    <string name=\"title_tab_preferences\">Раздели</string>\n    <string name=\"title_direct_messages\">Директни съобщения</string>\n    <string name=\"title_public_local\">Местни</string>\n    <string name=\"title_notifications\">Известия</string>\n    <string name=\"title_home\">Начало</string>\n    <string name=\"error_sender_account_gone\">Грешка при изпращане на публикация.</string>\n    <string name=\"error_media_upload_sending\">Качването бе неуспешно.</string>\n    <string name=\"error_media_upload_image_or_video\">Изображения и видеоклипове не могат да бъдат прикачени към една и съща публикация.</string>\n    <string name=\"error_media_download_permission\">Изисква се разрешение за съхранение на мултимедия.</string>\n    <string name=\"error_media_upload_permission\">Изисква се разрешение за четене на мултимедия.</string>\n    <string name=\"error_media_upload_opening\">Този файл не можа да бъде отворен.</string>\n    <string name=\"error_media_upload_type\">Този тип файл не може да бъде качен.</string>\n    <string name=\"error_compose_character_limit\">Публикацията е твърде дълга!</string>\n    <string name=\"error_retrieving_oauth_token\">Получаването на токен за вход бе неуспешно. Ако това продължава, опитайте да се впишете в браузъра от менюто.</string>\n    <string name=\"error_authorization_denied\">Упълномощаването е отказано. Ако сте сигурни, че сте предоставили правилните данни, опитайте да се впишете в браузъра от менюто.</string>\n    <string name=\"error_authorization_unknown\">Възникна неидентифицирана грешка при упълномощаване. Ако това продължава, опитайте да се впишете в браузъра от менюто.</string>\n    <string name=\"error_no_web_browser_found\">Неуспешно намиране на уеб браузър, който да се използва.</string>\n    <string name=\"error_failed_app_registration\">Неуспешно удостоверяване с тази инстанция. Ако това продължава, опитайте да се впишете в браузъра от менюто.</string>\n    <string name=\"error_invalid_domain\">Въведен е невалиден домейн</string>\n    <string name=\"error_empty\">Това не може да бъде празно.</string>\n    <string name=\"error_network\">Възникна грешка в мрежата. Моля, проверете връзката си и опитайте отново.</string>\n    <string name=\"error_generic\">Възникна грешка.</string>\n    <string name=\"draft_deleted\">Черновата е изтрита</string>\n    <string name=\"drafts_failed_loading_reply\">Неуспешно зареждане на информация за отговор</string>\n    <string name=\"drafts_post_failed_to_send\">Тази публикация не успя да се изпрати!</string>\n    <string name=\"dialog_delete_list_warning\">Наистина ли искате да изтриете списъка %1$s?</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Не можете да качите повече от %1$d мултимедиен прикачен файл.</item>\n        <item quantity=\"other\">Не можете да качите повече от %1$d мултимедийни прикачени файлове.</item>\n    </plurals>\n    <string name=\"wellbeing_hide_stats_profile\">Скриване на количествена статистика на профили</string>\n    <string name=\"wellbeing_hide_stats_posts\">Скриване на количествена статистика на публикации</string>\n    <string name=\"limit_notifications\">Ограничаване на известия от емисия</string>\n    <string name=\"review_notifications\">Преглед на известията</string>\n    <string name=\"wellbeing_mode_notice\">Част от информацията, която може да повлияе на вашето психично състояние, ще бъде скрита. Това включва:\n\\n\n\\n - Известия за Любими/Споделяния/Последвани\n\\n - Брой Любими/Споделяния на публикации\n\\n - Статистика за Последователи/Публикации на профили\n\\n\n\\n Изскачащите известия няма да бъдат засегнати, но можете да прегледате предпочитанията си за известяване ръчно.</string>\n    <string name=\"account_note_saved\">Запазено!</string>\n    <string name=\"account_note_hint\">Вашата лична бележка за този акаунт</string>\n    <string name=\"pref_title_wellbeing_mode\">Благосъстояние</string>\n    <string name=\"pref_title_hide_top_toolbar\">Скриване на заглавието на горната лента с инструменти</string>\n    <string name=\"pref_title_confirm_reblogs\">Питане за потвърждение преди споделяне</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Показване на визуализации на връзки в емисии</string>\n    <string name=\"warning_scheduling_interval\">Mastodon има минимален интервал за планиране от 5 минути.</string>\n    <string name=\"no_announcements\">Няма оповестявания.</string>\n    <string name=\"no_scheduled_posts\">Нямате планирани публикации.</string>\n    <string name=\"no_drafts\">Нямате чернови.</string>\n    <string name=\"post_lookup_error_format\">Грешка при търсенето на публикация %1$s</string>\n    <string name=\"edit_poll\">Редакция</string>\n    <string name=\"poll_new_choice_hint\">Избор %1$d</string>\n    <string name=\"poll_allow_multiple_choices\">Множество избора</string>\n    <string name=\"add_poll_choice\">Добавяне на избор</string>\n    <string name=\"duration_7_days\">7 дни</string>\n    <string name=\"duration_3_days\">3 дни</string>\n    <string name=\"duration_1_day\">1 ден</string>\n    <string name=\"duration_6_hours\">6 часа</string>\n    <string name=\"notification_boost_name\">Споделяния</string>\n    <string name=\"notification_follow_request_description\">Известия за заявки за последване</string>\n    <string name=\"notification_follow_request_name\">Заявки за последване</string>\n    <string name=\"notification_follow_description\">Известия за нови последователи</string>\n    <string name=\"notification_follow_name\">Нови последователи</string>\n    <string name=\"notification_mention_descriptions\">Известия за нови споменавания</string>\n    <string name=\"notification_mention_name\">Нови споменавания</string>\n    <string name=\"post_text_size_largest\">Най-голям</string>\n    <string name=\"post_text_size_large\">Голям</string>\n    <string name=\"post_text_size_medium\">Среден</string>\n    <string name=\"post_text_size_small\">Малък</string>\n    <string name=\"visibility_unlisted\">Скрито: Не се показва в публични емисии</string>\n    <string name=\"pref_post_text_size\">Размер на текста на публикация</string>\n    <string name=\"post_privacy_followers_only\">Само за последователи</string>\n    <string name=\"post_privacy_unlisted\">Скрито</string>\n    <string name=\"post_privacy_public\">Публично</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Отдолу</string>\n    <string name=\"pref_main_nav_position_option_top\">Отгоре</string>\n    <string name=\"pref_main_nav_position\">Основна навигационна позиция</string>\n    <string name=\"pref_failed_to_sync\">Синхронизирането на предпочитанията бе неуспешно</string>\n    <string name=\"pref_publishing\">Публикуване (синхронизирано със сървър)</string>\n    <string name=\"pref_default_media_sensitivity\">Винаги маркиране на мултимедия като чувствителна</string>\n    <string name=\"pref_default_post_privacy\">Поверителност на публикация по подразбиране</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP прокси порт</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP прокси сървър</string>\n    <string name=\"pref_title_http_proxy_enable\">Активиране на HTTP прокси</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP прокси</string>\n    <string name=\"pref_title_proxy_settings\">Прокси</string>\n    <string name=\"pref_title_show_media_preview\">Изтегляне на визуализации за мултимедии</string>\n    <string name=\"pref_title_show_replies\">Показване на отговори</string>\n    <string name=\"pref_title_show_boosts\">Показване на споделяния</string>\n    <string name=\"error_multimedia_size_limit\">Видео и аудио файловете не може да превишават %1$s МБ в размер.</string>\n    <string name=\"error_image_edit_failed\">Изображението не може да бъде редактирано.</string>\n    <string name=\"a11y_label_loading_thread\">Зареждане на нишка</string>\n    <string name=\"pref_ui_text_size\">Размер на текста на интерфейса</string>\n    <string name=\"dialog_follow_hashtag_title\">Последване на хаштаг</string>\n    <string name=\"label_image\">Изображение</string>\n    <string name=\"hint_media_description_missing\">Мултимедията трябва да има описание.</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"title_login\">Вписване</string>\n    <string name=\"action_unsubscribe_account\">Отписване</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Композиране на публикация</string>\n    <string name=\"title_edits\">Редакции</string>\n    <string name=\"notification_sign_up_description\">Известия за нови потребители</string>\n    <string name=\"notification_sign_up_name\">Регистрации</string>\n    <string name=\"action_post_failed\">Неуспешно качване</string>\n    <string name=\"post_edited\">Редактирано %1$s</string>\n    <string name=\"notification_header_report_format\">%1$s докладва %2$s</string>\n    <string name=\"notification_report_format\">Ново докладване на %1$s</string>\n    <string name=\"action_delete_conversation\">Изтриване на разговор</string>\n    <string name=\"post_media_image\">Изображение</string>\n    <string name=\"duration_60_days\">60 дни</string>\n    <string name=\"dialog_delete_conversation_warning\">Да се изтрие ли този разговор?</string>\n    <string name=\"pref_show_self_username_always\">Винаги</string>\n    <string name=\"pref_default_post_language\">Език на публикуване по подразбиране</string>\n    <string name=\"pref_show_self_username_never\">Никога</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;невалидно&gt;</string>\n    <string name=\"notification_report_name\">Докладвания</string>\n    <string name=\"about_account_info_title\">Вашият акаунт</string>\n    <string name=\"about_device_info_title\">Вашето устройство</string>\n    <string name=\"notification_listenable_worker_description\">Известия, когато Tusky работи във фонов режим</string>\n    <string name=\"error_following_hashtags_unsupported\">Тази инстанция не поддържа следване на хаштагове.</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"action_subscribe_account\">Абониране</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;не е зададено&gt;</string>\n    <string name=\"instance_rule_info\">С вписването вие се съгласявате с правилата на %1$s.</string>\n    <string name=\"error_muting_hashtag_format\">Грешка при заглушаване на #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Грешка при раззаглушаване на #%1$s</string>\n    <string name=\"action_unbookmark\">Премахване на отметка</string>\n    <string name=\"action_dismiss\">Отхвърляне</string>\n    <string name=\"action_continue_edit\">Продължаване на редактирането</string>\n    <string name=\"action_discard\">Отхвърляне на промените</string>\n    <string name=\"action_details\">Подробности</string>\n    <string name=\"duration_no_change\">(Няма промяна)</string>\n    <string name=\"post_media_alt\">Алт текст</string>\n    <string name=\"description_post_language\">Езика на публикация</string>\n    <string name=\"action_browser_login\">Вписване с Браузър</string>\n    <string name=\"status_created_at_now\">сега</string>\n    <string name=\"description_post_edited\">Редактирано</string>\n    <string name=\"action_refresh\">Опресняване</string>\n    <string name=\"action_add_reaction\">добавяне на реакция</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"account_username_copied\">Потребителското име бе копирано</string>\n    <string name=\"failed_to_pin\">Неуспешно закачане</string>\n    <string name=\"failed_to_unpin\">Неуспешно разкачане</string>\n    <string name=\"notification_update_name\">Редакции на публикации</string>\n    <string name=\"pref_reading_order_newest_first\">Първо най-новите</string>\n    <string name=\"pref_reading_order_oldest_first\">Първо най-старите</string>\n    <string name=\"pref_title_confirm_favourites\">Питане за потвърждение преди слагане в любими</string>\n    <string name=\"dialog_delete_filter_positive_action\">Изтриване</string>\n    <string name=\"dialog_delete_filter_text\">Да се изтрие ли филтър \\'%1$s\\'?</string>\n    <string name=\"no_lists\">Нямате списъци.</string>\n    <string name=\"error_following_hashtag_format\">Грешка при последване на #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Грешка при отследване на #%1$s</string>\n    <string name=\"title_public_federated\">Федерирани</string>\n    <string name=\"select_list_manage\">Управление на списъци</string>\n    <string name=\"notification_update_format\">%1$s редактира публикацията си</string>\n    <string name=\"pref_title_account_filter_keywords\">Профили</string>\n    <string name=\"filter_description_hide\">Пълно скриване</string>\n    <string name=\"duration_30_days\">30 дни</string>\n    <string name=\"title_public_trending_statuses\">Налагащи се публикации</string>\n    <string name=\"filter_action_warn\">Предупреди</string>\n    <string name=\"status_edit_info\">Редактирано: %1$s</string>\n    <string name=\"action_add\">Добавяне</string>\n    <string name=\"filter_keyword_addition_title\">Добавяне на ключова дума</string>\n    <string name=\"filter_edit_keyword_title\">Редакция на ключова дума</string>\n    <string name=\"filter_keyword_display_format\">%1$s (цяла дума)</string>\n    <string name=\"filter_action_hide\">Скриване</string>\n    <string name=\"filter_description_warn\">Скриване с предупреждение</string>\n    <string name=\"duration_90_days\">90 дни</string>\n    <string name=\"duration_180_days\">180 дни</string>\n    <string name=\"duration_365_days\">365 дни</string>\n    <string name=\"instance_rule_title\">%1$s правила</string>\n    <string name=\"label_filter_title\">Заглавие</string>\n    <string name=\"error_blocking_domain\">Неуспешно заглушаване на %1$s: %2$s</string>\n    <string name=\"error_unblocking_domain\">Неуспешно раззаглушаване на %1$s: %2$s</string>\n    <string name=\"confirmation_hashtag_unfollowed\">#%1$s отследвано</string>\n    <string name=\"list_exclusive_label\">Скриване от началната емисия</string>\n    <string name=\"title_public_trending_hashtags\">Налагащи се хаштагове</string>\n    <string name=\"action_post_failed_do_nothing\">Отхвърляне</string>\n    <string name=\"error_media_upload_sending_fmt\">Качването бе неуспешно: %1$s</string>\n    <string name=\"title_followed_hashtags\">Последвани хаштагове</string>\n    <string name=\"notification_sign_up_format\">%1$s се регистрира</string>\n    <string name=\"action_post_failed_show_drafts\">Покажи чернови</string>\n    <string name=\"duration_14_days\">14 дни</string>\n    <string name=\"report_category_violation\">Нарушение на правилата</string>\n    <string name=\"action_edit_image\">Редакция на изображение</string>\n    <string name=\"notification_update_description\">Известия, когато публикации с които сте взаимодействали, са редактирани</string>\n    <string name=\"load_newest_notifications\">Зареждане на най-новите известия</string>\n    <string name=\"compose_delete_draft\">Изтриване на чернова?</string>\n    <string name=\"action_unfollow_hashtag_format\">Отследване на #%1$s?</string>\n    <string name=\"mute_notifications_switch\">Заглушаване на известията</string>\n    <string name=\"action_translate\">Превеждане</string>\n    <string name=\"label_translated\">Преведено от %1$s чрез %2$s</string>\n    <string name=\"report_category_spam\">Спам</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-bn-rBD/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"abbreviated_seconds_ago\">%1$dসে</string>\n    <string name=\"description_poll\">পছন্দগুলি সহ নর্বাচন: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"description_visibility_direct\">সরাসরি</string>\n    <string name=\"description_visibility_private\">অনুগামিবৃন্দ</string>\n    <string name=\"description_visibility_unlisted\">অতালিকাভুক্ত</string>\n    <string name=\"description_visibility_public\">সর্বজনীন</string>\n    <string name=\"description_post_favourited\">পছন্দ</string>\n    <string name=\"description_post_reblogged\">আবার ব্লগ</string>\n    <string name=\"description_post_media_no_description_placeholder\">বর্ণনা নাই</string>\n    <string name=\"description_post_cw\">সতর্কবার্তা: %1$s</string>\n    <string name=\"description_post_media\">মিডিয়া: %1$s</string>\n    <string name=\"title_favourited_by\">দ্বারা পছন্দ</string>\n    <string name=\"title_reblogged_by\">দ্বারা সর্মথন</string>\n    <string name=\"pin_action\">পিন</string>\n    <string name=\"unpin_action\">আনপিন</string>\n    <string name=\"label_remote_account\">নীচের তথ্য অসম্পূর্ণভাবে ব্যবহারকারীর প্রোফাইল প্রতিফলিত হতে পারে। ব্রাউজারে সম্পূর্ণ প্রোফাইল খুলতে টিপুন।</string>\n    <string name=\"pref_title_absolute_time\">পরম সময় ব্যবহার করুন</string>\n    <string name=\"profile_metadata_content_label\">উপাদান</string>\n    <string name=\"profile_metadata_label_label\">লেবেল</string>\n    <string name=\"profile_metadata_add\">তথ্য যোগ করুন</string>\n    <string name=\"profile_metadata_label\">প্রোফাইল মেটাডেটা</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_apache_2\">এপাচে লাইসেন্সের অধীনে লাইসেন্স (নীচের কপি)</string>\n    <string name=\"license_description\">টাস্কি নিম্নলিখিত ওপেন সোর্স প্রকল্প থেকে কোড এবং সম্পদ রয়েছে:</string>\n    <string name=\"unreblog_private\">সমর্থন ফেরত</string>\n    <string name=\"reblog_private\">মূল শ্রোতাদেড় সমথন পাঠাও</string>\n    <string name=\"profile_badge_bot_text\">বট</string>\n    <string name=\"download_failed\">ডাউনলোড ব্যর্থ হয়েছে</string>\n    <string name=\"caption_notoemoji\">গুগল এর বর্তমান ইমোজি সেট</string>\n    <string name=\"caption_twemoji\">ম্যাস্টোডোন এর মান ইমোজি সেট</string>\n    <string name=\"caption_blobmoji\">অ্যান্ড্রয়েড ৪.৪-৭.১ থেকে পরিচিত ব্লোব ইমোজিস</string>\n    <string name=\"caption_systememoji\">আপনার ডিভাইসের ডিফল্ট ইমোজি সেট</string>\n    <string name=\"restart\">পুনরারম্ভ</string>\n    <string name=\"later\">পরবর্তীতে</string>\n    <string name=\"restart_emoji\">এই পরিবর্তনগুলি প্রয়োগ করার জন্য আপনাকে টাস্কি পুনরায় চালু করতে হবে</string>\n    <string name=\"restart_required\">অ্যাপ্লিকেশন পুনরায় আরম্ভ করা প্রয়োজন</string>\n    <string name=\"action_open_post\">টুট খুলুন</string>\n    <string name=\"expand_collapse_all_posts\">সমস্ত স্টেটাস প্রসারিত/সংকুচিত করুন</string>\n    <string name=\"performing_lookup_title\">অনুসন্ধান করা হচ্ছে …</string>\n    <string name=\"download_fonts\">আপনাকে প্রথমে এই ইমোজি সেটগুলি ডাউনলোড করতে হবে</string>\n    <string name=\"system_default\">সিস্টেমের ডিফল্ট</string>\n    <string name=\"emoji_style\">ইমোজি স্টাইল</string>\n    <string name=\"error_no_custom_emojis\">আপনার ইনস্ট্যান্স %1$s এর কোনো কাস্টম ইমোজিস নেই</string>\n    <string name=\"action_compose_shortcut\">রচনা</string>\n    <string name=\"send_post_notification_saved_content\">টুট এর একটি কপি আপনার ড্রাফটে সংরক্ষণ করা হয়েছে</string>\n    <string name=\"send_post_notification_cancel_title\">পাঠানো বাতিল</string>\n    <string name=\"send_post_notification_channel_name\">টুট পাঠানো হচ্ছে</string>\n    <string name=\"send_post_notification_error_title\">টুট পাঠাতে গিয়ে একটি ত্রুটি ঘটেছে</string>\n    <string name=\"send_post_notification_title\">টুট পাঠানো হচ্ছে …</string>\n    <string name=\"compose_save_draft\">ড্রাফট সংরক্ষণ?</string>\n    <string name=\"lock_account_label_description\">অনুসারী অনুমোদন করার জন্য আপনাকে প্রয়োজন</string>\n    <string name=\"lock_account_label\">অ্যাকাউন্ট লক করুন</string>\n    <string name=\"action_set_caption\">ক্যাপশন সেট করুন</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\"/>\n        <item quantity=\"other\">দৃষ্টি প্রতিবন্ধী জন্য বর্ণনা করুন\n\\n(%1$d অক্ষর সীমা)</item>\n    </plurals>\n    <string name=\"compose_active_account_description\">অ্যাকাউন্ট %1$s থেকে পোস্ট করা হচ্ছে</string>\n    <string name=\"action_remove_from_list\">তালিকা থেকে অ্যাকাউন্ট সরান</string>\n    <string name=\"action_add_to_list\">তালিকায় অ্যাকাউন্ট যোগ করুন</string>\n    <string name=\"hint_search_people_list\">আপনি অনুসরণ মানুষের জন্য অনুসন্ধান করুন</string>\n    <string name=\"action_delete_list\">তালিকা মুছে দিন</string>\n    <string name=\"action_rename_list\">তালিকা পুনঃ নামকরণ কর</string>\n    <string name=\"action_create_list\">একটি তালিকা তৈরি করুন</string>\n    <string name=\"error_delete_list\">তালিকা মুছে ফেলা যায়নি</string>\n    <string name=\"error_rename_list\">তালিকা নামকরণ করা যায়নি</string>\n    <string name=\"error_create_list\">তালিকা তৈরি করা যায়নি</string>\n    <string name=\"title_lists\">তালিকাসমূহ</string>\n    <string name=\"action_lists\">তালিকাসমূহ</string>\n    <string name=\"add_account_description\">নতুন ম্যাস্টোডোন অ্যাকাউন্ট যোগ করুন</string>\n    <string name=\"add_account_name\">অ্যাকাউন্ট যোগ করুন</string>\n    <string name=\"filter_add_description\">বাক্য ফিল্টার কর</string>\n    <string name=\"filter_dialog_update_button\">আপডেট</string>\n    <string name=\"filter_dialog_remove_button\">সরাও</string>\n    <string name=\"filter_edit_title\">ফিল্টার সম্পাদনা করুন</string>\n    <string name=\"filter_addition_title\">ফিল্টার যোগ করুন</string>\n    <string name=\"pref_title_thread_filter_keywords\">কথাবার্তা</string>\n    <string name=\"pref_title_public_filter_keywords\">পাবলিক টাইমলাইন</string>\n    <string name=\"load_more_placeholder_text\">আরো লোড কর</string>\n    <string name=\"replying_to\">\\'@%1$s কে উত্তর দিচ্ছে\\'</string>\n    <string name=\"title_media\">মিডিয়া</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">সর্বদা সংবেদনশীল কন্টেন্ট প্রদর্শন করুন</string>\n    <string name=\"follows_you\">আপনাকে অনুসরন করে</string>\n    <string name=\"abbreviated_in_seconds\">\\'%1$ds এ\\'</string>\n    <string name=\"abbreviated_in_minutes\">\\'%1$dm এ\\'</string>\n    <string name=\"abbreviated_in_hours\">\\'%1$dh এ\\'</string>\n    <string name=\"abbreviated_in_days\">\\'%1$dd এ\\'</string>\n    <string name=\"abbreviated_in_years\">\\'%1$dy এ\\'</string>\n    <string name=\"state_follow_requested\">অনুরোধ অনুসরণ করুন</string>\n    <string name=\"post_media_video\">ভিডিও</string>\n    <string name=\"post_media_images\">চিত্রগুলি</string>\n    <string name=\"post_share_link\">টুট এর সাথে লিংক ভাগ করুন</string>\n    <string name=\"post_share_content\">টুট এর কন্টেন্ট ভাগ করুন</string>\n    <string name=\"about_tusky_account\">টাস্কির প্রোফাইল</string>\n    <string name=\"about_bug_feature_request_site\">বাগ রিপোর্ট এবং বৈশিষ্ট্য অনুরোধ:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_project_site\">প্রকল্প ওয়েবসাইট:\n\\nhttps://tusky.app</string>\n    <string name=\"about_tusky_license\">টাস্কি মুক্ত এবং ওপেন সোর্স সফ্টওয়্যার। এটি GNU জেনারেল পাবলিক লাইসেন্স সংস্করণ 3 এর অধীনে লাইসেন্সযুক্ত। আপনি এখানে লাইসেন্স দেখতে পারেন: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <string name=\"about_tusky_version\">টাস্কি %1$s</string>\n    <string name=\"about_title_activity\">সম্পর্কিত</string>\n    <string name=\"description_account_locked\">লক অ্যাকাউন্ট</string>\n    <string name=\"notification_poll_description\">শেষ হয়েছে যে নির্বাচনগুলির সম্পর্কে বিজ্ঞপ্তি</string>\n    <string name=\"notification_poll_name\">নির্বাচনগুলি</string>\n    <string name=\"notification_favourite_description\">আপনার টুটগুলি প্রিয় হিসাবে চিহ্নিত পেতে বিজ্ঞপ্তি</string>\n    <string name=\"notification_favourite_name\">প্রিয়গুলো</string>\n    <string name=\"notification_boost_description\">আপনার টুটগুলি সমর্থন হলে বিজ্ঞপ্তিগুলি</string>\n    <string name=\"notification_boost_name\">সমর্থনগুলি</string>\n    <string name=\"notification_follow_description\">নতুন অনুসরণকারী সম্পর্কে বিজ্ঞপ্তি</string>\n    <string name=\"notification_follow_name\">নতুন অনুসরণকারী</string>\n    <string name=\"notification_mention_descriptions\">নতুন উল্লেখ সম্পর্কে বিজ্ঞপ্তি</string>\n    <string name=\"notification_mention_name\">নতুন উল্লেখসমূহ</string>\n    <string name=\"post_text_size_largest\">বৃহত্তম</string>\n    <string name=\"post_text_size_large\">বড়</string>\n    <string name=\"post_text_size_medium\">মাঝারি</string>\n    <string name=\"post_text_size_small\">ছোট</string>\n    <string name=\"post_text_size_smallest\">কনিষ্ঠ</string>\n    <string name=\"pref_post_text_size\">স্থিতি টেক্সট আকার</string>\n    <string name=\"post_privacy_followers_only\">শুধুমাত্র অনুগামিবৃন্দ</string>\n    <string name=\"post_privacy_unlisted\">অতালিকাভুক্ত</string>\n    <string name=\"post_privacy_public\">সর্বজনীন</string>\n    <string name=\"pref_failed_to_sync\">সেটিংস সিঙ্ক করতে ব্যর্থ</string>\n    <string name=\"pref_publishing\">প্রকাশনা (সার্ভারের সাথে সিঙ্ক করা)</string>\n    <string name=\"pref_default_media_sensitivity\">সর্বদা সংবেদনশীল হিসাবে মিডিয়া চিহ্নিত করুন</string>\n    <string name=\"pref_default_post_privacy\">ডিফল্ট পোস্ট গোপনীয়তা</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP প্রক্সি পোর্ট</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP প্রক্সি সার্ভার</string>\n    <string name=\"pref_title_http_proxy_enable\">HTTP প্রক্সি সক্ষম কর</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP প্রক্সি</string>\n    <string name=\"pref_title_proxy_settings\">প্রক্সি</string>\n    <string name=\"pref_title_show_media_preview\">মিডিয়া পূর্বরূপ ডাউনলোড করুন</string>\n    <string name=\"pref_title_show_replies\">উত্তর প্রদর্শন করুন</string>\n    <string name=\"pref_title_show_boosts\">সমর্থন দেখান</string>\n    <string name=\"pref_title_post_tabs\">ট্যাবগুলি</string>\n    <string name=\"pref_title_post_filter\">টাইমলাইন ফিল্টারিং</string>\n    <string name=\"pref_title_animate_gif_avatars\">GIF অবতার অ্যানিমেশন করুন</string>\n    <string name=\"pref_title_bot_overlay\">বট জন্য সূচক প্রদর্শন করুন</string>\n    <string name=\"pref_title_language\">ভাষা</string>\n    <string name=\"pref_title_custom_tabs\">ক্রোম কাস্টম ট্যাব ব্যবহার করুন</string>\n    <string name=\"pref_title_browser_settings\">ব্রাউজার</string>\n    <string name=\"app_theme_system\">সিস্টেম ডিজাইন ব্যবহার করুন</string>\n    <string name=\"app_theme_auto\">সূর্যাস্ত স্বয়ংক্রিয়</string>\n    <string name=\"app_theme_black\">কালো</string>\n    <string name=\"app_theme_light\">আলো</string>\n    <string name=\"app_them_dark\">অন্ধকার</string>\n    <string name=\"pref_title_timeline_filters\">ফিল্টার</string>\n    <string name=\"pref_title_timelines\">টাইমলাইন</string>\n    <string name=\"pref_title_app_theme\">এপ্লিকেশন এর থিম</string>\n    <string name=\"pref_title_appearance_settings\">উপস্থিতি</string>\n    <string name=\"pref_title_notification_filters\">যখন আমাকে অবহিত</string>\n    <string name=\"pref_title_notification_alert_light\">আলো সঙ্গে অবহিত</string>\n    <string name=\"pref_title_notification_alert_vibrate\">কম্পন সঙ্গে অবহিত</string>\n    <string name=\"pref_title_notification_alert_sound\">একটি শব্দ সঙ্গে অবহিত</string>\n    <string name=\"pref_title_notification_alerts\">সতর্কতা</string>\n    <string name=\"pref_title_notifications_enabled\">বিজ্ঞপ্তিগুলি</string>\n    <string name=\"pref_title_edit_notification_settings\">বিজ্ঞপ্তিগুলি</string>\n    <string name=\"visibility_direct\">সরাসরি: শুধুমাত্র উল্লেখ ব্যবহারকারীদের পোস্ট করুন</string>\n    <string name=\"visibility_private\">শুধুমাত্র অনুসরণকারীদের: শুধুমাত্র অনুসরণকারীদের পোস্ট করুন</string>\n    <string name=\"visibility_unlisted\">তালিকাভুক্ত নয়: সর্বজনীন সময়সূচীগুলিতে দেখাবেন না</string>\n    <string name=\"visibility_public\">সর্বজনীন: পাবলিক টাইমলাইনে পোস্ট কর</string>\n    <string name=\"dialog_redraft_post_warning\">এই টুট টি মুছে ফেলবেন এবং পুনরায় ড্রাফট করবেন?</string>\n    <string name=\"dialog_delete_post_warning\">এই টুট টি মুছে ফেলবেন?</string>\n    <string name=\"dialog_unfollow_warning\">এই অ্যাকাউন্টটি অনুসরণ করবেন না?</string>\n    <string name=\"dialog_message_cancel_follow_request\">অনুসরণ অনুরোধ প্রত্যাহার?</string>\n    <string name=\"dialog_download_image\">ডাউনলোড</string>\n    <string name=\"dialog_message_uploading_media\">আপলোড হচ্ছে …</string>\n    <string name=\"dialog_title_finishing_media_upload\">মিডিয়া আপলোড সমাপ্ত করা হচ্ছে</string>\n    <string name=\"dialog_whats_an_instance\">কোনও উদাহরণের ঠিকানা বা ডোমেন এখানে প্রবেশ করা যেতে পারে যেমন mastodon.social, icosahedron.website, social.tchncs.de, এবং &lt;a href=\\\"https://instances.social\\\"&gt; আরও! &lt;/a&gt; \\u0020\n\\n \\u0020\n\\nআপনার যদি এখনো অ্যাকাউন্ট না থাকে তবে আপনি যে ইনস্ট্যান্সটিতে যোগ দিতে চান সেটির নামটি প্রবেশ করতে এবং সেখানে একটি অ্যাকাউন্ট তৈরি করতে পারেন। \\u0020\n\\n \\u0020\n\\n \\u0020\n\\n \\u0020\n\\nএকটি ইনস্ট্যান্স একটি একক স্থান যেখানে আপনার অ্যাকাউন্ট হোস্ট করা হয়, তবে আপনি সহজেই যোগাযোগ করতে পারেন এবং অন্যান্য ক্ষেত্রে যেমন আপনি একই সাইটে ছিলেন তা অনুসরণ করতে পারেন। \\u0020\n\\n \\u0020\n\\n \\u0020\n\\n \\u0020\n\\nআরো তথ্য &lt;a href=\\\"https://joinmastodon.org\\\"&gt; joinmastodon.org &lt;/a&gt; এ পাওয়া যেতে পারে। <a href=\"https://instances.social\">more!</a> \\u0020\n\\n \\u0020\n\\nIf you don\\'t yet have an account, you can enter the name of the instance you\\'d like to join and create an account there. \\u0020\n\\n \\u0020\n\\nAn instance is a single place where your account is hosted, but you can easily communicate with and follow folks on other instances as though you were on the same site. \\u0020\n\\n \\u0020\n\\nMore info can be found at <a href=\"https://joinmastodon.org\">joinmastodon.org</a>. </string>\n    <string name=\"login_connection\">সংযুক্ত হচ্ছে …</string>\n    <string name=\"link_whats_an_instance\">ইনস্ট্যান্স কি?</string>\n    <string name=\"label_header\">হেডার</string>\n    <string name=\"label_avatar\">অবতার</string>\n    <string name=\"label_quick_reply\">উত্তর…</string>\n    <string name=\"search_no_results\">কোন ফলাফল নেই</string>\n    <string name=\"hint_search\">অনুসন্ধান…</string>\n    <string name=\"hint_note\">জীবনী</string>\n    <string name=\"hint_display_name\">প্রদর্শন নাম</string>\n    <string name=\"hint_content_warning\">সতর্কবার্তা</string>\n    <string name=\"hint_compose\">কি হচ্ছে?</string>\n    <string name=\"hint_domain\">কোন ইনস্ট্যান্স?</string>\n    <string name=\"confirmation_unmuted\">ব্যবহারকারী সশব্দ</string>\n    <string name=\"confirmation_unblocked\">ব্যবহারকারী অবরোধ মুক্ত</string>\n    <string name=\"confirmation_reported\">পাঠানো হয়েছে!</string>\n    <string name=\"send_media_to\">মিডিয়া শেয়ার করুন …</string>\n    <string name=\"send_post_content_to\">টুট ভাগ করুন …</string>\n    <string name=\"send_post_link_to\">টুট URL ভাগ করুন …</string>\n    <string name=\"downloading_media\">মিডিয়া ডাউনলোড করা হচ্ছে</string>\n    <string name=\"download_media\">মিডিয়া ডাউনলোড করুন</string>\n    <string name=\"action_share_as\">হিসাবে ভাগ করুন …</string>\n    <string name=\"action_open_as\">\\'%1$s হিসাবে খুলুন\\'</string>\n    <string name=\"action_copy_link\">লিঙ্ক অনুলিপি করুন</string>\n    <string name=\"download_image\">\\'%1$s ডাউনলোড হচ্ছে\\'</string>\n    <string name=\"action_open_media_n\">মিডিয়া খুলুন #%1$d</string>\n    <string name=\"title_links_dialog\">লিংকসমূহ</string>\n    <string name=\"title_mentions_dialog\">উল্লেখসমূহ</string>\n    <string name=\"title_hashtags_dialog\">হ্যাশট্যাগ</string>\n    <string name=\"action_open_faved_by\">প্রিয়গুলি দেখান</string>\n    <string name=\"action_open_reblogged_by\">সমর্থন দেখান</string>\n    <string name=\"action_open_reblogger\">সমর্থক লেখক খুলুন</string>\n    <string name=\"action_hashtags\">হ্যাশট্যাগ</string>\n    <string name=\"action_mentions\">উল্লেখসমূহ</string>\n    <string name=\"action_links\">লিংকসমূহ</string>\n    <string name=\"action_add_tab\">ট্যাব যুক্ত করুন</string>\n    <string name=\"action_emoji_keyboard\">ইমোজি কীবোর্ড</string>\n    <string name=\"action_content_warning\">সতর্কবার্তা</string>\n    <string name=\"action_toggle_visibility\">টুট দৃশ্যমানতা</string>\n    <string name=\"action_access_drafts\">ড্রাফটগুলি</string>\n    <string name=\"action_search\">অনুসন্ধান</string>\n    <string name=\"action_reject\">প্রত্যাখ্যান</string>\n    <string name=\"action_accept\">গ্রহণ</string>\n    <string name=\"action_undo\">বাতিল</string>\n    <string name=\"action_edit_own_profile\">সম্পাদন</string>\n    <string name=\"action_edit_profile\">প্রোফাইল সম্পাদনা করো</string>\n    <string name=\"action_save\">সংরক্ষণ</string>\n    <string name=\"action_open_drawer\">ড্রয়ার খুলুন</string>\n    <string name=\"action_hide_media\">মিডিয়া লুকান</string>\n    <string name=\"action_mention\">উল্লেখ</string>\n    <string name=\"action_unmute\">সশব্দ</string>\n    <string name=\"action_mute\">শব্দ বন্ধ</string>\n    <string name=\"action_share\">ভাগ</string>\n    <string name=\"action_photo_take\">ছবি তোল</string>\n    <string name=\"action_add_media\">মিডিয়া যোগ করুন</string>\n    <string name=\"action_open_in_web\">ব্রাউজারে খোলা</string>\n    <string name=\"action_view_media\">মিডিয়া</string>\n    <string name=\"action_view_follow_requests\">অনুরোধ অনুসরণ করুন</string>\n    <string name=\"action_view_blocks\">অবরুদ্ধ ব্যবহারকারী</string>\n    <string name=\"action_view_mutes\">শব্দ বন্ধ ব্যবহারকারী</string>\n    <string name=\"action_view_favourites\">প্রিয়গুলি</string>\n    <string name=\"action_view_account_preferences\">অ্যাকাউন্টের পছন্দসমূহ</string>\n    <string name=\"action_view_preferences\">পছন্দসমূহ</string>\n    <string name=\"action_view_profile\">প্রোফাইল</string>\n    <string name=\"action_close\">বদ্ধ</string>\n    <string name=\"action_retry\">পুনরায় চেষ্টা কর</string>\n    <string name=\"action_send_public\">টুট!</string>\n    <string name=\"action_send\">টুট</string>\n    <string name=\"action_delete_and_redraft\">মুছুন এবং পুনরায় ড্রাফট কর</string>\n    <string name=\"action_delete\">মুছে ফেল</string>\n    <string name=\"action_report\">রিপোর্ট</string>\n    <string name=\"action_show_reblogs\">সমর্থন দেখান</string>\n    <string name=\"action_hide_reblogs\">সমর্থন লুকান</string>\n    <string name=\"action_unblock\">অবরোধ মুক্ত</string>\n    <string name=\"action_block\">অবরুদ্ধ</string>\n    <string name=\"action_unfollow\">অনুসরণ করা বন্ধ করুন</string>\n    <string name=\"action_follow\">অনুসরণ কর</string>\n    <string name=\"action_logout_confirm\">আপনি কি অ্যাকাউন্ট %1$s থেকে লগ আউট করতে চান?</string>\n    <string name=\"action_logout\">লগ আউট</string>\n    <string name=\"action_login\">মাস্টোডনের সঙ্গে লগইন করো</string>\n    <string name=\"action_compose\">রচনা</string>\n    <string name=\"action_more\">অধিক</string>\n    <string name=\"action_unfavourite\">পছন্দ সরান</string>\n    <string name=\"action_favourite\">পছন্দ</string>\n    <string name=\"action_unreblog\">সমর্থন সরান</string>\n    <string name=\"action_reblog\">সমর্থন</string>\n    <string name=\"action_reply\">উত্তর</string>\n    <string name=\"action_quick_reply\">দ্রুত উত্তর</string>\n    <string name=\"report_comment_hint\">অতিরিক্ত মন্তব্যগুলি?</string>\n    <string name=\"report_username_format\">রিপোর্ট @%1$s</string>\n    <string name=\"footer_empty\">এখানে কিছু নেই. রিফ্রেশ করতে নিচে টানুন!</string>\n    <string name=\"message_empty\">এখানে কিছুই নেই।</string>\n    <string name=\"post_content_show_less\">বন্ধ</string>\n    <string name=\"post_content_show_more\">বিস্তৃত</string>\n    <string name=\"post_content_warning_show_less\">প্রদর্শন কম</string>\n    <string name=\"post_content_warning_show_more\">আরও দেখাও</string>\n    <string name=\"post_sensitive_media_directions\">দেখার জন্য ক্লিক করুন</string>\n    <string name=\"post_media_hidden_title\">মিডিয়া লুকানো</string>\n    <string name=\"post_sensitive_media_title\">সংবেদনশীল কন্টেন্ট</string>\n    <string name=\"title_licenses\">লাইসেন্সগুলি</string>\n    <string name=\"title_drafts\">খসড়া</string>\n    <string name=\"title_edit_profile\">আপনার প্রোফাইল সম্পাদনা করুন</string>\n    <string name=\"title_follow_requests\">অনুরোধ অনুসরণ করুন</string>\n    <string name=\"title_blocks\">অবরুদ্ধ ব্যবহারকারী</string>\n    <string name=\"title_mutes\">শব্দ বন্ধ ব্যবহারকারী</string>\n    <string name=\"abbreviated_days_ago\">%1$dদি</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dমা</string>\n    <string name=\"abbreviated_hours_ago\">%1$dঘ</string>\n    <string name=\"abbreviated_years_ago\">%1$dব</string>\n    <string name=\"post_boosted_format\">%1$s বুস্টকৃত</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"dialog_mute_hide_notifications\">বিজ্ঞপ্তি লুকাও</string>\n    <string name=\"action_unmute_desc\">আনমিউট %1$s</string>\n    <string name=\"action_unmute_domain\">আনমিউট %1$s</string>\n    <string name=\"pref_main_nav_position_option_bottom\">সবচেয়ে শেষ</string>\n    <string name=\"pref_main_nav_position_option_top\">সর্বপ্রথম</string>\n    <string name=\"pref_main_nav_position\">মূল ন্যাভিগেশন জায়গা</string>\n    <string name=\"pref_title_gradient_for_media\">লুকানো মিডিয়ার জন্য রঙিন গ্রেডিয়েন্ট ব্যবহার করি</string>\n    <string name=\"hashtags\">হ্যাশট্যাগ</string>\n    <string name=\"add_hashtag_title\">হ্যাশট্যাগ যোগ করো</string>\n    <string name=\"pref_title_confirm_reblogs\">বুস্ট করার আগে নিশ্চিত করো</string>\n    <string name=\"pref_title_show_cards_in_timelines\">টাইমলাইনে লিঙ্ক প্রিভিউ দেখাও</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">ট্যাবের মাঝে সোয়াইপ সংকেত চালু করো</string>\n    <string name=\"notification_follow_request_description\">অনুসরণ রিকোয়েস্টের বিজ্ঞপ্তি</string>\n    <string name=\"notification_follow_request_name\">অনুরোধ অনুসরণ করুন</string>\n    <string name=\"dialog_mute_warning\">নিঃশব্দ @%1$s?</string>\n    <string name=\"dialog_block_warning\">অবরুদ্ধ @%1$s?</string>\n    <string name=\"action_unmute_conversation\">আলাপ বন্ধ করো</string>\n    <string name=\"action_mute_conversation\">আলাপ বন্ধ করো</string>\n    <string name=\"warning_scheduling_interval\">মাস্টোডনের সর্বনিম্ন ৫ মিনিটের সময়সূচীর বিরতি আছে।</string>\n    <string name=\"no_drafts\">তোমার কোনো খসড়া নেই।</string>\n    <string name=\"no_scheduled_posts\">তোমার কোনো সময়সূচীত স্ট্যাটাস নেই।</string>\n    <string name=\"list\">তালিকা</string>\n    <string name=\"select_list_title\">তালিকা নির্বাচন করো</string>\n    <string name=\"description_post_bookmarked\">বুকমার্ককৃত</string>\n    <string name=\"action_view_bookmarks\">বুকমার্কগুলি</string>\n    <string name=\"action_bookmark\">বুকমার্ক</string>\n    <string name=\"title_bookmarks\">বুকমার্কগুলি</string>\n    <string name=\"about_powered_by_tusky\">টাস্কি দ্বারা চালিত</string>\n    <string name=\"post_lookup_error_format\">\\'%1$s পোস্ট অনুসন্ধানে ত্রুটি\\'</string>\n    <string name=\"action_reset_schedule\">রিসেট</string>\n    <string name=\"action_schedule_post\">নির্ধারিত টুট</string>\n    <string name=\"action_access_scheduled_posts\">নির্ধারিত টুটগুলি</string>\n    <string name=\"action_edit\">সম্পাদন</string>\n    <string name=\"title_scheduled_posts\">নির্ধারিত টুটগুলি</string>\n    <string name=\"edit_poll\">সম্পাদন</string>\n    <string name=\"poll_new_choice_hint\">পছন্দ %1$d</string>\n    <string name=\"poll_allow_multiple_choices\">একাধিক পছন্দ</string>\n    <string name=\"add_poll_choice\">পছন্দ যুক্ত করুন</string>\n    <string name=\"duration_7_days\">৭ দিন</string>\n    <string name=\"duration_3_days\">৩ দিন</string>\n    <string name=\"duration_1_day\">১ দিন</string>\n    <string name=\"duration_6_hours\">৬ ঘন্টা</string>\n    <string name=\"duration_1_hour\">১ ঘন্টা</string>\n    <string name=\"duration_30_min\">৩০ মিনিট</string>\n    <string name=\"duration_5_min\">৫ মিনিট</string>\n    <string name=\"create_poll_title\">ভোটগ্রহণ</string>\n    <string name=\"action_remove\">সরান</string>\n    <string name=\"action_add_poll\">পোল যুক্ত করুন</string>\n    <string name=\"pref_title_alway_open_spoiler\">সর্বদা সামগ্রী সতর্কতা সহ চিহ্নিত টুটগুলি প্রসারিত করুন</string>\n    <string name=\"failed_search\">অনুসন্ধান করতে ব্যর্থ</string>\n    <string name=\"title_accounts\">অ্যাকাউন্টগুলো</string>\n    <string name=\"filter_dialog_whole_word_description\">যখন শব্দ বা বাক্যাংশটি শুধুমাত্র আলফানিউমেরিক হয় তখন এটি শুধুমাত্র তখনই প্রয়োগ করা হবে যদি এটি সম্পূর্ণ শব্দটির সাথে মেলে</string>\n    <string name=\"filter_dialog_whole_word\">সম্পূর্ণ শব্দ</string>\n    <string name=\"mute_domain_warning_dialog_ok\">পুরো ডোমেইন লুকান</string>\n    <string name=\"mute_domain_warning\">আপনি কি সব %1$s ব্লক করতে চান? আপনি যে ডোমেন থেকে কোনও পাবলিক টাইমলাইনে বা আপনার বিজ্ঞপ্তিগুলিতে সামগ্রী দেখতে পাবেন না। আপনার অনুসরণকারীদের সরানো হবে।</string>\n    <string name=\"action_mute_domain\">নিঃশব্দ %1$s</string>\n    <string name=\"action_view_domain_mutes\">গোপন ডোমেইনগুলি</string>\n    <string name=\"title_domain_mutes\">গোপন ডোমেইনগুলি</string>\n    <string name=\"report_description_remote_instance\">এই একাউন্ট তা একটি অন্য সার্ভারের। রিপোর্ট এর সঙ্গে একটি বেনামি কপি ওখানে পাঠাতে চান?</string>\n    <string name=\"report_description_1\">রিপোর্ট আপনার সার্ভার মডারেটরে পাঠানো হবে। আপনি নীচের এই অ্যাকাউন্টটি কেন প্রতিবেদন করছেন তা ব্যাখ্যা করতে পারেন:</string>\n    <string name=\"failed_fetch_posts\">স্টেটাসগুলি আনতে ব্যর্থ</string>\n    <string name=\"failed_report\">রিপোর্ট করতে ব্যর্থ হয়েছে</string>\n    <string name=\"report_remote_instance\">\\'%1$s এ ফরওয়ার্ড করুন\\'</string>\n    <string name=\"hint_additional_info\">অতিরিক্ত মন্তব্যগুলি</string>\n    <string name=\"report_sent_success\">\\'%1$s এ সফলভাবে রিপোর্ট করা হয়েছে\\'</string>\n    <string name=\"button_done\">সম্পন্ন</string>\n    <string name=\"button_back\">পিছাও</string>\n    <string name=\"button_continue\">চালিয়ে যাও</string>\n    <string name=\"poll_ended_created\">আপনি তৈরি একটি নির্বাচন শেষ হয়েছে</string>\n    <string name=\"poll_ended_voted\">আপনি ভোট দিয়েছেন যে নির্বাচন এ সেটি শেষ হয়েছে</string>\n    <string name=\"poll_vote\">ভোট</string>\n    <string name=\"poll_info_closed\">বন্ধ</string>\n    <string name=\"poll_info_time_absolute\">\\'%1$s এ শেষ হবে\\'</string>\n    <string name=\"poll_info_format\"> <!-- 15 votes • 1 hour left --> %1$s • %2$s</string>\n    <string name=\"compose_preview_image_description\">ছবি %1$s এর জন্য ক্রিয়া</string>\n    <string name=\"notification_clear_text\">আপনি কি আপনার সমস্ত বিজ্ঞপ্তি স্থায়ীভাবে মুছে ফেলতে চান?</string>\n    <string name=\"compose_shortcut_short_label\">রচনা</string>\n    <string name=\"compose_shortcut_long_label\">টুট রচনা করুন</string>\n    <string name=\"filter_apply\">প্রয়োগ</string>\n    <string name=\"notifications_apply_filter\">ফিল্টার</string>\n    <string name=\"notifications_clear\">পরিষ্কার</string>\n    <string name=\"pick_hashtag_hint\"># ছাড়া হ্যাশট্যাগ</string>\n    <string name=\"hint_list_name\">নামের তালিকা</string>\n    <string name=\"title_favourites\">প্রিয়গুলো</string>\n    <string name=\"title_followers\">অনুগামিবৃন্দ</string>\n    <string name=\"title_follows\">অনুসরণ</string>\n    <string name=\"title_posts_pinned\">পিন করা</string>\n    <string name=\"title_posts_with_replies\">উত্তরের সাথে</string>\n    <string name=\"title_posts\">পোস্টগুলি</string>\n    <string name=\"title_view_thread\">টুট</string>\n    <string name=\"title_tab_preferences\">ট্যাবগুলি</string>\n    <string name=\"title_direct_messages\">সরাসরি বার্তা</string>\n    <string name=\"title_public_federated\">ফেডারেটেড</string>\n    <string name=\"title_public_local\">স্থানীয়</string>\n    <string name=\"title_notifications\">বিজ্ঞপ্তিগুলি</string>\n    <string name=\"title_home\">ঘর</string>\n    <string name=\"error_sender_account_gone\">টুট পাঠাতে গিয়ে একটি ত্রুটি ঘটেছে।</string>\n    <string name=\"error_media_upload_sending\">আপলোড করতে ব্যর্থ হয়েছে।</string>\n    <string name=\"error_media_upload_image_or_video\">ছবি এবং ভিডিও উভয় একই স্টেটাস থেকে সংযুক্ত করা যাবে না।</string>\n    <string name=\"error_media_download_permission\">মিডিয়া সংরক্ষণ করার অনুমতি প্রয়োজন।</string>\n    <string name=\"error_media_upload_permission\">মিডিয়া পড়তে অনুমতি প্রয়োজন।</string>\n    <string name=\"error_media_upload_opening\">ওই ফাইল খোলা যাবে না।</string>\n    <string name=\"error_media_upload_type\">যে ধরনের ফাইল আপলোড করা যাবে না।</string>\n    <string name=\"error_compose_character_limit\">এই স্টেটাস টি খুব দীর্ঘ!</string>\n    <string name=\"error_retrieving_oauth_token\">একটি লগইন টোকেন পেতে ব্যর্থ।</string>\n    <string name=\"error_authorization_denied\">অনুমোদন অস্বীকার করা হয়েছে।</string>\n    <string name=\"error_authorization_unknown\">একটি অজ্ঞাত প্রমাণীকরণ ত্রুটি ঘটেছে।</string>\n    <string name=\"error_no_web_browser_found\">ব্যবহার করার জন্য একটি ওয়েব ব্রাউজার খুঁজে পাওয়া যায়নি।</string>\n    <string name=\"error_failed_app_registration\">এই ইনস্ট্যান্স এর সঙ্গে প্রমাণীকরণ ব্যর্থ।</string>\n    <string name=\"error_invalid_domain\">অবৈধ ডোমেইন প্রবেশ করানো হয়েছে</string>\n    <string name=\"error_empty\">এই জায়গা খালি হতে পারে না।</string>\n    <string name=\"error_network\">একটি নেটওয়ার্ক ত্রুটি ঘটেছে! আপনার সংযোগ পরীক্ষা করে আবার চেষ্টা করুন!</string>\n    <string name=\"error_generic\">একটি ত্রুটি ঘটেছে।</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b>টি পছন্দ</item>\n        <item quantity=\"other\"><b>%1$s</b>টি পছন্দ</item>\n    </plurals>\n    <string name=\"confirmation_domain_unmuted\">%1$s দৃশ্যমান</string>\n    <string name=\"notification_subscription_format\">%1$s পোস্ট করেছে</string>\n    <string name=\"notification_follow_request_format\">%1$s তোমাকে ফলো করতে চায়</string>\n    <string name=\"notification_follow_format\">%1$s তোমাকে ফলো করেছে</string>\n    <string name=\"notification_favourite_format\">%1$s তোমার টুট বুস্ট করেছে</string>\n    <string name=\"notification_reblog_format\">%1$s তোমার টুট বুস্ট করেছে</string>\n    <string name=\"title_announcements\">ঘোষণা</string>\n    <string name=\"notification_summary_large\">%1$s,%2$s,%3$s এবং %4$d অন্যরা</string>\n    <string name=\"notification_subscription_description\">যখন আমার সদস্যতা নেওয়া কেউ টুট দেয় তখন বিজ্ঞপ্তি দিবে</string>\n    <string name=\"notification_subscription_name\">নতুন টুট</string>\n    <string name=\"pref_title_animate_custom_emojis\">বিশেষ আবেগ বানাও</string>\n    <string name=\"no_announcements\">কোনো ঘোষণা নেই।</string>\n    <string name=\"follow_requests_info\">যদিও তোমার অ্যাকাউন্ট রুদ্ধকৃত না, %1$s রা ভেবেছে এই অ্যাকাউন্টগুলোর অনুসরণ অনুরোধ তোমার পরীক্ষা করা উচিত।</string>\n    <string name=\"drafts_post_reply_removed\">যে টুটের উত্তর খসড়া করেছিলে তা মুছে ফেলা হয়েছে</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">%1$d টার বেশি সংযুক্তি পাঠানো যাবে না।</item>\n        <item quantity=\"other\">%1$d টার বেশি সংযুক্তি পাঠানো যাবে না।</item>\n    </plurals>\n    <string name=\"drafts_post_failed_to_send\">টুট পাঠাতে ব্যর্থ!</string>\n    <string name=\"drafts_failed_loading_reply\">উত্তরের তথ্য আনতে ব্যর্থ</string>\n    <string name=\"account_note_saved\">সংরক্ষিত!</string>\n    <string name=\"wellbeing_hide_stats_profile\">অবতারে পরিসংখ্যান লুকাও</string>\n    <string name=\"wellbeing_hide_stats_posts\">ছাপার পরিসংখ্যান লুকাও</string>\n    <string name=\"limit_notifications\">সময়কাল বিজ্ঞপ্তি সীমাবদ্ধ করো</string>\n    <string name=\"wellbeing_mode_notice\">তোমার মানসিক স্বাস্থে নেতিবাচক প্রভাব ফেলতে পারে এমন জিনিসগুলো লুকানো আছে। যেমন:\n\\n\n\\n - পছন্দ/বুস্ট/অনুসরণ বিজ্ঞপ্তি\n\\n - টুটে পছন্দ/বুস্ট সংখ্যা\n\\n - অবতারে অনুসরণকারী/পরিসংখ্যান\n\\n\n\\nপুশ-বিজ্ঞপ্তিতে প্রভাব পরবে না, কিন্তু বিজ্ঞপ্তি পছন্দ পাল্টাতে পারবে।</string>\n    <string name=\"account_note_hint\">এই অ্যাকাউন্ট নিয়ে তোমার ব্যক্তিগত লেখা</string>\n    <string name=\"pref_title_hide_top_toolbar\">শীর্ষস্থানীয় সরঞ্জামের শিরোনামটি লুকাও</string>\n    <string name=\"draft_deleted\">খসড়া মুছো হয়েছে</string>\n    <string name=\"review_notifications\">বিজ্ঞপ্তি</string>\n    <string name=\"pref_title_wellbeing_mode\">সুস্থতা</string>\n    <string name=\"duration_indefinite\">সময়হীন</string>\n    <string name=\"label_duration\">সময়কাল</string>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d সেকেন্ড বাকি</item>\n        <item quantity=\"other\">%1$d সেকেন্ড বাকি</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d মিনিট বাকি</item>\n        <item quantity=\"other\">%1$d মিনিট বাকি</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d ঘন্টা বাকি</item>\n        <item quantity=\"other\">%1$d ঘন্টা বাকি</item>\n    </plurals>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d দিন বাকি</item>\n        <item quantity=\"other\">%1$d দিন বাকি</item>\n    </plurals>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s জন</item>\n        <item quantity=\"other\">%1$s জন</item>\n    </plurals>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$sটি ভোট</item>\n        <item quantity=\"other\">%1$sটি ভোট</item>\n    </plurals>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s এবং %3$d আরো অন্য জন</string>\n    <string name=\"conversation_2_recipients\">%1$s এবং %2$s</string>\n    <string name=\"action_subscribe_account\">সদস্যতা</string>\n    <string name=\"action_unsubscribe_account\">সদস্যতা বাতিল</string>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> বুস্ট</item>\n        <item quantity=\"other\"><b>%1$s</b> বুস্ট</item>\n    </plurals>\n    <string name=\"account_moved_description\">%1$s স্থানান্তরিত হয়েছে এখানে:</string>\n    <string name=\"post_media_attachments\">সংযুক্তি</string>\n    <string name=\"post_media_audio\">শব্দ</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$dটি নতুন ক্রিয়া</item>\n        <item quantity=\"other\">%1$dটি নতুন ক্রিয়া</item>\n    </plurals>\n    <string name=\"notification_summary_small\">%1$s আর %2$s</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, আর %3$s</string>\n    <string name=\"notification_mention_format\">%1$s তোমাকে উল্লেখ করেছে</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-bn-rIN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">একটি ত্রুটি ঘটেছে।</string>\n    <string name=\"error_network\">একটি নেটওয়ার্ক ত্রুটি ঘটেছে! আপনার সংযোগ পরীক্ষা করে আবার চেষ্টা করুন!</string>\n    <string name=\"error_empty\">এই জায়গা খালি হতে পারে না।</string>\n    <string name=\"error_invalid_domain\">অবৈধ ডোমেইন প্রবেশ করানো হয়েছে</string>\n    <string name=\"error_failed_app_registration\">এই ইনস্ট্যান্স এর সঙ্গে প্রমাণীকরণ ব্যর্থ।</string>\n    <string name=\"error_no_web_browser_found\">ব্যবহার করার জন্য একটি ওয়েব ব্রাউজার খুঁজে পাওয়া যায়নি।</string>\n    <string name=\"error_authorization_unknown\">একটি অজ্ঞাত প্রমাণীকরণ ত্রুটি ঘটেছে।</string>\n    <string name=\"error_authorization_denied\">অনুমোদন অস্বীকার করা হয়েছে।</string>\n    <string name=\"error_retrieving_oauth_token\">একটি লগইন টোকেন পেতে ব্যর্থ।</string>\n    <string name=\"error_compose_character_limit\">এই স্টেটাস টি খুব দীর্ঘ!</string>\n    <string name=\"error_media_upload_type\">যে ধরনের ফাইল আপলোড করা যাবে না।</string>\n    <string name=\"error_media_upload_opening\">ওই ফাইল খোলা যাবে না।</string>\n    <string name=\"error_media_upload_permission\">মিডিয়া পড়তে অনুমতি প্রয়োজন।</string>\n    <string name=\"error_media_download_permission\">মিডিয়া সংরক্ষণ করার অনুমতি প্রয়োজন।</string>\n    <string name=\"error_media_upload_image_or_video\">ছবি এবং ভিডিও উভয় একই স্টেটাস থেকে সংযুক্ত করা যাবে না।</string>\n    <string name=\"error_media_upload_sending\">আপলোড করতে ব্যর্থ হয়েছে।</string>\n    <string name=\"error_sender_account_gone\">টুট পাঠাতে গিয়ে একটি ত্রুটি ঘটেছে।</string>\n    <string name=\"title_home\">ঘর</string>\n    <string name=\"title_notifications\">বিজ্ঞপ্তিগুলি</string>\n    <string name=\"title_public_local\">স্থানীয়</string>\n    <string name=\"title_public_federated\">ফেডারেটেড</string>\n    <string name=\"title_direct_messages\">সরাসরি বার্তা</string>\n    <string name=\"title_tab_preferences\">ট্যাবগুলি</string>\n    <string name=\"title_view_thread\">টুট</string>\n    <string name=\"title_posts\">পোস্টগুলি</string>\n    <string name=\"title_posts_with_replies\">উত্তরের সাথে</string>\n    <string name=\"title_posts_pinned\">পিন করা</string>\n    <string name=\"title_follows\">অনুসরণ</string>\n    <string name=\"title_followers\">অনুগামিবৃন্দ</string>\n    <string name=\"title_favourites\">প্রিয়গুলো</string>\n    <string name=\"title_mutes\">শব্দ বন্ধ ব্যবহারকারী</string>\n    <string name=\"title_blocks\">অবরুদ্ধ ব্যবহারকারী</string>\n    <string name=\"title_follow_requests\">অনুরোধ অনুসরণ করুন</string>\n    <string name=\"title_edit_profile\">আপনার প্রোফাইল সম্পাদনা করুন</string>\n    <string name=\"title_drafts\">খসড়াগুলো</string>\n    <string name=\"title_licenses\">লাইসেন্সগুলি</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s সমর্থন দিয়েছে</string>\n    <string name=\"post_sensitive_media_title\">সংবেদনশীল কন্টেন্ট</string>\n    <string name=\"post_media_hidden_title\">মিডিয়া লুকানো</string>\n    <string name=\"post_sensitive_media_directions\">দেখার জন্য ক্লিক করুন</string>\n    <string name=\"post_content_warning_show_more\">আরও দেখাও</string>\n    <string name=\"post_content_warning_show_less\">প্রদর্শন কম</string>\n    <string name=\"post_content_show_more\">বিস্তৃত</string>\n    <string name=\"post_content_show_less\">বন্ধ</string>\n    <string name=\"message_empty\">এখানে কিছুই নেই।</string>\n    <string name=\"footer_empty\">এখানে কিছু নেই. রিফ্রেশ করতে নিচে টানুন!</string>\n    <string name=\"notification_reblog_format\">%1$s সমর্থন দিয়েছে</string>\n    <string name=\"notification_favourite_format\">%1$s আপনার টুট পছন্দ করেছে</string>\n    <string name=\"notification_follow_format\">%1$s আপনাকে অনুসরণ করেছেন</string>\n    <string name=\"report_username_format\">রিপোর্ট @%1$s</string>\n    <string name=\"report_comment_hint\">অতিরিক্ত মন্তব্যগুলি?</string>\n    <string name=\"action_quick_reply\">দ্রুত উত্তর</string>\n    <string name=\"action_reply\">উত্তর</string>\n    <string name=\"action_reblog\">সমর্থন</string>\n    <string name=\"action_unreblog\">সমর্থন সরান</string>\n    <string name=\"action_favourite\">পছন্দ</string>\n    <string name=\"action_unfavourite\">পছন্দ সরান</string>\n    <string name=\"action_more\">অধিক</string>\n    <string name=\"action_compose\">রচনা</string>\n    <string name=\"action_login\">মাস্টোডনের সঙ্গে লগইন করো</string>\n    <string name=\"action_logout\">লগ আউট</string>\n    <string name=\"action_logout_confirm\">আপনি কি অ্যাকাউন্ট %1$s থেকে লগ আউট করতে চান?</string>\n    <string name=\"action_follow\">অনুসরণ কর</string>\n    <string name=\"action_unfollow\">অনুসরণ করা বন্ধ করুন</string>\n    <string name=\"action_block\">অবরুদ্ধ</string>\n    <string name=\"action_unblock\">অবরোধ মুক্ত</string>\n    <string name=\"action_hide_reblogs\">সমর্থন লুকান</string>\n    <string name=\"action_show_reblogs\">সমর্থন দেখান</string>\n    <string name=\"action_report\">রিপোর্ট</string>\n    <string name=\"action_delete\">মুছে ফেল</string>\n    <string name=\"action_delete_and_redraft\">মুছুন এবং পুনরায় ড্রাফট কর</string>\n    <string name=\"action_send\">টুট</string>\n    <string name=\"action_send_public\">টুট!</string>\n    <string name=\"action_retry\">পুনরায় চেষ্টা করা</string>\n    <string name=\"action_close\">বদ্ধ</string>\n    <string name=\"action_view_profile\">প্রোফাইল</string>\n    <string name=\"action_view_preferences\">পছন্দসমূহ</string>\n    <string name=\"action_view_account_preferences\">অ্যাকাউন্টের পছন্দসমূহ</string>\n    <string name=\"action_view_favourites\">প্রিয়গুলো</string>\n    <string name=\"action_view_mutes\">শব্দ বন্ধ ব্যবহারকারী</string>\n    <string name=\"action_view_blocks\">অবরুদ্ধ ব্যবহারকারী</string>\n    <string name=\"action_view_follow_requests\">অনুরোধ অনুসরণ করুন</string>\n    <string name=\"action_view_media\">মিডিয়া</string>\n    <string name=\"action_open_in_web\">ব্রাউজারে খোলা</string>\n    <string name=\"action_add_media\">মিডিয়া যোগ করুন</string>\n    <string name=\"action_photo_take\">ছবি তোল</string>\n    <string name=\"action_share\">ভাগ</string>\n    <string name=\"action_mute\">শব্দ বন্ধ</string>\n    <string name=\"action_unmute\">সশব্দ</string>\n    <string name=\"action_mention\">উল্লেখ</string>\n    <string name=\"action_hide_media\">মিডিয়া লুকান</string>\n    <string name=\"action_open_drawer\">ড্রয়ার খুলুন</string>\n    <string name=\"action_save\">সংরক্ষণ</string>\n    <string name=\"action_edit_profile\">প্রোফাইল সম্পাদনা করো</string>\n    <string name=\"action_edit_own_profile\">সম্পাদন</string>\n    <string name=\"action_undo\">বাতিল</string>\n    <string name=\"action_accept\">গ্রহণ</string>\n    <string name=\"action_reject\">প্রত্যাখ্যান</string>\n    <string name=\"action_search\">অনুসন্ধান</string>\n    <string name=\"action_access_drafts\">খসড়াগুলো</string>\n    <string name=\"action_toggle_visibility\">টুট দৃশ্যমানতা</string>\n    <string name=\"action_content_warning\">সতর্কবার্তা</string>\n    <string name=\"action_emoji_keyboard\">ইমোজি কীবোর্ড</string>\n    <string name=\"action_add_tab\">ট্যাব যুক্ত করুন</string>\n    <string name=\"action_links\">লিংকসমূহ</string>\n    <string name=\"action_mentions\">উল্লেখসমূহ</string>\n    <string name=\"action_hashtags\">হ্যাশট্যাগ</string>\n    <string name=\"action_open_reblogger\">সমর্থক লেখক খুলুন</string>\n    <string name=\"action_open_reblogged_by\">সমর্থন দেখান</string>\n    <string name=\"action_open_faved_by\">প্রিয়গুলি দেখান</string>\n    <string name=\"title_hashtags_dialog\">হ্যাশট্যাগ</string>\n    <string name=\"title_mentions_dialog\">উল্লেখসমূহ</string>\n    <string name=\"title_links_dialog\">লিংকসমূহ</string>\n    <string name=\"action_open_media_n\">মিডিয়া খুলুন #%1$d</string>\n    <string name=\"download_image\">%1$s ডাউনলোড হচ্ছে</string>\n    <string name=\"action_copy_link\">লিঙ্ক অনুলিপি করুন</string>\n    <string name=\"action_open_as\">%1$s হিসাবে খুলুন</string>\n    <string name=\"action_share_as\">হিসাবে ভাগ করুন …</string>\n    <string name=\"download_media\">মিডিয়া ডাউনলোড করুন</string>\n    <string name=\"downloading_media\">মিডিয়া ডাউনলোড করা হচ্ছে</string>\n    <string name=\"send_post_link_to\">টুট URL ভাগ করুন …</string>\n    <string name=\"send_post_content_to\">টুট ভাগ করুন …</string>\n    <string name=\"send_media_to\">মিডিয়া শেয়ার করুন …</string>\n    <string name=\"confirmation_reported\">পাঠানো হয়েছে!</string>\n    <string name=\"confirmation_unblocked\">ব্যবহারকারী অবরোধ মুক্ত</string>\n    <string name=\"confirmation_unmuted\">ব্যবহারকারী সশব্দ</string>\n    <string name=\"hint_domain\">কোন ইনস্ট্যান্স?</string>\n    <string name=\"hint_compose\">কি হচ্ছে?</string>\n    <string name=\"hint_content_warning\">সতর্কবার্তা</string>\n    <string name=\"hint_display_name\">প্রদর্শন নাম</string>\n    <string name=\"hint_note\">জীবনী</string>\n    <string name=\"hint_search\">অনুসন্ধান…</string>\n    <string name=\"search_no_results\">কোন ফলাফল নেই</string>\n    <string name=\"label_quick_reply\">উত্তর…</string>\n    <string name=\"label_avatar\">অবতার</string>\n    <string name=\"label_header\">হেডার</string>\n    <string name=\"link_whats_an_instance\">ইনস্ট্যান্স কি?</string>\n    <string name=\"login_connection\">সংযুক্ত হচ্ছে …</string>\n    <string name=\"dialog_whats_an_instance\">কোনও উদাহরণের ঠিকানা বা ডোমেন এখানে প্রবেশ করা যেতে পারে যেমন mastodon.social, icosahedron.website, social.tchncs.de, এবং <a href=\"https://instances.social\"> আরও! </a> \\u0020\n\\n \\u0020\n\\nআপনার যদি এখনো অ্যাকাউন্ট না থাকে তবে আপনি যে ইনস্ট্যান্সটিতে যোগ দিতে চান সেটির নামটি প্রবেশ করতে এবং সেখানে একটি অ্যাকাউন্ট তৈরি করতে পারেন। \\u0020\n\\n \\u0020\n\\nএকটি ইনস্ট্যান্স একটি একক স্থান যেখানে আপনার অ্যাকাউন্ট হোস্ট করা হয়, তবে আপনি সহজেই যোগাযোগ করতে পারেন এবং অন্যান্য ক্ষেত্রে যেমন আপনি একই সাইটে ছিলেন তা অনুসরণ করতে পারেন। \\u0020\n\\n \\u0020\n\\nআরো তথ্য <a href=\"https://joinmastodon.org\"> joinmastodon.org </a> এ পাওয়া যেতে পারে। </string>\n    <string name=\"dialog_title_finishing_media_upload\">মিডিয়া আপলোড সমাপ্ত করা হচ্ছে</string>\n    <string name=\"dialog_message_uploading_media\">আপলোড হচ্ছে …</string>\n    <string name=\"dialog_download_image\">ডাউনলোড</string>\n    <string name=\"dialog_message_cancel_follow_request\">অনুসরণ অনুরোধ প্রত্যাহার?</string>\n    <string name=\"dialog_unfollow_warning\">এই অ্যাকাউন্টটি অনুসরণ করবেন না?</string>\n    <string name=\"dialog_delete_post_warning\">এই টুট টি মুছে ফেলবেন?</string>\n    <string name=\"dialog_redraft_post_warning\">এই টুট টি মুছে ফেলবেন এবং পুনরায় ড্রাফট করবেন?</string>\n    <string name=\"visibility_public\">সর্বজনীন: পাবলিক টাইমলাইনে পোস্ট কর</string>\n    <string name=\"visibility_unlisted\">তালিকাভুক্ত নয়: সর্বজনীন সময়সূচীগুলিতে দেখাবেন না</string>\n    <string name=\"visibility_private\">শুধুমাত্র অনুসরণকারীদের: শুধুমাত্র অনুসরণকারীদের পোস্ট করুন</string>\n    <string name=\"visibility_direct\">সরাসরি: শুধুমাত্র উল্লেখ ব্যবহারকারীদের পোস্ট করুন</string>\n    <string name=\"pref_title_edit_notification_settings\">বিজ্ঞপ্তিগুলি</string>\n    <string name=\"pref_title_notifications_enabled\">বিজ্ঞপ্তিগুলি</string>\n    <string name=\"pref_title_notification_alerts\">সতর্কতা</string>\n    <string name=\"pref_title_notification_alert_sound\">একটি শব্দ সঙ্গে অবহিত</string>\n    <string name=\"pref_title_notification_alert_vibrate\">কম্পন সঙ্গে অবহিত</string>\n    <string name=\"pref_title_notification_alert_light\">আলো সঙ্গে অবহিত</string>\n    <string name=\"pref_title_notification_filters\">যখন আমাকে অবহিত</string>\n    <string name=\"pref_title_appearance_settings\">উপস্থিতি</string>\n    <string name=\"pref_title_app_theme\">এপ্লিকেশন এর থিম</string>\n    <string name=\"pref_title_timelines\">টাইমলাইন</string>\n    <string name=\"pref_title_timeline_filters\">ফিল্টার</string>\n    <string name=\"app_them_dark\">অন্ধকার</string>\n    <string name=\"app_theme_light\">আলো</string>\n    <string name=\"app_theme_black\">কালো</string>\n    <string name=\"app_theme_auto\">সূর্যাস্ত স্বয়ংক্রিয়</string>\n    <string name=\"app_theme_system\">সিস্টেম ডিজাইন ব্যবহার করুন</string>\n    <string name=\"pref_title_browser_settings\">ব্রাউজার</string>\n    <string name=\"pref_title_custom_tabs\">ক্রোম কাস্টম ট্যাব ব্যবহার করুন</string>\n    <string name=\"pref_title_language\">ভাষা</string>\n    <string name=\"pref_title_bot_overlay\">বট জন্য সূচক প্রদর্শন করুন</string>\n    <string name=\"pref_title_animate_gif_avatars\">GIF অবতার অ্যানিমেশন করুন</string>\n    <string name=\"pref_title_post_filter\">টাইমলাইন ফিল্টারিং</string>\n    <string name=\"pref_title_post_tabs\">ট্যাবগুলি</string>\n    <string name=\"pref_title_show_boosts\">সমর্থন দেখান</string>\n    <string name=\"pref_title_show_replies\">উত্তর প্রদর্শন করুন</string>\n    <string name=\"pref_title_show_media_preview\">মিডিয়া পূর্বরূপ ডাউনলোড করুন</string>\n    <string name=\"pref_title_proxy_settings\">প্রক্সি</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP প্রক্সি</string>\n    <string name=\"pref_title_http_proxy_enable\">HTTP প্রক্সি সক্ষম কর</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP প্রক্সি সার্ভার</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP প্রক্সি পোর্ট</string>\n    <string name=\"pref_default_post_privacy\">ডিফল্ট পোস্ট গোপনীয়তা</string>\n    <string name=\"pref_default_media_sensitivity\">সর্বদা সংবেদনশীল হিসাবে মিডিয়া চিহ্নিত করুন</string>\n    <string name=\"pref_publishing\">প্রকাশনা (সার্ভারের সাথে সিঙ্ক করা)</string>\n    <string name=\"pref_failed_to_sync\">সেটিংস সিঙ্ক করতে ব্যর্থ</string>\n    <string name=\"post_privacy_public\">সর্বজনীন</string>\n    <string name=\"post_privacy_unlisted\">অতালিকাভুক্ত</string>\n    <string name=\"post_privacy_followers_only\">শুধুমাত্র অনুগামিবৃন্দ</string>\n    <string name=\"pref_post_text_size\">স্থিতি টেক্সট আকার</string>\n    <string name=\"post_text_size_smallest\">কনিষ্ঠ</string>\n    <string name=\"post_text_size_small\">ছোট</string>\n    <string name=\"post_text_size_medium\">মাঝারি</string>\n    <string name=\"post_text_size_large\">বড়</string>\n    <string name=\"post_text_size_largest\">বৃহত্তম</string>\n    <string name=\"notification_mention_name\">নতুন উল্লেখসমূহ</string>\n    <string name=\"notification_mention_descriptions\">নতুন উল্লেখ সম্পর্কে বিজ্ঞপ্তি</string>\n    <string name=\"notification_follow_name\">নতুন অনুসরণকারী</string>\n    <string name=\"notification_follow_description\">নতুন অনুসরণকারী সম্পর্কে বিজ্ঞপ্তি</string>\n    <string name=\"notification_boost_name\">সমর্থনগুলি</string>\n    <string name=\"notification_boost_description\">আপনার টুটগুলি সমর্থন হলে বিজ্ঞপ্তিগুলি</string>\n    <string name=\"notification_favourite_name\">প্রিয়গুলো</string>\n    <string name=\"notification_favourite_description\">আপনার টুটগুলি প্রিয় হিসাবে চিহ্নিত পেতে বিজ্ঞপ্তি</string>\n    <string name=\"notification_poll_name\">নির্বাচনগুলি</string>\n    <string name=\"notification_poll_description\">শেষ হয়েছে যে নির্বাচনগুলির সম্পর্কে বিজ্ঞপ্তি</string>\n    <string name=\"notification_mention_format\">%1$s আপনাকে উল্লিখিত করেছে</string>\n    <string name=\"notification_summary_large\">%1$s,%2$s,%3$s এবং %4$d আরো অন্য জন</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, আর %3$s</string>\n    <string name=\"notification_summary_small\">%1$s আর %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\"/>\n        <item quantity=\"other\">%1$d নতুন মিথস্ক্রিয়া</item>\n    </plurals>\n    <string name=\"description_account_locked\">লক অ্যাকাউন্ট</string>\n    <string name=\"about_title_activity\">সম্পর্কিত</string>\n    <string name=\"about_tusky_version\">টাস্কি %1$s</string>\n    <string name=\"about_tusky_license\">টাস্কি মুক্ত এবং ওপেন সোর্স সফ্টওয়্যার। এটি GNU জেনারেল পাবলিক লাইসেন্স সংস্করণ 3 এর অধীনে লাইসেন্সযুক্ত। আপনি এখানে লাইসেন্স দেখতে পারেন: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">প্রকল্প ওয়েবসাইট:\n\\nhttps://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">বাগ রিপোর্ট এবং বৈশিষ্ট্য অনুরোধ:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">টাস্কির প্রোফাইল</string>\n    <string name=\"post_share_content\">টুট এর কন্টেন্ট ভাগ করুন</string>\n    <string name=\"post_share_link\">টুট এর সাথে লিংক ভাগ করুন</string>\n    <string name=\"post_media_images\">চিত্রগুলি</string>\n    <string name=\"post_media_video\">ভিডিও</string>\n    <string name=\"state_follow_requested\">অনুরোধ অনুসরণ করুন</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">%1$dy এ</string>\n    <string name=\"abbreviated_in_days\">%1$dd এ</string>\n    <string name=\"abbreviated_in_hours\">%1$dh এ</string>\n    <string name=\"abbreviated_in_minutes\">%1$dm এ</string>\n    <string name=\"abbreviated_in_seconds\">%1$ds এ</string>\n    <string name=\"abbreviated_years_ago\">%1$dy</string>\n    <string name=\"abbreviated_days_ago\">%1$dd</string>\n    <string name=\"abbreviated_hours_ago\">%1$dh</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"follows_you\">আপনাকে অনুসরন করে</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">সর্বদা সংবেদনশীল কন্টেন্ট প্রদর্শন করুন</string>\n    <string name=\"title_media\">মিডিয়া</string>\n    <string name=\"replying_to\">\\@%1$s কে উত্তর দিচ্ছে</string>\n    <string name=\"load_more_placeholder_text\">আরো লোড কর</string>\n    <string name=\"pref_title_public_filter_keywords\">পাবলিক টাইমলাইন</string>\n    <string name=\"pref_title_thread_filter_keywords\">কথাবার্তা</string>\n    <string name=\"filter_addition_title\">ফিল্টার যোগ করুন</string>\n    <string name=\"filter_edit_title\">ফিল্টার সম্পাদনা করুন</string>\n    <string name=\"filter_dialog_remove_button\">সরাও</string>\n    <string name=\"filter_dialog_update_button\">আপডেট</string>\n    <string name=\"filter_add_description\">বাক্য ফিল্টার কর</string>\n    <string name=\"add_account_name\">অ্যাকাউন্ট যোগ করুন</string>\n    <string name=\"add_account_description\">নতুন ম্যাস্টোডোন অ্যাকাউন্ট যোগ করুন</string>\n    <string name=\"action_lists\">তালিকাসমূহ</string>\n    <string name=\"title_lists\">তালিকাসমূহ</string>\n    <string name=\"error_create_list\">তালিকা তৈরি করা যায়নি</string>\n    <string name=\"error_rename_list\">তালিকা নামকরণ করা যায়নি</string>\n    <string name=\"error_delete_list\">তালিকা মুছে ফেলা যায়নি</string>\n    <string name=\"action_create_list\">একটি তালিকা তৈরি করুন</string>\n    <string name=\"action_rename_list\">তালিকা পুনঃ নামকরণ কর</string>\n    <string name=\"action_delete_list\">তালিকা মুছে দিন</string>\n    <string name=\"hint_search_people_list\">আপনি অনুসরণ মানুষের জন্য অনুসন্ধান করুন</string>\n    <string name=\"action_add_to_list\">তালিকায় অ্যাকাউন্ট যোগ করুন</string>\n    <string name=\"action_remove_from_list\">তালিকা থেকে অ্যাকাউন্ট সরান</string>\n    <string name=\"compose_active_account_description\">অ্যাকাউন্ট %1$s থেকে পোস্ট করা হচ্ছে</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\"/>\n        <item quantity=\"other\">দৃষ্টি প্রতিবন্ধী জন্য বর্ণনা করুন\n\\n(%1$d অক্ষর সীমা)</item>\n    </plurals>\n    <string name=\"action_set_caption\">ক্যাপশন সেট করুন</string>\n    <string name=\"action_remove\">সরান</string>\n    <string name=\"lock_account_label\">অ্যাকাউন্ট লক করুন</string>\n    <string name=\"lock_account_label_description\">অনুসারী অনুমোদন করার জন্য আপনাকে প্রয়োজন</string>\n    <string name=\"compose_save_draft\">ড্রাফট সংরক্ষণ?</string>\n    <string name=\"send_post_notification_title\">টুট পাঠানো হচ্ছে …</string>\n    <string name=\"send_post_notification_error_title\">টুট পাঠাতে গিয়ে একটি ত্রুটি ঘটেছে</string>\n    <string name=\"send_post_notification_channel_name\">টুট পাঠানো হচ্ছে</string>\n    <string name=\"send_post_notification_cancel_title\">পাঠানো বাতিল</string>\n    <string name=\"send_post_notification_saved_content\">টুট এর একটি কপি আপনার ড্রাফটে সংরক্ষণ করা হয়েছে</string>\n    <string name=\"action_compose_shortcut\">রচনা</string>\n    <string name=\"error_no_custom_emojis\">আপনার ইনস্ট্যান্স %1$s এর কোনো কাস্টম ইমোজিস নেই</string>\n    <string name=\"emoji_style\">ইমোজি স্টাইল</string>\n    <string name=\"system_default\">সিস্টেমের ডিফল্ট</string>\n    <string name=\"download_fonts\">আপনাকে প্রথমে এই ইমোজি সেটগুলি ডাউনলোড করতে হবে</string>\n    <string name=\"performing_lookup_title\">অনুসন্ধান করা হচ্ছে …</string>\n    <string name=\"expand_collapse_all_posts\">সমস্ত স্টেটাস প্রসারিত/সংকুচিত করুন</string>\n    <string name=\"action_open_post\">টুট খুলুন</string>\n    <string name=\"restart_required\">অ্যাপ্লিকেশন পুনরায় আরম্ভ করা প্রয়োজন</string>\n    <string name=\"restart_emoji\">এই পরিবর্তনগুলি প্রয়োগ করার জন্য আপনাকে টাস্কি পুনরায় চালু করতে হবে</string>\n    <string name=\"later\">পরবর্তীতে</string>\n    <string name=\"restart\">পুনরারম্ভ</string>\n    <string name=\"caption_systememoji\">আপনার ডিভাইসের ডিফল্ট ইমোজি সেট</string>\n    <string name=\"caption_blobmoji\">অ্যান্ড্রয়েড ৪.৪-৭.১ থেকে পরিচিত ব্লোব ইমোজিস</string>\n    <string name=\"caption_twemoji\">ম্যাস্টোডোন এর মান ইমোজি সেট</string>\n    <string name=\"caption_notoemoji\">গুগল এর বর্তমান ইমোজি সেট</string>\n    <string name=\"download_failed\">ডাউনলোড ব্যর্থ হয়েছে</string>\n    <string name=\"profile_badge_bot_text\">বট</string>\n    <string name=\"account_moved_description\">%1$s স্থানান্তরিত করেছে এতে:</string>\n    <string name=\"reblog_private\">মূল শ্রোতাদেড় সমথন পাঠাও</string>\n    <string name=\"unreblog_private\">সমর্থন ফেরত</string>\n    <string name=\"license_description\">টাস্কি নিম্নলিখিত ওপেন সোর্স প্রকল্প থেকে কোড এবং সম্পদ রয়েছে:</string>\n    <string name=\"license_apache_2\">এপাচে লাইসেন্সের অধীনে লাইসেন্স (নীচের কপি)</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">প্রোফাইল মেটাডেটা</string>\n    <string name=\"profile_metadata_add\">তথ্য যোগ করুন</string>\n    <string name=\"profile_metadata_label_label\">লেবেল</string>\n    <string name=\"profile_metadata_content_label\">উপাদান</string>\n    <string name=\"pref_title_absolute_time\">পরম সময় ব্যবহার করুন</string>\n    <string name=\"label_remote_account\">নীচের তথ্য অসম্পূর্ণভাবে ব্যবহারকারীর প্রোফাইল প্রতিফলিত হতে পারে। ব্রাউজারে সম্পূর্ণ প্রোফাইল খুলতে টিপুন।</string>\n    <string name=\"unpin_action\">আনপিন</string>\n    <string name=\"pin_action\">পিন</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> প্রিয়</item>\n        <item quantity=\"other\"><b>%1$s</b> পছন্দসই</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> বুস্ট</item>\n        <item quantity=\"other\"><b>%1$s</b> বুস্ট</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">দ্বারা সর্মথন</string>\n    <string name=\"title_favourited_by\">দ্বারা পছন্দ</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s এবং %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s এবং %3$d আরো অন্য জন</string>\n    <string name=\"description_post_media\">মিডিয়া: %1$s</string>\n    <string name=\"description_post_cw\">সতর্কবার্তা: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">বর্ণনা নাই</string>\n    <string name=\"description_post_reblogged\">আবার ব্লগ</string>\n    <string name=\"description_post_favourited\">পছন্দ</string>\n    <string name=\"description_visibility_public\">সর্বজনীন</string>\n    <string name=\"description_visibility_unlisted\">অতালিকাভুক্ত</string>\n    <string name=\"description_visibility_private\">অনুগামিবৃন্দ</string>\n    <string name=\"description_visibility_direct\">সরাসরি</string>\n    <string name=\"description_poll\">পছন্দগুলি সহ নর্বাচন: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"hint_list_name\">নামের তালিকা</string>\n    <string name=\"pick_hashtag_hint\"># ছাড়া হ্যাশট্যাগ</string>\n    <string name=\"notifications_clear\">পরিষ্কার</string>\n    <string name=\"notifications_apply_filter\">ফিল্টার</string>\n    <string name=\"filter_apply\">প্রয়োগ</string>\n    <string name=\"compose_shortcut_long_label\">টুট রচনা করুন</string>\n    <string name=\"compose_shortcut_short_label\">রচনা</string>\n    <string name=\"notification_clear_text\">আপনি কি আপনার সমস্ত বিজ্ঞপ্তি স্থায়ীভাবে মুছে ফেলতে চান?</string>\n    <string name=\"compose_preview_image_description\">ছবি %1$s এর জন্য ক্রিয়া</string>\n    <string name=\"poll_info_format\"> <!-- ১৫ ভোট • ১ ঘন্টা বাকি --> %1$s • %2$s</string>\n    <string name=\"poll_info_time_absolute\">%1$s এ শেষ হবে</string>\n    <string name=\"poll_info_closed\">বন্ধ</string>\n    <string name=\"poll_vote\">ভোট</string>\n    <string name=\"poll_ended_voted\">আপনি ভোট দিয়েছেন যে নির্বাচন এ সেটি শেষ হয়েছে</string>\n    <string name=\"poll_ended_created\">আপনি তৈরি একটি নির্বাচন শেষ হয়েছে</string>\n    <string name=\"button_continue\">চালিয়ে যাও</string>\n    <string name=\"button_back\">পিছাও</string>\n    <string name=\"button_done\">সম্পন্ন</string>\n    <string name=\"report_sent_success\">%1$s এ সফলভাবে রিপোর্ট করা হয়েছে</string>\n    <string name=\"hint_additional_info\">অতিরিক্ত মন্তব্যগুলি</string>\n    <string name=\"report_remote_instance\">%1$s এ ফরওয়ার্ড করুন</string>\n    <string name=\"failed_report\">রিপোর্ট করতে ব্যর্থ হয়েছে</string>\n    <string name=\"failed_fetch_posts\">স্টেটাসগুলি আনতে ব্যর্থ</string>\n    <string name=\"report_description_1\">রিপোর্ট আপনার সার্ভার মডারেটরে পাঠানো হবে। আপনি নীচের এই অ্যাকাউন্টটি কেন প্রতিবেদন করছেন তা ব্যাখ্যা করতে পারেন:</string>\n    <string name=\"report_description_remote_instance\">এই একাউন্ট তা একটি অন্য সার্ভারের। রিপোর্ট এর সঙ্গে একটি বেনামি কপি ওখানে পাঠাতে চান?</string>\n    <string name=\"title_domain_mutes\">গোপন ডোমেইনগুলি</string>\n    <string name=\"action_view_domain_mutes\">গোপন ডোমেইনগুলি</string>\n    <string name=\"action_mute_domain\">নিঃশব্দ %1$s</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s লুকোনো না</string>\n    <string name=\"mute_domain_warning\">আপনি কি সব %1$s ব্লক করতে চান? আপনি যে ডোমেন থেকে কোনও পাবলিক টাইমলাইনে বা আপনার বিজ্ঞপ্তিগুলিতে সামগ্রী দেখতে পাবেন না। আপনার অনুসরণকারীদের সরানো হবে।</string>\n    <string name=\"mute_domain_warning_dialog_ok\">পুরো ডোমেইন লুকান</string>\n    <string name=\"filter_dialog_whole_word\">সম্পূর্ণ শব্দ</string>\n    <string name=\"filter_dialog_whole_word_description\">যখন শব্দ বা বাক্যাংশটি শুধুমাত্র আলফানিউমেরিক হয় তখন এটি শুধুমাত্র তখনই প্রয়োগ করা হবে যদি এটি সম্পূর্ণ শব্দটির সাথে মেলে</string>\n    <string name=\"pref_title_alway_open_spoiler\">সর্বদা সামগ্রী সতর্কতা সহ চিহ্নিত টুটগুলি প্রসারিত করুন</string>\n    <string name=\"title_accounts\">অক্কোউন্টগুলি</string>\n    <string name=\"failed_search\">অনুসন্ধান করতে ব্যর্থ</string>\n    <string name=\"action_add_poll\">পোল যুক্ত করুন</string>\n    <string name=\"create_poll_title\">ভোটগ্রহণ</string>\n    <string name=\"duration_5_min\">৫ মিনিট</string>\n    <string name=\"duration_30_min\">৩০ মিনিট</string>\n    <string name=\"duration_1_hour\">১ ঘন্টা</string>\n    <string name=\"duration_6_hours\">৬ ঘন্টা</string>\n    <string name=\"duration_1_day\">১ দিন</string>\n    <string name=\"duration_3_days\">৩ দিন</string>\n    <string name=\"duration_7_days\">৭ দিন</string>\n    <string name=\"add_poll_choice\">পছন্দ যুক্ত করুন</string>\n    <string name=\"poll_allow_multiple_choices\">একাধিক পছন্দ</string>\n    <string name=\"poll_new_choice_hint\">পছন্দ %1$d</string>\n    <string name=\"edit_poll\">সম্পাদন</string>\n    <string name=\"title_scheduled_posts\">নির্ধারিত টুটগুলি</string>\n    <string name=\"action_edit\">সম্পাদন</string>\n    <string name=\"action_access_scheduled_posts\">নির্ধারিত টুটগুলি</string>\n    <string name=\"action_schedule_post\">নির্ধারিত টুট</string>\n    <string name=\"action_reset_schedule\">রিসেট</string>\n    <string name=\"about_powered_by_tusky\">টাস্কি দ্বারা চালিত</string>\n    <string name=\"post_lookup_error_format\">%1$s পোস্ট অনুসন্ধানে ত্রুটি</string>\n    <string name=\"action_view_bookmarks\">বুকমার্কগুলি</string>\n    <string name=\"action_bookmark\">বুকমার্ক</string>\n    <string name=\"notification_follow_request_format\">%1$s আপনাকে অনুসরণ করার জন্য অনুরোধ করেছে</string>\n    <string name=\"title_bookmarks\">বুকমার্কগুলি</string>\n    <string name=\"dialog_mute_hide_notifications\">বিজ্ঞপ্তি লুকাও</string>\n    <string name=\"dialog_mute_warning\">নিঃশব্দ @%1$s?</string>\n    <string name=\"dialog_block_warning\">অবরুদ্ধ @%1$s?</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d দিন বাকি</item>\n        <item quantity=\"other\">%1$d দিন বাকি</item>\n    </plurals>\n    <string name=\"pref_title_gradient_for_media\">লুকানো মিডিয়ার জন্য রঙিন গ্রেডিয়েন্ট ব্যবহার করি</string>\n    <string name=\"action_unmute_conversation\">আলাপ বন্ধ করো</string>\n    <string name=\"action_mute_conversation\">আলাপ বন্ধ করো</string>\n    <string name=\"action_unmute_domain\">আনমিউট %1$s</string>\n    <string name=\"action_unmute_desc\">আনমিউট %1$s</string>\n    <string name=\"notification_follow_request_name\">অনুরোধ অনুসরণ করুন</string>\n    <string name=\"pref_title_confirm_reblogs\">বুস্ট করার আগে নিশ্চিত করো</string>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d সেকেন্ড বাকি</item>\n        <item quantity=\"other\">%1$d সেকেন্ড বাকি</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d মিনিট বাকি</item>\n        <item quantity=\"other\">%1$d মিনিট বাকি</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d ঘন্টা বাকি</item>\n        <item quantity=\"other\">%1$d ঘন্টা বাকি</item>\n    </plurals>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s জন</item>\n        <item quantity=\"other\">%1$s জন</item>\n    </plurals>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$sটি ভোট</item>\n        <item quantity=\"other\">%1$sটি ভোট</item>\n    </plurals>\n    <string name=\"list\">তালিকা</string>\n    <string name=\"select_list_title\">তালিকা নির্বাচন করো</string>\n    <string name=\"hashtags\">হ্যাশট্যাগ</string>\n    <string name=\"add_hashtag_title\">হ্যাশট্যাগ যোগ করো</string>\n    <string name=\"description_post_bookmarked\">বুকমার্ককৃত</string>\n    <string name=\"notification_follow_request_description\">অনুসরণ রিকোয়েস্টের বিজ্ঞপ্তি</string>\n    <string name=\"pref_main_nav_position_option_bottom\">সবচেয়ে শেষ</string>\n    <string name=\"pref_main_nav_position_option_top\">সর্বপ্রথম</string>\n    <string name=\"pref_main_nav_position\">মূল ন্যাভিগেশন জায়গা</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">ট্যাবের মাঝে সোয়াইপ সংকেত চালু করো</string>\n    <string name=\"pref_title_show_cards_in_timelines\">টাইমলাইনে লিঙ্ক প্রিভিউ দেখাও</string>\n    <string name=\"no_scheduled_posts\">তোমার কোনো সময়সূচীত স্ট্যাটাস নেই।</string>\n    <string name=\"no_drafts\">তোমার কোনো খসড়া নেই।</string>\n    <string name=\"warning_scheduling_interval\">মাস্টোডনের সর্বনিম্ন ৫ মিনিটের সময়সূচীর বিরতি আছে।</string>\n    <string name=\"pref_title_hide_top_toolbar\">শীর্ষস্থানীয় সরঞ্জামদণ্ডের শিরোনামটি লুকান</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-ca/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">S\\'ha produït un error.</string>\n    <string name=\"error_empty\">Això no pot estar buit.</string>\n    <string name=\"error_invalid_domain\">El domini que s\\'ha introduït no és vàlid</string>\n    <string name=\"error_failed_app_registration\">No s\\'ha pogut autenticar amb aquesta instància. Si això continua, proveu d\\'iniciar sessió al navegador des del menú.</string>\n    <string name=\"error_no_web_browser_found\">No s\\'ha trobat cap navegador web per a utilitzar.</string>\n    <string name=\"error_authorization_unknown\">S\\'ha produït un error d\\'autorització no identificat. Si això continua, proveu d\\'iniciar sessió al navegador des del menú.</string>\n    <string name=\"error_authorization_denied\">S\\'ha denegat l\\'autorització. Si esteu segur que heu proporcionat les credencials correctes, proveu d\\'iniciar sessió al navegador des del menú.</string>\n    <string name=\"error_retrieving_oauth_token\">No s\\'ha pogut obtenir el token d\\'inici de sessió. Si això continua, proveu d\\'iniciar sessió al navegador des del menú.</string>\n    <string name=\"error_compose_character_limit\">La publicació és massa llarga!</string>\n    <string name=\"error_media_upload_type\">No es pot pujar aquest tipus de fitxer.</string>\n    <string name=\"error_media_upload_opening\">No es pot obrir aquest tipus de fitxer.</string>\n    <string name=\"error_media_upload_permission\">Cal permís d\\'accés a l\\'emmagatzematge.</string>\n    <string name=\"error_media_download_permission\">Cal permís d\\'escriptura a l\\'emmagatzematge.</string>\n    <string name=\"error_media_upload_image_or_video\">Les imatges i els vídeos no es poden adjuntar a la mateixa publicació.</string>\n    <string name=\"error_media_upload_sending\">Ha fallat la pujada.</string>\n    <string name=\"title_home\">Inici</string>\n    <string name=\"title_notifications\">Notificacions</string>\n    <string name=\"title_public_local\">Local</string>\n    <string name=\"title_public_federated\">Federació</string>\n    <string name=\"title_view_thread\">Fil</string>\n    <string name=\"title_posts\">Publicacions</string>\n    <string name=\"title_follows\">Seguits</string>\n    <string name=\"title_followers\">Seguidors</string>\n    <string name=\"title_favourites\">Preferits</string>\n    <string name=\"title_mutes\">Usuaris silenciats</string>\n    <string name=\"title_blocks\">Usuaris blocats</string>\n    <string name=\"title_follow_requests\">Peticions de seguiment</string>\n    <string name=\"title_edit_profile\">Edita el perfil</string>\n    <string name=\"title_drafts\">Esborranys</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s ha impulsat</string>\n    <string name=\"post_sensitive_media_title\">Contingut sensible</string>\n    <string name=\"post_sensitive_media_directions\">Fes clic per a visualitzar-lo</string>\n    <string name=\"post_content_warning_show_more\">Mostra\\'n més</string>\n    <string name=\"post_content_warning_show_less\">Mostra\\'n menys</string>\n    <string name=\"footer_empty\">No hi res aquí. Llisca avall per a actualitzar!</string>\n    <string name=\"notification_reblog_format\">%1$s ha impulsat la teva publicació</string>\n    <string name=\"notification_favourite_format\">%1$s ha marcat com a preferida la teva publicació</string>\n    <string name=\"notification_follow_format\">%1$s et segueix</string>\n    <string name=\"report_username_format\">Denuncia @%1$s</string>\n    <string name=\"report_comment_hint\">Cap comentari addicional?</string>\n    <string name=\"action_reply\">Respon</string>\n    <string name=\"action_reblog\">Impulsa</string>\n    <string name=\"action_favourite\">Preferit</string>\n    <string name=\"action_more\">Més</string>\n    <string name=\"action_compose\">Escriure</string>\n    <string name=\"action_login\">Inicia sessió amb Tusky</string>\n    <string name=\"action_logout\">Tanca sessió</string>\n    <string name=\"action_follow\">Segueix</string>\n    <string name=\"action_unfollow\">Deixa de seguir</string>\n    <string name=\"action_block\">Bloca</string>\n    <string name=\"action_unblock\">Deixa de blocar</string>\n    <string name=\"action_report\">Denuncia</string>\n    <string name=\"action_delete\">Elimina</string>\n    <string name=\"action_send\">PUBLICA</string>\n    <string name=\"action_send_public\">PUBLICA!</string>\n    <string name=\"action_retry\">Torna a intentar-ho</string>\n    <string name=\"action_close\">Tanca</string>\n    <string name=\"action_view_profile\">Perfil</string>\n    <string name=\"action_view_preferences\">Preferències</string>\n    <string name=\"action_view_favourites\">Preferits</string>\n    <string name=\"action_view_mutes\">Usuaris silenciats</string>\n    <string name=\"action_view_blocks\">Usuaris blocats</string>\n    <string name=\"action_view_follow_requests\">Peticions de seguiment</string>\n    <string name=\"action_view_media\">Multimèdia</string>\n    <string name=\"action_open_in_web\">Obre al navegador</string>\n    <string name=\"action_add_media\">Afegeix multimèdia</string>\n    <string name=\"action_photo_take\">Fes una foto</string>\n    <string name=\"action_share\">Comparteix</string>\n    <string name=\"action_mute\">Silencia</string>\n    <string name=\"action_unmute\">Deixa de silenciar</string>\n    <string name=\"action_mention\">Menciona</string>\n    <string name=\"action_hide_media\">Amaga el multimèdia</string>\n    <string name=\"action_save\">Desa</string>\n    <string name=\"action_edit_profile\">Edita el perfil</string>\n    <string name=\"action_undo\">Desfés</string>\n    <string name=\"action_accept\">D\\'acord</string>\n    <string name=\"action_reject\">Rebutja</string>\n    <string name=\"action_search\">Cerca</string>\n    <string name=\"action_access_drafts\">Esborranys</string>\n    <string name=\"download_image\">S\\'està baixant %1$s</string>\n    <string name=\"action_copy_link\">Copia l\\'enllaç</string>\n    <string name=\"send_post_link_to\">Comparteix l\\'URL de la publicació a…</string>\n    <string name=\"send_post_content_to\">Comparteix la publicació a…</string>\n    <string name=\"confirmation_reported\">Enviat!</string>\n    <string name=\"confirmation_unblocked\">Usuari desblocat</string>\n    <string name=\"confirmation_unmuted\">Usuari sense silenciar</string>\n    <string name=\"hint_domain\">Quina instància?</string>\n    <string name=\"hint_compose\">Què està passant?</string>\n    <string name=\"hint_content_warning\">Avís de contingut</string>\n    <string name=\"hint_display_name\">Nom visible</string>\n    <string name=\"hint_note\">Biografia</string>\n    <string name=\"hint_search\">Cerca…</string>\n    <string name=\"search_no_results\">No hi ha cap resultat</string>\n    <string name=\"label_avatar\">Avatar</string>\n    <string name=\"label_header\">Capçalera</string>\n    <string name=\"link_whats_an_instance\">Què és una instància?</string>\n    <string name=\"login_connection\">S\\'està connectant…</string>\n    <string name=\"dialog_whats_an_instance\">Aquí pots introduir l\\'adreça o domini de qualsevol instància, \\u0020com ara mastodont.cat, mastodon.social, icosahedron.website o \\u0020<a href=\"https://instances.social\">molts més!</a> \\u0020\n\\n \n\\nSi encara no tens cap copte, pots introduir el nom de la instància on t\\'agradaria \\u0020unir-te i crear un compte allà. \n\\n \n\\nUna instànica és un únic lloc on el teu compte s\\'hostatja \\u0020, però pots comunicar-te fàcilment i seguir amics d\\'altres instàncies com si fossiu en el mateix lloc. \\u0020\n\\n \n\\nTens més informació a <a href=\"https://joinmastodon.org\">joinmastodon.org</a>. \\u0020</string>\n    <string name=\"dialog_title_finishing_media_upload\">S\\'està finalitzant la pujada de material multimèdia</string>\n    <string name=\"dialog_message_uploading_media\">S\\'està pujant…</string>\n    <string name=\"dialog_download_image\">Baixa</string>\n    <string name=\"dialog_unfollow_warning\">Vols deixar de seguir aquest compte?</string>\n    <string name=\"visibility_public\">Pública: és visible a la cronologia pública</string>\n    <string name=\"visibility_unlisted\">Sense llistar: no és visible a les cronologies públiques</string>\n    <string name=\"visibility_private\">Només seguidors: només és visible per al teus seguidors</string>\n    <string name=\"visibility_direct\">Directa: només és visible per als usuaris mencionats</string>\n    <string name=\"pref_title_edit_notification_settings\">Notificacions</string>\n    <string name=\"pref_title_notifications_enabled\">Notificacions</string>\n    <string name=\"pref_title_notification_alerts\">Alertes</string>\n    <string name=\"pref_title_notification_alert_sound\">Notifica amb un so</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Notifica amb una vibració</string>\n    <string name=\"pref_title_notification_alert_light\">Notifica amb el llum led</string>\n    <string name=\"pref_title_notification_filters\">Notifica\\'m si</string>\n    <string name=\"pref_title_appearance_settings\">Aparença</string>\n    <string name=\"pref_title_browser_settings\">Navegador</string>\n    <string name=\"pref_title_custom_tabs\">Pestanyes personalitzades del Chrome</string>\n    <string name=\"pref_title_post_filter\">Filtre de la cronologia</string>\n    <string name=\"pref_title_post_tabs\">Pestanyes</string>\n    <string name=\"pref_title_show_boosts\">Mostra els impulsos</string>\n    <string name=\"pref_title_show_replies\">Mostra les respostes</string>\n    <string name=\"pref_title_show_media_preview\">Mostra les previsualitzacions</string>\n    <string name=\"pref_default_post_privacy\">Privacitat per defecte de les publicacions</string>\n    <string name=\"pref_publishing\">Publicació</string>\n    <string name=\"post_privacy_public\">Pública</string>\n    <string name=\"post_privacy_unlisted\">Sense llistar</string>\n    <string name=\"post_privacy_followers_only\">Només seguidors</string>\n    <string name=\"pref_post_text_size\">Mida de text de l\\'estat</string>\n    <string name=\"notification_mention_name\">Noves mencions</string>\n    <string name=\"notification_mention_descriptions\">Notificacions sobre mencions noves</string>\n    <string name=\"notification_follow_name\">Nous seguidors</string>\n    <string name=\"notification_follow_description\">Notificacions sobre nous seguidors</string>\n    <string name=\"notification_boost_name\">Impulsos</string>\n    <string name=\"notification_boost_description\">Notificacions quan s\\'impulsen les teves publicacions</string>\n    <string name=\"notification_favourite_name\">Preferits</string>\n    <string name=\"notification_favourite_description\">Notificacions quan les teves publicacions es marquen com a preferides</string>\n    <string name=\"notification_mention_format\">%1$s et mencionen</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s i %4$d més</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s i %3$s</string>\n    <string name=\"notification_summary_small\">%1$s i %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d interacció nova</item>\n        <item quantity=\"many\"/>\n        <item quantity=\"other\">%1$d interaccions noves</item>\n    </plurals>\n    <string name=\"description_account_locked\">Compte blocat</string>\n    <string name=\"about_title_activity\">Quant a</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_tusky_license\">Tusky és programari gratuït, lliure i de codi obert. Està llicenciat en els termes de la Llicència Pública General GNU versió 3. Podeu trobar les llicència aquí: https://www.gnu.org/licenses/gpl-3.0.ca.html</string>\n    <!-- note to translators: the url can be changed to link to the localized version of the license -->\n    <string name=\"about_project_site\">Lloc web del projecte:\n\\n https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Informes d\\'errors i peticions de funcionalitats:\n\\n https://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Perfil del Tusky</string>\n    <string name=\"post_share_content\">Comparteix el contingut de la publicació</string>\n    <string name=\"post_share_link\">Comparteix l\\'enllaç a la publicació</string>\n    <string name=\"post_media_images\">Imatges</string>\n    <string name=\"post_media_video\">Vídeo</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">en %1$d anys</string>\n    <string name=\"abbreviated_in_days\">en %1$dd</string>\n    <string name=\"abbreviated_in_hours\">en %1$dh</string>\n    <string name=\"abbreviated_in_minutes\">en %1$dm</string>\n    <string name=\"abbreviated_in_seconds\">en %1$ds</string>\n    <string name=\"abbreviated_years_ago\">%1$d anys</string>\n    <string name=\"abbreviated_days_ago\">%1$dd</string>\n    <string name=\"abbreviated_hours_ago\">%1$dh</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"follows_you\">Et segueix</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Mostra el contingut no apte (NSFW)</string>\n    <string name=\"title_media\">Multimèdia</string>\n    <string name=\"replying_to\">En resposta a @%1$s</string>\n    <string name=\"load_more_placeholder_text\">carrega\\'n més</string>\n    <string name=\"poll_vote\">Vota</string>\n    <string name=\"error_sender_account_gone\">S\\'ha produït un error en publicar.</string>\n    <string name=\"title_tab_preferences\">Pestanyes</string>\n    <string name=\"title_licenses\">Llicències</string>\n    <string name=\"post_content_show_more\">Amplia</string>\n    <string name=\"action_quick_reply\">Resposta ràpida</string>\n    <string name=\"action_unfavourite\">Elimineu els preferits</string>\n    <string name=\"action_view_account_preferences\">Preferències del compte</string>\n    <string name=\"action_edit_own_profile\">Edita</string>\n    <string name=\"title_direct_messages\">Missatges directes</string>\n    <string name=\"message_empty\">No hi ha res aquí.</string>\n    <string name=\"action_unreblog\">Elimina l\\'impuls</string>\n    <string name=\"error_network\">S\\'ha produït un error de connexió! Comproveu la connexió i torneu-ho a provar!</string>\n    <string name=\"post_media_hidden_title\">Multimèdia amagada</string>\n    <string name=\"post_content_show_less\">Amaga</string>\n    <string name=\"action_logout_confirm\">Estàs segur de tancar la sessió de %1$s?</string>\n    <string name=\"action_hide_reblogs\">Amaga els impulsos</string>\n    <string name=\"action_show_reblogs\">Mostra els impulsos</string>\n    <string name=\"action_delete_and_redraft\">Elimina i reescriu</string>\n    <string name=\"action_open_drawer\">Obre el menú</string>\n    <string name=\"action_toggle_visibility\">Visibilitat de la publicació</string>\n    <string name=\"action_content_warning\">Contingut sensible</string>\n    <string name=\"action_add_tab\">Afegir una pestanya</string>\n    <string name=\"action_links\">Enllaços</string>\n    <string name=\"action_mentions\">Mencions</string>\n    <string name=\"action_hashtags\">Hashtags</string>\n    <string name=\"action_open_faved_by\">Mostra els favorits</string>\n    <string name=\"title_hashtags_dialog\">Hashtags</string>\n    <string name=\"title_mentions_dialog\">Mencions</string>\n    <string name=\"title_links_dialog\">Enllaç</string>\n    <string name=\"action_share_as\">Comparteix com a…</string>\n    <string name=\"download_media\">Baixa el fitxer</string>\n    <string name=\"send_media_to\">Compartir la imatge a …</string>\n    <string name=\"state_follow_requested\">Petició enviada</string>\n    <string name=\"title_posts_with_replies\">Amb respostes</string>\n    <string name=\"action_emoji_keyboard\">Teclat d\\'emojis</string>\n    <string name=\"action_open_media_n\">Obrir el media #%1$d</string>\n    <string name=\"action_open_as\">Obre com a %1$s</string>\n    <string name=\"downloading_media\">S\\'està Descarregant media</string>\n    <string name=\"label_quick_reply\">Resposta …</string>\n    <string name=\"dialog_message_cancel_follow_request\">Revocar la petició de seguiment?</string>\n    <string name=\"dialog_delete_post_warning\">Vols eliminar aquest toot?</string>\n    <string name=\"dialog_redraft_post_warning\">Vols eliminar i reescriure aquesta publicació?</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_timelines\">Cronologia</string>\n    <string name=\"pref_title_timeline_filters\">Filtres</string>\n    <string name=\"app_them_dark\">Fosc</string>\n    <string name=\"app_theme_light\">Clar</string>\n    <string name=\"app_theme_black\">Negre</string>\n    <string name=\"app_theme_auto\">Brillantor automàtica</string>\n    <string name=\"app_theme_system\">Utilitzar el tema del sistema</string>\n    <string name=\"pref_title_language\">Idioma</string>\n    <string name=\"pref_title_proxy_settings\">Proxy</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP proxy</string>\n    <string name=\"pref_title_http_proxy_enable\">Activar el proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_server\">Servidor del proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_port\">Port del proxy HTTP</string>\n    <string name=\"pref_default_media_sensitivity\">Marcar sempre els medias com a sensibles</string>\n    <string name=\"pref_failed_to_sync\">Error al sincronitzar els paràmetres</string>\n    <string name=\"post_text_size_smallest\">Petit</string>\n    <string name=\"post_text_size_small\">Petit</string>\n    <string name=\"post_text_size_medium\">Mig</string>\n    <string name=\"post_text_size_large\">Gran</string>\n    <string name=\"post_text_size_largest\">Més grand</string>\n    <string name=\"notification_poll_name\">Enquestes</string>\n    <string name=\"pref_title_thread_filter_keywords\">Converses</string>\n    <string name=\"filter_addition_title\">Afegir un filtre</string>\n    <string name=\"filter_edit_title\">Modificar un filtre</string>\n    <string name=\"filter_dialog_remove_button\">Eliminar</string>\n    <string name=\"add_account_name\">Afegir un compte</string>\n    <string name=\"action_open_reblogger\">Obre l\\'autor de l\\'impuls</string>\n    <string name=\"action_open_reblogged_by\">Mostra els impulsos</string>\n    <string name=\"notification_poll_description\">Notificacions d\\'enquestes que han finalitzat</string>\n    <string name=\"pref_title_public_filter_keywords\">Línia de temps públiques</string>\n    <string name=\"filter_dialog_update_button\">Actualització</string>\n    <string name=\"filter_add_description\">Frase per filtrar</string>\n    <string name=\"add_account_description\">Afegir un compte de Mastodont</string>\n    <string name=\"action_lists\">Llistes</string>\n    <string name=\"title_lists\">Llistes</string>\n    <string name=\"error_create_list\">És impossible crear la llista</string>\n    <string name=\"error_rename_list\">Impossible reanomenar la llista</string>\n    <string name=\"error_delete_list\">És impossible suprimir la llista</string>\n    <string name=\"action_create_list\">Crear una llista</string>\n    <string name=\"action_rename_list\">Reanomenar la llista</string>\n    <string name=\"action_delete_list\">Suprimir la llista</string>\n    <string name=\"hint_search_people_list\">Cercar persones que segueixes</string>\n    <string name=\"action_add_to_list\">Afegir un compte a la llista</string>\n    <string name=\"action_remove_from_list\">Suprimir un compte de la llista</string>\n    <string name=\"compose_active_account_description\">\"Publicar com a  %1$s\"</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Descriu per a persones amb discapacitat visual\n\\n(%1$d límit de caràcters)</item>\n        <item quantity=\"many\"/>\n        <item quantity=\"other\">Descriu per a persones amb discapacitat visual\n\\n(%1$d límit de caràcters)</item>\n    </plurals>\n    <string name=\"action_set_caption\">Afegir una llegenda</string>\n    <string name=\"action_remove\">Eliminar</string>\n    <string name=\"lock_account_label\">Protegir el compte</string>\n    <string name=\"lock_account_label_description\">S\\'haurà d\\'admetre els seguidors manualment</string>\n    <string name=\"compose_save_draft\">Guardar l\\'esborrany?</string>\n    <string name=\"send_post_notification_title\">S\\'està publicant…</string>\n    <string name=\"send_post_notification_error_title\">Error en publicar</string>\n    <string name=\"send_post_notification_channel_name\">S\\'esatan enviant les publicacions</string>\n    <string name=\"send_post_notification_cancel_title\">Envio anul·lat</string>\n    <string name=\"send_post_notification_saved_content\">S\\'ha guardat una còpia de la publicació als esborranys</string>\n    <string name=\"action_compose_shortcut\">Escriure</string>\n    <string name=\"error_no_custom_emojis\">La teva instància %1$s no te emojis personalitzats</string>\n    <string name=\"emoji_style\">Estil dels emojis</string>\n    <string name=\"system_default\">Sistema per defecte</string>\n    <string name=\"download_fonts\">Hauràs de descarregar el joc d\\'emojis</string>\n    <string name=\"performing_lookup_title\">Cercant…</string>\n    <string name=\"expand_collapse_all_posts\">Expandir/ocultar tots els estats</string>\n    <string name=\"action_open_post\">Obre la publicació</string>\n    <string name=\"restart_required\">Cal reiniciar l\\'aplicació</string>\n    <string name=\"restart_emoji\">Has de reiniciar l\\'aplicació per tal d\\'aplicar aquests canvis</string>\n    <string name=\"later\">Més tard</string>\n    <string name=\"restart\">Reiniciar</string>\n    <string name=\"caption_systememoji\">Conjunt d\\'emojis predeterminats del teu dispositiu</string>\n    <string name=\"caption_blobmoji\">Els emojis d\\'Android 4.4 a 7.1</string>\n    <string name=\"caption_twemoji\">Emojis estàndard de Mastodont</string>\n    <string name=\"download_failed\">Descàrrega fallida</string>\n    <string name=\"profile_badge_bot_text\">Bot</string>\n    <string name=\"account_moved_description\">%1$s s\\'ha trasllat a:</string>\n    <string name=\"reblog_private\">Tornar a impulsar</string>\n    <string name=\"unreblog_private\">No impulsar</string>\n    <string name=\"license_description\">Tusky conté codi i recursos dels següents projectes:</string>\n    <string name=\"license_apache_2\">Sota llicencia Apache (text a sota)</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">Metadades del perfil</string>\n    <string name=\"profile_metadata_add\">Afegir dada</string>\n    <string name=\"profile_metadata_label_label\">Etiqueta</string>\n    <string name=\"profile_metadata_content_label\">Contingut</string>\n    <string name=\"pref_title_absolute_time\">Utilitzar el temps absolut</string>\n    <string name=\"label_remote_account\">La informació de sota pot mostrar el perfil incomplert de l\\'usuari. Clica per obrir el perfil complert al navegador.</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> Favorit</item>\n        <item quantity=\"many\"></item>\n        <item quantity=\"other\"><b>%1$s</b> Favorits</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> impuls</item>\n        <item quantity=\"many\"></item>\n        <item quantity=\"other\"><b>%1$s</b> impulsos</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">Impulsat per</string>\n    <string name=\"title_favourited_by\">Marcat favorit per</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s i %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s i %3$d més</string>\n    <string name=\"description_post_media\">Mèdia : %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Sense descripció</string>\n    <string name=\"description_post_favourited\">Favorits</string>\n    <string name=\"description_visibility_public\">Públic</string>\n    <string name=\"description_visibility_unlisted\">Sense llistar</string>\n    <string name=\"description_visibility_private\">Seguidors</string>\n    <string name=\"description_visibility_direct\">Directe</string>\n    <string name=\"hint_list_name\">Nom de la llista</string>\n    <string name=\"pick_hashtag_hint\">Hashtag sense #</string>\n    <string name=\"notifications_clear\">Netejar</string>\n    <string name=\"notifications_apply_filter\">Filtrar</string>\n    <string name=\"filter_apply\">Aplicar</string>\n    <string name=\"compose_shortcut_long_label\">Escriure una publicació</string>\n    <string name=\"compose_shortcut_short_label\">Escriure</string>\n    <string name=\"pref_title_bot_overlay\">Mostra l\\'indicador dels bots</string>\n    <string name=\"notification_clear_text\">Vols netejar totes les notificacions permanentment?</string>\n    <string name=\"poll_info_format\"> <!-- 15 vots • queda 1 hora --> %1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s vot</item>\n        <item quantity=\"many\"/>\n        <item quantity=\"other\">%1$s vots</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">Acaba a %1$s</string>\n    <string name=\"poll_info_closed\">tancat</string>\n    <string name=\"poll_ended_voted\">L\\'enquesta on has votat està tancada</string>\n    <string name=\"poll_ended_created\">La enquesta que heu creat ha finalitzat</string>\n    <string name=\"description_post_cw\">Advertència: %1$s</string>\n    <string name=\"title_posts_pinned\">Fixat</string>\n    <string name=\"unpin_action\">No fixis</string>\n    <string name=\"pin_action\">Fixar</string>\n    <string name=\"description_post_reblogged\">Respost</string>\n    <string name=\"compose_preview_image_description\">Accions per a la imatge %1$s</string>\n    <string name=\"pref_title_animate_gif_avatars\">Activar l\\'animació dels GIF</string>\n    <string name=\"title_domain_mutes\">Dominis ocults</string>\n    <string name=\"action_view_domain_mutes\">Dominis ocults</string>\n    <string name=\"action_mute_domain\">Silenciar %1$s</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s visible</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Amagar el domini sencer</string>\n    <string name=\"pref_title_alway_open_spoiler\">Mostra sempre obertes les publicacions marcades amb avisos de contingut</string>\n    <string name=\"filter_dialog_whole_word\">Paraula sencera</string>\n    <string name=\"caption_notoemoji\">Ventall actual d\\'emojis de Google</string>\n    <string name=\"description_poll\">Enquesta amb opcions: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"button_continue\">Continuar</string>\n    <string name=\"button_back\">Enrere</string>\n    <string name=\"button_done\">Fet</string>\n    <string name=\"hint_additional_info\">Comentaris addicionals</string>\n    <string name=\"report_remote_instance\">Reenviar a %1$s</string>\n    <string name=\"failed_report\">Report erroni</string>\n    <string name=\"failed_fetch_posts\">Error obtenint els estats</string>\n    <string name=\"report_description_1\">L\\'informe s\\'enviarà al moderador del teu servidor. Pots afegir una explicació del motiu d\\'aquest informe del compte a sota:</string>\n    <string name=\"title_accounts\">Comptes</string>\n    <string name=\"mute_domain_warning\">Estàs segur que vols bloquejar tot de %1$s? No veuràs cap contingut de domini ni en els fils públics ni a les teves notificacions. Els teus seguidors d\\'aquest domini seran eliminats.</string>\n    <string name=\"filter_dialog_whole_word_description\">Quan la paraula o la frase siguin només alfanumèrica , només s\\'aplicarà si coincideix amb tota la paraula</string>\n    <string name=\"report_sent_success\">\\@%1$s reportat satisfactoriament</string>\n    <string name=\"report_description_remote_instance\">El compte és d\\'un altre servidor. Enviar, igualment, una copia anònima del report?</string>\n    <string name=\"failed_search\">Cerca fallida</string>\n    <string name=\"duration_1_hour\">1 hora</string>\n    <string name=\"duration_6_hours\">6 hores</string>\n    <string name=\"edit_poll\">Edita</string>\n    <string name=\"action_add_poll\">Afegeix una enquesta</string>\n    <string name=\"create_poll_title\">Enquesta</string>\n    <string name=\"duration_5_min\">5 minuts</string>\n    <string name=\"duration_30_min\">30 minuts</string>\n    <string name=\"duration_1_day\">1 dia</string>\n    <string name=\"duration_3_days\">3 dies</string>\n    <string name=\"duration_7_days\">7 dies</string>\n    <string name=\"add_poll_choice\">Afegeix una tria</string>\n    <string name=\"poll_allow_multiple_choices\">Múltiples tries</string>\n    <string name=\"poll_new_choice_hint\">Tria %1$d</string>\n    <string name=\"title_bookmarks\">Preferits</string>\n    <string name=\"title_scheduled_posts\">Publicacions programades</string>\n    <string name=\"action_bookmark\">Preferit</string>\n    <string name=\"action_edit\">Edita</string>\n    <string name=\"action_view_bookmarks\">Preferits</string>\n    <string name=\"action_access_scheduled_posts\">Publicacions programades</string>\n    <string name=\"action_schedule_post\">Programa la publicació</string>\n    <string name=\"action_reset_schedule\">Reiniciar</string>\n    <string name=\"about_powered_by_tusky\">Desenvolupat per Tusky</string>\n    <string name=\"description_post_bookmarked\">S\\'ha afegit a les adreces d\\'interès</string>\n    <string name=\"select_list_title\">Seleccionar la llista</string>\n    <string name=\"list\">Llista</string>\n    <string name=\"post_lookup_error_format\">S\\'ha produït un error en cercar la publicació %1$s</string>\n    <string name=\"no_scheduled_posts\">No tens cap estat planificat.</string>\n    <string name=\"no_drafts\">No teniu cap esborrany.</string>\n    <string name=\"warning_scheduling_interval\">L\\'interval mínim de planificació a Mastodon és de 5 minuts.</string>\n    <string name=\"notification_follow_request_name\">Peticions de seguiment</string>\n    <string name=\"pref_title_confirm_reblogs\">Mostra el diàleg de confirmació abans de promoure</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Mostra les previsualitzacions dels enllaços en els fils</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Habilita el gest de desplaçament per despleçar-te entre pestanyes</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s persona</item>\n        <item quantity=\"many\"/>\n        <item quantity=\"other\">%1$s persones</item>\n    </plurals>\n    <string name=\"hashtags\">Hashtags</string>\n    <string name=\"add_hashtag_title\">Afegir hashtag</string>\n    <string name=\"notification_follow_request_description\">Notificacions sobre sol·licituds de seguiment</string>\n    <string name=\"dialog_mute_warning\">Silenciar @%1$s?</string>\n    <string name=\"dialog_block_warning\">Bloquejar @%1$s?</string>\n    <string name=\"action_unmute_conversation\">No silenciar la conversació</string>\n    <string name=\"action_mute_conversation\">Silencia la conversa</string>\n    <string name=\"notification_follow_request_format\">%1$s ha sol·licitat seguir-te</string>\n    <string name=\"pref_main_nav_position_option_bottom\">A baix</string>\n    <string name=\"pref_main_nav_position_option_top\">A dalt</string>\n    <string name=\"pref_main_nav_position\">Posició de navegació principal</string>\n    <string name=\"pref_title_gradient_for_media\">Mostra els degradats de colors per als mitjans ocults</string>\n    <string name=\"dialog_mute_hide_notifications\">Amagar notificacions</string>\n    <string name=\"action_unmute_domain\">Deixar de silenciar %1$s</string>\n    <string name=\"action_unmute_desc\">Deixar de silenciar %1$s</string>\n    <string name=\"review_notifications\">Revisió d\\'avisos</string>\n    <string name=\"account_note_saved\">S\\'ha desat!</string>\n    <string name=\"account_note_hint\">Les vostres notes quant a aquest compte</string>\n    <string name=\"pref_title_wellbeing_mode\">Benestar</string>\n    <string name=\"pref_title_hide_top_toolbar\">Amaga el títol de la barra d\\'eines superior</string>\n    <string name=\"no_announcements\">No hi ha cap avís.</string>\n    <string name=\"duration_indefinite\">Indefinit</string>\n    <string name=\"label_duration\">Durada</string>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">falta %1$d segon</item>\n        <item quantity=\"many\"/>\n        <item quantity=\"other\">falten %1$d segons</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">falta %1$d minut</item>\n        <item quantity=\"many\"/>\n        <item quantity=\"other\">falten %1$d minuts</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">falta %1$d hora</item>\n        <item quantity=\"many\"/>\n        <item quantity=\"other\">falten %1$d hores</item>\n    </plurals>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">falta %1$d dia</item>\n        <item quantity=\"many\"/>\n        <item quantity=\"other\">falten %1$d dies</item>\n    </plurals>\n    <string name=\"post_media_attachments\">Adjuncions</string>\n    <string name=\"post_media_audio\">Àudio</string>\n    <string name=\"notification_subscription_description\">Notificacions quan algú a qui estàs subscrit publica una publicació nova</string>\n    <string name=\"notification_subscription_name\">Publicacions noves</string>\n    <string name=\"pref_title_animate_custom_emojis\">emojis personalitzats animats</string>\n    <string name=\"notification_subscription_format\">%1$s acaba de fer una publicació</string>\n    <string name=\"title_announcements\">Avisos</string>\n    <string name=\"drafts_post_reply_removed\">S\\'ha eliminat la publicació a la qual vau fer un esborrany de resposta</string>\n    <string name=\"draft_deleted\">S\\'ha eliminat l\\'esborrany</string>\n    <string name=\"drafts_failed_loading_reply\">No s\\'ha pogut carregar la informació de la resposta</string>\n    <string name=\"drafts_post_failed_to_send\">No s\\'ha pogut publicar!</string>\n    <string name=\"dialog_delete_list_warning\">Segur que voleu esborrar la llista %1$s?</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">No podeu penjar més de %1$d fitxers adjunts multimèdia.</item>\n        <item quantity=\"many\"/>\n        <item quantity=\"other\">No podeu penjar més de %1$d fitxers adjunts multimèdia.</item>\n    </plurals>\n    <string name=\"wellbeing_hide_stats_profile\">Amaga les estadístiques quantitatives dels perfils</string>\n    <string name=\"wellbeing_hide_stats_posts\">Amaga les estadístiques quantitatives de les publicacions</string>\n    <string name=\"limit_notifications\">Limita les notificacions de la cronologia</string>\n    <string name=\"error_could_not_load_login_page\">No s\\'ha pogut carregar la pàgina d\\'inici de sessió.</string>\n    <string name=\"error_loading_account_details\">No s\\'han pogut carregar els detalls del compte</string>\n    <string name=\"action_add_or_remove_from_list\">Afegeix o elimina de la llista</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"dialog_delete_conversation_warning\">Vols suprimir aquesta conversa?</string>\n    <string name=\"failed_to_add_to_list\">No s\\'ha pogut afegir el compte a la llista</string>\n    <string name=\"error_multimedia_size_limit\">Els fitxers de vídeo i àudio no poden superar la mida de %1$s MB.</string>\n    <string name=\"error_image_edit_failed\">La imatge no s\\'ha pogut editar.</string>\n    <string name=\"action_dismiss\">Descartar</string>\n    <string name=\"pref_title_http_proxy_port_message\">El port hauria d\\'estar entre %1$d i %2$d</string>\n    <string name=\"status_count_one_plus\">+1</string>\n    <string name=\"title_edits\">Edicions</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Inhabilitat</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;no definit&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;no vàlid&gt;</string>\n    <string name=\"error_following_hashtags_unsupported\">Aquesta instància no admet seguir hashtags.</string>\n    <string name=\"notification_sign_up_format\">%1$s s\\'ha registrat</string>\n    <string name=\"pref_show_self_username_always\">Sempre</string>\n    <string name=\"pref_show_self_username_disambiguate\">Quan s\\'inicien la sessió amb diversos comptes</string>\n    <string name=\"pref_show_self_username_never\">Mai</string>\n    <string name=\"error_unmuting_hashtag_format\">S\\'ha produït un error en activar #%1$s</string>\n    <string name=\"error_muting_hashtag_format\">S\\'ha produït un error en silenciar #%1$s</string>\n    <string name=\"post_edited\">S\\'ha editat %1$s</string>\n    <string name=\"notification_update_name\">Edicions de publicacions</string>\n    <string name=\"action_post_failed\">La càrrega ha fallat</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">La teva publicació no s\\'ha pogut penjar i s\\'ha desat als esborranys.\n\\n\n\\nNo s\\'ha pogut contactar amb el servidor o bé ha rebutjat la publicació.</item>\n        <item quantity=\"many\"/>\n        <item quantity=\"other\">Les teves publicacions no s\\'han pogut penjar i s\\'han desat als esborranys.\n\\n\n\\nNo s\\'ha pogut contactar amb el servidor o ha rebutjat les publicacions.</item>\n    </plurals>\n    <string name=\"action_post_failed_show_drafts\">Mostra esborranys</string>\n    <string name=\"action_post_failed_do_nothing\">Descartar</string>\n    <string name=\"send_account_link_to\">Comparteix l\\'URL del compte a…</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"notification_update_format\">%1$s ha editat la seva publicació</string>\n    <string name=\"notification_report_format\">Nou informe sobre %1$s</string>\n    <string name=\"notification_header_report_format\">%1$s ha informat %2$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d publicacions adjuntes</string>\n    <string name=\"action_unbookmark\">Elimina el marcador</string>\n    <string name=\"action_delete_conversation\">Suprimeix la conversa</string>\n    <string name=\"notification_sign_up_name\">Inscripcions</string>\n    <string name=\"action_continue_edit\">Continua editant</string>\n    <string name=\"action_discard\">Descartar els canvis</string>\n    <string name=\"hint_media_description_missing\">L\\'arxiu multimèdia han de tenir una descripció.</string>\n    <string name=\"pref_default_post_language\">Idioma de publicació per defecte</string>\n    <string name=\"notification_update_description\">Les notificacions quan s\\'editen les publicacions amb les quals has interaccionat</string>\n    <string name=\"notification_report_description\">Notificacions sobre informes de moderació</string>\n    <string name=\"status_created_at_now\">ara</string>\n    <string name=\"action_browser_login\">Inicieu sessió amb el navegador</string>\n    <string name=\"action_add_reaction\">afegir reacció</string>\n    <string name=\"action_share_account_link\">Comparteix l\\'enllaç al compte</string>\n    <string name=\"action_share_account_username\">Comparteix el nom d\\'usuari del compte</string>\n    <string name=\"action_details\">Detalls</string>\n    <string name=\"send_account_username_to\">Comparteix el nom d\\'usuari del compte a…</string>\n    <string name=\"account_username_copied\">S\\'ha copiat el nom d\\'usuari</string>\n    <string name=\"confirmation_hashtag_unfollowed\">#%1$s deixat de seguir</string>\n    <string name=\"notification_report_name\">Informes</string>\n    <string name=\"error_following_hashtag_format\">Error seguint #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Error en deixar de seguir #%1$s</string>\n    <string name=\"error_status_source_load\">No s\\'ha pogut carregar la font d\\'estat des del servidor.</string>\n    <string name=\"title_followed_hashtags\">Hashtags seguits</string>\n    <string name=\"notification_sign_up_description\">Notificacions sobre nous usuaris</string>\n    <string name=\"title_login\">Iniciar Sessió</string>\n    <string name=\"a11y_label_loading_thread\">S\\'està carregant el fil</string>\n    <string name=\"compose_save_draft_loses_media\">Guardar l\\'esborrany? (Els fitxers adjunts es tornaran a penjar quan recupereu l\\'esborrany.)</string>\n    <string name=\"instance_rule_info\">En iniciar sessió, accepteu les regles de %1$s.</string>\n    <string name=\"action_edit_image\">Edita la imatge</string>\n    <string name=\"failed_to_pin\">No s\\'ha pogut fixar</string>\n    <string name=\"failed_to_unpin\">No s\\'ha pogut desfixar</string>\n    <string name=\"description_post_language\">Idioma de la publicació</string>\n    <string name=\"duration_14_days\">14 dies</string>\n    <string name=\"follow_requests_info\">Tot i que el vostre compte no està bloquejat, el personal de %1$s va pensar que potser voldreu revisar les sol·licituds de seguiment d\\'aquests comptes manualment.</string>\n    <string name=\"report_category_other\">Altres</string>\n    <string name=\"pref_title_reading_order\">Ordre de lectura</string>\n    <string name=\"pref_reading_order_oldest_first\">El més vell primer</string>\n    <string name=\"pref_reading_order_newest_first\">El més nou primer</string>\n    <string name=\"duration_30_days\">30 dies</string>\n    <string name=\"failed_to_remove_from_list\">No s\\'ha pogut eliminar el compte de la llista</string>\n    <string name=\"duration_60_days\">60 dies</string>\n    <string name=\"duration_90_days\">90 dies</string>\n    <string name=\"duration_no_change\">(Sense canvis)</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Redacta la publicació</string>\n    <string name=\"pref_title_confirm_favourites\">Mostra el diàleg de confirmació abans de marcar com a preferit</string>\n    <string name=\"action_unfollow_hashtag_format\">Deixar de seguir #%1$s?</string>\n    <string name=\"compose_unsaved_changes\">Tens canvis no desats.</string>\n    <string name=\"set_focus_description\">Toqueu o arrossegueu el cercle per triar el punt focal que sempre serà visible a les miniatures.</string>\n    <string name=\"pref_title_show_self_username\">Mostra el nom d\\'usuari a les barres d\\'eines</string>\n    <string name=\"action_set_focus\">Estableix el punt d\\'enfocament</string>\n    <string name=\"description_login\">Funciona en la majoria dels casos. No es filtra cap dada a altres aplicacions.</string>\n    <string name=\"description_browser_login\">Pot ser compatible amb mètodes d\\'autenticació addicionals, però requereix un navegador compatible.</string>\n    <string name=\"no_lists\">No tens cap llista.</string>\n    <string name=\"delete_scheduled_post_warning\">Vols suprimir aquesta publicació programada?</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"report_category_violation\">Incompliment de la regla</string>\n    <string name=\"report_category_spam\">Spam</string>\n    <string name=\"duration_180_days\">180 dies</string>\n    <string name=\"duration_365_days\">365 dies</string>\n    <string name=\"wellbeing_mode_notice\">S\\'amagarà algunes dades que poden afectar el vostre benestar mental. Això inclou:\n\\n\n\\n - Notificacions de favorits/impulsos/seguiments\n\\n - Preferits/augmenta el nombre de publicacions\n\\n - Estadístiques de seguidors/publicació als perfils\n\\n\n\\n Les notificacions push no es veuran afectades, però podeu revisar les vostres preferències de notificació manualment.</string>\n    <string name=\"account_date_joined\">S\\'ha unit el %1$s</string>\n    <string name=\"saving_draft\">Desant l\\'esborrany…</string>\n    <string name=\"description_post_edited\">Editat</string>\n    <string name=\"status_edit_info\">%1$s ha editat</string>\n    <string name=\"action_subscribe_account\">Subscriu-te</string>\n    <string name=\"action_unsubscribe_account\">Cancel·la la subscripció</string>\n    <string name=\"instance_rule_title\">%1$s regles</string>\n    <string name=\"mute_notifications_switch\">Silencia les notificacions</string>\n    <string name=\"status_created_info\">%1$s ha creat</string>\n    <string name=\"title_public_trending_hashtags\">Hashtags populars</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d persones parlen del hashtag %2$s</string>\n    <string name=\"total_usage\">Ús total</string>\n    <string name=\"total_accounts\">Total de comptes</string>\n    <string name=\"dialog_follow_hashtag_title\">Segueix hashtag</string>\n    <string name=\"action_refresh\">Actualitzar</string>\n    <string name=\"notification_unknown_name\">Desconegut</string>\n    <string name=\"status_filter_placeholder_label_format\">Filtrat: %1$s</string>\n    <string name=\"pref_title_account_filter_keywords\">Perfils</string>\n    <string name=\"status_filtered_show_anyway\">Mostra de totes maneres</string>\n    <string name=\"socket_timeout_exception\">El contacte amb el teu servidor ha trigat massa</string>\n    <string name=\"ui_error_unknown\">motiu desconegut</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-ckb/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"hint_compose\">چی خەریکه ڕوودەدات؟</string>\n    <string name=\"hint_domain\">کام نموونە؟</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s نەشاراوە</string>\n    <string name=\"confirmation_unmuted\">بەکارهێنەر نەگۆڕاو</string>\n    <string name=\"confirmation_unblocked\">بەکارهێنەر بەربەست نەکراوە</string>\n    <string name=\"confirmation_reported\">ناردن!</string>\n    <string name=\"send_media_to\">هاوبەشکردنی میدیا بۆ…</string>\n    <string name=\"send_post_content_to\">هاوبەشی کردن بە توت بۆ…</string>\n    <string name=\"send_post_link_to\">هاوبەشکردنی توتی URL بۆ…</string>\n    <string name=\"downloading_media\">داگرتنی میدیا</string>\n    <string name=\"download_media\">داگرتنی میدیا</string>\n    <string name=\"action_share_as\">هاوبەش کردن وەک …</string>\n    <string name=\"action_open_as\">کردنەوە وەک %1$s</string>\n    <string name=\"action_copy_link\">بەستەرەکە ڕوونوس بکە</string>\n    <string name=\"download_image\">داگرتنی %1$s</string>\n    <string name=\"action_open_media_n\">کردنەوەی میدیا #%1$d</string>\n    <string name=\"title_links_dialog\">بەستەرەکان</string>\n    <string name=\"title_mentions_dialog\">ئاماژەکان</string>\n    <string name=\"title_hashtags_dialog\">هاشتاگی</string>\n    <string name=\"action_open_faved_by\">پیشاندانی دڵخوازەکان</string>\n    <string name=\"action_open_reblogged_by\">پیشاندانی بەهێزکردنەکان</string>\n    <string name=\"action_open_reblogger\">پۆستکەرەوەکە ببینە</string>\n    <string name=\"action_hashtags\">هاشتاگ</string>\n    <string name=\"action_mentions\">ئاماژەکان</string>\n    <string name=\"action_links\">بەستەرەکان</string>\n    <string name=\"action_add_tab\">زیادکردنی سەرخشت</string>\n    <string name=\"action_reset_schedule\">ڕیسێت کردن</string>\n    <string name=\"action_schedule_post\">خشتەی توت</string>\n    <string name=\"action_emoji_keyboard\">تەختەکلیلی ئیمۆجی</string>\n    <string name=\"action_content_warning\">ئاگاداری ناوەڕۆک</string>\n    <string name=\"action_toggle_visibility\">بینینی توت</string>\n    <string name=\"action_access_scheduled_posts\">توتی خشتەکراو</string>\n    <string name=\"action_access_drafts\">ڕەشنووسەکان</string>\n    <string name=\"action_search\">گەڕان</string>\n    <string name=\"action_reject\">ڕەتکردنەوە</string>\n    <string name=\"action_accept\">ڕازیبون</string>\n    <string name=\"action_undo\">گەڕانەوە</string>\n    <string name=\"action_edit_own_profile\">بژارکردن</string>\n    <string name=\"action_edit_profile\">دەستکاری پرۆفایل بکە</string>\n    <string name=\"action_save\">بپارێزە</string>\n    <string name=\"action_open_drawer\">کردنەوەی وێنەکێش</string>\n    <string name=\"action_hide_media\">شاردنەوەی میدیا</string>\n    <string name=\"action_mention\">ئاماژە</string>\n    <string name=\"action_unmute_conversation\">گفتوگۆی لاببە</string>\n    <string name=\"action_unmute_domain\">نابێدەنگ کردن %1$s</string>\n    <string name=\"action_mute_domain\">بێدەنگکردن %1$s</string>\n    <string name=\"action_unmute_desc\">نابێدەنگ %1$s</string>\n    <string name=\"action_unmute\">بێدەنگی لابردن</string>\n    <string name=\"action_mute\">بێدەنگ</string>\n    <string name=\"action_share\">هاوبەش کردن</string>\n    <string name=\"action_photo_take\">وێنە بگرە</string>\n    <string name=\"action_add_poll\">زیادکردنی ڕاپرسی</string>\n    <string name=\"action_add_media\">زیادکردنی میدیا</string>\n    <string name=\"action_open_in_web\">لە وێبگەڕ بیکەوە</string>\n    <string name=\"action_view_media\">میدیا</string>\n    <string name=\"action_view_follow_requests\">بەدواداچونی داواکاریەکان بکە</string>\n    <string name=\"action_view_domain_mutes\">دۆمەینە شاراوەکان</string>\n    <string name=\"action_view_blocks\">بەکارهێنەرە بلۆککراوەکان</string>\n    <string name=\"action_view_mutes\">بەکارهێنەرە گۆڕاوەکان</string>\n    <string name=\"action_view_bookmarks\">نیشانەکان</string>\n    <string name=\"action_view_favourites\">بەدڵبوونەکان</string>\n    <string name=\"action_view_account_preferences\">پەسەندکراوەکانی ئەژمێر</string>\n    <string name=\"action_view_preferences\">پەسەندەکان</string>\n    <string name=\"action_view_profile\">پرۆفایل</string>\n    <string name=\"action_close\">دابخە</string>\n    <string name=\"action_retry\">دووبارە هەوڵ بدە</string>\n    <string name=\"action_send_public\">توت!</string>\n    <string name=\"action_send\">توت</string>\n    <string name=\"action_delete_and_redraft\">سڕینەوە و دووبارە-ڕەشنووس</string>\n    <string name=\"action_delete\">سڕینەوە</string>\n    <string name=\"action_edit\">دەستکاری</string>\n    <string name=\"action_report\">گوزارشەکان</string>\n    <string name=\"action_show_reblogs\">پۆستکردنەوەکان نیشان بدە</string>\n    <string name=\"action_hide_reblogs\">شاردنەوەی بەهێزکردنەکان</string>\n    <string name=\"action_unblock\">بەربەست کردن لاببە</string>\n    <string name=\"action_block\">بلۆک</string>\n    <string name=\"action_unfollow\">بەدوادانەچو</string>\n    <string name=\"action_follow\">شوێنی بکەوە</string>\n    <string name=\"action_logout_confirm\">ئایا دڵنیایت لەوەی دەتەوێت بچیتەدەرەوە لە هەژماری %1$s؟</string>\n    <string name=\"action_logout\">چوونەدەرەوە</string>\n    <string name=\"action_login\">چوونەژوورەوە لەگەڵ ماستۆدۆن</string>\n    <string name=\"action_compose\">دروستکردن</string>\n    <string name=\"action_more\">زیاتر</string>\n    <string name=\"action_unfavourite\">لابردنی دڵخوازەکان</string>\n    <string name=\"action_bookmark\">نیشانه</string>\n    <string name=\"action_favourite\">دڵخواز</string>\n    <string name=\"action_unreblog\">پۆستکردنەوەکە بگەڕێنەوە</string>\n    <string name=\"action_reblog\">بەهێزکردن</string>\n    <string name=\"action_reply\">وەڵام</string>\n    <string name=\"action_quick_reply\">وەڵامدانەوەی خێرا</string>\n    <string name=\"report_comment_hint\">سەرنجەکانی تر؟</string>\n    <string name=\"report_username_format\">گوزارشت @%1$s</string>\n    <string name=\"notification_subscription_format\">%1$s تەنها بڵاوکرایەوە</string>\n    <string name=\"notification_follow_request_format\">%1$s داواکراوە کە شوێنت بکەوێت</string>\n    <string name=\"notification_follow_format\">%1$s بەدواتا کەوت</string>\n    <string name=\"notification_favourite_format\">%1$s خۆشترین توتەکەت</string>\n    <string name=\"notification_reblog_format\">%1$s توتەکەتی بەرزکردەوە</string>\n    <string name=\"footer_empty\">هیچ شتێک لێرە نیە ڕاکە خوارەوە بۆ نوێکردنەوە!</string>\n    <string name=\"message_empty\">هیچ شتێک لێرە نیە.</string>\n    <string name=\"post_content_show_less\">نوشتانەوە</string>\n    <string name=\"post_content_show_more\">فراوانکردن</string>\n    <string name=\"post_content_warning_show_less\">کەمتر نیشان بدە</string>\n    <string name=\"post_content_warning_show_more\">زیاتر پیشان بدە</string>\n    <string name=\"post_sensitive_media_directions\">کرتە بکە بۆ بینین</string>\n    <string name=\"post_media_hidden_title\">میدیا شاراوە</string>\n    <string name=\"post_sensitive_media_title\">ناوەڕۆکی هەستیار</string>\n    <string name=\"post_boosted_format\">%1$s پۆستی کردەوە</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"title_licenses\">مۆڵەتەکان</string>\n    <string name=\"title_announcements\">ڕاگه یه نراوەکان</string>\n    <string name=\"title_scheduled_posts\">توتی خشتەکراو</string>\n    <string name=\"title_edit_profile\">دەستکاری پرۆفایلەکەت بکە</string>\n    <string name=\"title_follow_requests\">بەدواداچونی داواکاریەکان بکە</string>\n    <string name=\"title_domain_mutes\">دۆمەینە شاراوەکان</string>\n    <string name=\"title_blocks\">بەکارهێنەرە بلۆککراوەکان</string>\n    <string name=\"title_mutes\">بەکارهێنەرە بێدەنگ</string>\n    <string name=\"title_bookmarks\">نیشانەکان</string>\n    <string name=\"title_favourites\">دڵخوازەکان</string>\n    <string name=\"title_followers\">شوێنکەوتوو</string>\n    <string name=\"title_follows\">شوێنکەوتنەکان</string>\n    <string name=\"title_posts_pinned\">چەسپا</string>\n    <string name=\"title_posts_with_replies\">لەگەڵ وەڵامەکان</string>\n    <string name=\"title_posts\">پۆست</string>\n    <string name=\"title_view_thread\">زنجیرە</string>\n    <string name=\"title_tab_preferences\">سەرخشتەکان</string>\n    <string name=\"title_direct_messages\">نامە ڕاستەوخۆکان</string>\n    <string name=\"title_public_federated\">گشتی</string>\n    <string name=\"title_public_local\">ناوخۆیی</string>\n    <string name=\"title_notifications\">ئاگادارییەکان</string>\n    <string name=\"title_home\">سەرەتا</string>\n    <string name=\"error_sender_account_gone\">هەڵە لە ناردنی توت.</string>\n    <string name=\"error_media_upload_sending\">بارکردن سەرکەوتوو نەبوو.</string>\n    <string name=\"error_media_upload_image_or_video\">وێنە و ڤیدیۆکان ناتوانرێت هەردووک هاوپێچ بکرێت لەگەڵ یەک دۆخ.</string>\n    <string name=\"error_media_download_permission\">مۆڵەت بۆ پاشکەوتکردنی میدیا پێویستە.</string>\n    <string name=\"error_media_upload_permission\">مۆڵەت بۆ خوێندنەوەی میدیا پێویستە.</string>\n    <string name=\"error_media_upload_opening\">ئەم فایلە ناتوانرێت بکرێتەوە.</string>\n    <string name=\"error_media_upload_type\">ناتوانیت لەم جۆرە فایلانە بەرز بکەیتەوە.</string>\n    <string name=\"error_compose_character_limit\">ئەم نووسینە زۆر درێژە!</string>\n    <string name=\"error_retrieving_oauth_token\">سەرکەوتوو نەبوو لە بەدەستهێنانی نیشانەی چوونەژوورەوە.</string>\n    <string name=\"error_authorization_denied\">ڕێپێدان ڕەتکرایەوە.</string>\n    <string name=\"error_authorization_unknown\">هەڵەیەک بۆ مۆڵەتدانی نەناسراو ڕووی دا.</string>\n    <string name=\"error_no_web_browser_found\">نەیتوانی وێبگەڕبدۆزێتەوە بۆ بەکارهێنان.</string>\n    <string name=\"error_failed_app_registration\">سەرکەوتوو نەبوو، ڕاستکردنەوە لەگەڵ ئەم نمونەیە.</string>\n    <string name=\"error_invalid_domain\">دۆمەینێکی نادروستت نووسیوە</string>\n    <string name=\"error_empty\">ناکرێت ئەمە بەتاڵ بێت.</string>\n    <string name=\"error_network\">هەڵەیەک لە پەیوەندییەکەدا ڕوویدا. تکایە دڵنیا ببەوە لە بەردەستبوونی هێڵی ئینتەرنێت.</string>\n    <string name=\"error_generic\">هەڵەیەک ڕوویدا.</string>\n    <string name=\"pref_default_post_privacy\">تایبەتمەندی بابەت گریمانەیی</string>\n    <string name=\"pref_title_http_proxy_port\">دەرگای پرۆکسی HTTP</string>\n    <string name=\"pref_title_http_proxy_server\">ڕاژەکاری پرۆکسی HTTP</string>\n    <string name=\"pref_title_http_proxy_enable\">چالاککردنی پرۆکسی HTTP</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP proxy</string>\n    <string name=\"pref_title_proxy_settings\">پرۆکسی</string>\n    <string name=\"pref_title_show_media_preview\">داگرتنی پێشبینینی میدیا</string>\n    <string name=\"pref_title_show_replies\">وەڵامدانەوەکان پیشان بدە</string>\n    <string name=\"pref_title_show_boosts\">پیشاندانی بەهێزکردنەکان</string>\n    <string name=\"pref_title_post_tabs\">سەرخشتەکان</string>\n    <string name=\"pref_title_post_filter\">فلتەرکردنی تایملاین</string>\n    <string name=\"pref_title_gradient_for_media\">نمرەی لاری ڕەنگاوڕەنگ نیشان بدە بۆ میدیای شاراوە</string>\n    <string name=\"pref_title_animate_gif_avatars\">وێنۆجکەی ئەنیمەی GIF</string>\n    <string name=\"pref_title_bot_overlay\">نیشاندەر نیشاندەر بۆ بۆتەکان نیشان بدە</string>\n    <string name=\"pref_title_language\">زمان</string>\n    <string name=\"pref_title_custom_tabs\">بەکارهێنانی خشتەبەندەکانی دڵخواز</string>\n    <string name=\"pref_title_browser_settings\">وێبگەڕ</string>\n    <string name=\"app_theme_system\">دیزاینی سیستەم بەکاربهێنە</string>\n    <string name=\"app_theme_auto\">خۆکار لە کاتی خۆرئاوابووندا</string>\n    <string name=\"app_theme_black\">ڕەش</string>\n    <string name=\"app_theme_light\">ڕووناکی</string>\n    <string name=\"app_them_dark\">تاریک</string>\n    <string name=\"pref_title_timeline_filters\">فلتەرەکان</string>\n    <string name=\"pref_title_app_theme\">ڕووکاری ئەپ</string>\n    <string name=\"pref_title_timelines\">تایملاین</string>\n    <string name=\"pref_title_appearance_settings\">دەرکەوتن</string>\n    <string name=\"pref_title_notification_filters\">ئاگادارم بکەوە کاتێک</string>\n    <string name=\"pref_title_notification_alert_light\">ئاگاداربکەوە بە ڕووناکی</string>\n    <string name=\"pref_title_notification_alert_vibrate\">ئاگادارکردنەوەی لەلەرینە</string>\n    <string name=\"pref_title_notification_alert_sound\">ئاگادارکردنەوەی بە دەنگێک</string>\n    <string name=\"pref_title_notification_alerts\">ئاگادارکردنەوەکان</string>\n    <string name=\"pref_title_notifications_enabled\">ئاگانامەکان</string>\n    <string name=\"pref_title_edit_notification_settings\">ئاگانامەکان</string>\n    <string name=\"visibility_direct\">ڕاستەوخۆ: تەنها بۆ بەکارهێنەرانی ناوبراو پۆست بکە</string>\n    <string name=\"visibility_private\">تەنها شوێنکەوتوانی: تەنها پۆست بۆ شوێنکەوتوانی</string>\n    <string name=\"visibility_unlisted\">لیستی نەکراو: لە هێڵی کاتی گشتی دا پیشان مەدە</string>\n    <string name=\"visibility_public\">گشتی: پۆست بکە بۆ هێڵی کاتی گشتی</string>\n    <string name=\"dialog_mute_hide_notifications\">شاردنەوەی ئاگانامەکان</string>\n    <string name=\"dialog_mute_warning\">بێدەنگکردن @%1$s؟</string>\n    <string name=\"dialog_block_warning\">بلۆککردنی @%1$s؟</string>\n    <string name=\"mute_domain_warning_dialog_ok\">شاردنەوەی هەموو دۆمەینەکە</string>\n    <string name=\"mute_domain_warning\">ئایا دڵنیایت لەوەی دەتەوێت هەموو %1$s بلۆک بکەیت؟ تۆ ناوەڕۆکێک نابینیت لە دۆمەینەکە لە هیچ هێڵی کاتی گشتی یان لە ئاگانامەکانت. شوێنکەوتوانی تۆ لەو دۆمەینەوە لادەبرێن.</string>\n    <string name=\"dialog_redraft_post_warning\">ئەم دووانە بسڕەوە و دووبارە ڕەشنووس یان دەکەیتەوە؟</string>\n    <string name=\"dialog_delete_post_warning\">ئەم توتە بسڕەوە؟</string>\n    <string name=\"dialog_unfollow_warning\">شوێن نەکەوتنی ئەم هەژمارە؟</string>\n    <string name=\"dialog_message_cancel_follow_request\">داواکاری بەدوادا چوەکان هەڵوەشانەوە؟</string>\n    <string name=\"dialog_download_image\">داگرتن</string>\n    <string name=\"dialog_message_uploading_media\">بارکردن…</string>\n    <string name=\"dialog_title_finishing_media_upload\">تەواوکردنی بارکردنی میدیا</string>\n    <string name=\"dialog_whats_an_instance\">ناونیشان یان دۆمەینی هەر نمونەیەک دەکرێت لێرە تێبنووسرێت، وەک <a href=\"https://instances.social\">فرەتر!</a> \\u0020\n\\n \\u0020\n\\nئەگەر هێشتا ئەژمێرێکت نیە، دەتوانیت ناوی ئەو نمونەیە داخڵ بکەیت کە دەتەوێت بیبەستیت و ئەژمێرێک دروست بکەیت لەوێ. \\u0020\n\\n \\u0020\n\\nنموونەیەک تاکە شوێنە کە ئەژمێرەکەت میوانداری کراوە، بەڵام دەتوانیت بە ئاسانی پەیوەندی لەگەڵ بکەیت و دوای ئەو خەڵکانە بکەویت لە نمونەکانی تر وەک ئەوەی تۆ لە هەمان سایت دابیت. \\u0020\n\\n \\u0020\n\\nزانیاری زیاتر دەتوانرێت بدۆزرێتەوە لە <a href=\"https://joinmastodon.org\">joinmastodon.org</a>. </string>\n    <string name=\"login_connection\">گرێدان…</string>\n    <string name=\"link_whats_an_instance\">نموونەیەک چییە؟</string>\n    <string name=\"label_header\">سەرپەڕە</string>\n    <string name=\"label_avatar\">وێنۆچکە</string>\n    <string name=\"label_quick_reply\">وەڵام…</string>\n    <string name=\"search_no_results\">هیچ ئەنجامێک نیە</string>\n    <string name=\"hint_search\">گەڕان…</string>\n    <string name=\"hint_note\">دەربارە</string>\n    <string name=\"hint_display_name\">ناوی پیشاندان</string>\n    <string name=\"hint_content_warning\">ئاگاداری ناوەڕۆک</string>\n    <string name=\"action_mute_conversation\">گفتوگۆی بێدەنگ</string>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d کاژێرماوە</item>\n        <item quantity=\"other\">%1$d کاژێرماوە</item>\n    </plurals>\n    <string name=\"filter_dialog_whole_word_description\">کاتێک وشەکە یان دەستەواژەکە تەنها ئەبجەدییە، تەنها ئەگەر لەگەڵ هەموو وشەکە یەکبێت کاری پێدەکرێت</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\"/>\n        <item quantity=\"other\">ناتوانیت زیاتر لە %1$d هاوپێچی میدیا باربکەیت.</item>\n    </plurals>\n    <string name=\"wellbeing_hide_stats_profile\">شاردنەوەی زانیاری چەندێتی لەسەر پرۆفایلەکان</string>\n    <string name=\"wellbeing_hide_stats_posts\">شاردنەوەی زانیاری چەندێتی لە بابەتەکان</string>\n    <string name=\"limit_notifications\">سنووردارکردنی ئاگانامەکانی تایم لاین</string>\n    <string name=\"review_notifications\">پێداچوونەوەی ئاگانامەکان</string>\n    <string name=\"wellbeing_mode_notice\">هەندێک زانیاری کە لەوانەیە کاریگەری لەسەر باشبوونی دەروونیت دروست بکات دەشاردرێنەوە. ئەمە پێکدێت لە:\n\\n\n\\n- ئاگانامەکانی پەسەند/بەهێزکردن/بەدوادا\n\\n - پەسەندترین/بەرزکردنەوە لەسەر توت\n\\n - بەدواداچوون/زانیاری بابەت لەسەر پرۆفایلەکان\n\\n\n\\nکارتێکردنی ئاگانامەکانی پاڵپێوەنان، بەڵام دەتوانیت بە پەسەندکردنە ئاگانامەکانت دا بخشێنیەوە بە دەستی.</string>\n    <string name=\"account_note_saved\">ڕزگارکرا</string>\n    <string name=\"account_note_hint\">تێبینیی تایبەتیت بۆ ئەم هەژمارە</string>\n    <string name=\"pref_title_wellbeing_mode\">Wellbeing</string>\n    <string name=\"pref_title_hide_top_toolbar\">شاردنەوەی ناونیشانی شریتی ئامڕازی سەرەوە</string>\n    <string name=\"pref_title_confirm_reblogs\">پیشاندانی دیالۆگی دووپاتکردنەوە پێش بەهێزکردن</string>\n    <string name=\"pref_title_show_cards_in_timelines\">نیشاندانی پێشاندانی بەستەر لە هێڵی کات</string>\n    <string name=\"warning_scheduling_interval\">ماستۆدۆن کەمترین ماوەی خشتەی هەیە لە ٥ خولەک.</string>\n    <string name=\"no_announcements\">هیچ ڕاگه یه نراوێک له بەرده رنه کەون.</string>\n    <string name=\"no_scheduled_posts\">هیچ بارێکی خشتەکراوت نیە.</string>\n    <string name=\"no_drafts\">هیچ ڕەشنووسێکت نییە.</string>\n    <string name=\"post_lookup_error_format\">هەڵە لە گەڕان بەدوای بابەت %1$s</string>\n    <string name=\"edit_poll\">دەستکاریکردن</string>\n    <string name=\"poll_new_choice_hint\">هەڵبژاردنی %1$d</string>\n    <string name=\"poll_allow_multiple_choices\">چەند هەڵبژاردنێک</string>\n    <string name=\"add_poll_choice\">زیادکردنی هەڵبژاردن</string>\n    <string name=\"create_poll_title\">ڕاپرسی</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">چالاککردنی ئاماژەکردنی لێدانی چالاک بۆ گۆڕین لە نێوان خشتەبەندەکان</string>\n    <string name=\"license_description\">تاسکی کۆد و سەرمایەکانی تێدایە لەم پڕۆژە کراوەی سەرچاوە:</string>\n    <string name=\"failed_search\">گەڕانەکە سەرکەوتوو نەبوو</string>\n    <string name=\"title_accounts\">ئەژمێرەکان</string>\n    <string name=\"report_description_remote_instance\">هەژمارەلە ڕاژەیەکی دیکەیە ترە. کۆپیەکی بێ سەروبەر بنێرە بۆ ڕاپۆرتەکە لەوێ؟</string>\n    <string name=\"report_description_1\">ڕاپۆرتەکە دەنێردرێت بۆ بەڕێوەبەری ڕاژەکەت. دەتوانیت ڕوونکردنەوەیەک پێشکەش بکەیت کە بۆچی ئەم ئەژمێرە لە خوارەوە ڕاپۆرت دەکەیت:</string>\n    <string name=\"failed_fetch_posts\">سەرکەوتوو نەبوو لە هێنانی بارەکان</string>\n    <string name=\"failed_report\">ڕاپۆرتکردن سەرکەوتوو نەبوو</string>\n    <string name=\"report_remote_instance\">ناردنەوە بۆ %1$s</string>\n    <string name=\"hint_additional_info\">سەرنجەکانی زیاتر</string>\n    <string name=\"report_sent_success\">سەرکەوتووانە ڕاپۆرتکرا @%1$s</string>\n    <string name=\"button_done\">تەواوبوو</string>\n    <string name=\"button_back\">دواوە</string>\n    <string name=\"button_continue\">بەردەوام بە</string>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d چرکەی ماوەو</item>\n        <item quantity=\"other\">%1$d دووەم چەپ</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d خولەک ماوە</item>\n        <item quantity=\"other\">%1$d خولەک ماوە</item>\n    </plurals>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d ڕۆژ ماوە</item>\n        <item quantity=\"other\">%1$d ڕۆژ ماوە</item>\n    </plurals>\n    <string name=\"poll_ended_created\">ڕاپرسییەک کە دروستت کردووە کۆتایی هات</string>\n    <string name=\"poll_ended_voted\">ڕاپرسییەک کە دەنگی پێداویت کۆتایی هات</string>\n    <string name=\"poll_vote\">دەنگ</string>\n    <string name=\"poll_info_closed\">کۆتایی هاتووە</string>\n    <string name=\"poll_info_time_absolute\">کۆتایی دێت لە %1$s</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s کەس</item>\n        <item quantity=\"other\">%1$s کەس</item>\n    </plurals>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s دەنگ</item>\n        <item quantity=\"other\">%1$s دەنگ</item>\n    </plurals>\n    <string name=\"poll_info_format\"> <!-- 15 دەنگ • 1 کاتژمێر ماوە --> %1$s • %2$s</string>\n    <string name=\"compose_preview_image_description\">کارەکان بۆ وێنە %1$s</string>\n    <string name=\"notification_clear_text\">ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی هەموو ئاگانامەکانت بسڕیتەوە؟</string>\n    <string name=\"compose_shortcut_short_label\">دروستکردن</string>\n    <string name=\"compose_shortcut_long_label\">دروستکردنی توت</string>\n    <string name=\"filter_apply\">جێبەجێ کردن</string>\n    <string name=\"notifications_apply_filter\">فلتەر</string>\n    <string name=\"notifications_clear\">سڕینەوە</string>\n    <string name=\"list\">لیست</string>\n    <string name=\"select_list_title\">دیاریکردنی لیست</string>\n    <string name=\"hashtags\">هاشتاگی</string>\n    <string name=\"pick_hashtag_hint\">هاشتاگی بێ #</string>\n    <string name=\"add_hashtag_title\">هاشتاگی زیاد بکە</string>\n    <string name=\"hint_list_name\">ناوی لیست</string>\n    <string name=\"description_poll\">ڕاپرسی لەگەڵ هەڵبژاردنەکان: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"description_visibility_direct\">ڕاستەوخۆ</string>\n    <string name=\"description_visibility_private\">شوێنکەوتوانی</string>\n    <string name=\"description_visibility_unlisted\">لە لیست نەکراو</string>\n    <string name=\"description_visibility_public\">گشتی</string>\n    <string name=\"description_post_bookmarked\">نیشانکراوە</string>\n    <string name=\"description_post_favourited\">پەسەندکراو</string>\n    <string name=\"description_post_reblogged\">دووبارە بڵاگ کرا</string>\n    <string name=\"description_post_media_no_description_placeholder\">هیچ وەسفێک</string>\n    <string name=\"description_post_cw\">ئاگاداری ناوەڕۆک: %1$s</string>\n    <string name=\"description_post_media\">میدیا: %1$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s و %3$d زیاتر</string>\n    <string name=\"conversation_2_recipients\">%1$s و %2$s</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"title_favourited_by\">پەسەندکراوە لەلایەن</string>\n    <string name=\"title_reblogged_by\">پۆست کراوەتەوە لەلایەن</string>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> پۆستکردنەوە</item>\n        <item quantity=\"other\"><b>%1$s</b> پۆستکردنەوە</item>\n    </plurals>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> دڵخواز</item>\n        <item quantity=\"other\"><b>%1$s</b> دڵخواز</item>\n    </plurals>\n    <string name=\"pin_action\">Pin</string>\n    <string name=\"unpin_action\">لابردن</string>\n    <string name=\"label_remote_account\">ڕەنگە زانیاری خوارەوە ڕەنگدانەوەی پرۆفایلی بەکارهێنەر بە ناتەواوی بێت. فشار بکە بۆ کردنەوەی پرۆفایلی تەواو لە وێبگەڕەکە.</string>\n    <string name=\"pref_title_absolute_time\">کاتی ڕەها بەکاربهێنە</string>\n    <string name=\"profile_metadata_content_label\">ناوەڕۆک</string>\n    <string name=\"profile_metadata_label_label\">ناونیشان</string>\n    <string name=\"profile_metadata_add\">داتا زیاد بکە</string>\n    <string name=\"profile_metadata_label\">مێتاداتای پرۆفایل</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_apache_2\">مۆڵەتدراوە لەژێر مۆڵەتی ئەپاچی (لەبەرگیراوە لە خوارەوە)</string>\n    <string name=\"unreblog_private\">بێ هێزکردن</string>\n    <string name=\"reblog_private\">بەرزکردنەوە بۆ جەماوەری ڕەسەن</string>\n    <string name=\"account_moved_description\">%1$s گواسترایەوە بۆ:</string>\n    <string name=\"profile_badge_bot_text\">بۆت</string>\n    <string name=\"download_failed\">داگرتن سەرکەوتوو نەبوو</string>\n    <string name=\"caption_notoemoji\">کۆمەڵە ئیمۆجیەکەی ئێستای گووگڵ</string>\n    <string name=\"caption_twemoji\">سێتی ئیمۆجی پێوانەیی ماتۆدۆن</string>\n    <string name=\"caption_blobmoji\">ئیمۆجی Blob لە ئەندرۆید ەوە ناسراوە 4.4–7.1</string>\n    <string name=\"caption_systememoji\">سێتی ئیمۆجی بنەڕەتی ئامێرەکەت</string>\n    <string name=\"restart\">دەستپێکردنەوە</string>\n    <string name=\"later\">دواتر</string>\n    <string name=\"restart_emoji\">تۆ پێویستە توسکی دەستپێبکەیتەوە بۆ ئەوەی ئەم گۆڕانکاریانە جێبەجێ بکەیت</string>\n    <string name=\"restart_required\">دەسپێکردنەوەی کاربەرنامە پێویستە</string>\n    <string name=\"action_open_post\">کردنەوە توت</string>\n    <string name=\"expand_collapse_all_posts\">فراوانکردن/نوشتانەوەی هەموو بارەکان</string>\n    <string name=\"performing_lookup_title\">ئەنجامدانی گەڕان…</string>\n    <string name=\"download_fonts\">تۆ پێویستە سەرەتا ئەم سێتە ئیمۆجییانە دابگریت</string>\n    <string name=\"system_default\">سیستەمی بنەڕەت</string>\n    <string name=\"emoji_style\">شێوازی ئیمۆجی</string>\n    <string name=\"error_no_custom_emojis\">نموونەکەت %1$s هیچ ئیمۆجییەکی ئاسایی نییە</string>\n    <string name=\"action_compose_shortcut\">دروستکردن</string>\n    <string name=\"send_post_notification_saved_content\">کۆپیەکی دەستنووسەکە خەزن کراوە بۆ ڕەشنووسەکانت</string>\n    <string name=\"send_post_notification_cancel_title\">ناردنی هەڵوەشاوە</string>\n    <string name=\"send_post_notification_channel_name\">ناردنی توتس</string>\n    <string name=\"send_post_notification_error_title\">هەڵە لە ناردنی توت</string>\n    <string name=\"send_post_notification_title\">(توت) دەنێرم…</string>\n    <string name=\"compose_save_draft\">ڕەشنووس پاشەکەوت بکەیت؟</string>\n    <string name=\"lock_account_label_description\">داوات لێدەکات کە بە دەستی شوێنکەوتوانی پەسەند بکە</string>\n    <string name=\"lock_account_label\">داخستنی ئەژمێر</string>\n    <string name=\"action_remove\">لابردن</string>\n    <string name=\"action_set_caption\">دانانی سەردێڕ</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\"/>\n        <item quantity=\"other\">وەسف بکە بۆ بینایی داڕماو\n\\n(%1$d سنوری کاراکتەر)</item>\n    </plurals>\n    <string name=\"compose_active_account_description\">بڵاوکردنەوە بە هەژماری %1$s</string>\n    <string name=\"action_remove_from_list\">لابردنی ئەژمێر لە لیستەکە</string>\n    <string name=\"action_add_to_list\">زیادکردنی ئەژمێر بۆ لیستەکە</string>\n    <string name=\"hint_search_people_list\">گەڕان بەدوای ئەو کەسانەی کە پەیڕەوی ان دەکەیت</string>\n    <string name=\"action_delete_list\">سڕینەوەی لیستەکە</string>\n    <string name=\"action_rename_list\">ناونانەوەی لیستەکە</string>\n    <string name=\"action_create_list\">دروستکردنی لیستێک</string>\n    <string name=\"error_delete_list\">نەیتوانی لیستەکە بسڕێتەوە</string>\n    <string name=\"error_rename_list\">نەیتوانی ناوی لیست بنووسرێ</string>\n    <string name=\"error_create_list\">نەیتوانی لیست دروست بکات</string>\n    <string name=\"title_lists\">لیستەکان</string>\n    <string name=\"action_lists\">لیستەکان</string>\n    <string name=\"add_account_description\">زیادکردنی ئەژمێری ماتۆدۆنی نوێ</string>\n    <string name=\"add_account_name\">زیادکردنی ئەژمێر</string>\n    <string name=\"filter_add_description\">دەستەواژە بۆ فلتەر</string>\n    <string name=\"filter_dialog_whole_word\">هەموو وشەکە</string>\n    <string name=\"filter_dialog_update_button\">نوێکردنەوە</string>\n    <string name=\"filter_dialog_remove_button\">لابردن</string>\n    <string name=\"filter_edit_title\">دەستکاریکردنی فلتەر</string>\n    <string name=\"filter_addition_title\">زیادکردنی فلتەر</string>\n    <string name=\"pref_title_thread_filter_keywords\">گفتوگۆکان</string>\n    <string name=\"pref_title_public_filter_keywords\">هێڵی کاتی گشتی</string>\n    <string name=\"load_more_placeholder_text\">بارکردنی زیاتر</string>\n    <string name=\"replying_to\">وەڵام دانەوە بۆ @%1$s</string>\n    <string name=\"title_media\">میدیا</string>\n    <string name=\"pref_title_alway_open_spoiler\">هەمیشە ئەو توتانەی کە بە ئاگادارکردنەوەکانی ناوەڕۆکەوە نیشانەکراون فراوان بکە</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">هەمیشە ناوەڕۆکی هەستیار نیشان بدە</string>\n    <string name=\"follows_you\">دوای تۆ دەکەوێت</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm</string>\n    <string name=\"abbreviated_hours_ago\">%1$dh</string>\n    <string name=\"abbreviated_days_ago\">%1$dd</string>\n    <string name=\"abbreviated_years_ago\">%1$dy</string>\n    <string name=\"abbreviated_in_seconds\">لە %1$ds</string>\n    <string name=\"abbreviated_in_minutes\">لە %1$dm</string>\n    <string name=\"abbreviated_in_hours\">لە %1$dh</string>\n    <string name=\"abbreviated_in_days\">لە %1$dd</string>\n    <string name=\"abbreviated_in_years\">لە %1$dy</string>\n    <string name=\"state_follow_requested\">بەدواداچوونەوەی داواکراو</string>\n    <string name=\"post_media_video\">ڤیدیۆ</string>\n    <string name=\"post_media_images\">وێنەکان</string>\n    <string name=\"post_share_link\">هاوبەشکردنی لینک بۆ توت</string>\n    <string name=\"post_share_content\">هاوبەشکردنی ناوەڕۆکی دووت</string>\n    <string name=\"about_tusky_account\">پرۆفایلی تاسکی</string>\n    <string name=\"about_bug_feature_request_site\">ڕاپۆرتەکانی هەڵەکان و داواکاریەکانی تایبەتمەندی:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_project_site\">وێبسایتی پڕۆژە:\n\\nhttps://tusky.app</string>\n    <string name=\"about_tusky_license\">توسکی سۆفتوێری ئازاد و سەرچاوەی کراوەیە مۆڵەتدراوە بە پێ نامەی گشتی GNU Public Version 3. دەتوانیت لێرە مۆڵەتەکە نیشان بدەی: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <string name=\"about_powered_by_tusky\">لەلایەن تاسکیەوە دەست کراوە بە</string>\n    <string name=\"about_tusky_version\">توسکی %1$s</string>\n    <string name=\"about_title_activity\">سەبارەت</string>\n    <string name=\"description_account_locked\">هەژماری داخراو</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\"/>\n        <item quantity=\"other\">%1$d چالاکی نوێ</item>\n    </plurals>\n    <string name=\"notification_summary_small\">%1$s و %2$s</string>\n    <string name=\"notification_summary_medium\">%1$s و %2$s و %3$s</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s و %4$d ئەوانی تر</string>\n    <string name=\"notification_mention_format\">%1$s ئاماژەی بە تۆ کرد</string>\n    <string name=\"notification_subscription_description\">ئاگانامەکان کاتێک کەسێک کە تۆ بەشداریت کردووە لە بڵاوکردنەوەی توتێکی نوێ</string>\n    <string name=\"notification_subscription_name\">توتی نوێ</string>\n    <string name=\"notification_poll_description\">ئاگادارییەکان دەربارەی ڕاپرسییەکان کە کۆتایی هاتووە</string>\n    <string name=\"notification_poll_name\">ڕاپرسییەکان</string>\n    <string name=\"notification_favourite_description\">ئاگانامەکان کاتێک کەتوتەکان نیشانە کراون وەک دڵخواز</string>\n    <string name=\"notification_favourite_name\">دڵخوازەکان</string>\n    <string name=\"notification_boost_description\">ئاگانامەکان کاتێک کە دووتەکەت بەرز دەکرێتەوە</string>\n    <string name=\"notification_boost_name\">بەهێزکردن</string>\n    <string name=\"notification_follow_request_description\">ئاگانامەکان دەربارەی داواکاریەکانی بەدوادا</string>\n    <string name=\"notification_follow_request_name\">بەدواداچونی داواکاریەکان بکە</string>\n    <string name=\"notification_follow_description\">ئاگانامەکان دەربارەی شوێنکەوتوانی نوێ</string>\n    <string name=\"notification_follow_name\">شوێنکەوتوانی نوێ</string>\n    <string name=\"notification_mention_descriptions\">ئاگانامەکان دەربارەی ئاماژە نوێیەکان</string>\n    <string name=\"notification_mention_name\">ئاماژە نوێیەکان</string>\n    <string name=\"post_text_size_largest\">گەورەترین</string>\n    <string name=\"post_text_size_large\">گەورە</string>\n    <string name=\"post_text_size_medium\">مامناوەندی</string>\n    <string name=\"post_text_size_small\">بچووک</string>\n    <string name=\"post_text_size_smallest\">بچووکترین</string>\n    <string name=\"pref_post_text_size\">قەبارەی دەقی بار</string>\n    <string name=\"post_privacy_followers_only\">شوێنکەوتوانی تەنها</string>\n    <string name=\"post_privacy_unlisted\">لە لیست نەکراو</string>\n    <string name=\"post_privacy_public\">گشتی</string>\n    <string name=\"pref_main_nav_position_option_bottom\">خوارەوە</string>\n    <string name=\"pref_main_nav_position_option_top\">سەرەوە</string>\n    <string name=\"pref_main_nav_position\">شوێنی سەرەکی ڕێنیشاندەر</string>\n    <string name=\"pref_failed_to_sync\">سەرکەوتوو نەبوو لە هاودەمکردنی ڕێکبەندەکان</string>\n    <string name=\"pref_publishing\">بڵاوکردنەوە (هاوکاتکراوە لەگەڵ سێرڤەر)</string>\n    <string name=\"pref_default_media_sensitivity\">هەمیشە میدیا وەک هەستیار نیشان بکە</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-cs/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">Vyskytla se chyba.</string>\n    <string name=\"error_network\">Vyskytla se chyba sítě. Prosím zkontrolujte své připojení a zkuste to znovu.</string>\n    <string name=\"error_empty\">Toto nemůže být prázdné.</string>\n    <string name=\"error_invalid_domain\">Byla zadána neplatná doména</string>\n    <string name=\"error_failed_app_registration\">Autentizace s tímto serverem nebyla úspěšná. Pokud se chyba objeví znovu, zkuste se přihlásit v prohlížeči z menu.</string>\n    <string name=\"error_no_web_browser_found\">Nepodařilo se najít webový prohlížeč, který lze použít.</string>\n    <string name=\"error_authorization_unknown\">Vyskytla se neidentifikovaná chyba autorizace. Pokud se chyba objeví znovu, zkuste se přihlásit v prohlížeči z menu.</string>\n    <string name=\"error_authorization_denied\">Autorizace byla zamítnuta. Pokud jste si jisti že jste zadali správné přihlašovací údaje, zkuste se přihlásit v prohlížeči z menu.</string>\n    <string name=\"error_retrieving_oauth_token\">Nepodařilo se získat přihlašovací token. Pokud se chyba objeví znovu, zkuste se přihlásit v prohlížeči z menu.</string>\n    <string name=\"error_compose_character_limit\">Příspěvek je příliš dlouhý!</string>\n    <string name=\"error_media_upload_type\">Tento typ souboru nemůže být nahrán.</string>\n    <string name=\"error_media_upload_opening\">Tento soubor se nepodařilo otevřít.</string>\n    <string name=\"error_media_upload_permission\">Je vyžadováno oprávnění ke čtení médií.</string>\n    <string name=\"error_media_download_permission\">Je vyžadováno oprávnění ukládat média.</string>\n    <string name=\"error_media_upload_image_or_video\">K jednomu příspěvku nemohou být přiloženy obrázky i videa.</string>\n    <string name=\"error_media_upload_sending\">Nahrání se nezdařilo.</string>\n    <string name=\"error_sender_account_gone\">Chyba při odesílání příspěvku.</string>\n    <string name=\"title_home\">Domů</string>\n    <string name=\"title_notifications\">Oznámení</string>\n    <string name=\"title_public_local\">Místní</string>\n    <string name=\"title_public_federated\">Federované</string>\n    <string name=\"title_direct_messages\">Přímé zprávy</string>\n    <string name=\"title_tab_preferences\">Panely</string>\n    <string name=\"title_view_thread\">Vlákno</string>\n    <string name=\"title_posts\">Příspěvky</string>\n    <string name=\"title_posts_with_replies\">S odpověďmi</string>\n    <string name=\"title_posts_pinned\">Připnuté</string>\n    <string name=\"title_follows\">Sledovaní</string>\n    <string name=\"title_followers\">Sledující</string>\n    <string name=\"title_favourites\">Oblíbené</string>\n    <string name=\"title_mutes\">Skrytí uživatelé</string>\n    <string name=\"title_blocks\">Blokovaní uživatelé</string>\n    <string name=\"title_follow_requests\">Žádosti o sledování</string>\n    <string name=\"title_edit_profile\">Upravit váš profil</string>\n    <string name=\"title_drafts\">Koncepty</string>\n    <string name=\"title_licenses\">Licence</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s boostnul/a</string>\n    <string name=\"post_sensitive_media_title\">Citlivý obsah</string>\n    <string name=\"post_media_hidden_title\">Média skryta</string>\n    <string name=\"post_sensitive_media_directions\">Klikněte pro zobrazení</string>\n    <string name=\"post_content_warning_show_more\">Zobrazit více</string>\n    <string name=\"post_content_warning_show_less\">Zobrazit méně</string>\n    <string name=\"post_content_show_more\">Rozbalit</string>\n    <string name=\"post_content_show_less\">Sbalit</string>\n    <string name=\"message_empty\">Tady nic není.</string>\n    <string name=\"footer_empty\">Tady nic není. Obnovte přetažením dolů!</string>\n    <string name=\"notification_reblog_format\">%1$s boostnul/a váš příspěvek</string>\n    <string name=\"notification_favourite_format\">%1$s si oblíbil/a váš příspěvek</string>\n    <string name=\"notification_follow_format\">%1$s vás nyní sleduje</string>\n    <string name=\"report_username_format\">Nahlásit uživatele @%1$s</string>\n    <string name=\"report_comment_hint\">Další komentáře?</string>\n    <string name=\"action_quick_reply\">Rychlá odpověď</string>\n    <string name=\"action_reply\">Odpovědět</string>\n    <string name=\"action_reblog\">Boostnout</string>\n    <string name=\"action_unreblog\">Odstranit boost</string>\n    <string name=\"action_favourite\">Oblíbit</string>\n    <string name=\"action_unfavourite\">Odstranit oblíbení</string>\n    <string name=\"action_more\">Více</string>\n    <string name=\"action_compose\">Napsat</string>\n    <string name=\"action_login\">Přihlásit se s Tusky</string>\n    <string name=\"action_logout\">Odhlásit se</string>\n    <string name=\"action_logout_confirm\">Jste si jistí, že se chcete odhlásit z účtu %1$s? Tato akce smaže všechna lokální data tohoto účtu, včetně konceptů a předvoleb.</string>\n    <string name=\"action_follow\">Sledovat</string>\n    <string name=\"action_unfollow\">Přestat sledovat</string>\n    <string name=\"action_block\">Blokovat</string>\n    <string name=\"action_unblock\">Odblokovat</string>\n    <string name=\"action_hide_reblogs\">Skrýt boosty</string>\n    <string name=\"action_show_reblogs\">Zobrazit boosty</string>\n    <string name=\"action_report\">Nahlásit</string>\n    <string name=\"action_delete\">Smazat</string>\n    <string name=\"action_send\">TOOTNOUT</string>\n    <string name=\"action_send_public\">TOOTNOUT!</string>\n    <string name=\"action_retry\">Zkusit znovu</string>\n    <string name=\"action_close\">Zavřít</string>\n    <string name=\"action_view_profile\">Profil</string>\n    <string name=\"action_view_preferences\">Předvolby</string>\n    <string name=\"action_view_account_preferences\">Předvolby účtu</string>\n    <string name=\"action_view_favourites\">Oblíbené</string>\n    <string name=\"action_view_mutes\">Skrytí uživatelé</string>\n    <string name=\"action_view_blocks\">Blokovaní uživatelé</string>\n    <string name=\"action_view_follow_requests\">Žádosti o sledování</string>\n    <string name=\"action_view_media\">Média</string>\n    <string name=\"action_open_in_web\">Otevřít v prohlížeči</string>\n    <string name=\"action_add_media\">Přidat média</string>\n    <string name=\"action_photo_take\">Pořídit fotku</string>\n    <string name=\"action_share\">Sdílet</string>\n    <string name=\"action_mute\">Skrýt</string>\n    <string name=\"action_unmute\">Zrušit skrytí</string>\n    <string name=\"action_mention\">Zmínit</string>\n    <string name=\"action_hide_media\">Skrýt média</string>\n    <string name=\"action_open_drawer\">Otevřít menu</string>\n    <string name=\"action_save\">Uložit</string>\n    <string name=\"action_edit_profile\">Upravit profil</string>\n    <string name=\"action_edit_own_profile\">Upravit</string>\n    <string name=\"action_undo\">Vrátit</string>\n    <string name=\"action_accept\">Přijmout</string>\n    <string name=\"action_reject\">Zamítnout</string>\n    <string name=\"action_search\">Hledat</string>\n    <string name=\"action_access_drafts\">Koncepty</string>\n    <string name=\"action_toggle_visibility\">Viditelnost příspěvku</string>\n    <string name=\"action_content_warning\">Varování o obsahu</string>\n    <string name=\"action_emoji_keyboard\">Klávesnice s emoji</string>\n    <string name=\"action_add_tab\">Přidat panel</string>\n    <string name=\"action_links\">Odkazy</string>\n    <string name=\"action_mentions\">Zmínky</string>\n    <string name=\"action_hashtags\">Hashtagy</string>\n    <string name=\"action_open_reblogger\">Otevřít autora boostu</string>\n    <string name=\"action_open_reblogged_by\">Zobrazit boosty</string>\n    <string name=\"action_open_faved_by\">Zobrazit oblíbení</string>\n    <string name=\"title_hashtags_dialog\">Hashtagy</string>\n    <string name=\"title_mentions_dialog\">Zmínky</string>\n    <string name=\"title_links_dialog\">Odkazy</string>\n    <string name=\"action_open_media_n\">Otevřít médium #%1$d</string>\n    <string name=\"download_image\">Stahuji %1$s</string>\n    <string name=\"action_copy_link\">Zkopírovat odkaz</string>\n    <string name=\"action_open_as\">Otevřít jako %1$s</string>\n    <string name=\"action_share_as\">Sdílet jako…</string>\n    <string name=\"download_media\">Stáhnout média</string>\n    <string name=\"downloading_media\">Stahuji média</string>\n    <string name=\"send_post_link_to\">Sdílet URL příspěvku na…</string>\n    <string name=\"send_post_content_to\">Sdílet příspěvek na…</string>\n    <string name=\"send_media_to\">Sdílet média na…</string>\n    <string name=\"confirmation_reported\">Odesláno!</string>\n    <string name=\"confirmation_unblocked\">Uživatel byl odblokován</string>\n    <string name=\"confirmation_unmuted\">Skrytí uživatele bylo zrušeno</string>\n    <string name=\"hint_domain\">Který server?</string>\n    <string name=\"hint_compose\">Co se právě děje?</string>\n    <string name=\"hint_content_warning\">Varování o obsahu</string>\n    <string name=\"hint_display_name\">Zobrazované jméno</string>\n    <string name=\"hint_note\">O vás</string>\n    <string name=\"hint_search\">Hledat…</string>\n    <string name=\"search_no_results\">Žádné výsledky</string>\n    <string name=\"label_quick_reply\">Odpovědět…</string>\n    <string name=\"label_avatar\">Avatar</string>\n    <string name=\"label_header\">Záhlaví</string>\n    <string name=\"link_whats_an_instance\">Co je to server?</string>\n    <string name=\"login_connection\">Připojuji se…</string>\n    <string name=\"dialog_whats_an_instance\">Sem může být zadána adresa či doména jakéhokoliv serveru, například mastodon.social, icosahedron.website, social.tchncs.de a <a href=\"https://instances.social\">další!</a> \n\\n \n\\nPokud ještě nemáte účet, můžete zadat název instance, ke které se chcete připojit, a vytvořit si tam účet. \n\\n \n\\nServer je jedno místo, kde je hostován váš účet, můžete však jednoduše komunikovat a sledovat lidi na jiných serverech, jako by byli na stejné stránce. \n\\n \n\\nDalší informace mohou být nalezeny na stránce <a href=\"https://joinmastodon.org\">joinmastodon.org</a>.</string>\n    <string name=\"dialog_title_finishing_media_upload\">Dokončuji nahrávání médií</string>\n    <string name=\"dialog_message_uploading_media\">Nahrávám…</string>\n    <string name=\"dialog_download_image\">Stáhnout</string>\n    <string name=\"dialog_message_cancel_follow_request\">Zrušit požadavek o sledování?</string>\n    <string name=\"dialog_unfollow_warning\">Přestat sledovat tento účet?</string>\n    <string name=\"dialog_delete_post_warning\">Smazat tento příspěvek?</string>\n    <string name=\"visibility_public\">Veřejný: Poslat na veřejné časové osy</string>\n    <string name=\"visibility_unlisted\">Neuvedený: Neposlat na veřejné časové osy</string>\n    <string name=\"visibility_private\">Pouze pro sledující: Poslat pouze sledujícím</string>\n    <string name=\"visibility_direct\">Přímé: Poslat pouze zmíněným uživatelům</string>\n    <string name=\"pref_title_edit_notification_settings\">Oznámení</string>\n    <string name=\"pref_title_notifications_enabled\">Oznámení</string>\n    <string name=\"pref_title_notification_alerts\">Upozornění</string>\n    <string name=\"pref_title_notification_alert_sound\">Oznamovat se zvukem</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Oznamovat s vibrací</string>\n    <string name=\"pref_title_notification_alert_light\">Oznamovat se světlem</string>\n    <string name=\"pref_title_notification_filters\">Oznamovat, když</string>\n    <string name=\"pref_title_appearance_settings\">Vzhled</string>\n    <string name=\"pref_title_app_theme\">Motiv aplikace</string>\n    <string name=\"pref_title_timelines\">Časové osy</string>\n    <string name=\"pref_title_timeline_filters\">Filtry</string>\n    <string name=\"app_them_dark\">Tmavý</string>\n    <string name=\"app_theme_light\">Světlý</string>\n    <string name=\"app_theme_black\">Černý</string>\n    <string name=\"app_theme_auto\">Automaticky při západu slunce</string>\n    <string name=\"app_theme_system\">Použít systémový design</string>\n    <string name=\"pref_title_browser_settings\">Prohlížeč</string>\n    <string name=\"pref_title_custom_tabs\">Používat Vlastní karty Chrome</string>\n    <string name=\"pref_title_language\">Jazyk</string>\n    <string name=\"pref_title_post_filter\">Filtrování časových os</string>\n    <string name=\"pref_title_post_tabs\">Domovská timeline</string>\n    <string name=\"pref_title_show_boosts\">Zobrazit boosty</string>\n    <string name=\"pref_title_show_replies\">Zobrazit odpovědi</string>\n    <string name=\"pref_title_show_media_preview\">Stahovat náhledy médií</string>\n    <string name=\"pref_title_proxy_settings\">Proxy</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP proxy</string>\n    <string name=\"pref_title_http_proxy_enable\">Povolit HTTP proxy</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP proxy server</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP proxy port</string>\n    <string name=\"pref_default_post_privacy\">Soukromí příspěvků (synchronizováno se serverem)</string>\n    <string name=\"pref_default_media_sensitivity\">Vždy označovat média jako citlivá (synchronizováno se serverem)</string>\n    <string name=\"pref_publishing\">Výchozí publikování</string>\n    <string name=\"pref_failed_to_sync\">Nepodařilo se synchronizovat nastavení</string>\n    <string name=\"post_privacy_public\">Veřejné</string>\n    <string name=\"post_privacy_unlisted\">Neuvedené</string>\n    <string name=\"post_privacy_followers_only\">Pouze pro sledující</string>\n    <string name=\"pref_post_text_size\">Velikost textu příspěvků</string>\n    <string name=\"post_text_size_smallest\">Nejmenší</string>\n    <string name=\"post_text_size_small\">Malý</string>\n    <string name=\"post_text_size_medium\">Střední</string>\n    <string name=\"post_text_size_large\">Velký</string>\n    <string name=\"post_text_size_largest\">Největší</string>\n    <string name=\"notification_mention_name\">Nové zmínky</string>\n    <string name=\"notification_mention_descriptions\">Oznámení o nových zmínkách</string>\n    <string name=\"notification_follow_name\">Noví sledující</string>\n    <string name=\"notification_follow_description\">Oznámení o nových sledujících</string>\n    <string name=\"notification_boost_name\">Boosty</string>\n    <string name=\"notification_boost_description\">Oznámení, když jsou vaše příspěvky boostnuty</string>\n    <string name=\"notification_favourite_name\">Oblíbení</string>\n    <string name=\"notification_favourite_description\">Oznámení, když jsou vaše příspěvky označeny jako oblíbené</string>\n    <string name=\"notification_mention_format\">%1$s vás zmínil/a</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s a dalších %4$d</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s a %3$s</string>\n    <string name=\"notification_summary_small\">%1$s a %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d nová interakce</item>\n        <item quantity=\"few\">%1$d nové interakce</item>\n        <item quantity=\"other\">%1$d nových interakcí</item>\n    </plurals>\n    <string name=\"description_account_locked\">Uzamčený účet</string>\n    <string name=\"about_title_activity\">O této aplikaci</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_tusky_license\">Tusky je svobodný a otevřený software. Je dostupný pod licencí GNU General Public License, verze 3. Licenci můžete zobrazit zde: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">Webová stránka projektu: https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Hlášení chyb a návrhy na nové vlastnosti:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Profil aplikace Tusky</string>\n    <string name=\"post_share_content\">Sdílet obsah příspěvku</string>\n    <string name=\"post_share_link\">Sdílet odkaz na příspěvek</string>\n    <string name=\"post_media_images\">Obrázky</string>\n    <string name=\"post_media_video\">Video</string>\n    <string name=\"state_follow_requested\">Vyžádáno sledování</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">za %1$d let</string>\n    <string name=\"abbreviated_in_days\">za %1$d d</string>\n    <string name=\"abbreviated_in_hours\">za %1$d h</string>\n    <string name=\"abbreviated_in_minutes\">za %1$d m</string>\n    <string name=\"abbreviated_in_seconds\">za %1$d s</string>\n    <string name=\"abbreviated_years_ago\">%1$d let</string>\n    <string name=\"abbreviated_days_ago\">%1$d d</string>\n    <string name=\"abbreviated_hours_ago\">%1$d h</string>\n    <string name=\"abbreviated_minutes_ago\">%1$d min</string>\n    <string name=\"abbreviated_seconds_ago\">%1$d s</string>\n    <string name=\"follows_you\">Sleduje vás</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Vždy zobrazovat citlivá média</string>\n    <string name=\"title_media\">Média</string>\n    <string name=\"replying_to\">Odpověď uživateli @%1$s</string>\n    <string name=\"load_more_placeholder_text\">Načíst více</string>\n    <string name=\"pref_title_public_filter_keywords\">Veřejné časové osy</string>\n    <string name=\"pref_title_thread_filter_keywords\">Konverzace</string>\n    <string name=\"filter_addition_title\">Přidat filtr</string>\n    <string name=\"filter_edit_title\">Upravit filtr</string>\n    <string name=\"filter_dialog_remove_button\">Odstranit</string>\n    <string name=\"filter_dialog_update_button\">Aktualizovat</string>\n    <string name=\"filter_add_description\">Fráze k filtrování</string>\n    <string name=\"add_account_name\">Přidat účet</string>\n    <string name=\"add_account_description\">Přidat nový účet Mastodon</string>\n    <string name=\"action_lists\">Seznamy</string>\n    <string name=\"title_lists\">Seznamy</string>\n    <string name=\"error_create_list\">Nelze vytvořit seznam</string>\n    <string name=\"error_rename_list\">Nelze aktualizovat seznam</string>\n    <string name=\"error_delete_list\">Nelze smazat seznam</string>\n    <string name=\"action_create_list\">Vytvořit seznam</string>\n    <string name=\"action_rename_list\">Aktualizovat seznam</string>\n    <string name=\"action_delete_list\">Smazat seznam</string>\n    <string name=\"hint_search_people_list\">Hledejte mezi lidmi, které sledujete</string>\n    <string name=\"action_add_to_list\">Přidat účet na seznam</string>\n    <string name=\"action_remove_from_list\">Odstranit účet ze seznamu</string>\n    <string name=\"compose_active_account_description\">Píšete jako %1$s</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Popis pro zrakově postižené\n\\n(limit %1$d znak)</item>\n        <item quantity=\"few\">Popis pro zrakově postižené\n\\n(limit %1$d znaky)</item>\n        <item quantity=\"other\">Popis pro zrakově postižené\n\\n(limit %1$d znaků)</item>\n    </plurals>\n    <string name=\"action_set_caption\">Nastavit popisek</string>\n    <string name=\"action_remove\">Odstranit</string>\n    <string name=\"lock_account_label\">Uzamknout účet</string>\n    <string name=\"lock_account_label_description\">Vyžaduje, abyste ručně schvaloval/a sledující</string>\n    <string name=\"compose_save_draft\">Uložit koncept?</string>\n    <string name=\"send_post_notification_title\">Odesílám příspěvek…</string>\n    <string name=\"send_post_notification_error_title\">Chyba při odesílání příspěvku</string>\n    <string name=\"send_post_notification_channel_name\">Odesílám příspěvky</string>\n    <string name=\"send_post_notification_cancel_title\">Odesílání bylo zrušeno</string>\n    <string name=\"send_post_notification_saved_content\">Kopie vašeho příspěvku byla uložena do vašich konceptů</string>\n    <string name=\"action_compose_shortcut\">Napsat</string>\n    <string name=\"error_no_custom_emojis\">Vaše instance %1$s nemá žádná vlastní emoji</string>\n    <string name=\"emoji_style\">Styl emoji</string>\n    <string name=\"system_default\">Výchozí nastavení systému</string>\n    <string name=\"download_fonts\">Musíte si nejprve stáhnout tyto sady emoji</string>\n    <string name=\"performing_lookup_title\">Provádím prohledávání…</string>\n    <string name=\"expand_collapse_all_posts\">Rozbalit/Sbalit všechny příspěvky</string>\n    <string name=\"action_open_post\">Otevřít příspěvek</string>\n    <string name=\"restart_required\">Je vyžadováno restartování aplikace</string>\n    <string name=\"restart_emoji\">Pro použití těchto změn musíte restartovat aplikaci Tusky</string>\n    <string name=\"later\">Později</string>\n    <string name=\"restart\">Restartovat</string>\n    <string name=\"caption_systememoji\">Výchozí sada emoji vašeho zařízení</string>\n    <string name=\"caption_blobmoji\">Blob Emoji známá z Androidu 4.4–7.1</string>\n    <string name=\"caption_twemoji\">Standardní sada emoji na Mastodonu</string>\n    <string name=\"download_failed\">Stahování selhalo</string>\n    <string name=\"profile_badge_bot_text\">Robot</string>\n    <string name=\"account_moved_description\">%1$s se přesunul/a na:</string>\n    <string name=\"reblog_private\">Boostnout původnímu publiku</string>\n    <string name=\"unreblog_private\">Zrušit boost</string>\n    <string name=\"license_description\">Tusky obsahuje kód a zdroje z následujících otevřených projektů:</string>\n    <string name=\"license_apache_2\">Pod licencí Apache License (kopie níže)</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">Metadata profilu</string>\n    <string name=\"profile_metadata_add\">přidat data</string>\n    <string name=\"profile_metadata_label_label\">Označení</string>\n    <string name=\"profile_metadata_content_label\">Obsah</string>\n    <string name=\"pref_title_absolute_time\">Používat absolutní čas</string>\n    <string name=\"label_remote_account\">Níže uvedené informace nemusejí zcela odrážet profil uživatele. Dotknutím se otevřete celý profil v prohlížeči.</string>\n    <string name=\"unpin_action\">Odepnout</string>\n    <string name=\"pin_action\">Připnout</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> oblíbení</item>\n        <item quantity=\"few\"><b>%1$s</b> oblíbení</item>\n        <item quantity=\"other\"><b>%1$s</b> oblíbení</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> boost</item>\n        <item quantity=\"few\"><b>%1$s</b> boosty</item>\n        <item quantity=\"other\"><b>%1$s</b> boostů</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">Boostnuto uživatelem</string>\n    <string name=\"title_favourited_by\">Oblíbeno uživatelem</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s a %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s a %3$d další</string>\n    <string name=\"description_post_media\">Média %1$s</string>\n    <string name=\"description_post_cw\">Varování o obsahu: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Žádný popis</string>\n    <string name=\"description_post_reblogged\">Boostnutý</string>\n    <string name=\"description_post_favourited\">Oblíbený</string>\n    <string name=\"description_visibility_public\">Veřejný</string>\n    <string name=\"description_visibility_unlisted\">Neuvedený</string>\n    <string name=\"description_visibility_private\">Pro sledující</string>\n    <string name=\"description_visibility_direct\">Přímý</string>\n    <string name=\"hint_list_name\">Název seznamu</string>\n    <string name=\"pick_hashtag_hint\">Hashtag bez #</string>\n    <string name=\"compose_shortcut_long_label\">Napsat příspěvek</string>\n    <string name=\"compose_shortcut_short_label\">Napsat</string>\n    <string name=\"notifications_clear\">Vyčistit</string>\n    <string name=\"notifications_apply_filter\">Filtrovat</string>\n    <string name=\"filter_apply\">Použít</string>\n    <string name=\"pref_title_bot_overlay\">Zobrazovat indikátor pro roboty</string>\n    <string name=\"notification_clear_text\">Jste si jistý/á, že chcete trvale vymazat všechna vaše oznámení?</string>\n    <string name=\"action_delete_and_redraft\">Smazat a přepsat</string>\n    <string name=\"dialog_redraft_post_warning\">Smazat a přepsat tento příspěvek?</string>\n    <string name=\"poll_info_format\"> \\u0020<!-- 15 hlasů • 1 hodina do konce --> \\u0020%1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s hlas</item>\n        <item quantity=\"few\">%1$s hlasy</item>\n        <item quantity=\"other\">%1$s hlasů</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">končí v %1$s</string>\n    <string name=\"poll_info_closed\">uzavřena</string>\n    <string name=\"poll_vote\">Hlasovat</string>\n    <string name=\"notification_poll_name\">Ankety</string>\n    <string name=\"notification_poll_description\">Oznámení o anketách, které skončily</string>\n    <string name=\"compose_preview_image_description\">Akce pro obrázek %1$s</string>\n    <string name=\"poll_ended_voted\">Anketa, ve které jste hlasoval/a, skončila</string>\n    <string name=\"poll_ended_created\">Anketa, kterou jste vytvořil/a, skončila</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">zbývá %1$d den</item>\n        <item quantity=\"few\">zbývá %1$d dny</item>\n        <item quantity=\"other\">zbývá %1$d dní</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">zbývá %1$d minuta</item>\n        <item quantity=\"few\">zbývá %1$d minuty</item>\n        <item quantity=\"other\">zbývá %1$d minut</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">zbývá %1$d sekunda</item>\n        <item quantity=\"few\">zbývá %1$d sekundy</item>\n        <item quantity=\"other\">zbývá %1$d sekund</item>\n    </plurals>\n    <string name=\"pref_title_animate_gif_avatars\">Animovat GIF avatary</string>\n    <string name=\"description_poll\">Anketa s volbami: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"title_domain_mutes\">Skryté domény</string>\n    <string name=\"action_view_domain_mutes\">Skryté domény</string>\n    <string name=\"action_mute_domain\">Skrýt doménu %1$s</string>\n    <string name=\"confirmation_domain_unmuted\">Skrytí domény %1$s bylo zrušeno</string>\n    <string name=\"mute_domain_warning\">Jste si jistý/á, že chcete zablokovat vše z domény %1$s? Z této domény neuvidíte obsah v žádné veřejné časové ose ani v oznámeních. Vaši sledující z této domény budou odstraněni.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Skrýt celou doménu</string>\n    <string name=\"caption_notoemoji\">Aktuální sada emoji od Googlu</string>\n    <string name=\"button_continue\">Pokračovat</string>\n    <string name=\"button_back\">Zpět</string>\n    <string name=\"button_done\">Hotovo</string>\n    <string name=\"report_sent_success\">\\@%1$s byla/a úspěšně nahlášen/a</string>\n    <string name=\"hint_additional_info\">Další komentáře</string>\n    <string name=\"report_remote_instance\">Přeposlat na %1$s</string>\n    <string name=\"failed_report\">Nahlášení selhalo</string>\n    <string name=\"failed_fetch_posts\">Stahování příspěvků selhalo</string>\n    <string name=\"report_description_1\">Hlášení bude zasláno moderátorům vašeho serveru. Níže můžete uvést, proč tento účet nahlašujete:</string>\n    <string name=\"report_description_remote_instance\">Tento účet je z jiného serveru. Chcete na něj také poslat anonymizovanou kopii nahlášení?</string>\n    <string name=\"create_poll_title\">Anketa</string>\n    <string name=\"duration_5_min\">5 minut</string>\n    <string name=\"duration_30_min\">30 minut</string>\n    <string name=\"duration_1_hour\">1 hodina</string>\n    <string name=\"duration_6_hours\">6 hodin</string>\n    <string name=\"duration_1_day\">1 den</string>\n    <string name=\"duration_3_days\">3 dny</string>\n    <string name=\"duration_7_days\">7 dní</string>\n    <string name=\"add_poll_choice\">Přidat možnost</string>\n    <string name=\"poll_allow_multiple_choices\">Lze zvolit více možností</string>\n    <string name=\"poll_new_choice_hint\">Možnost %1$d</string>\n    <string name=\"edit_poll\">Upravit</string>\n    <string name=\"title_scheduled_posts\">Naplánováné příspěvky</string>\n    <string name=\"action_edit\">Upravit</string>\n    <string name=\"action_add_poll\">Přidat anketu</string>\n    <string name=\"action_access_scheduled_posts\">Naplánované příspěvky</string>\n    <string name=\"action_schedule_post\">Naplánované příspěvky</string>\n    <string name=\"action_reset_schedule\">Obnovit</string>\n    <string name=\"pref_title_alway_open_spoiler\">Vždy rozbalovat příspěvky označené varováními o obsahu</string>\n    <string name=\"filter_dialog_whole_word\">Celé slovo</string>\n    <string name=\"filter_dialog_whole_word_description\">Je-li klíčové slovo nebo fráze pouze alfanumerická, bude použita pouze, pokud odpovídá celému slovu</string>\n    <string name=\"title_accounts\">Účty</string>\n    <string name=\"failed_search\">Hledání selhalo</string>\n    <string name=\"post_lookup_error_format\">Chyba při hledání příspěvku %1$s</string>\n    <string name=\"notification_follow_request_description\">Upozornění na žádosti o sledování</string>\n    <string name=\"notification_follow_request_name\">Žádosti o sledování</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Dole</string>\n    <string name=\"pref_title_gradient_for_media\">Ukázat barevné čtverečky místo skrytých médií</string>\n    <string name=\"dialog_mute_hide_notifications\">Skrýt notifikace</string>\n    <string name=\"action_unmute_conversation\">Zrušit ztlumení konverzace</string>\n    <string name=\"action_mute_conversation\">Ztlumit konverzaci</string>\n    <string name=\"action_view_bookmarks\">Záložky</string>\n    <string name=\"action_bookmark\">Záložka</string>\n    <string name=\"title_bookmarks\">Záložky</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Ukazovat náhledy k odkazům</string>\n    <string name=\"warning_scheduling_interval\">Mastodon neumožňuje pracovat s intervalem menším než 5 minut.</string>\n    <string name=\"no_scheduled_posts\">Zatím zde nemáte žádné naplánované statusy.</string>\n    <string name=\"no_drafts\">Zatím zde nemáte žádné koncepty.</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Možnost přetahování prstem pro přechod mezi kartami</string>\n    <string name=\"list\">Seznam</string>\n    <string name=\"add_hashtag_title\">Přidat hashtag</string>\n    <string name=\"description_post_bookmarked\">Uloženo do Záložek</string>\n    <string name=\"select_list_title\">Vybrat seznam</string>\n    <string name=\"pref_main_nav_position\">Umístění hlavní navigační lišty</string>\n    <string name=\"hashtags\">Hashtagy</string>\n    <string name=\"about_powered_by_tusky\">Powered by Tusky</string>\n    <string name=\"dialog_block_warning\">Zablokovat @%1$s?</string>\n    <string name=\"pref_main_nav_position_option_top\">Nahoře</string>\n    <string name=\"action_unmute_domain\">Zrušit skrytí domény %1$s</string>\n    <string name=\"action_unmute_desc\">Zrušit skrytí %1$s</string>\n    <string name=\"dialog_mute_warning\">Skrýt @%1$s?</string>\n    <string name=\"notification_follow_request_format\">%1$s požádal/a aby vás mohl/a sledovat</string>\n    <string name=\"pref_title_confirm_reblogs\">Zobrazit potvrzení při boostování</string>\n    <string name=\"notification_subscription_format\">%1$s právě zveřejnil/a příspěvek</string>\n    <string name=\"title_announcements\">Oznámení</string>\n    <string name=\"title_login\">Přihlášení</string>\n    <string name=\"notification_sign_up_format\">%1$s se zaregistroval/a</string>\n    <string name=\"error_could_not_load_login_page\">Nepodařilo se načíst přihlášovací stránku.</string>\n    <string name=\"drafts_post_failed_to_send\">Tento příspěvek se nepodařilo odeslat!</string>\n    <string name=\"error_loading_account_details\">Nepodařilo se načíst detaily účtu</string>\n    <string name=\"drafts_failed_loading_reply\">Nepodařilo se načíst informace o odpovědi</string>\n    <string name=\"error_image_edit_failed\">Obrázek se nepodařilo upravit.</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s osoba</item>\n        <item quantity=\"few\">%1$s lidi</item>\n        <item quantity=\"other\">%1$s lidí</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">zbývá %1$d hodina</item>\n        <item quantity=\"few\">zbývají %1$d hodiny</item>\n        <item quantity=\"other\">zbývá %1$d hodin</item>\n    </plurals>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Nemůžete nahrát více než %1$d mediální přílohu.</item>\n        <item quantity=\"few\">Nemůžete nahrát více než %1$d mediální přílohy.</item>\n        <item quantity=\"other\">Nemůžete nahrát více než %1$d mediálních příloh.</item>\n    </plurals>\n    <string name=\"delete_scheduled_post_warning\">Smazat tento naplánovaný příspěvek?</string>\n    <string name=\"notification_subscription_description\">Upozornění na nový toot někoho, koho sledujete.</string>\n    <string name=\"instance_rule_info\">Přihlášením souhlasíte s pravidly serveru %1$s.</string>\n    <string name=\"instance_rule_title\">Pravidla serveru %1$s</string>\n    <string name=\"wellbeing_mode_notice\">Některé informace, které mohou ovlivnit Vaši duševní pohodu, mohou být skryty. To zahrnuje:\n\\n\n\\n- Upozornění na boosty, oblíbené a sledování\n\\n- Počty boostů a oblíbení u příspěvků\n\\n- Statistiky sledujících a příspěvků na profilech\n\\n\n\\nPush oznámení nebudou ovlivněna, ale můžete si zkontrolovat jejich nastavení manuálně.</string>\n    <string name=\"compose_save_draft_loses_media\">Uložit koncept? (Přílohy budou znovu nahrány, když obnovíte koncept.)</string>\n    <string name=\"set_focus_description\">Klepnutím nebo přetažením kruhu vyberte ohnisko, které bude vždy viditelné v miniaturách.</string>\n    <string name=\"pref_title_confirm_favourites\">Zobrazit potvrzení při oblíbení</string>\n    <string name=\"pref_title_hide_top_toolbar\">Skrýt nadpis horního panelu nástrojů</string>\n    <string name=\"wellbeing_hide_stats_profile\">Skrýt kvantitativní statistiky profilů</string>\n    <string name=\"dialog_delete_list_warning\">Opravdu chcete smazat seznam %1$s?</string>\n    <string name=\"follow_requests_info\">I když váš účet není uzamčen, zaměstnanci %1$s si myslí, že byste mohli chtít zkontrolovat žádosti o sledování z těchto účtů ručně.</string>\n    <string name=\"action_subscribe_account\">Odebírat</string>\n    <string name=\"action_unsubscribe_account\">Přestat odebírat</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Vytvořit příspěvek</string>\n    <string name=\"draft_deleted\">Koncept byl smazán</string>\n    <string name=\"error_multimedia_size_limit\">Video a audio soubory nesmí překročit velikost %1$s MB.</string>\n    <string name=\"failed_to_pin\">Připnutí se nezdařilo</string>\n    <string name=\"failed_to_unpin\">Zrušení připnutí se nezdařilo</string>\n    <string name=\"pref_show_self_username_always\">Vždy</string>\n    <string name=\"pref_show_self_username_never\">Nikdy</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"action_edit_image\">Upravit obrázek</string>\n    <string name=\"duration_14_days\">14 dní</string>\n    <string name=\"duration_30_days\">30 dní</string>\n    <string name=\"drafts_post_reply_removed\">Příspěvek, na který jste připravili odpověď, byl odstraněn</string>\n    <string name=\"action_set_focus\">Nastavit bod zaostření</string>\n    <string name=\"action_add_reaction\">přidat reakci</string>\n    <string name=\"pref_show_self_username_disambiguate\">Když je přihlášeno více účtů</string>\n    <string name=\"notification_subscription_name\">Nové příspěvky</string>\n    <string name=\"notification_sign_up_name\">Registrace</string>\n    <string name=\"notification_sign_up_description\">Oznámení o nových uživatelích</string>\n    <string name=\"notification_update_name\">Úpravy příspěvků</string>\n    <string name=\"notification_update_description\">Oznámení, když je upraven příspěvek, se kterým jste interagovala, je upraven</string>\n    <string name=\"post_media_audio\">Audio</string>\n    <string name=\"post_media_attachments\">Přílohy</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"description_post_language\">Jazyk příspěvku</string>\n    <string name=\"label_duration\">Doba trvání</string>\n    <string name=\"duration_indefinite\">Na neurčito</string>\n    <string name=\"duration_60_days\">60 dní</string>\n    <string name=\"duration_90_days\">90 dní</string>\n    <string name=\"duration_180_days\">180 dní</string>\n    <string name=\"duration_365_days\">365 dní</string>\n    <string name=\"duration_no_change\">(Beze změny)</string>\n    <string name=\"no_announcements\">Nejsou zde žádná oznámení.</string>\n    <string name=\"pref_title_show_self_username\">Zobrazit uživatelské jméno v panelech nástrojů</string>\n    <string name=\"account_note_hint\">Váše soukromá poznámka o tomto účtu.</string>\n    <string name=\"account_note_saved\">Uloženo!</string>\n    <string name=\"pref_title_wellbeing_mode\">Pohoda</string>\n    <string name=\"review_notifications\">Zkontrolovat oznámení</string>\n    <string name=\"limit_notifications\">Omezit upozornění na časové ose</string>\n    <string name=\"wellbeing_hide_stats_posts\">Skrýt kvantitativní statistiky příspěvků</string>\n    <string name=\"account_date_joined\">Připojil/a se %1$s</string>\n    <string name=\"saving_draft\">Koncept se ukládá…</string>\n    <string name=\"error_following_hashtag_format\">Chyba při sledování #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Chyba při rušení sledování #%1$s</string>\n    <string name=\"notification_update_format\">%1$s upravil/a svůj příspěvek</string>\n    <string name=\"action_unbookmark\">Odebrat záložku</string>\n    <string name=\"action_delete_conversation\">Smazat konverzaci</string>\n    <string name=\"action_dismiss\">Zavřít</string>\n    <string name=\"action_details\">Podrobnosti</string>\n    <string name=\"dialog_delete_conversation_warning\">Smazat tuto konverzaci?</string>\n    <string name=\"pref_title_animate_custom_emojis\">Animovat vlastní emotikony</string>\n    <string name=\"action_follow_hashtag\">Sleduj nový hashtag</string>\n    <string name=\"action_translate\">Přeložit</string>\n    <string name=\"action_show_original\">Ukaž originál</string>\n    <string name=\"send_account_link_to\">Sdílej odkaz na účet do…</string>\n    <string name=\"send_account_username_to\">Sdílej uživatelské jméno účtu do…</string>\n    <string name=\"account_username_copied\">Uživatelské jméno zkopírováno</string>\n    <string name=\"url_copied\">Odkaz zkopírován</string>\n    <string name=\"confirmation_hashtag_copied\">\\'#%1$s\\' zkopírováno</string>\n    <string name=\"reply_sending\">Posílání…</string>\n    <string name=\"reply_sending_long\">Tvá odpověď se posílá.</string>\n    <string name=\"hint_media_description_missing\">Média by měla mít popisek.</string>\n    <string name=\"label_image\">Obrázek</string>\n    <string name=\"pref_title_http_proxy_port_message\">Port by měl být mezi %1$d a %2$d</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Zakázáno</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;nenastaveno&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;neplatné&gt;</string>\n    <string name=\"pref_default_post_language\">Jazyk postu (synchronizováno se serverem)</string>\n    <string name=\"pref_ui_text_size\">Velikost textu v UI</string>\n    <string name=\"notification_notification_worker\">Získávám upozornění…</string>\n    <string name=\"notification_prune_cache\">Údržba cache…</string>\n    <string name=\"pref_title_show_stat_inline\">Ukazovat statistiky postu v timeline</string>\n    <string name=\"pref_title_show_notifications_filter\">Ukaž filtr upozornění</string>\n    <string name=\"ui_error_unknown\">neznámý důvod</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nVerze Androidu: %3$s\n\\nVerze SDK: %4$d</string>\n    <string name=\"about_account_info_title\">Tvůj účet</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nVerze: %3$s</string>\n    <string name=\"error_following_hashtags_unsupported\">Tato instalace nepodporuje sledování hashtagů.</string>\n    <string name=\"error_muting_hashtag_format\">Umlčení selhalo #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Chyba při rušení ztlumení #%1$s</string>\n    <string name=\"action_post_failed_show_drafts\">Ukaž koncepty</string>\n    <string name=\"action_post_failed_do_nothing\">Zrušit</string>\n    <string name=\"post_edited\">Změněno %1$s</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"action_discard\">Zrušit změny</string>\n    <string name=\"action_continue_edit\">Pokračovat v úpravách</string>\n    <string name=\"report_category_other\">Ostatní</string>\n    <string name=\"label_expires_after\">Vyprší za</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"report_category_violation\">Porušení pravidla</string>\n    <string name=\"report_category_legal\">Právní</string>\n    <string name=\"action_unfollow_hashtag_format\">Přestat sledovat #%1$s?</string>\n    <string name=\"pref_title_reading_order\">Pořadí čtení</string>\n    <string name=\"pref_reading_order_oldest_first\">Od nejstarších</string>\n    <string name=\"pref_reading_order_newest_first\">Od nejnovějších</string>\n    <string name=\"status_edit_info\">Upraveno: %1$s</string>\n    <string name=\"ui_error_bookmark\">Vytvoření záložky pro post selhalo: %1$s</string>\n    <string name=\"ui_error_vote\">Hlasování v anketě selhalo: %1$s</string>\n    <string name=\"ui_error_reject_follow_request\">Odmítnutí žádosti o sledování selhalo: %1$s</string>\n    <string name=\"ui_error_translate\">Nelze přeložit: %1$s</string>\n    <string name=\"ui_success_rejected_follow_request\">Žádost o sledování zablokována</string>\n    <string name=\"label_filter_title\">Nadpis</string>\n    <string name=\"filter_action_hide\">Skrýt</string>\n    <string name=\"filter_description_warn\">Skrýt s varováním</string>\n    <string name=\"filter_description_hide\">Zcela skrýt</string>\n    <string name=\"label_filter_action\">Filtrovat akci</string>\n    <string name=\"label_filter_context\">Filtrovat kontexty</string>\n    <string name=\"filter_keyword_display_format\">%1$s (celé slovo)</string>\n    <string name=\"filter_keyword_addition_title\">Přidat klíčové slovo</string>\n    <string name=\"filter_edit_keyword_title\">Upravit klíčové slovo</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"help_empty_home\">Toto je tvá <b>domovská timeline</b>. Ukazuje poslední posty účtů které sleduješ. \n\\n \n\\nChceš-li prozkoumat účty, můžeš je objevit v jedné z dalších timelines. Například místní timeline vaší instance {{group}}. Nebo je můžete hledat podle jména [ikony gmd_search]; například vyhledejte \\\"Tusky\\\" pro náš Mastodon účet.</string>\n    <string name=\"status_created_at_now\">nyní</string>\n    <string name=\"action_refresh\">Obnovit</string>\n    <string name=\"action_browser_login\">Přihlásit se s prohlížečem</string>\n    <string name=\"confirmation_hashtag_unfollowed\">Zrušeno sledování #%1$s</string>\n    <string name=\"mute_notifications_switch\">Ztlumit oznámení</string>\n    <string name=\"notification_unknown_name\">Neznámé</string>\n    <string name=\"ui_error_clear_notifications\">Výmaz upozornění selhal: %1$s</string>\n    <string name=\"app_theme_system_black\">Použij systémový vzhled (černý)</string>\n    <string name=\"ui_error_favourite\">Oblíbení postu selhalo: %1$s</string>\n    <string name=\"ui_error_reblog\">Boostování postu selhalo: %1$s</string>\n    <string name=\"action_share_account_link\">Sdílej odkaz na účet</string>\n    <string name=\"action_share_account_username\">Sdílej uživatelské jméno účtu</string>\n    <string name=\"select_list_manage\">Spravovat seznamy</string>\n    <string name=\"error_status_source_load\">Nepodařilo se načíst zprávu ze serveru.</string>\n    <string name=\"status_filtered_show_anyway\">Přesto ukaž</string>\n    <string name=\"status_filter_placeholder_label_format\">Filtrované: %1$s</string>\n    <string name=\"pref_title_account_filter_keywords\">Profily</string>\n    <string name=\"hint_filter_title\">Můj filtr</string>\n    <string name=\"muting_hashtag_success_format\">Ztlumení hashtagu #%1$s jako varování</string>\n    <string name=\"action_view_filter\">Zobrazit filtr</string>\n    <string name=\"pref_default_reply_privacy_explanation\">Přednastavené soukromí bude záležet na postu na který odpovídáte.</string>\n    <string name=\"pref_match_default_post_privacy\">Sladit výchozí soukromí příspěvků</string>\n    <string name=\"notification_report_name\">Hlášení</string>\n    <string name=\"notification_report_description\">Upozornění na hlášení moderátorů</string>\n    <string name=\"notification_listenable_worker_name\">Aktivita v pozadí</string>\n    <string name=\"post_media_image\">Obrázek</string>\n    <string name=\"action_add_or_remove_from_list\">Přidat nebo odebrat ze seznamu</string>\n    <string name=\"failed_to_add_to_list\">Selhalo přidání účtu do seznamu</string>\n    <string name=\"failed_to_remove_from_list\">Selhalo odebrání účtu ze seznamu</string>\n    <string name=\"compose_delete_draft\">Smazat koncept?</string>\n    <string name=\"label_translating\">Překládání…</string>\n    <string name=\"label_translated\">Přeloženo z %1$s s %2$s</string>\n    <string name=\"following_hashtag_success_format\">Nyní sleduji hashtag #%1$s</string>\n    <string name=\"unfollowing_hashtag_success_format\">Nyní již nesleduješ hashtag #%1$s</string>\n    <string name=\"pref_title_confirm_follows\">Zobrazit potvrzení před sledováním</string>\n    <string name=\"status_created_info\">Vytvořeno: %1$s</string>\n    <string name=\"error_missing_edits\">Tvůj server ví, že tento post byl upraven, ale nemá kopii změn takže nemohou být zobrazeny. \n\\n \n\\nToto je <a href=\"https://github.com/mastodon/mastodon/issues/25398\">chyba v Mastodonu #25398</a>.</string>\n    <string name=\"a11y_label_loading_thread\">Načítání vlákna</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d lidí mluví o hashtagu %2$s</string>\n    <string name=\"total_usage\">Celkově použito</string>\n    <string name=\"title_public_trending_statuses\">Populární příspěvky</string>\n    <string name=\"list_exclusive_label\">Skrýt z domovské timeline</string>\n    <string name=\"action_add\">Přidat</string>\n    <string name=\"label_filter_keywords\">Klíčová slova nebo fráze k filtrování</string>\n    <string name=\"error_blocking_domain\">Nezdařilo se ztlumení %1$s: %2$s</string>\n    <string name=\"error_unblocking_domain\">Nezdařilo se zrušit ztlumení %1$s: %2$s</string>\n    <string name=\"title_public_trending_hashtags\">Populární hashtagy</string>\n    <string name=\"error_media_upload_sending_fmt\">Nahrávání selhalo: %1$s</string>\n    <string name=\"title_followed_hashtags\">Sledované hashtagy</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Nahrávání tvého postu selhalo a post byl uložen mezi koncepty.\n\\n\n\\nServer buď nemohl být kontaktován, nebo post odmítl.</item>\n        <item quantity=\"few\"/>\n        <item quantity=\"other\">Nahrávání tvých postuů selhalo a posty byly uloženy mezi koncepty.\n\\n\n\\nServer buď nemohl být kontaktován, nebo posty odmítl.</item>\n    </plurals>\n    <string name=\"post_privacy_direct\">Přímo</string>\n    <string name=\"notification_listenable_worker_description\">Upozornění když Tusky běží na pozadí</string>\n    <string name=\"about_device_info_title\">Tvé zařízení</string>\n    <string name=\"compose_unsaved_changes\">Máš neuložené změny.</string>\n    <string name=\"unmuting_hashtag_success_format\">Zrušení ztlumení hashtagu #%1$s</string>\n    <string name=\"description_login\">Funguje ve většině případů. Žádná data nejsou dostupná jiným aplikacím.</string>\n    <string name=\"total_accounts\">Celkově účtů</string>\n    <string name=\"socket_timeout_exception\">Kontaktování tvého serveru se nějak protáhlo</string>\n    <string name=\"pref_default_reply_privacy\">Soukromí odpovědí (nesynchronizováno se serverem)</string>\n    <string name=\"report_category_spam\">Spam</string>\n    <string name=\"dialog_follow_warning\">Sledovat tento účet?</string>\n    <string name=\"pref_title_show_self_boosts\">Ukazuj vlastní boosty</string>\n    <string name=\"pref_title_show_self_boosts_description\">Někdo boostuje svůj vlastní post</string>\n    <string name=\"description_post_edited\">Upraveno</string>\n    <string name=\"description_browser_login\">Může podporovat dodatečné metody autentikace, ale vyžaduje podporovaný prohlížeč.</string>\n    <string name=\"no_lists\">Nemáš žádné seznamy.</string>\n    <string name=\"ui_success_accepted_follow_request\">Žádost o sledování přijata</string>\n    <string name=\"filter_action_warn\">Pozor</string>\n    <string name=\"error_deleting_filter\">Chyba při mazání filtru \\'%1$s\\'</string>\n    <string name=\"error_saving_filter\">Chyba při ukládání filtru \\'%1$s\\'</string>\n    <string name=\"title_edits\">Změny</string>\n    <string name=\"dialog_follow_hashtag_title\">Sleduj hashtag</string>\n    <string name=\"notification_report_format\">Nové hlášení z %1$s</string>\n    <string name=\"notification_header_report_format\">%1$s nahlášeno %2$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d postů připojeno</string>\n    <string name=\"action_post_failed\">Nahrávání selhalo</string>\n    <string name=\"ui_error_accept_follow_request\">Povolení žádosti o sledování selhalo: %1$s</string>\n    <string name=\"help_empty_lists\">Toto je tvůj seznam <b>seznamů</b>. Můžeš si definovat různý počet soukromých seznamů a přidat do nich uživatelské účty. \\u0020\n\\n \\u0020\n\\nPoznámka: do seznamů můžeš přidat jen účty které sleduješ. \\u0020\n\\n \\u0020\n\\nTyto seznamy můžou být použity tako taby na tabu Nastavení účtu [iconics gmd_account_circle] [iconics gmd_navigate_next].</string>\n    <string name=\"about_copy\">Zkopírovat verzi a informace o zařízení</string>\n    <string name=\"about_copied\">Verze a informace o zařízení zkopírovány</string>\n    <string name=\"list_reply_policy_followed\">Jakýkoli sledovaný uživatel</string>\n    <string name=\"list_reply_policy_label\">Ukázat odpovědi na</string>\n    <string name=\"unknown_notification_type\">Neznámý typ upozornění</string>\n    <string name=\"dialog_delete_filter_text\">Smazat filtr \\'%1$s\\'?</string>\n    <string name=\"notification_policies_title\">Politiky upozornění</string>\n    <string name=\"notification_policies_filter_out\">Spravovat notifikace z…</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">Lidé které nesleduješ</string>\n    <string name=\"notification_policies_filter_dont_follow_description\">Dokud je ručně neschválíš</string>\n    <string name=\"notification_policies_filter_not_following_title\">Lidé kteří tě nesledují</string>\n    <string name=\"notification_policies_filter_not_following_description\">Včetně lidí kteří tě sledovali méně než 3 dny</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">Nové účty</string>\n    <string name=\"unknown_notification_filter_new_accounts_description\">Vytvořeno během posledních 30 dnů</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_title\">Nevyžádané soukromé zmínky</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_description\">Filtrováno, pokud to není odpověď na vaše vlastní zmínění nebo pokud nesledujete odesílatele</string>\n    <string name=\"unknown_notification_filter_moderated_accounts\">Moderovaný účet</string>\n    <string name=\"unknown_notification_filter_moderated_accounts_description\">Omezené moderátory serveru</string>\n    <string name=\"notification_policies_not_supported\">Tato vlastnost je podporována pouze na Mastodon serverech s verzí v4.3.0 nebo novější.</string>\n    <string name=\"filtered_notifications\">Filtrovaná upozornění</string>\n    <string name=\"notifications_from_people_you_may_know\">Upozornění od %1$d lidí které možná znáte</string>\n    <string name=\"notification_policy_accept\">Přijmout</string>\n    <string name=\"notification_policy_filter\">Filtrovat</string>\n    <string name=\"notification_policy_ignore\">Ignorovat</string>\n    <string name=\"filtered_notifications_title\">Filtrovaná upozornění</string>\n    <string name=\"accept_notification_request\">Přijmout žádost o upozornění</string>\n    <string name=\"dismiss_notification_request\">Zamítnout žádost o upozornění</string>\n    <string name=\"open_settings\">Otevřít předvolby</string>\n    <string name=\"notifications_from\">Upozornění od %1$s</string>\n    <string name=\"action_accept_notification_request\">Přijmout</string>\n    <string name=\"action_dismiss_notification_request\">Zrušit</string>\n    <string name=\"help_empty_conversations\">Zde jsou tvé <b>soukromé zprávy</b>; někdy zvané konverzace nebo přímé zprávy (direct messages, DM). \\u0020\n\\n \\u0020\n\\nSoukromé zprávy se vytvoří nastavením viditelnosti {{public}} postu na {{mail}} <i>Přímé</i> a zmíněním jednoho nebo více uživatelů v textu. \\u0020\n\\n \\u0020\n\\nNa příklad můžeš začít na profilu uživatele a tapnout na tlačítko vytvoření zprávy [iconics gmd_edit] a změnit viditelnost.</string>\n    <string name=\"dialog_delete_filter_positive_action\">Smazat</string>\n    <string name=\"dialog_save_profile_changes_message\">Chceš uložit změnu ve svém profilu?</string>\n    <string name=\"load_newest_notifications\">Načti nejnovější upozornění</string>\n    <string name=\"error_media_playback\">Přehrávání selhalo: %1$s</string>\n    <string name=\"list_reply_policy_none\">Nikdo</string>\n    <string name=\"list_reply_policy_list\">Členové seznamu</string>\n    <string name=\"preview_card_by_author\">Od %1$s</string>\n    <string name=\"preview_card_more_by_author\">Více od %1$s</string>\n    <string name=\"post_replied_self\">Pokračování vlákna</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-cy/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">Digwyddodd gwall.</string>\n    <string name=\"error_empty\">Gall hwn ddim fod yn wag.</string>\n    <string name=\"error_invalid_domain\">Wedi cynnig parth annilys</string>\n    <string name=\"error_failed_app_registration\">Wedi methu ag awdurdodi gyda\\'r gweinydd hwnnw. Os bydd hyn yn parhau, ceisiwch Mewngofnodi yn y Porwr o\\'r ddewislen.</string>\n    <string name=\"error_no_web_browser_found\">Methu dod o hyd i borwr gwe i\\'w ddefnyddio.</string>\n    <string name=\"error_authorization_unknown\">Bu gwall awdurdodi anhysbys. Os bydd hyn yn parhau, ceisiwch Mewngofnodi yn y Porwr o\\'r ddewislen.</string>\n    <string name=\"error_authorization_denied\">Gwrthodwyd awdurdodi. Os ydych yn siŵr eich bod chi wedi gyflenwi\\'r manylion cywir, ceisiwch Mewngofnodi yn y Porwr o\\'r ddewislen.</string>\n    <string name=\"error_retrieving_oauth_token\">Wedi methu cael tocyn mewngofnodi. Os bydd hyn yn parhau, ceisiwch Mewngofnodi yn y Porwr o\\'r ddewislen.</string>\n    <string name=\"error_compose_character_limit\">Mae\\'r neges yn rhy hir!</string>\n    <string name=\"error_media_upload_type\">Nid oes modd llwytho\\'r math yma o ffeil.</string>\n    <string name=\"error_media_upload_opening\">Nid oedd modd agor y ffeil honno.</string>\n    <string name=\"error_media_upload_permission\">Rhaid cael caniatâd i ddarllen cyfryngau.</string>\n    <string name=\"error_media_download_permission\">Rhaid cael caniatâd i gadw cyfryngau.</string>\n    <string name=\"error_media_upload_image_or_video\">Ni allwch chi atodi delweddau a fideos i\\'r un neges.</string>\n    <string name=\"error_media_upload_sending\">Methodd llwytho i fyny.</string>\n    <string name=\"error_sender_account_gone\">Bu gwall wrth anfon y neges.</string>\n    <string name=\"title_home\">Hafan</string>\n    <string name=\"title_notifications\">Hysbysiadau</string>\n    <string name=\"title_public_local\">Lleol</string>\n    <string name=\"title_public_federated\">Ffedereiddiwyd</string>\n    <string name=\"title_view_thread\">Edefyn</string>\n    <string name=\"title_posts\">Negeseuon</string>\n    <string name=\"title_posts_with_replies\">Gydag ymatebion</string>\n    <string name=\"title_follows\">Yn dilyn</string>\n    <string name=\"title_followers\">Dilynwyr</string>\n    <string name=\"title_favourites\">Ffefrynnau</string>\n    <string name=\"title_mutes\">Defnyddwyr wedi\\'u tewi</string>\n    <string name=\"title_blocks\">Defnyddwyr wedi\\'u rhwystro</string>\n    <string name=\"title_follow_requests\">Ceisiadau i\\'ch dilyn</string>\n    <string name=\"title_edit_profile\">Golygu eich proffil</string>\n    <string name=\"title_drafts\">Drafftiau</string>\n    <string name=\"title_licenses\">Trwyddedau</string>\n    <string name=\"post_boosted_format\">Hybodd %1$s</string>\n    <string name=\"post_sensitive_media_title\">Cynnwys sensitif</string>\n    <string name=\"post_media_hidden_title\">Cyfryngau cudd</string>\n    <string name=\"post_sensitive_media_directions\">Cliciwch i weld</string>\n    <string name=\"post_content_warning_show_more\">Dangos mwy</string>\n    <string name=\"post_content_warning_show_less\">Dangos llai</string>\n    <string name=\"post_content_show_more\">Chwyddo</string>\n    <string name=\"post_content_show_less\">Lleihau</string>\n    <string name=\"footer_empty\">Dim byd yma. Tynnwch lawr i adnewyddu!</string>\n    <string name=\"notification_reblog_format\">Hybodd %1$s eich neges</string>\n    <string name=\"notification_favourite_format\">Hoffodd %1$s eich neges</string>\n    <string name=\"notification_follow_format\">Mae %1$s yn eich dilyn</string>\n    <string name=\"report_username_format\">Adrodd @%1$s</string>\n    <string name=\"report_comment_hint\">Sylwadau ychwanegol?</string>\n    <string name=\"action_quick_reply\">Ymateb yn gyflym</string>\n    <string name=\"action_reply\">Ymateb</string>\n    <string name=\"action_reblog\">Hybu</string>\n    <string name=\"action_favourite\">Hoffi</string>\n    <string name=\"action_more\">Mwy</string>\n    <string name=\"action_compose\">Creu</string>\n    <string name=\"action_login\">Mewngofnodi â Tusky</string>\n    <string name=\"action_logout\">Allgofnodi</string>\n    <string name=\"action_logout_confirm\">Ydych chi\\'n siŵr eich bod am allgofnodi o\\'r cyfrif %1$s? Bydd hyn yn dileu\\'r holl ddata lleol, gan gynnwys drafftiau a dewisiadau.</string>\n    <string name=\"action_follow\">Dilyn</string>\n    <string name=\"action_unfollow\">Dad-ddilyn</string>\n    <string name=\"action_block\">Rhwystro</string>\n    <string name=\"action_unblock\">Dadrwystro</string>\n    <string name=\"action_hide_reblogs\">Cuddio hybiau</string>\n    <string name=\"action_show_reblogs\">Dangos hybiau</string>\n    <string name=\"action_report\">Adrodd</string>\n    <string name=\"action_delete\">Dileu</string>\n    <string name=\"action_send\">TŴTIO</string>\n    <string name=\"action_send_public\">TŴTIO!</string>\n    <string name=\"action_retry\">Ceisio eto</string>\n    <string name=\"action_close\">Cau</string>\n    <string name=\"action_view_profile\">Proffil</string>\n    <string name=\"action_view_preferences\">Dewisiadau</string>\n    <string name=\"action_view_favourites\">Ffefrynnau</string>\n    <string name=\"action_view_mutes\">Defnyddwyr wedi\\'u tewi</string>\n    <string name=\"action_view_blocks\">Defnyddwyr wedi\\'u rhwystro</string>\n    <string name=\"action_view_follow_requests\">Ceisiadau i\\'ch dilyn</string>\n    <string name=\"action_view_media\">Cyfryngau</string>\n    <string name=\"action_open_in_web\">Agor mewn porwr</string>\n    <string name=\"action_add_media\">Ychwanegu cyfryngau</string>\n    <string name=\"action_photo_take\">Tynnu llun</string>\n    <string name=\"action_share\">Rhannu</string>\n    <string name=\"action_mute\">Tewi</string>\n    <string name=\"action_unmute\">Dad-dewi</string>\n    <string name=\"action_mention\">Crybwyll</string>\n    <string name=\"action_hide_media\">Cuddio cyfryngau</string>\n    <string name=\"action_open_drawer\">Agor drôr</string>\n    <string name=\"action_save\">Cadw</string>\n    <string name=\"action_edit_profile\">Golygu\\'ch proffil</string>\n    <string name=\"action_edit_own_profile\">Golygu</string>\n    <string name=\"action_undo\">Dadwneud</string>\n    <string name=\"action_accept\">Derbyn</string>\n    <string name=\"action_reject\">Gwrthod</string>\n    <string name=\"action_search\">Chwilio</string>\n    <string name=\"action_access_drafts\">Drafftiau</string>\n    <string name=\"action_toggle_visibility\">Gwelededd y neges</string>\n    <string name=\"action_content_warning\">Rhybudd cynnwys</string>\n    <string name=\"action_emoji_keyboard\">Bysellfwrdd emoji</string>\n    <string name=\"download_image\">Yn lawrlwytho %1$s</string>\n    <string name=\"action_copy_link\">Copïo\\'r ddolen</string>\n    <string name=\"send_post_link_to\">Rhannu URL y neges i…</string>\n    <string name=\"send_post_content_to\">Rhannu\\'r neges i…</string>\n    <string name=\"send_media_to\">Rhannu\\'r cyfryngau i…</string>\n    <string name=\"confirmation_reported\">Anfonwyd!</string>\n    <string name=\"confirmation_unblocked\">Dadrwystrwyd y defnyddiwr</string>\n    <string name=\"confirmation_unmuted\">Dad-dawyd defnyddiwr</string>\n    <string name=\"hint_domain\">Pa weinydd?</string>\n    <string name=\"hint_compose\">Beth sy\\'n digwydd?</string>\n    <string name=\"hint_content_warning\">Rhybudd cynnwys</string>\n    <string name=\"hint_display_name\">Enw dangos</string>\n    <string name=\"hint_note\">Amdanaf</string>\n    <string name=\"hint_search\">Chwilio…</string>\n    <string name=\"search_no_results\">Dim canlyniadau</string>\n    <string name=\"label_quick_reply\">Ymateb…</string>\n    <string name=\"label_avatar\">Llun proffil</string>\n    <string name=\"label_header\">Pennyn</string>\n    <string name=\"link_whats_an_instance\">Beth yw gweinydd?</string>\n    <string name=\"login_connection\">Yn cysylltu…</string>\n    <string name=\"dialog_whats_an_instance\">Gallwch chi roi cyfeiriad neu barth o unrhyw weinydd yma, fel mastodon.social, twt.cymru, social.tchncs.de, a <a href=\"https://instances.social\">rhagor!</a> \\u0020 \n\\n \\u0020 \n\\nOs nad oes gennych chi gyfrif, gallwch chi roi enw\\'r gweinydd yr hoffech chi ymuno ag ef a chreu cyfrif yno. \\u0020 \n\\n \\u0020 \n\\nGweinydd yw\\'r man y mae\\'ch gyfrif wedi\\'i gynnal, ond gallwch chi gyfathrebu\\'n hawdd â phobl a\\'u dilyn ar weinyddion eraill fel petaech yn yr unfan. \\u0020 \n\\n \\u0020 \n\\nRhagor o wybodaeth yn <a href=\"https://joinmastodon.org\">joinmastodon.org</a>.</string>\n    <string name=\"dialog_title_finishing_media_upload\">Yn Gorffen Llwytho\\'r Cyfryngau i Fyny</string>\n    <string name=\"dialog_message_uploading_media\">Yn llwytho i fyny…</string>\n    <string name=\"dialog_download_image\">Lawrlwytho</string>\n    <string name=\"dialog_message_cancel_follow_request\">Dirymu\\'r cais i\\'ch dilyn?</string>\n    <string name=\"dialog_unfollow_warning\">Dad-ddilyn y cyfrif hwn?</string>\n    <string name=\"dialog_delete_post_warning\">Dileu\\'r neges hon?</string>\n    <string name=\"visibility_public\">Cyhoeddus: Postio i ffrydiau cyhoeddus</string>\n    <string name=\"visibility_unlisted\">Heb restru: Peidio â dangos ar ffrydiau cyhoeddus</string>\n    <string name=\"visibility_private\">Dilynwyr yn unig: Postio at ddilynwyr yn unig</string>\n    <string name=\"visibility_direct\">Uniongyrchol: Postio at ddefnyddwyr wedi\\'u crybwyll yn unig</string>\n    <string name=\"pref_title_edit_notification_settings\">Hysbysiadau</string>\n    <string name=\"pref_title_notifications_enabled\">Hysbysiadau</string>\n    <string name=\"pref_title_notification_alerts\">Rhybuddion</string>\n    <string name=\"pref_title_notification_alert_sound\">Hysbysu â sain</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Hysbysiad drwy grynu</string>\n    <string name=\"pref_title_notification_alert_light\">Hysbysu â golau</string>\n    <string name=\"pref_title_notification_filters\">Mathau hysbysiad wedi\\'u galluogi</string>\n    <string name=\"pref_title_appearance_settings\">Gwedd</string>\n    <string name=\"pref_title_app_theme\">Thema\\'r ap</string>\n    <string name=\"app_them_dark\">Tywyll</string>\n    <string name=\"app_theme_light\">Golau</string>\n    <string name=\"app_theme_black\">Du</string>\n    <string name=\"app_theme_auto\">Awtomatig wrth iddi nosi</string>\n    <string name=\"pref_title_browser_settings\">Porwr</string>\n    <string name=\"pref_title_custom_tabs\">Defnyddio Tabiau Cyfaddas Chrome</string>\n    <string name=\"pref_title_post_filter\">Hidlo ffrydiau</string>\n    <string name=\"pref_title_post_tabs\">Ffrwd gartref</string>\n    <string name=\"pref_title_show_boosts\">Dangos hybiau</string>\n    <string name=\"pref_title_show_replies\">Dangos ymatebion</string>\n    <string name=\"pref_title_show_media_preview\">Dangos rhagolwg cyfryngau</string>\n    <string name=\"pref_title_proxy_settings\">Dirprwy</string>\n    <string name=\"pref_title_http_proxy_settings\">Dirprwy HTTP</string>\n    <string name=\"pref_title_http_proxy_enable\">Galluogi dirprwy HTTP</string>\n    <string name=\"pref_title_http_proxy_server\">Gweinydd dirprwy HTTP</string>\n    <string name=\"pref_title_http_proxy_port\">Porth y dirprwy HTTP</string>\n    <string name=\"pref_default_post_privacy\">Preifatrwydd negeseuon (bydd yn cael ei gydweddu gyda\\'ch gweinydd)</string>\n    <string name=\"pref_publishing\">Rhagosodiadau postio</string>\n    <string name=\"post_privacy_public\">Cyhoeddus</string>\n    <string name=\"post_privacy_unlisted\">Heb ei restru</string>\n    <string name=\"post_privacy_followers_only\">Dilynwyr yn unig</string>\n    <string name=\"pref_post_text_size\">Maint testun negeseuon</string>\n    <string name=\"post_text_size_smallest\">Lleiaf</string>\n    <string name=\"post_text_size_small\">Bach</string>\n    <string name=\"post_text_size_medium\">Canolig</string>\n    <string name=\"post_text_size_large\">Mawr</string>\n    <string name=\"post_text_size_largest\">Mwyaf</string>\n    <string name=\"notification_mention_name\">Crybwylliadau newydd</string>\n    <string name=\"notification_mention_descriptions\">Hysbysiadau am grybwylliadau newydd</string>\n    <string name=\"notification_follow_name\">Dilynwyr newydd</string>\n    <string name=\"notification_follow_description\">Hysbysiadau am ddilynwyr newydd</string>\n    <string name=\"notification_boost_name\">Hybiau</string>\n    <string name=\"notification_boost_description\">Hysbysiadau pan gaiff eich negeseuon eu hybu</string>\n    <string name=\"notification_favourite_name\">Ffefrynnau</string>\n    <string name=\"notification_favourite_description\">Hysbysiadau pan gaiff eich negeseuon eu marcio fel ffefryn</string>\n    <string name=\"notification_mention_format\">Crybwyllodd %1$s chi</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s a %4$d eraill</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, a %3$s</string>\n    <string name=\"notification_summary_small\">%1$s a %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"zero\">%1$d rhyngweithiadau newydd</item>\n        <item quantity=\"one\">%1$d rhyngweithiad newydd</item>\n        <item quantity=\"two\">%1$d ryngweithiad newydd</item>\n        <item quantity=\"few\">%1$d rhyngweithiad newydd</item>\n        <item quantity=\"many\">%1$d rhyngweithiad newydd</item>\n        <item quantity=\"other\">%1$d rhyngweithiad newydd</item>\n    </plurals>\n    <string name=\"description_account_locked\">Cyfrif wedi\\'i gloi</string>\n    <string name=\"about_title_activity\">Ynghylch</string>\n    <string name=\"about_tusky_license\">Mae Tusky yn feddalwedd cod-agored ac am ddim. Mae\\'n cael ei drwyddedu o dan Drwydded Cyhoeddus Cyffredinol GNU Fersiwn 3. Gallwch chi weld y drwydded yma: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">Gwefan y project: https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Adrodd ar wallau a cheisiadau nodweddion:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Proffil Tusky</string>\n    <string name=\"post_share_content\">Rhannu cynnwys y neges</string>\n    <string name=\"post_share_link\">Rhannu dolen i\\'r neges</string>\n    <string name=\"post_media_images\">Delweddau</string>\n    <string name=\"post_media_video\">Fideo</string>\n    <string name=\"state_follow_requested\">Ceisiwyd</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">ymhen %1$db</string>\n    <string name=\"abbreviated_in_days\">ymhen %1$dd</string>\n    <string name=\"abbreviated_in_hours\">ymhen %1$da</string>\n    <string name=\"abbreviated_in_minutes\">ymhen %1$dm</string>\n    <string name=\"abbreviated_in_seconds\">ymhen %1$de</string>\n    <string name=\"abbreviated_years_ago\">%1$db yn ôl</string>\n    <string name=\"abbreviated_days_ago\">%1$dd yn ôl</string>\n    <string name=\"abbreviated_hours_ago\">%1$da yn ôl</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm yn ôl</string>\n    <string name=\"abbreviated_seconds_ago\">%1$de yn ôl</string>\n    <string name=\"follows_you\">Yn eich dilyn</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Dangos cyfryngau sensitif bob tro</string>\n    <string name=\"title_media\">Cyfryngau</string>\n    <string name=\"replying_to\">Yn ymateb i @%1$s</string>\n    <string name=\"load_more_placeholder_text\">Llwytho rhagor</string>\n    <string name=\"add_account_name\">Ychwanegu cyfrif</string>\n    <string name=\"add_account_description\">Ychwanegu cyfrif Mastodon newydd</string>\n    <string name=\"action_lists\">Rhestrau</string>\n    <string name=\"title_lists\">Rhestrau</string>\n    <string name=\"compose_active_account_description\">Yn postio fel %1$s</string>\n    <string name=\"action_set_caption\">Gosod pennawd</string>\n    <string name=\"action_remove\">Dileu</string>\n    <string name=\"lock_account_label\">Cloi cyfrif</string>\n    <string name=\"lock_account_label_description\">Bydd angen i chi cymeradwyo eich dilynwyr eich hunan</string>\n    <string name=\"compose_save_draft\">Cadw drafft?</string>\n    <string name=\"send_post_notification_title\">Yn anfon y neges…</string>\n    <string name=\"send_post_notification_error_title\">Gwall wrth anfon y neges</string>\n    <string name=\"send_post_notification_channel_name\">Yn anfon negeseuon</string>\n    <string name=\"send_post_notification_cancel_title\">Diddymwyd anfon</string>\n    <string name=\"send_post_notification_saved_content\">Cadwyd copi o\\'r neges i\\'ch drafftiau</string>\n    <string name=\"action_compose_shortcut\">Creu</string>\n    <string name=\"error_no_custom_emojis\">Nid oes gan eich gweinydd %1$s emojis personol</string>\n    <string name=\"emoji_style\">Arddull emoji</string>\n    <string name=\"system_default\">Rhagosodiad system</string>\n    <string name=\"download_fonts\">Bydd angen i chi lawrlwytho\\'r setiau emoji hyn yn gyntaf</string>\n    <string name=\"performing_lookup_title\">Wrthi\\'n chwilio…</string>\n    <string name=\"expand_collapse_all_posts\">Chwyddo/lleihau pob neges</string>\n    <string name=\"action_open_post\">Agor y neges</string>\n    <string name=\"restart_required\">Rhaid ailddechrau\\'r ap</string>\n    <string name=\"restart_emoji\">Bydd angen ailddechrau Tusky i roi\\'r newidiadau ar waith</string>\n    <string name=\"later\">Yn ddiweddarach</string>\n    <string name=\"restart\">Ailddechrau</string>\n    <string name=\"caption_systememoji\">Set emoji ragosodedig eich dyfais</string>\n    <string name=\"caption_blobmoji\">Daw\\'r emoji Blob o Android 4.4–7.1</string>\n    <string name=\"caption_twemoji\">Set emoji safonol Mastodon</string>\n    <string name=\"download_failed\">Methodd y lawrlwytho</string>\n    <string name=\"account_moved_description\">Mae %1$s wedi symud i:</string>\n    <string name=\"reblog_private\">Hybu i\\'r gynulleidfa wreiddiol</string>\n    <string name=\"unreblog_private\">Dad-hybu</string>\n    <string name=\"license_description\">Mae Tusky yn cynnwys cod ac asedau o\\'r projectau cod agored canlynol:</string>\n    <string name=\"license_apache_2\">Yn cael ei drwyddedu o Drwydded Apache (copi isod)</string>\n    <string name=\"profile_metadata_label\">Metadata\\'r proffil</string>\n    <string name=\"profile_metadata_add\">ychwanegu data</string>\n    <string name=\"profile_metadata_content_label\">Cynnwys</string>\n    <string name=\"pref_title_absolute_time\">Defnyddio amser absoliwt</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"error_network\">Digwyddodd gwall rhwydwaith. Gwiriwch eich cysylltiad a cheisiwch eto.</string>\n    <string name=\"title_direct_messages\">Negeseuon uniongyrchol</string>\n    <string name=\"title_tab_preferences\">Tabiau</string>\n    <string name=\"title_posts_pinned\">Wedi\\'i binio</string>\n    <string name=\"title_domain_mutes\">Parthau cudd</string>\n    <string name=\"message_empty\">Dim byd yma.</string>\n    <string name=\"action_unreblog\">Dileu hwb</string>\n    <string name=\"action_unfavourite\">Dileu ffefryn</string>\n    <string name=\"action_delete_and_redraft\">Dileu ac ailddrafftio</string>\n    <string name=\"action_view_account_preferences\">Dewisiadau\\'ch cyfrif</string>\n    <string name=\"action_view_domain_mutes\">Parthau cudd</string>\n    <string name=\"action_mute_domain\">Tewi %1$s</string>\n    <string name=\"action_add_tab\">Ychwanegu tab</string>\n    <string name=\"action_links\">Dolenni</string>\n    <string name=\"title_links_dialog\">Dolenni</string>\n    <string name=\"action_open_reblogged_by\">Dangos hybiau</string>\n    <string name=\"notification_follow_request_name\">Ceisiadau i\\'ch dilyn</string>\n    <string name=\"action_bookmark\">Tudalnodi</string>\n    <string name=\"action_edit\">Golygu</string>\n    <string name=\"edit_poll\">Golygu</string>\n    <string name=\"compose_shortcut_short_label\">Creu</string>\n    <string name=\"description_visibility_private\">Dilynwyr</string>\n    <string name=\"description_visibility_unlisted\">Heb ei restru</string>\n    <string name=\"conversation_2_recipients\">%1$s a %2$s</string>\n    <string name=\"filter_dialog_remove_button\">Dileu</string>\n    <string name=\"description_visibility_public\">Cyhoeddus</string>\n    <string name=\"action_unmute_conversation\">Dad-dewi\\'r sgwrs</string>\n    <string name=\"pref_title_thread_filter_keywords\">Sgyrsiau</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Cuddio parth i gyd</string>\n    <string name=\"action_mute_conversation\">Tewi\\'r sgwrs</string>\n    <string name=\"notifications_apply_filter\">Hidlo</string>\n    <string name=\"notification_poll_description\">Hysbysiadau am bolau sydd wedi\\'u cwblhau</string>\n    <string name=\"account_date_joined\">Ymunodd %1$s</string>\n    <string name=\"no_scheduled_posts\">Does gennych chi ddim negeseuon wedi\\'u hamserlennu.</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"notification_clear_text\">Ydych chi\\'n siŵr eich bod chi am glirio\\'ch holl hysbysiadau yn barhaol?</string>\n    <string name=\"error_multimedia_size_limit\">Nid yw ffeiliau fideo a sain yn gallu bod yn fwy na %1$s MB.</string>\n    <string name=\"error_following_hashtag_format\">Gwall wrth ddilyn #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Gwall wrth ddad-ddilyn #%1$s</string>\n    <string name=\"action_unmute_domain\">Dad-dewi %1$s</string>\n    <string name=\"notification_subscription_format\">Postiodd %1$s</string>\n    <string name=\"action_delete_conversation\">Dileu\\'r sgwrs</string>\n    <string name=\"action_view_bookmarks\">Tudalnodau</string>\n    <string name=\"action_add_poll\">Ychwanegu pôl</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s wedi\\'i amlygu</string>\n    <string name=\"action_access_scheduled_posts\">Negeseuon wedi\\'u hamserlennu</string>\n    <string name=\"action_schedule_post\">Amserlennu Neges</string>\n    <string name=\"action_mentions\">Crybwylliadau</string>\n    <string name=\"dialog_mute_warning\">Tewi @%1$s?</string>\n    <string name=\"dialog_mute_hide_notifications\">Cuddio hysbysiadau</string>\n    <string name=\"pref_title_timeline_filters\">Hidlyddion</string>\n    <string name=\"dialog_block_warning\">Rhwystro @%1$s?</string>\n    <string name=\"notification_subscription_name\">Negeseuon newydd</string>\n    <string name=\"notification_update_name\">Golygiadau\\'r neges</string>\n    <string name=\"notification_poll_name\">Canlyniadau y pôl</string>\n    <string name=\"notification_sign_up_name\">Cofrestriadau</string>\n    <string name=\"pref_title_public_filter_keywords\">Ffrydiau cyhoeddus</string>\n    <string name=\"filter_addition_title\">Ychwanegu hidlydd</string>\n    <string name=\"filter_edit_title\">Golygu hidlydd</string>\n    <string name=\"filter_dialog_update_button\">Diweddaru</string>\n    <string name=\"notification_update_format\">Golygodd %1$s ei neges</string>\n    <string name=\"filter_apply\">Gosod</string>\n    <string name=\"notifications_clear\">Dileu</string>\n    <string name=\"filter_dialog_whole_word\">Gair cyfan</string>\n    <string name=\"filter_add_description\">Ymadrodd i\\'w hidlo</string>\n    <string name=\"action_open_as\">Agor fel %1$s</string>\n    <string name=\"action_reset_schedule\">Ailosod</string>\n    <string name=\"title_bookmarks\">Tudalnodau</string>\n    <string name=\"notification_follow_request_format\">Gofynnodd %1$s i\\'ch dilyn chi</string>\n    <string name=\"title_login\">Mewngofnodi</string>\n    <string name=\"notification_sign_up_format\">Cofrestrodd %1$s</string>\n    <string name=\"action_unbookmark\">Tynnu\\'r tudalnod</string>\n    <string name=\"action_unmute_desc\">Dad-dewi %1$s</string>\n    <string name=\"title_announcements\">Cyhoeddiadau</string>\n    <string name=\"error_could_not_load_login_page\">Methu llwytho\\'r dudalen mewngofnodi.</string>\n    <string name=\"title_scheduled_posts\">Negeseuon wedi\\'u hamserlennu</string>\n    <string name=\"error_loading_account_details\">Wedi methu llwytho manylion y cyfrif</string>\n    <string name=\"pref_title_timelines\">Ffrydiau</string>\n    <string name=\"title_favourited_by\">Hoffwyd gan</string>\n    <string name=\"error_image_edit_failed\">Methu golygu\\'r ddelwedd.</string>\n    <string name=\"description_post_favourited\">Hoffwyd</string>\n    <string name=\"saving_draft\">Yn cadw drafft…</string>\n    <string name=\"action_hashtags\">Hashnodau</string>\n    <string name=\"action_dismiss\">Diystyru</string>\n    <string name=\"action_details\">Manylion</string>\n    <string name=\"title_mentions_dialog\">Crybwylliadau</string>\n    <string name=\"action_open_media_n\">Agor cyfryngau #%1$d</string>\n    <string name=\"action_share_as\">Rhannu fel …</string>\n    <string name=\"downloading_media\">Yn lawrlwytho cyfryngau</string>\n    <string name=\"download_media\">Lawrlwytho cyfryngau</string>\n    <string name=\"dialog_redraft_post_warning\">Dileu ac ailddrafftio\\'r neges hon?</string>\n    <string name=\"dialog_delete_conversation_warning\">Dileu\\'r sgwrs hon?</string>\n    <string name=\"pref_title_language\">Iaith</string>\n    <string name=\"pref_title_bot_overlay\">Dangos dangosydd botiau</string>\n    <string name=\"pref_title_gradient_for_media\">Dangos graddiannau lliwgar ar gyfer cyfryngau cudd</string>\n    <string name=\"pref_failed_to_sync\">Methu cydweddu dewisiadau</string>\n    <string name=\"pref_main_nav_position_option_top\">Brig</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"title_hashtags_dialog\">Hashnodau</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Gwaelod</string>\n    <string name=\"action_open_faved_by\">Dangos ffefrynnau</string>\n    <string name=\"report_description_1\">Bydd yr adroddiad yn cael ei anfon at gymedrolwyr eich gweinydd. Gallwch chi esbonio pan rydych chi\\'n adrodd ar y cyfrif hwn isod:</string>\n    <string name=\"warning_scheduling_interval\">Mae gan Mastodon egwyl amserlennu o o leiaf 5 munud.</string>\n    <string name=\"follow_requests_info\">Er nad yw eich cyfrif wedi\\'i gloi, roedd staff %1$s yn meddwl efallai yr hoffech chi adolygu\\'r ceisiadau i\\'ch dilyn o\\'r cyfrifon hyn eich hun.</string>\n    <string name=\"delete_scheduled_post_warning\">Dileu\\'r neges wedi\\'u hamserlennu hon?</string>\n    <string name=\"description_post_media_no_description_placeholder\">Dim disgrifiad</string>\n    <string name=\"hint_list_name\">Enw\\'r rhestr</string>\n    <string name=\"pick_hashtag_hint\">Hashnod heb #</string>\n    <string name=\"report_remote_instance\">Anfon ymlaen at %1$s</string>\n    <string name=\"report_description_remote_instance\">Daw\\'r cyfrif o weinydd arall. Ydych chi am anfon copi dienw o\\'r adroddiad i\\'r gweinydd hwnnw hefyd?</string>\n    <string name=\"duration_1_hour\">Awr</string>\n    <string name=\"duration_6_hours\">6 awr</string>\n    <string name=\"duration_1_day\">Diwrnod</string>\n    <string name=\"unpin_action\">Dadbinio</string>\n    <string name=\"pref_show_self_username_never\">Byth</string>\n    <string name=\"pref_show_self_username_always\">Bob tro</string>\n    <string name=\"post_media_attachments\">Atodiadau</string>\n    <string name=\"action_create_list\">Creu rhestr</string>\n    <string name=\"action_rename_list\">Diweddaru rhestr</string>\n    <string name=\"hint_search_people_list\">Chwilio am bobl rydych yn eu dilyn</string>\n    <string name=\"profile_badge_bot_text\">Bot</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"action_edit_image\">Golygu llun</string>\n    <string name=\"title_reblogged_by\">Hybwyd gan</string>\n    <string name=\"label_duration\">Hyd</string>\n    <string name=\"duration_5_min\">5 munud</string>\n    <string name=\"duration_30_min\">Hanner awr</string>\n    <string name=\"duration_3_days\">Tridiau</string>\n    <string name=\"duration_7_days\">Wythnos</string>\n    <string name=\"duration_14_days\">Pythefnos</string>\n    <string name=\"duration_30_days\">30 diwrnod</string>\n    <string name=\"duration_60_days\">60 diwrnod</string>\n    <string name=\"duration_90_days\">90 diwrnod</string>\n    <string name=\"duration_180_days\">180 diwrnod</string>\n    <string name=\"duration_365_days\">Blwyddyn</string>\n    <string name=\"add_poll_choice\">Ychwanegu dewis</string>\n    <string name=\"pin_action\">Pinio</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s a %3$d eraill</string>\n    <string name=\"poll_info_time_absolute\">yn dod i ben am %1$s</string>\n    <string name=\"duration_no_change\">(Dim newid)</string>\n    <string name=\"poll_allow_multiple_choices\">Amlddewis</string>\n    <string name=\"poll_new_choice_hint\">Dewis %1$d</string>\n    <string name=\"no_announcements\">Does dim cyhoeddiadau.</string>\n    <string name=\"account_note_hint\">Eich nodyn preifat ynghylch y cyfrif hwn</string>\n    <string name=\"account_note_saved\">Cadwyd!</string>\n    <string name=\"action_subscribe_account\">Tanysgrifio</string>\n    <string name=\"action_unsubscribe_account\">Dad-danysgrifio</string>\n    <string name=\"dialog_delete_list_warning\">Ydych chi wir eisiau dileu rhestr %1$s?</string>\n    <string name=\"no_drafts\">Does gennych chi ddim drafftiau.</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Dangos rhagolygon dolen mewn ffrydiau</string>\n    <string name=\"pref_title_wellbeing_mode\">Llesiant</string>\n    <string name=\"wellbeing_hide_stats_posts\">Cuddio ystadegau meintiol negeseuon</string>\n    <string name=\"wellbeing_hide_stats_profile\">Cuddio ystadegau meintiol proffiliau</string>\n    <string name=\"draft_deleted\">Drafft wedi\\'i ddileu</string>\n    <string name=\"drafts_post_reply_removed\">Mae\\'r neges y drafftioch chi ymateb iddi wedi cael ei dileu</string>\n    <string name=\"description_post_language\">Iaith y neges</string>\n    <string name=\"hashtags\">Hashnodau</string>\n    <string name=\"poll_vote\">Pleidleisio</string>\n    <string name=\"poll_ended_voted\">Mae pôl rydych chi wedi pleidleisio ynddo wedi dod i ben</string>\n    <string name=\"poll_ended_created\">Mae pôl a grëwyd gennych wedi dod i ben</string>\n    <string name=\"button_continue\">Parhau</string>\n    <string name=\"button_back\">Nôl</string>\n    <string name=\"hint_additional_info\">Sylwadau ychwanegol</string>\n    <string name=\"app_theme_system\">Defnyddio arddull y system</string>\n    <string name=\"pref_main_nav_position\">Prif lleoliad y panel llywio</string>\n    <string name=\"pref_title_animate_gif_avatars\">Animeiddio lluniau proffil GIF</string>\n    <string name=\"pref_default_media_sensitivity\">Nodi cyfryngau yn sensitif bob tro (bydd yn cael ei gydweddu gyda\\'ch gweinydd)</string>\n    <string name=\"about_powered_by_tusky\">Pwerir gan Tusky</string>\n    <string name=\"title_accounts\">Cyfrifon</string>\n    <string name=\"create_poll_title\">Pôl</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"action_delete_list\">Dileu rhestr</string>\n    <string name=\"add_hashtag_title\">Ychwanegu hashnod</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"post_media_audio\">Sain</string>\n    <string name=\"compose_shortcut_long_label\">Ysgrifennu neges</string>\n    <string name=\"drafts_post_failed_to_send\">Methodd anfon y neges hon!</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Ysgrifennu Neges</string>\n    <string name=\"mute_domain_warning\">Ydych chi\\'n siŵr eich bod am rwystro %1$s gyfan? Fyddwch chi ddim yn gweld dim cynnwys o\\'r parth hwnnw mewn unrhyw ffrwd gyhoeddus na chwaith yn eich hysbysiadau. Bydd eich dilynwyr o\\'r parth hwnnw yn cael eu dileu.</string>\n    <string name=\"duration_indefinite\">Dim diwedd</string>\n    <plurals name=\"favs\">\n        <item quantity=\"zero\"><b>%1$s</b> Ffefrynnau</item>\n        <item quantity=\"one\"><b>%1$s</b> Ffefryn</item>\n        <item quantity=\"two\"><b>%1$s</b> Ffefryn</item>\n        <item quantity=\"few\"><b>%1$s</b> Ffefryn</item>\n        <item quantity=\"many\"><b>%1$s</b> Ffefryn</item>\n        <item quantity=\"other\"><b>%1$s</b> Ffefryn</item>\n    </plurals>\n    <string name=\"description_visibility_direct\">Uniongyrchol</string>\n    <string name=\"action_add_or_remove_from_list\">Ychwanegu at neu dynnu oddi ar restr</string>\n    <string name=\"failed_to_add_to_list\">Wedi methu ag ychwanegu\\'r cyfrif at y rhestr</string>\n    <string name=\"failed_to_remove_from_list\">Wedi methu tynnu\\'r cyfrif o\\'r rhestr</string>\n    <string name=\"instance_rule_info\">Drwy fewngofnodi rydych chi\\'n cytuno i reolau %1$s.</string>\n    <string name=\"compose_save_draft_loses_media\">Cadw drafft? (Bydd atodiadau\\'n cael eu llwytho i fyny eto pan fyddwch chi\\'n adfer y drafft.)</string>\n    <string name=\"description_post_reblogged\">Ailflogiwyd</string>\n    <string name=\"poll_info_format\"> \\u0020<!-- 15 votes • 1 hour left --> \\u0020%1$s • %2$s</string>\n    <string name=\"hint_media_description_missing\">Dylai fod gan y cyfryngau ddisgrifiad.</string>\n    <string name=\"description_post_cw\">Rhybudd cynnwys: %1$s</string>\n    <string name=\"pref_title_confirm_reblogs\">Dangos cadarnhad cyn hybu</string>\n    <string name=\"review_notifications\">Adolygu hysbysiadau</string>\n    <string name=\"notification_report_format\">Adroddiad newydd ar %1$s</string>\n    <string name=\"notification_header_report_format\">Adroddodd %1$s %2$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d o negeseuon wedi\\'u hatodi</string>\n    <string name=\"report_category_violation\">Toriad rheol</string>\n    <string name=\"report_category_spam\">Sbam</string>\n    <string name=\"failed_to_pin\">Wedi methu Pinio</string>\n    <string name=\"failed_to_unpin\">Wedi methu Dadbinio</string>\n    <string name=\"pref_title_http_proxy_port_message\">Dylai\\'r porth fod rhwng %1$d a %2$d</string>\n    <string name=\"error_rename_list\">Methu diweddaru\\'r rhestr</string>\n    <string name=\"pref_default_post_language\">Iaith bostio (bydd yn cael ei gydweddu gyda\\'ch gweinydd)</string>\n    <string name=\"description_post_bookmarked\">Tudalnodiwyd</string>\n    <string name=\"select_list_title\">Dewiswch restr</string>\n    <string name=\"button_done\">Wedi gorffen</string>\n    <string name=\"report_sent_success\">Wedi adrodd ar @%1$s yn llwyddiannus</string>\n    <string name=\"limit_notifications\">Cyfyngu ar hysbysiadau ffrwd</string>\n    <string name=\"post_lookup_error_format\">Gwall wrth chwilio am y neges %1$s</string>\n    <string name=\"pref_title_show_self_username\">Dangos enw defnyddiwr mewn bariau offer</string>\n    <string name=\"pref_title_confirm_favourites\">Dangos cadarnhad cyn hoffi</string>\n    <string name=\"pref_title_hide_top_toolbar\">Cuddio teitl y bar offer uchaf</string>\n    <string name=\"instance_rule_title\">Rheolau %1$s</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"error_following_hashtags_unsupported\">Na allwch chi ddilyn hashnodau ar y gweinydd hwn.</string>\n    <string name=\"poll_info_closed\">wedi cau</string>\n    <string name=\"failed_fetch_posts\">Wedi methu nôl negeseuon</string>\n    <string name=\"error_muting_hashtag_format\">Gwall wrth dewi #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Gwall wrth ddad-dewi #%1$s</string>\n    <string name=\"title_followed_hashtags\">Hashnodau yn eu dilyn</string>\n    <string name=\"notification_report_name\">Adroddiadau</string>\n    <string name=\"label_remote_account\">Gall y wybodaeth isod adlewyrchu proffil y defnyddiwr yn anghyflawn. Pwyswch i agor y proffil llawn mewn porwr.</string>\n    <plurals name=\"reblogs\">\n        <item quantity=\"zero\"><b>%1$s</b> Hybiau</item>\n        <item quantity=\"one\"><b>%1$s</b> Hwb</item>\n        <item quantity=\"two\"><b>%1$s</b> Hwb</item>\n        <item quantity=\"few\"><b>%1$s</b> Hwb</item>\n        <item quantity=\"many\"><b>%1$s</b> Hwb</item>\n        <item quantity=\"other\"><b>%1$s</b> Hwb</item>\n    </plurals>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"description_post_edited\">Golygwyd</string>\n    <string name=\"pref_show_self_username_disambiguate\">Pan fydd cyfrifon lluosog wedi\\'u mewngofnodi</string>\n    <string name=\"drafts_failed_loading_reply\">Wedi methu llwytho gwybodaeth Ateb</string>\n    <string name=\"pref_title_alway_open_spoiler\">Agor negeseuon wedi\\'u marcio â rhybudd cynnwys bob tro</string>\n    <string name=\"profile_metadata_label_label\">Label</string>\n    <string name=\"post_edited\">Golygwyd %1$s</string>\n    <string name=\"confirmation_hashtag_unfollowed\">#%1$s wedi\\'i ddad-ddilyn</string>\n    <string name=\"pref_title_animate_custom_emojis\">Animeiddio emojis cyfaddas</string>\n    <string name=\"notification_subscription_description\">Hysbysiadau pan fydd rhywun rydych chi wedi tanysgrifio iddyn nhw\\'n cyhoeddi neges newydd</string>\n    <string name=\"notification_sign_up_description\">Hysbysiadau am ddefnyddwyr newydd</string>\n    <string name=\"notification_report_description\">Hysbysiadau am adroddiadau cymedroli</string>\n    <string name=\"filter_dialog_whole_word_description\">Os yw\\'r allweddair neu\\'r ymadrodd yn alffaniwmerig yn unig, mi fydd ond yn cael ei osod os yw\\'n cyfateb â\\'r gair cyfan</string>\n    <string name=\"error_create_list\">Methu creu rhestr</string>\n    <string name=\"set_focus_description\">Tapiwch neu lusgwch y cylch i ddewis y canolbwynt a fydd bob amser yn weladwy mewn cryno-luniau.</string>\n    <string name=\"description_poll\">Pôl gyda dewisiadau: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"list\">Rhestr</string>\n    <string name=\"action_set_focus\">Gosod pwynt ffocws</string>\n    <string name=\"status_created_at_now\">nawr</string>\n    <string name=\"error_delete_list\">Methu dileu\\'r rhestr</string>\n    <string name=\"action_add_to_list\">Ychwanegu cyfrif at y rhestr</string>\n    <string name=\"action_remove_from_list\">Tynnu cyfrif o\\'r rhestr</string>\n    <string name=\"action_add_reaction\">ychwanegu ymateb</string>\n    <string name=\"description_post_media\">Cyfryngau: %1$s</string>\n    <string name=\"error_status_source_load\">Wedi methu llwytho ffynhonnell y statws o\\'r gweinydd.</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Galluogi ystum llusgo i newid rhwng tabiau</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"zero\">%1$s pleidlais</item>\n        <item quantity=\"one\">%1$s pleidlais</item>\n        <item quantity=\"two\">%1$s bleidlais</item>\n        <item quantity=\"few\">%1$s pleidlais</item>\n        <item quantity=\"many\">%1$s pleidlais</item>\n        <item quantity=\"other\">%1$s phleidlais</item>\n    </plurals>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"zero\">%1$s personau</item>\n        <item quantity=\"one\">%1$s person</item>\n        <item quantity=\"two\">%1$s berson</item>\n        <item quantity=\"few\">%1$s person</item>\n        <item quantity=\"many\">%1$s pherson</item>\n        <item quantity=\"other\">%1$s person</item>\n    </plurals>\n    <string name=\"no_lists\">Nid oes gennych unrhyw restrau.</string>\n    <string name=\"wellbeing_mode_notice\">Bydd rhywfaint o wybodaeth a all effeithio ar eich lles meddyliol yn cael ei chuddio. Mae hyn yn cynnwys:\n\\n\n\\n- Hysbysiadau hoffi/hybu/dilyn\n\\n- Cyfrif ffefrynnau/hybiau ar negeseuon\n\\n- Ystadegau dilynwr/negeseuon ar broffiliau\n\\n\n\\nNi fydd hysbysiadau gwthio yn cael eu heffeithio, ond gallwch chi adolygu eich dewisiadau hysbysu â llaw.</string>\n    <string name=\"report_category_other\">Arall</string>\n    <string name=\"action_unfollow_hashtag_format\">Dad-ddilyn #%1$s?</string>\n    <string name=\"notification_update_description\">Hysbysiadau pan fydd negeseuon rydych chi wedi rhyngweithio â nhw yn cael eu golygu</string>\n    <string name=\"failed_search\">Wedi methu â chwilio</string>\n    <string name=\"failed_report\">Wedi methu ag adrodd</string>\n    <string name=\"compose_preview_image_description\">Gweithredoedd ar gyfer delwedd %1$s</string>\n    <string name=\"action_open_reblogger\">Agor awdur hybu</string>\n    <string name=\"notification_follow_request_description\">Hysbysiadau am geisiadau i\\'ch dilyn</string>\n    <string name=\"caption_notoemoji\">Set emoji cyfredol Google</string>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"zero\">%1$d eiliadau ar ôl</item>\n        <item quantity=\"one\">%1$d eiliad ar ôl</item>\n        <item quantity=\"two\">%1$d eiliad ar ôl</item>\n        <item quantity=\"few\">%1$d eiliad ar ôl</item>\n        <item quantity=\"many\">%1$d eiliad ar ôl</item>\n        <item quantity=\"other\">%1$d eiliad ar ôl</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"zero\">%1$d oriau ar ôl</item>\n        <item quantity=\"one\">%1$d awr ar ôl</item>\n        <item quantity=\"two\">%1$d awr ar ôl</item>\n        <item quantity=\"few\">%1$d awr ar ôl</item>\n        <item quantity=\"many\">%1$d awr ar ôl</item>\n        <item quantity=\"other\">%1$d awr ar ôl</item>\n    </plurals>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"zero\">%1$d diwrnodau ar ôl</item>\n        <item quantity=\"one\">%1$d diwrnod ar ôl</item>\n        <item quantity=\"two\">%1$d ddiwrnod ar ôl</item>\n        <item quantity=\"few\">%1$d diwrnod ar ôl</item>\n        <item quantity=\"many\">%1$d diwrnod ar ôl</item>\n        <item quantity=\"other\">%1$d niwrnod ar ôl</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"zero\">%1$d munudau ar ôl</item>\n        <item quantity=\"one\">%1$d munud ar ôl</item>\n        <item quantity=\"two\">%1$d funud ar ôl</item>\n        <item quantity=\"few\">%1$d munud ar ôl</item>\n        <item quantity=\"many\">%1$d munud ar ôl</item>\n        <item quantity=\"other\">%1$d munud ar ôl</item>\n    </plurals>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"zero\">Nid oes modd i ti lanlwytho mwy na %1$d atodiadau cyfryngau.</item>\n        <item quantity=\"one\">Nid oes modd i ti lanlwytho mwy nag %1$d atodiad cyfryngau.</item>\n        <item quantity=\"two\">Nid oes modd i ti lanlwytho mwy na %1$d atodiad cyfryngau.</item>\n        <item quantity=\"few\">Nid oes modd i ti lanlwytho mwy na %1$d atodiad cyfryngau.</item>\n        <item quantity=\"many\">Nid oes modd i ti lanlwytho mwy na %1$d atodiad cyfryngau.</item>\n        <item quantity=\"other\">Nid oes modd i ti lanlwytho mwy na %1$d atodiad cyfryngau.</item>\n    </plurals>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"zero\">Disgrifiwch y cynnwys ar gyfer pobl â nam ar eu golwg (terfyn nodau o %1$d)</item>\n        <item quantity=\"one\">Disgrifiwch y cynnwys ar gyfer pobl â nam ar eu golwg (terfyn nodau o %1$d)</item>\n        <item quantity=\"two\">Disgrifiwch y cynnwys ar gyfer pobl â nam ar eu golwg (terfyn nodau o %1$d)</item>\n        <item quantity=\"few\">Disgrifiwch y cynnwys ar gyfer pobl â nam ar eu golwg (terfyn nodau o %1$d)</item>\n        <item quantity=\"many\">Disgrifiwch y cynnwys ar gyfer pobl â nam ar eu golwg (terfyn nodau o %1$d)</item>\n        <item quantity=\"other\">Disgrifiwch y cynnwys ar gyfer pobl â nam ar eu golwg (terfyn nodau o %1$d)</item>\n    </plurals>\n    <string name=\"action_continue_edit\">Parhau i olygu</string>\n    <string name=\"status_edit_info\">Golygwyd: %1$s</string>\n    <string name=\"status_created_info\">Crëwyd: %1$s</string>\n    <string name=\"title_edits\">Golygiadau</string>\n    <string name=\"post_media_alt\">DISGRIFIAD</string>\n    <string name=\"action_discard\">Hepgor newidiadau</string>\n    <string name=\"compose_unsaved_changes\">Mae gennych chi newidiadau heb eu cadw.</string>\n    <string name=\"mute_notifications_switch\">Tewi hysbysiadau</string>\n    <string name=\"a11y_label_loading_thread\">Yn llwytho edefyn</string>\n    <string name=\"action_share_account_link\">Rhannu ddolen i gyfrif</string>\n    <string name=\"action_share_account_username\">Rhannu enw defnyddiwr y cyfrif</string>\n    <string name=\"send_account_link_to\">Rhannu URL cyfrif i…</string>\n    <string name=\"send_account_username_to\">Rhannu enw denyddiwr cyfrif i…</string>\n    <string name=\"account_username_copied\">Enw defnyddiwr wedi\\'i gopïo</string>\n    <string name=\"pref_reading_order_oldest_first\">Hynaf yn gyntaf</string>\n    <string name=\"pref_reading_order_newest_first\">Diweddaraf yn gyntaf</string>\n    <string name=\"pref_title_reading_order\">Trefn darllen</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Wedi\\'i analluogi</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;heb ei osod&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;annilys&gt;</string>\n    <string name=\"action_browser_login\">Mewngofnodi â phorwr</string>\n    <string name=\"description_login\">Yn gweithio yn y rhan mwyaf o achosion. Nid oes unrhyw ddata yn cael ei ollwng i apiau eraill.</string>\n    <string name=\"description_browser_login\">Efallai y bydd dulliau dilysu ychwanegol ar gael, ond mae eu hangen porwr arall.</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"zero\">Methodd eich neges â llwytho i fyny a chafodd ei chadw i\\'ch drafftiau.\n\\n\n\\nNaill ai nid oedd modd cysylltu â\\'r gweinydd, neu fe wrthododd y neges.</item>\n        <item quantity=\"one\">Methodd eich negeseuon â llwytho i fyny a chafodd ei chadw i\\'ch drafftiau.\n\\n\n\\nNaill ai nid oedd modd cysylltu â\\'r gweinydd, neu fe wrthododd y negeseuon.</item>\n        <item quantity=\"two\">Methodd eich negeseuon â llwytho i fyny a chafodd ei chadw i\\'ch drafftiau.\n\\n\n\\nNaill ai nid oedd modd cysylltu â\\'r gweinydd, neu fe wrthododd y negeseuon.</item>\n        <item quantity=\"few\">Methodd eich negeseuon â llwytho i fyny a chafodd ei chadw i\\'ch drafftiau.\n\\n\n\\nNaill ai nid oedd modd cysylltu â\\'r gweinydd, neu fe wrthododd y negeseuon.</item>\n        <item quantity=\"many\">Methodd eich negeseuon â llwytho i fyny a chafodd ei chadw i\\'ch drafftiau.\n\\n\n\\nNaill ai nid oedd modd cysylltu â\\'r gweinydd, neu fe wrthododd y negeseuon.</item>\n        <item quantity=\"other\">Methodd eich negeseuon â llwytho i fyny a chafodd ei chadw i\\'ch drafftiau.\n\\n\n\\nNaill ai nid oedd modd cysylltu â\\'r gweinydd, neu fe wrthododd y negeseuon.</item>\n    </plurals>\n    <string name=\"action_post_failed\">Wedi methu llwytho i fyny</string>\n    <string name=\"action_post_failed_show_drafts\">Dangos drafftiau</string>\n    <string name=\"action_post_failed_do_nothing\">Diystyru</string>\n    <string name=\"title_public_trending_hashtags\">Hashnodau poblogaidd</string>\n    <string name=\"accessibility_talking_about_tag\">Mae %1$d o bobl yn siarad am hashnod %2$s</string>\n    <string name=\"total_usage\">Defnydd cyfan</string>\n    <string name=\"total_accounts\">Cyfrifon cyfan</string>\n    <string name=\"dialog_follow_hashtag_title\">Dilyn hashnod</string>\n    <string name=\"action_refresh\">Adnewyddu</string>\n    <string name=\"notification_unknown_name\">Anhysbys</string>\n    <string name=\"status_filtered_show_anyway\">Dangos beth bynnag</string>\n    <string name=\"status_filter_placeholder_label_format\">Hidlwyd: %1$s</string>\n    <string name=\"pref_title_account_filter_keywords\">Proffiliau</string>\n    <string name=\"socket_timeout_exception\">Cymrodd hi\\'n rhy hir i gysylltu â\\'ch weinydd</string>\n    <string name=\"ui_error_unknown\">rheswm anhysbys</string>\n    <string name=\"ui_error_bookmark\">Methodd tudalnodi\\'r neges: %1$s</string>\n    <string name=\"ui_error_clear_notifications\">Methodd clirio hysbysiadau: %1$s</string>\n    <string name=\"ui_error_favourite\">Methodd hoffi\\'r neges: %1$s</string>\n    <string name=\"ui_error_reblog\">Methodd hybu\\'r neges: %1$s</string>\n    <string name=\"ui_error_vote\">Methodd y pleidleisio: %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">Methodd derbyn y cais i ddilyn: %1$s</string>\n    <string name=\"ui_error_reject_follow_request\">Methodd gwrthod y cais i ddilyn: %1$s</string>\n    <string name=\"ui_success_accepted_follow_request\">Cais i ddilyn wedi\\'i dderbyn</string>\n    <string name=\"ui_success_rejected_follow_request\">Rhwystrwyd cais i ddilyn</string>\n    <string name=\"hint_filter_title\">Fy hidl</string>\n    <string name=\"label_filter_title\">Teitl</string>\n    <string name=\"filter_action_warn\">Rhybudd</string>\n    <string name=\"filter_action_hide\">Cuddio</string>\n    <string name=\"filter_description_warn\">Cuddio\\'r neges gyfan gyda rhybudd</string>\n    <string name=\"filter_description_hide\">Cuddio\\'n llwyr</string>\n    <string name=\"label_filter_action\">Gweithredoedd hidlo</string>\n    <string name=\"label_filter_context\">Hidlo cyd-destynau</string>\n    <string name=\"label_filter_keywords\">Allweddeiriau neu ymadroddion i\\'w hidlo</string>\n    <string name=\"action_add\">Ychwanegu</string>\n    <string name=\"filter_keyword_display_format\">%1$s (gair cyfan)</string>\n    <string name=\"filter_keyword_addition_title\">Ychwanegu allweddair</string>\n    <string name=\"filter_edit_keyword_title\">Golygu allweddair</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"post_media_image\">Delwedd</string>\n    <string name=\"select_list_manage\">Rheoli rhestrau</string>\n    <string name=\"help_empty_home\">Dyma\\'ch <b>llinell amser cartref</b>. Mae\\'n dangos negeseuon diweddar y cyfrifon rydych chi\\'n eu dilyn. \\u0020 \n\\n \\u0020 \n\\nEr mwyn archwilio cyfrifon gallwch ddod o hyd iddyn nhw o fewn un o\\'r llinellau amser eraill. Er enghraifft, llinellau amser eich gweinydd {{group}}. Neu gallwch eu chwilio yn ôl eu henw {{search}}; er enghraifft, chwiliwch am Tusky i ddod o hyd i\\'n cyfrif Mastodon.</string>\n    <string name=\"pref_title_show_stat_inline\">Dangos ystadegau negeseuon yn y ffrwd</string>\n    <string name=\"pref_ui_text_size\">Maint testun rhyngwyneb</string>\n    <string name=\"notification_listenable_worker_name\">Gweithgaredd cefndirol</string>\n    <string name=\"notification_listenable_worker_description\">Hysbysiadau pan fydd Tusky\\'n gweithio\\'n y cefndir</string>\n    <string name=\"notification_notification_worker\">Yn estyn hysbysiadau…</string>\n    <string name=\"notification_prune_cache\">Cynnal a chadw\\'r cof dros dro…</string>\n    <string name=\"error_missing_edits\">Mae eich gweinydd yn gwybod y cafodd y neges hon ei golygu, ond nid oes ganddo gopi o\\'r golygiadau, felly nid oes modd eu dangos i chi. \\u0020 \n\\n \\u0020 \n\\nDyma <a href=\"https://github.com/mastodon/mastodon/issues/25398\">broblem Mastodon #25398</a>.</string>\n    <string name=\"load_newest_notifications\">Llwytho hysbysiadau diweddaraf</string>\n    <string name=\"compose_delete_draft\">Dileu\\'r drafft?</string>\n    <string name=\"error_media_upload_sending_fmt\">Methodd llwytho i fyny: %1$s</string>\n    <string name=\"about_device_info_title\">Eich dyfais</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nFersiwn Android: %3$s\n\\nFersiwn SDK: %4$d</string>\n    <string name=\"about_account_info_title\">Eich cyfrif</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nFersiwn: %3$s</string>\n    <string name=\"about_copy\">Copïo fersiwn a gwybodaeth dyfais</string>\n    <string name=\"about_copied\">Copïwyd fersiwn a gwybodaeth dyfais</string>\n    <string name=\"list_exclusive_label\">Cuddio o\\'r ffrwd cartref</string>\n    <string name=\"error_media_playback\">Methodd chwarae: %1$s</string>\n    <string name=\"dialog_delete_filter_positive_action\">Dileu</string>\n    <string name=\"dialog_delete_filter_text\">Dileu\\'r hidlydd \\'%1$s\\'?</string>\n    <string name=\"dialog_save_profile_changes_message\">Hoffech chi gadw\\'r newidiadau i\\'ch proffil?</string>\n    <string name=\"label_image\">Delwedd</string>\n    <string name=\"app_theme_system_black\">Defnyddio Cynllun y System (du)</string>\n    <string name=\"help_empty_conversations\">Dyma\\'ch <b>negeseuon preifat</b>; weithiau\\'n cael eu galw\\'n sgyrsiau neu negeseuon uniongyrchol (DM). \\u0020 \\u0020\n\\n \\u0020 \\u0020\n\\nMae negeseuon preifat yn cael eu creu drwy osod y gwelededd {{public}} neges i {{mail}} <i>Uniongyrchol</i> a chyfeirio at un neu ragor o ddefnyddwyr yn y testun. \\u0020 \\u0020\n\\n \\u0020 \\u0020\n\\nEr enghraifft gallwch chi dechrau ar y proffil golwg cyfrif a phwyso\\'r botwm creu [iconics gmd_edit] a newid y gwelededd.</string>\n    <string name=\"unmuting_hashtag_success_format\">Yn dad-dewi hashnod #%1$s</string>\n    <string name=\"muting_hashtag_success_format\">Yn tewi hashnod #%1$s fel rhybudd</string>\n    <string name=\"unfollowing_hashtag_success_format\">Ddim yn dilyn hashnod #%1$s bellach</string>\n    <string name=\"title_public_trending_statuses\">Negeseuon poblogaidd</string>\n    <string name=\"action_view_filter\">Gweld hidl</string>\n    <string name=\"following_hashtag_success_format\">Nawr yn dilyn yr hashnod #%1$s</string>\n    <string name=\"error_unblocking_domain\">Wedi methu dad-dewi %1$s: %2$s</string>\n    <string name=\"error_blocking_domain\">Wedi methu tewi %1$s: %2$s</string>\n    <string name=\"help_empty_lists\">Dyma\\'ch <b>golwg rhestrau</b>. Gallwch chi diffinio nifer o restrau preifat ac yn ychwanegu cyfrifon atyn nhw. \\u0020 \n\\n \\u0020 \n\\nSYLWCH y gallwch chi ychwanegu dim ond cyfrifon rydych chi\\'n eu dilyn i\\'ch rhestrau. \\u0020 \n\\n \\u0020 \n\\nGall y rhestrau hyn yn cael eu defnyddio fel tab yn newisiadau Tabiau Cyfrif [iconics gmd_account_circle] [iconics gmd_navigate_next].</string>\n    <string name=\"list_reply_policy_list\">Aelodau\\'r rhestr</string>\n    <string name=\"list_reply_policy_followed\">Unrhyw ddefnyddiwr a ddilynir</string>\n    <string name=\"list_reply_policy_label\">Dangos ymatebion i</string>\n    <string name=\"list_reply_policy_none\">Neb</string>\n    <string name=\"pref_title_show_self_boosts\">Dangos hunan-hybiau</string>\n    <string name=\"pref_title_show_self_boosts_description\">Rhywun yn hybu ei neges ei hunan</string>\n    <string name=\"pref_title_per_timeline_preferences\">Dewisiadau i bob ffrwd</string>\n    <string name=\"pref_title_show_notifications_filter\">Dangos hidlydd Hysbysiadau</string>\n    <string name=\"reply_sending_long\">Mae eich ateb yn cael ei anfon.</string>\n    <string name=\"reply_sending\">Yn anfon…</string>\n    <string name=\"action_translate\">Cyfieithu</string>\n    <string name=\"action_show_original\">Dangos y gwreiddiol</string>\n    <string name=\"label_translating\">Yn cyfieithu…</string>\n    <string name=\"label_translated\">Wedi\\'i chyfieithu o %1$s gyda %2$s</string>\n    <string name=\"ui_error_translate\">Nid oedd modd cyfieithu: %1$s</string>\n    <string name=\"report_category_legal\">Cyfreithiol</string>\n    <string name=\"unknown_notification_type\">Math anhysbys o hysbysiad</string>\n    <string name=\"dialog_follow_warning\">Dilyn y cyfrif hwn?</string>\n    <string name=\"pref_title_confirm_follows\">Dangos cadarnhad cyn dilyn</string>\n    <string name=\"url_copied\">Dolen wedi\\'i chopïo</string>\n    <string name=\"confirmation_hashtag_copied\">\\'#%1$s\\' wedi\\'i gopïo</string>\n    <string name=\"pref_default_reply_privacy\">Preifatrwydd ymatebion (ni fydd yn cael ei gydweddu gyda\\'ch gweinydd)</string>\n    <string name=\"error_deleting_filter\">Bu gwall wrth ddileu hidlydd \\'%1$s\\'</string>\n    <string name=\"error_saving_filter\">Bu gwall wrth gadw hidlydd \\'%1$s\\'</string>\n    <string name=\"action_follow_hashtag\">Dilyn hashnod newydd</string>\n    <string name=\"pref_default_reply_privacy_explanation\">Bydd y preifatrwydd dechreuol yn dibynnu ar y neges rydych chi\\'n ei hymateb.</string>\n    <string name=\"post_privacy_direct\">Uniongyrchol</string>\n    <string name=\"pref_match_default_post_privacy\">Cydweddu â phreifatrwydd rhagosodedig negeseuon</string>\n    <string name=\"label_expires_after\">Yn dod i ben ar ôl</string>\n    <string name=\"notification_policies_title\">Polisïau Hysbysiad</string>\n    <string name=\"notification_policies_filter_out\">Rheoli hysbysiadau gan…</string>\n    <string name=\"notification_policy_ignore\">Diystyru</string>\n    <string name=\"filtered_notifications_title\">Hysbysiadau wedi\\'u Hidlo</string>\n    <string name=\"accept_notification_request\">Derbyn y cais hysbysiad</string>\n    <string name=\"dismiss_notification_request\">Diystyru\\'r cais hysbysiad</string>\n    <string name=\"open_settings\">Agor y gosodiadau</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">Pobl nad ydych chi\\'n eu dilyn</string>\n    <string name=\"notification_policies_filter_dont_follow_description\">Hys nes i chi eu caniatáu â law</string>\n    <string name=\"notification_policies_filter_not_following_title\">Pobl nad ydynt yn eich dilyn chi</string>\n    <string name=\"notification_policies_filter_not_following_description\">Gan gynnwys pobl sydd wedi bod yn eich dilyn am lai na 3 diwrnod</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">Cyfrifon newydd</string>\n    <string name=\"unknown_notification_filter_new_accounts_description\">Wedi\\'u creu o fewn y 30 diwrnod diwethaf</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_title\">Negeseuon uniongyrchol digymell</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_description\">Wedi\\'u hidlo, oni bai eu bod mewn ymateb i\\'ch neges eich hunan, neu os ydych yn dilyn yr anfonwr</string>\n    <string name=\"unknown_notification_filter_moderated_accounts\">Cyfrifon wedi\\'u cymedroli</string>\n    <string name=\"unknown_notification_filter_moderated_accounts_description\">Wedi\\'u cyfyngu gan gymedrolwyr eich gweinydd</string>\n    <string name=\"notification_policies_not_supported\">Dim ond ar weinyddion Mastodon sydd yn rhedeg v4.3.0 neu\\'n hwyrach y mae\\'r nodwedd hon yn gweithio.</string>\n    <string name=\"filtered_notifications\">Hysbysiadau wedi\\'u hidlo</string>\n    <string name=\"notifications_from_people_you_may_know\">Hysbysiadau gan %1$d pobl y rydych efallai\\'n eu hadnabod</string>\n    <string name=\"notification_policy_accept\">Derbyn</string>\n    <string name=\"notification_policy_filter\">Hidlo</string>\n    <string name=\"notifications_from\">Hysbysiadau gan %1$s</string>\n    <string name=\"action_accept_notification_request\">Derbyn</string>\n    <string name=\"action_dismiss_notification_request\">Diystyru</string>\n    <string name=\"preview_card_by_author\">Gan %1$s</string>\n    <string name=\"preview_card_more_by_author\">Mwy gan %1$s</string>\n    <string name=\"post_replied\">Wedi ateb</string>\n    <string name=\"post_replied_format\">Mewn ateb i %1$s</string>\n    <string name=\"post_replied_self\">Edefyn yn parhau</string>\n    <string name=\"follow_hashtag_success\">Wedi dilyn y hashnod %1$s</string>\n    <string name=\"notification_moderation_warning_name\">Rhybuddion cymedroli</string>\n    <string name=\"notification_unknown_description\">Math anhysbys o hysbysiad</string>\n    <string name=\"notification_channel_other\">Arall</string>\n    <string name=\"notification_channel_admin\">Gweinyddol</string>\n    <string name=\"moderation_warning_action_disable\">Mae eich cyfrif wedi\\'i analluogi.</string>\n    <string name=\"moderation_warning_action_mark_statuses_as_sensitive\">Mae rhai o\\'ch negeseuon wedi\\'u marcio\\'n sensitif.</string>\n    <string name=\"moderation_warning_action_none\">Mae eich cyfrif wedi derbyn rhybudd cymedroli.</string>\n    <string name=\"moderation_warning_action_sensitive\">Bydd eich negeseuon\\'n cael eu marcio\\'n sensitif o hyn ymlaen.</string>\n    <string name=\"moderation_warning_action_silence\">Mae eich cyfrif wedi\\'i gyfyngu.</string>\n    <string name=\"moderation_warning_action_suspend\">Mae eich cyfrif wedi\\'i hatal.</string>\n    <string name=\"poll\">Pôl</string>\n    <plurals name=\"media_attachments\">\n        <item quantity=\"zero\">%1$s atodiadau cyfryngau</item>\n        <item quantity=\"one\">%1$s atodiad cyfryngau</item>\n        <item quantity=\"two\">%1$s atodiad cyfryngau</item>\n        <item quantity=\"few\">%1$s atodiad cyfryngau</item>\n        <item quantity=\"many\">%1$s atodiad cyfryngau</item>\n        <item quantity=\"other\">%1$s atodiad cyfryngau</item>\n    </plurals>\n    <string name=\"notification_info_reply\">Ymateb</string>\n    <string name=\"notification_info_private_mention\">Crybwyll preifat</string>\n    <string name=\"notification_info_mention\">Crybwyll</string>\n    <string name=\"notification_info_private_reply\">Ateb preifat</string>\n    <string name=\"action_reblog_private\">Hybu dilynwyr-yn-unig</string>\n    <string name=\"action_reblog_public\">Hybu cyhoeddus</string>\n    <string name=\"action_reblog_unlisted\">Hybu heb ei restru</string>\n    <string name=\"notification_severed_relationship_name\">Cysylltiadau wedi eu colli</string>\n    <string name=\"notification_channel_other_description\">Hysbysiadau eraill, fel cysylltiadau wedi\\'u colli a rhybuddion cymedroli</string>\n    <string name=\"notification_channel_admin_description\">Hysbysiadau gweinyddol, fel adroddiadau newydd neu gofrestriadau</string>\n    <string name=\"relationship_severance_event_title\">Cysylltiad wedi colli</string>\n    <string name=\"relationship_severance_event_account_suspension\">Mae gweinyddwr o %1$s wedi atal %2$s, sy\\'n golygu na allwch dderbyn diweddariadau ganddynt mwyach na rhyngweithio â nhw.</string>\n    <string name=\"relationship_severance_event_domain_block\">Mae gweinyddwr o %1$s wedi rhwystro %2$s, gan gynnwys %3$s o\\'ch dilynwyr a %4$s yr ydych yn eu dilyn.</string>\n    <string name=\"relationship_severance_event_user_domain_block\">Rydych wedi rhwystro %1$s, gan ddileu %2$s o\\'ch dilynwyr a %3$s yr ydych yn eu dilyn.</string>\n    <plurals name=\"accounts\">\n        <item quantity=\"zero\">%1$s cyfrifon</item>\n        <item quantity=\"one\">%1$s cyfrif</item>\n        <item quantity=\"two\">%1$s gyfrif</item>\n        <item quantity=\"few\">%1$s cyfrif</item>\n        <item quantity=\"many\">%1$s chyfrif</item>\n        <item quantity=\"other\">%1$s cyfrif</item>\n    </plurals>\n    <string name=\"moderation_warning\">Rydych wedi derbyn rhybudd gan gymedrolwr.</string>\n    <string name=\"moderation_warning_action_delete_statuses\">Mae rhai o\\'ch negeseuon wedi\\'u dileu.</string>\n    <string name=\"unknown_notification_type_explanation\">Nid yw Tusky yn adnabod y math hwn o hysbysiad ac ni all ei ddangos i chi.Rhowch wybod hefyd i ddatblygwyr Tusky fel y gallant ychwanegu cefnogaeth ar gyfer y math hwn!</string>\n    <string name=\"unblock_success\">Wedi dadrwystro %1$s</string>\n    <string name=\"unmute_success\">Wedi dad-dewi %1$s</string>\n    <string name=\"block_failure\">Wedi methu rhwystro %1$s: %2$s</string>\n    <string name=\"mute_failure\">Wedi methu tewi %1$s: %2$s</string>\n    <string name=\"unblock_failure\">Wedi methu dadrwystro %1$s: %2$s</string>\n    <string name=\"unmute_failure\">Wedi methu dad-dewi %1$s: %2$s</string>\n    <string name=\"accept_follow_request_failure\">Wedi methu derbyn cais i\\'ch dilyn gan %1$s: %2$s</string>\n    <string name=\"reject_follow_request_failure\">Wedi methu gwrthod cais i\\'ch dilyn gan %1$s: %2$s</string>\n    <string name=\"poll_show_results\">Dangos canlyniadau</string>\n    <string name=\"yes\">Iawn</string>\n    <string name=\"no\">Na</string>\n    <string name=\"confirm_dismiss_caption\">Dileu newidiadau capsiynau?</string>\n    <string name=\"filter_action_blur\">Anegluro</string>\n    <string name=\"filter_description_blur\">Cuddio cyfryngau gyda rhybudd</string>\n    <string name=\"reblog_privacy_public_description\">Gall pawb weld eich hybu</string>\n    <string name=\"reblog_privacy_unlisted_description\">Yr un fath â chyhoeddus ond ni fydd byth yn ymddangos mewn ffrydiau cyhoeddus.</string>\n    <string name=\"reblog_privacy_followers_only_description\">Dim ond eich dilynwyr sy\\'n gallu gweld eich hybu</string>\n    <string name=\"reblog_confirm\">Hybu\\'r neges hon?</string>\n    <string name=\"favourite_confirm\">Hoffi\\'r neges hon?</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-de/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">Ein Fehler ist aufgetreten.</string>\n    <string name=\"error_network\">Ein Netzwerkfehler ist aufgetreten. Bitte überprüfe deine Internetverbindung und versuche es erneut.</string>\n    <string name=\"error_empty\">Das darf nicht leer sein.</string>\n    <string name=\"error_invalid_domain\">Ungültige Domain angegeben</string>\n    <string name=\"error_failed_app_registration\">Authentifizieren mit dieser Instanz fehlgeschlagen. Falls das Problem weiter besteht, versuche dich über den Browser anzumelden.</string>\n    <string name=\"error_no_web_browser_found\">Kein Webbrowser gefunden.</string>\n    <string name=\"error_authorization_unknown\">Ein unbekannter Fehler ist bei der Autorisierung aufgetreten. Falls das Problem weiter besteht, versuche dich über den Browser anzumelden.</string>\n    <string name=\"error_authorization_denied\">Autorisierung wurde abgelehnt. Wenn du dir sicher bist, dass du die korrekten Anmeldedaten eingegeben hast, versuche dich über den Browser anzumelden.</string>\n    <string name=\"error_retrieving_oauth_token\">Es konnte kein Anmelde-Token abgerufen werden. Falls das Problem weiter besteht, versuche dich über den Browser anzumelden.</string>\n    <string name=\"error_compose_character_limit\">Der Beitrag ist zu lang!</string>\n    <string name=\"error_media_upload_type\">Dieser Dateityp kann nicht hochgeladen werden.</string>\n    <string name=\"error_media_upload_opening\">Die Datei konnte nicht geöffnet werden.</string>\n    <string name=\"error_media_upload_permission\">Berechtigung für Zugriff auf Mediendateien benötigt.</string>\n    <string name=\"error_media_download_permission\">Berechtigung fürs Speichern von Mediendateien benötigt.</string>\n    <string name=\"error_media_upload_image_or_video\">Bilder und Videos können nicht an den gleichen Beitrag angehängt werden.</string>\n    <string name=\"error_media_upload_sending\">Das Hochladen ist fehlgeschlagen.</string>\n    <string name=\"error_sender_account_gone\">Fehler beim Senden des Beitrags.</string>\n    <string name=\"title_home\">Startseite</string>\n    <string name=\"title_notifications\">Benachrichtigungen</string>\n    <string name=\"title_public_local\">Lokal</string>\n    <string name=\"title_public_federated\">Föderiert</string>\n    <string name=\"title_direct_messages\">Direktnachrichten</string>\n    <string name=\"title_tab_preferences\">Tabs</string>\n    <string name=\"title_view_thread\">Thread</string>\n    <string name=\"title_posts\">Beiträge</string>\n    <string name=\"title_posts_with_replies\">Mit Antworten</string>\n    <string name=\"title_posts_pinned\">Angeheftet</string>\n    <string name=\"title_follows\">Folge ich</string>\n    <string name=\"title_followers\">Follower</string>\n    <string name=\"title_favourites\">Favoriten</string>\n    <string name=\"title_mutes\">Stummgeschaltete Profile</string>\n    <string name=\"title_blocks\">Blockierte Profile</string>\n    <string name=\"title_follow_requests\">Follower-Anfragen</string>\n    <string name=\"title_edit_profile\">Dein Profil bearbeiten</string>\n    <string name=\"title_drafts\">Entwürfe</string>\n    <string name=\"title_licenses\">Lizenzen</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s teilte</string>\n    <string name=\"post_sensitive_media_title\">Inhaltswarnung</string>\n    <string name=\"post_media_hidden_title\">Mediendateien ausgeblendet</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"post_sensitive_media_directions\">Zum Anzeigen tippen</string>\n    <string name=\"post_content_warning_show_more\">Mehr anzeigen</string>\n    <string name=\"post_content_warning_show_less\">Weniger anzeigen</string>\n    <string name=\"post_content_show_more\">Ausklappen</string>\n    <string name=\"post_content_show_less\">Einklappen</string>\n    <string name=\"message_empty\">Hier ist nichts.</string>\n    <string name=\"footer_empty\">Noch keine Beiträge. Ziehe zum Aktualisieren nach unten!</string>\n    <string name=\"notification_reblog_format\">%1$s teilte deinen Beitrag</string>\n    <string name=\"notification_favourite_format\">%1$s favorisierte deinen Beitrag</string>\n    <string name=\"notification_follow_format\">%1$s folgt dir</string>\n    <string name=\"report_username_format\">\\@%1$s melden</string>\n    <string name=\"report_comment_hint\">Ergänzende Hinweise?</string>\n    <string name=\"action_quick_reply\">Schnell antworten</string>\n    <string name=\"action_reply\">Antworten</string>\n    <string name=\"action_reblog\">Teilen</string>\n    <string name=\"action_unreblog\">Teilen rückgängig machen</string>\n    <string name=\"action_favourite\">Favorisieren</string>\n    <string name=\"action_unfavourite\">Aus Favoriten entfernen</string>\n    <string name=\"action_more\">Mehr</string>\n    <string name=\"action_compose\">Beitrag erstellen</string>\n    <string name=\"action_login\">Mit Tusky anmelden</string>\n    <string name=\"action_logout\">Abmelden</string>\n    <string name=\"action_logout_confirm\">Möchtest du %1$s wirklich abmelden? Dadurch werden alle lokalen Daten des Profils, wie Entwürfe und Einstellungen, gelöscht.</string>\n    <string name=\"action_follow\">Folgen</string>\n    <string name=\"action_unfollow\">Entfolgen</string>\n    <string name=\"action_block\">Blockieren</string>\n    <string name=\"action_unblock\">Blockierung aufheben</string>\n    <string name=\"action_hide_reblogs\">Geteilte Beiträge ausblenden</string>\n    <string name=\"action_show_reblogs\">Geteilte Beiträge anzeigen</string>\n    <string name=\"action_report\">Melden</string>\n    <string name=\"action_delete\">Löschen</string>\n    <string name=\"action_send\">TRÖT</string>\n    <string name=\"action_send_public\">TRÖT!</string>\n    <string name=\"action_retry\">Erneut versuchen</string>\n    <string name=\"action_close\">Schließen</string>\n    <string name=\"action_view_profile\">Profil</string>\n    <string name=\"action_view_preferences\">Einstellungen</string>\n    <string name=\"action_view_account_preferences\">Profileinstellungen</string>\n    <string name=\"action_view_favourites\">Favoriten</string>\n    <string name=\"action_view_mutes\">Stummgeschaltete Profile</string>\n    <string name=\"action_view_blocks\">Blockierte Profile</string>\n    <string name=\"action_view_follow_requests\">Follower-Anfragen</string>\n    <string name=\"action_view_media\">Medien</string>\n    <string name=\"action_open_in_web\">Im Browser öffnen</string>\n    <string name=\"action_add_media\">Mediendateien hinzufügen</string>\n    <string name=\"action_photo_take\">Foto aufnehmen</string>\n    <string name=\"action_share\">Teilen</string>\n    <string name=\"action_mute\">Stummschalten</string>\n    <string name=\"action_unmute\">Stummschaltung aufheben</string>\n    <string name=\"action_mention\">Erwähnen</string>\n    <string name=\"action_hide_media\">Mediendateien ausblenden</string>\n    <string name=\"action_open_drawer\">Menü öffnen</string>\n    <string name=\"action_save\">Speichern</string>\n    <string name=\"action_edit_profile\">Profil bearbeiten</string>\n    <string name=\"action_edit_own_profile\">Bearbeiten</string>\n    <string name=\"action_undo\">Rückgängig machen</string>\n    <string name=\"action_accept\">Akzeptieren</string>\n    <string name=\"action_reject\">Ablehnen</string>\n    <string name=\"action_search\">Suche</string>\n    <string name=\"action_access_drafts\">Entwürfe</string>\n    <string name=\"action_toggle_visibility\">Beitragssichtbarkeit</string>\n    <string name=\"action_content_warning\">Inhaltswarnung</string>\n    <string name=\"action_emoji_keyboard\">Emoji-Tastatur</string>\n    <string name=\"action_add_tab\">Tab hinzufügen</string>\n    <string name=\"action_links\">Links</string>\n    <string name=\"action_mentions\">Erwähnungen</string>\n    <string name=\"action_hashtags\">Hashtags</string>\n    <string name=\"action_open_reblogged_by\">Geteilte Beiträge anzeigen</string>\n    <string name=\"action_open_faved_by\">Favoriten anzeigen</string>\n    <string name=\"title_hashtags_dialog\">Hashtags</string>\n    <string name=\"title_mentions_dialog\">Erwähnungen</string>\n    <string name=\"title_links_dialog\">Links</string>\n    <string name=\"action_open_media_n\">Datei #%1$d öffnen</string>\n    <string name=\"download_image\">%1$s heruntergeladen</string>\n    <string name=\"action_copy_link\">Link kopieren</string>\n    <string name=\"action_open_as\">Als %1$s öffnen</string>\n    <string name=\"action_share_as\">Teilen als …</string>\n    <string name=\"send_post_link_to\">Beitragslink teilen an …</string>\n    <string name=\"send_post_content_to\">Beitrag teilen an …</string>\n    <string name=\"send_media_to\">Mediendateien teilen an …</string>\n    <string name=\"confirmation_reported\">Gesendet!</string>\n    <string name=\"confirmation_unblocked\">Blockierung des Profils aufgehoben</string>\n    <string name=\"confirmation_unmuted\">Stummschaltung des Profils aufgehoben</string>\n    <string name=\"hint_domain\">Welche Instanz?</string>\n    <string name=\"hint_compose\">Was gibt\\'s Neues?</string>\n    <string name=\"hint_content_warning\">Inhaltswarnung</string>\n    <string name=\"hint_display_name\">Anzeigename</string>\n    <string name=\"hint_note\">Über mich</string>\n    <string name=\"hint_search\">Suchen …</string>\n    <string name=\"hint_media_description_missing\">Medien sollten Beschreibungen haben.</string>\n    <string name=\"search_no_results\">Keine Ergebnisse</string>\n    <string name=\"label_quick_reply\">Antworten …</string>\n    <string name=\"label_avatar\">Profilbild</string>\n    <string name=\"label_header\">Titelbild</string>\n    <string name=\"link_whats_an_instance\">Was ist eine Instanz?</string>\n    <string name=\"login_connection\">Wird verbunden …</string>\n    <string name=\"dialog_whats_an_instance\">Die Adresse oder Domain einer Instanz kann hier eingegeben werden, wie z. B. mastodon.social, icosahedron.website, social.tchncs.de, oder<a href=\"https://instances.social\">weitere!</a> \n\\n \n\\nWenn du bis jetzt kein Konto hast, kannst du hier den Namen einer Instanz eingeben und dort ein Konto einrichten. \n\\n \n\\nEine Instanz ist ein einzelner Ort, an dem dein Konto gehostet ist, aber du kannst dennoch mit anderen Leuten interagieren, als wärt ihr alle auf derselben Website. \n\\n \n\\nWeitere Informationen gibt es auf <a href=\"https://joinmastodon.org\">joinmastodon.org</a>.</string>\n    <string name=\"dialog_title_finishing_media_upload\">Hochladen der Datei wird abgeschlossen</string>\n    <string name=\"dialog_message_uploading_media\">Wird hochgeladen …</string>\n    <string name=\"dialog_download_image\">Herunterladen</string>\n    <string name=\"dialog_message_cancel_follow_request\">Follow-Anfrage zurückziehen?</string>\n    <string name=\"dialog_unfollow_warning\">Dieses Profil entfolgen?</string>\n    <string name=\"dialog_delete_post_warning\">Diesen Beitrag löschen?</string>\n    <string name=\"visibility_public\">Öffentlich: Für alle sichtbar</string>\n    <string name=\"visibility_unlisted\">Nicht gelistet: Nicht in der öffentlichen Timeline sichtbar</string>\n    <string name=\"visibility_private\">Nur Follower: Nur für Follower sichtbar</string>\n    <string name=\"visibility_direct\">Direkt: Nur für die erwähnten Profile sichtbar</string>\n    <string name=\"pref_title_edit_notification_settings\">Benachrichtigungen</string>\n    <string name=\"pref_title_notifications_enabled\">Benachrichtigungen</string>\n    <string name=\"pref_title_notification_alerts\">Benachrichtigungen</string>\n    <string name=\"pref_title_notification_alert_sound\">Mit einem Ton benachrichtigen</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Mit Vibration benachrichtigen</string>\n    <string name=\"pref_title_notification_alert_light\">Mit Licht benachrichtigen</string>\n    <string name=\"pref_title_notification_filters\">Aktivierte Benachrichtigungen</string>\n    <string name=\"pref_title_appearance_settings\">Erscheinungsbild</string>\n    <string name=\"pref_title_app_theme\">App-Design</string>\n    <string name=\"pref_title_timelines\">Timelines</string>\n    <string name=\"pref_title_timeline_filters\">Filter</string>\n    <string name=\"app_them_dark\">Dunkel</string>\n    <string name=\"app_theme_light\">Hell</string>\n    <string name=\"app_theme_black\">Schwarz</string>\n    <string name=\"app_theme_auto\">Automatisch bei Sonnenuntergang</string>\n    <string name=\"app_theme_system\">Systemdesign verwenden</string>\n    <string name=\"pref_title_browser_settings\">Browser</string>\n    <string name=\"pref_title_custom_tabs\">Links in der App öffnen (Chrome Custom Tabs)</string>\n    <string name=\"pref_title_language\">Sprache</string>\n    <string name=\"pref_title_post_filter\">Timeline-Filter</string>\n    <string name=\"pref_title_post_tabs\">Startseite</string>\n    <string name=\"pref_title_show_boosts\">Geteilte Beiträge anzeigen</string>\n    <string name=\"pref_title_show_replies\">Antworten anzeigen</string>\n    <string name=\"pref_title_show_media_preview\">Dateivorschauen herunterladen</string>\n    <string name=\"pref_title_proxy_settings\">Proxy</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP-Proxy</string>\n    <string name=\"pref_title_http_proxy_enable\">HTTP-Proxy aktivieren</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP-Proxy-Server</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP-Proxy-Port</string>\n    <string name=\"pref_default_post_privacy\">Beitragssichtbarkeit (mit dem Server synchronisiert)</string>\n    <string name=\"pref_default_media_sensitivity\">Mediendateien immer mit einer Inhaltswarnung versehen (mit dem Server synchronisiert)</string>\n    <string name=\"pref_publishing\">Beiträge</string>\n    <string name=\"pref_failed_to_sync\">Fehler beim Synchronisieren</string>\n    <string name=\"post_privacy_public\">Öffentlich</string>\n    <string name=\"post_privacy_unlisted\">Nicht gelistet</string>\n    <string name=\"post_privacy_followers_only\">Nur Follower</string>\n    <string name=\"pref_post_text_size\">Schriftgröße von Beiträgen</string>\n    <string name=\"post_text_size_smallest\">Kleiner</string>\n    <string name=\"post_text_size_small\">Klein</string>\n    <string name=\"post_text_size_medium\">Normal</string>\n    <string name=\"post_text_size_large\">Groß</string>\n    <string name=\"post_text_size_largest\">Größer</string>\n    <string name=\"notification_mention_name\">Neue Erwähnungen</string>\n    <string name=\"notification_mention_descriptions\">Benachrichtigungen über neue Erwähnungen</string>\n    <string name=\"notification_follow_name\">Neue Follower</string>\n    <string name=\"notification_follow_description\">Benachrichtigungen über neue Follower</string>\n    <string name=\"notification_boost_name\">Geteilte Beiträge</string>\n    <string name=\"notification_boost_description\">Benachrichtigungen, wenn deine Beiträge geteilt werden</string>\n    <string name=\"notification_favourite_name\">Favorisierte Beiträge</string>\n    <string name=\"notification_favourite_description\">Benachrichtigungen, wenn deine Beiträge favorisiert werden</string>\n    <string name=\"notification_mention_format\">%1$s hat dich erwähnt</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s und %4$d andere</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, und %3$s</string>\n    <string name=\"notification_summary_small\">%1$s und %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d neue Interaktion</item>\n        <item quantity=\"other\">%1$d neue Interaktionen</item>\n    </plurals>\n    <string name=\"description_account_locked\">Geschütztes Profil</string>\n    <string name=\"about_title_activity\">Über</string>\n    <string name=\"about_tusky_license\">Tusky ist eine freie und quelloffene Software und ist lizenziert unter der GNU General Public License Version 3. Du kannst die Lizenz hier einsehen: https://www.gnu.org/licenses/gpl-3.0.de.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">Website des Projekts: https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Fehlermeldungen und Verbesserungsvorschläge:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Profil von Tusky</string>\n    <string name=\"post_share_content\">Inhalt des Beitrags teilen</string>\n    <string name=\"post_share_link\">Link zum Beitrag teilen</string>\n    <string name=\"post_media_images\">Bilder</string>\n    <string name=\"post_media_video\">Video</string>\n    <string name=\"state_follow_requested\">Follower-Anfrage gesendet</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"follows_you\">Folgt dir</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Mediendateien mit Inhaltswarnung immer anzeigen</string>\n    <string name=\"title_media\">Medien</string>\n    <string name=\"replying_to\">Antwort an @%1$s</string>\n    <string name=\"load_more_placeholder_text\">Mehr laden</string>\n    <string name=\"pref_title_thread_filter_keywords\">Unterhaltungen</string>\n    <string name=\"filter_addition_title\">Filter hinzufügen</string>\n    <string name=\"filter_edit_title\">Filter bearbeiten</string>\n    <string name=\"filter_dialog_remove_button\">Entfernen</string>\n    <string name=\"filter_dialog_update_button\">Aktualisieren</string>\n    <string name=\"add_account_name\">Konto hinzufügen</string>\n    <string name=\"add_account_description\">Neues Mastodon-Konto hinzufügen</string>\n    <string name=\"action_lists\">Listen</string>\n    <string name=\"title_lists\">Listen</string>\n    <string name=\"action_create_list\">Liste erstellen</string>\n    <string name=\"action_rename_list\">Liste aktualisieren</string>\n    <string name=\"action_delete_list\">Liste löschen</string>\n    <string name=\"action_add_to_list\">Konto zur Liste hinzufügen</string>\n    <string name=\"compose_active_account_description\">Veröffentlichen als %1$s</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Inhalt für Menschen mit Sehbehinderung beschreiben (%1$d Zeichen)</item>\n        <item quantity=\"other\">Inhalte für Menschen mit Sehbehinderung beschreiben (%1$d Zeichen)</item>\n    </plurals>\n    <string name=\"action_set_caption\">Beschreibung eingeben</string>\n    <string name=\"action_remove\">Entfernen</string>\n    <string name=\"lock_account_label\">Geschütztes Profil</string>\n    <string name=\"lock_account_label_description\">Follower müssen manuell genehmigt werden</string>\n    <string name=\"compose_save_draft\">Entwurf speichern?</string>\n    <string name=\"send_post_notification_title\">Beitrag wird gesendet …</string>\n    <string name=\"send_post_notification_error_title\">Fehler beim Senden</string>\n    <string name=\"send_post_notification_channel_name\">Beiträge senden</string>\n    <string name=\"send_post_notification_cancel_title\">Senden abgebrochen</string>\n    <string name=\"send_post_notification_saved_content\">Eine Kopie des Beitrags wurde in deine Entwürfe gespeichert</string>\n    <string name=\"action_compose_shortcut\">Beitrag erstellen</string>\n    <string name=\"error_no_custom_emojis\">Deine Instanz %1$s hat keine Emojis definiert</string>\n    <string name=\"emoji_style\">Emoji-Stil</string>\n    <string name=\"system_default\">Systemstandard</string>\n    <string name=\"download_fonts\">Du musst diese Emoji-Sets zunächst herunterladen</string>\n    <string name=\"performing_lookup_title\">Wird nachgeschlagen …</string>\n    <string name=\"expand_collapse_all_posts\">Alle Beiträge aus-/einklappen</string>\n    <string name=\"action_open_post\">Beitrag öffnen</string>\n    <string name=\"restart_required\">App-Neustart erforderlich</string>\n    <string name=\"restart_emoji\">Du musst Tusky neu starten, damit die Änderungen übernommen werden</string>\n    <string name=\"later\">Später</string>\n    <string name=\"restart\">Neu starten</string>\n    <string name=\"caption_systememoji\">Die Standard-Emojis deines Geräts</string>\n    <string name=\"caption_blobmoji\">Die Blob–Emojis aus Android 4.4–7.1</string>\n    <string name=\"caption_twemoji\">Die Standard-Emojis von Mastodon</string>\n    <string name=\"caption_notoemoji\">Die aktuellen Emojis von Google</string>\n    <string name=\"download_failed\">Download fehlgeschlagen</string>\n    <string name=\"profile_badge_bot_text\">Bot</string>\n    <string name=\"account_moved_description\">%1$s ist umgezogen auf:</string>\n    <string name=\"reblog_private\">An ursprüngliches Publikum teilen</string>\n    <string name=\"unreblog_private\">Nicht mehr teilen</string>\n    <string name=\"license_description\">Tusky enthält Code und Inhalte von den folgenden Open-Source-Projekten:</string>\n    <string name=\"license_apache_2\">Lizenziert unter der Apache-Lizenz (s. u.)</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">Zusatzfelder</string>\n    <string name=\"profile_metadata_add\">Feld hinzufügen</string>\n    <string name=\"profile_metadata_label_label\">Bezeichnung</string>\n    <string name=\"profile_metadata_content_label\">Inhalt</string>\n    <string name=\"pref_title_absolute_time\">Absolute Zeitstempel verwenden</string>\n    <string name=\"label_remote_account\">Das Profil wird möglicherweise unvollständig wiedergegeben. Hier klicken, um das vollständige Profil im Browser zu öffnen.</string>\n    <string name=\"unpin_action\">Vom Profil lösen</string>\n    <string name=\"pin_action\">Im Profil anheften</string>\n    <string name=\"title_favourited_by\">Favorisiert von</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s und %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s und %3$d mehr</string>\n    <string name=\"description_post_media_no_description_placeholder\">Keine Beschreibung</string>\n    <string name=\"description_post_favourited\">Favorisiert</string>\n    <string name=\"description_visibility_public\">Öffentlich</string>\n    <string name=\"description_visibility_private\">Follower</string>\n    <string name=\"description_visibility_direct\">Direkt</string>\n    <string name=\"hint_list_name\">Listenname</string>\n    <string name=\"download_media\">Dateien herunterladen</string>\n    <string name=\"downloading_media\">Dateien werden heruntergeladen</string>\n    <string name=\"filter_add_description\">zu filternder Ausdruck</string>\n    <string name=\"error_create_list\">Liste konnte nicht erstellt werden</string>\n    <string name=\"error_rename_list\">Liste konnte nicht aktualisiert werden</string>\n    <string name=\"error_delete_list\">Liste konnte nicht gelöscht werden</string>\n    <string name=\"hint_search_people_list\">Suche nach Leuten, denen du folgst</string>\n    <string name=\"action_remove_from_list\">Konto aus der Liste entfernen</string>\n    <string name=\"pick_hashtag_hint\">Hashtag ohne #</string>\n    <string name=\"action_open_reblogger\">Autor*in des geteilten Beitrags öffnen</string>\n    <string name=\"pref_title_public_filter_keywords\">Öffentliche Timelines</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\">%1$s-mal favorisiert</item>\n        <item quantity=\"other\">%1$s-mal favorisiert</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">Geteilt von</string>\n    <string name=\"description_post_media\">Medien: %1$s</string>\n    <string name=\"description_post_cw\">Inhaltswarnung: %1$s</string>\n    <string name=\"description_post_reblogged\">Geteilt</string>\n    <string name=\"description_visibility_unlisted\">Nicht gelistet</string>\n    <string name=\"action_delete_and_redraft\">Löschen und neu erstellen</string>\n    <string name=\"dialog_redraft_post_warning\">Diesen Beitrag löschen und neu erstellen?</string>\n    <string name=\"notification_poll_name\">Umfrageergebnisse</string>\n    <string name=\"notification_poll_description\">Benachrichtigungen über beendete Umfragen</string>\n    <string name=\"notifications_clear\">Löschen</string>\n    <string name=\"notifications_apply_filter\">Filtern</string>\n    <string name=\"filter_apply\">Übernehmen</string>\n    <string name=\"compose_shortcut_long_label\">Beitrag erstellen</string>\n    <string name=\"compose_shortcut_short_label\">Beitrag erstellen</string>\n    <string name=\"pref_title_bot_overlay\">Hinweis für Bots anzeigen</string>\n    <string name=\"notification_clear_text\">Bist du dir sicher, dass du alle deine Benachrichtigungen dauerhaft löschen möchtest?</string>\n    <string name=\"poll_info_format\">%1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s Stimme</item>\n        <item quantity=\"other\">%1$s Stimmen</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">endet um %1$s</string>\n    <string name=\"poll_info_closed\">Geschlossen</string>\n    <string name=\"poll_vote\">Abstimmen</string>\n    <string name=\"poll_ended_voted\">Eine Umfrage, in der du abgestimmt hast, ist vorbei</string>\n    <string name=\"poll_ended_created\">Eine Umfrage, die du erstellt hast, ist vorbei</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">noch %1$d Tag</item>\n        <item quantity=\"other\">noch %1$d Tage</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">noch %1$d Stunde</item>\n        <item quantity=\"other\">noch %1$d Stunden</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">noch %1$d Minute</item>\n        <item quantity=\"other\">noch %1$d Minuten</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">noch %1$d Sekunde</item>\n        <item quantity=\"other\">noch %1$d Sekunden</item>\n    </plurals>\n    <string name=\"title_domain_mutes\">Ausgeblendete Domains</string>\n    <string name=\"action_view_domain_mutes\">Ausgeblendete Domains</string>\n    <string name=\"action_mute_domain\">%1$s stummschalten</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s nicht mehr ausgeblendet</string>\n    <string name=\"mute_domain_warning\">Bist du dir sicher, dass du alles von %1$s blockieren möchtest? Du wirst keine Inhalte dieser Domain in irgendwelchen öffentlichen Timelines oder in deinen Benachrichtigungen sehen. Deine Follower von dieser Domain werden entfernt.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Gesamte Domain ausblenden</string>\n    <string name=\"pref_title_animate_gif_avatars\">GIF-Profilbilder animieren</string>\n    <string name=\"filter_dialog_whole_word\">Ganzes Wort</string>\n    <string name=\"filter_dialog_whole_word_description\">Wenn das Wort oder die Formulierung nur aus Buchstaben oder Zahlen besteht, tritt der Filter nur dann in Kraft, wenn er exakt dieser Zeichenfolge entspricht</string>\n    <string name=\"button_continue\">Weiter</string>\n    <string name=\"button_back\">Zurück</string>\n    <string name=\"button_done\">Fertig</string>\n    <string name=\"report_sent_success\">\\@%1$s wurde erfolgreich gemeldet</string>\n    <string name=\"hint_additional_info\">Zusätzliche Anmerkungen</string>\n    <string name=\"report_remote_instance\">An %1$s weiterleiten</string>\n    <string name=\"failed_report\">Melden fehlgeschlagen</string>\n    <string name=\"report_description_1\">Die Meldung wird an die Moderator*innen deines Servers geschickt. Du kannst hier eine Erklärung angeben, warum du dieses Konto meldest:</string>\n    <string name=\"report_description_remote_instance\">Dieses Konto ist von einem anderen Server. Soll eine anonymisierte Kopie der Meldung auch dorthin geschickt werden?</string>\n    <string name=\"create_poll_title\">Umfrage</string>\n    <string name=\"duration_5_min\">5 Minuten</string>\n    <string name=\"duration_30_min\">30 Minuten</string>\n    <string name=\"duration_1_hour\">1 Stunde</string>\n    <string name=\"duration_6_hours\">6 Stunden</string>\n    <string name=\"duration_1_day\">1 Tag</string>\n    <string name=\"duration_3_days\">3 Tage</string>\n    <string name=\"duration_7_days\">7 Tage</string>\n    <string name=\"edit_poll\">Bearbeiten</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"action_add_poll\">Umfrage hinzufügen</string>\n    <string name=\"pref_title_alway_open_spoiler\">Beiträge mit Inhaltswarnungen immer ausklappen</string>\n    <string name=\"description_poll\">Umfrage mit den Möglichkeiten: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"compose_preview_image_description\">Aktionen für Bild %1$s</string>\n    <string name=\"failed_fetch_posts\">Beiträge konnten nicht abgerufen werden</string>\n    <string name=\"title_accounts\">Profile</string>\n    <string name=\"failed_search\">Fehler beim Suchen</string>\n    <string name=\"add_poll_choice\">Auswahlmöglichkeit hinzufügen</string>\n    <string name=\"poll_allow_multiple_choices\">Mehrere Möglichkeiten</string>\n    <string name=\"poll_new_choice_hint\">Möglichkeit %1$d</string>\n    <string name=\"title_scheduled_posts\">Geplante Beiträge</string>\n    <string name=\"action_edit\">Bearbeiten</string>\n    <string name=\"action_access_scheduled_posts\">Geplante Beiträge</string>\n    <string name=\"action_schedule_post\">Beitrag planen</string>\n    <string name=\"action_reset_schedule\">Zurücksetzen</string>\n    <string name=\"title_bookmarks\">Lesezeichen</string>\n    <string name=\"action_bookmark\">Lesezeichen</string>\n    <string name=\"action_view_bookmarks\">Lesezeichen</string>\n    <string name=\"about_powered_by_tusky\">Unterstützt von Tusky</string>\n    <string name=\"description_post_bookmarked\">Als Lesezeichen gespeichert</string>\n    <string name=\"select_list_title\">Liste auswählen</string>\n    <string name=\"select_list_manage\">Listen verwalten</string>\n    <string name=\"list\">Liste</string>\n    <string name=\"post_lookup_error_format\">Fehler beim Nachschlagen von %1$s</string>\n    <string name=\"no_drafts\">Du hast keine Entwürfe.</string>\n    <string name=\"no_scheduled_posts\">Du hast keine geplanten Beiträge.</string>\n    <string name=\"warning_scheduling_interval\">Das Datum des geplanten Beitrags muss mindestens 5 Minuten in der Zukunft liegen.</string>\n    <string name=\"notification_follow_request_description\">Benachrichtigungen über neue Follower-Anfragen</string>\n    <string name=\"notification_follow_request_name\">Follower-Anfragen</string>\n    <string name=\"dialog_mute_warning\">\\@%1$s stummschalten?</string>\n    <string name=\"dialog_block_warning\">\\@%1$s blockieren?</string>\n    <string name=\"action_unmute_conversation\">Stummschaltung der Unterhaltung aufheben</string>\n    <string name=\"action_mute_conversation\">Unterhaltung stummschalten</string>\n    <string name=\"notification_follow_request_format\">%1$s möchte dir folgen</string>\n    <string name=\"hashtags\">Hashtags</string>\n    <string name=\"add_hashtag_title\">Hashtag hinzufügen</string>\n    <string name=\"pref_title_confirm_reblogs\">Vor dem Teilen bestätigen</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Linkvorschau in Timelines anzeigen</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Wischgeste zum Wechseln zwischen Tabs aktivieren</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s Person</item>\n        <item quantity=\"other\">%1$s Personen</item>\n    </plurals>\n    <string name=\"pref_title_gradient_for_media\">Farbverlauf für verborgene Medien anzeigen</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Unten</string>\n    <string name=\"pref_main_nav_position_option_top\">Oben</string>\n    <string name=\"action_unmute_domain\">%1$s nicht mehr stummschalten</string>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\">%1$s-mal geteilt</item>\n        <item quantity=\"other\">%1$s-mal geteilt</item>\n    </plurals>\n    <string name=\"pref_main_nav_position\">Position der Hauptnavigation</string>\n    <string name=\"dialog_mute_hide_notifications\">Benachrichtigungen ausblenden</string>\n    <string name=\"action_unmute_desc\">%1$s nicht mehr stummschalten</string>\n    <string name=\"abbreviated_seconds_ago\">%1$d Sek.</string>\n    <string name=\"abbreviated_hours_ago\">%1$d Std.</string>\n    <string name=\"abbreviated_in_days\">in %1$d T.</string>\n    <string name=\"abbreviated_years_ago\">%1$d J.</string>\n    <string name=\"account_note_saved\">Gespeichert!</string>\n    <string name=\"account_note_hint\">Private Notiz über dieses Konto</string>\n    <string name=\"pref_title_hide_top_toolbar\">Titel der Hauptnavigation ausblenden</string>\n    <string name=\"no_announcements\">Im Moment gibt es keine Ankündigungen.</string>\n    <string name=\"title_announcements\">Ankündigungen</string>\n    <string name=\"drafts_post_reply_removed\">Der Beitrag, auf den du antworten wolltest, wurde gelöscht</string>\n    <string name=\"draft_deleted\">Entwurf gelöscht</string>\n    <string name=\"drafts_post_failed_to_send\">Dieser Beitrag konnte nicht gesendet werden!</string>\n    <string name=\"dialog_delete_list_warning\">Möchtest du die Liste %1$s wirklich löschen?</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Du kannst nicht mehr als %1$d Anhang hochladen.</item>\n        <item quantity=\"other\">Du kannst nicht mehr als %1$d Anhänge hochladen.</item>\n    </plurals>\n    <string name=\"pref_title_wellbeing_mode\">Wohlbefinden</string>\n    <string name=\"label_duration\">Dauer</string>\n    <string name=\"duration_indefinite\">Für immer</string>\n    <string name=\"post_media_attachments\">Anhänge</string>\n    <string name=\"post_media_audio\">Audio</string>\n    <string name=\"notification_subscription_description\">Benachrichtigungen, wenn jemand, den ich abonniert habe, eine neue Nachricht veröffentlicht</string>\n    <string name=\"notification_subscription_name\">Neue Beiträge</string>\n    <string name=\"pref_title_animate_custom_emojis\">GIF-Emojis animieren</string>\n    <string name=\"notification_subscription_format\">%1$s hat gerade etwas veröffentlicht</string>\n    <string name=\"abbreviated_minutes_ago\">%1$d Min.</string>\n    <string name=\"review_notifications\">Benachrichtigungen überprüfen</string>\n    <string name=\"wellbeing_mode_notice\">Informationen, die dein geistiges Wohlbefinden beeinflussen könnten, werden ausgeblendet. Dazu gehören:\n\\n\n\\n• Benachrichtigungen über favorisierte/geteilte Beiträge, sowie »X folgt dir«-Benachrichtigungen\n\\n• Anzahl der Favoriten von Beiträgen und wie oft diese geteilt wurden\n\\n• Statistiken zu Followern/Beiträgen auf Profilen\n\\n\n\\nPush-Benachrichtigungen sind nicht betroffen, aber du kannst deine Benachrichtigungseinstellungen manuell überprüfen.</string>\n    <string name=\"follow_requests_info\">Auch wenn dein Konto öffentlich bzw. nicht geschützt ist, haben die Admins von %1$s gedacht, dass du diese Follower lieber manuell bestätigen solltest.</string>\n    <string name=\"wellbeing_hide_stats_profile\">Statistiken auf Profilen ausblenden</string>\n    <string name=\"wellbeing_hide_stats_posts\">Statistiken in Beiträgen ausblenden</string>\n    <string name=\"limit_notifications\">Timeline-Benachrichtigungen einschränken</string>\n    <string name=\"action_subscribe_account\">Abonnieren</string>\n    <string name=\"action_unsubscribe_account\">Deabonnieren</string>\n    <string name=\"abbreviated_in_minutes\">in %1$d Min.</string>\n    <string name=\"abbreviated_in_hours\">in %1$d Std.</string>\n    <string name=\"drafts_failed_loading_reply\">Informationen zur Antwort konnten nicht geladen werden</string>\n    <string name=\"abbreviated_days_ago\">%1$d T.</string>\n    <string name=\"abbreviated_in_years\">in %1$d J.</string>\n    <string name=\"abbreviated_in_seconds\">in %1$d Sek.</string>\n    <string name=\"action_unbookmark\">Lesezeichen entfernen</string>\n    <string name=\"pref_title_confirm_favourites\">Vor dem Favorisieren bestätigen</string>\n    <string name=\"dialog_delete_conversation_warning\">Diese Unterhaltung wirklich löschen?</string>\n    <string name=\"action_delete_conversation\">Unterhaltung löschen</string>\n    <string name=\"duration_30_days\">30 Tage</string>\n    <string name=\"duration_60_days\">60 Tage</string>\n    <string name=\"duration_90_days\">90 Tage</string>\n    <string name=\"duration_365_days\">365 Tage</string>\n    <string name=\"duration_14_days\">14 Tage</string>\n    <string name=\"duration_180_days\">180 Tage</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Beitrag erstellen</string>\n    <string name=\"notification_update_format\">%1$s hat den Beitrag bearbeitet</string>\n    <string name=\"notification_sign_up_name\">Registrierungen</string>\n    <string name=\"notification_sign_up_description\">Benachrichtigungen über neue Profile</string>\n    <string name=\"notification_sign_up_format\">%1$s hat sich registriert</string>\n    <string name=\"notification_update_description\">Benachrichtigungen, wenn Beiträge bearbeitet werden, mit denen du interagiert hast</string>\n    <string name=\"title_login\">Anmelden</string>\n    <string name=\"error_could_not_load_login_page\">Die Anmeldeseite konnte nicht geladen werden.</string>\n    <string name=\"notification_update_name\">Bearbeitete Beiträge</string>\n    <string name=\"action_dismiss\">Ablehnen</string>\n    <string name=\"account_date_joined\">%1$s beigetreten</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"status_created_at_now\">Jetzt</string>\n    <string name=\"error_loading_account_details\">Fehler beim Laden der Kontodetails</string>\n    <string name=\"action_edit_image\">Bild bearbeiten</string>\n    <string name=\"action_details\">Details</string>\n    <string name=\"error_image_edit_failed\">Das Bild konnte nicht bearbeitet werden.</string>\n    <string name=\"saving_draft\">Entwurf wird gespeichert …</string>\n    <string name=\"error_multimedia_size_limit\">Video- und Audiodateien dürfen nicht größer als %1$s MB sein.</string>\n    <string name=\"error_following_hashtag_format\">Fehler beim Folgen von #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Fehler beim Entfolgen von #%1$s</string>\n    <string name=\"delete_scheduled_post_warning\">Diesen geplanten Beitrag löschen?</string>\n    <string name=\"instance_rule_title\">%1$s-Regeln</string>\n    <string name=\"instance_rule_info\">Mit dem Anmelden stimmst du den Regeln von %1$s zu.</string>\n    <string name=\"set_focus_description\">Tippe oder ziehe den Kreis auf die Stelle, die in Vorschaubildern immer sichtbar sein soll.</string>\n    <string name=\"compose_save_draft_loses_media\">Entwurf speichern? (Anhänge werden erneut hochgeladen, sobald du den Entwurf wiederherstellst.)</string>\n    <string name=\"duration_no_change\">(Keine Änderung)</string>\n    <string name=\"pref_title_show_self_username\">Profilname in der Hauptnavigation anzeigen</string>\n    <string name=\"failed_to_pin\">Anheften fehlgeschlagen</string>\n    <string name=\"failed_to_unpin\">Lösen fehlgeschlagen</string>\n    <string name=\"pref_show_self_username_always\">Immer</string>\n    <string name=\"pref_show_self_username_disambiguate\">Wenn mit mehreren Konten angemeldet</string>\n    <string name=\"pref_show_self_username_never\">Niemals</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"description_post_language\">Sprache des Beitrags</string>\n    <string name=\"action_set_focus\">Fokuspunkt setzen</string>\n    <string name=\"action_add_reaction\">Reaktion hinzufügen</string>\n    <string name=\"failed_to_remove_from_list\">Das Konto konnte nicht aus der Liste entfernt werden</string>\n    <string name=\"action_add_or_remove_from_list\">Zur Liste hzfg. / aus Liste entf.</string>\n    <string name=\"failed_to_add_to_list\">Das Konto konnte nicht zur Liste hinzugefügt werden</string>\n    <string name=\"no_lists\">Du hast keine Listen.</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d Beiträge angehängt</string>\n    <string name=\"notification_header_report_format\">%1$s meldete %2$s</string>\n    <string name=\"confirmation_hashtag_unfollowed\">#%1$s entfolgt</string>\n    <string name=\"pref_default_post_language\">Beitragssprache (mit dem Server synchronisiert)</string>\n    <string name=\"report_category_violation\">Regelverstoß</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"report_category_spam\">Spam</string>\n    <string name=\"report_category_other\">Sonstiges</string>\n    <string name=\"error_following_hashtags_unsupported\">Diese Instanz unterstützt das Folgen von Hashtags nicht.</string>\n    <string name=\"title_followed_hashtags\">Gefolgte Hashtags</string>\n    <string name=\"action_unfollow_hashtag_format\">#%1$s entfolgen?</string>\n    <string name=\"description_post_edited\">Bearbeitet</string>\n    <string name=\"a11y_label_loading_thread\">Thread wird geladen …</string>\n    <string name=\"mute_notifications_switch\">Benachrichtigungen stummschalten</string>\n    <string name=\"pref_reading_order_newest_first\">Neueste zuerst</string>\n    <string name=\"pref_reading_order_oldest_first\">Älteste zuerst</string>\n    <string name=\"pref_title_reading_order\">Lesereihenfolge</string>\n    <string name=\"title_edits\">Überarbeitete Beiträge</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Deaktiviert</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;nicht gesetzt&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;ungültig&gt;</string>\n    <string name=\"compose_unsaved_changes\">Du hast nicht gespeicherte Änderungen.</string>\n    <string name=\"pref_title_http_proxy_port_message\">Port sollte zwischen %1$d und %2$d liegen</string>\n    <string name=\"error_muting_hashtag_format\">Fehler beim Stummschalten von #%1$s</string>\n    <string name=\"action_post_failed\">Hochladen fehlgeschlagen</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Dein Beitrag konnte nicht gepostet werden und wurde als Entwurf gespeichert.\n\\n\n\\nEntweder ist die Verbindung zum Server fehlgeschlagen oder der Server hat den Beitrag abgelehnt.</item>\n        <item quantity=\"other\">Deine Beiträge konnte nicht gepostet werden und wurde als Entwürfe gespeichert.\n\\n\n\\nEntweder ist die Verbindung zum Server fehlgeschlagen oder der Server hat die Beiträge abgelehnt.</item>\n    </plurals>\n    <string name=\"action_post_failed_show_drafts\">Entwürfe anzeigen</string>\n    <string name=\"action_post_failed_do_nothing\">Abbrechen</string>\n    <string name=\"post_edited\">Bearbeitet %1$s</string>\n    <string name=\"action_discard\">Änderungen verwerfen</string>\n    <string name=\"action_continue_edit\">Bearbeiten fortsetzen</string>\n    <string name=\"action_browser_login\">Mit Browser anmelden</string>\n    <string name=\"action_share_account_username\">Name des Profils teilen</string>\n    <string name=\"action_share_account_link\">Link zum Profil teilen</string>\n    <string name=\"send_account_link_to\">Profil-Link teilen an …</string>\n    <string name=\"send_account_username_to\">Profilname teilen an …</string>\n    <string name=\"account_username_copied\">Profilname kopiert</string>\n    <string name=\"status_edit_info\">Bearbeitet: %1$s</string>\n    <string name=\"status_created_info\">Erstellt: %1$s</string>\n    <string name=\"notification_report_format\">Neue Meldung über %1$s</string>\n    <string name=\"notification_report_description\">Benachrichtigungen über Moderationsmeldungen</string>\n    <string name=\"error_unmuting_hashtag_format\">Fehler beim Aufheben der Stummschaltung von #%1$s</string>\n    <string name=\"description_login\">Funktioniert in den meisten Fällen. Keine Daten werden mit anderen Apps geteilt.</string>\n    <string name=\"description_browser_login\">Zusätzliche Authentisierungsmethoden können unterstützt werden. Ein unterstützter Browser wird benötigt.</string>\n    <string name=\"notification_report_name\">Meldungen</string>\n    <string name=\"error_status_source_load\">Die Statusquelle konnte nicht vom Server geladen werden.</string>\n    <string name=\"title_public_trending_hashtags\">Angesagte Hashtags</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d Leute schreiben über den Hashtag %2$s</string>\n    <string name=\"total_usage\">Insg. verwendet</string>\n    <string name=\"total_accounts\">Konten insg.</string>\n    <string name=\"dialog_follow_hashtag_title\">Hashtag folgen</string>\n    <string name=\"action_refresh\">Aktualisieren</string>\n    <string name=\"socket_timeout_exception\">Kontaktaufnahme mit dem Server dauerte zu lange</string>\n    <string name=\"ui_error_bookmark\">Beitrag konnte nicht als Lesezeichen gespeichert werden: %1$s</string>\n    <string name=\"ui_error_reblog\">Beitrag konnte nicht geteilt werden: %1$s</string>\n    <string name=\"ui_error_favourite\">Beitrag konnte nicht favorisiert werden: %1$s</string>\n    <string name=\"ui_error_vote\">Abstimmen bei der Umfrage schlug fehl: %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">Akzeptieren der Follower-Anfrage schlug fehl: %1$s</string>\n    <string name=\"ui_success_accepted_follow_request\">Follower-Anfrage akzeptiert</string>\n    <string name=\"ui_success_rejected_follow_request\">Follower-Anfrage blockiert</string>\n    <string name=\"notification_unknown_name\">Unbekannt</string>\n    <string name=\"ui_error_unknown\">Unbekannter Grund</string>\n    <string name=\"ui_error_clear_notifications\">Löschen der Benachrichtigungen schlug fehl: %1$s</string>\n    <string name=\"ui_error_reject_follow_request\">Ablehnen der Follower-Anfrage schlug fehl: %1$s</string>\n    <string name=\"status_filter_placeholder_label_format\">Gefiltert: %1$s</string>\n    <string name=\"pref_title_account_filter_keywords\">Profile</string>\n    <string name=\"hint_filter_title\">Mein Filter</string>\n    <string name=\"label_filter_title\">Titel</string>\n    <string name=\"filter_action_warn\">Warnen</string>\n    <string name=\"filter_action_hide\">Ausblenden</string>\n    <string name=\"filter_description_warn\">Vollständigen Beitrag mit einer Warnung ausblenden</string>\n    <string name=\"filter_description_hide\">Vollständig ausblenden</string>\n    <string name=\"label_filter_context\">Nach Bereich filtern</string>\n    <string name=\"label_filter_action\">Filteraktion</string>\n    <string name=\"label_filter_keywords\">Schlagwörter oder Ausdrücke zum Filtern</string>\n    <string name=\"action_add\">Hinzufügen</string>\n    <string name=\"filter_keyword_display_format\">%1$s (ganzes Wort)</string>\n    <string name=\"filter_keyword_addition_title\">Schlagwort hinzufügen</string>\n    <string name=\"filter_edit_keyword_title\">Schlagwort bearbeiten</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"status_filtered_show_anyway\">Trotzdem anzeigen</string>\n    <string name=\"help_empty_home\">Dies ist deine <b>Startseite</b>. Sie zeigt die neuesten Beiträge von Konten, denen du folgst. \n\\n \n\\nDamit du andere Konten entdeckst, kannst du entweder andere Timelines lesen – z. B. die Lokale Timeline deiner Instanz {{group}} \\u0020– oder du suchst nach Namen {{search}} – z. B. kannst du nach Tusky suchen, um unser Mastodon-Konto zu finden.</string>\n    <string name=\"post_media_image\">Bild</string>\n    <string name=\"pref_title_show_stat_inline\">Beitragsstatistiken in der Timeline anzeigen</string>\n    <string name=\"pref_ui_text_size\">Schriftgröße der Oberfläche</string>\n    <string name=\"notification_prune_cache\">Cache-Wartung …</string>\n    <string name=\"notification_listenable_worker_description\">Benachrichtigungen, wenn Tusky im Hintergrund aktiv ist</string>\n    <string name=\"notification_listenable_worker_name\">Hintergrundaktivität</string>\n    <string name=\"notification_notification_worker\">Benachrichtigungen werden abgerufen …</string>\n    <string name=\"load_newest_notifications\">Neueste Benachrichtigungen laden</string>\n    <string name=\"compose_delete_draft\">Entwurf löschen?</string>\n    <string name=\"error_missing_edits\">Deinem Server ist bekannt, dass dieser Beitrag bearbeitet wurde. Allerdings besitzt er keine Kopien der Änderungen, weshalb diese nicht angezeigt werden können. \n\\n \n\\nHierbei handelt es sich um <a href=\"https://github.com/mastodon/mastodon/issues/25398\">Mastodon Issue #25398</a>.</string>\n    <string name=\"about_device_info_title\">Dein Gerät</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nAndroid-Version: %3$s\n\\nSDK-Version: %4$d</string>\n    <string name=\"about_account_info_title\">Dein Konto</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nVersion: %3$s</string>\n    <string name=\"about_copied\">Version und Geräteinformationen kopiert</string>\n    <string name=\"about_copy\">Version und Geräteinformationen kopieren</string>\n    <string name=\"list_exclusive_label\">Nicht in der Startseite anzeigen</string>\n    <string name=\"error_media_upload_sending_fmt\">Das Hochladen ist fehlgeschlagen: %1$s</string>\n    <string name=\"label_image\">Bild</string>\n    <string name=\"help_empty_lists\">Das ist deine <b>Listenansicht</b>. Du kannst private Listen erstellen und diese Profile hinzufügen. \\u0020\n\\n \\u0020\n\\nBEACHTE, dass du nur Profile hinzufügen kannst, denen du folgst. \\u0020\n\\n \\u0020\n\\nDiese Listen können als Tab in den Kontoeinstellungen {{manage_accounts}} {{chevron_right}} Tabs festgelegt werden.</string>\n    <string name=\"help_empty_conversations\">Hier befinden sich deine <b>privaten Nachrichten</b> – auch bekannt als Unterhaltungen oder »direct messages« (DM, Direktnachricht).\n\\n\n\\nPrivate Nachrichten werden erstellt, indem die Beitragssichtbarkeit {{public}} auf {{mail}} <i>Direkt</i> gesetzt wird und ein oder mehrere Profile erwähnt werden.\n\\n\n\\nBeispiel: Du befindest dich auf einer Profilseite und klickst auf die Schaltfläche »Verfassen« {{edit}} und änderst anschließend die Sichtbarkeit.\n\\n\n\\nBeachte dass Nachrichten im Fediverse nicht Ende-zu-Ende verschlüsselt sind. Versende keine heiklen Informationen.</string>\n    <string name=\"app_theme_system_black\">Systemdesign verwenden (Schwarz)</string>\n    <string name=\"error_media_playback\">Wiedergabe fehlgeschlagen: %1$s</string>\n    <string name=\"dialog_delete_filter_positive_action\">Entfernen</string>\n    <string name=\"dialog_delete_filter_text\">Filter »%1$s« entfernen?</string>\n    <string name=\"dialog_save_profile_changes_message\">Möchtest du deine Änderungen am Profil speichern?</string>\n    <string name=\"unmuting_hashtag_success_format\">Hashtag #%1$s nicht mehr stummschalten</string>\n    <string name=\"action_view_filter\">Filter ansehen</string>\n    <string name=\"muting_hashtag_success_format\">Hashtag #%1$s als Warnung stummschalten</string>\n    <string name=\"following_hashtag_success_format\">Hashtag #%1$s wird jetzt gefolgt</string>\n    <string name=\"unfollowing_hashtag_success_format\">Hashtag #%1$s wird nicht länger gefolgt</string>\n    <string name=\"title_public_trending_statuses\">Angesagte Beiträge</string>\n    <string name=\"error_blocking_domain\">Fehler beim Stummschalten von %1$s: %2$s</string>\n    <string name=\"error_unblocking_domain\">Fehler beim Aufheben der Stummschaltung von %1$s: %2$s</string>\n    <string name=\"list_reply_policy_label\">Antworten anzeigen für</string>\n    <string name=\"list_reply_policy_followed\">Alle gefolgten Profile</string>\n    <string name=\"list_reply_policy_list\">Mitglieder der Liste</string>\n    <string name=\"list_reply_policy_none\">Niemanden</string>\n    <string name=\"pref_title_show_self_boosts\">Eigene geteilte Beiträge anzeigen</string>\n    <string name=\"pref_title_show_self_boosts_description\">Die Person teilt ihre eigenen Beiträge</string>\n    <string name=\"pref_title_per_timeline_preferences\">Einstellungen pro Timeline</string>\n    <string name=\"reply_sending\">Wird gesendet …</string>\n    <string name=\"reply_sending_long\">Deine Antwort wird gesendet.</string>\n    <string name=\"action_translate\">Übersetzen</string>\n    <string name=\"action_show_original\">Ursprünglichen Beitrag anzeigen</string>\n    <string name=\"label_translating\">Wird übersetzt …</string>\n    <string name=\"label_translated\">Aus %1$s mittels %2$s übersetzt</string>\n    <string name=\"ui_error_translate\">Fehler beim Übersetzen: %1$s</string>\n    <string name=\"pref_title_show_notifications_filter\">Benachrichtigungsfilter anzeigen</string>\n    <string name=\"report_category_legal\">Rechtliches</string>\n    <string name=\"url_copied\">URL kopiert</string>\n    <string name=\"confirmation_hashtag_copied\">»%1$s« kopiert</string>\n    <string name=\"pref_title_confirm_follows\">Vor dem Folgen bestätigen</string>\n    <string name=\"unknown_notification_type\">Unbekannter Nachrichtentyp</string>\n    <string name=\"dialog_follow_warning\">Diesem Konto folgen?</string>\n    <string name=\"action_follow_hashtag\">Einem neuen Hashtag folgen</string>\n    <string name=\"pref_default_reply_privacy\">Antwortsichtbarkeit (nicht mit dem Server synchronisiert)</string>\n    <string name=\"error_deleting_filter\">Fehler beim Löschen des Filters »%1$s«</string>\n    <string name=\"error_saving_filter\">Fehler beim Speichern des Filters »%1$s«</string>\n    <string name=\"pref_default_reply_privacy_explanation\">Die vorausgewählte Sichtbarkeit hängt vom Beitrag ab, auf den du antwortest.</string>\n    <string name=\"pref_match_default_post_privacy\">Von Standard-Beitragssichtbarkeit übernehmen</string>\n    <string name=\"post_privacy_direct\">Direkt</string>\n    <string name=\"label_expires_after\">Gültig bis</string>\n    <string name=\"notification_policies_title\">Benachrichtigungsrichtlinien</string>\n    <string name=\"notification_policies_filter_out\">Benachrichtigungen verwalten von …</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">Profilen, denen ich nicht folge</string>\n    <string name=\"notification_policies_filter_dont_follow_description\">Bis du sie manuell genehmigst</string>\n    <string name=\"notification_policies_filter_not_following_title\">Profilen, die mir nicht folgen</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">neuen Konten</string>\n    <string name=\"unknown_notification_filter_new_accounts_description\">Innerhalb der letzten 30 Tagen erstellt</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_title\">unerwünschten privaten Erwähnungen</string>\n    <string name=\"unknown_notification_filter_moderated_accounts\">moderierten Konten</string>\n    <string name=\"unknown_notification_filter_moderated_accounts_description\">Durch Server-Moderator*innen eingeschränkt</string>\n    <string name=\"notification_policies_not_supported\">Funktioniert nur bei Mastodon-Servern, die Version 4.3.0 oder neuer installiert haben.</string>\n    <string name=\"filtered_notifications\">Gefilterte Benachrichtigungen</string>\n    <string name=\"notifications_from_people_you_may_know\">Benachrichtigungen von %1$d Person(en), die du möglicherweise kennst</string>\n    <string name=\"notification_policy_accept\">Genehmigen</string>\n    <string name=\"notification_policy_filter\">Filtern</string>\n    <string name=\"notification_policy_ignore\">Ignorieren</string>\n    <string name=\"filtered_notifications_title\">Gefilterte Benachrichtigungen</string>\n    <string name=\"accept_notification_request\">Benachrichtigungsanfragen genehmigen</string>\n    <string name=\"dismiss_notification_request\">Benachrichtigungsanfragen ablehnen</string>\n    <string name=\"open_settings\">Einstellungen öffnen</string>\n    <string name=\"action_accept_notification_request\">Genehmigen</string>\n    <string name=\"action_dismiss_notification_request\">Ablehnen</string>\n    <string name=\"notification_policies_filter_not_following_description\">Einschließlich Profilen, die dir seit weniger als 3 Tagen folgen</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_description\">Solange sie keine Antwort auf deine Erwähnung ist oder du dem Profil nicht folgst</string>\n    <string name=\"notifications_from\">Benachrichtigungen von %1$s</string>\n    <string name=\"follow_hashtag_success\">Hashtag %1$s wird jetzt gefolgt</string>\n    <string name=\"relationship_severance_event_title\">Verbindung verloren</string>\n    <string name=\"moderation_warning_action_delete_statuses\">Einige deiner Beiträge sind entfernt worden.</string>\n    <plurals name=\"media_attachments\">\n        <item quantity=\"one\">%1$s Anhang</item>\n        <item quantity=\"other\">%1$s Anhänge</item>\n    </plurals>\n    <string name=\"relationship_severance_event_domain_block\">Ein Admin von %1$s hat %2$s blockiert – darunter %3$s deiner Follower und %4$s, denen du folgst.</string>\n    <string name=\"relationship_severance_event_user_domain_block\">Du hast %1$s blockiert – %2$s deiner Follower und %3$s, denen du folgst, wurden entfernt.</string>\n    <string name=\"poll\">Umfrage</string>\n    <string name=\"action_reblog_private\">Boost nur für Folgende</string>\n    <string name=\"action_reblog_public\">Öffentlicher Boost</string>\n    <plurals name=\"accounts\">\n        <item quantity=\"one\">%1$s Konto</item>\n        <item quantity=\"other\">%1$s Konten</item>\n    </plurals>\n    <string name=\"moderation_warning\">Du wurdest von den Moderator*innen verwarnt.</string>\n    <string name=\"moderation_warning_action_disable\">Dein Konto wurde deaktiviert.</string>\n    <string name=\"moderation_warning_action_none\">Dein Konto ist von den Moderator*innen verwarnt worden.</string>\n    <string name=\"moderation_warning_action_sensitive\">Deine zukünftigen Beiträge werden mit einer Inhaltswarnung versehen.</string>\n    <string name=\"moderation_warning_action_silence\">Dein Konto wurde eingeschränkt.</string>\n    <string name=\"moderation_warning_action_suspend\">Dein Konto wurde gesperrt.</string>\n    <string name=\"notification_info_private_mention\">Private Erwähnung</string>\n    <string name=\"notification_info_mention\">Erwähnung</string>\n    <string name=\"notification_info_private_reply\">Private Antwort</string>\n    <string name=\"notification_channel_other\">Andere</string>\n    <string name=\"preview_card_by_author\">Von %1$s</string>\n    <string name=\"preview_card_more_by_author\">Mehr von %1$s</string>\n    <string name=\"post_replied_self\">Fortgeführter Thread</string>\n    <string name=\"post_replied\">Antwortete</string>\n    <string name=\"post_replied_format\">Antwort an %1$s</string>\n    <string name=\"notification_channel_admin_description\">Administrationsbenachrichtigungen wie neue Meldungen und Accounts</string>\n    <string name=\"action_reblog_unlisted\">Ungelisteter Boost</string>\n    <string name=\"relationship_severance_event_account_suspension\">Ein Admin von %1$s hat %2$s gesperrt. Du wirst von diesem Profil keine Updates mehr erhalten und auch nicht mit ihm interagieren können.</string>\n    <string name=\"unknown_notification_type_explanation\">Dieser Benachrichtigungstyp ist Tusky unbekannt, weshalb er nicht angezeigt werden kann. Möglicherweise ist er in der Webansicht sichtbar. Bitte gib den Entwickler*innen von Tusky Bescheid, damit der Benachrichtigungstyp in Zukunft unterstützt werden kann!</string>\n    <string name=\"notification_info_reply\">Antwort</string>\n    <string name=\"notification_channel_admin\">Administration</string>\n    <string name=\"notification_severed_relationship_name\">Verlorene Verbindungen</string>\n    <string name=\"notification_unknown_description\">Unbekannter Benachrichtigungstyp</string>\n    <string name=\"moderation_warning_action_mark_statuses_as_sensitive\">Einige deiner Beiträge wurden mit einer Inhaltswarnung versehen.</string>\n    <string name=\"notification_moderation_warning_name\">Moderationsverwarnung</string>\n    <string name=\"notification_channel_other_description\">Andere Benachrichtigungen wie verlorene Verbindungen oder Moderationsverwarnungen</string>\n    <string name=\"poll_show_results\">Ergebnisse anzeigen</string>\n    <string name=\"no\">Nein</string>\n    <string name=\"yes\">Ja</string>\n    <string name=\"confirm_dismiss_caption\">Änderungen an der Bildbeschreibung verwerfen?</string>\n    <string name=\"mute_failure\">Fehler beim stummschalten von %1$s: %2$s</string>\n    <string name=\"unblock_success\">%1$s entblockt</string>\n    <string name=\"unmute_success\">%1$s nicht mehr stummgeschalten</string>\n    <string name=\"block_failure\">Fehler beim blockieren von %1$s: %2$s</string>\n    <string name=\"filter_action_blur\">Medien ausblenden</string>\n    <string name=\"filter_description_blur\">Medien mit einer Warnung ausblenden, ohne den Text selbst auszublenden</string>\n    <string name=\"unblock_failure\">Fehler beim entblocken von %1$s: %2$s</string>\n    <string name=\"unmute_failure\">Failed beim Aufheben der Stummschalteung von %1$s: %2$s</string>\n    <string name=\"accept_follow_request_failure\">Fehler beim Annehmen der Folgeanfrage von %1$s: %2$s</string>\n    <string name=\"reject_follow_request_failure\">Fehler beim Ablehnen der Folgeanfrage von %1$s: %2$s</string>\n    <string name=\"reblog_privacy_unlisted_description\">Gleich wie Öffentlich, ohne in öffentlichen Timelines angezeigt zu werden</string>\n    <string name=\"reblog_confirm\">Diesen Beitrag teilen?</string>\n    <string name=\"favourite_confirm\">Diesen Beitrag favorisieren?</string>\n    <string name=\"reblog_privacy_public_description\">Alle können sehen dass du den Beitrag teilst</string>\n    <string name=\"reblog_privacy_followers_only_description\">Nur deine Follower können sehen dass du den Beitrag teilst</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-el/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_empty\">Αυτό δεν μπορεί να είναι άδειο.</string>\n    <string name=\"error_network\">Προέκυψε σφάλμα δικτύου! Παρακαλώ ελέγξτε τη σύνδεσή σας και προσπαθήστε ξανά.</string>\n    <string name=\"error_generic\">Προέκυψε ένα σφάλμα.</string>\n    <string name=\"action_view_blocks\">Αποκλεισμένοι χρήστες</string>\n    <string name=\"dialog_message_cancel_follow_request\">Ακύρωση αιτήματος ακολούθησης;</string>\n    <string name=\"dialog_delete_conversation_warning\">Διαγραφή αυτής της συζήτησης;</string>\n    <string name=\"search_no_results\">Δεν υπάρχουν αποτελέσματα</string>\n    <string name=\"title_edit_profile\">Επεργασία προφίλ</string>\n    <string name=\"title_follows\">Ακολουθεί</string>\n    <string name=\"action_reset_schedule\">Επαναφορά</string>\n    <string name=\"notification_follow_format\">%1$s σας ακολούθησε</string>\n    <string name=\"action_view_mutes\">Χρήστες σε σίγαση</string>\n    <string name=\"action_logout\">Αποσύνδεση</string>\n    <string name=\"action_unfollow\">Παύω να ακολουθώ</string>\n    <string name=\"action_unmute_domain\">Άρση σίγασης %1$s</string>\n    <string name=\"action_delete_and_redraft\">Διαγραφή και αναδιατύπωση</string>\n    <string name=\"action_edit_profile\">Επεξεργασία προφίλ</string>\n    <string name=\"action_share\">Κοινοποίηση</string>\n    <string name=\"title_licenses\">Άδειες</string>\n    <string name=\"action_open_in_web\">Ανοίξτε σε περιηγητή</string>\n    <string name=\"action_view_follow_requests\">Αιτήματα ακολούθησης</string>\n    <string name=\"action_bookmark\">Προσθήκη σελιδοδείκτη</string>\n    <string name=\"action_more\">Περισσότερα</string>\n    <string name=\"action_view_bookmarks\">Σελιδοδείκτες</string>\n    <string name=\"title_bookmarks\">Σελιδοδείκτες</string>\n    <string name=\"title_followers\">Ακόλουθοι</string>\n    <string name=\"action_unblock\">Άρση αποκλεισμού</string>\n    <string name=\"title_favourites\">Αγαπημένα</string>\n    <string name=\"error_compose_character_limit\">Η δημοσίευση είναι πολύ μεγάλη!</string>\n    <string name=\"action_emoji_keyboard\">Πληκτρολόγιο emoji</string>\n    <string name=\"action_logout_confirm\">Σίγουρα θέλετε να αποσυνδεθείτε από το %1$s; Αυτό θα διαγράψει όλα τα τοπικά δεδομένα του λογαριασμού, συμπεριλαμβανομένων των πρόχειρων και των προτιμήσεων.</string>\n    <string name=\"title_drafts\">Πρόχειρα</string>\n    <string name=\"action_view_favourites\">Αγαπημένα</string>\n    <string name=\"label_quick_reply\">Απάντηση…</string>\n    <string name=\"action_reject\">Απόρριψη</string>\n    <string name=\"title_blocks\">Αποκλεισμένοι χρήστες</string>\n    <string name=\"action_unreblog\">Αφαίρεση προώθησης</string>\n    <string name=\"action_edit\">Επεξεργασία</string>\n    <string name=\"action_mute_domain\">Σίγαση %1$s</string>\n    <string name=\"action_block\">Αποκλεισμός</string>\n    <string name=\"action_undo\">Αναίρεση</string>\n    <string name=\"notification_follow_request_format\">%1$s ζήτησε να σας ακολουθήσει</string>\n    <string name=\"action_reply\">Απάντηση</string>\n    <string name=\"title_tab_preferences\">Καρτέλες</string>\n    <string name=\"notification_reblog_format\">%1$s προώθησε τη δημοσίευσή σας</string>\n    <string name=\"notification_favourite_format\">%1$s προτίμησε τη δημοσίευσή σας</string>\n    <string name=\"action_follow\">Ακολουθήστε</string>\n    <string name=\"action_report\">Αναφορά</string>\n    <string name=\"action_mute\">Σίγαση</string>\n    <string name=\"action_unfavourite\">Αφαίρεση αγαπημένου</string>\n    <string name=\"report_username_format\">Αναφορά %1$s</string>\n    <string name=\"action_view_account_preferences\">Προτιμήσεις λογαριασμού</string>\n    <string name=\"action_add_tab\">Προσθήκη καρτέλας</string>\n    <string name=\"action_copy_link\">Αντιγραφή συνδέσμου</string>\n    <string name=\"hint_search\">Αναζήτηση…</string>\n    <string name=\"action_accept\">Αποδοχή</string>\n    <string name=\"action_show_reblogs\">Εμφάνιση προωθήσεων</string>\n    <string name=\"action_view_profile\">Προφίλ</string>\n    <string name=\"title_follow_requests\">Αιτήματα ακολούθησης</string>\n    <string name=\"action_search\">Αναζήτηση</string>\n    <string name=\"action_delete_conversation\">Διαγραφή συζήτησης</string>\n    <string name=\"action_delete\">Διαγραφή</string>\n    <string name=\"notification_subscription_format\">%1$s μόλις δημοσίευσε</string>\n    <string name=\"action_save\">Αποθήκευση</string>\n    <string name=\"action_quick_reply\">Γρήγορη Απάντηση</string>\n    <string name=\"title_mutes\">Χρήστες σε σίγαση</string>\n    <string name=\"action_hide_reblogs\">Απόκρυψη προωθήσεων</string>\n    <string name=\"action_view_preferences\">Προτιμήσεις</string>\n    <string name=\"title_login\">Σύνδεση</string>\n    <string name=\"title_announcements\">Ανακοινώσεις</string>\n    <string name=\"action_access_drafts\">Πρόχειρα</string>\n    <string name=\"notification_sign_up_format\">%1$s εγγράφηκε</string>\n    <string name=\"action_retry\">Προσπαθήστε ξανά</string>\n    <string name=\"dialog_delete_post_warning\">Διαγραφή αυτής της δημοσίευσης;</string>\n    <string name=\"action_unmute\">Άρση σίγασης</string>\n    <string name=\"action_favourite\">Αγαπημένο</string>\n    <string name=\"title_links_dialog\">Σύνδεσμοι</string>\n    <string name=\"action_close\">Κλείσιμο</string>\n    <string name=\"title_notifications\">Ειδοποιήσεις</string>\n    <string name=\"action_compose\">Συνθέστε</string>\n    <string name=\"action_login\">Σύνδεση με Tusky</string>\n    <string name=\"action_edit_own_profile\">Επεξεργασία</string>\n    <string name=\"action_reblog\">Προώθηση</string>\n    <string name=\"dialog_unfollow_warning\">Άρση ακολούθησης αυτού του λογαριασμού;</string>\n    <string name=\"dialog_mute_hide_notifications\">Απόκρυψη ειδοποιήσεων</string>\n    <string name=\"action_unbookmark\">Αφαίρεση σελιδοδείκτη</string>\n    <string name=\"action_content_warning\">Προειδοποίηση περιεχομένου</string>\n    <string name=\"action_links\">Σύνδεσμοι</string>\n    <string name=\"login_connection\">Σύνδεση…</string>\n    <string name=\"action_access_scheduled_posts\">Προγραμματισμένες δημοσιεύσεις</string>\n    <string name=\"action_schedule_post\">Προγραμματισμός δημοσίευσης</string>\n    <string name=\"title_scheduled_posts\">Προγραμματισμένες δημοσιεύσεις</string>\n    <string name=\"title_posts\">Δημοσιεύσεις</string>\n    <string name=\"title_posts_pinned\">Καρφιτσωμένο</string>\n    <string name=\"post_sensitive_media_title\">Ευαίσθητο περιεχόμενο</string>\n    <string name=\"post_media_hidden_title\">Κρυφά πολυμέσα</string>\n    <string name=\"post_boosted_format\">%1$s προώθησε</string>\n    <string name=\"title_posts_with_replies\">Με απαντήσεις</string>\n    <string name=\"post_content_warning_show_more\">Δείτε περισσότερα</string>\n    <string name=\"post_content_warning_show_less\">Δείτε λιγότερα</string>\n    <string name=\"post_sensitive_media_directions\">Πατήστε για να δείτε</string>\n    <string name=\"notification_update_format\">%1$s επεξεργάσταν τη δημοσίευσή τους</string>\n    <string name=\"dialog_redraft_post_warning\">Διαγραφή και αναδιατύπωση αυτής της δημοσίευσης;</string>\n    <string name=\"error_following_hashtag_format\">Σφάλμα ακολούθησης #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Σφάλμα παύσης ακολούθησης #%1$s</string>\n    <string name=\"error_media_upload_sending_fmt\">Το ανέβασμα απέτυχε: %1$s</string>\n    <string name=\"error_media_upload_sending\">Το ανέβασμα αρχείου απέτυχε.</string>\n    <string name=\"error_loading_account_details\">Η φόρτωση λεπτομερειών λογαριασμού απέτυχε</string>\n    <string name=\"title_home\">Αρχική σελίδα</string>\n    <string name=\"error_sender_account_gone\">Σφάλμα αποστολής ανάρτησης.</string>\n    <string name=\"error_could_not_load_login_page\">Δεν ήταν δυνατή η φόρτωση της σελίδας εισόδου χρήστη.</string>\n    <string name=\"account_note_hint\">Το προσωπικό σας σημείωμα σχετικά με αυτόν τον λογαριασμό</string>\n    <string name=\"description_post_media_no_description_placeholder\">Χωρίς περιγραφή</string>\n    <string name=\"delete_scheduled_post_warning\">Διαγραφή της προγραμματισμένης ανάρτησης;</string>\n    <string name=\"post_media_attachments\">Συνημμένα</string>\n    <string name=\"hint_media_description_missing\">Τα πολυμέσα πρέπει να έχουν μια περιγραφή.</string>\n    <string name=\"error_multimedia_size_limit\">Το μέγεθος των αρχείων βίντεο και ήχου δεν μπορεί να υπερβαίνει τα %1$s MB.</string>\n    <string name=\"error_media_upload_permission\">Απαιτείται άδεια ανάγνωσης των πολυμέσων.</string>\n    <string name=\"notification_mention_descriptions\">Ειδοποιήσεις για νέες μνείες</string>\n    <string name=\"action_hide_media\">Απόκρυψη πολυμέσων</string>\n    <string name=\"downloading_media\">Γίνεται λήψη πολυμέσων</string>\n    <string name=\"download_media\">Λήψη πολυμέσων</string>\n    <string name=\"action_lists\">Λίστες</string>\n    <string name=\"action_delete_list\">Διαφραφή λίστας</string>\n    <string name=\"notification_follow_description\">Ειδοποιήσεις για νέους ακόλουθους</string>\n    <string name=\"title_accounts\">Λογαριασμοί</string>\n    <string name=\"about_device_info_title\">Η συσκευή σου</string>\n    <string name=\"dialog_delete_list_warning\">Θέλετε πράγματι να διαγράψετε τη λίστα %1$s;</string>\n    <string name=\"about_copied\">Αντιγραμμένη έκδοση και πληροφορίες συσκευής</string>\n    <string name=\"action_add_media\">Προσθήκη πολυμέσων</string>\n    <string name=\"send_media_to\">Κοινοποίηση πολυμέσων σε…</string>\n    <string name=\"post_media_image\">Εικόνα</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"draft_deleted\">Πρόχειρο διαγράφηκε</string>\n    <string name=\"action_view_media\">Πολυμέσα</string>\n    <string name=\"dialog_message_uploading_media\">Ανέβασμα…</string>\n    <string name=\"about_title_activity\">Σχετικά</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Να εμφανίζετε πάντα το ευαίσθητο περιεχόμενο</string>\n    <string name=\"description_post_media\">Πολυμέσα: %1$s</string>\n    <string name=\"title_mentions_dialog\">Μνείες</string>\n    <string name=\"title_hashtags_dialog\">Ετικέτες</string>\n    <string name=\"dialog_title_finishing_media_upload\">Τέλος ανεβάσματος πολυμέσων</string>\n    <string name=\"notification_mention_name\">Νέες μνείες</string>\n    <string name=\"no_lists\">Δεν έχετε λίστες.</string>\n    <string name=\"about_copy\">Αντιγραφή έκδοσης και πληροφοριών συσκευής</string>\n    <string name=\"dialog_delete_filter_positive_action\">Διαγραφή</string>\n    <string name=\"select_list_manage\">Διαχείρηση λιστών</string>\n    <string name=\"title_public_trending_statuses\">Δημοφιλείς δημοσιεύσεις</string>\n    <string name=\"title_public_trending_hashtags\">Δημοφιλείς ετικέτες</string>\n    <string name=\"notifications_clear\">Διαγραφή</string>\n    <string name=\"action_mentions\">Μνείες</string>\n    <string name=\"title_media\">Πολυμέσα</string>\n    <string name=\"compose_delete_draft\">Διαγραφή πρόχειρου;</string>\n    <string name=\"title_lists\">Λίστες</string>\n    <string name=\"error_delete_list\">Δεν μπόρεσε να διαγράψει τη λίστα</string>\n    <string name=\"post_media_images\">Εικόνες</string>\n    <string name=\"post_media_video\">Βίντεο</string>\n    <string name=\"post_media_audio\">Ήχος</string>\n    <string name=\"about_account_info_title\">Ο λογαρισμός σου</string>\n    <string name=\"about_project_site\">Ιστοσελίδα εφαρμογής: https://tusky.app</string>\n    <string name=\"action_open_media_n\">Άνοιγμα πολυμέσων #%1$d</string>\n    <string name=\"dialog_delete_filter_text\">Διαγραφή φίλτρου \\'%1$s\\';</string>\n    <string name=\"error_media_upload_type\">Αυτός ο τύπος αρχείου δεν μπορεί να μεταφορτωθεί.</string>\n    <string name=\"error_media_upload_opening\">Αυτό το αρχείο δεν μπόρεσε να ανοίξει.</string>\n    <string name=\"title_direct_messages\">Απευθείας μηνύματα</string>\n    <string name=\"title_public_local\">Τοπικά</string>\n    <string name=\"error_no_web_browser_found\">Δεν βρέθηκε πρόγραμμα περιήγησης στο διαδίκτυο για χρήση.</string>\n    <string name=\"error_media_download_permission\">Απαιτείται άδεια για την αποθήκευση πολυμέσων.</string>\n    <string name=\"error_image_edit_failed\">Η εικόνα δεν μπορεί να επεξεργαστεί.</string>\n    <string name=\"unknown_notification_type\">Άγνωστος τύπος ειδοποιήσης</string>\n    <string name=\"list_reply_policy_list\">Μέλη της λίστας</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-en-rAU/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    </resources>"
  },
  {
    "path": "app/src/main/res/values-en-rGB/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"report_description_remote_instance\">The account is from another server. Send an anonymised copy of the report there as well?</string>\n    <string name=\"description_post_favourited\">Favourited</string>\n    <string name=\"title_favourited_by\">Favourited by</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> Favourite</item>\n        <item quantity=\"other\"><b>%1$s</b> Favourites</item>\n    </plurals>\n    <string name=\"notification_favourite_description\">Notifications when your posts get marked as favourite</string>\n    <string name=\"notification_favourite_name\">Favourites</string>\n    <string name=\"action_open_faved_by\">Show favourites</string>\n    <string name=\"action_view_favourites\">Favourites</string>\n    <string name=\"action_unfavourite\">Remove favourite</string>\n    <string name=\"action_favourite\">Favourite</string>\n    <string name=\"notification_favourite_format\">%1$s favourited your post</string>\n    <string name=\"title_favourites\">Favourites</string>\n    <string name=\"error_authorization_denied\">Authorisation was denied. If you\\'re sure that you supplied the correct credentials, try Login in Browser from the menu.</string>\n    <string name=\"error_authorization_unknown\">An unidentified authorisation error occurred.</string>\n    <string name=\"pref_title_gradient_for_media\">Show colourful gradients for hidden media</string>\n    <string name=\"error_multimedia_size_limit\">Video and audio files cannot exceed %1$s MB in size.</string>\n    <string name=\"error_media_upload_opening\">That file could not be opened.</string>\n    <string name=\"error_media_upload_permission\">Permission to read media is required.</string>\n    <string name=\"error_media_download_permission\">Permission to store media is required.</string>\n    <string name=\"error_media_upload_image_or_video\">Images and videos cannot both be attached to the same post.</string>\n    <string name=\"error_media_upload_sending\">The upload failed.</string>\n    <string name=\"error_muting_hashtag_format\">Error muting #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Error unmuting #%1$s</string>\n    <string name=\"error_following_hashtags_unsupported\">This instance does not support following hashtags.</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"post_content_warning_show_more\">Show more</string>\n    <string name=\"error_status_source_load\">Failed to load the status source from the server.</string>\n    <string name=\"post_content_warning_show_less\">Show less</string>\n    <string name=\"error_following_hashtag_format\">Error following #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Error unfollowing #%1$s</string>\n    <string name=\"title_notifications\">Notifications</string>\n    <string name=\"title_public_federated\">Federated</string>\n    <string name=\"title_direct_messages\">Direct messages</string>\n    <string name=\"error_generic\">An error occurred.</string>\n    <string name=\"error_sender_account_gone\">Error sending post.</string>\n    <string name=\"title_public_local\">Local</string>\n    <string name=\"title_posts_with_replies\">With replies</string>\n    <string name=\"error_empty\">This cannot be empty.</string>\n    <string name=\"error_invalid_domain\">Invalid domain entered</string>\n    <string name=\"title_public_trending_statuses\">Trending posts</string>\n    <string name=\"title_public_trending_hashtags\">Trending hashtags</string>\n    <string name=\"error_unblocking_domain\">Failed to unmute %1$s: %2$s</string>\n    <string name=\"error_media_upload_sending_fmt\">The upload failed: %1$s</string>\n    <string name=\"error_blocking_domain\">Failed to mute %1$s: %2$s</string>\n    <string name=\"notification_follow_request_format\">%1$s requested to follow you</string>\n    <string name=\"post_sensitive_media_title\">Sensitive content</string>\n    <string name=\"error_deleting_filter\">Error deleting filter \\'%1$s\\'</string>\n    <string name=\"error_saving_filter\">Error saving filter \\'%1$s\\'</string>\n    <string name=\"title_tab_preferences\">Tabs</string>\n    <string name=\"title_view_thread\">Thread</string>\n    <string name=\"title_posts\">Posts</string>\n    <string name=\"title_posts_pinned\">Pinned</string>\n    <string name=\"title_follows\">Follows</string>\n    <string name=\"title_followers\">Followers</string>\n    <string name=\"title_bookmarks\">Bookmarks</string>\n    <string name=\"title_mutes\">Muted users</string>\n    <string name=\"title_blocks\">Blocked users</string>\n    <string name=\"title_domain_mutes\">Hidden domains</string>\n    <string name=\"title_follow_requests\">Follow requests</string>\n    <string name=\"title_edit_profile\">Edit your profile</string>\n    <string name=\"title_licenses\">Licenses</string>\n    <string name=\"title_followed_hashtags\">Followed hashtags</string>\n    <string name=\"title_edits\">Edits</string>\n    <string name=\"dialog_follow_hashtag_title\">Follow hashtag</string>\n    <string name=\"post_media_hidden_title\">Media hidden</string>\n    <string name=\"post_sensitive_media_directions\">Click to view</string>\n    <string name=\"post_content_show_more\">Expand</string>\n    <string name=\"post_content_show_less\">Collapse</string>\n    <string name=\"post_edited\">Edited %1$s</string>\n    <string name=\"message_empty\">Nothing here.</string>\n    <string name=\"footer_empty\">Nothing here. Pull down to refresh!</string>\n    <string name=\"notification_follow_format\">%1$s followed you</string>\n    <string name=\"notification_sign_up_format\">%1$s signed up</string>\n    <string name=\"title_drafts\">Drafts</string>\n    <string name=\"notification_reblog_format\">%1$s boosted your post</string>\n    <string name=\"title_login\">Login</string>\n    <string name=\"title_announcements\">Announcements</string>\n    <string name=\"error_could_not_load_login_page\">Could not load the login page.</string>\n    <string name=\"title_scheduled_posts\">Scheduled posts</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s boosted</string>\n    <string name=\"error_network\">A network error occurred. Please check your connection and try again.</string>\n    <string name=\"error_failed_app_registration\">Failed authenticating with that instance. If this persists, try Login in Browser from the menu.</string>\n    <string name=\"error_no_web_browser_found\">Couldn\\'t find a web browser to use.</string>\n    <string name=\"error_retrieving_oauth_token\">Failed getting a login token. If this persists, try Login in Browser from the menu.</string>\n    <string name=\"error_loading_account_details\">Failed to load account details</string>\n    <string name=\"error_image_edit_failed\">The image could not be edited.</string>\n    <string name=\"error_media_upload_type\">That type of file cannot be uploaded.</string>\n    <string name=\"error_compose_character_limit\">The post is too long!</string>\n    <string name=\"title_home\">Home</string>\n    <string name=\"notification_subscription_format\">%1$s just posted</string>\n    <string name=\"action_post_failed\">Upload failed</string>\n    <string name=\"report_comment_hint\">Additional comments?</string>\n    <string name=\"action_quick_reply\">Quick Reply</string>\n    <string name=\"action_reblog\">Boost</string>\n    <string name=\"action_reply\">Reply</string>\n    <string name=\"action_unreblog\">Remove boost</string>\n    <string name=\"action_logout_confirm\">Are you sure you want to log out of %1$s? This will delete all local data of the account, including drafts and preferences.</string>\n    <string name=\"action_share_account_link\">Share a link to this account</string>\n    <string name=\"favourite_confirm\">Favourite this post?</string>\n    <string name=\"pref_title_confirm_favourites\">Show confirmation before favouriting</string>\n    <string name=\"ui_error_favourite\">Favouriting post failed: %1$s</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-eo/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">Eraro okazis.</string>\n    <string name=\"error_network\">Reta eraro okazis! Bonvolu kontroli vian konekton kaj klopodi denove!</string>\n    <string name=\"error_empty\">Tiu ne povas esti malplena.</string>\n    <string name=\"error_invalid_domain\">Enmetita domajno estas nevalida</string>\n    <string name=\"error_failed_app_registration\">Aŭtentigo en ĉi tiu nodo malsukcesis.</string>\n    <string name=\"error_no_web_browser_found\">Ne eblas trovi retumilon.</string>\n    <string name=\"error_authorization_unknown\">Nekonata eraro de aŭtentigo okazis.</string>\n    <string name=\"error_authorization_denied\">Rajtigo rifuzita.</string>\n    <string name=\"error_retrieving_oauth_token\">Akiro de atingoĵetono malsukcesis.</string>\n    <string name=\"error_compose_character_limit\">Via mesaĝo estas tro longa!</string>\n    <string name=\"error_media_upload_type\">Tia dosiero ne estas alŝutebla.</string>\n    <string name=\"error_media_upload_opening\">Tiu dosiero ne povas esti malfermita.</string>\n    <string name=\"error_media_upload_permission\">Permeso legi aŭdovidaĵojn necesas.</string>\n    <string name=\"error_media_download_permission\">Permeso konservi aŭdovidaĵojn necesas.</string>\n    <string name=\"error_media_upload_image_or_video\">Bildoj kaj videoj ne povas esti ambaŭ alkroĉitaj al la sama mesaĝo.</string>\n    <string name=\"error_media_upload_sending\">La alŝuto malsukcesis.</string>\n    <string name=\"error_sender_account_gone\">Okazis eraro dum la sendo de la mesaĝo.</string>\n    <string name=\"title_home\">Hejmo</string>\n    <string name=\"title_notifications\">Sciigoj</string>\n    <string name=\"title_public_local\">Loka</string>\n    <string name=\"title_public_federated\">Fratara</string>\n    <string name=\"title_direct_messages\">Rektaj mesaĝoj</string>\n    <string name=\"title_tab_preferences\">Langetoj</string>\n    <string name=\"title_view_thread\">Fadeno</string>\n    <string name=\"title_posts\">Mesaĝoj</string>\n    <string name=\"title_posts_with_replies\">Kun respondoj</string>\n    <string name=\"title_posts_pinned\">Alpinglitaj</string>\n    <string name=\"title_follows\">Sekvatoj</string>\n    <string name=\"title_followers\">Sekvantoj</string>\n    <string name=\"title_favourites\">Stelumoj</string>\n    <string name=\"title_mutes\">Silentigitaj uzantoj</string>\n    <string name=\"title_blocks\">Blokitaj uzantoj</string>\n    <string name=\"title_follow_requests\">Petoj de sekvado</string>\n    <string name=\"title_edit_profile\">Redakti vian profilon</string>\n    <string name=\"title_drafts\">Malnetoj</string>\n    <string name=\"title_licenses\">Permesiloj</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s diskonigis</string>\n    <string name=\"post_sensitive_media_title\">Tikla enhavo</string>\n    <string name=\"post_media_hidden_title\">Kaŝitaj aŭdovidaĵoj</string>\n    <string name=\"post_sensitive_media_directions\">Alklaki por vidi</string>\n    <string name=\"post_content_warning_show_more\">Montri pli</string>\n    <string name=\"post_content_warning_show_less\">Montri malpli</string>\n    <string name=\"post_content_show_more\">Pligrandigi</string>\n    <string name=\"post_content_show_less\">Malgrandigi</string>\n    <string name=\"message_empty\">Nenio tie ĉi.</string>\n    <string name=\"footer_empty\">Nenio tie ĉi. Tiru malsupren por aktualigi!</string>\n    <string name=\"notification_reblog_format\">%1$s diskonigis vian mesaĝon</string>\n    <string name=\"notification_favourite_format\">%1$s stelumis vian mesaĝon</string>\n    <string name=\"notification_follow_format\">%1$s eksekvis vin</string>\n    <string name=\"report_username_format\">Signali @%1$s</string>\n    <string name=\"report_comment_hint\">Ĉu pliaj komentoj?</string>\n    <string name=\"action_quick_reply\">Rapida respondo</string>\n    <string name=\"action_reply\">Respondi</string>\n    <string name=\"action_reblog\">Diskonigi</string>\n    <string name=\"action_unreblog\">Nuligi diskonigon</string>\n    <string name=\"action_favourite\">Stelumi</string>\n    <string name=\"action_unfavourite\">Nuligi stelumon</string>\n    <string name=\"action_more\">Pli</string>\n    <string name=\"action_compose\">Verki</string>\n    <string name=\"action_login\">Ensaluti al Mastodon</string>\n    <string name=\"action_logout\">Elsaluti</string>\n    <string name=\"action_logout_confirm\">Ĉu vi certas, ke vi volas elsaluti el la konto %1$s?</string>\n    <string name=\"action_follow\">Sekvi</string>\n    <string name=\"action_unfollow\">Ne plu sekvi</string>\n    <string name=\"action_block\">Bloki</string>\n    <string name=\"action_unblock\">Malbloki</string>\n    <string name=\"action_hide_reblogs\">Kaŝi diskonigojn</string>\n    <string name=\"action_show_reblogs\">Montri diskonigojn</string>\n    <string name=\"action_report\">Signali</string>\n    <string name=\"action_delete\">Forigi</string>\n    <string name=\"action_send\">HUP</string>\n    <string name=\"action_send_public\">HUP!</string>\n    <string name=\"action_retry\">Reprovi</string>\n    <string name=\"action_close\">Fermi</string>\n    <string name=\"action_view_profile\">Profilo</string>\n    <string name=\"action_view_preferences\">Agordoj</string>\n    <string name=\"action_view_account_preferences\">Agordoj de konto</string>\n    <string name=\"action_view_favourites\">Stelumoj</string>\n    <string name=\"action_view_mutes\">Silentigitaj uzantoj</string>\n    <string name=\"action_view_blocks\">Blokitaj uzantoj</string>\n    <string name=\"action_view_follow_requests\">Petoj de sekvado</string>\n    <string name=\"action_view_media\">Aŭdovidaĵo</string>\n    <string name=\"action_open_in_web\">Malfermi en retumilo</string>\n    <string name=\"action_add_media\">Aldoni aŭdovidaĵon</string>\n    <string name=\"action_photo_take\">Foti</string>\n    <string name=\"action_share\">Konigi</string>\n    <string name=\"action_mute\">Silentigi</string>\n    <string name=\"action_unmute\">Malsilentigi</string>\n    <string name=\"action_mention\">Mencii</string>\n    <string name=\"action_hide_media\">Kaŝi aŭdovidaĵojn</string>\n    <string name=\"action_open_drawer\">Montri tirmenuon</string>\n    <string name=\"action_save\">Konservi</string>\n    <string name=\"action_edit_profile\">Redakti profilon</string>\n    <string name=\"action_edit_own_profile\">Redakti</string>\n    <string name=\"action_undo\">Malfari</string>\n    <string name=\"action_accept\">Rajtigi</string>\n    <string name=\"action_reject\">Rifuzi</string>\n    <string name=\"action_search\">Serĉi</string>\n    <string name=\"action_access_drafts\">Malnetoj</string>\n    <string name=\"action_toggle_visibility\">Videblo de la mesaĝo</string>\n    <string name=\"action_content_warning\">Enhava averto</string>\n    <string name=\"action_emoji_keyboard\">Klavaro de emoĝioj</string>\n    <string name=\"action_add_tab\">Aldoni langeton</string>\n    <string name=\"action_links\">Ligiloj</string>\n    <string name=\"action_mentions\">Mencioj</string>\n    <string name=\"action_hashtags\">Kradvortoj</string>\n    <string name=\"action_open_reblogger\">Montri la aŭtoron de la diskonigo</string>\n    <string name=\"action_open_reblogged_by\">Montri diskonigojn</string>\n    <string name=\"action_open_faved_by\">Montri stelumojn</string>\n    <string name=\"title_hashtags_dialog\">Kradvortoj</string>\n    <string name=\"title_mentions_dialog\">Mencioj</string>\n    <string name=\"title_links_dialog\">Ligiloj</string>\n    <string name=\"action_open_media_n\">Malfermi aŭdovidaĵon #%1$d</string>\n    <string name=\"download_image\">Elŝutado de %1$s</string>\n    <string name=\"action_copy_link\">Kopii la ligilon</string>\n    <string name=\"action_open_as\">Malfermi kiel %1$s</string>\n    <string name=\"action_share_as\">Konigi kiel…</string>\n    <string name=\"download_media\">Elŝuti aŭdovidaĵon</string>\n    <string name=\"downloading_media\">Elŝutado de la aŭdovidaĵo</string>\n    <string name=\"send_post_link_to\">Konigi ligilon de mesaĝo al…</string>\n    <string name=\"send_post_content_to\">Konigi mesaĝon al…</string>\n    <string name=\"send_media_to\">Konigi aŭdovidaĵon al…</string>\n    <string name=\"confirmation_reported\">Sendita!</string>\n    <string name=\"confirmation_unblocked\">Malblokita uzanto</string>\n    <string name=\"confirmation_unmuted\">Malsilentigita uzanto</string>\n    <string name=\"hint_domain\">Kiu nodo?</string>\n    <string name=\"hint_compose\">Kio nova?</string>\n    <string name=\"hint_content_warning\">Enhava averto</string>\n    <string name=\"hint_display_name\">Publika nomo</string>\n    <string name=\"hint_note\">Sinprezento</string>\n    <string name=\"hint_search\">Serĉi…</string>\n    <string name=\"search_no_results\">Neniu rezulto</string>\n    <string name=\"label_quick_reply\">Respondi…</string>\n    <string name=\"label_avatar\">Profilbildo</string>\n    <string name=\"label_header\">Fonbildo</string>\n    <string name=\"link_whats_an_instance\">Kio estas nodo?</string>\n    <string name=\"login_connection\">Konektado…</string>\n    <string name=\"dialog_whats_an_instance\">La adreso aŭ domajno de iu ajn nodo povas esti enmetita ĉi tie, kiel mastodon.social, icosahedron.website, social.tchncs.de, kaj <a href=\"https://instances.social\">pli!</a> \\u0020\n\\n \\u0020\n\\nSe vi ankoraŭ ne havas konton, vi povas enmeti la nomon de la nodo, al kiu vi volas aliĝi, kaj krei konton tie. \\u0020\n\\n \\u0020\n\\nNodo estas unika loko tie, kie via konto estas gastigita, sed vi povas facile komuniki kun homoj, kaj sekvi ilin ĉe aliaj nodoj, kvazaŭ vi estus samreteje. \\u0020\n\\n \\u0020\n\\nPliaj informoj troviĝas ĉe <a href=\"https://joinmastodon.org\">joinmastodon.org</a>. </string>\n    <string name=\"dialog_title_finishing_media_upload\">Finante alŝuto de aŭdovidaĵojn</string>\n    <string name=\"dialog_message_uploading_media\">Alŝutado…</string>\n    <string name=\"dialog_download_image\">Elŝuti</string>\n    <string name=\"dialog_message_cancel_follow_request\">Ĉu nuligi peton de sekvado?</string>\n    <string name=\"dialog_unfollow_warning\">Ĉu ne plu sekvi?</string>\n    <string name=\"dialog_delete_post_warning\">Ĉu forigi ĉi tiun mesaĝon?</string>\n    <string name=\"visibility_public\">Publika: afiŝi en publikaj tempolinioj</string>\n    <string name=\"visibility_unlisted\">Nelistigita: Ne afiŝi en publikaj tempolinioj</string>\n    <string name=\"visibility_private\">Nur por sekvantoj: Afiŝi nur al sekvantoj</string>\n    <string name=\"visibility_direct\">Rekta: Afiŝi nur al menciitaj uzantoj</string>\n    <string name=\"pref_title_edit_notification_settings\">Sciigoj</string>\n    <string name=\"pref_title_notifications_enabled\">Sciigoj</string>\n    <string name=\"pref_title_notification_alerts\">Avertoj</string>\n    <string name=\"pref_title_notification_alert_sound\">Sciigi per sono</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Sciigi per vibro</string>\n    <string name=\"pref_title_notification_alert_light\">Sciigi per lumo</string>\n    <string name=\"pref_title_notification_filters\">Sciigi al mi, kiam</string>\n    <string name=\"pref_title_appearance_settings\">Aspekto</string>\n    <string name=\"pref_title_app_theme\">Temo de la apo</string>\n    <string name=\"pref_title_timelines\">Tempolinioj</string>\n    <string name=\"pref_title_timeline_filters\">Filtriloj</string>\n    <string name=\"app_them_dark\">Malhela</string>\n    <string name=\"app_theme_light\">Hela</string>\n    <string name=\"app_theme_black\">Nigra</string>\n    <string name=\"app_theme_auto\">Aŭtomata laŭ la horo</string>\n    <string name=\"app_theme_system\">Uzi sisteman etoson</string>\n    <string name=\"pref_title_browser_settings\">Retumilo</string>\n    <string name=\"pref_title_custom_tabs\">Uzi la integritan retumilon</string>\n    <string name=\"pref_title_language\">Lingvo</string>\n    <string name=\"pref_title_post_filter\">Filtrado de tempolinioj</string>\n    <string name=\"pref_title_post_tabs\">Langetoj</string>\n    <string name=\"pref_title_show_boosts\">Montri diskonigojn</string>\n    <string name=\"pref_title_show_replies\">Montri la respondojn</string>\n    <string name=\"pref_title_show_media_preview\">Elŝuti antaŭvidojn de aŭdovidaĵoj</string>\n    <string name=\"pref_title_proxy_settings\">Prokurilo</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP-prokurilo</string>\n    <string name=\"pref_title_http_proxy_enable\">Ebligi HTTP-prokurilon</string>\n    <string name=\"pref_title_http_proxy_server\">Adreso de HTTP-prokurilo</string>\n    <string name=\"pref_title_http_proxy_port\">Pordo de HTTP-prokurilo</string>\n    <string name=\"pref_default_post_privacy\">Dekomenca privateco de mesaĝoj</string>\n    <string name=\"pref_default_media_sensitivity\">Ĉiam marki aŭdovidaĵojn kiel tiklajn</string>\n    <string name=\"pref_publishing\">Publikigante (sinkronigita kun la servilo)</string>\n    <string name=\"pref_failed_to_sync\">Sinkronigo de la agordoj malsukcesis</string>\n    <string name=\"post_privacy_public\">Publika</string>\n    <string name=\"post_privacy_unlisted\">Nelistigita</string>\n    <string name=\"post_privacy_followers_only\">Nur por sekvantoj</string>\n    <string name=\"pref_post_text_size\">Grando de teksto de mesaĝoj</string>\n    <string name=\"post_text_size_smallest\">La plej malgranda</string>\n    <string name=\"post_text_size_small\">Malgranda</string>\n    <string name=\"post_text_size_medium\">Meza</string>\n    <string name=\"post_text_size_large\">Granda</string>\n    <string name=\"post_text_size_largest\">La plej granda</string>\n    <string name=\"notification_mention_name\">Novaj mencioj</string>\n    <string name=\"notification_mention_descriptions\">Sciigoj pri novaj mencioj</string>\n    <string name=\"notification_follow_name\">Novaj sekvantoj</string>\n    <string name=\"notification_follow_description\">Sciigoj pri novaj sekvantoj</string>\n    <string name=\"notification_boost_name\">Diskonigoj</string>\n    <string name=\"notification_boost_description\">Sciigoj, kiam viaj mesaĝoj estas diskonigitaj</string>\n    <string name=\"notification_favourite_name\">Stelumoj</string>\n    <string name=\"notification_favourite_description\">Sciigoj, kiam viaj mesaĝoj estas stelumitaj</string>\n    <string name=\"notification_mention_format\">%1$s menciis vin</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s kaj %4$d aliaj</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s kaj %3$s</string>\n    <string name=\"notification_summary_small\">%1$s kaj %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d nova interago</item>\n        <item quantity=\"other\">%1$d novaj interagoj</item>\n    </plurals>\n    <string name=\"description_account_locked\">Ŝlosita konto</string>\n    <string name=\"about_title_activity\">Pri</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_tusky_license\">Tusky estas libera kaj malfermitkoda programo. Ĝi estas publikigita laŭ la permesilo «GNU General Public License Version 3». Vi povas vidi la permesilon ĉi tie: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">Paĝaro de la projekto:\n\\n https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Raportoj de cimoj kaj petoj de funkcioj:\n\\n https://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Profilo de Tusky</string>\n    <string name=\"post_share_content\">Konigi enhavon de la mesaĝo</string>\n    <string name=\"post_share_link\">Konigi ligilon al mesaĝo</string>\n    <string name=\"post_media_images\">Bildoj</string>\n    <string name=\"post_media_video\">Video</string>\n    <string name=\"state_follow_requested\">Sekvado petita</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">post %1$dj</string>\n    <string name=\"abbreviated_in_days\">post %1$dt</string>\n    <string name=\"abbreviated_in_hours\">post %1$dh</string>\n    <string name=\"abbreviated_in_minutes\">post %1$dm</string>\n    <string name=\"abbreviated_in_seconds\">post %1$ds</string>\n    <string name=\"abbreviated_years_ago\">%1$dj</string>\n    <string name=\"abbreviated_days_ago\">%1$dt</string>\n    <string name=\"abbreviated_hours_ago\">%1$dh</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"follows_you\">Sekvas vin</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Ĉiam montri tiklan enhavon</string>\n    <string name=\"title_media\">Aŭdovidaĵoj</string>\n    <string name=\"replying_to\">Respondo al @%1$s</string>\n    <string name=\"load_more_placeholder_text\">ŝarĝi pli</string>\n    <string name=\"pref_title_public_filter_keywords\">Publikaj tempolinioj</string>\n    <string name=\"pref_title_thread_filter_keywords\">Konversacioj</string>\n    <string name=\"filter_addition_title\">Aldoni filtrilon</string>\n    <string name=\"filter_edit_title\">Redakti filtrilon</string>\n    <string name=\"filter_dialog_remove_button\">Forigi</string>\n    <string name=\"filter_dialog_update_button\">Aktualigi</string>\n    <string name=\"filter_add_description\">Frazo filtrota</string>\n    <string name=\"add_account_name\">Aldoni konton</string>\n    <string name=\"add_account_description\">Aldoni novan Mastodon-konton</string>\n    <string name=\"action_lists\">Listoj</string>\n    <string name=\"title_lists\">Listoj</string>\n    <string name=\"error_create_list\">Ne povis krei la liston</string>\n    <string name=\"error_rename_list\">Ne povis ŝanĝi la nomon de la listo</string>\n    <string name=\"error_delete_list\">Ne povis forigi la liston</string>\n    <string name=\"action_create_list\">Krei liston</string>\n    <string name=\"action_rename_list\">Ŝanĝi la nomon de la listo</string>\n    <string name=\"action_delete_list\">Forigi la liston</string>\n    <string name=\"hint_search_people_list\">Serĉi homojn, kiujn vi sekvas</string>\n    <string name=\"action_add_to_list\">Aldoni konton al la listo</string>\n    <string name=\"action_remove_from_list\">Forigi konton el la listo</string>\n    <string name=\"compose_active_account_description\">Afiŝi per konto %1$s</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\"/>\n        <item quantity=\"other\">Priskribi por vide handikapitaj homoj\n\\n(%1$d signoj maksimume)</item>\n    </plurals>\n    <string name=\"action_set_caption\">Redakti apudskribon</string>\n    <string name=\"action_remove\">Forigi</string>\n    <string name=\"lock_account_label\">Ŝlosi konton</string>\n    <string name=\"lock_account_label_description\">Vi devas permane rajtigi sekvantojn</string>\n    <string name=\"compose_save_draft\">Ĉu konservi malneton?</string>\n    <string name=\"send_post_notification_title\">Sendado de la mesaĝo…</string>\n    <string name=\"send_post_notification_error_title\">Eraro dum sendo de la mesaĝo</string>\n    <string name=\"send_post_notification_channel_name\">Sendado de la mesaĝoj</string>\n    <string name=\"send_post_notification_cancel_title\">Sendo nuligita</string>\n    <string name=\"send_post_notification_saved_content\">Kopio de la mesaĝo estis konservita en viaj malnetoj</string>\n    <string name=\"action_compose_shortcut\">Verki</string>\n    <string name=\"error_no_custom_emojis\">Via nodo %1$s ne havas proprajn emoĝiojn</string>\n    <string name=\"emoji_style\">Stilo de emoĝioj</string>\n    <string name=\"system_default\">El la sistemo</string>\n    <string name=\"download_fonts\">Vi unue devos elŝuti ĉi tiun emoĝiaron</string>\n    <string name=\"performing_lookup_title\">Serĉado…</string>\n    <string name=\"expand_collapse_all_posts\">Pligrandigi/malgrandigi ĉiujn mesaĝojn</string>\n    <string name=\"action_open_post\">Malfermi mesaĝon</string>\n    <string name=\"restart_required\">Restartigo necesas</string>\n    <string name=\"restart_emoji\">Vi devos restartigi Tusky por apliki ĉi tiujn ŝanĝojn</string>\n    <string name=\"later\">Poste</string>\n    <string name=\"restart\">Restartigi</string>\n    <string name=\"caption_systememoji\">Dekomenca emoĝiaro de via aparato</string>\n    <string name=\"caption_blobmoji\">La emoĝioj «Blob» konataj de Android 4.4−7.1</string>\n    <string name=\"caption_twemoji\">Norma emoĝiaro de Mastodon</string>\n    <string name=\"download_failed\">Elŝuto malsukcesis</string>\n    <string name=\"profile_badge_bot_text\">Roboto</string>\n    <string name=\"account_moved_description\">%1$s moviĝis al:</string>\n    <string name=\"reblog_private\">Diskonigi al la originala atentaro</string>\n    <string name=\"unreblog_private\">Maldiskonigi</string>\n    <string name=\"license_description\">Tusky enhavas kodon kaj risurcojn el la sekvantaj malfermitkodaj projetkoj:</string>\n    <string name=\"license_apache_2\">Laŭ la permesilo «Apache» (kopio sube)</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">Profilaj metadatumoj</string>\n    <string name=\"profile_metadata_add\">aldoni datumon</string>\n    <string name=\"profile_metadata_label_label\">Etikedo</string>\n    <string name=\"profile_metadata_content_label\">Enhavo</string>\n    <string name=\"pref_title_absolute_time\">Uzi absolutan tempon</string>\n    <string name=\"label_remote_account\">Subaj informoj povas nekomplete prezenti la profilon de la uzanto. Tuŝi por malfermi la kompletan profilon en retumilo.</string>\n    <string name=\"unpin_action\">Depingli</string>\n    <string name=\"pin_action\">Alpingli</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> Stelumo</item>\n        <item quantity=\"other\"><b>%1$s</b> Stelumoj</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> Diskonigo</item>\n        <item quantity=\"other\"><b>%1$s</b> Diskonigoj</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">Diskonigita de</string>\n    <string name=\"title_favourited_by\">Stelumita de</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s kaj %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s kaj %3$d aliaj</string>\n    <string name=\"description_post_media\">Aŭdovidaĵo: %1$s</string>\n    <string name=\"description_post_cw\">Enhava averto: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Neniu priskribo</string>\n    <string name=\"description_post_reblogged\">Diskonigita</string>\n    <string name=\"description_post_favourited\">Stelumita</string>\n    <string name=\"description_visibility_public\">Publika</string>\n    <string name=\"description_visibility_unlisted\">Nelistigita</string>\n    <string name=\"description_visibility_private\">Sekvantoj</string>\n    <string name=\"description_visibility_direct\">Rekta</string>\n    <string name=\"hint_list_name\">Nomo de la listo</string>\n    <string name=\"action_delete_and_redraft\">Forigi kaj reskribi</string>\n    <string name=\"dialog_redraft_post_warning\">Ĉu forigi kaj reskribi ĉi tiun mesaĝon?</string>\n    <string name=\"pref_title_bot_overlay\">Montri indikilon pri robotoj</string>\n    <string name=\"pref_title_animate_gif_avatars\">Ebligi GIF-profilbildojn</string>\n    <string name=\"notification_poll_name\">Enketoj</string>\n    <string name=\"notification_poll_description\">Sciigoj pri enketoj, kiuj finiĝis</string>\n    <string name=\"pick_hashtag_hint\">Kradvorto sen #</string>\n    <string name=\"notifications_clear\">Viŝi</string>\n    <string name=\"notifications_apply_filter\">Filtri</string>\n    <string name=\"filter_apply\">Apliki</string>\n    <string name=\"compose_shortcut_long_label\">Verki mesaĝon</string>\n    <string name=\"compose_shortcut_short_label\">Verki</string>\n    <string name=\"notification_clear_text\">Ĉu vi certas, ke vi volas porĉiame viŝi ĉiujn viajn sciigojn?</string>\n    <string name=\"compose_preview_image_description\">Agoj por bildo %1$s</string>\n    <string name=\"poll_info_format\"> <!-- 15 votes • 1 hour left --> %1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s voĉdono</item>\n        <item quantity=\"other\">%1$s voĉdonoj</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">finiĝos je %1$s</string>\n    <string name=\"poll_info_closed\">finita</string>\n    <string name=\"poll_vote\">Voĉdoni</string>\n    <string name=\"poll_ended_voted\">Enketo, al kiu vi voĉdonis, finiĝis</string>\n    <string name=\"poll_ended_created\">Enketo, kiun vi kreis, finiĝis</string>\n    <string name=\"title_domain_mutes\">Kaŝitaj domajnoj</string>\n    <string name=\"action_view_domain_mutes\">Kaŝitaj domajnoj</string>\n    <string name=\"action_mute_domain\">Silentigi %1$s</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s malsilentigita</string>\n    <string name=\"mute_domain_warning\">Ĉu vi certas ke vi volas tute bloki %1$s? Vi ne vidos enhavon de tiu domajno en publika tempolinio aŭ en viaj sciigoj. Viaj sekvantoj el tiu domajno estos forigitaj.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Kaŝi la tutan domajnon</string>\n    <string name=\"caption_notoemoji\">La aktuala emoĝiaro de Google</string>\n    <string name=\"description_poll\">Balotenketo kun elektoj: %1$s, %2$s, %3$s, %4$s, %5$s</string>\n    <string name=\"button_continue\">Daŭrigi</string>\n    <string name=\"button_back\">Reveni</string>\n    <string name=\"button_done\">Farita</string>\n    <string name=\"report_sent_success\">\\@%1$s sukcese signalita</string>\n    <string name=\"hint_additional_info\">Pliaj komentoj</string>\n    <string name=\"report_remote_instance\">Plusendi al %1$s</string>\n    <string name=\"failed_report\">Signalo malsukcesis</string>\n    <string name=\"failed_fetch_posts\">Venigo de statusoj malsukcesis</string>\n    <string name=\"report_description_1\">La signalo estos sendita al la kontrolantoj de via servilo. Vi povas doni klarigon pri kial vi signalas ĉi tiun konton sube:</string>\n    <string name=\"report_description_remote_instance\">La konto estas en alia servilo. Ĉu sendi sennomigitan kopion de la signalo ankaŭ tien?</string>\n    <string name=\"filter_dialog_whole_word\">Tuta vorto</string>\n    <string name=\"filter_dialog_whole_word_description\">Ŝlosilvorto aŭ frazo litercifera aplikiĝos, nur se ĝi kongruas kun la tuta vorto</string>\n    <string name=\"title_accounts\">Kontoj</string>\n    <string name=\"failed_search\">Serĉo malsukcesis</string>\n    <string name=\"action_add_poll\">Aldoni baloton</string>\n    <string name=\"pref_title_alway_open_spoiler\">Ĉiam montri mesaĝojn kun enhavaj avertoj</string>\n    <string name=\"create_poll_title\">Enketo</string>\n    <string name=\"duration_5_min\">5 minutoj</string>\n    <string name=\"duration_30_min\">30 minutoj</string>\n    <string name=\"duration_1_hour\">1 horo</string>\n    <string name=\"duration_6_hours\">6 horoj</string>\n    <string name=\"duration_1_day\">1 tago</string>\n    <string name=\"duration_3_days\">3 tagoj</string>\n    <string name=\"duration_7_days\">7 tagoj</string>\n    <string name=\"add_poll_choice\">Aldoni elekton</string>\n    <string name=\"poll_allow_multiple_choices\">Multaj elektoj</string>\n    <string name=\"poll_new_choice_hint\">Elekton %1$d</string>\n    <string name=\"edit_poll\">Redakti</string>\n    <string name=\"title_bookmarks\">Legosignoj</string>\n    <string name=\"title_scheduled_posts\">Planitaj mesaĝoj</string>\n    <string name=\"action_bookmark\">Aldoni al la legosignoj</string>\n    <string name=\"action_edit\">Redakti</string>\n    <string name=\"action_view_bookmarks\">Legosignoj</string>\n    <string name=\"action_access_scheduled_posts\">Planitaj mesaĝoj</string>\n    <string name=\"action_schedule_post\">Plani mesaĝon</string>\n    <string name=\"action_reset_schedule\">Restarigi</string>\n    <string name=\"about_powered_by_tusky\">Funkciigita de Tusky</string>\n    <string name=\"description_post_bookmarked\">Aldonita al la legosignoj</string>\n    <string name=\"select_list_title\">Elekti la liston</string>\n    <string name=\"list\">Listo</string>\n    <string name=\"post_lookup_error_format\">Eraro dum serĉo de la mesaĝo %1$s</string>\n    <string name=\"no_drafts\">Vi havas neniun malneton.</string>\n    <string name=\"no_scheduled_posts\">Vi havas neniun planitan mesaĝon.</string>\n    <string name=\"notification_follow_request_name\">Petoj de sekvado</string>\n    <string name=\"hashtags\">Kradvortoj</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s homo</item>\n        <item quantity=\"other\">%1$s homoj</item>\n    </plurals>\n    <string name=\"add_hashtag_title\">Aldoni kradvorton</string>\n    <string name=\"notification_follow_request_description\">Sciigoj pri petoj de sekvado</string>\n    <string name=\"pref_title_gradient_for_media\">Montri buntajn transirojn por kaŝitaj aŭdovidaĵoj</string>\n    <string name=\"dialog_mute_hide_notifications\">Kaŝi la sciigojn</string>\n    <string name=\"dialog_mute_warning\">Ĉu silentigi @%1$s?</string>\n    <string name=\"dialog_block_warning\">Ĉu bloki @%1$s?</string>\n    <string name=\"action_unmute_conversation\">Malsilentigi la konversacion</string>\n    <string name=\"action_mute_conversation\">Silentigi la konversacion</string>\n    <string name=\"action_unmute_domain\">Malsilentigi %1$s</string>\n    <string name=\"action_unmute_desc\">Malsilentigi %1$s</string>\n    <string name=\"notification_follow_request_format\">%1$s petis sekvi vin</string>\n    <string name=\"title_announcements\">Anoncoj</string>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d minuto restas</item>\n        <item quantity=\"other\">%1$d minutoj restas</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d sekundo restas</item>\n        <item quantity=\"other\">%1$d sekundoj restas</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d horo restas</item>\n        <item quantity=\"other\">%1$d horoj restas</item>\n    </plurals>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d tago restas</item>\n        <item quantity=\"other\">%1$d tagoj restas</item>\n    </plurals>\n    <string name=\"pref_main_nav_position\">Pozicio de la ĉefa naviga breto</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Malsupro</string>\n    <string name=\"pref_main_nav_position_option_top\">Supro</string>\n    <string name=\"account_note_saved\">Konservita!</string>\n    <string name=\"account_note_hint\">Via privata noto pri ĉi tiu konto</string>\n    <string name=\"pref_title_hide_top_toolbar\">Kaŝi la titolon de la supra ilobreto</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Montri antaŭvidojn de ligiloj en tempolinioj</string>\n    <string name=\"pref_title_confirm_reblogs\">Montri konfirman fenestron antaŭ ol diskonigi</string>\n    <string name=\"no_announcements\">Estas neniu anonco.</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Ebligi ŝovumadon por ŝanĝi inter la langetoj</string>\n    <string name=\"warning_scheduling_interval\">Mastodon havas minimuman intervalon de planado de 5 minutoj.</string>\n    <string name=\"post_media_attachments\">Kunsendaĵoj</string>\n    <string name=\"dialog_delete_list_warning\">Ĉu vi vere volas forigi la liston %1$s?</string>\n    <string name=\"post_media_audio\">Aŭdaĵo</string>\n    <string name=\"action_subscribe_account\">Aboni</string>\n    <string name=\"draft_deleted\">Malneto forigita</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Vi ne povas elŝuti pli ol %1$d aŭdovida kunsendaĵo.</item>\n        <item quantity=\"other\">Vi ne povas elŝuti pli ol %1$d aŭdovidaj kunsendaĵoj.</item>\n    </plurals>\n    <string name=\"label_duration\">Daŭro</string>\n    <string name=\"duration_indefinite\">Nedefinita</string>\n    <string name=\"action_unsubscribe_account\">Malaboni</string>\n    <string name=\"notification_subscription_name\">Novaj mesaĝoj</string>\n    <string name=\"action_unbookmark\">Forigi la legosignon</string>\n    <string name=\"dialog_delete_conversation_warning\">Ĉu forigi ĉi tiun konversacion?</string>\n    <string name=\"pref_title_animate_custom_emojis\">Animacii proprajn emoĝiojn</string>\n    <string name=\"wellbeing_hide_stats_profile\">Kaŝi kvantecajn statistikaĵojn pri la profiloj</string>\n    <string name=\"action_delete_conversation\">Forigi konversacion</string>\n    <string name=\"notification_subscription_format\">%1$s ĵus afiŝis</string>\n    <string name=\"notification_subscription_description\">Sciigoj, kiam iu, kiun vi sekvas, afiŝis novan mesaĝon</string>\n    <string name=\"drafts_post_failed_to_send\">Sendo de ĉi tiu mesaĝo malsukcesis!</string>\n    <string name=\"wellbeing_hide_stats_posts\">Kaŝi kvantecajn statistikaĵojn pri la mesaĝoj</string>\n    <string name=\"pref_title_confirm_favourites\">Demandi konfirmon antaŭ ol stelumi</string>\n    <string name=\"pref_title_wellbeing_mode\">Bonstato</string>\n    <string name=\"drafts_failed_loading_reply\">Ŝarĝado de respondaj informoj malsukcesis</string>\n    <string name=\"wellbeing_mode_notice\">Kelkaj informoj kiuj povas afekci vian mensan bonstaton estos kaŝitaj. Ĉi tiuj inkluzivas:\n\\n\n\\n — Sciigoj pri stelumo/diskonigo/sekvado\n\\n — Nombro de stelumoj/diskonigoj sur la mesaĝoj\n\\n — Statistikoj pri mesaĝoj/sekvantoj sur la profiloj\n\\n\n\\n Sciigoj ne estos influitaj, sed vi povas kontroli viajn agordojn pri sciigojn permane.</string>\n    <string name=\"review_notifications\">Kontroli la sciigojn</string>\n    <string name=\"limit_notifications\">Limigi sciigojn pri tempolinio</string>\n    <string name=\"drafts_post_reply_removed\">La mesaĝo, al kiu tiu ĉi malneto respondas, estis forigita</string>\n    <string name=\"notification_sign_up_format\">%1$s registriĝis</string>\n    <string name=\"notification_sign_up_name\">Novaj kontoj</string>\n    <string name=\"notification_sign_up_description\">Sciigoj pri novaj uzantoj</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"follow_requests_info\">Kvankam via konto ne estas ŝlosita, la teamo de %1$s pensas, ke vi eble volus permane validigi la sekvopetojn de tiuj ĉi kontoj.</string>\n    <string name=\"error_multimedia_size_limit\">Filmetoj kaj sondosieroj ne povas esti pli grandaj ol %1$s MB.</string>\n    <string name=\"error_image_edit_failed\">La bildo ne povis esti redaktita.</string>\n    <string name=\"title_login\">Ensaluti</string>\n    <string name=\"error_following_hashtag_format\">Okazis eraro dum la sekvado de #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Okazos eraro dum la malsekvado de #%1$s</string>\n    <string name=\"notification_update_format\">%1$s redaktis sian mesaĝon</string>\n    <string name=\"action_dismiss\">Fermi</string>\n    <string name=\"action_details\">Detaloj</string>\n    <string name=\"notification_update_name\">Redaktitaj mesaĝoj</string>\n    <string name=\"notification_update_description\">Sciigoj, kiam mesaĝoj, kun kiuj vi interagis, estas redaktitaj</string>\n    <string name=\"action_edit_image\">Redakti la bildon</string>\n    <string name=\"duration_14_days\">14 tagoj</string>\n    <string name=\"duration_30_days\">30 tagoj</string>\n    <string name=\"duration_60_days\">60 tagoj</string>\n    <string name=\"duration_90_days\">90 tagoj</string>\n    <string name=\"duration_180_days\">180 tagoj</string>\n    <string name=\"duration_365_days\">365 tagoj</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Ekverki mesaĝon</string>\n    <string name=\"account_date_joined\">Aliĝis je %1$s</string>\n    <string name=\"saving_draft\">Konservado de la malneto…</string>\n    <string name=\"error_could_not_load_login_page\">La salutpaĝo ne povis esti ŝargita.</string>\n    <string name=\"error_loading_account_details\">Ŝargo de detaloj pri la konto malsukcesis</string>\n    <string name=\"delete_scheduled_post_warning\">Ĉu forigi tiun planitan mesaĝon?</string>\n    <string name=\"instance_rule_info\">Si vi ensalutas, vi konsentas je la regulo de %1$s.</string>\n    <string name=\"instance_rule_title\">Regulo de %1$s</string>\n    <string name=\"duration_no_change\">(Neniu ŝanĝo)</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"pref_show_self_username_always\">Ĉiam</string>\n    <string name=\"pref_show_self_username_disambiguate\">Kiam vi uzas plurajn kontojn</string>\n    <string name=\"pref_show_self_username_never\">Neniam</string>\n    <string name=\"pref_title_show_self_username\">Montri uzantnomon en ilobreto</string>\n    <string name=\"description_post_language\">Mesaĝolingvo</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-es/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">Ha ocurrido un error.</string>\n    <string name=\"error_network\">Se ha producido un error de red. Por favor, comprueba tu conexión e inténtalo de nuevo.</string>\n    <string name=\"error_empty\">Este campo no puede estar vacío.</string>\n    <string name=\"error_invalid_domain\">Nombre de dominio incorrecto</string>\n    <string name=\"error_failed_app_registration\">Fallo de autenticación con esta instancia. Si esto persiste, prueba en el menú Iniciar sesión con el navegador.</string>\n    <string name=\"error_no_web_browser_found\">No se ha encontrado ningún navegador web.</string>\n    <string name=\"error_authorization_unknown\">Ocurrió un error de autorización no identificado. Si esto persiste, prueba en el menú Iniciar sesión con el navegador.</string>\n    <string name=\"error_authorization_denied\">La autorización falló. Si estás seguro de que has suministrado las credenciales correctas, prueba en el menú Iniciar sesión con el navegador.</string>\n    <string name=\"error_retrieving_oauth_token\">Fallo al obtener identificador de login. Si esto persiste, prueba en el menú Iniciar sesión con el navegador.</string>\n    <string name=\"error_compose_character_limit\">¡La publicación es demasiado larga!</string>\n    <string name=\"error_media_upload_type\">No se admite este tipo de archivo.</string>\n    <string name=\"error_media_upload_opening\">No pudo abrirse el fichero.</string>\n    <string name=\"error_media_upload_permission\">Se requiere permiso para acceder al almacenamiento.</string>\n    <string name=\"error_media_download_permission\">Se requiere permiso para descargar al almacenamiento.</string>\n    <string name=\"error_media_upload_image_or_video\">No se pueden adjuntar imágenes y vídeos en la misma publicación.</string>\n    <string name=\"error_media_upload_sending\">La subida falló.</string>\n    <string name=\"error_sender_account_gone\">Error al publicar.</string>\n    <string name=\"title_home\">Inicio</string>\n    <string name=\"title_notifications\">Notificaciones</string>\n    <string name=\"title_public_local\">Local</string>\n    <string name=\"title_public_federated\">Federada</string>\n    <string name=\"title_direct_messages\">Mensajes directos</string>\n    <string name=\"title_tab_preferences\">Pestañas</string>\n    <string name=\"title_view_thread\">Hilo</string>\n    <string name=\"title_posts\">Estados</string>\n    <string name=\"title_posts_with_replies\">Con respuestas</string>\n    <string name=\"title_posts_pinned\">Fijado</string>\n    <string name=\"title_follows\">Siguiendo</string>\n    <string name=\"title_followers\">Seguidores</string>\n    <string name=\"title_favourites\">Favoritos</string>\n    <string name=\"title_mutes\">Silenciados</string>\n    <string name=\"title_blocks\">Bloqueados</string>\n    <string name=\"title_follow_requests\">Solicitudes</string>\n    <string name=\"title_edit_profile\">Editar tu perfil</string>\n    <string name=\"title_drafts\">Borradores</string>\n    <string name=\"title_licenses\">Licencias</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s compartió</string>\n    <string name=\"post_sensitive_media_title\">Contenido sensible</string>\n    <string name=\"post_media_hidden_title\">Material oculto</string>\n    <string name=\"post_sensitive_media_directions\">Pulsa para ver</string>\n    <string name=\"post_content_warning_show_more\">Mostrar más</string>\n    <string name=\"post_content_warning_show_less\">Mostrar menos</string>\n    <string name=\"post_content_show_more\">Expandir</string>\n    <string name=\"post_content_show_less\">Ocultar</string>\n    <string name=\"message_empty\">Nada por aquí.</string>\n    <string name=\"footer_empty\">Nada por aquí. ¡Arrastra hacia abajo para recargar!</string>\n    <string name=\"notification_reblog_format\">%1$s impulsó tu publicación</string>\n    <string name=\"notification_favourite_format\">%1$s marcó como favorita tu publicación</string>\n    <string name=\"notification_follow_format\">%1$s te siguió</string>\n    <string name=\"report_username_format\">Reportar @%1$s</string>\n    <string name=\"report_comment_hint\">¿Información adicional?</string>\n    <string name=\"action_quick_reply\">Respuesta rápida</string>\n    <string name=\"action_reply\">Responder</string>\n    <string name=\"action_reblog\">Compartir</string>\n    <string name=\"action_favourite\">Favorito</string>\n    <string name=\"action_more\">Más</string>\n    <string name=\"action_compose\">Redactar</string>\n    <string name=\"action_login\">Iniciar sesión con Tusky</string>\n    <string name=\"action_logout\">Cerrar sesión</string>\n    <string name=\"action_logout_confirm\">¿Seguro que quiere cerrar la sesión de %1$s? Se borrarán todos los datos almacenados localmente, borradores y preferencias incluidos.</string>\n    <string name=\"action_follow\">Seguir</string>\n    <string name=\"action_unfollow\">Dejar de seguir</string>\n    <string name=\"action_block\">Bloquear</string>\n    <string name=\"action_unblock\">Desbloquear</string>\n    <string name=\"action_hide_reblogs\">Ocultar impulsos</string>\n    <string name=\"action_show_reblogs\">Mostrar impulsos</string>\n    <string name=\"action_report\">Reportar</string>\n    <string name=\"action_delete\">Borrar</string>\n    <string name=\"action_send\">TOOT</string>\n    <string name=\"action_send_public\">¡Publicar!</string>\n    <string name=\"action_retry\">Reintentar</string>\n    <string name=\"action_close\">Cerrar</string>\n    <string name=\"action_view_profile\">Perfil</string>\n    <string name=\"action_view_preferences\">Ajustes</string>\n    <string name=\"action_view_account_preferences\">Preferencias de cuenta</string>\n    <string name=\"action_view_favourites\">Favoritos</string>\n    <string name=\"action_view_mutes\">Silenciados</string>\n    <string name=\"action_view_blocks\">Bloqueados</string>\n    <string name=\"action_view_follow_requests\">Solicitudes</string>\n    <string name=\"action_view_media\">Multimedia</string>\n    <string name=\"action_open_in_web\">Abrir en el navegador</string>\n    <string name=\"action_add_media\">Añadir multimedia</string>\n    <string name=\"action_photo_take\">Tomar foto</string>\n    <string name=\"action_share\">Compartir</string>\n    <string name=\"action_mute\">Silenciar</string>\n    <string name=\"action_unmute\">Dejar de silenciar</string>\n    <string name=\"action_mention\">Mencionar</string>\n    <string name=\"action_hide_media\">Ocultar multimedia</string>\n    <string name=\"action_open_drawer\">Abrir menu</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_edit_profile\">Editar perfil</string>\n    <string name=\"action_edit_own_profile\">Editar</string>\n    <string name=\"action_undo\">Deshacer</string>\n    <string name=\"action_accept\">Aceptar</string>\n    <string name=\"action_reject\">Rechazar</string>\n    <string name=\"action_search\">Buscar</string>\n    <string name=\"action_access_drafts\">Borradores</string>\n    <string name=\"action_toggle_visibility\">Visibilidad de la publicación</string>\n    <string name=\"action_content_warning\">Aviso de contenido</string>\n    <string name=\"action_emoji_keyboard\">Teclado de emojis</string>\n    <string name=\"action_add_tab\">Añadir pestaña</string>\n    <string name=\"download_image\">Descargando %1$s</string>\n    <string name=\"action_copy_link\">Copiar el enlace</string>\n    <string name=\"action_open_as\">Abrir como %1$s</string>\n    <string name=\"action_share_as\">Compartir como…</string>\n    <string name=\"send_post_link_to\">Compartir URL…</string>\n    <string name=\"send_post_content_to\">Compartir publicación…</string>\n    <string name=\"send_media_to\">Compartir medios a…</string>\n    <string name=\"confirmation_reported\">¡Enviado!</string>\n    <string name=\"confirmation_unblocked\">El usuario ya no está bloqueado</string>\n    <string name=\"confirmation_unmuted\">El usuario ya no está silenciado</string>\n    <string name=\"hint_domain\">¿Qué instancia?</string>\n    <string name=\"hint_compose\">¿En qué estás pensando?</string>\n    <string name=\"hint_content_warning\">Aviso de contenido</string>\n    <string name=\"hint_display_name\">Nombre</string>\n    <string name=\"hint_note\">Biografía</string>\n    <string name=\"hint_search\">Buscar…</string>\n    <string name=\"search_no_results\">Sin resultados</string>\n    <string name=\"label_quick_reply\">Respuesta…</string>\n    <string name=\"label_avatar\">Avatar</string>\n    <string name=\"label_header\">Encabezado</string>\n    <string name=\"link_whats_an_instance\">¿Qué es una instancia?</string>\n    <string name=\"login_connection\">Conectando…</string>\n    <string name=\"dialog_whats_an_instance\">Introduzca aquí la dirección o el dominio de cualquier instancia, por ejemplo, mastodon.social, icosahedron.website, social.tchncs.de, ¡y <a href=\"https://instances.social\">más!</a> \n\\n \n\\nSi todavía no tiene una cuenta, puede indicar el nombre de la instancia a la que quiere unirse y crear una cuenta allí. \n\\n \n\\nUna instancia es el lugar donde su cuenta está alojada, pero puede comunicarse y seguir usuarios de otras instancias como si estuvieran en la misma. \n\\n \n\\nPuede consultar más información en <a href=\"https://joinmastodon.org/es\">joinmastodon.org</a>.</string>\n    <string name=\"dialog_title_finishing_media_upload\">Terminando de subir multimedia</string>\n    <string name=\"dialog_message_uploading_media\">Subiendo…</string>\n    <string name=\"dialog_download_image\">Descargar</string>\n    <string name=\"dialog_message_cancel_follow_request\">¿Cancelar petición de amistad?</string>\n    <string name=\"dialog_unfollow_warning\">¿Dejar de seguir esta cuenta?</string>\n    <string name=\"dialog_delete_post_warning\">¿Eliminar este toot?</string>\n    <string name=\"visibility_public\">Público: Mostrar en cronologías públicas</string>\n    <string name=\"visibility_unlisted\">Oculto: No mostrar en cronologías públicas</string>\n    <string name=\"visibility_private\">Privado: Sólo visible para seguidores</string>\n    <string name=\"visibility_direct\">Directo: Sólo visible para cuentas mencionadas</string>\n    <string name=\"pref_title_edit_notification_settings\">Notificaciones</string>\n    <string name=\"pref_title_notifications_enabled\">Editar notificaciones</string>\n    <string name=\"pref_title_notification_alerts\">Alertas</string>\n    <string name=\"pref_title_notification_alert_sound\">Notificar con sonido</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Notificar con vibración</string>\n    <string name=\"pref_title_notification_alert_light\">Notificar con led</string>\n    <string name=\"pref_title_notification_filters\">Tipos de notificación habilitados</string>\n    <string name=\"pref_title_appearance_settings\">Apariencia</string>\n    <string name=\"pref_title_app_theme\">Tema de la app</string>\n    <string name=\"pref_title_timelines\">Cronología</string>\n    <string name=\"app_them_dark\">Oscuro</string>\n    <string name=\"app_theme_light\">Claro</string>\n    <string name=\"app_theme_black\">Negro</string>\n    <string name=\"app_theme_auto\">Automático</string>\n    <string name=\"pref_title_browser_settings\">Navegador</string>\n    <string name=\"pref_title_custom_tabs\">Usar Chrome Custom Tabs</string>\n    <string name=\"pref_title_post_filter\">Filtros de cronología</string>\n    <string name=\"pref_title_post_tabs\">Cronología de inicio</string>\n    <string name=\"pref_title_show_boosts\">Mostrar impulsos</string>\n    <string name=\"pref_title_show_replies\">Mostrar respuestas</string>\n    <string name=\"pref_title_show_media_preview\">Previsualizar multimedia</string>\n    <string name=\"pref_title_proxy_settings\">Proxy</string>\n    <string name=\"pref_title_http_proxy_settings\">Proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_enable\">Habilitar proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_server\">Servidor del proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_port\">Puerto del proxy HTTP</string>\n    <string name=\"pref_default_post_privacy\">Visibilidad de la publicación (sincronizada con el servidor)</string>\n    <string name=\"pref_default_media_sensitivity\">Marcar contenido como sensible siempre (sincronizado con el servidor)</string>\n    <string name=\"pref_publishing\">Opciones por defecto para mensajes</string>\n    <string name=\"pref_failed_to_sync\">Error al sincronizar las preferencias</string>\n    <string name=\"post_privacy_public\">Público</string>\n    <string name=\"post_privacy_unlisted\">Oculto</string>\n    <string name=\"post_privacy_followers_only\">Privado</string>\n    <string name=\"pref_post_text_size\">Tamaño del texto</string>\n    <string name=\"post_text_size_smallest\">Diminuto</string>\n    <string name=\"post_text_size_small\">Pequeño</string>\n    <string name=\"post_text_size_medium\">Mediano</string>\n    <string name=\"post_text_size_large\">Grande</string>\n    <string name=\"post_text_size_largest\">Enorme</string>\n    <string name=\"notification_mention_name\">Nuevas menciones</string>\n    <string name=\"notification_mention_descriptions\">Notificaciones de nuevas menciones</string>\n    <string name=\"notification_follow_name\">Nuevos seguidores</string>\n    <string name=\"notification_follow_description\">Notificaciones de nuevos seguidores</string>\n    <string name=\"notification_boost_name\">Impulsos</string>\n    <string name=\"notification_boost_description\">Notificaciones cuando impulsan tus publicaciones</string>\n    <string name=\"notification_favourite_name\">Favoritos</string>\n    <string name=\"notification_favourite_description\">Notificaciones de tus estados marcados como favoritos</string>\n    <string name=\"notification_mention_format\">%1$s te mencionó</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s y %4$d otros</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s y %3$s</string>\n    <string name=\"notification_summary_small\">%1$s y %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d nueva interacción</item>\n        <item quantity=\"many\">%1$d nuevas interacciones</item>\n        <item quantity=\"other\">%1$d nuevas interacciones</item>\n    </plurals>\n    <string name=\"description_account_locked\">Cuenta protegida</string>\n    <string name=\"about_title_activity\">Acerca de</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_tusky_license\">Tusky es un software libre y de código abierto. Está licenciado bajo la licencia \\\"GNU General Public License Version 3\\\". Puedes leer sobre la misma en: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">Web del proyecto: https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Reporte de errores y peticiones de características:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Perfil de Tusky</string>\n    <string name=\"post_share_content\">Compartir contenido</string>\n    <string name=\"post_share_link\">Compartir enlace</string>\n    <string name=\"post_media_images\">Imágenes</string>\n    <string name=\"post_media_video\">Video</string>\n    <string name=\"state_follow_requested\">Solicitud enviada</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"status_created_at_now\">Ahora</string>\n    <string name=\"abbreviated_in_years\">en %1$d años</string>\n    <string name=\"abbreviated_in_days\">en %1$d días</string>\n    <string name=\"abbreviated_in_hours\">en %1$d horas</string>\n    <string name=\"abbreviated_in_minutes\">en %1$d min.</string>\n    <string name=\"abbreviated_in_seconds\">en %1$d seg.</string>\n    <string name=\"abbreviated_years_ago\">%1$d años</string>\n    <string name=\"abbreviated_days_ago\">%1$d días</string>\n    <string name=\"abbreviated_hours_ago\">%1$d horas</string>\n    <string name=\"abbreviated_minutes_ago\">%1$d min.</string>\n    <string name=\"abbreviated_seconds_ago\">%1$d seg.</string>\n    <string name=\"follows_you\">Te sigue</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Mostrar contenido NSFW</string>\n    <string name=\"title_media\">Multimedia</string>\n    <string name=\"replying_to\">Respondiendo a @%1$s</string>\n    <string name=\"load_more_placeholder_text\">Cargar más</string>\n    <string name=\"add_account_name\">Añadir cuenta</string>\n    <string name=\"add_account_description\">Añadir cuenta de Mastodon</string>\n    <string name=\"action_lists\">Listas</string>\n    <string name=\"title_lists\">Listas</string>\n    <string name=\"compose_active_account_description\">Publicar como %1$s</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Descripción para personas con problemas de visión (límite de %1$d caracteres)</item>\n        <item quantity=\"many\">Descripción para personas con problemas de visión (límite de %1$d caracteres)</item>\n        <item quantity=\"other\">Descripción para personas con problemas de visión (límite de %1$d caracteres)</item>\n    </plurals>\n    <string name=\"action_set_caption\">Añadir leyenda</string>\n    <string name=\"action_remove\">Eliminar</string>\n    <string name=\"lock_account_label\">Proteger cuenta</string>\n    <string name=\"lock_account_label_description\">Tendrás que admitir los seguidores manualmente</string>\n    <string name=\"compose_save_draft\">¿Guardar borrador?</string>\n    <string name=\"send_post_notification_title\">Enviando estado…</string>\n    <string name=\"send_post_notification_error_title\">Error al enviar el estado</string>\n    <string name=\"send_post_notification_channel_name\">Enviando estados</string>\n    <string name=\"send_post_notification_cancel_title\">Envío cancelado</string>\n    <string name=\"send_post_notification_saved_content\">Una copia del estado se ha guardado en borradores</string>\n    <string name=\"action_compose_shortcut\">Redactar</string>\n    <string name=\"error_no_custom_emojis\">Tu instancia %1$s no ofrece emojis personalizados</string>\n    <string name=\"emoji_style\">Estilo de los emojis</string>\n    <string name=\"system_default\">Sistema</string>\n    <string name=\"download_fonts\">Tendrás que descargarlos primero</string>\n    <string name=\"performing_lookup_title\">Buscando…</string>\n    <string name=\"expand_collapse_all_posts\">Expandir/ocultar todos los estados</string>\n    <string name=\"action_open_post\">Abrir</string>\n    <string name=\"restart_required\">Reinicio requerido</string>\n    <string name=\"restart_emoji\">Tendrás que reiniciar la aplicación para aplicar estos cambios</string>\n    <string name=\"later\">Más tarde</string>\n    <string name=\"restart\">Reiniciar</string>\n    <string name=\"caption_systememoji\">Paquete de emojis predeterminado de su dispositivo</string>\n    <string name=\"caption_blobmoji\">Los emojis de Android 4.4 a 7.1</string>\n    <string name=\"caption_twemoji\">Paquete estándar de emojis de Mastodon</string>\n    <string name=\"download_failed\">Descarga fallida</string>\n    <string name=\"profile_badge_bot_text\">Bot</string>\n    <string name=\"account_moved_description\">%1$s se trasladó a:</string>\n    <string name=\"reblog_private\">Volver a compartir</string>\n    <string name=\"unreblog_private\">Dejar de compartir</string>\n    <string name=\"license_description\">Tusky contiene código y recursos de los siguientes proyectos:</string>\n    <string name=\"license_apache_2\">Licenciado bajo Apache License (texto bajo la lista)</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">Información adicional</string>\n    <string name=\"profile_metadata_add\">añadir campo</string>\n    <string name=\"profile_metadata_label_label\">Etiqueta</string>\n    <string name=\"profile_metadata_content_label\">Contenido</string>\n    <string name=\"pref_title_absolute_time\">Usar tiempo absoluto</string>\n    <string name=\"label_remote_account\">La información de abajo puede mostrar el perfil del usuario incompleto. Pulse para abrir el perfil completo en el navegador.</string>\n    <string name=\"unpin_action\">No fijar</string>\n    <string name=\"pin_action\">Fijar</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> Favorito</item>\n        <item quantity=\"many\"><b>%1$s</b> Favoritos</item>\n        <item quantity=\"other\"><b>%1$s</b> Favoritos</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> Impulso</item>\n        <item quantity=\"many\"><b>%1$s</b> Impulsos</item>\n        <item quantity=\"other\"><b>%1$s</b> Impulsos</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">Impulsado por</string>\n    <string name=\"title_favourited_by\">Marcado como favorito por</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s y %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s y %3$d más</string>\n    <string name=\"action_mentions\">Menciones</string>\n    <string name=\"action_open_faved_by\">Mostrar favoritos</string>\n    <string name=\"title_mentions_dialog\">Menciones</string>\n    <string name=\"download_media\">Descargar multimedia</string>\n    <string name=\"app_theme_system\">Usar tema del sistema</string>\n    <string name=\"pref_title_language\">Idioma</string>\n    <string name=\"action_unreblog\">Dejar de impulsar</string>\n    <string name=\"action_unfavourite\">Eliminar favorito</string>\n    <string name=\"pref_title_timeline_filters\">Filtros</string>\n    <string name=\"notification_poll_name\">Resultados</string>\n    <string name=\"filter_dialog_remove_button\">Eliminar</string>\n    <string name=\"action_create_list\">Crear lista</string>\n    <string name=\"action_rename_list\">Renombrar lista</string>\n    <string name=\"action_add_to_list\">Añadir cuenta a la lista</string>\n    <string name=\"action_remove_from_list\">Eliminar cuenta de la lista</string>\n    <string name=\"description_post_favourited\">Marcado como favorito</string>\n    <string name=\"description_visibility_private\">Seguidores</string>\n    <string name=\"filter_apply\">Aplicar</string>\n    <string name=\"pref_title_bot_overlay\">Mostrar indicador de bots</string>\n    <string name=\"poll_vote\">Votar</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d día restante</item>\n        <item quantity=\"many\">%1$d días restantes</item>\n        <item quantity=\"other\">%1$d días restantes</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d hora restante</item>\n        <item quantity=\"many\">%1$d horas restantes</item>\n        <item quantity=\"other\">%1$d horas restantes</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d minuto restante</item>\n        <item quantity=\"many\">%1$d minutos restantes</item>\n        <item quantity=\"other\">%1$d minutos restantes</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d segundo restante</item>\n        <item quantity=\"many\">%1$d segundos restantes</item>\n        <item quantity=\"other\">%1$d segundos restantes</item>\n    </plurals>\n    <string name=\"poll_info_format\"> \\u0020<!-- 15 votos • queda 1 hora --> \\u0020%1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s voto</item>\n        <item quantity=\"many\">%1$s votos</item>\n        <item quantity=\"other\">%1$s votos</item>\n    </plurals>\n    <string name=\"poll_info_closed\">cerrada</string>\n    <string name=\"action_delete_and_redraft\">Eliminar y editar</string>\n    <string name=\"action_links\">Enlaces</string>\n    <string name=\"action_hashtags\">Etiquetas</string>\n    <string name=\"title_hashtags_dialog\">Etiquetas</string>\n    <string name=\"title_links_dialog\">Enlaces</string>\n    <string name=\"action_open_media_n\">Abrir contenido #%1$d</string>\n    <string name=\"downloading_media\">Descargando contenido</string>\n    <string name=\"dialog_redraft_post_warning\">¿Eliminar y devolver a borradores este toot?</string>\n    <string name=\"notification_poll_description\">Notificaciones sobre encuestas que han terminado</string>\n    <string name=\"pref_title_public_filter_keywords\">Cronologías públicas</string>\n    <string name=\"pref_title_thread_filter_keywords\">Conversaciones</string>\n    <string name=\"filter_addition_title\">Añadir filtro</string>\n    <string name=\"filter_edit_title\">Editar filtro</string>\n    <string name=\"filter_dialog_update_button\">Actualizar</string>\n    <string name=\"filter_add_description\">Frase para filtrar</string>\n    <string name=\"error_create_list\">No se pudo crear la lista</string>\n    <string name=\"error_rename_list\">No se pudo actualizar la lista</string>\n    <string name=\"error_delete_list\">No se pudo eliminar la lista</string>\n    <string name=\"action_delete_list\">Eliminar lista</string>\n    <string name=\"hint_search_people_list\">Buscar personas que sigues</string>\n    <string name=\"description_post_media\">Contenido: %1$s</string>\n    <string name=\"description_post_cw\">Aviso de contenido: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Sin descripción</string>\n    <string name=\"description_post_reblogged\">Compartido</string>\n    <string name=\"description_visibility_public\">Público</string>\n    <string name=\"description_visibility_unlisted\">Sin listar</string>\n    <string name=\"description_visibility_direct\">Directo</string>\n    <string name=\"hint_list_name\">Nombre de la lista</string>\n    <string name=\"pick_hashtag_hint\">Etiqueta sin #</string>\n    <string name=\"notifications_clear\">Limpiar</string>\n    <string name=\"notifications_apply_filter\">Filtro</string>\n    <string name=\"compose_shortcut_long_label\">Escribir publicación</string>\n    <string name=\"compose_shortcut_short_label\">Redactar</string>\n    <string name=\"notification_clear_text\">¿Estás seguro de que quieres eliminar permanentemente todas tus notificaciones?</string>\n    <string name=\"compose_preview_image_description\">Acciones para la imagen %1$s</string>\n    <string name=\"poll_info_time_absolute\">termina en %1$s</string>\n    <string name=\"poll_ended_voted\">Una encuesta en la que has votado ha terminado</string>\n    <string name=\"poll_ended_created\">Una encuesta que has creado ha terminado</string>\n    <string name=\"action_open_reblogger\">Abrir autor del impulso</string>\n    <string name=\"action_open_reblogged_by\">Mostrar compartidos</string>\n    <string name=\"title_domain_mutes\">Dominios ocultos</string>\n    <string name=\"action_view_domain_mutes\">Dominios ocultos</string>\n    <string name=\"action_mute_domain\">Silenciar a %1$s</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s visible</string>\n    <string name=\"mute_domain_warning\">¿Estás seguro de que quieres bloquear todo sobre %1$s? No verás contenido de ese dominio ni en la cronología ni en tus notificaciones. Tus seguidores de ese dominio serán eliminados.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Ocultar dominio completo</string>\n    <string name=\"pref_title_animate_gif_avatars\">Animar avatares GIF</string>\n    <string name=\"filter_dialog_whole_word\">Toda palabra</string>\n    <string name=\"filter_dialog_whole_word_description\">Cuando la palabra o frase sea solo alfanumérica, solo se aplicará si coincide con toda la palabra</string>\n    <string name=\"caption_notoemoji\">Paquete actual de emojis de Google</string>\n    <string name=\"description_poll\">Encuesta con opciones: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"button_continue\">Continuar</string>\n    <string name=\"button_back\">Atrás</string>\n    <string name=\"button_done\">Hecho</string>\n    <string name=\"report_sent_success\">\\@%1$s reportado satisfactoriamente</string>\n    <string name=\"hint_additional_info\">Comentarios adicionales</string>\n    <string name=\"report_remote_instance\">Reenviar a %1$s</string>\n    <string name=\"failed_report\">Reporte fallido</string>\n    <string name=\"failed_fetch_posts\">Fallo al obtener estados</string>\n    <string name=\"report_description_1\">El reporte será enviado a los moderadores de tu servidor. Puedes añadir una explicación de por qué estás reportando esta cuenta a continuación:</string>\n    <string name=\"report_description_remote_instance\">La cuenta es de otro servidor. ¿Enviar una copia anónima del reporte?</string>\n    <string name=\"pref_title_alway_open_spoiler\">Mostrar siempre publicaciones marcadas con avisos de contenido</string>\n    <string name=\"title_accounts\">Cuentas</string>\n    <string name=\"failed_search\">Error al buscar</string>\n    <string name=\"action_add_poll\">Añadir encuesta</string>\n    <string name=\"create_poll_title\">Encuesta</string>\n    <string name=\"duration_5_min\">5 minutos</string>\n    <string name=\"duration_30_min\">30 minutos</string>\n    <string name=\"duration_1_hour\">1 hora</string>\n    <string name=\"duration_6_hours\">6 horas</string>\n    <string name=\"duration_1_day\">1 día</string>\n    <string name=\"duration_3_days\">3 días</string>\n    <string name=\"duration_7_days\">7 días</string>\n    <string name=\"add_poll_choice\">Añadir opción</string>\n    <string name=\"poll_allow_multiple_choices\">Opciones múltiples</string>\n    <string name=\"poll_new_choice_hint\">Opción %1$d</string>\n    <string name=\"edit_poll\">Editar</string>\n    <string name=\"title_scheduled_posts\">Estados programados</string>\n    <string name=\"action_edit\">Editar</string>\n    <string name=\"action_access_scheduled_posts\">Estados programados</string>\n    <string name=\"action_schedule_post\">Programar estado</string>\n    <string name=\"action_reset_schedule\">Reiniciar</string>\n    <string name=\"post_lookup_error_format\">Error al buscar el post %1$s</string>\n    <string name=\"about_powered_by_tusky\">Potenciado por Tusky</string>\n    <string name=\"title_bookmarks\">Marcadores</string>\n    <string name=\"action_bookmark\">Marcador</string>\n    <string name=\"action_view_bookmarks\">Marcadores</string>\n    <string name=\"description_post_bookmarked\">Añadido a publicaciones guardadas</string>\n    <string name=\"select_list_title\">Seleccionar lista</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"no_drafts\">No tienes ningún borrador.</string>\n    <string name=\"no_scheduled_posts\">No tienes ningún estado programado.</string>\n    <string name=\"warning_scheduling_interval\">Mastodon tiene un intervalo de programación mínimo de 5 minutos.</string>\n    <string name=\"notification_follow_request_name\">Solicitudes</string>\n    <string name=\"dialog_block_warning\">Bloquear a @%1$s?</string>\n    <string name=\"dialog_mute_warning\">Silenciar a @%1$s?</string>\n    <string name=\"action_mute_conversation\">Silenciar conversación</string>\n    <string name=\"action_unmute_conversation\">Dejar de silenciar conversación</string>\n    <string name=\"notification_follow_request_description\">Notificaciones de solicitudes</string>\n    <string name=\"pref_title_confirm_reblogs\">Pedir confirmación antes de impulsar</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Mostrar previsualización de enlaces en la cronología</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Habilitar gesto de deslizar para alternar entre pestañas</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s persona</item>\n        <item quantity=\"many\">%1$s personas</item>\n        <item quantity=\"other\">%1$s personas</item>\n    </plurals>\n    <string name=\"hashtags\">Etiquetas</string>\n    <string name=\"add_hashtag_title\">Añadir etiqueta</string>\n    <string name=\"notification_follow_request_format\">%1$s solicita seguirte</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Abajo</string>\n    <string name=\"pref_main_nav_position_option_top\">Arriba</string>\n    <string name=\"pref_main_nav_position\">Posición de navegación principal</string>\n    <string name=\"pref_title_gradient_for_media\">Mostrar degradados colorido para los medios ocultos</string>\n    <string name=\"action_unmute_domain\">Dejar de silenciar a %1$s</string>\n    <string name=\"action_unmute_desc\">Dejar de silenciar a %1$s</string>\n    <string name=\"dialog_mute_hide_notifications\">Ocultar notificaciones</string>\n    <string name=\"pref_title_hide_top_toolbar\">Ocultar el título de la barra de herramientas superior</string>\n    <string name=\"account_note_saved\">¡Guardado!</string>\n    <string name=\"account_note_hint\">Tu nota privada acerca de esta cuenta</string>\n    <string name=\"no_announcements\">No hay anuncios.</string>\n    <string name=\"title_announcements\">Anuncios</string>\n    <string name=\"notification_subscription_format\">%1$s acaba de publicar</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">No puedes cargar más de %1$d archivo multimedia adjunto.</item>\n        <item quantity=\"many\">No puedes cargar más de %1$d archivos multimedia adjuntos.</item>\n        <item quantity=\"other\">No puedes cargar más de %1$d archivos multimedia adjuntos.</item>\n    </plurals>\n    <string name=\"wellbeing_hide_stats_profile\">Esconder las estadísticas cuantitativas de los perfiles</string>\n    <string name=\"wellbeing_hide_stats_posts\">Esconder las estadísticas cuantitativas de las publicaciones</string>\n    <string name=\"review_notifications\">Revisar Notificaciones</string>\n    <string name=\"pref_title_wellbeing_mode\">Bienestar</string>\n    <string name=\"notification_subscription_description\">Notificaciones cuando alguien al que estoy suscrito escribe una publicación</string>\n    <string name=\"notification_subscription_name\">Nuevas publicaciones</string>\n    <string name=\"wellbeing_mode_notice\">Se ocultarán algunas informaciones que podrían afectar a tu bienestar. Esto incluye:\n\\n\n\\n- Notificaciones de favoritos, impulsos y seguidores\n\\n- Conteo de favoritos e impulsos en publicaciones\n\\n- Estadísticas de seguidores y publicaciones en perfiles\n\\n\n\\nLas notificaciones Push no serán afectadas, pero puedes revisar manualmente tus preferencias.</string>\n    <string name=\"drafts_post_reply_removed\">El toot al que redactaste una respuesta ha sido eliminado</string>\n    <string name=\"draft_deleted\">Borrador eliminado</string>\n    <string name=\"drafts_failed_loading_reply\">Error al cargar la información de respuesta</string>\n    <string name=\"drafts_post_failed_to_send\">¡Este toot no se pudo enviar!</string>\n    <string name=\"dialog_delete_list_warning\">¿Realmente quieres eliminar la lista %1$s?</string>\n    <string name=\"duration_indefinite\">Indefinido</string>\n    <string name=\"label_duration\">Duración</string>\n    <string name=\"post_media_attachments\">Adjuntos</string>\n    <string name=\"post_media_audio\">Audio</string>\n    <string name=\"limit_notifications\">Limitar cronología de notificaciones</string>\n    <string name=\"action_unbookmark\">Quitar marcador</string>\n    <string name=\"follow_requests_info\">Aunque su cuenta no está bloqueada, el personal de %1$s pensó que podría querer revisar las solicitudes de seguimiento de estas cuentas manualmente.</string>\n    <string name=\"action_subscribe_account\">Suscribir</string>\n    <string name=\"dialog_delete_conversation_warning\">¿Eliminar esta conversación?</string>\n    <string name=\"pref_title_animate_custom_emojis\">Animar emojis personalizados</string>\n    <string name=\"action_unsubscribe_account\">Darse de baja</string>\n    <string name=\"action_delete_conversation\">Eliminar conversación</string>\n    <string name=\"pref_title_confirm_favourites\">Pedir confirmación antes de marcar como favorito</string>\n    <string name=\"error_multimedia_size_limit\">Los archivos de video y audio no pueden pesar más de %1$s MB.</string>\n    <string name=\"error_image_edit_failed\">Esta imagen no puede ser editada.</string>\n    <string name=\"pref_show_self_username_always\">Siempre</string>\n    <string name=\"pref_show_self_username_never\">Nunca</string>\n    <string name=\"action_add_reaction\">añadir reacción</string>\n    <string name=\"error_following_hashtag_format\">Error al seguir #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Error dejando de seguir #%1$s</string>\n    <string name=\"title_login\">Ingreso</string>\n    <string name=\"notification_sign_up_format\">%1$s se registró</string>\n    <string name=\"notification_update_format\">%1$s editó su publicación</string>\n    <string name=\"action_dismiss\">Descartar</string>\n    <string name=\"action_details\">Detalles</string>\n    <string name=\"error_loading_account_details\">Fallo cargando los detalles de la cuenta</string>\n    <string name=\"error_could_not_load_login_page\">Fallo cargando la página de ingreso.</string>\n    <string name=\"delete_scheduled_post_warning\">¿Eliminar publicación programada?</string>\n    <string name=\"set_focus_description\">Toca o arrastra el círculo para centrar el foco de la imagen, que será visible en las miniaturas.</string>\n    <string name=\"compose_save_draft_loses_media\">¿Guardar este borrador? (Los adjuntos se subirán de nuevo cuando vuelvas a él.)</string>\n    <string name=\"pref_title_show_self_username\">Mostrar nombre de usuario en la barra de herramientas</string>\n    <string name=\"account_date_joined\">Se unió %1$s</string>\n    <string name=\"duration_14_days\">14 días</string>\n    <string name=\"duration_365_days\">365 días</string>\n    <string name=\"failed_to_pin\">Fallo al fijar</string>\n    <string name=\"failed_to_unpin\">Fallo al quitarlo</string>\n    <string name=\"pref_show_self_username_disambiguate\">Cuando hay varias cuentas ingresadas</string>\n    <string name=\"notification_sign_up_description\">Notificaciones de nuevos usuarios</string>\n    <string name=\"notification_update_name\">Ediciones de una publicación</string>\n    <string name=\"notification_update_description\">Notificaciones cuando se editan publicaciones con las que has interactuado</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"action_set_focus\">Establece el foco</string>\n    <string name=\"description_post_language\">Idioma de publicación</string>\n    <string name=\"duration_30_days\">30 días</string>\n    <string name=\"duration_60_days\">60 días</string>\n    <string name=\"duration_90_days\">90 días</string>\n    <string name=\"duration_180_days\">180 días</string>\n    <string name=\"duration_no_change\">(Sin cambios)</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Escribir publicación</string>\n    <string name=\"saving_draft\">Guardando borrador…</string>\n    <string name=\"instance_rule_info\">Al iniciar sesión aceptas las normas de %1$s.</string>\n    <string name=\"instance_rule_title\">Normas de %1$s</string>\n    <string name=\"notification_sign_up_name\">Creación de cuentas</string>\n    <string name=\"action_edit_image\">Editar imagen</string>\n    <string name=\"failed_to_add_to_list\">Fallo al añadir la cuenta a la lista</string>\n    <string name=\"failed_to_remove_from_list\">Fallo al eliminar la cuenta de la lista</string>\n    <string name=\"action_add_or_remove_from_list\">Añadir o quitar de la lista</string>\n    <string name=\"hint_media_description_missing\">El contenido debe tener una descripción.</string>\n    <string name=\"report_category_violation\">Violación de una regla</string>\n    <string name=\"report_category_spam\">Spam</string>\n    <string name=\"pref_default_post_language\">Idioma de publicación (sincronizado con el servidor)</string>\n    <string name=\"pref_title_http_proxy_port_message\">El puerto debe situarse entre %1$d y %2$d</string>\n    <string name=\"notification_report_name\">Denuncias</string>\n    <string name=\"description_post_edited\">Editado</string>\n    <string name=\"notification_report_format\">Nueva denuncia en %1$s</string>\n    <string name=\"notification_header_report_format\">%1$s denunció a %2$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d publicaciones fijadas</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"error_muting_hashtag_format\">Error al silenciar #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Error al reactivar #%1$s</string>\n    <string name=\"no_lists\">No tienes ninguna lista.</string>\n    <string name=\"notification_report_description\">Notificaciones sobre informes de moderación</string>\n    <string name=\"error_following_hashtags_unsupported\">Esta instancia no soporta el seguimiento de etiquetas.</string>\n    <string name=\"title_followed_hashtags\">Etiquetas seguidas</string>\n    <string name=\"report_category_other\">Otros</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"action_unfollow_hashtag_format\">¿Dejar de seguir a #%1$s?</string>\n    <string name=\"post_edited\">%1$s editado</string>\n    <string name=\"error_status_source_load\">Fallo al cargar el estado desde el servidor.</string>\n    <string name=\"confirmation_hashtag_unfollowed\">Dejaste de seguir a #%1$s</string>\n    <string name=\"action_discard\">Descartar cambios</string>\n    <string name=\"action_continue_edit\">Continuar editando</string>\n    <string name=\"compose_unsaved_changes\">Tienes cambios sin guardar.</string>\n    <string name=\"title_edits\">Ediciones</string>\n    <string name=\"action_post_failed\">La subida falló</string>\n    <string name=\"action_post_failed_do_nothing\">Descartar</string>\n    <string name=\"action_browser_login\">Iniciar sesión con el navegador</string>\n    <string name=\"a11y_label_loading_thread\">Cargando hilo</string>\n    <string name=\"mute_notifications_switch\">Silenciar notificaciones</string>\n    <string name=\"pref_title_reading_order\">Orden de lectura</string>\n    <string name=\"pref_reading_order_oldest_first\">Más antiguas primero</string>\n    <string name=\"pref_reading_order_newest_first\">Más recientes primero</string>\n    <string name=\"status_edit_info\">%1$s ha editado</string>\n    <string name=\"status_created_info\">%1$s ha editado</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Desactivado</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;sin establecer&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;inválido&gt;</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">No se ha podido subir tu publicación y se ha guardado en Borradores.\n\\n\n\\nO no se ha podido contactar con el servidor, o ha rechazado tu publicación.</item>\n        <item quantity=\"many\"/>\n        <item quantity=\"other\">Tus publicaciones no se han podido subir y se han guardado en Borradores.\n\\n\n\\nO no se ha podido contactar con el servidor, o ha rechazado tus publicaciones.</item>\n    </plurals>\n    <string name=\"action_post_failed_show_drafts\">Mostrar borradores</string>\n    <string name=\"send_account_username_to\">Compartir nombre de usuario de la cuenta con…</string>\n    <string name=\"account_username_copied\">Nombre de usuario copiado</string>\n    <string name=\"description_browser_login\">Puede soportar métodos de autenticación adicionales, pero hace falta un navegador soportado.</string>\n    <string name=\"description_login\">Funciona en la mayoría de los casos. No se comparten datos con otras apps.</string>\n    <string name=\"action_share_account_username\">Compartir el nombre de usuario de la cuenta</string>\n    <string name=\"send_account_link_to\">Compartir URL de la cuenta con…</string>\n    <string name=\"action_share_account_link\">Compartir enlace a la cuenta</string>\n    <string name=\"title_public_trending_hashtags\">Etiquetas en tendencia</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d personas están hablando de #%2$s</string>\n    <string name=\"total_usage\">Uso total</string>\n    <string name=\"total_accounts\">Cuentas totales</string>\n    <string name=\"dialog_follow_hashtag_title\">Seguir etiqueta</string>\n    <string name=\"post_media_image\">Imagen</string>\n    <string name=\"pref_title_account_filter_keywords\">Perfiles</string>\n    <string name=\"action_refresh\">Volver a cargar</string>\n    <string name=\"notification_unknown_name\">Desconocido</string>\n    <string name=\"status_filtered_show_anyway\">Mostrar de todas formas</string>\n    <string name=\"status_filter_placeholder_label_format\">Filtrado: %1$s</string>\n    <string name=\"pref_title_show_stat_inline\">Mostrar estadísticas de la entrada en la línea de tiempo</string>\n    <string name=\"ui_error_unknown\">razón desconocida</string>\n    <string name=\"socket_timeout_exception\">Contactar con tu servidor ha tardado demasiado tiempo</string>\n    <string name=\"help_empty_home\">Esta es tu <b> cronología de inicio</b>. Muestra las publicaciones recientes de las cuentas que sigues. \n\\n \n\\nPara encontrar cuentas, puedes mirar en alguna de las otras cronologías. Por ejemplo, la cronología local de tu instancia {{group}}. O puedes buscarlas por nombre {{search}}; por ejemplo, busca Tusky para encontrar nuestra cuenta de Mastodon.</string>\n    <string name=\"ui_error_bookmark\">Fallo al añadir a marcadores: %1$s</string>\n    <string name=\"select_list_manage\">Gestionar listas</string>\n    <string name=\"ui_error_favourite\">Fallo al favoritear publicación: %1$s</string>\n    <string name=\"ui_error_clear_notifications\">Fallo al limpiar notificaciones: %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">Fallo al aceptar solicitud de seguimiento: %1$s</string>\n    <string name=\"ui_error_reject_follow_request\">Fallo al rechazar la solicitud de seguimiento: %1$s</string>\n    <string name=\"ui_success_accepted_follow_request\">Solicitud de seguimiento aceptada</string>\n    <string name=\"ui_success_rejected_follow_request\">Solicitud de seguimiento bloqueada</string>\n    <string name=\"hint_filter_title\">Mi filtro</string>\n    <string name=\"filter_edit_keyword_title\">Editar palabra</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"ui_error_reblog\">Fallo al impulsar publicación: %1$s</string>\n    <string name=\"ui_error_vote\">Fallo al votar en la encuesta: %1$s</string>\n    <string name=\"label_filter_title\">Título</string>\n    <string name=\"filter_action_warn\">Aviso</string>\n    <string name=\"filter_description_hide\">Ocultar completamente</string>\n    <string name=\"filter_description_warn\">Ocultar con un aviso</string>\n    <string name=\"filter_action_hide\">Ocultar</string>\n    <string name=\"label_filter_action\">Acción del filtro</string>\n    <string name=\"label_filter_context\">Lugares donde se aplica el filtro</string>\n    <string name=\"label_filter_keywords\">Palabras y frases clave para filtrar</string>\n    <string name=\"action_add\">Añadir</string>\n    <string name=\"filter_keyword_display_format\">%1$s (palabra entera)</string>\n    <string name=\"filter_keyword_addition_title\">Añadir palabra</string>\n    <string name=\"pref_ui_text_size\">Tamaño de letra</string>\n    <string name=\"notification_notification_worker\">Obteniendo notificaciones…</string>\n    <string name=\"load_newest_notifications\">Cargar nuevas notificaciones</string>\n    <string name=\"compose_delete_draft\">¿Eliminar borrador?</string>\n    <string name=\"action_follow_hashtag\">Sigue una nueva etiqueta</string>\n    <string name=\"action_translate\">Traducir</string>\n    <string name=\"action_show_original\">Mostrar original</string>\n    <string name=\"label_image\">Imagen</string>\n    <string name=\"dialog_follow_warning\">¿Seguir esta cuenta?</string>\n    <string name=\"pref_default_reply_privacy\">Visibilidad de la respuesta (sin sincronizar con el servidor)</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nVersión: %3$s</string>\n    <string name=\"pref_title_show_notifications_filter\">Mostrar filtros de Notificaciones</string>\n    <string name=\"label_expires_after\">Caduca en</string>\n    <string name=\"error_missing_edits\">Tu servidor sabe que este mensaje fue editado, pero no tiene una copia de las ediciones, por lo que no se pueden mostrar. \n\\n \n\\nEste es el <a href=\"https://github.com/mastodon/mastodon/issues/25398\">fallo de Mastodon #25398</a>.</string>\n    <string name=\"ui_error_translate\">No se pudo traducir: %1$s</string>\n    <string name=\"muting_hashtag_success_format\">Silenciando etiqueta #%1$s como advertencia</string>\n    <string name=\"pref_default_reply_privacy_explanation\">La visibilidad preseleccionada dependerá del mensaje al que estés contestando.</string>\n    <string name=\"notification_listenable_worker_name\">Actividad en segundo plano</string>\n    <string name=\"notification_prune_cache\">Mantenimiento de la caché…</string>\n    <string name=\"about_device_info_title\">Tu dispositivo</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nVersión de Android: %3$s\n\\nVersión del SDK: %4$d</string>\n    <string name=\"label_translating\">Traduciendo…</string>\n    <string name=\"label_translated\">Traducido del %1$s con %2$s</string>\n    <string name=\"action_view_filter\">Ver filtro</string>\n    <string name=\"unfollowing_hashtag_success_format\">Dejaste de seguir la etiqueta #%1$s</string>\n    <string name=\"pref_title_confirm_follows\">Mostrar confirmación antes de seguir</string>\n    <string name=\"report_category_legal\">Legal</string>\n    <string name=\"notification_listenable_worker_description\">Notificaciones cuando Tusky está funcionando en segundo plano</string>\n    <string name=\"error_blocking_domain\">Fallo al silenciar %1$s: %2$s</string>\n    <string name=\"pref_title_show_self_boosts_description\">Alguien impulsó su propio mensaje</string>\n    <string name=\"error_deleting_filter\">Error al borrar el filtro \\'%1$s\\'</string>\n    <string name=\"error_saving_filter\">Error al guardar el filtro \\'%1$s\\'</string>\n    <string name=\"title_public_trending_statuses\">Tendencias</string>\n    <string name=\"url_copied\">URL copiada</string>\n    <string name=\"confirmation_hashtag_copied\">\\'#%1$s\\' copiado/a</string>\n    <string name=\"reply_sending\">Enviando…</string>\n    <string name=\"reply_sending_long\">Tu respuesta se está enviando.</string>\n    <string name=\"about_account_info_title\">Tu cuenta</string>\n    <string name=\"error_unblocking_domain\">Error al activar el sonido %1$s: %2$s</string>\n    <string name=\"error_media_upload_sending_fmt\">Error al subir el archivo: %1$s</string>\n    <string name=\"post_privacy_direct\">Directo</string>\n    <string name=\"action_reblog_private\">Compartir para seguidores</string>\n    <string name=\"action_reblog_public\">Compartir públicamente</string>\n    <string name=\"follow_hashtag_success\">Siguiendo etiqueta %1$s</string>\n    <string name=\"post_replied_format\">En respuesta a %1$s</string>\n    <string name=\"pref_title_show_self_boosts\">Mostrar publicaciones compartidas por mí</string>\n    <string name=\"preview_card_more_by_author\">Más de %1$s</string>\n    <string name=\"pref_title_per_timeline_preferences\">Preferencias de cronología</string>\n    <string name=\"notification_policy_filter\">Filtrar</string>\n    <string name=\"list_exclusive_label\">Ocultar en la cronología de tu instancia</string>\n    <string name=\"help_empty_conversations\">Aquí están tus <b>mensajes privados</b>; a veces llamados conversaciones o mensajes directos (MD). \\u0020\n\\n \\u0020\n\\nLos mensajes privados se crean fijando la visibilidad {{public}} de una publicación a {{mail}} <i>Directo</i> y mencionando a uno o más usuarios. \\u0020\n\\n \\u0020\n\\nPor ejemplo puedes empezar desde el perfil de otro usuario, pulsar el botón de crear [iconics gmd_edit] y cambiar la visibilidad.</string>\n    <string name=\"about_copied\">Se copió la información de versión y dispositivo</string>\n    <string name=\"unknown_notification_type_explanation\">Tusky no ha reconocido este tipo de notificación y no pudo mostrartela. La interfaz web de tu servidor quizás pueda. ¡Por favor informa a los desarrolladores de Tusky para que añadir soporte de la misma!</string>\n    <string name=\"notification_moderation_warning_name\">Alertas de moderación</string>\n    <string name=\"notification_unknown_description\">Tipo de notificación desconocida</string>\n    <string name=\"dialog_delete_filter_text\">¿Borrar filtro \\'%1$s\\'?</string>\n    <string name=\"dialog_delete_filter_positive_action\">Borrar</string>\n    <string name=\"dialog_save_profile_changes_message\">¿Quiere guardar sus cambios en el perfil?</string>\n    <string name=\"list_reply_policy_none\">Nadie</string>\n    <string name=\"list_reply_policy_list\">Miembros de la lista</string>\n    <string name=\"unknown_notification_type\">Tipo de notificación desconocida</string>\n    <string name=\"notification_policies_title\">Política de notificaciones</string>\n    <string name=\"notification_policies_filter_out\">Administrar notificaciones de…</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">Personas que no sigues</string>\n    <string name=\"notification_policies_filter_dont_follow_description\">Hasta que los aceptes</string>\n    <string name=\"notification_policies_filter_not_following_description\">Incluyendo personas que llevan siguiéndote menos de tres días</string>\n    <string name=\"unknown_notification_filter_new_accounts_description\">Creadas en los últimos 30 días</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_title\">Menciones privadas no solicitadas</string>\n    <string name=\"unknown_notification_filter_moderated_accounts_description\">Limitada por moderadores</string>\n    <string name=\"notification_policies_not_supported\">Está característica solo funciona en servidores de Mastodon v4.3.0 o superior.</string>\n    <string name=\"filtered_notifications\">Notificaciones filtradas</string>\n    <string name=\"notifications_from_people_you_may_know\">Notificaciones de %1$d persons que quizás conozcas</string>\n    <string name=\"notification_policy_accept\">Aceptar</string>\n    <string name=\"notification_policy_ignore\">Ignorar</string>\n    <string name=\"filtered_notifications_title\">Notificaciones filtradas</string>\n    <string name=\"open_settings\">Abrir preferencias</string>\n    <string name=\"notifications_from\">Notificaciones de %1$s</string>\n    <string name=\"action_accept_notification_request\">Aceptar</string>\n    <string name=\"action_dismiss_notification_request\">Descartar</string>\n    <string name=\"relationship_severance_event_account_suspension\">Un administrador de %1$s ha suspendido %2$s, por lo que no podrás recibir actualizaciones ni interactuar con ellos.</string>\n    <string name=\"relationship_severance_event_domain_block\">Un administrador de %1$s ha bloqueado %2$s, incluyendo %3$s de tus seguidores y %4$s de tus seguidos.</string>\n    <string name=\"relationship_severance_event_user_domain_block\">Has bloqueado %1$s, eliminando %2$s de tus seguidores y %3$s de tus seguidos.</string>\n    <plurals name=\"accounts\">\n        <item quantity=\"one\">%1$s cuenta</item>\n        <item quantity=\"many\">%1$s cuentas</item>\n        <item quantity=\"other\">%1$s cuentas</item>\n    </plurals>\n    <string name=\"moderation_warning\">Has recibido un aviso de moderación.</string>\n    <string name=\"moderation_warning_action_delete_statuses\">Algunas de tu publicaciones ha sido eliminadas.</string>\n    <string name=\"moderation_warning_action_disable\">Tu cuenta ha sido deshabilitada.</string>\n    <string name=\"moderation_warning_action_mark_statuses_as_sensitive\">Algunas de tus publicaciones han sido marcadas como sensibles.</string>\n    <string name=\"moderation_warning_action_none\">Tu cuenta ha recibido un aviso de moderación.</string>\n    <string name=\"moderation_warning_action_sensitive\">Tus publicaciones serán marcadas como sensibles a partir de ahora.</string>\n    <string name=\"moderation_warning_action_silence\">Tu cuenta ha sido limitada.</string>\n    <string name=\"moderation_warning_action_suspend\">Tu cuenta ha sido suspendida.</string>\n    <string name=\"poll\">Encuesta</string>\n    <plurals name=\"media_attachments\">\n        <item quantity=\"one\">%1$s adjunto</item>\n        <item quantity=\"many\">%1$s adjuntos</item>\n        <item quantity=\"other\">%1$s adjuntos</item>\n    </plurals>\n    <string name=\"notification_info_reply\">Responder</string>\n    <string name=\"notification_info_private_mention\">Mención privada</string>\n    <string name=\"notification_info_mention\">Mención</string>\n    <string name=\"notification_info_private_reply\">Respuesta privada</string>\n    <string name=\"unmuting_hashtag_success_format\">Desilenciar etiqueta #%1$s</string>\n    <string name=\"about_copy\">Copiar información de versión y dispositivo</string>\n    <string name=\"error_media_playback\">Reproducción falló: %1$s</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">Nuevas cuentas</string>\n    <string name=\"notification_policies_filter_not_following_title\">Personas que no te siguen</string>\n    <string name=\"list_reply_policy_followed\">Cualquier usuario seguido</string>\n    <string name=\"list_reply_policy_label\">Mostrar respuestas a</string>\n    <string name=\"pref_match_default_post_privacy\">Usar la visibilidad predefinida</string>\n    <string name=\"following_hashtag_success_format\">Ahora sigues la etiqueta #%1$s</string>\n    <string name=\"app_theme_system_black\">Usar tema del sistema (negro)</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-eu/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">Errorea gertatu da.</string>\n    <string name=\"error_empty\">Eremu hau ezin da hutsik egon.</string>\n    <string name=\"error_invalid_domain\">Domeinu baliogabea sartu da</string>\n    <string name=\"error_failed_app_registration\">Akatsa instantzia horrekin autentikatzerakoan. Akatsak badarrai, menutik, nabigatzailean saioa hasteko aukerarekin saiatu.</string>\n    <string name=\"error_no_web_browser_found\">Ez da web nabigatzailerik aurkitu.</string>\n    <string name=\"error_authorization_unknown\">Identifikatu gabeko baimen-akatsa gertatu da. Akatsak badarrai, menutik, nabigatzailean saioa hasteko aukerarekin saiatu.</string>\n    <string name=\"error_authorization_denied\">Baimena ukatu da. Ziur bazaude zuk sartutako egiaztagiriak zuzenak direla, menutik, nabigatzailean saioa hasteko aukerarekin saiatu.</string>\n    <string name=\"error_retrieving_oauth_token\">Akatsa saio-hasieraren identifikatzailea eskuratzerakoan. Akatsak badarrai, menutik, nabigatzailean saioa hasteko aukerarekin saiatu.</string>\n    <string name=\"error_compose_character_limit\">Tut luzeegia!</string>\n    <string name=\"error_media_upload_type\">Ez da fitxategi mota hau onartzen.</string>\n    <string name=\"error_media_upload_opening\">Ezin izan da fitxategi hau ireki.</string>\n    <string name=\"error_media_upload_permission\">Memoriara sartzeko baimena behar da.</string>\n    <string name=\"error_media_download_permission\">Memoriara deskargatzeko baimena behar da.</string>\n    <string name=\"error_media_upload_image_or_video\">Ezin dira bideoak eta irudiak tut berean gehitu.</string>\n    <string name=\"error_media_upload_sending\">Akatsa igotzerakoan.</string>\n    <string name=\"error_sender_account_gone\">Akatsa tuta bidaltzerakoan.</string>\n    <string name=\"title_home\">Hasiera</string>\n    <string name=\"title_notifications\">Jakinarazpenak</string>\n    <string name=\"title_public_local\">Bertakoa</string>\n    <string name=\"title_public_federated\">Federatua</string>\n    <string name=\"title_view_thread\">Haria</string>\n    <string name=\"title_posts\">Tutak</string>\n    <string name=\"title_posts_with_replies\">Erantzunekin</string>\n    <string name=\"title_follows\">Jarraitzen</string>\n    <string name=\"title_followers\">Jarraitzaileak</string>\n    <string name=\"title_favourites\">Gogokoak</string>\n    <string name=\"title_mutes\">Isilduak</string>\n    <string name=\"title_blocks\">Blokeatuak</string>\n    <string name=\"title_follow_requests\">Jarraipen-eskaerak</string>\n    <string name=\"title_edit_profile\">Editatu profila</string>\n    <string name=\"title_drafts\">Zirriborroak</string>\n    <string name=\"title_licenses\">Lizentziak</string>\n    <string name=\"post_boosted_format\">%1$s-(e)k bultzatu du</string>\n    <string name=\"post_sensitive_media_title\">Eduki hunkigarria</string>\n    <string name=\"post_media_hidden_title\">Ezkutuko media</string>\n    <string name=\"post_sensitive_media_directions\">Sakatu ikusteko</string>\n    <string name=\"post_content_warning_show_more\">Erakutsi gehiago</string>\n    <string name=\"post_content_warning_show_less\">Erakutsi gutxiago</string>\n    <string name=\"post_content_show_more\">Zabaldu</string>\n    <string name=\"post_content_show_less\">Itxi</string>\n    <string name=\"footer_empty\">Edukirik ez. Arrastatu behera birkargatzeko!</string>\n    <string name=\"notification_reblog_format\">%1$s-(e)k zure tuta bultzatu du</string>\n    <string name=\"notification_favourite_format\">%1$s-(e)k zure tuta gogoko du</string>\n    <string name=\"notification_follow_format\">%1$s-(e)k jarraitu dizu</string>\n    <string name=\"report_username_format\">\\@%1$s salatu</string>\n    <string name=\"report_comment_hint\">Informazio gehigarria?</string>\n    <string name=\"action_quick_reply\">Erantzun azkarra</string>\n    <string name=\"action_reply\">Erantzun</string>\n    <string name=\"action_reblog\">Bultzatu</string>\n    <string name=\"action_favourite\">Gogokoa</string>\n    <string name=\"action_more\">Gehiago</string>\n    <string name=\"action_compose\">Idatzi</string>\n    <string name=\"action_login\">Tuskykin saioa hasi</string>\n    <string name=\"action_logout\">Itxi saioa</string>\n    <string name=\"action_logout_confirm\">Ziur zaude %1$s saioa itxi nahi duzula? Horrek kontuaren datu lokal guztiak ezabatuko ditu, zirriborroak eta hobespenak barne.</string>\n    <string name=\"action_follow\">Jarraitu</string>\n    <string name=\"action_unfollow\">Jarraitzeari utzi</string>\n    <string name=\"action_block\">Blokeatu</string>\n    <string name=\"action_unblock\">Desblokeatu</string>\n    <string name=\"action_hide_reblogs\">Bultzadak ezkutatu</string>\n    <string name=\"action_show_reblogs\">Bultzadak erakutsi</string>\n    <string name=\"action_report\">Salatu</string>\n    <string name=\"action_delete\">Ezabatu</string>\n    <string name=\"action_send\">Tut</string>\n    <string name=\"action_send_public\">TUT!</string>\n    <string name=\"action_retry\">Berriz saiatu</string>\n    <string name=\"action_close\">Itxi</string>\n    <string name=\"action_view_profile\">Profila</string>\n    <string name=\"action_view_preferences\">Ezarpenak</string>\n    <string name=\"action_view_account_preferences\">Kontuaren ezarpenak</string>\n    <string name=\"action_view_favourites\">Gogokoak</string>\n    <string name=\"action_view_mutes\">Isilduak</string>\n    <string name=\"action_view_blocks\">Blokeatuak</string>\n    <string name=\"action_view_follow_requests\">Eskakizunak</string>\n    <string name=\"action_view_media\">Multimedia</string>\n    <string name=\"action_open_in_web\">Ireki nabigatzailean</string>\n    <string name=\"action_add_media\">Gehitu multimedia</string>\n    <string name=\"action_photo_take\">Atera argazkia</string>\n    <string name=\"action_share\">Partekatu</string>\n    <string name=\"action_mute\">Mututu</string>\n    <string name=\"action_unmute\">Desmututu</string>\n    <string name=\"action_mention\">Aipatu</string>\n    <string name=\"action_hide_media\">Ezkutatu multimedia</string>\n    <string name=\"action_open_drawer\">Ireki tiradera</string>\n    <string name=\"action_save\">Gorde</string>\n    <string name=\"action_edit_profile\">Editatu profila</string>\n    <string name=\"action_edit_own_profile\">Editatu</string>\n    <string name=\"action_undo\">Desegin</string>\n    <string name=\"action_accept\">Onartu</string>\n    <string name=\"action_reject\">Ukatu</string>\n    <string name=\"action_search\">Bilatu</string>\n    <string name=\"action_access_drafts\">Zirriborroak</string>\n    <string name=\"action_toggle_visibility\">Tutaren ikusgarritasuna</string>\n    <string name=\"action_content_warning\">Edukiaren abisua</string>\n    <string name=\"action_emoji_keyboard\">Emoji teklatua</string>\n    <string name=\"download_image\">%1$s jaisten</string>\n    <string name=\"action_copy_link\">Kopiatu esteka</string>\n    <string name=\"send_post_link_to\">Partekatu tutaren URLa…</string>\n    <string name=\"send_post_content_to\">Partekatu tuta…</string>\n    <string name=\"send_media_to\">Partekatu multimedia…</string>\n    <string name=\"confirmation_reported\">Bidalia!</string>\n    <string name=\"confirmation_unblocked\">Erabiltzailea desblokeatuta</string>\n    <string name=\"confirmation_unmuted\">Erabiltzailea isilgabetuta</string>\n    <string name=\"hint_domain\">Zein instantzia?</string>\n    <string name=\"hint_compose\">Zer duzu buruan?</string>\n    <string name=\"hint_content_warning\">Edukiaren abisua</string>\n    <string name=\"hint_display_name\">Agertuko den izena</string>\n    <string name=\"hint_note\">Biografia</string>\n    <string name=\"hint_search\">Bilatu…</string>\n    <string name=\"search_no_results\">Emaitzarik ez</string>\n    <string name=\"label_quick_reply\">Erantzun…</string>\n    <string name=\"label_avatar\">Irudia</string>\n    <string name=\"label_header\">Goiburua</string>\n    <string name=\"link_whats_an_instance\">Zer da instantzia?</string>\n    <string name=\"login_connection\">Konektatzen…</string>\n    <string name=\"dialog_whats_an_instance\">Edozein instantziaren helbidea edo domeinua hemen sar daiteke, hala nola mastodon.eus, mastodon.jalgi.eus, mastodon.social eta <a href=\"https://instances.social\">gehiago!</a>, \\u0020 \n\\n \\u0020 \n\\nOraindik konturik ez baduzu, sartu nahi duzun instantziaren izena sar dezakezu eta bertan sortu kontua. \\u0020\n\\n \\u0020 \n\\nInstantzia zure kontua ostatatzen den leku bakarra da, baina beste instantzia batzuetako jendearekin erraz komunikatu eta jarrai dezakezu gune berean egongo bazina bezala. \\u0020 \n\\n \\u0020 \n\\nInformazio gehiago <a href=\"https://joinmastodon.org\">joinmastodon.org</a> webgunean aurki daiteke. \\u0020</string>\n    <string name=\"dialog_title_finishing_media_upload\">Mediaren igoera bukatzen</string>\n    <string name=\"dialog_message_uploading_media\">Igotzen…</string>\n    <string name=\"dialog_download_image\">Jaitsi</string>\n    <string name=\"dialog_message_cancel_follow_request\">Jarraipenaren eskakizunari uko egin?</string>\n    <string name=\"dialog_unfollow_warning\">Kontu hau jarraitzeari utzi?</string>\n    <string name=\"dialog_delete_post_warning\">Tut hau ezabatu?</string>\n    <string name=\"visibility_public\">Publikoa: Istorio publikoetan erakutsi</string>\n    <string name=\"visibility_unlisted\">Ezkutukoa: Ez erakutsi istorio publikoetan</string>\n    <string name=\"visibility_private\">Pribatua: Jarraitzaileentzat soilik ikusgai</string>\n    <string name=\"visibility_direct\">Zuzena: Aipatutako kontuentzat bakarrik ikusgai</string>\n    <string name=\"pref_title_edit_notification_settings\">Jakinarazpenak</string>\n    <string name=\"pref_title_notifications_enabled\">Jakinarazpenak</string>\n    <string name=\"pref_title_notification_alerts\">Alertak</string>\n    <string name=\"pref_title_notification_alert_sound\">Soinuarekin jakinarazi</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Bibrazioarekin jakinarazi</string>\n    <string name=\"pref_title_notification_alert_light\">Led-arekin jakinarazi</string>\n    <string name=\"pref_title_notification_filters\">Honen arabera jakinarazi</string>\n    <string name=\"pref_title_appearance_settings\">Interfazea</string>\n    <string name=\"pref_title_app_theme\">Gaia</string>\n    <string name=\"pref_title_timelines\">Denbora-lerroak</string>\n    <string name=\"app_them_dark\">Iluna</string>\n    <string name=\"app_theme_light\">Argia</string>\n    <string name=\"app_theme_black\">Beltza</string>\n    <string name=\"app_theme_auto\">Automatikoa</string>\n    <string name=\"pref_title_browser_settings\">Nabigatzailea</string>\n    <string name=\"pref_title_custom_tabs\">Chromeko fitxak erabili</string>\n    <string name=\"pref_title_post_filter\">Denbora-lerroaren iragaztea</string>\n    <string name=\"pref_title_post_tabs\">Fitxak</string>\n    <string name=\"pref_title_show_boosts\">Bultzadak erakutsi</string>\n    <string name=\"pref_title_show_replies\">Erakutsi erantzunak</string>\n    <string name=\"pref_title_show_media_preview\">Jaitsi mediaren aurreikuspenak</string>\n    <string name=\"pref_title_proxy_settings\">Proxya</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP Proxy-a</string>\n    <string name=\"pref_title_http_proxy_enable\">HTTP Proxy-a gaitu</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP Proxy-aren zerbitzaria</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP Proxy-aren portua</string>\n    <string name=\"pref_default_post_privacy\">Aurrezarritako ikusgarritasuna</string>\n    <string name=\"pref_default_media_sensitivity\">Beti markatu multimedia eduki mingarri gisa</string>\n    <string name=\"pref_publishing\">Bidalketak</string>\n    <string name=\"pref_failed_to_sync\">Aukerak sinkronizatzean akatsa</string>\n    <string name=\"post_privacy_public\">Publiko</string>\n    <string name=\"post_privacy_unlisted\">Zerrendagabetuta</string>\n    <string name=\"post_privacy_followers_only\">Jarraitzaileak soilik</string>\n    <string name=\"pref_post_text_size\">Tutaren testuaren tamaina</string>\n    <string name=\"post_text_size_smallest\">Txikiena</string>\n    <string name=\"post_text_size_small\">Txikia</string>\n    <string name=\"post_text_size_medium\">Ertaina</string>\n    <string name=\"post_text_size_large\">Handia</string>\n    <string name=\"post_text_size_largest\">Handiena</string>\n    <string name=\"notification_mention_name\">Aipamen berriak</string>\n    <string name=\"notification_mention_descriptions\">Aipamen berrien jakinarazpenak</string>\n    <string name=\"notification_follow_name\">Jarritzaile berriak</string>\n    <string name=\"notification_follow_description\">Jarraitzaile berrien jakinarazpenak</string>\n    <string name=\"notification_boost_name\">Bultzadak</string>\n    <string name=\"notification_boost_description\">Bultzatutako tuten jakinarazpenak</string>\n    <string name=\"notification_favourite_name\">Gogokoak</string>\n    <string name=\"notification_favourite_description\">Zure tutak gogoko bezala ezartzerakoan jakinarazpenak</string>\n    <string name=\"notification_mention_format\">%1$s-(e)k aipatu zaitu</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s eta beste %4$d</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s eta %3$s</string>\n    <string name=\"notification_summary_small\">%1$s eta %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">interakzio berri %1$d</item>\n        <item quantity=\"other\">%1$d interakzio berri</item>\n    </plurals>\n    <string name=\"description_account_locked\">Kontu babestua</string>\n    <string name=\"about_title_activity\">Honi buruz</string>\n    <string name=\"about_tusky_license\">Tusky software libre eta kode askekoa da. \\\"GNU General Public License Version 3\\\" lizentziapean zabaldua. Lizentzia hontaz gehiago irakurtzeko: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">Proiektuaren webgunea:\n\\nhttps://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Akatsen berri-emateak eta hobekuntza-eskariak:\n\\n https://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Tuskyren profila</string>\n    <string name=\"post_share_content\">Partekatu tutaren edukia</string>\n    <string name=\"post_share_link\">Partekatu tutaren esteka</string>\n    <string name=\"post_media_images\">Irudiak</string>\n    <string name=\"post_media_video\">Bideoa</string>\n    <string name=\"state_follow_requested\">Eskaera bidalita</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">%1$du-an</string>\n    <string name=\"abbreviated_in_days\">%1$de-an</string>\n    <string name=\"abbreviated_in_hours\">%1$dh-an</string>\n    <string name=\"abbreviated_in_minutes\">%1$dm-an</string>\n    <string name=\"abbreviated_in_seconds\">%1$ds-an</string>\n    <string name=\"abbreviated_years_ago\">%1$du</string>\n    <string name=\"abbreviated_days_ago\">%1$de</string>\n    <string name=\"follows_you\">Jarraitzen dizu</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Erakutsi beti eduki hunkigarria</string>\n    <string name=\"title_media\">Multimedia</string>\n    <string name=\"replying_to\">\\@%1$s-(r)i erantzuten</string>\n    <string name=\"load_more_placeholder_text\">Kargatu gehiago</string>\n    <string name=\"add_account_name\">Gehitu kontua</string>\n    <string name=\"add_account_description\">Gehitu Mastodon kontu berria</string>\n    <string name=\"action_lists\">Zerrendak</string>\n    <string name=\"title_lists\">Zerrendak</string>\n    <string name=\"compose_active_account_description\">%1$s kontuarekin tut egiten</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\"/>\n        <item quantity=\"other\">Ikusmen urritasuna dutenentzat deskribapena\n\\n(%1$d karaktereko muga)</item>\n    </plurals>\n    <string name=\"action_set_caption\">Gehitu deskribapena</string>\n    <string name=\"action_remove\">Ezabatu</string>\n    <string name=\"lock_account_label\">Blokeatu kontua</string>\n    <string name=\"lock_account_label_description\">Jarraitzaileak eskuz onartu beharko dituzu</string>\n    <string name=\"compose_save_draft\">Zirriborroa gorde?</string>\n    <string name=\"send_post_notification_title\">Tuta bidaltzen…</string>\n    <string name=\"send_post_notification_error_title\">Errorea tuta bidaltzean</string>\n    <string name=\"send_post_notification_channel_name\">Tutak bidaltzen</string>\n    <string name=\"send_post_notification_cancel_title\">Bidalketa bertan behera utzita</string>\n    <string name=\"send_post_notification_saved_content\">Tutaren kopia bat zure zirriborroetan gorde da</string>\n    <string name=\"action_compose_shortcut\">Idatzi</string>\n    <string name=\"error_no_custom_emojis\">%1$s instantziak ez ditu emoji pertsonalizatuak eskaintzen</string>\n    <string name=\"emoji_style\">Emojien estiloa</string>\n    <string name=\"system_default\">Sistema</string>\n    <string name=\"download_fonts\">Lehenik emoji-sorta hauek deskargatu beharko dituzu</string>\n    <string name=\"performing_lookup_title\">Bilatzen…</string>\n    <string name=\"expand_collapse_all_posts\">Zabaldu/Itxi tut guztiak</string>\n    <string name=\"action_open_post\">Ireki tuta</string>\n    <string name=\"restart_required\">Berrabiaraztea beharrezkoa da</string>\n    <string name=\"restart_emoji\">Aplikazioa berrabiarazi beharko duzu aldaketa ezartzeko</string>\n    <string name=\"later\">Beranduago</string>\n    <string name=\"restart\">Berrabiarazi</string>\n    <string name=\"caption_systememoji\">Zure gailuko emoji lehenetsiak</string>\n    <string name=\"caption_blobmoji\">Android 4.4etik 7.1erako Blob emoji-ak</string>\n    <string name=\"caption_twemoji\">Mastodoneko emoji pakete estandarra</string>\n    <string name=\"download_failed\">Deskargatzerakoan akatsa</string>\n    <string name=\"profile_badge_bot_text\">Bot-a</string>\n    <string name=\"account_moved_description\">%1$s hona mugitu da:</string>\n    <string name=\"reblog_private\">Bultzatu jatorrizko hartzaileei</string>\n    <string name=\"unreblog_private\">Kendu bultzada</string>\n    <string name=\"license_description\">Tusky-k ondorengo software libreko proiektuetako kode eta baliabideak ditu:</string>\n    <string name=\"license_apache_2\">Apache Lizentziapean (testua zerrendaren azpian)</string>\n    <string name=\"profile_metadata_label\">Profilaren metadatuak</string>\n    <string name=\"profile_metadata_add\">gehitu datuak</string>\n    <string name=\"profile_metadata_label_label\">Etiketa</string>\n    <string name=\"profile_metadata_content_label\">Edukia</string>\n    <string name=\"pref_title_absolute_time\">Erabili denbora absolutua</string>\n    <string name=\"label_remote_account\">Ondorengo edukiak erabiltzailearen informazioa erdizka erakutsi dezake. Profil osoa ikusteko nabigatzailean sakatu.</string>\n    <string name=\"unpin_action\">Desainguratu</string>\n    <string name=\"pin_action\">Ainguratu</string>\n    <string name=\"error_network\">Sareko errore bat gertatu da. Egiaztatu zure konexioa eta saiatu berriro, mesedez.</string>\n    <string name=\"title_direct_messages\">Mezu zuzenak</string>\n    <string name=\"title_tab_preferences\">Fitxak</string>\n    <string name=\"title_posts_pinned\">Finkatua</string>\n    <string name=\"title_domain_mutes\">Ezkutuko domeinuak</string>\n    <string name=\"title_scheduled_posts\">Programatutako tutak</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"message_empty\">Kilkerrak besterik ez hemen.</string>\n    <string name=\"action_unreblog\">Kendu bultzada</string>\n    <string name=\"action_unfavourite\">Gogokoa kendu</string>\n    <string name=\"action_edit\">Editatu</string>\n    <string name=\"action_delete_and_redraft\">Ezabatu eta zirriborroa berriro egin</string>\n    <string name=\"action_view_domain_mutes\">Ezkutuko domeinuak</string>\n    <string name=\"action_add_poll\">Gehitu inkesta</string>\n    <string name=\"action_mute_domain\">Mututu %1$s</string>\n    <string name=\"action_access_scheduled_posts\">Programatutako tutak</string>\n    <string name=\"action_schedule_post\">Programatu tuta</string>\n    <string name=\"action_reset_schedule\">Berrezarri</string>\n    <string name=\"action_add_tab\">Gehitu fitxa</string>\n    <string name=\"action_links\">Estekak</string>\n    <string name=\"action_mentions\">Aipamenak</string>\n    <string name=\"action_open_reblogged_by\">Erakutsi bultzadak</string>\n    <string name=\"action_open_faved_by\">Erakutsi gogokoak</string>\n    <string name=\"title_mentions_dialog\">Aipamenak</string>\n    <string name=\"title_links_dialog\">Estekak</string>\n    <string name=\"action_open_media_n\">Ireki multimedia #%1$d</string>\n    <string name=\"action_open_as\">Ireki %1$s bezala</string>\n    <string name=\"action_share_as\">Partekatu honela…</string>\n    <string name=\"download_media\">Deskargatu multimedia</string>\n    <string name=\"downloading_media\">Multimedia deskargatzen</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s ez dago ezkutatua</string>\n    <string name=\"dialog_redraft_post_warning\">Tut hau ezabatu eta zirriborro berria egin?</string>\n    <string name=\"mute_domain_warning\">Ziur al zaude %1$s-(r)en eduki guztia ezabatu nahi duzula? Domeinu horretatik datorren edukia ez duzu denbora-lerro publikoetan edo jakinarazpenetan ikusiko. Domeinu horretan dituzun jarraitzaileak ezabatuko dira.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Domeinu osoa ezkutatu</string>\n    <string name=\"pref_title_timeline_filters\">Iragazkiak</string>\n    <string name=\"app_theme_system\">Erabili sistemaren diseinua</string>\n    <string name=\"pref_title_language\">Hizkuntza</string>\n    <string name=\"pref_title_bot_overlay\">Botentzako erakuslea erakutsi</string>\n    <string name=\"pref_title_animate_gif_avatars\">GIF abatarrak animatu</string>\n    <string name=\"notification_poll_name\">Galdeketak</string>\n    <string name=\"notification_poll_description\">Bukatutako galdeketen jakinarazpenak</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"action_hashtags\">Traolak</string>\n    <string name=\"title_hashtags_dialog\">Traolak</string>\n    <string name=\"about_powered_by_tusky\">Tusky-k sustatuta</string>\n    <string name=\"abbreviated_hours_ago\">%1$dh</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"pref_title_alway_open_spoiler\">Zabaldu beti edukien abisuekin markatutako tutak</string>\n    <string name=\"pref_title_thread_filter_keywords\">Elkarrizketak</string>\n    <string name=\"filter_addition_title\">Gehitu iragazkia</string>\n    <string name=\"filter_edit_title\">Editatu iragazkia</string>\n    <string name=\"filter_dialog_remove_button\">Ezabatu</string>\n    <string name=\"filter_dialog_update_button\">Eguneratu</string>\n    <string name=\"filter_dialog_whole_word\">Hitz osoa</string>\n    <string name=\"filter_dialog_whole_word_description\">Gako-hitza edo esaldia alfanumerikoa denean bakarrik, hitz osoarekin bat datorrenean bakarrik aplikatuko da</string>\n    <string name=\"filter_add_description\">Iragazteko esaldia</string>\n    <string name=\"error_create_list\">Ezin izan da zerrenda sortu</string>\n    <string name=\"error_rename_list\">Ezin izan da zerrendaren izena aldatu</string>\n    <string name=\"error_delete_list\">Ezin izan da zerrenda ezabatu</string>\n    <string name=\"action_create_list\">Sortu zerrenda</string>\n    <string name=\"action_rename_list\">Eguneratu zerrenda</string>\n    <string name=\"action_delete_list\">Ezabatu zerrenda</string>\n    <string name=\"hint_search_people_list\">Bilatu jarraitzen dituzun pertsonak</string>\n    <string name=\"action_add_to_list\">Gehitu kontua zerrendan</string>\n    <string name=\"action_remove_from_list\">Kendu kontua zerrendatik</string>\n    <string name=\"caption_notoemoji\">Google-ren egungo emoji multzoa</string>\n    <string name=\"license_cc_by_4\">CC BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC BY-SA 4.0</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\">Gogoko <b>%1$s</b></item>\n        <item quantity=\"other\"><b>%1$s</b> Gogoko</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\">Bultzada <b>%1$s</b></item>\n        <item quantity=\"other\"><b>%1$s</b> Bultzada</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">Bultzatuta</string>\n    <string name=\"title_favourited_by\">Gogokoa</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s eta %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s eta %3$d gehiago</string>\n    <string name=\"description_post_media\">Multimedia: %1$s</string>\n    <string name=\"description_post_cw\">Edukiarekiko abisua: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Deskribapenik ez</string>\n    <string name=\"description_post_reblogged\">Bultzatua</string>\n    <string name=\"description_post_favourited\">Gogokoa</string>\n    <string name=\"description_visibility_public\">Publikoa</string>\n    <string name=\"description_visibility_unlisted\">Zerrendatu gabea</string>\n    <string name=\"description_visibility_private\">Jarraitzaileak</string>\n    <string name=\"description_visibility_direct\">Zuzena</string>\n    <string name=\"description_poll\">Inkesta aukerekin: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"hint_list_name\">Zerrendaren izena</string>\n    <string name=\"pick_hashtag_hint\">Traola # gabe</string>\n    <string name=\"notifications_clear\">Garbitu</string>\n    <string name=\"notifications_apply_filter\">Iragazi</string>\n    <string name=\"filter_apply\">Aplikatu</string>\n    <string name=\"compose_shortcut_long_label\">Idatzi tuta</string>\n    <string name=\"compose_shortcut_short_label\">Idatzi</string>\n    <string name=\"notification_clear_text\">Ziur zaude jakinarazpen guztiak betirako garbitu nahi dituzula?</string>\n    <string name=\"compose_preview_image_description\">%1$s irudiarentzako ekintzak</string>\n    <string name=\"poll_info_format\"> \\u0020<!-- 15 boto • Ordu 1 geratzen da --> \\u0020%1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">Boto %1$s</item>\n        <item quantity=\"other\">%1$s boto</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">%1$s amaitzen da</string>\n    <string name=\"poll_info_closed\">Itxita</string>\n    <string name=\"poll_vote\">Botatu</string>\n    <string name=\"poll_ended_voted\">Botoa eman duzun inkesta amaitu da</string>\n    <string name=\"poll_ended_created\">Zuk sortutako inkesta bat amaitu da</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">Egun %1$d geratzen da</item>\n        <item quantity=\"other\">%1$d egun geratzen da</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">Ordu %1$d geratzen da</item>\n        <item quantity=\"other\">%1$d ordu geratzen da</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">Segundu %1$d geratzen da</item>\n        <item quantity=\"other\">%1$d segundu geratzen da</item>\n    </plurals>\n    <string name=\"button_continue\">Jarraitu</string>\n    <string name=\"button_back\">Itzuli</string>\n    <string name=\"button_done\">Eginda</string>\n    <string name=\"report_sent_success\">\\@%1$s jakinarazi duzu arrakastaz</string>\n    <string name=\"hint_additional_info\">Iruzkin gehigarriak</string>\n    <string name=\"report_remote_instance\">%1$s(r)i birbidali</string>\n    <string name=\"failed_report\">Txostenak huts egin du</string>\n    <string name=\"failed_fetch_posts\">Huts egin du tutak eskuratzean</string>\n    <string name=\"report_description_1\">Txostena zure zerbitzariaren moderatzaileari bidaliko zaio. Jarraian, kontu honen zergatia salatzen duzun azalpena eman dezakezu:</string>\n    <string name=\"report_description_remote_instance\">Kontua beste zerbitzari batekoa da. Bidali txostenaren kopia anonimatua hara ere?</string>\n    <string name=\"title_accounts\">Kontuak</string>\n    <string name=\"failed_search\">Bilaketak huts egin du</string>\n    <string name=\"create_poll_title\">Inkesta</string>\n    <string name=\"duration_5_min\">5 minutu</string>\n    <string name=\"duration_30_min\">30 minutu</string>\n    <string name=\"duration_1_hour\">Ordu 1</string>\n    <string name=\"duration_6_hours\">6 ordu</string>\n    <string name=\"duration_1_day\">Egun 1</string>\n    <string name=\"duration_3_days\">3 egun</string>\n    <string name=\"duration_7_days\">7 egun</string>\n    <string name=\"add_poll_choice\">Gehitu aukera</string>\n    <string name=\"poll_allow_multiple_choices\">Aukera anitzak</string>\n    <string name=\"poll_new_choice_hint\">%1$d. aukera</string>\n    <string name=\"edit_poll\">Editatu</string>\n    <string name=\"post_lookup_error_format\">Errorea agertu da %1$s mezua bilatzean</string>\n    <string name=\"title_bookmarks\">Laster-markak</string>\n    <string name=\"action_bookmark\">Laster-marka</string>\n    <string name=\"action_view_bookmarks\">Laster-markak</string>\n    <string name=\"action_open_reblogger\">Ireki bultzadaren egilea</string>\n    <string name=\"pref_title_public_filter_keywords\">Denbora lerro publikoak</string>\n    <string name=\"description_post_bookmarked\">Laster-marketara gehitua</string>\n    <string name=\"select_list_title\">Hautatu zerrenda</string>\n    <string name=\"list\">Zerrenda</string>\n    <string name=\"no_drafts\">Ez duzu zirriborrorik.</string>\n    <string name=\"no_scheduled_posts\">Ez duzu tut programaturik.</string>\n    <string name=\"warning_scheduling_interval\">Mastodonek gutxienez 5 minutuko programazio-tartea du.</string>\n    <string name=\"notification_follow_request_name\">Eskakizunak</string>\n    <string name=\"notification_follow_request_description\">Jarraitzeko eskaereri buruzko jakinarazpenak</string>\n    <string name=\"dialog_mute_warning\">\\@%1$s isildu?</string>\n    <string name=\"dialog_block_warning\">\\@%1$s blokeatu?</string>\n    <string name=\"action_mute_conversation\">Mututu elkarrizketa</string>\n    <string name=\"notification_follow_request_format\">%1$s-(e)k zu jarraitzeko eskatu du</string>\n    <string name=\"hashtags\">Traolak</string>\n    <string name=\"dialog_mute_hide_notifications\">Jakinarazpenak ezkutatu</string>\n    <string name=\"action_unmute_desc\">Desmututu %1$s</string>\n    <string name=\"pref_title_hide_top_toolbar\">Ezkutatu goiko tresna-barraren izenburua</string>\n    <string name=\"pref_title_confirm_reblogs\">Eskatu berrespena tuta bultzatu aurretik</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Erakutsi esteken aurrebista denbora-lerroetan</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Gaitu irristatzeko keinua fitxetan zehar mugitzeko</string>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">Minutu %1$d faltan</item>\n        <item quantity=\"other\">%1$d minutu faltan</item>\n    </plurals>\n    <string name=\"add_hashtag_title\">Gehitu traola</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Beheran</string>\n    <string name=\"pref_main_nav_position_option_top\">Goian</string>\n    <string name=\"pref_main_nav_position\">Nabigazio nagusiaren posizioa</string>\n    <string name=\"pref_title_gradient_for_media\">Gradiente koloretsuak erakutsi ezkutuko mediaren lekuan</string>\n    <string name=\"action_unmute_conversation\">Desmututu elkarrizketa</string>\n    <string name=\"action_unmute_domain\">Desmututu %1$s</string>\n    <string name=\"review_notifications\">Berrikusi jakinarazpenak</string>\n    <string name=\"pref_title_confirm_favourites\">Erakutsi berrespena gogokoenetara gehitu aurretik</string>\n    <string name=\"follow_requests_info\">Zure kontua blokeatuta ez badago ere, %1$s-ko langileek kontu hauetako eskaerak eskuz berrikusi nahi dituzula pentsatu dute.</string>\n    <string name=\"post_media_attachments\">Eranskinak</string>\n    <string name=\"dialog_delete_list_warning\">Ziur %1$s zerrenda ezabatu nahi duzula?</string>\n    <string name=\"post_media_audio\">Audioa</string>\n    <string name=\"action_subscribe_account\">Harpidetu</string>\n    <string name=\"dialog_delete_conversation_warning\">Elkarrizketa ezabatu nahi duzu?</string>\n    <string name=\"pref_title_animate_custom_emojis\">Animatu emoji pertsonalizatuak</string>\n    <string name=\"drafts_failed_loading_reply\">Erantzunaren informazioa ezin izan da kargatu</string>\n    <string name=\"wellbeing_hide_stats_profile\">Ezkutatu profilen estatistika kuantitatiboak</string>\n    <string name=\"draft_deleted\">Zirriborroa ezabatu da</string>\n    <string name=\"drafts_post_reply_removed\">Erantzun nahi zenuen tuta ezabatua izan da</string>\n    <string name=\"pref_title_wellbeing_mode\">Ongizatea</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Ezin duzu multimedia eranskin %1$d baino gehiago kargatu.</item>\n        <item quantity=\"other\">Ezin dituzu %1$d multimedia eranskin baino gehiago kargatu.</item>\n    </plurals>\n    <string name=\"limit_notifications\">Mugatu denbora-lerroaren jakinarazpenak</string>\n    <string name=\"label_duration\">Iraupena</string>\n    <string name=\"duration_indefinite\">Zehaztugabea</string>\n    <string name=\"action_unsubscribe_account\">Kendu harpidetza</string>\n    <string name=\"action_delete_conversation\">Elkarrizketa ezabatu</string>\n    <string name=\"no_announcements\">Ez daude iragarkirik.</string>\n    <string name=\"notification_subscription_format\">%1$s argitaratu berri du</string>\n    <string name=\"account_note_saved\">Gordeta!</string>\n    <string name=\"notification_subscription_name\">Tut berriak</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">Pertsona %1$s</item>\n        <item quantity=\"other\">%1$s pertsona</item>\n    </plurals>\n    <string name=\"title_announcements\">Iragarpenak</string>\n    <string name=\"notification_subscription_description\">Jakinarazpenak harpidetuta zauden norbaitek tut berria argitaratu duenean</string>\n    <string name=\"account_note_hint\">Kontu honi buruzko zure ohar pribatua</string>\n    <string name=\"drafts_post_failed_to_send\">Akatsa tut hau bidaltzean!</string>\n    <string name=\"wellbeing_mode_notice\">Zure ongizate mentalean eragina izan dezaketen zenbait informazio ezkutatuta egongo dira. Honek honako hauek ditu:\n\\n\n\\n - Gogokoak, bultzadak eta jarraitzaileen jakinarazpenak\n\\n - Tutetan gogokoen eta bultzaden kopurua\n\\n - Profiletan jarraitzaileen eta argitalpenen estatistikak\n\\n\n\\nPush-jakinarazpenek ez dute eraginik izango, baina jakinarazpenen hobespenak eskuz berrikus ditzakezu.</string>\n    <string name=\"wellbeing_hide_stats_posts\">Ezkutatu mezuen estatistika kuantitatiboak</string>\n    <string name=\"action_unbookmark\">Laster-marka kendu</string>\n    <string name=\"error_image_edit_failed\">Ezin izan da irudia editatu.</string>\n    <string name=\"error_multimedia_size_limit\">Bideo eta audio fitxategiek ezin dute %1$s MBeko tamaina baino handiagoa izan.</string>\n    <string name=\"error_muting_hashtag_format\">Akatsa #%1$s mututzerakoan</string>\n    <string name=\"error_unmuting_hashtag_format\">Errorea #%1$s desmututzerakoan</string>\n    <string name=\"error_following_hashtags_unsupported\">Instantzia honek traolak jarraitzeko funtzioarekin bateragarritasuna ez dauka.</string>\n    <string name=\"error_following_hashtag_format\">Akatsa #%1$s jarraitzerakoan</string>\n    <string name=\"error_unfollowing_hashtag_format\">Akatsa #%1$s jarraitzerakoan</string>\n    <string name=\"error_could_not_load_login_page\">Ezin izan da saio-hasierako orria kargatu.</string>\n    <string name=\"error_loading_account_details\">Akatsa kontuaren xehetasunak kargatzerakoan</string>\n    <string name=\"title_login\">Saioa hasi</string>\n    <string name=\"title_edits\">Aldaketak</string>\n    <string name=\"notification_report_format\">Salaketa berria %1$s-(r)i</string>\n    <string name=\"notification_header_report_format\">%1$s-(e)k %2$s salatu du</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d tutak finkatuak</string>\n    <string name=\"title_followed_hashtags\">Jarraitutako traolak</string>\n    <string name=\"notification_update_format\">%1$s-(e)k bere tuta editatu du</string>\n    <string name=\"action_post_failed\">Igoerak huts egin du</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Akatsa zure tuta bidaltzean, beraz, zirriborroetara bidali da.\n\\n\n\\nZerbitzariarekin ezin izan da komunikatu edo tuta baztertu egin da.</item>\n        <item quantity=\"other\">Akatsa zure tutak bidaltzean, beraz, zirriborroetara bidali dira.\n\\n\n\\nZerbitzariarekin ezin izan da komunikatu edo zure tutak baztertuak izan dira.</item>\n    </plurals>\n    <string name=\"action_post_failed_show_drafts\">Zirriborroak erakutsi</string>\n    <string name=\"action_post_failed_do_nothing\">Baztertu</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"action_browser_login\">Nabigatzailearekin saioa hasi</string>\n    <string name=\"post_edited\">%1$s editatua</string>\n    <string name=\"notification_sign_up_format\">%1$s-(e)k izena eman du</string>\n    <string name=\"error_status_source_load\">Akatsa zerbitzaritik egoeraren iturria kargatzean.</string>\n    <string name=\"action_follow_hashtag\">Jarraitu traola berri bat</string>\n    <string name=\"action_translate\">Itzuli</string>\n    <string name=\"action_show_original\">Erakutsi jatorrizkoa</string>\n    <string name=\"send_account_username_to\">Partekatu kontuaren erabiltzaile-izena…</string>\n    <string name=\"send_account_link_to\">Partekatu kontuaren URLa…</string>\n    <string name=\"account_username_copied\">Erabiltzaile-izena kopiatuta</string>\n    <string name=\"pref_title_account_filter_keywords\">Profilak</string>\n    <string name=\"label_translating\">Itzultzen…</string>\n    <string name=\"pref_title_show_self_username\">Erakutsi erabiltzaile-izena tresna-barretan</string>\n    <string name=\"pref_title_confirm_follows\">Erakutsi berrespena jarraitu aurretik</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Idatzi tuta</string>\n    <string name=\"status_edit_info\">Editatua: %1$s</string>\n    <string name=\"ui_error_unknown\">arrazoi ezezaguna</string>\n    <string name=\"ui_error_translate\">Ezin izan da itzuli: %1$s</string>\n    <string name=\"filter_action_hide\">Ezkutatu</string>\n    <string name=\"action_add\">Gehitu</string>\n    <string name=\"filter_keyword_display_format\">%1$s (hitz osoa)</string>\n    <string name=\"dialog_delete_filter_positive_action\">Ezabatu</string>\n    <string name=\"dialog_save_profile_changes_message\">Zure profilaren aldaketak gorde nahi dituzu?</string>\n    <string name=\"label_filter_keywords\">Iragazi beharreko gako-hitz edo esaldiak</string>\n    <string name=\"failed_to_remove_from_list\">Huts egin du kontua zerrendatik kentzean</string>\n    <string name=\"status_created_info\">Sortua: %1$s</string>\n    <string name=\"action_add_reaction\">Gehitu erreakzioa</string>\n    <string name=\"action_share_account_link\">Partekatu kontuaren esteka</string>\n    <string name=\"action_share_account_username\">Partekatu kontuaren erabiltzaile-izena</string>\n    <string name=\"action_details\">Xehetasunak</string>\n    <string name=\"duration_365_days\">365 egun</string>\n    <string name=\"saving_draft\">Zirriborroa gordetzen…</string>\n    <string name=\"action_add_or_remove_from_list\">Gehitu edo kendu zerrendatik</string>\n    <string name=\"failed_to_add_to_list\">Huts egin du kontua zerrendan gehitzean</string>\n    <string name=\"action_edit_image\">Editatu irudia</string>\n    <string name=\"compose_delete_draft\">Zirriborroa ezabatu?</string>\n    <string name=\"description_post_edited\">Editatua</string>\n    <string name=\"description_post_language\">Tutaren hizkuntza</string>\n    <string name=\"select_list_manage\">Kudeatu zerrendak</string>\n    <string name=\"list_exclusive_label\">Ezkutatu denbora lerro lokaletik</string>\n    <string name=\"action_view_filter\">Ikusi iragazkia</string>\n    <string name=\"duration_60_days\">60 egun</string>\n    <string name=\"pref_title_show_stat_inline\">Erakutsi tutaren estatistikak denbora lerroan</string>\n    <string name=\"pref_title_show_notifications_filter\">Erakutsi jakinarazpenen iragazkia</string>\n    <string name=\"duration_14_days\">14 egun</string>\n    <string name=\"duration_30_days\">30 egun</string>\n    <string name=\"duration_90_days\">90 egun</string>\n    <string name=\"duration_no_change\">(Aldaketarik ez)</string>\n    <string name=\"filter_keyword_addition_title\">Gehitu gako-hitza</string>\n    <string name=\"filter_edit_keyword_title\">Editatu gako-hitza</string>\n    <string name=\"dialog_follow_hashtag_title\">Jarraitu traola</string>\n    <string name=\"action_continue_edit\">Jarraitu editatzen</string>\n    <string name=\"url_copied\">URLa kopiatuta</string>\n    <string name=\"duration_180_days\">180 egun</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-fa/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">خطایی رخ داد.</string>\n    <string name=\"error_empty\">این نمی‌تواند خالی باشد.</string>\n    <string name=\"error_invalid_domain\">دامنهٔ نامعتبر وارد شده</string>\n    <string name=\"error_failed_app_registration\">احراز هویت با این نمونه شکست خورد. اگر مشکل ادامه داشت، ورود در مرورگر را از فهرست بیازمایید.</string>\n    <string name=\"error_no_web_browser_found\">مرورگری برای استفاده پیدا نشد.</string>\n    <string name=\"error_authorization_unknown\">خطای احراز هویت ناشناخته‌ای رخ داد. اگر مشکل ادامه داشت، ورود در مرورگر را از فهرست بیازمایید.</string>\n    <string name=\"error_authorization_denied\">احراز هویت رد شد. اگر مطمئنید که اطّلاعات را درست وارد کرده‌اید، ورود در مرورگر را از فهرست بیازمایید.</string>\n    <string name=\"error_retrieving_oauth_token\">دریافت ژتون ورود شکست خورد. اگر مشکل ادامه داشت، ورود در مرورگر را از فهرست بیازمایید.</string>\n    <string name=\"error_compose_character_limit\">فرسته خیلی طولانی است!</string>\n    <string name=\"error_media_upload_type\">این گونهٔ پرونده نمی‌تواند بارگذاری شود.</string>\n    <string name=\"error_media_upload_opening\">این پرونده نتوانست گشوده شود.</string>\n    <string name=\"error_media_upload_permission\">نیاز به اجازهٔ خواندن رسانه است.</string>\n    <string name=\"error_media_download_permission\">نیاز به اجازهٔ ذخیرهٔ رسانه است.</string>\n    <string name=\"error_media_upload_image_or_video\">تصاویر و فیلم‌ها نمی‌توانند به یک فرسته پیوست شوند.</string>\n    <string name=\"error_media_upload_sending\">بارگذاری شکست خورد.</string>\n    <string name=\"error_sender_account_gone\">خطای فرستادن فرسته.</string>\n    <string name=\"title_home\">خانه</string>\n    <string name=\"title_notifications\">آگاهی‌ها</string>\n    <string name=\"title_public_local\">محلّی</string>\n    <string name=\"title_public_federated\">همگانی</string>\n    <string name=\"title_view_thread\">رشته</string>\n    <string name=\"title_posts\">فرسته‌ها</string>\n    <string name=\"title_posts_with_replies\">با پاسخ‌</string>\n    <string name=\"title_follows\">دنبال شونده</string>\n    <string name=\"title_followers\">پی‌گیر</string>\n    <string name=\"title_favourites\">برگزیده‌ها</string>\n    <string name=\"title_mutes\">کاربران خموش</string>\n    <string name=\"title_blocks\">کاربران مسدود</string>\n    <string name=\"title_follow_requests\">درخواست‌های پی‌گیری</string>\n    <string name=\"title_edit_profile\">ویرایش نمایه‌تان</string>\n    <string name=\"title_drafts\">پیش‌نویس‌ها</string>\n    <string name=\"title_licenses\">پروانه‌ها</string>\n    <string name=\"post_boosted_format\">%1$s تقویت کرد</string>\n    <string name=\"post_sensitive_media_title\">محتوای حسّاس</string>\n    <string name=\"post_media_hidden_title\">رسانهٔ نهفته</string>\n    <string name=\"post_sensitive_media_directions\">کلیک برای نمایش</string>\n    <string name=\"post_content_warning_show_more\">نمایش بیش‌تر</string>\n    <string name=\"post_content_warning_show_less\">نمایش کم‌تر</string>\n    <string name=\"post_content_show_more\">گسترش</string>\n    <string name=\"post_content_show_less\">جمع کردن</string>\n    <string name=\"footer_empty\">این‌جا هیچ‌چیز نیست. برای تازه‌سازی، به پایین بکشید!</string>\n    <string name=\"notification_reblog_format\">%1$s فرسته‌تان را تقویت کرد</string>\n    <string name=\"notification_favourite_format\">%1$s فرسته‌تان را برگزید</string>\n    <string name=\"notification_follow_format\">%1$s پی‌گیرتان شد</string>\n    <string name=\"report_username_format\">گزارش @%1$s</string>\n    <string name=\"report_comment_hint\">نظرهای اضافی؟</string>\n    <string name=\"action_quick_reply\">پاسخ سریع</string>\n    <string name=\"action_reply\">پاسخ</string>\n    <string name=\"action_reblog\">تقویت</string>\n    <string name=\"action_favourite\">برگزیدن</string>\n    <string name=\"action_more\">بیش‌تر</string>\n    <string name=\"action_compose\">ایجاد</string>\n    <string name=\"action_login\">ورود با تاسکی</string>\n    <string name=\"action_logout\">خروج</string>\n    <string name=\"action_follow\">پیگیری</string>\n    <string name=\"action_unfollow\">ناپی‌گیری</string>\n    <string name=\"action_block\">انسداد</string>\n    <string name=\"action_unblock\">رفع انسداد</string>\n    <string name=\"action_hide_reblogs\">نهفتن تقویت‌ها</string>\n    <string name=\"action_show_reblogs\">نمایش تقویت‌ها</string>\n    <string name=\"action_report\">گزارش</string>\n    <string name=\"action_delete\">حذف</string>\n    <string name=\"action_send\">بوق</string>\n    <string name=\"action_send_public\">بوق!</string>\n    <string name=\"action_retry\">تلاش دوباره</string>\n    <string name=\"action_close\">بستن</string>\n    <string name=\"action_view_profile\">نمایه</string>\n    <string name=\"action_view_preferences\">ترجیحات</string>\n    <string name=\"action_view_account_preferences\">ترجیحات حساب</string>\n    <string name=\"action_view_favourites\">برگزیده‌ها</string>\n    <string name=\"action_view_mutes\">کاربران خموش</string>\n    <string name=\"action_view_blocks\">کاربران مسدود</string>\n    <string name=\"action_view_follow_requests\">درخواست‌های پی‌گیری</string>\n    <string name=\"action_view_media\">رسانه</string>\n    <string name=\"action_open_in_web\">گشودن در مرورگر</string>\n    <string name=\"action_add_media\">افزودن رسانه</string>\n    <string name=\"action_photo_take\">گرفتن عکس</string>\n    <string name=\"action_share\">هم‌رسانی</string>\n    <string name=\"action_mute\">خموشی</string>\n    <string name=\"action_unmute\">ناخموشی</string>\n    <string name=\"action_mention\">اشاره</string>\n    <string name=\"action_hide_media\">نهفتن رسانه</string>\n    <string name=\"action_open_drawer\">گشودن کشو</string>\n    <string name=\"action_save\">ذخیره</string>\n    <string name=\"action_edit_profile\">ویرایش نمایه</string>\n    <string name=\"action_edit_own_profile\">ویرایش</string>\n    <string name=\"action_undo\">بازگشت</string>\n    <string name=\"action_accept\">پذیرش</string>\n    <string name=\"action_reject\">رد</string>\n    <string name=\"action_search\">جست‌وجو</string>\n    <string name=\"action_access_drafts\">پیش‌نویس‌ها</string>\n    <string name=\"action_toggle_visibility\">نمایانی فرسته</string>\n    <string name=\"action_content_warning\">هشدار محتوا</string>\n    <string name=\"action_emoji_keyboard\">صفحه‌کلید اموجی</string>\n    <string name=\"download_image\">درحال بارگیری %1$s</string>\n    <string name=\"action_copy_link\">رونوشت از پیوند</string>\n    <string name=\"send_post_link_to\">هم‌رسانی نشانی فرسته با…</string>\n    <string name=\"send_post_content_to\">هم‌رسانی فرسته با…</string>\n    <string name=\"send_media_to\">هم‌رسانی رسانه با…</string>\n    <string name=\"confirmation_reported\">فرستاده شد!</string>\n    <string name=\"confirmation_unblocked\">کاربرنامسدود شد</string>\n    <string name=\"confirmation_unmuted\">کاربر ناخموش شد</string>\n    <string name=\"hint_domain\">کدام نمونه؟</string>\n    <string name=\"hint_compose\">چه خبر؟</string>\n    <string name=\"hint_content_warning\">هشدار محتوا</string>\n    <string name=\"hint_display_name\">نام نمایشی</string>\n    <string name=\"hint_note\">شرح حال</string>\n    <string name=\"hint_search\">جست‌وجو…</string>\n    <string name=\"search_no_results\">بدون هیچ نتیجه‌ای</string>\n    <string name=\"label_quick_reply\">پاسخ…</string>\n    <string name=\"label_avatar\">آواتار</string>\n    <string name=\"label_header\">سرایند</string>\n    <string name=\"link_whats_an_instance\">نمونه چیست؟</string>\n    <string name=\"login_connection\">در حال وصل شدن…</string>\n    <string name=\"dialog_whats_an_instance\">نشانی یا دامنهٔ هر نمونه‌ای می‌تواند وارد شود، چون mastodon.social, icosahedron.website, social.tchncs.de و <a href=\"https://instances.social\">بیش‌تر!</a>.\n\\n\n\\nاگر هنوز حسابی ندارید، می‌توانید نام نمونه‌ای که می‌خواهید به آن بپیوندید را وارد کرده و در آن‌جا حسابی بسازید.\n\\n\n\\nنمونه جاییست که حسابتان رویش میزبانی می‌شود. به راحتی می‌توانید با افراد روی نمونه‌های دیگر ارتباط داشته و دنبالشان کنید؛ انگار که روی یک پایگاه باشید.\n\\n\n\\nاطّلاعات بیش‌تر می‌تواند در <a href=\"https://joinmastodon.org\">joinmastodon.org</a> پیدا شود.</string>\n    <string name=\"dialog_title_finishing_media_upload\">پایان بارگذاری رسانه</string>\n    <string name=\"dialog_message_uploading_media\">در حال بارگذاری…</string>\n    <string name=\"dialog_download_image\">بارگیری</string>\n    <string name=\"dialog_message_cancel_follow_request\">درخواست دنبال کردن را لغو می‌کنید؟</string>\n    <string name=\"dialog_unfollow_warning\">ناپی‌گیری این حساب؟</string>\n    <string name=\"dialog_delete_post_warning\">حذف این فرسته؟</string>\n    <string name=\"visibility_public\">عمومی: فرستادن به خط زمانی‌های عمومی</string>\n    <string name=\"visibility_unlisted\">فهرست‌نشده: نشان ندادن در خط زمانی‌های عمومی</string>\n    <string name=\"visibility_private\">تنها دنبال‌کنندگان:پست فقط به دنبال‌کنندگان</string>\n    <string name=\"visibility_direct\">مستقیم: فرستادن فقط به کاربران اشاره شده</string>\n    <string name=\"pref_title_edit_notification_settings\">آگاهی‌ها</string>\n    <string name=\"pref_title_notifications_enabled\">آگاهی‌ها</string>\n    <string name=\"pref_title_notification_alerts\">هشدارها</string>\n    <string name=\"pref_title_notification_alert_sound\">آگاهی با صدا</string>\n    <string name=\"pref_title_notification_alert_vibrate\">آگاهی با لرزش</string>\n    <string name=\"pref_title_notification_alert_light\">آگاهی با چراغ</string>\n    <string name=\"pref_title_notification_filters\">گونه‌های آگاهی به کار افتاده</string>\n    <string name=\"pref_title_appearance_settings\">ظاهر</string>\n    <string name=\"pref_title_app_theme\">زمینهٔ کاره</string>\n    <string name=\"pref_title_timelines\">خط‌ زمانی‌ها</string>\n    <string name=\"app_them_dark\">تاریک</string>\n    <string name=\"app_theme_light\">روشن</string>\n    <string name=\"app_theme_black\">سیاه</string>\n    <string name=\"app_theme_auto\">خودکار در غروب</string>\n    <string name=\"pref_title_browser_settings\">مرورگر</string>\n    <string name=\"pref_title_custom_tabs\">استفاده از زبانه‌های سفارشی کروم</string>\n    <string name=\"pref_title_post_filter\">پالایش خط زمانی</string>\n    <string name=\"pref_title_post_tabs\">خط زمانی خانه</string>\n    <string name=\"pref_title_show_boosts\">نمایش تقویت‌ها</string>\n    <string name=\"pref_title_show_replies\">نمایش پاسخ‌ها</string>\n    <string name=\"pref_title_show_media_preview\">بارگیری پیش‌نمایش رسانه</string>\n    <string name=\"pref_title_proxy_settings\">پیشکار</string>\n    <string name=\"pref_title_http_proxy_settings\">پیشکار HTTP</string>\n    <string name=\"pref_title_http_proxy_enable\">به کار انداختن پیشکار HTTP</string>\n    <string name=\"pref_title_http_proxy_server\">کارساز پیشکار HTTP</string>\n    <string name=\"pref_title_http_proxy_port\">درگاه پیشکار HTTP</string>\n    <string name=\"pref_default_post_privacy\">محرمانگی فرسته (همگام با کارساز)</string>\n    <string name=\"pref_default_media_sensitivity\">علامت‌گذاری همیشگی رسانه به عنوان حساس (همگام با کارساز)</string>\n    <string name=\"pref_publishing\">پیش‌گزیده‌های انتشار</string>\n    <string name=\"pref_failed_to_sync\">شکست در هم‌گام‌سازی ترجیحات</string>\n    <string name=\"post_privacy_public\">عمومی</string>\n    <string name=\"post_privacy_unlisted\">فهرست‌نشده</string>\n    <string name=\"post_privacy_followers_only\">فقط پی‌گیران</string>\n    <string name=\"pref_post_text_size\">اندازهٔ متن فرسته</string>\n    <string name=\"post_text_size_smallest\">کوچک‌ترین</string>\n    <string name=\"post_text_size_small\">کوچک</string>\n    <string name=\"post_text_size_medium\">میانه</string>\n    <string name=\"post_text_size_large\">بزرگ</string>\n    <string name=\"post_text_size_largest\">بزرگ‌ترین</string>\n    <string name=\"notification_mention_name\">اشاره‌های جدید</string>\n    <string name=\"notification_mention_descriptions\">آگاهی‌ها دربارهٔ اشاره‌های جدید</string>\n    <string name=\"notification_follow_name\">پی‌گیران جدید</string>\n    <string name=\"notification_follow_description\">آگاهی‌ها دربارهٔ پی‌گیران جدید</string>\n    <string name=\"notification_boost_name\">تقویت‌ها</string>\n    <string name=\"notification_boost_description\">آگاهی‌ها هنگام تقویت فرسته‌هایتان</string>\n    <string name=\"notification_favourite_name\">برگزیدن‌ها</string>\n    <string name=\"notification_favourite_description\">آگاهی‌ها هنگام برگزیده شدن فرسته‌هایتان</string>\n    <string name=\"notification_mention_format\">%1$s به شما اشاره کرد</string>\n    <string name=\"notification_summary_large\">%1$s، %2$s، %3$s و %4$d دیگر</string>\n    <string name=\"notification_summary_medium\">%1$s، %2$s و %3$s</string>\n    <string name=\"notification_summary_small\">%1$s و %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d برهم‌کنش جدید</item>\n        <item quantity=\"other\">%1$d برهم‌کنش جدید</item>\n    </plurals>\n    <string name=\"description_account_locked\">حساب قفل‌شده</string>\n    <string name=\"about_title_activity\">درباره</string>\n    <string name=\"about_tusky_license\">تاسکی نرم‌افزاری آزاد است که تحت نگارش ۳ از پروانهٔ جامع همگانی گنو منتشر شده است. پروانه را می‌توانید از این‌جا ببینید: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">پایگاه وب پروژه: https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">گزارش مشکلات و درخواست ویژگی‌ها:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">نمایهٔ تاسکی</string>\n    <string name=\"post_share_content\">هم‌رسانی محتوای فرسته</string>\n    <string name=\"post_share_link\">هم‌رسانی پیوند فرسته</string>\n    <string name=\"post_media_images\">تصویرها</string>\n    <string name=\"post_media_video\">ویدیو</string>\n    <string name=\"state_follow_requested\">تقاضای پیگیری شد</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">در %1$d سال</string>\n    <string name=\"abbreviated_in_days\">در %1$d روز</string>\n    <string name=\"abbreviated_in_hours\">در %1$d ساعت</string>\n    <string name=\"abbreviated_in_minutes\">در %1$d دقیقه</string>\n    <string name=\"abbreviated_in_seconds\">در %1$d ثانیه</string>\n    <string name=\"follows_you\">پیگیرتان است</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">نمایش همیشگی رسانه‌های حساس</string>\n    <string name=\"title_media\">رسانه</string>\n    <string name=\"replying_to\">پاسخ دادن به @%1$s</string>\n    <string name=\"load_more_placeholder_text\">بار کردن بیش‌تر</string>\n    <string name=\"add_account_name\">افزودن حساب</string>\n    <string name=\"add_account_description\">افزودن حساب ماستودون جدید</string>\n    <string name=\"action_lists\">سیاهه‌ها</string>\n    <string name=\"title_lists\">سیاهه‌ها</string>\n    <string name=\"compose_active_account_description\">فرستادن از طرف %1$s</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">توصیف محتوا برای کم‌بینایان (کران %1$d نویسه)</item>\n        <item quantity=\"other\">توصیف محتوا برای کم‌بینایان (کران %1$d نویسه)</item>\n    </plurals>\n    <string name=\"action_set_caption\">تنظیم عنوان</string>\n    <string name=\"action_remove\">برداشتن</string>\n    <string name=\"lock_account_label\">قفل حساب</string>\n    <string name=\"lock_account_label_description\">لازم است پی‌گیران را دستی تأیید کنید</string>\n    <string name=\"compose_save_draft\">ذخیرهٔ پیش‌نویس؟</string>\n    <string name=\"send_post_notification_title\">فرستادن فرسته…</string>\n    <string name=\"send_post_notification_error_title\">خطا در فرستادن فرسته</string>\n    <string name=\"send_post_notification_channel_name\">فرستادن فرسته‌ها</string>\n    <string name=\"send_post_notification_cancel_title\">فرستادن لغو شد</string>\n    <string name=\"send_post_notification_saved_content\">رونوشتی از فرسته در پیش‌نویس‌هایتان ذخیره شد</string>\n    <string name=\"action_compose_shortcut\">ایجاد</string>\n    <string name=\"error_no_custom_emojis\">نمونه‌تان %1$s هیچ اموجی سفارشی‌ای ندارد</string>\n    <string name=\"emoji_style\">سبک اموجی</string>\n    <string name=\"system_default\">پیش‌گزیدهٔ سامانه</string>\n    <string name=\"download_fonts\">نخست باید این مجموعه‌های اموجی را بارگیری کنید</string>\n    <string name=\"performing_lookup_title\">در حال جست‌وجو…</string>\n    <string name=\"expand_collapse_all_posts\">گسترش/جمع کردن تمام فرسته‌ها</string>\n    <string name=\"action_open_post\">گشودن فرسته</string>\n    <string name=\"restart_required\">نیاز به آغاز دوبارهٔ کاره</string>\n    <string name=\"restart_emoji\">برای اعمال این تغییرات، نیاز به شروع دوبارهٔ تاسکی دارید</string>\n    <string name=\"later\">بعداً</string>\n    <string name=\"restart\">آغاز دوباره</string>\n    <string name=\"caption_systememoji\">مجموعه اموجی پیش‌گزیدهٔ افزاره‌تان</string>\n    <string name=\"caption_blobmoji\">اموجی‌های اندروید ۴.۴ تا ۷.۱</string>\n    <string name=\"caption_twemoji\">مجموعه اموجی استاندارد ماستودون</string>\n    <string name=\"download_failed\">شکست در بارگیری</string>\n    <string name=\"profile_badge_bot_text\">بات</string>\n    <string name=\"account_moved_description\">%1$s منتقل شد به:</string>\n    <string name=\"reblog_private\">تقویت برای مخاطب اصلی</string>\n    <string name=\"unreblog_private\">ناتقویت</string>\n    <string name=\"license_description\">تاسکی کد و دارایی‌هایی از پروژه‌های نرم‌افزار آزاد زیر دارد:</string>\n    <string name=\"license_apache_2\">ذیل پروانهٔ آپاچی (رونوشت در ادامه)</string>\n    <string name=\"profile_metadata_label\">فرادادهٔ نمایه</string>\n    <string name=\"profile_metadata_add\">افزودن داده</string>\n    <string name=\"profile_metadata_label_label\">برچسب</string>\n    <string name=\"profile_metadata_content_label\">محتوا</string>\n    <string name=\"pref_title_absolute_time\">استفاده از زمان مطلق</string>\n    <string name=\"label_remote_account\">ممکن است اطلاعات زیر نمایهٔ کاربر را ناقص نشان دهد. برای گشودن نمایهٔ کامل در مرورگر، لمس کنید.</string>\n    <string name=\"unpin_action\">برداشتن سنجاق</string>\n    <string name=\"pin_action\">سنجاق کردن</string>\n    <string name=\"error_network\">خطای شبکه‌ای رخ داد. لطفاً اتصالتان را بررسی و دوباره تلاش کنید.</string>\n    <string name=\"title_direct_messages\">پیام‌های مستقیم</string>\n    <string name=\"title_tab_preferences\">زبانه‌ها</string>\n    <string name=\"title_posts_pinned\">سنجاق شده</string>\n    <string name=\"title_domain_mutes\">دامنه‌های نهفته</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"message_empty\">این‌جا هیچ‌چیزی نیست.</string>\n    <string name=\"action_unreblog\">برداشتن تقویت</string>\n    <string name=\"action_unfavourite\">برداشتن برگزیدگی</string>\n    <string name=\"action_delete_and_redraft\">حذف و بازنویسی</string>\n    <string name=\"action_view_domain_mutes\">دامنه‌های نهفته</string>\n    <string name=\"action_add_poll\">افزودن نظرسنجی</string>\n    <string name=\"action_mute_domain\">خموشی %1$s</string>\n    <string name=\"action_add_tab\">افزودن زبانه</string>\n    <string name=\"action_links\">پیوندها</string>\n    <string name=\"action_mentions\">اشاره‌ها</string>\n    <string name=\"action_hashtags\">برچسب‌ها</string>\n    <string name=\"action_open_reblogger\">گشودن تقویت‌کننده</string>\n    <string name=\"action_open_reblogged_by\">نمایش تقویت‌ها</string>\n    <string name=\"action_open_faved_by\">نمایش برگزیده‌ها</string>\n    <string name=\"title_hashtags_dialog\">برچسب‌ها</string>\n    <string name=\"title_mentions_dialog\">اشاره‌ها</string>\n    <string name=\"title_links_dialog\">پیوندها</string>\n    <string name=\"action_open_media_n\">گشودن رسانه #%1$d</string>\n    <string name=\"action_open_as\">گشودن به عنوان %1$s</string>\n    <string name=\"action_share_as\">هم‌رسانی به عنوان …</string>\n    <string name=\"download_media\">بارگیری رسانه</string>\n    <string name=\"downloading_media\">در حال بارگیری رسانه</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s نانهفته</string>\n    <string name=\"dialog_redraft_post_warning\">حذف و بازنویسی این فرسته؟</string>\n    <string name=\"mute_domain_warning_dialog_ok\">نهفتن تمام دامنه</string>\n    <string name=\"pref_title_timeline_filters\">پالایه‌ها</string>\n    <string name=\"app_theme_system\">استفاده از طراحی سامانه</string>\n    <string name=\"pref_title_language\">زبان</string>\n    <string name=\"pref_title_bot_overlay\">نمایش نشانگر برای بات‌ها</string>\n    <string name=\"pref_title_animate_gif_avatars\">پویانمایی آواتارهای جیف</string>\n    <string name=\"notification_poll_name\">نتایج نظرسنجی</string>\n    <string name=\"notification_poll_description\">آگاهی‌ها دربارهٔ نظرسنجی‌های پایان‌یافته</string>\n    <string name=\"about_tusky_version\">تاسکی %1$s</string>\n    <string name=\"abbreviated_years_ago\">%1$d سال</string>\n    <string name=\"abbreviated_days_ago\">%1$d روز</string>\n    <string name=\"abbreviated_hours_ago\">%1$d ساعت</string>\n    <string name=\"abbreviated_minutes_ago\">%1$d دقیقه</string>\n    <string name=\"abbreviated_seconds_ago\">%1$d ثانیه</string>\n    <string name=\"pref_title_alway_open_spoiler\">گسترش همیشگی فرسته‌های علامت‌خورده با هشدار محتوا</string>\n    <string name=\"pref_title_public_filter_keywords\">خط زمانی‌های عمومی</string>\n    <string name=\"pref_title_thread_filter_keywords\">گفت‌وگوها</string>\n    <string name=\"filter_addition_title\">افزودن پالایه</string>\n    <string name=\"filter_edit_title\">ویرایش پالایه</string>\n    <string name=\"filter_dialog_remove_button\">برداشتن</string>\n    <string name=\"filter_dialog_update_button\">به‌روز رسانی</string>\n    <string name=\"filter_dialog_whole_word\">تمام واژه</string>\n    <string name=\"error_create_list\">نتوانست سیاهه را ایجاد کند</string>\n    <string name=\"error_rename_list\">نتوانست سیاهه را به‌روز کند</string>\n    <string name=\"error_delete_list\">نتوانست سیاهه را حذف کند</string>\n    <string name=\"action_create_list\">ایجاد سیاهه</string>\n    <string name=\"action_rename_list\">به‌روز رسانی‌سیاهه</string>\n    <string name=\"action_delete_list\">حذف سیاهه</string>\n    <string name=\"hint_search_people_list\">جست‌وجوی افرادی که پی می‌گیرید</string>\n    <string name=\"action_add_to_list\">افزودن حساب به سیاهه</string>\n    <string name=\"action_remove_from_list\">برداشتن حساب از سیاهه</string>\n    <string name=\"caption_notoemoji\">مجموعه اموجی کنونی گوگل</string>\n    <string name=\"license_cc_by_4\">نگارش ۴٫۰ CC-BY</string>\n    <string name=\"license_cc_by_sa_4\">نگارش ۴٫۰ CC-BY-SA</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\">%1$s برگزیدن</item>\n        <item quantity=\"other\">%1$s برگزیدن</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\">%1$s تقویت</item>\n        <item quantity=\"other\">%1$s تقویت</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">تقویت‌شده به دست</string>\n    <string name=\"title_favourited_by\">برگزیده به دست</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s و %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s، %2$s و %3$d بیش‌تر</string>\n    <string name=\"description_post_media\">رسانه: %1$s</string>\n    <string name=\"description_post_cw\">هشدار محتوا: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">بدون شرح</string>\n    <string name=\"description_post_reblogged\">تقویت شده</string>\n    <string name=\"description_post_favourited\">برگزیده</string>\n    <string name=\"description_visibility_public\">عمومی</string>\n    <string name=\"description_visibility_unlisted\">فهرست نشده</string>\n    <string name=\"description_visibility_private\">پی‌گیران</string>\n    <string name=\"description_visibility_direct\">مستقیم</string>\n    <string name=\"description_poll\">نظرسنجی با گزینه‌ها: %1$s، %2$s، %3$s، %4$s؛ %5$s</string>\n    <string name=\"hint_list_name\">نام سیاهه</string>\n    <string name=\"pick_hashtag_hint\">برچسب بدون #</string>\n    <string name=\"notifications_clear\">حذف</string>\n    <string name=\"notifications_apply_filter\">پالایش</string>\n    <string name=\"filter_apply\">اعمال</string>\n    <string name=\"compose_shortcut_long_label\">ایجاد فرسته</string>\n    <string name=\"compose_shortcut_short_label\">ایجاد</string>\n    <string name=\"notification_clear_text\">مطمئنید می‌خواهید تمام آگاهی‌هایتان را برای همیشه پاک کنید؟</string>\n    <string name=\"poll_info_time_absolute\">پایان در %1$s</string>\n    <string name=\"poll_info_closed\">بسته</string>\n    <string name=\"poll_vote\">رأی</string>\n    <string name=\"poll_ended_voted\">یک نظرسنجی که در آن رأی دادید، تمام شد</string>\n    <string name=\"poll_ended_created\">یک نظرسنجی که ساختید، تمام شد</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d روز مانده</item>\n        <item quantity=\"other\">%1$d روز مانده</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d ساعت مانده</item>\n        <item quantity=\"other\">%1$d ساعت مانده</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d دقیقه مانده</item>\n        <item quantity=\"other\">%1$d دقیقه مانده</item>\n    </plurals>\n    <string name=\"button_continue\">ادامه</string>\n    <string name=\"button_back\">بازگشت</string>\n    <string name=\"button_done\">تمام</string>\n    <string name=\"report_sent_success\">‫@%1$s با موفّقیت گزارش شد</string>\n    <string name=\"hint_additional_info\">نظرهای اضافی</string>\n    <string name=\"report_remote_instance\">هدایت به %1$s</string>\n    <string name=\"failed_report\">شکست در گزارش</string>\n    <string name=\"failed_fetch_posts\">شکست در واکشی فرسته‌ها</string>\n    <string name=\"title_accounts\">حساب‌ها</string>\n    <string name=\"failed_search\">شکست در جست‌وجو</string>\n    <string name=\"create_poll_title\">نظرسنجی</string>\n    <string name=\"duration_5_min\">۵ دقیقه</string>\n    <string name=\"duration_30_min\">۳۰ دقیقه</string>\n    <string name=\"duration_1_hour\">۱ ساعت</string>\n    <string name=\"duration_6_hours\">۶ ساعت</string>\n    <string name=\"duration_1_day\">۱ روز</string>\n    <string name=\"duration_3_days\">۳ روز</string>\n    <string name=\"duration_7_days\">۷ روز</string>\n    <string name=\"add_poll_choice\">افزودن گزینه</string>\n    <string name=\"poll_allow_multiple_choices\">گزینه‌های چندگانه</string>\n    <string name=\"poll_new_choice_hint\">گزینهٔ %1$d</string>\n    <string name=\"edit_poll\">ویرایش</string>\n    <string name=\"title_scheduled_posts\">فرسته‌های زمان‌بسته</string>\n    <string name=\"action_edit\">ویرایش</string>\n    <string name=\"action_access_scheduled_posts\">فرسته‌های زمان‌بسته</string>\n    <string name=\"action_schedule_post\">فرستهٔ زمان‌بسته</string>\n    <string name=\"action_reset_schedule\">بازنشانی</string>\n    <string name=\"mute_domain_warning\">مطمئنید می‌خواهید تمام %1$s را مسدود کنید؟ محتوای آن دامنه را در هیچ‌یک از خط زمانی‌ها یا در آگاهی‌هایتان نخواهید دید. پی‌گیرانتان از آن دامنه، برداشته خواهند شد.</string>\n    <string name=\"filter_dialog_whole_word_description\">هنگامی که کلیدواژه یا عبارت، فقط حروف‌عددی باشد، فقط اگر با تمام واژه مطابق باشد، اعمال خواهد شد</string>\n    <string name=\"filter_add_description\">عبارت پالایش</string>\n    <string name=\"poll_info_format\">%1$s • %2$s</string>\n    <string name=\"report_description_1\">گزارش به ناظرهای کارسازتان ارسال خواهد شد. در زیر می‌توانید توضیحی در باب چرایی گزارش این حساب بنویسید:</string>\n    <string name=\"report_description_remote_instance\">این حساب از کارسازی دیگر است. رونوشتی ناشناس از گزارش، به آن‌جا نیز ارسال شود؟</string>\n    <string name=\"post_lookup_error_format\">خطا در یافتن فرستهٔ %1$s</string>\n    <string name=\"about_powered_by_tusky\">قدرت‌گرفته از تاسکی</string>\n    <string name=\"title_bookmarks\">نشانک‌ها</string>\n    <string name=\"action_bookmark\">نشانک</string>\n    <string name=\"action_view_bookmarks\">نشانک‌ها</string>\n    <string name=\"description_post_bookmarked\">نشان‌شده</string>\n    <string name=\"select_list_title\">گزینش سیاهه</string>\n    <string name=\"list\">سیاهه</string>\n    <string name=\"no_drafts\">هیچ پیش‌نویسی ندارید.</string>\n    <string name=\"no_scheduled_posts\">هیچ فرستهٔ زمان‌بسته‌ای ندارید.</string>\n    <string name=\"warning_scheduling_interval\">ماستودون، بازهٔ زمان‌بندی‌ای با کمینهٔ ۵ دقیقه دارد.</string>\n    <string name=\"pref_title_confirm_reblogs\">نمایش تأیید پیش از تقویت</string>\n    <string name=\"pref_title_show_cards_in_timelines\">پیش‌نمایش پیوندها در خط‌زمانی‌ها</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">به کار انداختن اشارهٔ کشیدنی برای تعویض بین زبانه‌ها</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s نفر</item>\n        <item quantity=\"other\">%1$s نفر</item>\n    </plurals>\n    <string name=\"hashtags\">برچسب‌ها</string>\n    <string name=\"add_hashtag_title\">افزودن برچسب</string>\n    <string name=\"notification_follow_request_description\">آگاهی‌ها دربارهٔ درخواست‌های پی‌گیری</string>\n    <string name=\"notification_follow_request_name\">درخواست‌های پی‌گیری</string>\n    <string name=\"dialog_mute_warning\">خموشی @%1$s؟</string>\n    <string name=\"dialog_block_warning\">انسداد @%1$s؟</string>\n    <string name=\"action_unmute_conversation\">ناخموشی گفت‌وگو</string>\n    <string name=\"action_mute_conversation\">خموشی گفت‌وگو</string>\n    <string name=\"notification_follow_request_format\">%1$s می‌خواهد پی‌گیرتان شود</string>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d ثانیه مانده</item>\n        <item quantity=\"other\">%1$d ثانیه مانده</item>\n    </plurals>\n    <string name=\"pref_main_nav_position_option_bottom\">پایین</string>\n    <string name=\"pref_main_nav_position_option_top\">بالا</string>\n    <string name=\"pref_main_nav_position\">موقعیت ناوبری اصلی</string>\n    <string name=\"pref_title_gradient_for_media\">نمایش گرادیان‌های رنگی برای رسانه‌های نهفته</string>\n    <string name=\"dialog_mute_hide_notifications\">نهفتن آگاهی‌ها</string>\n    <string name=\"action_unmute_domain\">ناخموشی %1$s</string>\n    <string name=\"action_unmute_desc\">ناخموشی %1$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s رأی</item>\n        <item quantity=\"other\">%1$s رأی</item>\n    </plurals>\n    <string name=\"pref_title_hide_top_toolbar\">نهفتن عنوان نوارابزار بالایی</string>\n    <string name=\"compose_preview_image_description\">کنش‌ها برای تصویر %1$s</string>\n    <string name=\"account_note_saved\">ذخیره شد!</string>\n    <string name=\"account_note_hint\">یادداشت خصوصیتان دربارهٔ این حساب</string>\n    <string name=\"no_announcements\">هیچ اعلامیه‌ای وجود ندارد.</string>\n    <string name=\"title_announcements\">اعلامیه‌ها</string>\n    <string name=\"action_unsubscribe_account\">نااشتراک</string>\n    <string name=\"action_subscribe_account\">اشتراک</string>\n    <string name=\"draft_deleted\">پیش‌نویس حذف شد</string>\n    <string name=\"drafts_post_failed_to_send\">فرستادن این فرسته شکست خورد!</string>\n    <string name=\"wellbeing_hide_stats_profile\">نهفتن آمار کمی روی نمایه‌ها</string>\n    <string name=\"wellbeing_hide_stats_posts\">نهفتن آمار کمی روی فرسته‌ها</string>\n    <string name=\"limit_notifications\">محدود کردن آگاهی‌های خط‌زمانی</string>\n    <string name=\"review_notifications\">بازبینی آگاهی‌ها</string>\n    <string name=\"pref_title_wellbeing_mode\">سلامتی</string>\n    <string name=\"label_duration\">طول</string>\n    <string name=\"post_media_attachments\">پیوست‌ها</string>\n    <string name=\"post_media_audio\">صدا</string>\n    <string name=\"notification_subscription_description\">آگاهی‌ها هنگام انتشار فرسته‌ای جدید از کسی که پی‌می‌گیرید</string>\n    <string name=\"notification_subscription_name\">فرسته‌های جدید</string>\n    <string name=\"pref_title_animate_custom_emojis\">اموجی‌های شخصی متحرّک</string>\n    <string name=\"notification_subscription_format\">%1$s چیزی فرستاد</string>\n    <string name=\"drafts_post_reply_removed\">فرسته‌ای که پاسخی به آن را پیش‌نویس کردید، برداشته شده</string>\n    <string name=\"drafts_failed_loading_reply\">شکست در بار کردن اطّلاعات پاسخ</string>\n    <string name=\"wellbeing_mode_notice\">برخی اطّلاعات که ممکن است روی سلامتی ذهنیتان تأثیر بگذارد، پنهان خواهند شد. همچون:\n\\n\n\\n- آگاهی‌های برگزیدن، تقویت و پی‌گیری\n\\n- شمار برگزیدن و تقویت فرسته‌ها\n\\n- آمار پی‌گیر و فرسته روی نمایه‌ها\n\\n\n\\nفرستادن آگاهی‌ها تأثیر نمی‌پذیرد، ولی می‌توانید ترجیحات آگاهیتان را به صورت دستی بازبینی کنید.</string>\n    <string name=\"dialog_delete_list_warning\">واقعاً می‌خواهید سیاههٔ %1$s را حذف کنید؟</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">نمی‌توانید بیش از %1$d رسانه بارگذارید.</item>\n        <item quantity=\"other\">نمی‌توانید بیش از %1$d رسانه بارگذارید.</item>\n    </plurals>\n    <string name=\"duration_indefinite\">نامعیّن</string>\n    <string name=\"follow_requests_info\">با این که حسابتان قفل نیست، کارکنان %1$s فکر کردند ممکن است بخواهید درخواست‌های پی‌گیری از این حساب‌ها را دستی بازبینی کنید.</string>\n    <string name=\"dialog_delete_conversation_warning\">حذف این گفت‌وگو؟</string>\n    <string name=\"action_delete_conversation\">حذف گفت‌وگو</string>\n    <string name=\"account_date_joined\">در %1$s پیوست</string>\n    <string name=\"title_login\">ورود</string>\n    <string name=\"notification_sign_up_format\">%1$s ثبت‌نام کرد</string>\n    <string name=\"pref_title_confirm_favourites\">نمایش تأیید پیش از برگزیدن</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">ایجاد فرسته</string>\n    <string name=\"notification_update_description\">آگاهی‌ها هنگام ویرایش فرسته‌هایی که با آن‌ها تعامل داشته‌اید</string>\n    <string name=\"action_unbookmark\">برداشن نشانک</string>\n    <string name=\"action_logout_confirm\">مطمئنید که می‌خواهید از %1$s خارج شوید؟ این کار تمامی داده‌های محلی از جمله پیش‌نویس‌ها و ترجیحات را حذف خواهد کرد.</string>\n    <string name=\"duration_14_days\">۱۴ روز</string>\n    <string name=\"duration_30_days\">۳۰ روز</string>\n    <string name=\"duration_60_days\">۶۰ روز</string>\n    <string name=\"duration_90_days\">۹۰ روز</string>\n    <string name=\"duration_365_days\">۳۶۵ روز</string>\n    <string name=\"duration_180_days\">۱۸۰ روز</string>\n    <string name=\"status_count_one_plus\">۱+</string>\n    <string name=\"error_could_not_load_login_page\">نتوانست صفحهٔ ورود را بار کند.</string>\n    <string name=\"notification_update_name\">ویرایش‌های فرسته</string>\n    <string name=\"action_edit_image\">ویرایش تصویر</string>\n    <string name=\"notification_update_format\">%1$s فرسته‌اش را ویراست</string>\n    <string name=\"notification_sign_up_name\">ثبت‌نام‌ها</string>\n    <string name=\"notification_sign_up_description\">آگاهی‌ها دربارهٔ کاربران جدید</string>\n    <string name=\"action_dismiss\">رد کردن</string>\n    <string name=\"action_details\">جزییات</string>\n    <string name=\"saving_draft\">ذخیرهٔ پیش‌نویس…</string>\n    <string name=\"error_following_hashtag_format\">خطا در پی‌گیری #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">خطا در ناپی‌گیری #%1$s</string>\n    <string name=\"delete_scheduled_post_warning\">حذف این فرستهٔ زمان‌بسته؟</string>\n    <string name=\"instance_rule_title\">قواعد %1$s</string>\n    <string name=\"instance_rule_info\">با ورودتان، قواعد %1$s را می‌پذیرید.</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"failed_to_pin\">شکست در سنجاق کردن</string>\n    <string name=\"failed_to_unpin\">شکست در برداشتن سنجاق</string>\n    <string name=\"error_multimedia_size_limit\">پرونده‌های صوتی و ویدیویی نمی‌توانند بیش از %1$sم‌ب باشند.</string>\n    <string name=\"error_image_edit_failed\">تصویر نتوانست ویرایش شود.</string>\n    <string name=\"description_post_language\">زبان فرسته</string>\n    <string name=\"pref_show_self_username_always\">همیشه</string>\n    <string name=\"pref_show_self_username_disambiguate\">هنگام ورود چندین حساب</string>\n    <string name=\"pref_show_self_username_never\">هرگز</string>\n    <string name=\"pref_title_show_self_username\">نمایش نام کاربری در نوارابزارها</string>\n    <string name=\"action_add_reaction\">افزودن واکنش</string>\n    <string name=\"action_set_focus\">تنظیم نقطهٔ تمرکز</string>\n    <string name=\"duration_no_change\">(بدون تغییر)</string>\n    <string name=\"error_loading_account_details\">شکست در بار کردن جزییات حساب</string>\n    <string name=\"set_focus_description\">ضربه زده یا دایره را کشیده تا نقطهٔ کانونی‌ای که همواره باید در بندانگشتی‌ها نمایان باشد را برگزینید.</string>\n    <string name=\"compose_save_draft_loses_media\">ذخیرهٔ پیش‌نویس؟ (پیوست‌ها هنگام بازگردانی پیش‌نویس، دوباره بارگذاری خواهند شد)</string>\n    <string name=\"action_add_or_remove_from_list\">افزودن یا برداشتن از سیاهه</string>\n    <string name=\"failed_to_add_to_list\">شکست در افزودن حساب به سیاهه</string>\n    <string name=\"failed_to_remove_from_list\">شکست در برداشتن حساب از سیاهه</string>\n    <string name=\"no_lists\">هیچ سیاهه‌ای ندارید.</string>\n    <string name=\"notification_report_format\">گزارش جدید روی %1$s</string>\n    <string name=\"notification_header_report_format\">%1$s، %2$s را گزارش داد</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d فرسته پیوسته</string>\n    <string name=\"error_following_hashtags_unsupported\">این نمونه از پی‌گیری برچسب‌ها پشتیبانی نمی‌کند.</string>\n    <string name=\"title_followed_hashtags\">برچسب‌های دنبالی</string>\n    <string name=\"confirmation_hashtag_unfollowed\">پی‌گیری #%1$s لغو شد</string>\n    <string name=\"notification_report_name\">گزارش‌ها</string>\n    <string name=\"notification_report_description\">آگاهی‌ها دربارهٔ گزارش‌های مدیریتی</string>\n    <string name=\"report_category_violation\">نقض قانون</string>\n    <string name=\"report_category_spam\">هرزنامه</string>\n    <string name=\"report_category_other\">دیگر</string>\n    <string name=\"action_unfollow_hashtag_format\">لغو پی‌گیری #%1$s؟</string>\n    <string name=\"status_created_at_now\">اکنون</string>\n    <string name=\"hint_media_description_missing\">رسانه باید شرحی داشته باشد.</string>\n    <string name=\"pref_default_post_language\">زبان فرسته (همگام با کارساز)</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"pref_title_http_proxy_port_message\">درگاه باید بین %2$d و %1$d باشد</string>\n    <string name=\"description_post_edited\">ویراسته</string>\n    <string name=\"error_muting_hashtag_format\">خطا در خموش کردن #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">خطا در ناخموش کردن #%1$s</string>\n    <string name=\"post_media_alt\">متن جایگزین</string>\n    <string name=\"post_edited\">%1$s را ویراست</string>\n    <string name=\"error_status_source_load\">شکست در بار کردن مبدأ وضعیت از کارساز.</string>\n    <string name=\"a11y_label_loading_thread\">بار کردن رشته</string>\n    <string name=\"title_edits\">ویرایش‌ها</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;تنظیم نشده&gt;</string>\n    <string name=\"pref_summary_http_proxy_disabled\">از کار افتاده</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;نامعتبر&gt;</string>\n    <string name=\"pref_title_reading_order\">ترتیب خواندن</string>\n    <string name=\"pref_reading_order_newest_first\">نخست جدیدترین</string>\n    <string name=\"status_edit_info\">ویراسته: %1$s</string>\n    <string name=\"status_created_info\">ایجاد شده: %1$s</string>\n    <string name=\"action_post_failed\">بارگذاری شکست خورد</string>\n    <string name=\"action_post_failed_show_drafts\">نمایش پیش‌نویس‌ها</string>\n    <string name=\"action_post_failed_do_nothing\">رد کردن</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">بارگذاری فرسته‌تان شکست خورد و در پیش‌نویس‌ها ذخیره شد.\n\\n\n\\nارتباط با کارساز برقرار نشد یا فرسته را رد کرد.</item>\n        <item quantity=\"other\">بارگذاری فرسته‌هایتان شکست خورد و در پیش‌نویس‌ها ذخیره شد.\n\\n\n\\nارتباط با کارساز برقرار نشد یا فرسته‌ها را رد کرد.</item>\n    </plurals>\n    <string name=\"description_login\">در بیش‌تر حالت‌ها کار می‌کند. هیچ داده‌ای به دیگر کاره‌ها نشت نمی‌کند.</string>\n    <string name=\"pref_reading_order_oldest_first\">نخست قدیمی‌ترین</string>\n    <string name=\"description_browser_login\">ممکن است از روش‌های تأیید خویت اضافی پشتیبانی کند؛ ولی نیازمند مرورگری پشتیبانی شده است.</string>\n    <string name=\"action_discard\">دور انداختن تغییرات</string>\n    <string name=\"action_continue_edit\">ادامهٔ ویرایش</string>\n    <string name=\"action_browser_login\">ورود با مرورگر</string>\n    <string name=\"compose_unsaved_changes\">تغییراتی ذخیره نشده دارید.</string>\n    <string name=\"action_share_account_link\">هم‌رسانی پیوند به حساب</string>\n    <string name=\"action_share_account_username\">هم‌رسانی نام کاربری حساب</string>\n    <string name=\"send_account_link_to\">هم‌رسانی نشانی حساب به…</string>\n    <string name=\"send_account_username_to\">هم‌رسانی نام کاربری حساب به…</string>\n    <string name=\"account_username_copied\">نام کاربری رونوشت شد</string>\n    <string name=\"mute_notifications_switch\">خموشی آگاهی‌ها</string>\n    <string name=\"title_public_trending_hashtags\">برچسب‌های داغ</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d نفر دارند دربارهٔ برچسب %2$s حرف می‌زنند</string>\n    <string name=\"total_usage\">استفادهٔ کل</string>\n    <string name=\"total_accounts\">مجموع حساب‌ها</string>\n    <string name=\"dialog_follow_hashtag_title\">پی‌گیری برچسب</string>\n    <string name=\"action_refresh\">نوسازی</string>\n    <string name=\"notification_unknown_name\">ناشناخته</string>\n    <string name=\"socket_timeout_exception\">تماس با کارسازتان بیش از حد طول کشید</string>\n    <string name=\"ui_error_unknown\">دلیل نامعلوم</string>\n    <string name=\"ui_error_bookmark\">نشانک گذاری فرسته شکست خورد: %1$s</string>\n    <string name=\"ui_error_clear_notifications\">پاک سازی آگاهی‌ها شکست خورد: %1$s</string>\n    <string name=\"ui_error_favourite\">برگزیدن فرسته شکست خورد: %1$s</string>\n    <string name=\"ui_error_vote\">رأی دادن در نظرسنجی شکست خورد: %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">پذیرش درخواست پی‌گیری شکست خورد: %1$s</string>\n    <string name=\"ui_success_accepted_follow_request\">درخواست پی‌گیری پذیرفته شد</string>\n    <string name=\"ui_success_rejected_follow_request\">درخواست پی‌گیری مسدود شد</string>\n    <string name=\"ui_error_reblog\">تقویت فرسته شکست خورد: %1$s</string>\n    <string name=\"ui_error_reject_follow_request\">رد کردن درخواست پی‌گیری شکست خورد: %1$s</string>\n    <string name=\"status_filtered_show_anyway\">نمایش به هر روی</string>\n    <string name=\"status_filter_placeholder_label_format\">پالوده: %1$s</string>\n    <string name=\"pref_title_account_filter_keywords\">نمایه‌ها</string>\n    <string name=\"hint_filter_title\">پالایه‌ام</string>\n    <string name=\"label_filter_title\">عنوان</string>\n    <string name=\"filter_action_warn\">هشدار</string>\n    <string name=\"filter_action_hide\">نهفتن</string>\n    <string name=\"filter_description_warn\">نهفتن کل فرسته با هشدار</string>\n    <string name=\"filter_description_hide\">نهفتن کامل</string>\n    <string name=\"label_filter_action\">کنش پالایه</string>\n    <string name=\"label_filter_context\">بافتارهای پالایه</string>\n    <string name=\"label_filter_keywords\">کلیدواژگان یا عبارت‌ها برای پالایش</string>\n    <string name=\"action_add\">افزودن</string>\n    <string name=\"filter_keyword_display_format\">%1$s (واژهٔ کامل)</string>\n    <string name=\"filter_keyword_addition_title\">افزودن کلیدواژه</string>\n    <string name=\"filter_edit_keyword_title\">ویرایش کلیدواژه</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"pref_title_show_stat_inline\">نمایش آمار فرسته‌ها در خط زمانی</string>\n    <string name=\"help_empty_home\">این <b>خط زمانی خانگیتان</b> است. فرسته‌های جدید را از حساب‌هایی که پی‌می‌گیرید نشان می‌دهد.\n\\n\n\\nبرای کاوش حساب‌ها می‌توانید آن‌ها را در دیگر خط‌های زمانی (برای نمونه خط زمانی محلّی نمونه‌تان {{group}}) یافته یا با نام (برای نمونه Tusky برای حساب ماستودونمان) بجوییدشان {{search}}.</string>\n    <string name=\"post_media_image\">تصویر</string>\n    <string name=\"select_list_manage\">مدیریت سیاهه‌ها</string>\n    <string name=\"load_newest_notifications\">بار کردن جدیدترین آگاهی‌ها</string>\n    <string name=\"compose_delete_draft\">حذف پیش‌نویس؟</string>\n    <string name=\"error_missing_edits\">کارسازتان می‌داند که این فرسته ویرایش شده؛ ولی رونوشتی از ویرایش‌ها ندارد. پس نمی‌توانند نشانتان داده شوند.\n\\n\n\\nاین <a href=\"https://github.com/mastodon/mastodon/issues/25398\">مسئلهٔ ماستودون</a> را ببینید.</string>\n    <string name=\"pref_ui_text_size\">اندازهٔ متن میانای کاربری</string>\n    <string name=\"notification_listenable_worker_name\">فعّالیت پس‌زمینه</string>\n    <string name=\"notification_listenable_worker_description\">آگاهی‌ها هنگامی که تاسکی در پس‌زمینه کار می‌کند</string>\n    <string name=\"notification_notification_worker\">واکشی آگاهی‌ها…</string>\n    <string name=\"notification_prune_cache\">نگه‌داری انباره…</string>\n    <string name=\"error_media_upload_sending_fmt\">بارگذاری شکست خورد: %1$s</string>\n    <string name=\"about_account_info_title\">حسابتان</string>\n    <string name=\"about_device_info_title\">افزاره‌تان</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nنگارش اندروید: %3$s\n\\nنگارش SDK‏: %4$d</string>\n    <string name=\"about_account_info\">‪@%1$s@%2$s\n\\nنگارش: %3$s</string>\n    <string name=\"about_copy\">رونوشت از اطّلاعات افزاره و نگارش</string>\n    <string name=\"about_copied\">اطّلاعات افزاره و نگارش رونوشت شد</string>\n    <string name=\"list_exclusive_label\">نهفتن از خط زمانی خانگی</string>\n    <string name=\"error_media_playback\">پخش شکست خورد: %1$s</string>\n    <string name=\"dialog_delete_filter_positive_action\">حذف</string>\n    <string name=\"dialog_delete_filter_text\">حذف پالایهٔ «%1$s»؟</string>\n    <string name=\"dialog_save_profile_changes_message\">می‌خواهید تغییرات نمایه‌تان را ذخیره کنید؟</string>\n    <string name=\"action_view_filter\">دیدن پالایه</string>\n    <string name=\"muting_hashtag_success_format\">خموش کردن برچسب #%1$s به عنوان هشدار</string>\n    <string name=\"unmuting_hashtag_success_format\">ناخموش کردن برچسب #%1$s</string>\n    <string name=\"following_hashtag_success_format\">اکنون برچسب #%1$s دنبال می‌شود</string>\n    <string name=\"unfollowing_hashtag_success_format\">دیگر برچسب #%1$s دنبال نمی‌شود</string>\n    <string name=\"help_empty_conversations\"><b>پیام‌های خصوصیتان</b> که گاهی گفت‌وگوها یا پیام‌های مستقیم نامیده می‌شوند این‌جایند.\n\\n\n\\nپیام‌های خصوصی با تنظیم نمایانی {{public}} فرسته به {{mail}} <i>مستقیم</i> و اشاره به کاربر یا کاربرانی در متن ایجاد می‌شود.\n\\n\n\\nبرای نمونه می‌توانید در نمای نمایهٔ حسابی روی دکمهٔ ایجاد {{edit}} زده و نمایانی را تغییر دهید.\n\\n\n\\nبه خاطر داشته باشید که پیام‌های وب اجتماعی رمزنگاری سرتاسری ندارند. هیچ اطّلاعات حسّاسی را هم‌رسانی نکنید.</string>\n    <string name=\"help_empty_lists\">این <b>نمایهٔ سیاهه‌تان</b> است. می‌توانید تعدادی سیاههٔ خصوصی ایحاد کرده و حساب‌ها را بدان بیفزایید.\n\\n\n\\nبه خاطر داشته باشید که تنها می‌توانید افرادی را که پی می‌گیرید به سیاهه‌هایتان بیفزایید.\n\\n\n\\nاین سیاهه‌ها می‌توانند به عنوان زبانه‌ای در زبانه‌های ترجیحات حساب [iconics gmd_account_circle] [iconics gmd_navigate_next] استفاده شوند.</string>\n    <string name=\"error_blocking_domain\">شکست در خموش کردن %1$s: %2$s</string>\n    <string name=\"error_unblocking_domain\">شکست در ناخموش کردن %1$s: %2$s</string>\n    <string name=\"label_image\">تصویر</string>\n    <string name=\"app_theme_system_black\">استفاده از طرّاحی سامانه (سیاه)</string>\n    <string name=\"title_public_trending_statuses\">فرسته‌های داغ</string>\n    <string name=\"list_reply_policy_none\">هیچ‌کس</string>\n    <string name=\"list_reply_policy_list\">اعضای سیاهه</string>\n    <string name=\"list_reply_policy_followed\">هر کاربر پی‌گرفته</string>\n    <string name=\"list_reply_policy_label\">نمایش پاسخ‌ها به</string>\n    <string name=\"pref_title_show_self_boosts\">نمایش خودتقویت‌ها</string>\n    <string name=\"pref_title_show_self_boosts_description\">کسی فرستهٔ خودش را تقویت می‌کند</string>\n    <string name=\"reply_sending\">فرستادن…</string>\n    <string name=\"reply_sending_long\">پاسختان دارد فرستاده می‌شود.</string>\n    <string name=\"action_translate\">ترجمه</string>\n    <string name=\"action_show_original\">نمایش اصلی</string>\n    <string name=\"report_category_legal\">حقوقی</string>\n    <string name=\"unknown_notification_type\">گونهٔ آگاهی ناشناخته</string>\n    <string name=\"label_translating\">ترجمه کردن…</string>\n    <string name=\"label_translated\">ترجمه شده از %1$s با %2$s</string>\n    <string name=\"ui_error_translate\">نتوانست ترجمه کند: %1$s</string>\n    <string name=\"pref_title_per_timeline_preferences\">ترجیحات بر مبنای خط زمانی</string>\n    <string name=\"pref_title_show_notifications_filter\">نمایش پالایهٔ آگاهی‌ها</string>\n    <string name=\"dialog_follow_warning\">پیگیری این حساب؟</string>\n    <string name=\"pref_title_confirm_follows\">نمایش تأیید پیش از پیگیری</string>\n    <string name=\"url_copied\">نشانی رونوشت شد</string>\n    <string name=\"confirmation_hashtag_copied\">«%1$s» رونوشت شد</string>\n    <string name=\"pref_default_reply_privacy\">محرمانگی پاسخ (همگام نشده با کارساز)</string>\n    <string name=\"error_deleting_filter\">خطا در حذف پالایهٔ «%1$s»</string>\n    <string name=\"error_saving_filter\">خطا در ذخیرهٔ پالایهٔ «%1$s»</string>\n    <string name=\"action_follow_hashtag\">پی‌گیری برچسبی جدید</string>\n    <string name=\"pref_default_reply_privacy_explanation\">محرمانگی پیش‌گزیده به فرسته‌ای که به آن پاسخ می‌دهید بستگی خواهد داشت.</string>\n    <string name=\"post_privacy_direct\">مستقیم</string>\n    <string name=\"pref_match_default_post_privacy\">تطبیق با محرمانگی پیش‌گزیدهٔ فرسته</string>\n    <string name=\"label_expires_after\">انقضا پس از</string>\n    <string name=\"notification_policies_filter_out\">مدیریت آگاهی‌ها از…</string>\n    <string name=\"notification_policies_filter_dont_follow_description\">تا به طور دستی تأییدشان کنید</string>\n    <string name=\"notification_policies_filter_not_following_title\">افرادی که پیتان نمی‌گیرند</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">حساب‌های جدید</string>\n    <string name=\"unknown_notification_filter_new_accounts_description\">ساخته شده در ۳۰ روز اخیر</string>\n    <string name=\"unknown_notification_filter_moderated_accounts\">حساب‌های نظارت شده</string>\n    <string name=\"unknown_notification_filter_moderated_accounts_description\">محدود شده به دست ناظران کارساز</string>\n    <string name=\"filtered_notifications\">آگاهی‌های پالوده</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_title\">اشاره‌های خصوصی ناخواسته</string>\n    <string name=\"notifications_from_people_you_may_know\">آگاهی‌ها از %1$d نفری که ممکن است بشناسید‬</string>\n    <string name=\"notification_policy_accept\">پذیرش</string>\n    <string name=\"notification_policy_filter\">پالایش</string>\n    <string name=\"notification_policy_ignore\">چشم‌پوشی</string>\n    <string name=\"accept_notification_request\">پذیرش درخواست آگاهی</string>\n    <string name=\"dismiss_notification_request\">رد درخواست آگاهی</string>\n    <string name=\"open_settings\">گشودن ترجیحات</string>\n    <string name=\"notifications_from\">آگاهی‌ها از %1$s</string>\n    <string name=\"action_accept_notification_request\">پذیرش</string>\n    <string name=\"action_dismiss_notification_request\">رد کردن</string>\n    <string name=\"notification_policies_title\">سیاست‌های آگاهی</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">افرادی که پی نمی‌گیرید</string>\n    <string name=\"notification_policies_not_supported\">این ویژگی تنها روی کارسازهای ماستودونی که نگارش ۴٫۳ یا بالاتر را اجرا می‌کنند پشتیبانی می‌شود.</string>\n    <string name=\"filtered_notifications_title\">آگاهی‌های پالوده</string>\n    <string name=\"notification_policies_filter_not_following_description\">شامل افرادی که کم‌تر از ۳ روز است پیتان می‌گیرند</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_description\">پالوده مگر در پاسخ به اشارهٔ خودتان بوده یا فرستنده را پی گرفته باشید</string>\n    <string name=\"post_replied\">پاسخ داده</string>\n    <string name=\"post_replied_format\">در پاسخ به %1$s</string>\n    <string name=\"post_replied_self\">رشتهٔ دنباله‌دار</string>\n    <string name=\"follow_hashtag_success\">برچسب دنبال شدهٔ %1$s</string>\n    <string name=\"preview_card_by_author\">از %1$s</string>\n    <string name=\"preview_card_more_by_author\">بیش‌تر از %1$s</string>\n    <string name=\"notification_severed_relationship_name\">قطعی‌های اتّصال</string>\n    <string name=\"notification_moderation_warning_name\">هشدارهای نظارتی</string>\n    <string name=\"notification_unknown_description\">گونهٔ آگاهی ناشناخته</string>\n    <string name=\"notification_channel_other\">دیگر</string>\n    <string name=\"notification_channel_other_description\">دیگر آگاهی‌ها چون هشدارهای نظارتی و قطعی اتّصال</string>\n    <string name=\"notification_channel_admin\">مدیر</string>\n    <string name=\"notification_channel_admin_description\">آگاهی‌های مدیر چون ثبت‌نام‌ها و گزارش‌های جدید</string>\n    <string name=\"relationship_severance_event_title\">اتّصال از دست رفت</string>\n    <plurals name=\"accounts\">\n        <item quantity=\"one\">%1$s حساب</item>\n        <item quantity=\"other\">%1$s حساب</item>\n    </plurals>\n    <string name=\"moderation_warning\">هشدار مدیریتی گرفتید.</string>\n    <string name=\"moderation_warning_action_delete_statuses\">برخی فرسته‌هایتان برداشته شدند.</string>\n    <string name=\"moderation_warning_action_disable\">حسابتان از کار افتاده.</string>\n    <string name=\"relationship_severance_event_account_suspension\">مدیری از %1$s حساب %2$s را معلّق کرد که یعنی دیگر نمی‌تواند به‌روز رسانی‌هایش را گرفته یا با او تعامل کنید.</string>\n    <string name=\"relationship_severance_event_domain_block\">مدیری از %1$s حساب %2$s را از جمله %3$s نفر از پی‌گیرانتان و %4$s نفر از پی‌گرفته‌هایتان مسدود کرد.</string>\n    <string name=\"relationship_severance_event_user_domain_block\">شما %1$s را مسدود کردید که %2$s نفر از پی‌گیران و %3$s نفر از پی‌گرفته‌ّایتان را برداشت.</string>\n    <string name=\"moderation_warning_action_mark_statuses_as_sensitive\">برخی فرسته‌هایتان به عنوان حسّاس علامت خوردند.</string>\n    <string name=\"moderation_warning_action_none\">حسابتان هشدار نظارتی گرفت.</string>\n    <string name=\"moderation_warning_action_sensitive\">زین پس فرسته‌هایتان به عنوان حساس علامت خواهند خورد.</string>\n    <string name=\"moderation_warning_action_silence\">حسابتان محدود شد.</string>\n    <string name=\"moderation_warning_action_suspend\">حسابتان معلّق شد.</string>\n    <string name=\"poll\">نظرسنجی</string>\n    <plurals name=\"media_attachments\">\n        <item quantity=\"one\">%1$s پیوست رسانه‌ای</item>\n        <item quantity=\"other\">%1$s پیوست رسانه‌ای</item>\n    </plurals>\n    <string name=\"notification_info_reply\">پاسخ</string>\n    <string name=\"notification_info_private_mention\">اشارهٔ خصوصی</string>\n    <string name=\"notification_info_mention\">اشاره</string>\n    <string name=\"notification_info_private_reply\">پاسخ خصوصی</string>\n    <string name=\"unknown_notification_type_explanation\">تاسکی گونهٔ این آگاهی را تشخیص نداد و نمی‌تواند نشانش دهد. شاید میانای وب کارسازتان بتواند. لطفاً توسعه‌دهندگان تاسکی را آگاه کنید تا بتوانند پشتیبانی این گونه را بیفزایند!</string>\n    <string name=\"action_reblog_private\">تقویت فقط برای پیگیران</string>\n    <string name=\"action_reblog_public\">تقویت عمومی</string>\n    <string name=\"action_reblog_unlisted\">تقویت سیاهه نشده</string>\n    <string name=\"poll_show_results\">نمایش نتیجه‌ها</string>\n    <string name=\"yes\">بله</string>\n    <string name=\"confirm_dismiss_caption\">دور انداختن تغییرات عنوان؟</string>\n    <string name=\"no\">نه</string>\n    <string name=\"unmute_success\">خموشی %1$s رفع شد</string>\n    <string name=\"mute_failure\">خموش کردن %1$s شکست خورد: %2$s</string>\n    <string name=\"unblock_failure\">رفع کردن مسدودی %1$s شکست خورد: %2$s</string>\n    <string name=\"unmute_failure\">رفع کردن خموشی %1$s شکست خورد: %2$s</string>\n    <string name=\"reject_follow_request_failure\">رد کردن درخواست پی‌گیری %1$s شکست خورد: %2$s</string>\n    <string name=\"unblock_success\">انسداد %1$s رفع شد</string>\n    <string name=\"block_failure\">مسدود کردن %1$s شکست خورد: %2$s</string>\n    <string name=\"accept_follow_request_failure\">پذیرفتن درخواست پی‌گیری %1$s شکست خورد: %2$s</string>\n    <string name=\"filter_action_blur\">تار</string>\n    <string name=\"filter_description_blur\">نهفتن رسانه با هشدار</string>\n    <string name=\"reblog_privacy_followers_only_description\">فقط پی‌گیرانتان می‌توانند تقویتتان را ببینند</string>\n    <string name=\"reblog_confirm\">تقویت این فرسته؟</string>\n    <string name=\"favourite_confirm\">برگزیدن این فرسته؟</string>\n    <string name=\"reblog_privacy_public_description\">همه می‌توانند تقویتتان را ببینند</string>\n    <string name=\"reblog_privacy_unlisted_description\">همانند عمومی ولی هرگز در خط‌های زمانی عمومی نشان داده نخواهد شد</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-fi/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"pref_title_animate_custom_emojis\">Animoi mukautetut emojit</string>\n    <string name=\"pref_title_animate_gif_avatars\">Animoi GIF-avatarit</string>\n    <string name=\"app_theme_system\">Seuraa laitteen teemaa</string>\n    <string name=\"dialog_unfollow_warning\">Lopeta tilin seuraaminen?</string>\n    <string name=\"dialog_delete_post_warning\">Poista tuuttaus?</string>\n    <string name=\"link_whats_an_instance\">Mikä on instanssi?</string>\n    <string name=\"action_copy_link\">Kopioi linkki</string>\n    <string name=\"action_open_in_web\">Avaa selaimessa</string>\n    <string name=\"action_login\">Kirjaudu Tuskylla</string>\n    <string name=\"title_edit_profile\">Muokkaa profiilia</string>\n    <string name=\"draft_deleted\">Luonnos poistettu</string>\n    <string name=\"poll_new_choice_hint\">Vaihtoehto %1$d</string>\n    <string name=\"poll_allow_multiple_choices\">Monivalinta</string>\n    <string name=\"add_poll_choice\">Lisää vaihtoehto</string>\n    <string name=\"duration_7_days\">7 päivää</string>\n    <string name=\"duration_3_days\">3 päivää</string>\n    <string name=\"duration_1_day\">1 päivä</string>\n    <string name=\"duration_6_hours\">6 tuntia</string>\n    <string name=\"duration_1_hour\">1 tunti</string>\n    <string name=\"duration_30_min\">30 minuuttia</string>\n    <string name=\"duration_5_min\">5 minuuttia</string>\n    <string name=\"add_hashtag_title\">Lisää aihetunniste</string>\n    <string name=\"description_post_media_no_description_placeholder\">Ei kuvausta</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"download_failed\">Lataus epäonnistui</string>\n    <string name=\"action_open_post\">Avaa tuuttaus</string>\n    <string name=\"system_default\">Järjestelmän oletus</string>\n    <string name=\"emoji_style\">Emojien tyyli</string>\n    <string name=\"send_post_notification_title\">Lähetetään tuuttausta…</string>\n    <string name=\"compose_save_draft\">Tallennetaanko luonnoksena?</string>\n    <string name=\"lock_account_label\">Lukitse tili</string>\n    <string name=\"add_account_name\">Lisää tili</string>\n    <string name=\"follows_you\">Seuraa sinua</string>\n    <string name=\"about_tusky_account\">Tuskyn profiili</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"description_account_locked\">Lukittu tili</string>\n    <string name=\"notification_subscription_name\">Uudet tuuttaukset</string>\n    <string name=\"notification_follow_request_name\">Seuraamispyynnöt</string>\n    <string name=\"notification_follow_name\">Uudet seuraajat</string>\n    <string name=\"notification_mention_name\">Uudet maininnat</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP-välityspalvelin</string>\n    <string name=\"pref_title_show_replies\">Näytä vastaukset</string>\n    <string name=\"pref_title_app_theme\">Teema</string>\n    <string name=\"search_no_results\">Ei tuloksia</string>\n    <string name=\"hint_content_warning\">Sisältövaroitus</string>\n    <string name=\"hint_compose\">Mitä tapahtuu?</string>\n    <string name=\"hint_domain\">Mikä instanssi?</string>\n    <string name=\"downloading_media\">Ladataan mediaa</string>\n    <string name=\"download_media\">Lataa media</string>\n    <string name=\"action_open_faved_by\">Näytä suosikit</string>\n    <string name=\"action_add_tab\">Lisää välilehti</string>\n    <string name=\"action_schedule_post\">Ajasta tuuttaus</string>\n    <string name=\"action_emoji_keyboard\">Emoji-näppäimistö</string>\n    <string name=\"action_content_warning\">Sisältövaroitus</string>\n    <string name=\"action_access_scheduled_posts\">Ajastetut tuuttaukset</string>\n    <string name=\"action_edit_profile\">Muokkaa profiilia</string>\n    <string name=\"action_hide_media\">Piilota media</string>\n    <string name=\"action_photo_take\">Ota kuva</string>\n    <string name=\"action_add_poll\">Lisää kysely</string>\n    <string name=\"action_add_media\">Lisää media</string>\n    <string name=\"action_view_follow_requests\">Seuraamispyynnöt</string>\n    <string name=\"action_view_blocks\">Estetyt tilit</string>\n    <string name=\"action_view_account_preferences\">Tiliasetukset</string>\n    <string name=\"action_logout\">Kirjaudu ulos</string>\n    <string name=\"post_content_warning_show_less\">Näytä vähemmän</string>\n    <string name=\"post_content_warning_show_more\">Näytä lisää</string>\n    <string name=\"post_media_hidden_title\">Media piilotettu</string>\n    <string name=\"title_follow_requests\">Seuraamispyynnöt</string>\n    <string name=\"title_blocks\">Estetyt tilit</string>\n    <string name=\"title_mutes\">Mykistetyt tilit</string>\n    <string name=\"title_direct_messages\">Viestit</string>\n    <string name=\"account_note_saved\">Tallennettu!</string>\n    <string name=\"edit_poll\">Muokkaa</string>\n    <string name=\"create_poll_title\">Kysely</string>\n    <string name=\"title_accounts\">Tilit</string>\n    <string name=\"button_done\">Valmis</string>\n    <string name=\"button_back\">Takaisin</string>\n    <string name=\"button_continue\">Jatka</string>\n    <string name=\"poll_vote\">Äänestä</string>\n    <string name=\"poll_info_closed\">suljettu</string>\n    <string name=\"notifications_apply_filter\">Suodatin</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"hashtags\">Aihetunnisteet</string>\n    <string name=\"description_visibility_public\">Julkinen</string>\n    <string name=\"pin_action\">Kiinnitä</string>\n    <string name=\"unpin_action\">Poista kiinnitys</string>\n    <string name=\"profile_badge_bot_text\">Botti</string>\n    <string name=\"action_remove\">Poista</string>\n    <string name=\"title_lists\">Listat</string>\n    <string name=\"action_lists\">Listat</string>\n    <string name=\"filter_dialog_update_button\">Päivitä</string>\n    <string name=\"filter_dialog_remove_button\">Poista</string>\n    <string name=\"post_media_audio\">Ääni</string>\n    <string name=\"post_media_video\">Video</string>\n    <string name=\"post_media_images\">Kuvat</string>\n    <string name=\"about_title_activity\">Tietoja</string>\n    <string name=\"pref_title_proxy_settings\">Välityspalvelin</string>\n    <string name=\"post_privacy_followers_only\">Vain seuraajat</string>\n    <string name=\"post_privacy_public\">Julkinen</string>\n    <string name=\"pref_title_post_tabs\">Kotiaikajana</string>\n    <string name=\"pref_title_language\">Kieli</string>\n    <string name=\"pref_title_browser_settings\">Selain</string>\n    <string name=\"app_theme_black\">Musta</string>\n    <string name=\"app_theme_light\">Vaalea</string>\n    <string name=\"app_them_dark\">Tumma</string>\n    <string name=\"pref_title_timeline_filters\">Suodattimet</string>\n    <string name=\"pref_title_timelines\">Aikajanat</string>\n    <string name=\"pref_title_notifications_enabled\">Ilmoitukset</string>\n    <string name=\"pref_title_edit_notification_settings\">Ilmoitukset</string>\n    <string name=\"dialog_download_image\">Lataa</string>\n    <string name=\"label_avatar\">Profiilikuva</string>\n    <string name=\"label_quick_reply\">Vastaa…</string>\n    <string name=\"hint_search\">Hae…</string>\n    <string name=\"hint_note\">Kuvaus</string>\n    <string name=\"title_links_dialog\">Linkit</string>\n    <string name=\"title_mentions_dialog\">Maininnat</string>\n    <string name=\"title_hashtags_dialog\">Aihetunnisteet</string>\n    <string name=\"action_hashtags\">Aihetunnisteet</string>\n    <string name=\"action_mentions\">Maininnat</string>\n    <string name=\"action_links\">Linkit</string>\n    <string name=\"action_reset_schedule\">Nollaa</string>\n    <string name=\"action_access_drafts\">Luonnokset</string>\n    <string name=\"action_search\">Hae</string>\n    <string name=\"action_reject\">Hylkää</string>\n    <string name=\"action_accept\">Hyväksy</string>\n    <string name=\"action_undo\">Peruuta</string>\n    <string name=\"action_edit_own_profile\">Muokkaa</string>\n    <string name=\"action_save\">Tallenna</string>\n    <string name=\"action_mention\">Mainitse</string>\n    <string name=\"action_unmute\">Poista mykistys</string>\n    <string name=\"action_mute\">Mykistä</string>\n    <string name=\"action_share\">Jaa</string>\n    <string name=\"action_view_media\">Media</string>\n    <string name=\"action_view_bookmarks\">Kirjanmerkit</string>\n    <string name=\"action_view_favourites\">Suosikit</string>\n    <string name=\"action_view_preferences\">Asetukset</string>\n    <string name=\"action_view_profile\">Profiili</string>\n    <string name=\"action_close\">Sulje</string>\n    <string name=\"action_retry\">Yritä uudelleen</string>\n    <string name=\"action_send\">TUUT</string>\n    <string name=\"action_delete\">Poista</string>\n    <string name=\"action_edit\">Muokkaa</string>\n    <string name=\"action_report\">Ilmianna</string>\n    <string name=\"action_unblock\">Poista esto</string>\n    <string name=\"action_block\">Estä</string>\n    <string name=\"action_unfollow\">Seurataan</string>\n    <string name=\"action_follow\">Seuraa</string>\n    <string name=\"action_send_public\">TUUT!</string>\n    <string name=\"title_view_thread\">Lanka</string>\n    <string name=\"title_scheduled_posts\">Ajastetut tuuttaukset</string>\n    <string name=\"action_reply\">Vastaa</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"title_licenses\">Lisenssit</string>\n    <string name=\"title_drafts\">Luonnokset</string>\n    <string name=\"title_favourites\">Suosikit</string>\n    <string name=\"title_bookmarks\">Kirjanmerkit</string>\n    <string name=\"title_followers\">Seuraajat</string>\n    <string name=\"title_follows\">Seurataan</string>\n    <string name=\"title_posts_pinned\">Kiinnitetty</string>\n    <string name=\"title_posts\">Julkaisut</string>\n    <string name=\"title_tab_preferences\">Välilehdet</string>\n    <string name=\"title_public_local\">Paikallinen</string>\n    <string name=\"title_notifications\">Ilmoitukset</string>\n    <string name=\"title_home\">Koti</string>\n    <string name=\"action_unfavourite\">Poista suosikki</string>\n    <string name=\"action_open_reblogger\">Avaa jakajan tili</string>\n    <string name=\"action_edit_image\">Muokkaa kuvaa</string>\n    <string name=\"action_view_mutes\">Mykistetyt tilit</string>\n    <string name=\"notification_follow_format\">%1$s seurasi sinua</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d uusi kanssakäyminen</item>\n        <item quantity=\"other\">%1$d uutta kanssakäymistä</item>\n    </plurals>\n    <string name=\"action_delete_and_redraft\">Poista ja kirjoita uudelleen</string>\n    <string name=\"error_media_upload_image_or_video\">Samaan julkaisuun ei voi liittää sekä kuvia että videoita.</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, ja %3$s</string>\n    <string name=\"action_delete_list\">Poista lista</string>\n    <string name=\"action_rename_list\">Muuta listan nimeä</string>\n    <string name=\"error_media_upload_type\">Tällaista tiedostoa ei voida ladata ylös.</string>\n    <string name=\"notification_follow_request_format\">%1$s haluaa seurata sinua</string>\n    <string name=\"title_public_federated\">Verkostoitu</string>\n    <string name=\"error_media_upload_sending\">Lähettäminen epäonnistui.</string>\n    <string name=\"report_username_format\">Ilmianna @%1$s</string>\n    <string name=\"report_comment_hint\">Lisähuomautuksia?</string>\n    <string name=\"error_loading_account_details\">Tilitietojen lataaminen epäonnistui</string>\n    <string name=\"error_media_upload_permission\">Tiedostojen lähettäminen vaatii lukuoikeuden.</string>\n    <string name=\"action_set_caption\">Aseta kuvaus</string>\n    <string name=\"action_bookmark\">Kirjanmerkki</string>\n    <string name=\"action_unmute_domain\">Poista mykistys verkkonimeltä %1$s</string>\n    <string name=\"action_open_as\">Avaa tilinä %1$s</string>\n    <string name=\"action_more\">Enemmän</string>\n    <string name=\"notification_mention_format\">%1$s on maininnut sinut</string>\n    <string name=\"error_media_upload_opening\">Tiedoston lataaminen epäonnistui.</string>\n    <string name=\"notification_reblog_format\">%1$s jakoi julkaisusi</string>\n    <string name=\"error_compose_character_limit\">Julkaisusi on liian pitkä!</string>\n    <string name=\"action_unmute_conversation\">Poista keskustelun mykistys</string>\n    <string name=\"download_image\">Ladataan kuvaa %1$s</string>\n    <string name=\"action_mute_conversation\">Mykistä keskustelu</string>\n    <string name=\"error_generic\">Tapahtui virhe.</string>\n    <string name=\"action_logout_confirm\">Halutako varmasti kirjautua ulos tililtä %1$s1?</string>\n    <string name=\"action_unreblog\">Poista jako</string>\n    <string name=\"action_create_list\">Luo lista</string>\n    <string name=\"action_mute_domain\">Mykistä %1$s</string>\n    <string name=\"action_add_to_list\">Lisää tili listalle</string>\n    <string name=\"action_view_domain_mutes\">Piilotetut verkkonimet</string>\n    <string name=\"notification_favourite_format\">%1$s lisäsi julkaisusi suosikkeihinsa</string>\n    <string name=\"action_open_reblogged_by\">Näytä jaot</string>\n    <string name=\"action_show_reblogs\">Näytä jaetut julkaisut</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s ja %4$d muuta</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Kuvaa näkövammaisille\n\\n(enintään %1$d merkkiä)</item>\n        <item quantity=\"other\"/>\n    </plurals>\n    <string name=\"pick_hashtag_hint\">Aihetunniste ilman #-merkkiä</string>\n    <string name=\"title_domain_mutes\">Piilotetus verkkonimet</string>\n    <string name=\"action_share_as\">Jaa…</string>\n    <string name=\"error_no_web_browser_found\">Verkkoselainta ei löytynyt.</string>\n    <string name=\"action_delete_conversation\">Poista keskustelu</string>\n    <string name=\"action_remove_from_list\">Poista tili listalta</string>\n    <string name=\"notification_subscription_format\">%1$s julkaisi juuri</string>\n    <string name=\"action_quick_reply\">Vastaa nopeasti</string>\n    <string name=\"action_hide_reblogs\">Piilota jaetut julkaisut</string>\n    <string name=\"footer_empty\">Täällä ei ole mitään. Liu\\'uta alaspäin päivittääksesi!</string>\n    <string name=\"error_network\">Verkkovirhe. Tarkista yhteytesi ja yritä uudelleen.</string>\n    <string name=\"action_open_media_n\">Avaa media No. %1$d</string>\n    <string name=\"error_sender_account_gone\">Julkaisun lähettäminen epäonnistui.</string>\n    <string name=\"error_empty\">Tätä kenttää ei voi jättää tyhjäksi.</string>\n    <string name=\"title_announcements\">Tiedotukset</string>\n    <string name=\"notification_subscription_description\">Ilmoitukset seuraamiesi uusista julkaisuista</string>\n    <string name=\"action_favourite\">Lisää suosikiksi</string>\n    <string name=\"error_media_download_permission\">Tiedostojen tallentamiseen vaaditaan kirjoitusoikeus.</string>\n    <string name=\"notification_summary_small\">%1$s ja %2$s</string>\n    <string name=\"error_invalid_domain\">Syöttämäsi verkkonimi on virheellinen</string>\n    <string name=\"action_unmute_desc\">Poista mykistys tililtä %1$s</string>\n    <string name=\"action_compose\">Kirjoita julkaisu</string>\n    <string name=\"hint_search_people_list\">Hae seuraamiasi henkilöitä</string>\n    <string name=\"message_empty\">Täällä ei ole mitään.</string>\n    <string name=\"notification_sign_up_format\">%1$s rekisteröityi</string>\n    <string name=\"notification_sign_up_name\">Rekisteröitymiset</string>\n    <string name=\"notification_sign_up_description\">Ilmoitukset uusista käyttäjistä</string>\n    <string name=\"title_login\">Sisäänkirjautuminen</string>\n    <string name=\"action_unbookmark\">Poista kirjanmerkki</string>\n    <string name=\"duration_90_days\">90 päivää</string>\n    <string name=\"duration_180_days\">180 päivää</string>\n    <string name=\"duration_365_days\">365 päivää</string>\n    <string name=\"error_could_not_load_login_page\">Sisäänkirjautumissivun lataaminen epäonnistui.</string>\n    <string name=\"action_reblog\">Jaa</string>\n    <string name=\"action_toggle_visibility\">Julkaisun näkyvyys</string>\n    <string name=\"title_posts_with_replies\">Vastauksetkin</string>\n    <string name=\"post_boosted_format\">%1$s jakoi</string>\n    <string name=\"post_sensitive_media_title\">Herkkää sisältoä</string>\n    <string name=\"post_sensitive_media_directions\">Klikkaa näyttääksesi</string>\n    <string name=\"post_content_show_more\">Laajenna</string>\n    <string name=\"post_content_show_less\">Vähennä</string>\n    <string name=\"send_post_link_to\">Jaa julkaisun URL…</string>\n    <string name=\"notification_update_format\">%1$s muokkasi julkaisua</string>\n    <string name=\"notification_update_name\">Julkaisujen muokkaukset</string>\n    <string name=\"action_details\">Yksityiskohdat</string>\n    <string name=\"error_image_edit_failed\">Kuvaa ei voitu muokata.</string>\n    <string name=\"description_visibility_unlisted\">Listaamaton</string>\n    <string name=\"dialog_delete_conversation_warning\">Poista tämä keskustelu?</string>\n    <string name=\"pref_title_show_media_preview\">Lataa median esikatselu</string>\n    <string name=\"post_privacy_unlisted\">Listaamaton</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Näytä aina arkaluonteinen media</string>\n    <string name=\"send_post_notification_cancel_title\">Lähettäminen peruutettu</string>\n    <string name=\"description_visibility_private\">Seuraajat</string>\n    <string name=\"pref_show_self_username_always\">Aina</string>\n    <string name=\"pref_show_self_username_never\">Ei koskaan</string>\n    <string name=\"notification_boost_name\">Buustaukset</string>\n    <string name=\"notification_favourite_name\">Suosikit</string>\n    <string name=\"notification_poll_name\">Äänestykset</string>\n    <string name=\"notification_poll_description\">Ilmoitukset päättyneistä äänestyksistä</string>\n    <string name=\"filter_edit_title\">Muokkaa suodatinta</string>\n    <string name=\"action_add_reaction\">lisää reaktio</string>\n    <string name=\"confirmation_reported\">Lähetetty!</string>\n    <string name=\"login_connection\">Yhdistetään…</string>\n    <string name=\"dialog_mute_warning\">Hiljennä @%1$s?</string>\n    <string name=\"dialog_mute_hide_notifications\">Piilota ilmoitukset</string>\n    <string name=\"pref_title_appearance_settings\">Ulkoasu</string>\n    <string name=\"pref_title_show_boosts\">Näytä buustaukset</string>\n    <string name=\"pref_default_media_sensitivity\">Merkitse media aina arkaluontoiseksi</string>\n    <string name=\"pref_failed_to_sync\">Asetusten synkronointi epäonnistui</string>\n    <string name=\"post_text_size_smallest\">Pienin</string>\n    <string name=\"post_text_size_small\">Pieni</string>\n    <string name=\"post_text_size_medium\">Keskikokoinen</string>\n    <string name=\"post_text_size_large\">Suuri</string>\n    <string name=\"post_text_size_largest\">Suurin</string>\n    <string name=\"post_share_link\">Jaa linkki julkaisuun</string>\n    <string name=\"post_media_attachments\">Liitteet</string>\n    <string name=\"title_media\">Media</string>\n    <string name=\"load_more_placeholder_text\">Lataa lisää</string>\n    <string name=\"pref_title_public_filter_keywords\">Julkiset aikajanat</string>\n    <string name=\"pref_title_thread_filter_keywords\">Keskustelut</string>\n    <string name=\"filter_addition_title\">Lisää suodatin</string>\n    <string name=\"later\">Myöhemmin</string>\n    <string name=\"description_post_cw\">Sisältövaroitus: %1$s</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP-välityspalvelin</string>\n    <string name=\"restart\">Käynnistä uudelleen</string>\n    <string name=\"error_failed_app_registration\">Tunnistautuminen valitsemasi instanssin kanssa epäonnistui. Jos tämä jatkuu, valitse valikosta Kirjaudu selaimella.</string>\n    <string name=\"dialog_block_warning\">Estä @%1$s?</string>\n    <string name=\"action_follow_hashtag\">Seuraa uutta aihetunnistetta</string>\n    <string name=\"action_translate\">Käännä</string>\n    <string name=\"action_show_original\">Näytä alkuperäinen</string>\n    <string name=\"send_account_link_to\">Jaa tilin URL…</string>\n    <string name=\"send_account_username_to\">Jaa tilin käyttäjätunnus…</string>\n    <string name=\"url_copied\">URL kopioitu</string>\n    <string name=\"confirmation_hashtag_copied\">\\'#%1$s\\' kopioitu</string>\n    <string name=\"reply_sending\">Lähetetään…</string>\n    <string name=\"reply_sending_long\">Vastaustasi lähetetään.</string>\n    <string name=\"hint_media_description_missing\">Medialla kuuluu olla kuvaus.</string>\n    <string name=\"label_image\">Kuva</string>\n    <string name=\"dialog_message_cancel_follow_request\">Peru seuraamispyyntö?</string>\n    <string name=\"dialog_redraft_post_warning\">Poista ja luonnosta uudelleen?</string>\n    <string name=\"mute_domain_warning\">Haluatko varmasi estää koko instanssin %1$s? Et tule näkemään mitään sisältöä tältä instanssilta julkisilla aikajanoilla etkä ilmoituksissasi. Kaikki seuraajasi tältä instanssilta poistetaan.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Piilota koko domain</string>\n    <string name=\"visibility_unlisted\">Listaamaton: Älä näytä julkisilla aikajanoilla</string>\n    <string name=\"visibility_private\">Vain seuraajat: Näytä vain seuraajillesi</string>\n    <string name=\"visibility_direct\">Suora: Lähetä vain mainituille käyttäjille</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Ilmoita värinällä</string>\n    <string name=\"pref_title_notification_alert_light\">Ilmoita valolla</string>\n    <string name=\"pref_title_notification_filters\">Ilmoita kun</string>\n    <string name=\"pref_title_per_timeline_preferences\">Aikajanakohtaiset asetukset</string>\n    <string name=\"app_theme_auto\">Automaattinen auringonlaskun mukaan</string>\n    <string name=\"pref_title_bot_overlay\">Merkitse bottitilit</string>\n    <string name=\"pref_title_gradient_for_media\">Näytä värikkäät väriliu\\'ut piilotetun median tilalla</string>\n    <string name=\"pref_title_post_filter\">Aikajanasuodatus</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP-välityspalvelimen portti</string>\n    <string name=\"pref_title_http_proxy_port_message\">Portin kuuluu olla %1$d ja %2$d välillä</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Ei käytössä</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;ei annettu&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;virheellinen&gt;</string>\n    <string name=\"pref_default_post_privacy\">Julkaisujen oletusyksityisyys</string>\n    <string name=\"pref_default_post_language\">Julkaisujen oletuskieli</string>\n    <string name=\"pref_default_reply_privacy\">Vastausten oletusyksityisyys</string>\n    <string name=\"pref_publishing\">Julkaisujen oletusasetukset</string>\n    <string name=\"notification_report_name\">Ilmiannot</string>\n    <string name=\"notification_report_description\">Ilmoitukset moderaatioilmiannoista</string>\n    <string name=\"notification_listenable_worker_name\">Taustasuoritus</string>\n    <string name=\"state_follow_requested\">Seuraaminen pyydetty</string>\n    <string name=\"abbreviated_in_years\">%1$d v päästä</string>\n    <string name=\"abbreviated_in_days\">%1$d pv päästä</string>\n    <string name=\"abbreviated_in_hours\">%1$d h päästä</string>\n    <string name=\"abbreviated_in_minutes\">%1$d m päästä</string>\n    <string name=\"error_delete_list\">Listan poistaminen epäonnistui</string>\n    <string name=\"error_muting_hashtag_format\">Virhe mykistäessä #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Virhe lopettaessa aihetunnisteen #%1$s mykistys</string>\n    <string name=\"error_following_hashtags_unsupported\">Tämä instanssi ei tue aihetunnisteiden seuraamista.</string>\n    <string name=\"pref_title_notification_alert_sound\">Ilmoita äänellä</string>\n    <string name=\"action_post_failed\">Lataaminen ylös epäonnistui</string>\n    <string name=\"action_post_failed_show_drafts\">Näytä luonnokset</string>\n    <string name=\"action_dismiss\">Peru</string>\n    <string name=\"status_created_at_now\">nyt</string>\n    <string name=\"notification_unknown_name\">Tuntematon</string>\n    <string name=\"action_discard\">Hylkää muutokset</string>\n    <string name=\"send_post_content_to\">Jaa julkaisu…</string>\n    <string name=\"dialog_message_uploading_media\">Ladataan…</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"pref_title_http_proxy_enable\">Käytä HTTP-välityspalvelinta</string>\n    <string name=\"replying_to\">Vastaus käyttäjälle @%1$s</string>\n    <string name=\"abbreviated_seconds_ago\">%1$d s</string>\n    <string name=\"pref_title_alway_open_spoiler\">Avaa aina julkaisut sisältövaroituksilla</string>\n    <string name=\"error_status_source_load\">Statuksen lataaminen palvelimelta epäonnistui.</string>\n    <string name=\"confirmation_unblocked\">Käyttäjän esto poistettu</string>\n    <string name=\"confirmation_unmuted\">Käyttäjän mykistys poistettu</string>\n    <string name=\"status_filtered_show_anyway\">Näytä kuitenkin</string>\n    <string name=\"error_following_hashtag_format\">Aihetunnisteen #%1$s seuraaminen epäonnistui</string>\n    <string name=\"error_unfollowing_hashtag_format\">Virhe lopettaessa aihetunnisteen #%1$s seuraaminen</string>\n    <string name=\"pref_default_reply_privacy_explanation\">Vastauksen oletusyksityisyysasetus riippuu julkaisusta, johon olet vastaamassa.</string>\n    <string name=\"pref_match_default_post_privacy\">Sama kuin julkaisujen oletusyksityisyysasetus</string>\n    <string name=\"post_privacy_direct\">Suora</string>\n    <string name=\"pref_post_text_size\">Julkaisujen tekstikoko</string>\n    <string name=\"notification_mention_descriptions\">Ilmoitukset uusista maininnoista</string>\n    <string name=\"notification_follow_request_description\">Ilmoitukset seuraamispyynnöistä</string>\n    <string name=\"notification_follow_description\">Ilmoitukset uusista seuraajista</string>\n    <string name=\"notification_boost_description\">Ilmoitukset sinun julkaisujen buustauksista</string>\n    <string name=\"notification_favourite_description\">Ilmoitukset kun sinun julkaisut merkitään suosikiksi</string>\n    <string name=\"notification_listenable_worker_description\">Ilmoitukset kun Tusky toimii taustassa</string>\n    <string name=\"notification_notification_worker\">Noudetaan ilmoituksia…</string>\n    <string name=\"notification_prune_cache\">Välimuistin ylläpito…</string>\n    <string name=\"about_device_info_title\">Laitteesi</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nAndroid-versio: %3$s\n\\nSDK-versio: %4$d</string>\n    <string name=\"about_account_info_title\">Tilisi</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nVersio: %3$s</string>\n    <string name=\"pref_title_account_filter_keywords\">Profiilit</string>\n    <string name=\"about_bug_feature_request_site\">Bugiraportit ja ehodtukset:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_project_site\">Projektin sivusto: https://tusky.app</string>\n    <string name=\"post_share_content\">Jaa julkaisun sisältö</string>\n    <string name=\"post_media_image\">Kuva</string>\n    <string name=\"status_filter_placeholder_label_format\">Suodatettu: %1$s</string>\n    <string name=\"abbreviated_in_seconds\">%1$d s päästä</string>\n    <string name=\"abbreviated_years_ago\">%1$d v</string>\n    <string name=\"abbreviated_days_ago\">%1$d pv</string>\n    <string name=\"abbreviated_hours_ago\">%1$d h</string>\n    <string name=\"abbreviated_minutes_ago\">%1$d m</string>\n    <string name=\"filter_dialog_whole_word\">Koko sana</string>\n    <string name=\"error_create_list\">Listan luonti epäonnistui</string>\n    <string name=\"error_media_upload_sending_fmt\">Tiedoston lataaminen epäonnistui: %1$s</string>\n    <string name=\"account_username_copied\">Käyttäjätunnus kopioitu</string>\n    <string name=\"error_multimedia_size_limit\">Video- tai äänitiedoston koko ei voi ylittää %1$s Mt.</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Julkaisusi lähettäminen epäonnistui ja se tallennettiin luonnoksiin.\n\\n\n\\nPalvelimeen ei saatu yhteyttä tai se hylkäsi julkaisun.</item>\n        <item quantity=\"other\">Julkaisusi lähettäminen epäonnistui ja ne tallennettiin luonnoksiin.\n\\n\n\\nPalvelimeen ei saatu yhteyttä tai se hylkäsi julkaisun.</item>\n    </plurals>\n    <string name=\"dialog_whats_an_instance\">Tähän voit syöttää minkä vaan instanssin osoitteen tai domainin, kuten esimerkiksi mastodon.social, icosahedron.website, social.tchncs.de, ja <a href=\"https://instances.social\">muut!</a> \n\\n \n\\nJos sinulla ei vielä ole tiliä, voit syöttää sen instanssin nimen johon haluat liittyä, ja sitten luoda tilin. \n\\n \n\\nInstanssi on yksittäinen palvelin joka sisältää sinun tilisi, mutta voit helposti kommunikoida muiden kanssa ja seurata muita toisilta instansseilta kuten he olisivat saman sivuston jäseniä. \n\\n \n\\nVoit lukea lisää osoitteesta <a href=\"https://joinmastodon.org\">joinmastodon.org</a>.</string>\n    <string name=\"app_theme_system_black\">Seuraa laitteen teemaa (musta)</string>\n    <string name=\"pref_show_self_username_disambiguate\">Kun olet kirjautunut usealle tilille</string>\n    <string name=\"pref_ui_text_size\">Käyttöliittymän tekstikoko</string>\n    <string name=\"about_tusky_license\">Tusky on avoimen lähdekoodin ohjelmisto, jonka lisenssi on GNU General Public License Version 3. Lue lisenssin sisältö osoitteessa https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <string name=\"dialog_follow_warning\">Seuraa tätä tiliä?</string>\n    <string name=\"error_rename_list\">Listan päivittäminen epäonnistui</string>\n    <string name=\"pref_title_show_self_boosts\">Näytä omien julkaisujen buustaukset</string>\n    <string name=\"pref_title_show_self_boosts_description\">Joku buustaa omaa julkaisuaan</string>\n    <string name=\"add_account_description\">Lisää Mastodon-tili</string>\n    <string name=\"error_deleting_filter\">Suodattimen \\'%1$s\\' poistaminen epäonnistui</string>\n    <string name=\"error_saving_filter\">Suodattimen \\'%1$s\\' tallentaminen epäonnistui</string>\n    <string name=\"title_public_trending_hashtags\">Suositut aihetunnisteet</string>\n    <string name=\"title_public_trending_statuses\">Suositut julkaisut</string>\n    <string name=\"title_followed_hashtags\">Seuratut aihetunnisteet</string>\n    <string name=\"title_edits\">Muokkaukset</string>\n    <string name=\"dialog_follow_hashtag_title\">Seuraa aihetunnistetta</string>\n    <string name=\"post_edited\">Muokattu %1$s</string>\n    <string name=\"notification_report_format\">Uusi ilmianto tilille %1$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d julkaisua liitetty</string>\n    <string name=\"action_browser_login\">Kirjaudu selaimella</string>\n    <string name=\"action_post_failed_do_nothing\">Peru</string>\n    <string name=\"action_share_account_link\">Jaa linkki tiliin</string>\n    <string name=\"action_share_account_username\">Jaa tilin käyttäjätunnus</string>\n    <string name=\"action_continue_edit\">Jatka muokkaamista</string>\n    <string name=\"error_authorization_unknown\">Tuntematon tunnistautumisvirhe. Jos tämä jatkuu, valitse valikosta Kirjaudu selaimella.</string>\n    <string name=\"visibility_public\">Julkinen: Näytä julkisilla aikajanoilla</string>\n    <string name=\"send_media_to\">Jaa media…</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-fr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">Une erreur s’est produite.</string>\n    <string name=\"error_network\">Une erreur réseau s’est produite. Veuillez vérifier votre connexion puis réessayez.</string>\n    <string name=\"error_empty\">Ce champ ne peut pas être vide.</string>\n    <string name=\"error_invalid_domain\">Le domaine saisi est invalide</string>\n    <string name=\"error_failed_app_registration\">Échec d’authentification auprès de l’instance. Si cela continue à se produire, essayez Se connecter avec le navigateur depuis le menu.</string>\n    <string name=\"error_no_web_browser_found\">Impossible de trouver un navigateur web à utiliser.</string>\n    <string name=\"error_authorization_unknown\">Une erreur d’autorisation inconnue s’est produite. Si cela continue à se produire, essayez Se connecter avec le navigateur depuis le menu.</string>\n    <string name=\"error_authorization_denied\">Authentification refusée. Si vous êtes sur·e d\\'avoir entré les bons identifiants, essayez Se connecter avec le navigateur depuis le menu.</string>\n    <string name=\"error_retrieving_oauth_token\">Impossible de récupérer le jeton d’authentification. Si cela continue à se produire, essayez Se connecter avec le navigateur depuis le menu.</string>\n    <string name=\"error_compose_character_limit\">Votre message est trop long !</string>\n    <string name=\"error_media_upload_type\">Ce type de fichier ne peut pas être téléversé.</string>\n    <string name=\"error_media_upload_opening\">Le fichier ne peut pas être ouvert.</string>\n    <string name=\"error_media_upload_permission\">Permission requise pour lire le média.</string>\n    <string name=\"error_media_download_permission\">Permission requise pour enregistrer le média.</string>\n    <string name=\"error_media_upload_image_or_video\">Un même message ne peut contenir à la fois une vidéo et une image.</string>\n    <string name=\"error_media_upload_sending\">Échec d’envoi du média.</string>\n    <string name=\"error_sender_account_gone\">Erreur lors de l’envoi du message.</string>\n    <string name=\"title_home\">Accueil</string>\n    <string name=\"title_notifications\">Notifications</string>\n    <string name=\"title_public_local\">Local</string>\n    <string name=\"title_public_federated\">Global</string>\n    <string name=\"title_direct_messages\">Messages directs</string>\n    <string name=\"title_tab_preferences\">Onglets</string>\n    <string name=\"title_view_thread\">Fil</string>\n    <string name=\"title_posts\">Messages</string>\n    <string name=\"title_posts_with_replies\">Avec réponses</string>\n    <string name=\"title_posts_pinned\">Épinglés</string>\n    <string name=\"title_follows\">Abonnements</string>\n    <string name=\"title_followers\">Abonné·e·s</string>\n    <string name=\"title_favourites\">Favoris</string>\n    <string name=\"title_mutes\">Comptes masqués</string>\n    <string name=\"title_blocks\">Comptes bloqués</string>\n    <string name=\"title_follow_requests\">Demandes d’abonnement</string>\n    <string name=\"title_edit_profile\">Modifier votre profil</string>\n    <string name=\"title_drafts\">Brouillons</string>\n    <string name=\"title_licenses\">Licences</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s a partagé</string>\n    <string name=\"post_sensitive_media_title\">Contenu sensible</string>\n    <string name=\"post_media_hidden_title\">Média caché</string>\n    <string name=\"post_sensitive_media_directions\">Appuyer pour voir</string>\n    <string name=\"post_content_warning_show_more\">Voir plus</string>\n    <string name=\"post_content_warning_show_less\">Voir moins</string>\n    <string name=\"post_content_show_more\">Déplier</string>\n    <string name=\"post_content_show_less\">Replier</string>\n    <string name=\"message_empty\">Rien ici.</string>\n    <string name=\"footer_empty\">Il n’y a aucun pouet ici pour l’instant. Glissez vers le bas pour actualiser !</string>\n    <string name=\"notification_reblog_format\">%1$s a partagé votre message</string>\n    <string name=\"notification_favourite_format\">%1$s a ajouté votre message à ses favoris</string>\n    <string name=\"notification_follow_format\">%1$s vous suit</string>\n    <string name=\"report_username_format\">Signaler @%1$s</string>\n    <string name=\"report_comment_hint\">Commentaires additionnels ?</string>\n    <string name=\"action_quick_reply\">Réponse rapide</string>\n    <string name=\"action_reply\">Répondre</string>\n    <string name=\"action_reblog\">Partager</string>\n    <string name=\"action_unreblog\">Annuler le partage</string>\n    <string name=\"action_favourite\">Favori</string>\n    <string name=\"action_unfavourite\">Supprimer le favori</string>\n    <string name=\"action_more\">Plus</string>\n    <string name=\"action_compose\">Écrire</string>\n    <string name=\"action_login\">Se connecter avec Tusky</string>\n    <string name=\"action_logout\">Déconnexion</string>\n    <string name=\"action_logout_confirm\">Êtes-vous certain·e· de vouloir déconnecter le compte %1$s ? Cela va vider toutes les données locales du compte, incluant brouillons et préférences.</string>\n    <string name=\"action_follow\">Suivre</string>\n    <string name=\"action_unfollow\">Ne plus suivre</string>\n    <string name=\"action_block\">Bloquer</string>\n    <string name=\"action_unblock\">Débloquer</string>\n    <string name=\"action_hide_reblogs\">Cacher les partages</string>\n    <string name=\"action_show_reblogs\">Afficher les partages</string>\n    <string name=\"action_report\">Signaler</string>\n    <string name=\"action_delete\">Supprimer</string>\n    <string name=\"action_send\">POUET</string>\n    <string name=\"action_send_public\">POUET !</string>\n    <string name=\"action_retry\">Réessayer</string>\n    <string name=\"action_close\">Fermer</string>\n    <string name=\"action_view_profile\">Profil</string>\n    <string name=\"action_view_preferences\">Préférences</string>\n    <string name=\"action_view_account_preferences\">Préférences de compte</string>\n    <string name=\"action_view_favourites\">Favoris</string>\n    <string name=\"action_view_mutes\">Comptes masqués</string>\n    <string name=\"action_view_blocks\">Comptes bloqués</string>\n    <string name=\"action_view_follow_requests\">Demandes d’abonnement</string>\n    <string name=\"action_view_media\">Média</string>\n    <string name=\"action_open_in_web\">Ouvrir dans votre navigateur</string>\n    <string name=\"action_add_media\">Ajouter un média</string>\n    <string name=\"action_photo_take\">Prendre une photo</string>\n    <string name=\"action_share\">Partager</string>\n    <string name=\"action_mute\">Masquer</string>\n    <string name=\"action_unmute\">Ne plus masquer</string>\n    <string name=\"action_mention\">Mentionner</string>\n    <string name=\"action_hide_media\">Cacher les médias</string>\n    <string name=\"action_open_drawer\">Ouvrir le menu</string>\n    <string name=\"action_save\">Enregistrer</string>\n    <string name=\"action_edit_profile\">Modifier le profil</string>\n    <string name=\"action_edit_own_profile\">Modifier</string>\n    <string name=\"action_undo\">Annuler</string>\n    <string name=\"action_accept\">Accepter</string>\n    <string name=\"action_reject\">Refuser</string>\n    <string name=\"action_search\">Rechercher</string>\n    <string name=\"action_access_drafts\">Brouillons</string>\n    <string name=\"action_toggle_visibility\">Visibilité du message</string>\n    <string name=\"action_content_warning\">Contenu sensible</string>\n    <string name=\"action_emoji_keyboard\">Clavier d’émojis</string>\n    <string name=\"action_add_tab\">Ajouter un onglet</string>\n    <string name=\"action_links\">Liens</string>\n    <string name=\"action_mentions\">Mentions</string>\n    <string name=\"action_hashtags\">Hashtags</string>\n    <string name=\"action_open_reblogger\">Afficher l’auteur·rice du partage</string>\n    <string name=\"action_open_reblogged_by\">Afficher les partages</string>\n    <string name=\"action_open_faved_by\">Montrer les favoris</string>\n    <string name=\"title_hashtags_dialog\">Hashtags</string>\n    <string name=\"title_mentions_dialog\">Mentions</string>\n    <string name=\"title_links_dialog\">Liens</string>\n    <string name=\"action_open_media_n\">Ouvrir le média #%1$d</string>\n    <string name=\"download_image\">Téléchargement de %1$s</string>\n    <string name=\"action_copy_link\">Copier le lien</string>\n    <string name=\"action_open_as\">Ouvrir comme %1$s</string>\n    <string name=\"action_share_as\">Partager comme …</string>\n    <string name=\"download_media\">Télécharger le média</string>\n    <string name=\"downloading_media\">Téléchargement du média</string>\n    <string name=\"send_post_link_to\">Partager le lien du message avec…</string>\n    <string name=\"send_post_content_to\">Partager le mesage avec…</string>\n    <string name=\"send_media_to\">Partager l’image avec …</string>\n    <string name=\"confirmation_reported\">Envoyé !</string>\n    <string name=\"confirmation_unblocked\">Le compte est débloqué</string>\n    <string name=\"confirmation_unmuted\">Le compte n’est plus masqué</string>\n    <string name=\"hint_domain\">Quelle instance ?</string>\n    <string name=\"hint_compose\">Quoi de neuf ?</string>\n    <string name=\"hint_content_warning\">Contenu sensible</string>\n    <string name=\"hint_display_name\">Nom public</string>\n    <string name=\"hint_note\">Présentation</string>\n    <string name=\"hint_search\">Rechercher…</string>\n    <string name=\"search_no_results\">Aucun résultat</string>\n    <string name=\"label_quick_reply\">Répondre…</string>\n    <string name=\"label_avatar\">Image de profil</string>\n    <string name=\"label_header\">Image d’en-tête</string>\n    <string name=\"link_whats_an_instance\">Qu’est-ce qu’une instance ?</string>\n    <string name=\"login_connection\">Connexion en cours…</string>\n    <string name=\"dialog_whats_an_instance\">Indiquer ici l’adresse ou le domaine d’une instance, comme mastodon.social, icosahedron.website, social.tchncs.de, <a href=\"https://instances.social\">et bien d’autres encore</a> (en anglais) ! \n\\n \n\\nSi vous ne disposez d’aucun compte, vous pouvez renseigner le nom de l’instance que vous souhaitez rejoindre et y créer un compte. \n\\n \n\\nUne instance est l’endroit où votre compte est hébergé, mais vous pouvez facilement suivre des personnes d’autres instances et communiquer avec elles comme si vous étiez sur le même site. \n\\n \n\\nPour plus d’informations, consultez <a href=\"https://joinmastodon.org\">joinmastodon.org</a>.</string>\n    <string name=\"dialog_title_finishing_media_upload\">Mise en ligne des médias</string>\n    <string name=\"dialog_message_uploading_media\">Téléversement en cours…</string>\n    <string name=\"dialog_download_image\">Télécharger</string>\n    <string name=\"dialog_message_cancel_follow_request\">Révoquer la demande d’abonnement ?</string>\n    <string name=\"dialog_unfollow_warning\">Ne plus suivre ce compte ?</string>\n    <string name=\"dialog_delete_post_warning\">Supprimer ce message ?</string>\n    <string name=\"visibility_public\">Public : afficher dans les fils publics</string>\n    <string name=\"visibility_unlisted\">Non listé : ne pas afficher dans les fils publics</string>\n    <string name=\"visibility_private\">Abonné·e·s uniquement : seul·e·s vos abonné·e·s verront vos statuts</string>\n    <string name=\"visibility_direct\">Direct : n’envoyer qu’aux personnes mentionnées</string>\n    <string name=\"pref_title_edit_notification_settings\">Notifications</string>\n    <string name=\"pref_title_notifications_enabled\">Notifications</string>\n    <string name=\"pref_title_notification_alerts\">Alertes</string>\n    <string name=\"pref_title_notification_alert_sound\">Notifier avec un son</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Notifier avec une vibration</string>\n    <string name=\"pref_title_notification_alert_light\">Notifier avec une lumière</string>\n    <string name=\"pref_title_notification_filters\">Me notifier quand</string>\n    <string name=\"pref_title_appearance_settings\">Apparence</string>\n    <string name=\"pref_title_app_theme\">Thème de l’application</string>\n    <string name=\"pref_title_timelines\">Fils chronologiques</string>\n    <string name=\"pref_title_timeline_filters\">Filtres</string>\n    <string name=\"app_them_dark\">Sombre</string>\n    <string name=\"app_theme_light\">Clair</string>\n    <string name=\"app_theme_black\">Noir</string>\n    <string name=\"app_theme_auto\">Basé sur le coucher du soleil</string>\n    <string name=\"app_theme_system\">Utiliser le thème système</string>\n    <string name=\"pref_title_browser_settings\">Navigateur</string>\n    <string name=\"pref_title_custom_tabs\">Utiliser le navigateur intégré</string>\n    <string name=\"pref_title_language\">Langue</string>\n    <string name=\"pref_title_post_filter\">Filtrage des fils</string>\n    <string name=\"pref_title_post_tabs\">Fil principal</string>\n    <string name=\"pref_title_show_boosts\">Afficher les partages</string>\n    <string name=\"pref_title_show_replies\">Afficher les réponses</string>\n    <string name=\"pref_title_show_media_preview\">Montrer les miniatures des médias</string>\n    <string name=\"pref_title_proxy_settings\">Proxy</string>\n    <string name=\"pref_title_http_proxy_settings\">Proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_enable\">Activer le proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_server\">Adresse du proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_port\">Port du proxy HTTP</string>\n    <string name=\"pref_default_post_privacy\">Confidentialité des publications (synchronisée avec le serveur)</string>\n    <string name=\"pref_default_media_sensitivity\">Toujours marquer les médias comme sensibles (synchronisée avec le serveur)</string>\n    <string name=\"pref_publishing\">Réglages par défaut des publications</string>\n    <string name=\"pref_failed_to_sync\">Échec de synchronisation des préférences</string>\n    <string name=\"post_privacy_public\">Public</string>\n    <string name=\"post_privacy_unlisted\">Non listé</string>\n    <string name=\"post_privacy_followers_only\">Abonné·e·s uniquement</string>\n    <string name=\"pref_post_text_size\">Taille du texte des messages</string>\n    <string name=\"post_text_size_smallest\">Plus petit</string>\n    <string name=\"post_text_size_small\">Petit</string>\n    <string name=\"post_text_size_medium\">Moyen</string>\n    <string name=\"post_text_size_large\">Grand</string>\n    <string name=\"post_text_size_largest\">Plus grand</string>\n    <string name=\"notification_mention_name\">Nouvelles mentions</string>\n    <string name=\"notification_mention_descriptions\">Notifications pour les nouvelles mentions</string>\n    <string name=\"notification_follow_name\">Nouveaux abonnés</string>\n    <string name=\"notification_follow_description\">Notifications pour les nouveaux abonnés</string>\n    <string name=\"notification_boost_name\">Partages</string>\n    <string name=\"notification_boost_description\">Notifications quand vos messages sont partagés</string>\n    <string name=\"notification_favourite_name\">Favoris</string>\n    <string name=\"notification_favourite_description\">Notifications quand vos messages sont mis en favoris</string>\n    <string name=\"notification_mention_format\">%1$s vous a mentionné</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s et %4$d autres</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s et %3$s</string>\n    <string name=\"notification_summary_small\">%1$s et %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d nouvelle interaction</item>\n        <item quantity=\"many\">%1$d nouvelles interactions</item>\n        <item quantity=\"other\">%1$d nouvelles interactions</item>\n    </plurals>\n    <string name=\"description_account_locked\">Compte verrouillé</string>\n    <string name=\"about_title_activity\">À propos</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_tusky_license\">Tusky est une application libre et open source. Elle est publiée sous licence publique générale GNU version 3. Vous pouvez consulter la licence ici : https://www.gnu.org/licenses/gpl-3.0.fr.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">Site du projet : https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Rapports d’anomalies &amp; demandes de fonctionnalités :\n\\n https://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Profil de Tusky</string>\n    <string name=\"post_share_content\">Partager le contenu du message</string>\n    <string name=\"post_share_link\">Partager le lien du message</string>\n    <string name=\"post_media_images\">Images</string>\n    <string name=\"post_media_video\">Vidéo</string>\n    <string name=\"state_follow_requested\">Demande d’abonnement effectuée</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">dans %1$da</string>\n    <string name=\"abbreviated_in_days\">dans %1$dj</string>\n    <string name=\"abbreviated_in_hours\">dans %1$dh</string>\n    <string name=\"abbreviated_in_minutes\">dans %1$dm</string>\n    <string name=\"abbreviated_in_seconds\">dans %1$ds</string>\n    <string name=\"abbreviated_years_ago\">%1$d a</string>\n    <string name=\"abbreviated_days_ago\">%1$dj</string>\n    <string name=\"abbreviated_hours_ago\">%1$d h</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"follows_you\">Vous suit</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Toujours afficher les médias sensibles</string>\n    <string name=\"title_media\">Média</string>\n    <string name=\"replying_to\">Réponse à @%1$s</string>\n    <string name=\"load_more_placeholder_text\">Charger plus</string>\n    <string name=\"pref_title_public_filter_keywords\">Fils publics</string>\n    <string name=\"pref_title_thread_filter_keywords\">Conversations</string>\n    <string name=\"filter_addition_title\">Ajouter un filtre</string>\n    <string name=\"filter_edit_title\">Modifier un filtre</string>\n    <string name=\"filter_dialog_remove_button\">Supprimer</string>\n    <string name=\"filter_dialog_update_button\">Mettre à jour</string>\n    <string name=\"filter_add_description\">Phrase à filtrer</string>\n    <string name=\"add_account_name\">Ajouter un compte</string>\n    <string name=\"add_account_description\">Ajouter un nouveau compte Mastodon</string>\n    <string name=\"action_lists\">Listes</string>\n    <string name=\"title_lists\">Listes</string>\n    <string name=\"error_create_list\">Impossible de créer la liste</string>\n    <string name=\"error_rename_list\">Impossible de modifier la liste</string>\n    <string name=\"error_delete_list\">Impossible de supprimer la liste</string>\n    <string name=\"action_create_list\">Créer une liste</string>\n    <string name=\"action_rename_list\">Renommer la liste</string>\n    <string name=\"action_delete_list\">Supprimer la liste</string>\n    <string name=\"hint_search_people_list\">Chercher des personnes que vous suivez</string>\n    <string name=\"action_add_to_list\">Ajouter un compte à la liste</string>\n    <string name=\"action_remove_from_list\">Supprimer un compte de la liste</string>\n    <string name=\"compose_active_account_description\">Publier en tant que %1$s</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Décrire pour les malvoyants (%1$d caractère maximum)</item>\n        <item quantity=\"many\"/>\n        <item quantity=\"other\">Décrire pour les malvoyants (%1$d caractères maximum)</item>\n    </plurals>\n    <string name=\"action_set_caption\">Mettre une légende</string>\n    <string name=\"action_remove\">Supprimer le média</string>\n    <string name=\"lock_account_label\">Verrouiller le compte</string>\n    <string name=\"lock_account_label_description\">Vous devez approuver manuellement les abonnements</string>\n    <string name=\"compose_save_draft\">Enregistrer comme brouillon ?</string>\n    <string name=\"send_post_notification_title\">Envoi du message…</string>\n    <string name=\"send_post_notification_error_title\">Erreur lors de l’envoi du message</string>\n    <string name=\"send_post_notification_channel_name\">Envoi des messages</string>\n    <string name=\"send_post_notification_cancel_title\">Envoi annulé</string>\n    <string name=\"send_post_notification_saved_content\">Une copie du message a été sauvegardée dans vos brouillons</string>\n    <string name=\"action_compose_shortcut\">Écrire</string>\n    <string name=\"error_no_custom_emojis\">Votre instance %1$s n’a pas d’émojis personnalisés</string>\n    <string name=\"emoji_style\">Style d’émojis</string>\n    <string name=\"system_default\">Par défaut du système</string>\n    <string name=\"download_fonts\">Vous devez commencer par télécharger ces jeux d’émojis</string>\n    <string name=\"performing_lookup_title\">Recherche en cours…</string>\n    <string name=\"expand_collapse_all_posts\">Déplier/replier tout les messages</string>\n    <string name=\"action_open_post\">Ouvrir le message</string>\n    <string name=\"restart_required\">Un redémarrage de l’application est nécessaire</string>\n    <string name=\"restart_emoji\">Vous devrez redémarrer Tusky pour appliquer ces modifications</string>\n    <string name=\"later\">Plus tard</string>\n    <string name=\"restart\">Redémarrer</string>\n    <string name=\"caption_systememoji\">Votre jeu d’émojis par défaut</string>\n    <string name=\"caption_blobmoji\">Un jeu d’émojis basé sur les émojis « blob »</string>\n    <string name=\"caption_twemoji\">Le jeu d’émojis standard de Mastodon</string>\n    <string name=\"download_failed\">Échec du téléchargement</string>\n    <string name=\"profile_badge_bot_text\">Robot</string>\n    <string name=\"account_moved_description\">%1$s a déménagé vers :</string>\n    <string name=\"reblog_private\">Partager à l’audience originale</string>\n    <string name=\"unreblog_private\">Annuler le partage</string>\n    <string name=\"license_description\">Tusky contient du code et des ressources issus des projets open source suivants :</string>\n    <string name=\"license_apache_2\">Sous licence Apache (copie ci-dessous)</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">Métadonnées du profil</string>\n    <string name=\"profile_metadata_add\">Ajouter des données</string>\n    <string name=\"profile_metadata_label_label\">Étiquette</string>\n    <string name=\"profile_metadata_content_label\">Contenu</string>\n    <string name=\"pref_title_absolute_time\">Utiliser le format de temps absolu</string>\n    <string name=\"label_remote_account\">Les informations ci-dessous peuvent ne pas refléter le profil complet de l’utilisateur. Appuyez pour ouvrir le profil complet dans le navigateur.</string>\n    <string name=\"unpin_action\">Détacher</string>\n    <string name=\"pin_action\">Épingler</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> Favori</item>\n        <item quantity=\"many\"><b>%1$s</b> de favoris</item>\n        <item quantity=\"other\"><b>%1$s</b> Favoris</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> Partage</item>\n        <item quantity=\"many\"><b>%1$s</b> de partages</item>\n        <item quantity=\"other\"><b>%1$s</b> Partages</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">Partagé par</string>\n    <string name=\"title_favourited_by\">Mis en favoris par</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s et %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s et %3$d autres</string>\n    <string name=\"description_post_media\">Média : %1$s</string>\n    <string name=\"description_post_cw\">Avertissement : %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Aucune description</string>\n    <string name=\"description_post_reblogged\">Partagé</string>\n    <string name=\"description_post_favourited\">Mis en favoris</string>\n    <string name=\"description_visibility_public\">Public</string>\n    <string name=\"description_visibility_unlisted\">Non listé</string>\n    <string name=\"description_visibility_private\">Abonné·e·s</string>\n    <string name=\"description_visibility_direct\">Direct</string>\n    <string name=\"hint_list_name\">Nom de la liste</string>\n    <string name=\"pick_hashtag_hint\">Hashtag sans #</string>\n    <string name=\"notifications_clear\">Supprimer</string>\n    <string name=\"notifications_apply_filter\">Filtrer</string>\n    <string name=\"filter_apply\">Appliquer</string>\n    <string name=\"compose_shortcut_long_label\">Écrire un message</string>\n    <string name=\"compose_shortcut_short_label\">Écrire</string>\n    <string name=\"pref_title_bot_overlay\">Afficher l\\'indicateur de robots</string>\n    <string name=\"notification_clear_text\">Désirez-vous nettoyer toutes vos notifications de façon permanente ?</string>\n    <string name=\"action_delete_and_redraft\">Effacer et ré-écrire</string>\n    <string name=\"dialog_redraft_post_warning\">Effacer et ré-écrire ce message ?</string>\n    <string name=\"poll_info_time_absolute\">Terminera à %1$s</string>\n    <string name=\"poll_info_closed\">Terminé</string>\n    <string name=\"poll_vote\">Voter</string>\n    <string name=\"notification_poll_name\">Sondages</string>\n    <string name=\"notification_poll_description\">Notifications pour les sondages terminés</string>\n    <string name=\"poll_ended_created\">Un sondage que vous avez créé est terminé</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d jour restant</item>\n        <item quantity=\"many\">%1$d jours restants</item>\n        <item quantity=\"other\">%1$d jours restants</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d heure restante</item>\n        <item quantity=\"many\">%1$d heures restantes</item>\n        <item quantity=\"other\">%1$d heures restantes</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d minute restante</item>\n        <item quantity=\"many\">%1$d minutes restantes</item>\n        <item quantity=\"other\">%1$d minutes restantes</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d seconde restante</item>\n        <item quantity=\"many\">%1$d secondes restantes</item>\n        <item quantity=\"other\">%1$d secondes restantes</item>\n    </plurals>\n    <string name=\"pref_title_animate_gif_avatars\">Activer l’animation des avatars</string>\n    <string name=\"compose_preview_image_description\">Actions pour l’image %1$s</string>\n    <string name=\"poll_info_format\"> \\u0020<!-- 15 votes • 1 heure restante --> %1$s • %2$s</string>\n    <string name=\"poll_ended_voted\">Un sondage auquel vous avez participé vient de se terminer</string>\n    <string name=\"description_poll\">Sondage avec des choix : %1$s, %2$s, %3$s, %4$s ; %5$s</string>\n    <string name=\"title_domain_mutes\">Domaines cachés</string>\n    <string name=\"action_view_domain_mutes\">Domaines cachés</string>\n    <string name=\"action_mute_domain\">Masquer %1$s</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s n’est plus masqué·e</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Masquer le domaine entier</string>\n    <string name=\"caption_notoemoji\">L’ensemble d’émojis actuel de Google</string>\n    <string name=\"button_continue\">Continuer</string>\n    <string name=\"button_back\">Retour</string>\n    <string name=\"report_sent_success\">\\@%1$s signalé avec succès</string>\n    <string name=\"hint_additional_info\">Commentaires additionnels</string>\n    <string name=\"report_remote_instance\">Transférer à %1$s</string>\n    <string name=\"failed_report\">Échec du signalement</string>\n    <string name=\"failed_fetch_posts\">Échec de récupération des messages</string>\n    <string name=\"report_description_1\">Le rapport sera envoyé aux modérateur·rice·s de votre instance. Vous pouvez expliquer pourquoi vous signalez le compte ci-dessous :</string>\n    <string name=\"mute_domain_warning\">Êtes-vous sûr⋅e de vouloir bloquer %1$s en entier ? Vous ne verrez plus de contenu provenant de ce domaine, ni dans les fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s.</string>\n    <string name=\"button_done\">Terminé</string>\n    <string name=\"report_description_remote_instance\">Le compte provient d’un autre serveur. Envoyez également une copie anonyme du rapport ?</string>\n    <string name=\"filter_dialog_whole_word\">Mot entier</string>\n    <string name=\"filter_dialog_whole_word_description\">Un mot-clé ou une phrase alphanumérique sera appliqué·e seulement s’il ou elle correspond au mot entier</string>\n    <string name=\"title_accounts\">Comptes</string>\n    <string name=\"failed_search\">Échec de la recherche</string>\n    <string name=\"pref_title_alway_open_spoiler\">Toujours ouvrir les messages ayant un contenu sensible</string>\n    <string name=\"action_add_poll\">Ajouter un sondage</string>\n    <string name=\"create_poll_title\">Sondage</string>\n    <string name=\"duration_5_min\">5 minutes</string>\n    <string name=\"duration_30_min\">30 minutes</string>\n    <string name=\"duration_1_hour\">1 heure</string>\n    <string name=\"duration_6_hours\">6 heures</string>\n    <string name=\"duration_1_day\">1 jour</string>\n    <string name=\"duration_3_days\">3 jours</string>\n    <string name=\"duration_7_days\">7 jours</string>\n    <string name=\"add_poll_choice\">Ajouter un choix</string>\n    <string name=\"poll_allow_multiple_choices\">Choix multiples</string>\n    <string name=\"poll_new_choice_hint\">Choix %1$d</string>\n    <string name=\"edit_poll\">Modifier</string>\n    <string name=\"title_scheduled_posts\">Pouets planifiés</string>\n    <string name=\"action_edit\">Modifier</string>\n    <string name=\"action_access_scheduled_posts\">Messages programmés</string>\n    <string name=\"action_schedule_post\">Planifier le message</string>\n    <string name=\"action_reset_schedule\">Réinitialiser</string>\n    <string name=\"post_lookup_error_format\">Erreur lors de la recherche du post %1$s</string>\n    <string name=\"about_powered_by_tusky\">Propulsé par Tusky</string>\n    <string name=\"title_bookmarks\">Signets</string>\n    <string name=\"action_bookmark\">Signet</string>\n    <string name=\"action_view_bookmarks\">Signets</string>\n    <string name=\"description_post_bookmarked\">Ajouté aux signets</string>\n    <string name=\"select_list_title\">Sélectionner la liste</string>\n    <string name=\"list\">Liste</string>\n    <string name=\"no_drafts\">Vous n’avez aucun brouillon.</string>\n    <string name=\"no_scheduled_posts\">Vous n’avez aucun message planifié.</string>\n    <string name=\"warning_scheduling_interval\">L’intervalle minimum de planification sur Mastodon est de 5 minutes.</string>\n    <string name=\"notification_follow_request_name\">Demandes d\\'abonnement</string>\n    <string name=\"dialog_block_warning\">Bloquer @%1$s ?</string>\n    <string name=\"pref_title_confirm_reblogs\">Demander confirmation avant de partager</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Afficher les aperçus des liens dans les fils</string>\n    <string name=\"notification_follow_request_format\">%1$s vous a envoyé une demande d’abonnement</string>\n    <string name=\"notification_follow_request_description\">Notifications à propos des demandes d’abonnement</string>\n    <string name=\"dialog_mute_warning\">Mettre en sourdine @%1$s ?</string>\n    <string name=\"action_unmute_conversation\">Enlever la sourdine à la conversation</string>\n    <string name=\"action_mute_conversation\">Masquer la conversation</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Activer le glissement pour changer d’onglet</string>\n    <string name=\"hashtags\">Hashtags</string>\n    <string name=\"add_hashtag_title\">Ajouter un hashtag</string>\n    <string name=\"pref_title_gradient_for_media\">Afficher des dégradés en couleur pour les médias cachés</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Bas</string>\n    <string name=\"pref_main_nav_position_option_top\">Haut</string>\n    <string name=\"pref_main_nav_position\">Position de navigation principale</string>\n    <string name=\"action_unmute_domain\">Ne plus masquer %1$s</string>\n    <string name=\"dialog_mute_hide_notifications\">Cacher les notifications</string>\n    <string name=\"action_unmute_desc\">Ne plus masquer %1$s</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s personne</item>\n        <item quantity=\"many\">%1$s personnes</item>\n        <item quantity=\"other\">%1$s personnes</item>\n    </plurals>\n    <string name=\"pref_title_hide_top_toolbar\">Cacher le titre de la barre d’outils supérieure</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s voix</item>\n        <item quantity=\"many\">%1$s voix</item>\n        <item quantity=\"other\">%1$s voix</item>\n    </plurals>\n    <string name=\"account_note_saved\">Sauvegardé !</string>\n    <string name=\"account_note_hint\">Votre note privée sur ce compte</string>\n    <string name=\"no_announcements\">Il n’y a pas d’annonce.</string>\n    <string name=\"title_announcements\">Annonces</string>\n    <string name=\"wellbeing_mode_notice\">Certaines informations susceptibles d’affecter votre bien-être mental seront cachées. Il s’agit :\n\\n\n\\n - des notifications de favoris, de partage et de suivi\n\\n - du nombre des favoris/partages des messages\n\\n - des statistiques sur les profils\n\\n\n\\n Les notifications « push » ne seront pas affectées, mais vous pouvez revoir vos préférences de notification manuellement.</string>\n    <string name=\"notification_subscription_format\">%1$s vient de publier</string>\n    <string name=\"review_notifications\">Examiner les notifications</string>\n    <string name=\"notification_subscription_name\">Nouveaux messages</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Vous ne pouvez pas téléverser plus d’ %1$d pièce jointe.</item>\n        <item quantity=\"many\">Vous ne pouvez pas téléverser plus de %1$d pièces jointes.</item>\n        <item quantity=\"other\">Vous ne pouvez pas téléverser plus de %1$d pièces jointes.</item>\n    </plurals>\n    <string name=\"pref_title_wellbeing_mode\">Bien-être</string>\n    <string name=\"notification_subscription_description\">Notifications quand quelqu’un que vous suivez publie un nouveau message</string>\n    <string name=\"limit_notifications\">Limiter les notifications du fil</string>\n    <string name=\"wellbeing_hide_stats_profile\">Cacher les statistiques quantitatives sur les profils</string>\n    <string name=\"wellbeing_hide_stats_posts\">Cacher les statistiques quantitatives sur les messages</string>\n    <string name=\"action_unbookmark\">Supprimer le signet</string>\n    <string name=\"post_media_attachments\">Pièces jointes</string>\n    <string name=\"dialog_delete_list_warning\">Voulez-vous vraiment supprimer la liste %1$s ?</string>\n    <string name=\"action_subscribe_account\">S’abonner</string>\n    <string name=\"dialog_delete_conversation_warning\">Supprimer cette conversation ?</string>\n    <string name=\"pref_title_animate_custom_emojis\">Animer les émojis personnalisés</string>\n    <string name=\"draft_deleted\">Brouillon supprimé</string>\n    <string name=\"label_duration\">Durée</string>\n    <string name=\"duration_indefinite\">Indéfinie</string>\n    <string name=\"action_unsubscribe_account\">Se désabonner</string>\n    <string name=\"action_delete_conversation\">Supprimer la conversation</string>\n    <string name=\"post_media_audio\">Audio</string>\n    <string name=\"pref_title_confirm_favourites\">Demander confirmation avant de mettre en favoris</string>\n    <string name=\"drafts_post_reply_removed\">Le message auquel répondait ce brouillon a été supprimé</string>\n    <string name=\"drafts_post_failed_to_send\">Échec d’envoi du message !</string>\n    <string name=\"follow_requests_info\">Bien que votre compte ne soit pas verrouillé, l’équipe de %1$s a pensé que vous voudriez valider manuellement les demandes de d’abonnement provenant de ces comptes.</string>\n    <string name=\"drafts_failed_loading_reply\">Échec du chargement des informations de réponse</string>\n    <string name=\"duration_30_days\">30 jours</string>\n    <string name=\"duration_60_days\">60 jours</string>\n    <string name=\"duration_90_days\">90 jours</string>\n    <string name=\"duration_365_days\">365 jours</string>\n    <string name=\"duration_14_days\">14 jours</string>\n    <string name=\"duration_180_days\">180 jours</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Rédiger un message</string>\n    <string name=\"notification_sign_up_format\">%1$s a créé un compte</string>\n    <string name=\"notification_sign_up_name\">Nouveaux comptes</string>\n    <string name=\"notification_sign_up_description\">Notifications quand quelqu’un crée un nouveau compte</string>\n    <string name=\"notification_update_format\">%1$s a modifié son message</string>\n    <string name=\"notification_update_name\">Messages modifiés</string>\n    <string name=\"notification_update_description\">Notifications quand un message avec lequel vous avez interagi est modifié</string>\n    <string name=\"title_login\">Se connecter</string>\n    <string name=\"account_date_joined\">Ici depuis %1$s</string>\n    <string name=\"action_details\">Détails</string>\n    <string name=\"saving_draft\">Sauvegarde du brouillon …</string>\n    <string name=\"status_count_one_plus\">&gt;1</string>\n    <string name=\"error_could_not_load_login_page\">La page de connexion ne peut être chargée.</string>\n    <string name=\"action_edit_image\">Retoucher l’image</string>\n    <string name=\"action_dismiss\">Fermer</string>\n    <string name=\"error_image_edit_failed\">L\\'image n’a pas pu être modifiée.</string>\n    <string name=\"delete_scheduled_post_warning\">Supprimer ce message planifié ?</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"pref_show_self_username_always\">Toujours</string>\n    <string name=\"pref_show_self_username_never\">Jamais</string>\n    <string name=\"description_post_language\">Langue du message</string>\n    <string name=\"duration_no_change\">(Aucune modification)</string>\n    <string name=\"action_add_reaction\">ajouter une réaction</string>\n    <string name=\"instance_rule_title\">%1$s règles</string>\n    <string name=\"a11y_label_loading_thread\">Chargement du fil</string>\n    <string name=\"error_following_hashtags_unsupported\">Cette instance ne prend pas en charge le suivi des hashtags.</string>\n    <string name=\"error_muting_hashtag_format\">Une erreur est survenue en masquant #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Une erreur est survenue en arrêtant de masquer #%1$s</string>\n    <string name=\"error_following_hashtag_format\">Une erreur est survenue en suivant #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Une erreur est survenue en arrêtant de suivre #%1$s</string>\n    <string name=\"action_add_or_remove_from_list\">Ajouter à ou retirer de la liste</string>\n    <string name=\"failed_to_remove_from_list\">Le compte n\\'a pas pu être retiré de la liste</string>\n    <string name=\"failed_to_add_to_list\">Le compte n\\'a pas pu être ajouté à la liste</string>\n    <string name=\"dialog_follow_hashtag_title\">Suivre un hashtag</string>\n    <string name=\"hint_media_description_missing\">Le contenu média devrait être décrit.</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;invalide&gt;</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Désactivé</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;non spécifié&gt;</string>\n    <string name=\"title_edits\">Modifications</string>\n    <string name=\"pref_default_post_language\">Langue de publication (synchronisée avec le serveur)</string>\n    <string name=\"error_multimedia_size_limit\">Les fichiers vidéo et audio ne peuvent pas dépasser %1$s Mo.</string>\n    <string name=\"pref_title_http_proxy_port_message\">Le port doit être entre %1$d et %2$d</string>\n    <string name=\"action_set_focus\">Définir le point focal</string>\n    <string name=\"post_media_image\">Image</string>\n    <string name=\"pref_show_self_username_disambiguate\">Quand plusieurs comptes sont connectés</string>\n    <string name=\"action_post_failed\">Le téléversement a échoué</string>\n    <string name=\"action_post_failed_show_drafts\">Afficher les brouillons</string>\n    <string name=\"action_post_failed_do_nothing\">Ignorer</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"notification_report_format\">Nouveau signalement sur %1$s</string>\n    <string name=\"notification_header_report_format\">%1$s a signalé %2$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d posts joints</string>\n    <string name=\"notification_report_name\">Signalements</string>\n    <string name=\"set_focus_description\">Appuyez ou faites glissez le cercle pour déplacer le point focal, qui sera toujours visible sur les vignettes.</string>\n    <string name=\"notification_unknown_name\">Inconnu</string>\n    <string name=\"action_browser_login\">Se connecter avec le navigateur</string>\n    <string name=\"send_account_link_to\">Partager le lien du compte avec…</string>\n    <string name=\"account_username_copied\">Nom de compte copié</string>\n    <string name=\"action_discard\">Abandonner les modifications</string>\n    <string name=\"action_continue_edit\">Continuer à modifier</string>\n    <string name=\"confirmation_hashtag_unfollowed\">#%1$s n\\'est plus suivi</string>\n    <string name=\"post_edited\">Modifié le %1$s</string>\n    <string name=\"notification_report_description\">Notifications à propos des signalements</string>\n    <string name=\"action_share_account_link\">Partager le lien du compte</string>\n    <string name=\"action_share_account_username\">Partager le nom du compte</string>\n    <string name=\"title_followed_hashtags\">Hashtags suivis</string>\n    <string name=\"pref_title_account_filter_keywords\">Profils</string>\n    <string name=\"status_filtered_show_anyway\">Montrer quand même</string>\n    <string name=\"status_filter_placeholder_label_format\">Caché : %1$s</string>\n    <string name=\"title_public_trending_hashtags\">Hashtags tendance</string>\n    <string name=\"send_account_username_to\">Partager le nom du compte avec…</string>\n    <string name=\"status_created_at_now\">maintenant</string>\n    <string name=\"error_loading_account_details\">Les détails du compte n\\'ont pas pu être chargés</string>\n    <string name=\"instance_rule_info\">En vous connectant vous acceptez de vous tenir aux règles de %1$s.</string>\n    <string name=\"pref_title_reading_order\">Ordre de lecture</string>\n    <string name=\"pref_reading_order_oldest_first\">Les plus vieux en premier</string>\n    <string name=\"pref_reading_order_newest_first\">Les plus récents en premier</string>\n    <string name=\"action_unfollow_hashtag_format\">Arrêter de suivre #%1$s ?</string>\n    <string name=\"failed_to_pin\">Échec de l\\'épinglage</string>\n    <string name=\"status_edit_info\">Modification : %1$s</string>\n    <string name=\"status_created_info\">Création : %1$s</string>\n    <string name=\"compose_save_draft_loses_media\">Enregistrer comme brouillon ? (Les pièces jointes seront à nouveau téléchargées lorsque le brouillon sera réouvert.)</string>\n    <string name=\"no_lists\">Vous n\\'avez aucune liste.</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"report_category_spam\">Spam</string>\n    <string name=\"report_category_other\">Autre</string>\n    <string name=\"total_accounts\">comptes</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Le statut n\\'a pas pu être publié, il a été sauvegardé dans les brouillons.\n\\n\n\\nLe serveur n\\'est pas joignable, ou celui-ci a refusé la publication.</item>\n        <item quantity=\"many\"/>\n        <item quantity=\"other\">Les status n\\'ont pas pu être publiés, ils ont été sauvegardés dans les brouillons.\n\\n\n\\nLe serveur n\\'est pas joignable, ou celui-ci a refusé la publication.</item>\n    </plurals>\n    <string name=\"action_refresh\">Actualiser</string>\n    <string name=\"failed_to_unpin\">Échec du détachement</string>\n    <string name=\"pref_title_show_self_username\">Montrer le nom d\\'utilisateur dans la barre d\\'outils</string>\n    <string name=\"socket_timeout_exception\">La connexion à votre serveur a pris trop longtemps</string>\n    <string name=\"ui_error_bookmark\">Échec de l\\'ajout aux signets : %1$s</string>\n    <string name=\"ui_error_vote\">Échec du vote : %1$s</string>\n    <string name=\"ui_error_reblog\">Échec lors du partage de la publication : %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">N\\'a pas pu accepter la demande d\\'abonnement : %1$s</string>\n    <string name=\"ui_error_reject_follow_request\">N\\'a pas pu rejeter la demande d\\'abonnement : %1$s</string>\n    <string name=\"ui_success_accepted_follow_request\">Demande d\\'abonnement acceptée</string>\n    <string name=\"ui_success_rejected_follow_request\">Demande d\\'abonnement rejetée</string>\n    <string name=\"description_login\">Fonctionne dans la plupart des cas. Aucune autre application n\\'aura accès à vos données.</string>\n    <string name=\"description_browser_login\">Peut permettre des méthodes d\\'authentification supplémentaires, mais un navigateur compatible est nécessaire.</string>\n    <string name=\"mute_notifications_switch\">Masquer les notifications</string>\n    <string name=\"compose_unsaved_changes\">Il y a des modifications non enregistrées.</string>\n    <string name=\"description_post_edited\">Modifié</string>\n    <string name=\"select_list_manage\">Gérer les listes</string>\n    <string name=\"report_category_violation\">Règle enfreinte</string>\n    <string name=\"error_status_source_load\">Le texte d\\'origine du statut n\\'a pas pu être chargé.</string>\n    <string name=\"ui_error_unknown\">raison inconnue</string>\n    <string name=\"ui_error_clear_notifications\">Échec du nettoyage des notifications : %1$s</string>\n    <string name=\"ui_error_favourite\">Échec de la mise en favori : %1$s</string>\n    <string name=\"label_filter_title\">Nom</string>\n    <string name=\"hint_filter_title\">Mon filtre</string>\n    <string name=\"pref_title_show_stat_inline\">Montrer les statistiques des statuts dans les fils</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d personnes parlent du hashtag %2$s</string>\n    <string name=\"total_usage\">utilisations</string>\n    <string name=\"help_empty_home\">Ceci est votre <b>fil d\\'accueil</b>. Il affiche les publications récentes des comptes que vous suivez. \n\\n \n\\nPour trouver des comptes vous pouvez soit les découvrir dans l\\'un des autres fils, par exemple le fil local de votre instance {{group}} ; soit les chercher par leur nom {{search}}, par exemple cherchez « Tusky » pour trouver notre compte Mastodon.</string>\n    <string name=\"action_add\">Ajouter</string>\n    <string name=\"label_filter_keywords\">Mots-clés ou phrases à filtrer</string>\n    <string name=\"filter_description_warn\">Cacher derrière un avertissement</string>\n    <string name=\"filter_description_hide\">Cacher complètement</string>\n    <string name=\"label_filter_action\">Effet du filtre</string>\n    <string name=\"filter_action_warn\">Avertissement</string>\n    <string name=\"filter_action_hide\">Cacher</string>\n    <string name=\"label_filter_context\">Contextes filtrés</string>\n    <string name=\"filter_keyword_display_format\">%1$s (mot entier)</string>\n    <string name=\"filter_keyword_addition_title\">Ajouter un mot-clé</string>\n    <string name=\"filter_edit_keyword_title\">Modifier mot-clé</string>\n    <string name=\"filter_description_format\">%1$s : %2$s</string>\n    <string name=\"pref_ui_text_size\">Taille de police de l\\'interface</string>\n    <string name=\"pref_title_show_self_boosts\">Afficher les auto-partages</string>\n    <string name=\"pref_title_show_self_boosts_description\">Quelqu\\'un boostant son propre message</string>\n    <string name=\"label_image\">Image</string>\n    <string name=\"dialog_delete_filter_positive_action\">Supprimer</string>\n    <string name=\"notification_prune_cache\">Maintenance du cache …</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nVersion Android : %3$s\n\\nVersion SDK : %4$d</string>\n    <string name=\"about_device_info_title\">Votre appareil</string>\n    <string name=\"about_account_info_title\">Votre compte</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nVersion : %3$s</string>\n    <string name=\"about_copy\">Copier les informations de la version et de l’appareil</string>\n    <string name=\"title_public_trending_statuses\">Publications en tendance</string>\n    <string name=\"list_reply_policy_list\">Membres de la liste</string>\n    <string name=\"list_reply_policy_label\">Afficher les réponses à</string>\n    <string name=\"about_copied\">Les informations de la version et de l’appareil ont été copiés</string>\n    <string name=\"action_follow_hashtag\">Suivre un nouvel hashtag</string>\n    <string name=\"action_translate\">Traduire</string>\n    <string name=\"action_show_original\">Voir l\\'original</string>\n    <string name=\"url_copied\">Url copiée</string>\n    <string name=\"confirmation_hashtag_copied\">\\'#%1$s\\' copié</string>\n    <string name=\"reply_sending\">Envoi…</string>\n    <string name=\"reply_sending_long\">Votre réponse est en train d\\'être envoyée.</string>\n    <string name=\"dialog_follow_warning\">Suivre ce compte ?</string>\n    <string name=\"report_category_legal\">Légal</string>\n    <string name=\"pref_title_confirm_follows\">Afficher une confirmation avant de suivre</string>\n    <string name=\"load_newest_notifications\">Charger les notifications récentes</string>\n    <string name=\"dialog_delete_filter_text\">Supprimer le filtre \\'%1$s\\' ?</string>\n    <string name=\"unknown_notification_type\">Notification de type inconnu</string>\n    <string name=\"dialog_save_profile_changes_message\">Voulez-vous sauvegarder vos changements de profil ?</string>\n    <string name=\"pref_match_default_post_privacy\">Appliquer la confidentialité des messages par défaut</string>\n    <string name=\"notification_listenable_worker_description\">Notifications quand Tusky est en arrière-plan</string>\n    <string name=\"notification_notification_worker\">Récupération des notifications…</string>\n    <string name=\"compose_delete_draft\">Supprimer le brouillon ?</string>\n    <string name=\"label_translating\">Traduction…</string>\n    <string name=\"label_translated\">Traduit de %1$s avec %2$s</string>\n    <string name=\"unmuting_hashtag_success_format\">Démasquer le hashtag #%1$s</string>\n    <string name=\"action_view_filter\">Voir le filtre</string>\n    <string name=\"error_blocking_domain\">Impossible de masquer %1$s : %2$s</string>\n    <string name=\"error_media_upload_sending_fmt\">Le téléversement à échoué : %1$s</string>\n    <string name=\"error_deleting_filter\">Erreur lors de la suppresssion du filtre \\'%1$s\\'</string>\n    <string name=\"error_saving_filter\">Erreur lors de l\\'enregistrement du filtre \\'%1$s\\'</string>\n    <string name=\"pref_default_reply_privacy\">Confidentialité des réponses (non synchronisée avec le serveur)</string>\n    <string name=\"label_expires_after\">Expire après</string>\n    <string name=\"ui_error_translate\">Impossible de traduire : %1$s</string>\n    <string name=\"app_theme_system_black\">Utiliser le thème système (sombre)</string>\n    <string name=\"notification_policies_title\">Politique de notifications</string>\n    <string name=\"pref_default_reply_privacy_explanation\">Le niveau de confidentialité pré-sélectionné dépend du pouet auquel vous souhaitez répondre.</string>\n    <string name=\"post_privacy_direct\">Directe</string>\n    <string name=\"notification_listenable_worker_name\">Activités d\\'arrière-plan</string>\n    <string name=\"following_hashtag_success_format\">Vous suivez désormais le hashtag #%1$s</string>\n    <string name=\"error_unblocking_domain\">Impossible de démasquer %1$s : %2$s</string>\n    <string name=\"pref_title_per_timeline_preferences\">Préférences par fil</string>\n    <string name=\"notification_policies_filter_out\">Gérer les notifications issues de…</string>\n    <string name=\"list_reply_policy_none\">Personne</string>\n    <string name=\"post_replied\">Répondu</string>\n    <string name=\"unfollowing_hashtag_success_format\">Arrêt du suivi du hashtag #%1$s</string>\n    <string name=\"muting_hashtag_success_format\">Cacher le hashtag #%1$s en guise d\\'avertissement</string>\n    <string name=\"list_exclusive_label\">Caché depuis la timeline principale</string>\n    <string name=\"pref_title_show_notifications_filter\">Afficher les filtres de notifications</string>\n    <string name=\"post_replied_format\">En réponse à %1$s</string>\n    <string name=\"post_replied_self\">Suite du fil</string>\n    <string name=\"notifications_from_people_you_may_know\">Notifications de %1$d personnes que vous pourriez connaître</string>\n    <string name=\"notification_policy_accept\">Accepter</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">Personnes que vous ne suivez pas</string>\n    <string name=\"notification_policies_filter_dont_follow_description\">Tant que vous ne les approuvez pas</string>\n    <string name=\"notification_policies_filter_not_following_title\">Personnes qui ne vous suivent pas</string>\n    <string name=\"notification_policies_filter_not_following_description\">Y compris des personnes qui vous suivent depuis moins de 3 jours</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">Nouveaux profils</string>\n    <string name=\"unknown_notification_filter_new_accounts_description\">Créé durant les 30 derniers jours</string>\n    <string name=\"notification_policy_filter\">Filtrer</string>\n    <string name=\"notification_policy_ignore\">Ignorer</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-fr-rBE/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    </resources>"
  },
  {
    "path": "app/src/main/res/values-fy/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_invalid_domain\">Ûnjildich domein ynfierd</string>\n    <string name=\"error_empty\">Dit mei net leech wêze.</string>\n    <string name=\"system_default\">Systeem standert</string>\n    <string name=\"emoji_style\">Emoji styl</string>\n    <string name=\"action_compose_shortcut\">Gearstelle</string>\n    <string name=\"send_post_notification_cancel_title\">Ferstjoeren ôfbrutsen</string>\n    <string name=\"send_post_notification_channel_name\">Toots oan it ferstjoeren</string>\n    <string name=\"send_post_notification_error_title\">Flater by it ferstjoeren fan toot</string>\n    <string name=\"send_post_notification_title\">Toot oan it ferstjoeren…</string>\n    <string name=\"compose_save_draft\">Skets bewarje?</string>\n    <string name=\"action_remove\">Fuortsmite</string>\n    <string name=\"action_set_caption\">Ûnderskrift pleatse</string>\n    <string name=\"action_add_to_list\">Account oan de list tafoegje</string>\n    <string name=\"hint_search_people_list\">Sykje om minsken dy\\'t jo folgje</string>\n    <string name=\"action_delete_list\">Smyt de list fuort</string>\n    <string name=\"action_rename_list\">Neam de list om</string>\n    <string name=\"action_create_list\">Meitsje in list oan</string>\n    <string name=\"error_delete_list\">Koe list net fuortsmite</string>\n    <string name=\"error_rename_list\">Koe list net omneame</string>\n    <string name=\"error_create_list\">Koe list net oanmeitsje</string>\n    <string name=\"title_lists\">Listen</string>\n    <string name=\"action_lists\">Listen</string>\n    <string name=\"add_account_description\">Nij Mastodon Account Tafoegje</string>\n    <string name=\"add_account_name\">Account Tafoegje</string>\n    <string name=\"filter_dialog_update_button\">Fernije</string>\n    <string name=\"filter_dialog_remove_button\">Fuortsmite</string>\n    <string name=\"filter_edit_title\">Filter oanpasse</string>\n    <string name=\"filter_addition_title\">Filter tafoegje</string>\n    <string name=\"pref_title_thread_filter_keywords\">Petearen</string>\n    <string name=\"load_more_placeholder_text\">mear lade</string>\n    <string name=\"replying_to\">Oan it reagearren op @%1$s</string>\n    <string name=\"title_media\">Media</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Altyd gefoeliche ynhâld sjen litte</string>\n    <string name=\"follows_you\">Folget jo</string>\n    <string name=\"abbreviated_years_ago\">%1$dy</string>\n    <string name=\"abbreviated_in_seconds\">oer %1$ds</string>\n    <string name=\"abbreviated_in_minutes\">oer %1$dm</string>\n    <string name=\"abbreviated_in_hours\">oer %1$dh</string>\n    <string name=\"abbreviated_in_days\">oer %1$dd</string>\n    <string name=\"post_media_attachments\">Taheaksels</string>\n    <string name=\"post_media_audio\">Lûd</string>\n    <string name=\"post_media_video\">Fideo</string>\n    <string name=\"post_media_images\">Ôfbyldingen</string>\n    <string name=\"post_share_link\">Keppeling nei toot diele</string>\n    <string name=\"post_share_content\">Ynhâld fan toot diele</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_title_activity\">Oer</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d nije ynteraksje</item>\n        <item quantity=\"other\">%1$d nije ynteraksjes</item>\n    </plurals>\n    <string name=\"notification_summary_small\">%1$s en %2$s</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, en %3$s</string>\n    <string name=\"notification_subscription_name\">Nije toots</string>\n    <string name=\"notification_favourite_name\">Favoriten</string>\n    <string name=\"notification_follow_request_name\">Folgfersyken</string>\n    <string name=\"notification_follow_name\">Nije Folgers</string>\n    <string name=\"post_text_size_largest\">Grutst</string>\n    <string name=\"post_text_size_large\">Grut</string>\n    <string name=\"post_text_size_medium\">Gewoan</string>\n    <string name=\"post_text_size_small\">Lyts</string>\n    <string name=\"post_text_size_smallest\">Lytst</string>\n    <string name=\"post_privacy_followers_only\">Allinnich folgers</string>\n    <string name=\"post_privacy_public\">Iepenbier</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Ûnder</string>\n    <string name=\"pref_main_nav_position_option_top\">Boppe</string>\n    <string name=\"pref_failed_to_sync\">Koe ynstellingen net syngronisearje</string>\n    <string name=\"pref_default_media_sensitivity\">Media altyd as gefoelich oanmerke</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP proksje poarte</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP proksje tsjinner</string>\n    <string name=\"pref_title_http_proxy_enable\">HTTP proksje ynskeakelje</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP proksje</string>\n    <string name=\"pref_title_proxy_settings\">Proksje</string>\n    <string name=\"pref_title_show_media_preview\">Media foarfertoaningen delhelje</string>\n    <string name=\"pref_title_show_replies\">Reaksjes sjen litte</string>\n    <string name=\"pref_title_post_tabs\">Ljepblêden</string>\n    <string name=\"pref_title_language\">Taal</string>\n    <string name=\"pref_title_browser_settings\">Webblêder</string>\n    <string name=\"app_theme_system\">Systeem Opmaak Brûke</string>\n    <string name=\"app_theme_auto\">Automatysk as de sinne ûnder giet</string>\n    <string name=\"app_theme_black\">Swart</string>\n    <string name=\"app_theme_light\">Ljocht</string>\n    <string name=\"app_them_dark\">Tsjuster</string>\n    <string name=\"pref_title_timeline_filters\">Filters</string>\n    <string name=\"pref_title_app_theme\">Applikaasje Tema</string>\n    <string name=\"pref_title_appearance_settings\">Uterlik</string>\n    <string name=\"pref_title_notification_alert_light\">Op\\'e hichte steld wurde mei in ljochtsje</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Op\\'e hichte steld wurde mei in trilling</string>\n    <string name=\"pref_title_notification_alert_sound\">Op\\'e hichte stelt wurde mei in lûdsje</string>\n    <string name=\"pref_title_notifications_enabled\">Notifikaasjes</string>\n    <string name=\"pref_title_edit_notification_settings\">Notifikaasjes</string>\n    <string name=\"dialog_mute_hide_notifications\">Notifikaasjes ferbergje</string>\n    <string name=\"dialog_mute_warning\">\\@%1$s negearje?</string>\n    <string name=\"dialog_block_warning\">\\@%1$s blokkearje?</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Folsleine domein ferbergje</string>\n    <string name=\"dialog_delete_conversation_warning\">Dit petear fuortsmite?</string>\n    <string name=\"dialog_redraft_post_warning\">Dizze toot fuortsmite en opnij opstelle?</string>\n    <string name=\"dialog_delete_post_warning\">Dizze toot fuortsmite?</string>\n    <string name=\"dialog_unfollow_warning\">Dit account net mear folgje?</string>\n    <string name=\"dialog_message_cancel_follow_request\">Folgfersyk ynlûke?</string>\n    <string name=\"dialog_download_image\">Delhelje</string>\n    <string name=\"dialog_message_uploading_media\">Oan it uploaden…</string>\n    <string name=\"dialog_title_finishing_media_upload\">It Uploaden fan Media oan it Ôfrûnjen</string>\n    <string name=\"login_connection\">Oan it ferbinen…</string>\n    <string name=\"label_quick_reply\">Reagearre…</string>\n    <string name=\"search_no_results\">Gjin resultaten</string>\n    <string name=\"hint_search\">Sykje…</string>\n    <string name=\"hint_content_warning\">Ynhâld warskôging</string>\n    <string name=\"hint_compose\">Wat bard der?</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s net mear ferburgen</string>\n    <string name=\"confirmation_unmuted\">Brûker net mear negearre</string>\n    <string name=\"confirmation_unblocked\">Brûker net mear blokkearre</string>\n    <string name=\"confirmation_reported\">Ferstjoerd!</string>\n    <string name=\"send_media_to\">Media ferstjoere nei…</string>\n    <string name=\"send_post_content_to\">Toot ferstjoere nei…</string>\n    <string name=\"send_post_link_to\">Toot URL ferstjoere nei…</string>\n    <string name=\"downloading_media\">Media oan it delheljen</string>\n    <string name=\"download_media\">Media delhelje</string>\n    <string name=\"action_share_as\">Diele as…</string>\n    <string name=\"action_open_as\">Iepenje as %1$s</string>\n    <string name=\"action_copy_link\">Keppeling kopiearje</string>\n    <string name=\"download_image\">Oan it delheljen fan %1$s</string>\n    <string name=\"action_open_media_n\">Media #%1$d iepenje</string>\n    <string name=\"title_links_dialog\">Keppelingen</string>\n    <string name=\"action_open_faved_by\">Favoriten besjen</string>\n    <string name=\"action_links\">Keppelingen</string>\n    <string name=\"action_add_tab\">Ljepblêd Tafoegje</string>\n    <string name=\"action_schedule_post\">Toot ynplanne</string>\n    <string name=\"action_emoji_keyboard\">Emoji toetseboerd</string>\n    <string name=\"action_content_warning\">Ynhâld warskôging</string>\n    <string name=\"action_toggle_visibility\">Toot sichtberheid</string>\n    <string name=\"action_access_scheduled_posts\">Ynplanne toots</string>\n    <string name=\"action_access_drafts\">Sketsen</string>\n    <string name=\"action_search\">Sykje</string>\n    <string name=\"action_reject\">Net akseptearje</string>\n    <string name=\"action_accept\">Akseptearje</string>\n    <string name=\"action_undo\">Ûngedien meitsje</string>\n    <string name=\"action_edit_own_profile\">Oanpasse</string>\n    <string name=\"action_edit_profile\">Profyl oanpasse</string>\n    <string name=\"action_save\">Bewarje</string>\n    <string name=\"action_open_drawer\">Laad iepenje</string>\n    <string name=\"action_hide_media\">Media ferbergje</string>\n    <string name=\"action_mention\">Beneame</string>\n    <string name=\"action_unmute_conversation\">Petear net mear negearre</string>\n    <string name=\"action_mute_conversation\">Petear negearre</string>\n    <string name=\"action_unmute_domain\">%1$s net mear negearre</string>\n    <string name=\"action_mute_domain\">%1$s negearre</string>\n    <string name=\"action_unmute_desc\">%1$s net mear negearre</string>\n    <string name=\"action_unmute\">Net mear negearre</string>\n    <string name=\"action_mute\">Negearre</string>\n    <string name=\"action_share\">Diele</string>\n    <string name=\"action_photo_take\">Foto nimme</string>\n    <string name=\"action_add_poll\">Fragelist tafoegje</string>\n    <string name=\"action_add_media\">Media tafoegje</string>\n    <string name=\"action_open_in_web\">Yn webblêder iepenje</string>\n    <string name=\"action_view_media\">Media</string>\n    <string name=\"action_view_follow_requests\">Folgfersyken</string>\n    <string name=\"action_view_domain_mutes\">Ferburgen domeinen</string>\n    <string name=\"action_view_blocks\">Blokkearre brûkers</string>\n    <string name=\"action_view_mutes\">Negearre brûkers</string>\n    <string name=\"action_view_bookmarks\">Blêdwiizers</string>\n    <string name=\"action_view_favourites\">Favoriten</string>\n    <string name=\"action_view_account_preferences\">Account Foarkarren</string>\n    <string name=\"action_view_preferences\">Foarkarren</string>\n    <string name=\"action_view_profile\">Profyl</string>\n    <string name=\"action_close\">Slute</string>\n    <string name=\"action_retry\">Opnij probearje</string>\n    <string name=\"action_send_public\">TOOT!</string>\n    <string name=\"action_send\">TOOT</string>\n    <string name=\"action_delete_and_redraft\">Fuortsmite en opnij opstelle</string>\n    <string name=\"action_delete_conversation\">Petear fuortsmite</string>\n    <string name=\"action_delete\">Fuortsmite</string>\n    <string name=\"action_edit\">Oanpasse</string>\n    <string name=\"action_report\">Oanjaan</string>\n    <string name=\"action_unblock\">Net mear blokkearje</string>\n    <string name=\"action_block\">Blokkearje</string>\n    <string name=\"action_unfollow\">Net mear folgje</string>\n    <string name=\"action_follow\">Folgje</string>\n    <string name=\"action_logout\">Útlogge</string>\n    <string name=\"action_login\">Ynlogge mei Mastodon</string>\n    <string name=\"action_compose\">Gearstelle</string>\n    <string name=\"action_more\">Mear</string>\n    <string name=\"action_unfavourite\">Net mear as favoryt oanmerke</string>\n    <string name=\"action_favourite\">As favoryt oanmerke</string>\n    <string name=\"action_reply\">Reagearje</string>\n    <string name=\"action_quick_reply\">Flugge Reaksje</string>\n    <string name=\"report_comment_hint\">Oanfoljende opmerkingen?</string>\n    <string name=\"report_username_format\">Jou @%1$s oan</string>\n    <string name=\"notification_subscription_format\">%1$s hat krekt in berjocht pleatst</string>\n    <string name=\"notification_follow_request_format\">%1$s fersiket jo te folgjen</string>\n    <string name=\"notification_follow_format\">%1$s folget jo</string>\n    <string name=\"notification_favourite_format\">%1$s hat jo toot as favoryt oanmurken</string>\n    <string name=\"footer_empty\">Hjir is neat. Lûk nei ûnderen om te ferfarskjen!</string>\n    <string name=\"message_empty\">Hjir is neat.</string>\n    <string name=\"post_content_show_less\">Yntearre</string>\n    <string name=\"post_content_show_more\">Ûttearre</string>\n    <string name=\"post_content_warning_show_less\">Minder sjen litte</string>\n    <string name=\"post_content_warning_show_more\">Mear sjen litte</string>\n    <string name=\"post_sensitive_media_directions\">Klik om te besjen</string>\n    <string name=\"post_media_hidden_title\">Media ferburgen</string>\n    <string name=\"post_sensitive_media_title\">Gefoelige ynhâld</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"title_licenses\">Lisinsjes</string>\n    <string name=\"title_scheduled_posts\">Ynplanne toots</string>\n    <string name=\"title_drafts\">Sketsen</string>\n    <string name=\"title_edit_profile\">Jo profyl oanpasse</string>\n    <string name=\"title_follow_requests\">Folgfersyken</string>\n    <string name=\"title_domain_mutes\">Ferburgen domeinen</string>\n    <string name=\"title_blocks\">Blokkearre brûkers</string>\n    <string name=\"title_mutes\">Negearre brûkers</string>\n    <string name=\"title_bookmarks\">Blêdwiizers</string>\n    <string name=\"title_favourites\">Favoriten</string>\n    <string name=\"title_followers\">Folgers</string>\n    <string name=\"title_follows\">Folget</string>\n    <string name=\"title_posts_pinned\">Fêstset</string>\n    <string name=\"title_posts_with_replies\">Mei reaksjes</string>\n    <string name=\"title_posts\">Berjochten</string>\n    <string name=\"title_view_thread\">Toot</string>\n    <string name=\"title_tab_preferences\">Ljepblêden</string>\n    <string name=\"title_direct_messages\">Direkte Berjochten</string>\n    <string name=\"title_public_federated\">Federearre</string>\n    <string name=\"title_public_local\">Lokaal</string>\n    <string name=\"title_notifications\">Notifikaasjes</string>\n    <string name=\"title_home\">Thús</string>\n    <string name=\"error_sender_account_gone\">Flater by it ferstjoeren fan de toot.</string>\n    <string name=\"error_media_upload_sending\">De upload is mislearre.</string>\n    <string name=\"error_media_upload_image_or_video\">Ôfbyldingen en fideo\\'s kinne net beide taheake wêze oan deselde status.</string>\n    <string name=\"error_media_download_permission\">Tastimming om media op te slaan is nedich.</string>\n    <string name=\"error_media_upload_permission\">Tastimming om media te lêzen is nedich.</string>\n    <string name=\"error_media_upload_opening\">Die triem koe net iepene wurde.</string>\n    <string name=\"error_media_upload_type\">Dat type triem kin net upload wurde.</string>\n    <string name=\"error_compose_character_limit\">De status is te lang!</string>\n    <string name=\"error_retrieving_oauth_token\">Koe gjin ynlogtoken krije.</string>\n    <string name=\"error_authorization_denied\">Ferifikaasje ôfkard.</string>\n    <string name=\"error_authorization_unknown\">Der die harren in net definiearre flater foar.</string>\n    <string name=\"error_no_web_browser_found\">Koe gjin webblêder fine om te brûken.</string>\n    <string name=\"error_network\">In netwurk flater die harren foar! Kontrolearje jo ferbining en probearje it noch ris!</string>\n    <string name=\"error_generic\">Der die harren in flater foar.</string>\n    <string name=\"label_avatar\">Profylôfbylding</string>\n    <string name=\"hint_note\">Oer dy</string>\n    <string name=\"title_hashtags_dialog\">Hashtags</string>\n    <string name=\"action_open_reblogged_by\">Boosts sjen litte</string>\n    <string name=\"action_open_reblogger\">Auteur fan boost iepenje</string>\n    <string name=\"action_hashtags\">Hashtags</string>\n    <string name=\"action_reset_schedule\">Nei standert ynstelling weromsette</string>\n    <string name=\"action_show_reblogs\">Boosts sjen litte</string>\n    <string name=\"action_hide_reblogs\">Boosts ferburgje</string>\n    <string name=\"action_unreblog\">Boost fuorthelje</string>\n    <string name=\"action_reblog\">Boost</string>\n    <string name=\"notification_reblog_format\">%1$s hat dyn toot boost</string>\n    <string name=\"title_announcements\">Oankundigingen</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-ga/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"post_content_show_more\">Leathnaigh</string>\n    <string name=\"post_content_warning_show_less\">Taispeáin Níos Lú</string>\n    <string name=\"post_content_warning_show_more\">Taispeáin Níos Mó</string>\n    <string name=\"post_sensitive_media_directions\">Cliceáil chun amharc</string>\n    <string name=\"post_media_hidden_title\">Meáin i bhfolach</string>\n    <string name=\"post_sensitive_media_title\">Ábhar íogair</string>\n    <string name=\"post_boosted_format\">D\\'athchraol %1$s</string>\n    <string name=\"title_licenses\">Ceadúnais</string>\n    <string name=\"title_scheduled_posts\">Postálacha sceidealta</string>\n    <string name=\"title_edit_profile\">Cuir do phróifíl in eagar</string>\n    <string name=\"title_follow_requests\">Lean Iarrataí</string>\n    <string name=\"title_domain_mutes\">Fearainn i bhfolach</string>\n    <string name=\"title_blocks\">Úsáideoirí blocáilte</string>\n    <string name=\"title_mutes\">Úsáideoirí fuaim</string>\n    <string name=\"title_bookmarks\">Leabharmharcanna</string>\n    <string name=\"title_followers\">Leantóirí</string>\n    <string name=\"title_follows\">Ag Leanúint</string>\n    <string name=\"title_posts_pinned\">Greamaithe</string>\n    <string name=\"title_posts_with_replies\">Le freagraí</string>\n    <string name=\"title_view_thread\">Snáithe</string>\n    <string name=\"title_direct_messages\">Teachtaireachtaí Díreacha</string>\n    <string name=\"title_public_federated\">Cónaidhme</string>\n    <string name=\"title_public_local\">Áitiúil</string>\n    <string name=\"title_notifications\">Fógraí</string>\n    <string name=\"title_home\">Baile</string>\n    <string name=\"error_sender_account_gone\">Earráid agus an toot á sheoladh.</string>\n    <string name=\"error_media_upload_sending\">Theip ar an uaslódáil.</string>\n    <string name=\"error_media_upload_image_or_video\">Ní féidir íomhánna agus físeáin a cheangal leis an stádas céanna.</string>\n    <string name=\"error_media_download_permission\">Teastaíonn cead chun na meáin a stóráil.</string>\n    <string name=\"error_media_upload_permission\">Teastaíonn cead chun na meáin a léamh.</string>\n    <string name=\"error_media_upload_opening\">Ní fhéadfaí an comhad sin a oscailt.</string>\n    <string name=\"pref_title_custom_tabs\">Úsáid Chrome Custom Tabs</string>\n    <string name=\"pref_title_browser_settings\">Brabhsálaí</string>\n    <string name=\"app_theme_system\">Úsáid Dearadh Córais</string>\n    <string name=\"app_theme_auto\">Uathoibríoch ag luí na gréine</string>\n    <string name=\"app_theme_black\">Dubh</string>\n    <string name=\"app_theme_light\">Éadrom</string>\n    <string name=\"app_them_dark\">Dorcha</string>\n    <string name=\"pref_title_timeline_filters\">Scagairí</string>\n    <string name=\"pref_title_timelines\">Amlínte</string>\n    <string name=\"pref_title_app_theme\">Téama an Aip</string>\n    <string name=\"pref_title_appearance_settings\">Dealramh</string>\n    <string name=\"pref_title_notification_filters\">Cuir in iúl dom cathain</string>\n    <string name=\"pref_title_notification_alert_light\">Fógra le solas</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Cuir in iúl le tonnchrith</string>\n    <string name=\"pref_title_notification_alert_sound\">Fógra le fuaim</string>\n    <string name=\"pref_title_notification_alerts\">Foláirimh</string>\n    <string name=\"pref_title_notifications_enabled\">Fógraí</string>\n    <string name=\"pref_title_edit_notification_settings\">Fógraí</string>\n    <string name=\"visibility_direct\">Díreach: Post chuig úsáideoirí luaite amháin</string>\n    <string name=\"visibility_private\">Do Leantóirí Amháin: Postáil do do chuid leantóirí amháin</string>\n    <string name=\"visibility_unlisted\">Neamhliostaithe: Ná taispeáin in amlínte poiblí</string>\n    <string name=\"visibility_public\">Poiblí: Post chuig amlínte poiblí</string>\n    <string name=\"dialog_mute_hide_notifications\">Folaigh fógraí</string>\n    <string name=\"dialog_block_warning\">Bloc @%1$s?</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Folaigh an fearann iomlán</string>\n    <string name=\"mute_domain_warning\">An bhfuil tú cinnte gur mhaith leat gach %1$s a bhac? Ní fheicfidh tú inneachar ón bhfearann sin in aon amlíne poiblí ar bith ná i do chuid fógraí. Bainfear do chuid leantóirí ón bhfearann sin.</string>\n    <string name=\"dialog_redraft_post_warning\">Scrios agus athdhréachtaigh an postáil seo?</string>\n    <string name=\"dialog_delete_post_warning\">Scrios an postáil seo?</string>\n    <string name=\"dialog_unfollow_warning\">An cuntas seo a scaoileadh?</string>\n    <string name=\"dialog_message_cancel_follow_request\">An iarraidh seo a leanas a chúlghairm?</string>\n    <string name=\"dialog_download_image\">Íoslódáil</string>\n    <string name=\"dialog_message_uploading_media\">Uaslódáil…</string>\n    <string name=\"dialog_title_finishing_media_upload\">Uaslódáil Meáin Críochnaithe</string>\n    <string name=\"login_connection\">Ag nascadh…</string>\n    <string name=\"label_header\">Ceanntásc</string>\n    <string name=\"label_quick_reply\">Freagra…</string>\n    <string name=\"search_no_results\">Gan torthaí</string>\n    <string name=\"hint_search\">Cuardaigh…</string>\n    <string name=\"hint_note\">Bith</string>\n    <string name=\"hint_display_name\">Ainm taispeána</string>\n    <string name=\"hint_content_warning\">Rabhadh ábhair</string>\n    <string name=\"hint_compose\">Cad atá ag tarlú?</string>\n    <string name=\"hint_domain\">Cén ásc?</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s neamhcheangailte</string>\n    <string name=\"confirmation_unmuted\">Úsáideoir gan trácht</string>\n    <string name=\"confirmation_unblocked\">Úsáideoir gan bhac</string>\n    <string name=\"confirmation_reported\">Seolta!</string>\n    <string name=\"send_media_to\">Comhroinn meáin chuig…</string>\n    <string name=\"send_post_content_to\">Comhroinn postáil chuig…</string>\n    <string name=\"send_post_link_to\">Comhroinn URL na postála chuig…</string>\n    <string name=\"downloading_media\">Meáin íoslódála</string>\n    <string name=\"download_media\">Íoslódáil meáin</string>\n    <string name=\"action_share_as\">Comhroinn mar …</string>\n    <string name=\"action_open_as\">Oscail mar %1$s</string>\n    <string name=\"action_copy_link\">Cóipeáil an nasc</string>\n    <string name=\"download_image\">Ag íoslódáil %1$s</string>\n    <string name=\"action_open_media_n\">Meáin oscailte #%1$d</string>\n    <string name=\"title_links_dialog\">Naisc Ghréasáin</string>\n    <string name=\"action_open_faved_by\">Taispeáin toghanna</string>\n    <string name=\"action_open_reblogged_by\">Taispeáin athchraolta</string>\n    <string name=\"action_open_reblogger\">Oscail údar an athchraolta</string>\n    <string name=\"action_mentions\">Buaicphointí</string>\n    <string name=\"action_links\">Naisc ghréasáin</string>\n    <string name=\"action_add_tab\">Cuir Tab leis</string>\n    <string name=\"action_schedule_post\">Sceidealaigh Postáil</string>\n    <string name=\"action_emoji_keyboard\">Méarchlár Emoji</string>\n    <string name=\"action_content_warning\">Rabhadh ábhair</string>\n    <string name=\"action_toggle_visibility\">Infheictheacht postálacha</string>\n    <string name=\"action_access_scheduled_posts\">Postálacha sceidealta</string>\n    <string name=\"action_access_drafts\">Dréachtaí</string>\n    <string name=\"action_reject\">Diúltaigh</string>\n    <string name=\"action_accept\">Glac</string>\n    <string name=\"action_undo\">Cealaigh</string>\n    <string name=\"action_edit_own_profile\">Cuir in Eagar</string>\n    <string name=\"action_save\">Sábháil</string>\n    <string name=\"action_open_drawer\">Tarraiceán a oscailt</string>\n    <string name=\"action_hide_media\">Folaigh na meáin</string>\n    <string name=\"action_mention\">Luaigh</string>\n    <string name=\"action_unmute\">Unmute</string>\n    <string name=\"action_mute\">Balbhaigh</string>\n    <string name=\"action_share\">Comhroinn</string>\n    <string name=\"action_photo_take\">Tóg pictiúr</string>\n    <string name=\"action_add_poll\">Cuir vótaíocht leis</string>\n    <string name=\"action_add_media\">Cuir meáin leis</string>\n    <string name=\"action_open_in_web\">Oscail sa bhrabhsálaí</string>\n    <string name=\"action_view_media\">Meáin</string>\n    <string name=\"action_view_follow_requests\">Lean Iarrataí</string>\n    <string name=\"action_view_domain_mutes\">Fearainn i bhfolach</string>\n    <string name=\"action_view_blocks\">Úsáideoirí blocáilte</string>\n    <string name=\"action_view_mutes\">Úsáideoirí fuaim</string>\n    <string name=\"action_view_bookmarks\">Leabharmharcanna</string>\n    <string name=\"action_view_favourites\">Toghanna</string>\n    <string name=\"action_view_profile\">Próifíl</string>\n    <string name=\"action_close\">Dún</string>\n    <string name=\"action_retry\">Atriail</string>\n    <string name=\"action_send_public\">SÉID!</string>\n    <string name=\"action_send\">SÉID</string>\n    <string name=\"action_delete_and_redraft\">Scrios agus athdhréachtú</string>\n    <string name=\"action_delete\">Scrios</string>\n    <string name=\"action_edit\">Cuir in Eagar</string>\n    <string name=\"action_report\">Tuairiscigh</string>\n    <string name=\"action_show_reblogs\">Taispeáin athchraolta</string>\n    <string name=\"action_hide_reblogs\">Folaigh athchraolta</string>\n    <string name=\"action_unblock\">Ná bac</string>\n    <string name=\"action_block\">Bac</string>\n    <string name=\"action_unfollow\">Stop ag leanúint</string>\n    <string name=\"action_follow\">Lean</string>\n    <string name=\"action_logout_confirm\">An bhfuil tú cinnte gur mhaith leat logáil amach as an gcuntas %1$s?</string>\n    <string name=\"action_compose\">Cum</string>\n    <string name=\"action_more\">Níos mó</string>\n    <string name=\"action_unfavourite\">Bain togha</string>\n    <string name=\"action_bookmark\">Leabharmharc</string>\n    <string name=\"action_favourite\">Togh</string>\n    <string name=\"error_media_upload_type\">Ní féidir an cineál comhaid sin a uaslódáil.</string>\n    <string name=\"error_compose_character_limit\">Tá an stádas ró-fhada!</string>\n    <string name=\"error_retrieving_oauth_token\">Theip ar chomhartha logála isteach a fháil.</string>\n    <string name=\"error_authorization_denied\">Diúltaíodh údarú.</string>\n    <string name=\"error_authorization_unknown\">Tharla earráid údaraithe neamhaitheanta.</string>\n    <string name=\"error_no_web_browser_found\">Níorbh fhéidir brabhsálaí gréasáin a aimsiú le húsáid.</string>\n    <string name=\"error_invalid_domain\">Fearann neamhbhailí iontráilte</string>\n    <string name=\"error_empty\">Ní féidir leis seo a bheith folamh.</string>\n    <string name=\"error_network\">Tharla earráid líonra! Seiceáil do nasc agus bain triail eile as!</string>\n    <string name=\"error_generic\">Tharla earráid.</string>\n    <string name=\"title_lists\">Liostaí</string>\n    <string name=\"action_lists\">Liostaí</string>\n    <string name=\"about_title_activity\">Faoi</string>\n    <string name=\"action_reset_schedule\">Athshocraigh</string>\n    <string name=\"action_search\">Cuardaigh</string>\n    <string name=\"action_edit_profile\">Cuir próifíl in eagar</string>\n    <string name=\"action_view_account_preferences\">Roghanna Cuntais</string>\n    <string name=\"action_view_preferences\">Sainroghanna</string>\n    <string name=\"action_logout\">Logáil Amach</string>\n    <string name=\"title_drafts\">Dréachtaí</string>\n    <string name=\"title_favourites\">Toghanna</string>\n    <string name=\"error_failed_app_registration\">Theip ar fhíordheimhniú leis an ásc sin.</string>\n    <string name=\"link_whats_an_instance\">Cad is ásc ann?</string>\n    <string name=\"action_login\">Logáil isteach le Mastodon</string>\n    <string name=\"post_media_images\">Íomhánna</string>\n    <string name=\"post_share_link\">Comhroinn nasc chuig postáil</string>\n    <string name=\"post_share_content\">Comhroinn inneachar na postála</string>\n    <string name=\"about_tusky_account\">Próifíl Tusky</string>\n    <string name=\"about_tusky_license\">Is bogearraí foinse oscailte agus saor in aisce é Tusky. Tá sé ceadúnaithe faoi Leagan 3. Ceadúnas Poiblí Ginearálta GNU 3. Is féidir leat an ceadúnas a fheiceáil anseo: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <string name=\"about_powered_by_tusky\">Cumhachtaithe ag Tusky</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"description_account_locked\">Cuntas faoi Ghlas</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\"/>\n        <item quantity=\"two\"/>\n        <item quantity=\"few\"/>\n        <item quantity=\"many\"/>\n        <item quantity=\"other\">%1$d idirghníomhaíochtaí nua</item>\n    </plurals>\n    <string name=\"notification_summary_small\">%1$s agus %2$s</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, agus %3$s</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s agus %4$d cinn eile</string>\n    <string name=\"notification_mention_format\">Luaigh %1$s tú</string>\n    <string name=\"notification_poll_description\">Fógraí faoi pobalbhreitheanna a bhfuil deireadh leo</string>\n    <string name=\"notification_poll_name\">Vótaí</string>\n    <string name=\"notification_favourite_description\">Fógraí nuair a thoghtar do chuid postálacha</string>\n    <string name=\"notification_favourite_name\">Toghanna</string>\n    <string name=\"notification_boost_description\">Fógraí nuair a athchraoltar do chuid postálacha</string>\n    <string name=\"notification_boost_name\">Athchraolta</string>\n    <string name=\"notification_follow_request_description\">Fógraí faoi iarratais a leanúint</string>\n    <string name=\"notification_follow_request_name\">Lean Iarrataí</string>\n    <string name=\"notification_follow_description\">Fógraí faoi leantóirí nua</string>\n    <string name=\"notification_follow_name\">Leantóirí Nua</string>\n    <string name=\"notification_mention_descriptions\">Fógraí faoi luanna nua</string>\n    <string name=\"notification_mention_name\">Tagairtí Nua</string>\n    <string name=\"post_text_size_largest\">Is mó</string>\n    <string name=\"post_text_size_large\">Mór</string>\n    <string name=\"post_text_size_medium\">Meán-mhéid</string>\n    <string name=\"post_text_size_small\">Beag</string>\n    <string name=\"post_text_size_smallest\">Is bige</string>\n    <string name=\"pref_post_text_size\">Méid an téacs postála</string>\n    <string name=\"post_privacy_followers_only\">Do leantóirí amháin</string>\n    <string name=\"post_privacy_unlisted\">Neamhliostaithe</string>\n    <string name=\"post_privacy_public\">Poiblí</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Bun</string>\n    <string name=\"pref_main_nav_position_option_top\">Barr</string>\n    <string name=\"pref_main_nav_position\">Príomhshuíomh nascleanúna</string>\n    <string name=\"pref_failed_to_sync\">Theip ar shocruithe a sync</string>\n    <string name=\"pref_publishing\">Foilsitheoireacht (synced leis an bhfreastalaí)</string>\n    <string name=\"pref_default_media_sensitivity\">Déan na meáin a mharcáil i gcónaí mar íogaire</string>\n    <string name=\"pref_default_post_privacy\">Príobháideacht réamhshocraithe postálacha</string>\n    <string name=\"pref_title_http_proxy_port\">Port seachfhreastalaí HTTP</string>\n    <string name=\"pref_title_http_proxy_server\">Freastalaí seachfhreastalaí HTTP</string>\n    <string name=\"pref_title_http_proxy_enable\">Cumasaigh seachfhreastalaí HTTP</string>\n    <string name=\"pref_title_http_proxy_settings\">Seachfhreastalaí HTTP</string>\n    <string name=\"pref_title_proxy_settings\">Seachfhreastalaí</string>\n    <string name=\"pref_title_show_media_preview\">Íoslódáil réamhamharcanna meán</string>\n    <string name=\"pref_title_show_replies\">Taispeáin freagraí</string>\n    <string name=\"pref_title_show_boosts\">Taispeáin athchraolta</string>\n    <string name=\"pref_title_post_filter\">Scagadh amlíne</string>\n    <string name=\"pref_title_gradient_for_media\">Taispeáin grádáin ildaite do na meáin i bhfolach</string>\n    <string name=\"pref_title_animate_gif_avatars\">Beochan abhatár GIF</string>\n    <string name=\"pref_title_bot_overlay\">Taispeáin táscaire do róbónna</string>\n    <string name=\"pref_title_language\">Teanga</string>\n    <string name=\"label_avatar\">Abhatár</string>\n    <string name=\"title_mentions_dialog\">Tráchtanna</string>\n    <string name=\"action_reblog\">Athchraol</string>\n    <string name=\"action_unreblog\">Cealaigh athchraoladh</string>\n    <string name=\"action_reply\">Freagra</string>\n    <string name=\"action_quick_reply\">Freagra Tapa</string>\n    <string name=\"report_comment_hint\">Tuairimí Breise?</string>\n    <string name=\"report_username_format\">Tuairiscigh @%1$s</string>\n    <string name=\"notification_follow_request_format\">D’iarr %1$s tú a leanúint</string>\n    <string name=\"notification_follow_format\">lean %1$s thú</string>\n    <string name=\"notification_reblog_format\">D\\'athchraol %1$s do phostáil</string>\n    <string name=\"footer_empty\">Níl aon rud anseo. Tarraingt anuas chun athnuachan a dhéanamh!</string>\n    <string name=\"message_empty\">Níl aon rud anseo.</string>\n    <string name=\"post_content_show_less\">Fill</string>\n    <string name=\"filter_dialog_whole_word_description\">Nuair atá an eochairfhocal nó an frása alfa-uimhriúil amháin, ní chuirfear i bhfeidhm é ach má oireann sé don fhocal iomlán</string>\n    <string name=\"title_posts\">Postálacha</string>\n    <string name=\"notification_favourite_format\">Thogh %1$s do phostáil</string>\n    <string name=\"action_unmute_desc\">Unmute %1$s</string>\n    <string name=\"action_mute_conversation\">Comhrá tost</string>\n    <string name=\"action_hashtags\">Clibeanna hash</string>\n    <string name=\"title_hashtags_dialog\">Hashtags</string>\n    <string name=\"dialog_whats_an_instance\">Is féidir an seoladh nó fearann a ghabhann le hásc ar bith a chur isteach anseo, mar shampla mastodon.social, icosahedron.website, social.tchncs.de, agus <a href=\"https://instances.social\">níos mó!</a> \\u0020\n\\n \\u0020\n\\nMuna bhfuil cuntas agat fós, is féidir leat ainm an áisc ar mhaith leat a bheith páirteach ann a chur isteach, agus cuntas a chruthú ann. \\u0020\n\\n \\u0020\n\\nIs éard atá i gceist le hásc na láthair amháin ina ndéantar do chuntas a óstáil, ach is féidir leat cumarsáid a dhéanamh go héasca le daoine eile agus iad a leanúint ar áisc eile mar a bheadh sibh ar an suíomh céanna. \\u0020\n\\n \\u0020\n\\nIs féidir tuilleadh faisnéise a fháil ag <a href=\"https://joinmastodon.org\"> joinmastodon.org </a>. </string>\n    <string name=\"about_project_site\">Suíomh Gréasáin an tionscadail:\n\\n https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Tuarascálacha ar fhabhtanna &amp; iarratais ar ghnéithe:\n\\n https://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"post_media_video\">Físeán</string>\n    <string name=\"state_follow_requested\">Lean iarrtha</string>\n    <string name=\"follows_you\">Do do leanúint</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Taispeáin ábhar íogair i gcónaí</string>\n    <string name=\"filter_dialog_update_button\">Nuashonrú</string>\n    <string name=\"filter_dialog_whole_word\">Focal iomlán</string>\n    <string name=\"filter_add_description\">Frása le scagadh</string>\n    <string name=\"add_account_name\">Cuir Cuntas leis</string>\n    <string name=\"pref_title_alway_open_spoiler\">Leathnaigh i gcónaí postálacha atá marcáilte le rabhaidh ábhair</string>\n    <string name=\"title_media\">Meáin</string>\n    <string name=\"replying_to\">Ag freagairt do @%1$s</string>\n    <string name=\"load_more_placeholder_text\">Lódáil a thuilleadh</string>\n    <string name=\"pref_title_thread_filter_keywords\">Comhráite</string>\n    <string name=\"filter_addition_title\">Cuir scagaire leis</string>\n    <string name=\"filter_edit_title\">Cuir scagaire in eagar</string>\n    <string name=\"filter_dialog_remove_button\">Bain</string>\n    <string name=\"pref_title_public_filter_keywords\">Amlínte poiblí</string>\n    <string name=\"expand_collapse_all_posts\">Leathnaigh/Fill na postálacha go léir</string>\n    <string name=\"restart_emoji\">Beidh ort Tusky a atosú chun na hathruithe seo a chur i bhfeidhm</string>\n    <string name=\"caption_notoemoji\">Sraith emoji reatha Google</string>\n    <string name=\"license_description\">Tá cód agus sócmhainní ó na tionscadail foinse oscailte seo a leanas i Tusky:</string>\n    <string name=\"label_remote_account\">Féadfaidh an fhaisnéis thíos próifíl an úsáideora a léiriú go neamhiomlán. Brúigh chun próifíl iomlán a oscailt sa bhrabhsálaí.</string>\n    <string name=\"description_poll\">Vótaíocht le roghanna: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"list\">Liosta</string>\n    <string name=\"compose_shortcut_long_label\">Scríobh postáil</string>\n    <string name=\"notification_clear_text\">An bhfuil tú cinnte gur mhaith leat do chuid fógraí go léir a ghlanadh go buan?</string>\n    <string name=\"poll_ended_created\">Tá deireadh le vótaíocht a chruthaigh tú</string>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d nóiméad fágtha</item>\n        <item quantity=\"two\">%1$d nóiméid fágtha</item>\n        <item quantity=\"few\">%1$d nóiméid fágtha</item>\n        <item quantity=\"many\">%1$d nóiméid fágtha</item>\n        <item quantity=\"other\">%1$d nóiméid fágtha</item>\n    </plurals>\n    <string name=\"failed_fetch_posts\">Theip ar postálacha a ghabháil</string>\n    <string name=\"report_description_1\">Seolfar an tuarascáil chuig do mhodhnóir freastalaí. Féadfaidh tú míniú a thabhairt ar an bhfáth go bhfuil tú ag tuairisciú an chuntais seo thíos:</string>\n    <string name=\"add_account_description\">Cuir Cuntas Mastodon nua leis</string>\n    <string name=\"error_create_list\">Níorbh fhéidir liosta a chruthú</string>\n    <string name=\"error_rename_list\">Níorbh fhéidir an liosta a athainmniú</string>\n    <string name=\"error_delete_list\">Níorbh fhéidir an liosta a scriosadh</string>\n    <string name=\"action_create_list\">Cruthaigh liosta</string>\n    <string name=\"action_rename_list\">Athainmnigh an liosta</string>\n    <string name=\"action_delete_list\">Scrios an liosta</string>\n    <string name=\"hint_search_people_list\">Cuardaigh daoine a leanann tú</string>\n    <string name=\"action_add_to_list\">Cuir cuntas leis an liosta</string>\n    <string name=\"action_remove_from_list\">Bain cuntas ón liosta</string>\n    <string name=\"compose_active_account_description\">Postáil le cuntas %1$s</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\"/>\n        <item quantity=\"two\"/>\n        <item quantity=\"few\"/>\n        <item quantity=\"many\"/>\n        <item quantity=\"other\">Déan cur síos ar dhaoine lagamhairc\n\\n(teorainn carachtar %1$d)</item>\n    </plurals>\n    <string name=\"action_set_caption\">Socraigh fotheideal</string>\n    <string name=\"action_remove\">Bain</string>\n    <string name=\"lock_account_label\">Cuntas glasála</string>\n    <string name=\"lock_account_label_description\">Éileofar ort leantóirí a cheadú de láimh</string>\n    <string name=\"compose_save_draft\">Sábháil dréacht?</string>\n    <string name=\"send_post_notification_title\">Postáil á sheoladh…</string>\n    <string name=\"send_post_notification_error_title\">Earráid le postáil a sheoladh</string>\n    <string name=\"send_post_notification_channel_name\">Postálacha a Sheoladh</string>\n    <string name=\"send_post_notification_cancel_title\">Cealaíodh seoladh</string>\n    <string name=\"send_post_notification_saved_content\">Sábháladh cóip den phostáil i do chuid dréachtaí</string>\n    <string name=\"action_compose_shortcut\">Cum</string>\n    <string name=\"error_no_custom_emojis\">Níl emoji-nna saincheaptha ag d\\'ásc %1$s</string>\n    <string name=\"emoji_style\">Stíl Emoji</string>\n    <string name=\"system_default\">Réamhshocrú an chórais</string>\n    <string name=\"download_fonts\">Caithfear na tacair emoji seo a íoslódáil ar dtús</string>\n    <string name=\"performing_lookup_title\">Amharc taibhithe…</string>\n    <string name=\"action_open_post\">Oscail postáil</string>\n    <string name=\"restart_required\">Atosú aip de dhíth</string>\n    <string name=\"later\">Níos déanaí</string>\n    <string name=\"restart\">Atosaigh</string>\n    <string name=\"caption_systememoji\">Tacar emoji réamhshocraithe do ghléas</string>\n    <string name=\"caption_blobmoji\">Na emojis Blob atá ar eolas ó Android 4.4-7.1</string>\n    <string name=\"caption_twemoji\">Tacar emoji caighdeánach Mastodon</string>\n    <string name=\"download_failed\">Theip ar íoslódáil</string>\n    <string name=\"profile_badge_bot_text\">Bot</string>\n    <string name=\"account_moved_description\">Tá %1$s tar éis bogadh go:</string>\n    <string name=\"reblog_private\">Athchraol don bhunlucht léite</string>\n    <string name=\"license_apache_2\">Ceadúnaithe faoin gCeadúnas Apache (cóip thíos)</string>\n    <string name=\"profile_metadata_label\">Meiteashonraí próifíle</string>\n    <string name=\"profile_metadata_add\">cuir sonraí leis</string>\n    <string name=\"profile_metadata_label_label\">Lipéad</string>\n    <string name=\"profile_metadata_content_label\">Ábhar</string>\n    <string name=\"pref_title_absolute_time\">Úsáid am iomlán</string>\n    <string name=\"pin_action\">Bioráin</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s </b> Togha</item>\n        <item quantity=\"two\"><b>%1$s</b> Toghanna</item>\n        <item quantity=\"few\"><b>%1$s</b> Toghanna</item>\n        <item quantity=\"many\"><b>%1$s</b> Toghanna</item>\n        <item quantity=\"other\"><b>%1$s</b> Toghanna</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> athchraoladh</item>\n        <item quantity=\"two\"><b>%1$s</b> athchraolta</item>\n        <item quantity=\"few\"><b>%1$s</b> athchraolta</item>\n        <item quantity=\"many\"><b>%1$s</b> athchraolta</item>\n        <item quantity=\"other\"><b>%1$s</b> athchraolta</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">Athchraolta ag</string>\n    <string name=\"title_favourited_by\">Tofa ag</string>\n    <string name=\"conversation_2_recipients\">%1$s agus %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s agus %3$d níos mó</string>\n    <string name=\"description_post_media\">Meáin: %1$s</string>\n    <string name=\"description_post_cw\">Rabhadh ábhair: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Gan cur síos</string>\n    <string name=\"description_post_favourited\">Tofa</string>\n    <string name=\"description_post_bookmarked\">Leabharmharcáilte</string>\n    <string name=\"description_visibility_public\">Poiblí</string>\n    <string name=\"description_visibility_unlisted\">Neamhliostaithe</string>\n    <string name=\"description_visibility_private\">Leantóirí</string>\n    <string name=\"description_visibility_direct\">Díreach</string>\n    <string name=\"hint_list_name\">Ainm liosta</string>\n    <string name=\"add_hashtag_title\">Cuir hashtag leis</string>\n    <string name=\"pick_hashtag_hint\">Hashtag gan #</string>\n    <string name=\"select_list_title\">Roghnaigh liosta</string>\n    <string name=\"notifications_clear\">Glan</string>\n    <string name=\"notifications_apply_filter\">Scagaire</string>\n    <string name=\"filter_apply\">Cuir iarratas isteach</string>\n    <string name=\"compose_shortcut_short_label\">Cum</string>\n    <string name=\"compose_preview_image_description\">Gníomhartha maidir le híomhá %1$s</string>\n    <string name=\"poll_info_format\"> <!-- 15 vóta • 1 uair fágtha --> %1$s •%2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s vóta</item>\n        <item quantity=\"two\">%1$s vóta</item>\n        <item quantity=\"few\">%1$s vóta</item>\n        <item quantity=\"many\">%1$s vóta</item>\n        <item quantity=\"other\">%1$s vóta</item>\n    </plurals>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s duine</item>\n        <item quantity=\"two\">%1$s daoine</item>\n        <item quantity=\"few\">%1$s daoine</item>\n        <item quantity=\"many\">%1$s daoine</item>\n        <item quantity=\"other\">%1$s daoine</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">foircinn ag %1$s</string>\n    <string name=\"poll_info_closed\">dúnta</string>\n    <string name=\"poll_vote\">Vóta</string>\n    <string name=\"poll_ended_voted\">Tá deireadh le vótaíocht ar vótáil tú ann</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d lá</item>\n        <item quantity=\"two\">%1$d lá</item>\n        <item quantity=\"few\">%1$d lá</item>\n        <item quantity=\"many\">%1$d lá</item>\n        <item quantity=\"other\">%1$d lá</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">D\\'imigh %1$d uair</item>\n        <item quantity=\"two\">D\\'imigh %1$d uair an chloig</item>\n        <item quantity=\"few\">D\\'imigh %1$d uair an chloig</item>\n        <item quantity=\"many\">D\\'imigh %1$d uair an chloig</item>\n        <item quantity=\"other\">D\\'imigh %1$d uair an chloig</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">D\\'imigh %1$d soicind</item>\n        <item quantity=\"two\">D\\'imigh %1$d soicind</item>\n        <item quantity=\"few\">D\\'imigh %1$d soicind</item>\n        <item quantity=\"many\">D\\'imigh %1$d soicind</item>\n        <item quantity=\"other\">D\\'imigh %1$d soicind</item>\n    </plurals>\n    <string name=\"button_continue\">Lean ar aghaidh</string>\n    <string name=\"button_back\">Ar ais</string>\n    <string name=\"button_done\">Déanta</string>\n    <string name=\"report_sent_success\">Tuairiscíodh go rathúil @%1$s</string>\n    <string name=\"hint_additional_info\">Tuairimí Breise</string>\n    <string name=\"report_remote_instance\">Seol ar aghaidh chuig %1$s</string>\n    <string name=\"failed_report\">Theip ar thuairisciú</string>\n    <string name=\"report_description_remote_instance\">Is ó fhreastalaí eile an cuntas. Seol cóip gan ainm den tuarascáil ansin freisin?</string>\n    <string name=\"title_accounts\">Cuntais</string>\n    <string name=\"failed_search\">Theip ar chuardach</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Cumasaigh gotha swipe aistriú idir cluaisíní</string>\n    <string name=\"create_poll_title\">Vótaíocht</string>\n    <string name=\"duration_5_min\">5 nóiméid</string>\n    <string name=\"duration_30_min\">30 nóiméid</string>\n    <string name=\"duration_1_hour\">1 uair an chloig</string>\n    <string name=\"duration_6_hours\">6 uair an chloig</string>\n    <string name=\"duration_1_day\">1 lá</string>\n    <string name=\"duration_3_days\">3 lá</string>\n    <string name=\"duration_7_days\">7 lá</string>\n    <string name=\"add_poll_choice\">Cuir rogha leis</string>\n    <string name=\"poll_allow_multiple_choices\">Ilroghanna</string>\n    <string name=\"poll_new_choice_hint\">Rogha %1$d</string>\n    <string name=\"edit_poll\">Cuir in Eagar</string>\n    <string name=\"post_lookup_error_format\">Earráid agus an post á lorg %1$s</string>\n    <string name=\"no_drafts\">Níl aon dréacht agat.</string>\n    <string name=\"no_scheduled_posts\">Níl aon phostáil sceidealta agat.</string>\n    <string name=\"warning_scheduling_interval\">Tá eatramh sceidealaithe íosta 5 nóiméad ag Mastodon.</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Taispeáin réamhamhairc nasc in amlínte</string>\n    <string name=\"pref_title_confirm_reblogs\">Taispeáin dialóg dearbhaithe sula n-athchraolfar</string>\n    <string name=\"title_tab_preferences\">Cluaisíní</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"action_mute_domain\">Balbhaigh %1$s</string>\n    <string name=\"action_unmute_domain\">Unmute %1$s</string>\n    <string name=\"action_unmute_conversation\">Comhrá unmute</string>\n    <string name=\"dialog_mute_warning\">Tost @%1$s?</string>\n    <string name=\"pref_title_post_tabs\">Cluaisíní</string>\n    <string name=\"abbreviated_in_years\">in %1$dy</string>\n    <string name=\"abbreviated_in_days\">in %1$dd</string>\n    <string name=\"abbreviated_in_hours\">in %1$dh</string>\n    <string name=\"abbreviated_in_minutes\">in %1$dm</string>\n    <string name=\"abbreviated_in_seconds\">in %1$ds</string>\n    <string name=\"abbreviated_years_ago\">%1$dy</string>\n    <string name=\"abbreviated_days_ago\">%1$dd</string>\n    <string name=\"abbreviated_hours_ago\">%1$dh</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"unreblog_private\">Bain athchraoladh</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"unpin_action\">Unpin</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"description_post_reblogged\">Reblogged</string>\n    <string name=\"hashtags\">Hashtags</string>\n    <string name=\"wellbeing_mode_notice\">Folófar roinnt eolais ar féidir leis cuir isteach ar do mheabhairshláinte. Tá an méid seo a leanas san áireamh:\n\\n\n\\n - fógraí Toghanna/Athchraolta/Leanúna\n\\n - líon Toghanna/Athchraolta ar postálacha\n\\n - staitisticí Leantóirí/Postálacha ar phróifílí\n\\n\n\\n Ní chuirfear isteach ar brúfhógraí, ach is féidir leat do chuid sainroghanna phearsanra d\\'fhógraí a athbhreithniú de láimh.</string>\n    <string name=\"error_loading_account_details\">Theip ar sonraí an chuntais a lódáil</string>\n    <string name=\"instance_rule_title\">Rialacha %1$s</string>\n    <string name=\"notification_subscription_name\">Postálacha nua</string>\n    <string name=\"account_note_hint\">Do nóta príobháideach faoin cuntas seo</string>\n    <string name=\"account_date_joined\">Anseo ó %1$s</string>\n    <string name=\"notification_subscription_format\">Tá %1$s tar éis postáil</string>\n    <string name=\"notification_update_format\">Chuir %1$s postáil in eagar</string>\n    <string name=\"title_login\">Logáil isteach</string>\n    <string name=\"notification_sign_up_format\">Chláraigh %1$s</string>\n    <string name=\"action_unbookmark\">Bain leabharmharc</string>\n    <string name=\"action_delete_conversation\">Scrios comhrá</string>\n    <string name=\"action_dismiss\">Dún</string>\n    <string name=\"action_details\">Sonraí</string>\n    <string name=\"dialog_delete_conversation_warning\">Scrios an comhrá seo?</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-gd/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"title_lists\">Liostaichean</string>\n    <string name=\"action_lists\">Liostaichean</string>\n    <string name=\"about_title_activity\">Mu dhèidhinn</string>\n    <string name=\"action_reset_schedule\">Ath-shuidhich</string>\n    <string name=\"action_search\">Lorg</string>\n    <string name=\"action_view_account_preferences\">Roghainnean a’ chunntais</string>\n    <string name=\"action_view_preferences\">Roghainnean</string>\n    <string name=\"action_logout\">Clàraich a-mach</string>\n    <string name=\"title_drafts\">Dreachdan</string>\n    <string name=\"title_favourites\">Annsachdan</string>\n    <string name=\"link_whats_an_instance\">Dè a th’ ann an ionstans?</string>\n    <string name=\"edit_poll\">Deasaich</string>\n    <string name=\"filter_edit_title\">Deasaich a’ chriathrag</string>\n    <string name=\"pref_title_edit_notification_settings\">Brathan</string>\n    <string name=\"action_edit_own_profile\">Deasaich</string>\n    <string name=\"action_edit\">Deasaich</string>\n    <string name=\"title_edit_profile\">Deasaich a’ phròifil agad</string>\n    <string name=\"action_edit_profile\">Deasaich a’ phròifil</string>\n    <string name=\"hint_display_name\">Ainm-taisbeanaidh</string>\n    <string name=\"hint_content_warning\">Rabhadh susbaint</string>\n    <string name=\"hint_compose\">Dè tha dol?</string>\n    <string name=\"hint_note\">Sgeul-beatha</string>\n    <string name=\"label_quick_reply\">Freagair…</string>\n    <string name=\"hint_search\">Lorg…</string>\n    <string name=\"action_login\">Clàraich a-steach le Tusky</string>\n    <string name=\"action_send_public\">POSTAICH!</string>\n    <string name=\"action_emoji_keyboard\">Meur-chlàr Emoji</string>\n    <string name=\"action_unfollow\">Na lean tuilleadh</string>\n    <string name=\"action_follow\">Lean</string>\n    <string name=\"action_more\">Barrachd</string>\n    <string name=\"action_retry\">Feuch ris a-rithist</string>\n    <string name=\"action_close\">Dùin</string>\n    <string name=\"action_send\">POSTAICH</string>\n    <string name=\"action_delete\">Sguab às</string>\n    <string name=\"action_delete_and_redraft\">Sguab às is dèan dreachd ùr air</string>\n    <string name=\"action_report\">Dèan gearan</string>\n    <string name=\"action_unblock\">Dì-bhac</string>\n    <string name=\"action_hide_reblogs\">Falaich na brosnachaidhean</string>\n    <string name=\"action_show_reblogs\">Seall na brosnachaidhean</string>\n    <string name=\"action_block\">Bac</string>\n    <string name=\"action_compose\">Sgrìobh</string>\n    <string name=\"action_content_warning\">Rabhadh susbaint</string>\n    <string name=\"action_compose_shortcut\">Sgrìobh</string>\n    <string name=\"compose_shortcut_short_label\">Sgrìobh</string>\n    <string name=\"pref_title_show_boosts\">Seall na brosnachaidhean</string>\n    <string name=\"action_open_reblogged_by\">Seall na brosnachaidhean</string>\n    <string name=\"action_access_drafts\">Dreachdan</string>\n    <string name=\"action_view_favourites\">Annsachdan</string>\n    <string name=\"pref_title_notifications_enabled\">Brathan</string>\n    <string name=\"title_notifications\">Brathan</string>\n    <string name=\"notification_favourite_name\">Annsachdan</string>\n    <string name=\"action_unsubscribe_account\">Cuir crìoch air an fho-sgrìobhadh</string>\n    <string name=\"action_subscribe_account\">Fo-sgrìobh</string>\n    <string name=\"pref_title_animate_custom_emojis\">Beòthaich na h-Emojis gnàthaichte</string>\n    <string name=\"drafts_post_reply_removed\">Bha againn ris a’ phost a bha thu airson freagairt dha a thoirt air falbh</string>\n    <string name=\"draft_deleted\">Chaidh an dreach a sguabadh às</string>\n    <string name=\"drafts_failed_loading_reply\">Cha deach leinn fiosrachadh na freagairte a luchdadh</string>\n    <string name=\"drafts_post_failed_to_send\">Cha b’ urrainn dhuinn am post a chur!</string>\n    <string name=\"post_media_attachments\">Ceanglachain</string>\n    <string name=\"post_media_audio\">Fuaim</string>\n    <string name=\"dialog_delete_list_warning\">A bheil thu cinnteach gu bheil thu airson an liosta %1$s a sguabadh às?</string>\n    <string name=\"duration_7_days\">7 làithean</string>\n    <string name=\"duration_3_days\">3 làithean</string>\n    <string name=\"duration_1_day\">Latha</string>\n    <string name=\"duration_6_hours\">6 uairean a thìde</string>\n    <string name=\"duration_1_hour\">Uair a thìde</string>\n    <string name=\"duration_30_min\">Leth-uair a thìde</string>\n    <string name=\"duration_5_min\">5 mionaidean</string>\n    <string name=\"duration_indefinite\">Gun chrìoch</string>\n    <string name=\"label_duration\">Faide</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Chan urrainn dhut barrachd air %1$d cheanglachan meadhain a luchdadh suas.</item>\n        <item quantity=\"two\">Chan urrainn dhut barrachd air %1$d cheanglachan meadhain a luchdadh suas.</item>\n        <item quantity=\"few\">Chan urrainn dhut barrachd air %1$d ceanglachain meadhain a luchdadh suas.</item>\n        <item quantity=\"other\">Chan urrainn dhut barrachd air %1$d ceanglachan meadhain a luchdadh suas.</item>\n    </plurals>\n    <string name=\"wellbeing_hide_stats_profile\">Falaich an stadastaireachd àireamhail air pròifilean</string>\n    <string name=\"wellbeing_hide_stats_posts\">Falaich an stadastaireachd àireamhail air postaichean</string>\n    <string name=\"limit_notifications\">Cuingich na brathan mun loidhne-ama</string>\n    <string name=\"review_notifications\">Thoir sùil air na brathan</string>\n    <string name=\"wellbeing_mode_notice\">Thèid cuid a dh’fhiosrachadh a dh’fhaodadh droch-bhuaidh a thoirt air d’ shlàinte-inntinn fhalach. Tha seo a’ gabhail a-staigh:\n\\n\n\\n - Brathan air annsachdan/brosnachaidhean/leanntainn\n\\n - Cunntas nan annsachdan/brosnachaidhean air postaichean\n\\n - Stadastaireachd an luchd-leantainn/nam postaichean air pròifilean\n\\n\n\\n Cha doir seo buaidh air na brathan-putaidh ach ’s urrainn dhut roghainnean nam brathan agad atharrachadh a làimh.</string>\n    <string name=\"pref_title_wellbeing_mode\">Slàinte-inntinn</string>\n    <string name=\"notification_subscription_description\">Brathan nuair a dh’fhoillsich cuideigin air a rinn mi fo-sgrìobhadh post ùr</string>\n    <string name=\"notification_subscription_name\">Postaichean ùra</string>\n    <string name=\"notification_subscription_format\">Phostaich %1$s rud</string>\n    <string name=\"no_announcements\">Chan eil brath-fios ann.</string>\n    <string name=\"title_announcements\">Brathan-fios</string>\n    <string name=\"account_note_saved\">Chaidh a shàbhaladh!</string>\n    <string name=\"account_note_hint\">Nòta prìobhaideach agad mun chunntas seo</string>\n    <string name=\"pref_title_hide_top_toolbar\">Falaich tiotal a’ bhàir-inneal aig a’ bhàrr</string>\n    <string name=\"dialog_mute_hide_notifications\">Falaich na brathan</string>\n    <string name=\"pref_title_confirm_reblogs\">Seall dearbhadh mus dèan thu brosnachadh</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Seall ro-sheallaidhean air ceanglaichean sna loidhnichean-ama</string>\n    <string name=\"warning_scheduling_interval\">Feumaidh co-dhiù 5 mionaidean a bhith eadar postaichean sgeidealaichte air Mastodon.</string>\n    <string name=\"no_scheduled_posts\">Chan eil post sam bith air an sgeideal agad.</string>\n    <string name=\"no_drafts\">Chan eil dreachd sam bith agad.</string>\n    <string name=\"post_lookup_error_format\">Thachair mearachd le lorg a’ phuist %1$s</string>\n    <string name=\"poll_new_choice_hint\">Roghainn %1$d</string>\n    <string name=\"poll_allow_multiple_choices\">Iomadh roghainn</string>\n    <string name=\"add_poll_choice\">Cuir roghainn ris</string>\n    <string name=\"create_poll_title\">Cunntas-bheachd</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Cuir an comas gluasad grad-shlaighdidh airson leum a ghearradh o thaba gu taba</string>\n    <string name=\"failed_search\">Dh’fhàillig leis an lorg</string>\n    <string name=\"title_accounts\">Cunntasan</string>\n    <string name=\"report_description_remote_instance\">Chaidh an cunntas a chlàradh air frithealaiche eile. A bheil thu airson lethbhreac dhen ghearan a chur dha-san gun ainm cuideachd?</string>\n    <string name=\"report_description_1\">Thèid do ghearan a chur gu maor an fhrithealaiche agad. ’S urrainn dhut mìneachadh a sholar air carson a tha thu a’ gearan mun chunntas gu h-ìosal:</string>\n    <string name=\"failed_fetch_posts\">Cha b’ urrainn dhuinn na postaichean fhaighinn</string>\n    <string name=\"failed_report\">Cha b’ urrainn dhuinn do ghearan a chlàradh</string>\n    <string name=\"report_remote_instance\">Sìn air adhart gu %1$s</string>\n    <string name=\"hint_additional_info\">Beachdan a bharrachd</string>\n    <string name=\"report_sent_success\">Chaidh do gearan air @%1$s a chlàradh</string>\n    <string name=\"button_done\">Deiseil</string>\n    <string name=\"button_back\">Air ais</string>\n    <string name=\"button_continue\">Air adhart</string>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">Tha %1$d diog air fhàgail</item>\n        <item quantity=\"two\">Tha %1$d dhiog air fhàgail</item>\n        <item quantity=\"few\">Tha %1$d diogan air fhàgail</item>\n        <item quantity=\"other\">Tha %1$d diog air fhàgail</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">Tha %1$d mhionaid air fhàgail</item>\n        <item quantity=\"two\">Tha %1$d mhionaid air fhàgail</item>\n        <item quantity=\"few\">Tha %1$d mionaidean air fhàgail</item>\n        <item quantity=\"other\">Tha %1$d mionaid air fhàgail</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">Tha %1$d uair a thìde air fhàgail</item>\n        <item quantity=\"two\">Tha %1$d uair a thìde air fhàgail</item>\n        <item quantity=\"few\">Tha %1$d uairean a thìde air fhàgail</item>\n        <item quantity=\"other\">Tha %1$d uair a thìde air fhàgail</item>\n    </plurals>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">Tha %1$d latha air fhàgail</item>\n        <item quantity=\"two\">Tha %1$d latha air fhàgail</item>\n        <item quantity=\"few\">Tha %1$d làithean air fhàgail</item>\n        <item quantity=\"other\">Tha %1$d latha air fhàgail</item>\n    </plurals>\n    <string name=\"poll_ended_created\">Thàinig cunntas-bheachd sa chruthaich thu gu crìoch</string>\n    <string name=\"poll_ended_voted\">Thàinig cunntas-bheachd sa bhòt thu gu crìoch</string>\n    <string name=\"poll_vote\">Bhòt</string>\n    <string name=\"poll_info_closed\">air a dhùnadh</string>\n    <string name=\"poll_info_time_absolute\">thig e gu crìoch %1$s</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s duine</item>\n        <item quantity=\"two\">%1$s dhuine</item>\n        <item quantity=\"few\">%1$s dhaoine</item>\n        <item quantity=\"other\">%1$s duine</item>\n    </plurals>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s bhòt</item>\n        <item quantity=\"two\">%1$s bhòt</item>\n        <item quantity=\"few\">%1$s bhòtaichean</item>\n        <item quantity=\"other\">%1$s bhòt</item>\n    </plurals>\n    <string name=\"poll_info_format\"> \\u0020<!-- 15 bhòtaichean • 1 uair a thìde air fhàgail --> %1$s • %2$s</string>\n    <string name=\"compose_preview_image_description\">Gnìomhan dhan dealbh %1$s</string>\n    <string name=\"notification_clear_text\">A bheil thu cinnteach gu bheil thu airson na brathan uile agad fhalamhachadh gu buan?</string>\n    <string name=\"compose_shortcut_long_label\">Sgrìobh post</string>\n    <string name=\"filter_apply\">Cuir an sàs</string>\n    <string name=\"notifications_apply_filter\">Criathraich</string>\n    <string name=\"notifications_clear\">Sguab às</string>\n    <string name=\"list\">Liosta</string>\n    <string name=\"select_list_title\">Tagh liosta</string>\n    <string name=\"pick_hashtag_hint\">Taga hais gun #</string>\n    <string name=\"add_hashtag_title\">Cuir taga hais ris</string>\n    <string name=\"hint_list_name\">Ainm na liosta</string>\n    <string name=\"description_poll\">Cunntas-bheachd le roghainnean: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"description_visibility_direct\">Dìreach</string>\n    <string name=\"description_post_bookmarked\">’Na chomharra-lìn</string>\n    <string name=\"description_post_favourited\">’Na annsachd</string>\n    <string name=\"description_post_reblogged\">Air ath-bhlogadh</string>\n    <string name=\"description_post_media_no_description_placeholder\">Gun tuairisgeul</string>\n    <string name=\"description_post_cw\">Rabhadh susbainte: %1$s</string>\n    <string name=\"description_post_media\">Meadhan: %1$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s ’s %3$d eile</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"title_favourited_by\">’Na annsachd aig</string>\n    <string name=\"title_reblogged_by\">’Ga brosnachadh le</string>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> bhrosnachadh</item>\n        <item quantity=\"two\"><b>%1$s</b> bhrosnachadh</item>\n        <item quantity=\"few\"><b>%1$s</b> brosnachaidhean</item>\n        <item quantity=\"other\"><b>%1$s</b> brosnachadh</item>\n    </plurals>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> annsachd</item>\n        <item quantity=\"two\"><b>%1$s</b> annsachd</item>\n        <item quantity=\"few\"><b>%1$s</b> annsachdan</item>\n        <item quantity=\"other\"><b>%1$s</b> annsachd</item>\n    </plurals>\n    <string name=\"pin_action\">Prìnich</string>\n    <string name=\"unpin_action\">Dì-phrìnich</string>\n    <string name=\"label_remote_account\">Dh’fhaoidte nach fhaic thu pròifil gu lèir a’ chleachdaiche gu h-ìosal. Dèan brùthadh gus a’ phròifil shlàn fhosgladh ann am brabhsair.</string>\n    <string name=\"pref_title_absolute_time\">Cleachd àm absaloideach</string>\n    <string name=\"profile_metadata_content_label\">Susbaint</string>\n    <string name=\"profile_metadata_label_label\">Leubail</string>\n    <string name=\"profile_metadata_add\">cuir dàta ris</string>\n    <string name=\"profile_metadata_label\">Meata-dàta na pròifile</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_apache_2\">Fo cheadachas Apache License (chì thu lethbhreac dheth gu h-ìosal)</string>\n    <string name=\"license_description\">Tha còs is maoin o na pròiseactan open source seo am broinn Tusky:</string>\n    <string name=\"unreblog_private\">Na brosnaich tuilleadh</string>\n    <string name=\"reblog_private\">Brosnaich dhan èisteachd thùsail</string>\n    <string name=\"account_moved_description\">Chaidh %1$s a ghluasad gu:</string>\n    <string name=\"profile_badge_bot_text\">Robotair</string>\n    <string name=\"download_failed\">Dh’fhàillig an luchdadh a-nuas</string>\n    <string name=\"caption_notoemoji\">Seata làithreach nan Emoji aig Google</string>\n    <string name=\"caption_twemoji\">Seata stannardach nan Emoji aig Mastodon</string>\n    <string name=\"caption_blobmoji\">Emojis Blob aig Android 4.4–7.1</string>\n    <string name=\"caption_systememoji\">Seata bunaiteach nan Emojis air an uidheam agad</string>\n    <string name=\"restart\">Ath-thòisich</string>\n    <string name=\"later\">Uaireigin eile</string>\n    <string name=\"restart_emoji\">Feumaidh tu Tusky ath-thòiseachadh gus na roghainnean seo a chur an sàs</string>\n    <string name=\"restart_required\">Feumaidh tu an aplacaid ath-thòiseachadh</string>\n    <string name=\"action_open_post\">Fosgail am post</string>\n    <string name=\"expand_collapse_all_posts\">Leudaich/Co-theannaich gach post</string>\n    <string name=\"performing_lookup_title\">’Ga lorg…</string>\n    <string name=\"download_fonts\">Feumaidh tu na seataichean seo de dh’Emojis a luchdadh a-nuas an toiseach</string>\n    <string name=\"system_default\">Bun-roghainn an t-siostaim</string>\n    <string name=\"emoji_style\">Stoidhle nan Emojis</string>\n    <string name=\"error_no_custom_emojis\">Chan eil Emojis gnàthaichte aig an ionstans %1$s agad</string>\n    <string name=\"send_post_notification_saved_content\">Chaidh lethbhreac dhen phost agad a shàbhaladh ’na dhreachd</string>\n    <string name=\"send_post_notification_cancel_title\">Chaidh sgur dhen chur</string>\n    <string name=\"send_post_notification_channel_name\">A’ cur nam post</string>\n    <string name=\"send_post_notification_error_title\">Mearachd a’ cur a’ phuist</string>\n    <string name=\"send_post_notification_title\">A’ cur a’ phuist…</string>\n    <string name=\"compose_save_draft\">A bheil thu airson a shàbhaladh ’na dhreachd?</string>\n    <string name=\"lock_account_label_description\">Feumaidh tu gabhail ri luchd-leantainn ùr a làimh</string>\n    <string name=\"lock_account_label\">Glais an cunntas</string>\n    <string name=\"action_set_caption\">Suidhich am fo-thiotal</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Mìnich an t-susbaint dhan fheadhainn air a bheil cion-lèirsinn (%1$d charactar air a char as fhaide)</item>\n        <item quantity=\"two\">Mìnich an t-susbaint dhan fheadhainn air a bheil cion-lèirsinn (%1$d charactar air a char as fhaide)</item>\n        <item quantity=\"few\">Mìnich an t-susbaint dhan fheadhainn air a bheil cion-lèirsinn (%1$d caractaran air a char as fhaide)</item>\n        <item quantity=\"other\">Mìnich an t-susbaint dhan fheadhainn air a bheil cion-lèirsinn (%1$d caractar air a char as fhaide)</item>\n    </plurals>\n    <string name=\"compose_active_account_description\">A’ postadh mar %1$s</string>\n    <string name=\"action_remove_from_list\">Thoir an cunntas air falbh on liosta</string>\n    <string name=\"action_add_to_list\">Cuir cunntas ris an liosta</string>\n    <string name=\"hint_search_people_list\">Lorg daoine air a leanas tu</string>\n    <string name=\"action_delete_list\">Sguab às an liosta</string>\n    <string name=\"action_rename_list\">Ùraich an liosta</string>\n    <string name=\"action_create_list\">Cruthaich liosta</string>\n    <string name=\"error_delete_list\">Cha b’ urrainn dhuinn an liosta a sguabadh às</string>\n    <string name=\"error_rename_list\">Cha b’ urrainn dhuinn an liosta ùrachadh</string>\n    <string name=\"error_create_list\">Cha b’ urrainn dhuinn an liosta a chruthachadh</string>\n    <string name=\"add_account_description\">Cuir cunntas Mastodon ùr ris</string>\n    <string name=\"add_account_name\">Cuir cunntas ris</string>\n    <string name=\"filter_add_description\">An abairt ri chriathradh</string>\n    <string name=\"filter_dialog_whole_word_description\">Mur eil ach litrichean is àireamhan san fhacal-luirg, cha dèid a chur an sàs ach ma bhios e a’ maidseadh an fhacail shlàin</string>\n    <string name=\"pref_title_alway_open_spoiler\">Leudaich postaichean ris a bheil rabhadh susbainte an-còmhnaidh</string>\n    <string name=\"post_share_link\">Co-roinn ceangal dhan phost</string>\n    <string name=\"post_share_content\">Co-roinn susbaint a’ phuist</string>\n    <string name=\"about_tusky_license\">’S e bathar-bog saor le bun-tùs fosgailte a th’ ann an Tusky. Tha e fo cheadachas GNU General Public License tionndadh 3. Chì thu an ceadachas an-seo: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <string name=\"notification_favourite_description\">Brathan nuair a thèid post agad a chomharrachadh ’na annsachd</string>\n    <string name=\"notification_boost_description\">Brathan nuair a thèid post agad brosnachadh</string>\n    <string name=\"dialog_redraft_post_warning\">A bheil thu airson am post seo a sguabadh às is dreachd ùr a dhèanamh air?</string>\n    <string name=\"dialog_delete_post_warning\">A bheil thu airson am post seo a sguabadh às?</string>\n    <string name=\"dialog_whats_an_instance\">’S urrainn dhut seòladh no àrainn-lìn aig ionstans sam bith a chur a-steach an-seo, can mastodon.social, icosahedron.website, social.tchncs.de agus <a href=\"https://instances.social\">a bharrachd!</a> \\u0020 \n\\n \\u0020 \n\\nMur eil cunntas agad fhathast, cuir a-steach ainm an ionstans sa bheil thu airson ballrachd fhaighinn airson cunntas a chruthachadh ann. \\u0020 \n\\n \\u0020 \n\\n’S e an t-aon àite far an cruthaich thu cunntas a th’ ann an ionstans ud ’s a nì an t-òstadh dhan chunntas agad. Gidheadh, ’s urrainn dhut conaltradh le daoine a tha air ionstans eile agus leantainn orra mar gun robh sibh air an aon làrach. \\u0020 \n\\n \\u0020 \n\\nGheibh thu barrachd fiosrachaidh air <a href=\"https://joinmastodon.org\">joinmastodon.org</a>. \\u0020</string>\n    <string name=\"send_post_content_to\">Co-roinn am post le…</string>\n    <string name=\"send_post_link_to\">Co-roinn URL a’ phuist le…</string>\n    <string name=\"action_schedule_post\">Cuir post air an sgeideal</string>\n    <string name=\"action_toggle_visibility\">Faicsinneachd a’ phuist</string>\n    <string name=\"action_access_scheduled_posts\">Postaichean air an sgeideal</string>\n    <string name=\"notification_favourite_format\">Is annsa le %1$s am post agad</string>\n    <string name=\"notification_reblog_format\">Bhrosnaich %1$s am post agad</string>\n    <string name=\"title_scheduled_posts\">Postaichean air an sgeideal</string>\n    <string name=\"title_view_thread\">Snàithlean</string>\n    <string name=\"error_sender_account_gone\">Mearachd a’ cur a’ phuist.</string>\n    <string name=\"action_unmute_desc\">Dì-mhùch %1$s</string>\n    <string name=\"hashtags\">Tagaichean hais</string>\n    <string name=\"description_visibility_private\">Luchd-leantainn</string>\n    <string name=\"description_visibility_unlisted\">Falaichte o liostaichean</string>\n    <string name=\"description_visibility_public\">Poblach</string>\n    <string name=\"conversation_2_recipients\">%1$s ’s %2$s</string>\n    <string name=\"action_remove\">Thoir air falbh</string>\n    <string name=\"filter_dialog_whole_word\">Facal slàn</string>\n    <string name=\"filter_dialog_update_button\">Ùraich</string>\n    <string name=\"filter_dialog_remove_button\">Thoir air falbh</string>\n    <string name=\"filter_addition_title\">Cuir criathrag ris</string>\n    <string name=\"pref_title_thread_filter_keywords\">Còmhraidhean</string>\n    <string name=\"pref_title_public_filter_keywords\">Loidhnichean-ama poblach</string>\n    <string name=\"load_more_placeholder_text\">Luchdaich barrachd dheth</string>\n    <string name=\"replying_to\">A’ freagairt gu @%1$s</string>\n    <string name=\"title_media\">Meadhanan</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Seall susbaint fhrionasach an-còmhnaidh</string>\n    <string name=\"follows_you\">’Gad leantainn</string>\n    <string name=\"abbreviated_seconds_ago\">%1$dd</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm</string>\n    <string name=\"abbreviated_hours_ago\">%1$du</string>\n    <string name=\"abbreviated_days_ago\">%1$dl</string>\n    <string name=\"abbreviated_years_ago\">%1$db</string>\n    <string name=\"abbreviated_in_seconds\">an ceann %1$dd</string>\n    <string name=\"abbreviated_in_minutes\">an ceann %1$dm</string>\n    <string name=\"abbreviated_in_hours\">an ceann %1$du</string>\n    <string name=\"abbreviated_in_days\">an ceann %1$dl</string>\n    <string name=\"abbreviated_in_years\">an ceann %1$db</string>\n    <string name=\"state_follow_requested\">Iarrtas leantainn air</string>\n    <string name=\"post_media_video\">Videothan</string>\n    <string name=\"post_media_images\">Dealbhan</string>\n    <string name=\"about_tusky_account\">Pròifil Tusky</string>\n    <string name=\"about_bug_feature_request_site\">Aithrisean air bugaichean ⁊ iarrtasan air gleusan:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_project_site\">Làrach-lìn a’ phròiseict: https://tusky.app</string>\n    <string name=\"about_powered_by_tusky\">Le cumhachd Tusky</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"description_account_locked\">Cunntas glaiste</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d chonaltradh ùr</item>\n        <item quantity=\"two\">%1$d chonaltradh ùr</item>\n        <item quantity=\"few\">%1$d conaltraidhean ùra</item>\n        <item quantity=\"other\">%1$d conaltradh ùr</item>\n    </plurals>\n    <string name=\"notification_summary_small\">%1$s ’s %2$s</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s ’s %3$s</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s ’s %4$d eile</string>\n    <string name=\"notification_mention_format\">Thug %1$s iomradh ort</string>\n    <string name=\"notification_poll_description\">Brathan mu chunntasan-bheachd a thàinig gu crìoch</string>\n    <string name=\"notification_poll_name\">Cunntasan-bheachd</string>\n    <string name=\"notification_boost_name\">Brosnachaidhean</string>\n    <string name=\"notification_follow_request_description\">Brathan mu iarrtasan leantainn</string>\n    <string name=\"notification_follow_request_name\">Iarrtasan leantainn</string>\n    <string name=\"notification_follow_description\">Brathan mu luchd-leantainn ùr</string>\n    <string name=\"notification_follow_name\">Luchd-leantainn ùr</string>\n    <string name=\"notification_mention_descriptions\">Brathan mu iomraidhean ùra</string>\n    <string name=\"notification_mention_name\">Iomraidhean ùra</string>\n    <string name=\"post_text_size_largest\">As motha</string>\n    <string name=\"post_text_size_large\">Mòr</string>\n    <string name=\"post_text_size_medium\">Meadhanach</string>\n    <string name=\"post_text_size_small\">Beag</string>\n    <string name=\"post_text_size_smallest\">As lugha</string>\n    <string name=\"pref_post_text_size\">Meud teacsa nam post</string>\n    <string name=\"post_privacy_followers_only\">Luchd-leantainn a-mhàin</string>\n    <string name=\"post_privacy_unlisted\">Neo-liostaichte</string>\n    <string name=\"post_privacy_public\">Poblach</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Aig a’ bhonn</string>\n    <string name=\"pref_main_nav_position_option_top\">Aig a’ bhàrr</string>\n    <string name=\"pref_main_nav_position\">Prìomh-ionad na seòladaireachd</string>\n    <string name=\"pref_failed_to_sync\">Dh’fhàillig le sioncronachadh nan roghainnean</string>\n    <string name=\"pref_publishing\">Bun-roghainnean an fhoillseachaidh</string>\n    <string name=\"pref_default_media_sensitivity\">Cuir comharra ri meadhanan an-còmhnaidh gu bheil iad frionasach (’ga shioncronachadh leis an fhrithealaiche)</string>\n    <string name=\"pref_default_post_privacy\">Prìobhaideachd nam post (’ga shioncronachadh leis an fhrithealaiche)</string>\n    <string name=\"pref_title_http_proxy_port\">Port progsaidh HTTP</string>\n    <string name=\"pref_title_http_proxy_server\">Frithealaiche progsaidh HTTP</string>\n    <string name=\"pref_title_http_proxy_enable\">Cuir an comas a’ phrogsaidh HTTP</string>\n    <string name=\"pref_title_http_proxy_settings\">Progsaidh HTTP</string>\n    <string name=\"pref_title_proxy_settings\">Progsaidh</string>\n    <string name=\"pref_title_show_media_preview\">Luchdaich a-nuas ro-sheallaidhean air meadhanan</string>\n    <string name=\"pref_title_show_replies\">Seall na freagairtean</string>\n    <string name=\"pref_title_post_tabs\">Dachaigh</string>\n    <string name=\"pref_title_post_filter\">Criathradh na loidhne-ama</string>\n    <string name=\"pref_title_gradient_for_media\">Seall caiseadan dathte an àite meadhanan falaichte</string>\n    <string name=\"pref_title_animate_gif_avatars\">Beothaich avataran GIF</string>\n    <string name=\"pref_title_bot_overlay\">Seall taisbeanair do bhotaichean</string>\n    <string name=\"pref_title_language\">Cànan</string>\n    <string name=\"pref_title_custom_tabs\">Cleachd tabaichean Chrome gnàthaichte</string>\n    <string name=\"pref_title_browser_settings\">Brabhsair</string>\n    <string name=\"app_theme_system\">Cleachd co-dhealbhachd an t-siostaim</string>\n    <string name=\"app_theme_auto\">Gu fèin-obrachail aig beul na h-oidhche</string>\n    <string name=\"app_theme_black\">Dubh</string>\n    <string name=\"app_theme_light\">Soilleir</string>\n    <string name=\"app_them_dark\">Dorcha</string>\n    <string name=\"pref_title_timeline_filters\">Criathragan</string>\n    <string name=\"pref_title_timelines\">Loidhnichean-ama</string>\n    <string name=\"pref_title_app_theme\">Ùrlar na h-aplacaid</string>\n    <string name=\"pref_title_appearance_settings\">Coltas</string>\n    <string name=\"pref_title_notification_filters\">Cuir brath thugam nuair a</string>\n    <string name=\"pref_title_notification_alert_light\">Seall solas nuair a thig brath a-steach</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Dèan crith nuair a thig brath a-steach</string>\n    <string name=\"pref_title_notification_alert_sound\">Seirm nuair a thig brath a-steach</string>\n    <string name=\"pref_title_notification_alerts\">Rabhaidhean</string>\n    <string name=\"visibility_direct\">Dìreach: Postaich dha na cleachdaichean le iomradh orra a-mhàin</string>\n    <string name=\"visibility_private\">Luchd-leantainn a-mhàin: Postaich dhan luchd-leantainn a-mhàin</string>\n    <string name=\"visibility_unlisted\">Neo-liostaichte: Na seall air loidhnichean-ama poblach</string>\n    <string name=\"visibility_public\">Poblach: Postaich gu loidhnichean-ama poblach</string>\n    <string name=\"dialog_mute_warning\">A bheil thu airson @%1$s a mhùchadh?</string>\n    <string name=\"dialog_block_warning\">A bheil thu airson @%1$s a bhacadh?</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Falaich an àrainn uile gu lèir</string>\n    <string name=\"mute_domain_warning\">A bheil thu cinnteach gu bheil thu airson %1$s a bhacadh uile gu lèir? Chan fhaic thu susbaint on àrainn ud air loidhne-ama phoblach sam bith no am measg nam brathan agad. Thèid an luchd-leantainn agad on àrainn ud a thoirt air falbh.</string>\n    <string name=\"dialog_unfollow_warning\">A bheil thu airson sgur de leantainn air a’ chunntas seo?</string>\n    <string name=\"dialog_message_cancel_follow_request\">A bheil thu airson an t-iarrtas leantainn a chùl-ghairm?</string>\n    <string name=\"dialog_download_image\">Luchdaich a-nuas</string>\n    <string name=\"dialog_message_uploading_media\">’Ga luchdadh suas…</string>\n    <string name=\"dialog_title_finishing_media_upload\">A’ crìochnachadh luchdadh suas meadhanan</string>\n    <string name=\"login_connection\">A’ dèanamh ceangal…</string>\n    <string name=\"label_header\">Bann-cinn</string>\n    <string name=\"label_avatar\">Avatar</string>\n    <string name=\"search_no_results\">Chan eil toradh ann</string>\n    <string name=\"hint_domain\">Cò an t-ionstans?</string>\n    <string name=\"confirmation_domain_unmuted\">Chan eil %1$s falaichte tuilleadh</string>\n    <string name=\"confirmation_unmuted\">Chaidh an cleachdaiche dhì-mhùchadh</string>\n    <string name=\"confirmation_unblocked\">Chaidh an cleachdaiche a dhì-bhacadh</string>\n    <string name=\"confirmation_reported\">Chaidh a chur!</string>\n    <string name=\"send_media_to\">Co-roinn am meadhan le…</string>\n    <string name=\"downloading_media\">A’ luchdadh a-nuas meadhanan</string>\n    <string name=\"download_media\">Luchdaich a-nuas meadhanan</string>\n    <string name=\"action_share_as\">Co-roinn mar …</string>\n    <string name=\"action_open_as\">Fosgail mar %1$s</string>\n    <string name=\"action_copy_link\">Dèan lethbhreac dhen cheangal</string>\n    <string name=\"download_image\">A’ luchdadh a-nuas %1$s</string>\n    <string name=\"action_open_media_n\">Fosgail meadhan #%1$d</string>\n    <string name=\"title_links_dialog\">Ceanglaichean</string>\n    <string name=\"title_mentions_dialog\">Iomraidhean</string>\n    <string name=\"title_hashtags_dialog\">Tagaichean hais</string>\n    <string name=\"action_open_faved_by\">Seall na h-annsachdan</string>\n    <string name=\"action_open_reblogger\">Fosgail ùghdar a’ bhrosnachaidh</string>\n    <string name=\"action_hashtags\">Tagaichean hais</string>\n    <string name=\"action_mentions\">Iomraidhean</string>\n    <string name=\"action_links\">Ceanglaichean</string>\n    <string name=\"action_add_tab\">Cuir taba ris</string>\n    <string name=\"action_reject\">Diùlt</string>\n    <string name=\"action_accept\">Gabh ris</string>\n    <string name=\"action_undo\">Neo-dhèan</string>\n    <string name=\"action_save\">Sàbhail</string>\n    <string name=\"action_open_drawer\">Fosgail an drathair</string>\n    <string name=\"action_hide_media\">Falaich na meadhanan</string>\n    <string name=\"action_mention\">Iomradh</string>\n    <string name=\"action_unmute_conversation\">Dì-mhùch an còmhradh</string>\n    <string name=\"action_mute_conversation\">Mùch an còmhradh</string>\n    <string name=\"action_unmute_domain\">Dì-mhùch %1$s</string>\n    <string name=\"action_mute_domain\">Mùch %1$s</string>\n    <string name=\"action_unmute\">Dì-mhùch</string>\n    <string name=\"action_mute\">Mùch</string>\n    <string name=\"action_share\">Co-roinn</string>\n    <string name=\"action_photo_take\">Tog dealbh</string>\n    <string name=\"action_add_poll\">Cuir cunntas-bheachd ris</string>\n    <string name=\"action_add_media\">Cuir meadhan ris</string>\n    <string name=\"action_open_in_web\">Fosgail sa bhrabhsair</string>\n    <string name=\"action_view_media\">Meadhanan</string>\n    <string name=\"action_view_follow_requests\">Iarrtasan leantainn</string>\n    <string name=\"action_view_domain_mutes\">Àrainnean falaichte</string>\n    <string name=\"action_view_blocks\">Cleachdaichean bacte</string>\n    <string name=\"action_view_mutes\">Cleachdaichean mùchte</string>\n    <string name=\"action_view_bookmarks\">Comharran-lìn</string>\n    <string name=\"action_view_profile\">Pròifil</string>\n    <string name=\"action_logout_confirm\">A bheil thu cinnteach gu bheil thu airson clàradh a-mach à %1$s? Thèid gach dàta ionadail a’ chunntais a sguabadh às, a’ gabhail a-staigh nan dreachdan is roghainnean.</string>\n    <string name=\"action_unfavourite\">Thoir air falbh o na h-annsachdan</string>\n    <string name=\"action_bookmark\">Cuir ris na comharran-lìn</string>\n    <string name=\"action_favourite\">Cuir ris na h-annsachdan</string>\n    <string name=\"action_unreblog\">Thoir am brosnachadh air falbh</string>\n    <string name=\"action_reblog\">Brosnaich</string>\n    <string name=\"action_reply\">Freagair</string>\n    <string name=\"action_quick_reply\">Grad-fhreagairt</string>\n    <string name=\"report_comment_hint\">Beachd sam bith eile?</string>\n    <string name=\"report_username_format\">Dèan gearan mu @%1$s</string>\n    <string name=\"notification_follow_request_format\">Dh’iarr %1$s leantainn ort</string>\n    <string name=\"notification_follow_format\">Lean %1$s ort</string>\n    <string name=\"footer_empty\">Chan eil dad an-seo. Tarraing a-nuas airson ath-nuadhachadh!</string>\n    <string name=\"message_empty\">Chan eil dad an-seo.</string>\n    <string name=\"post_content_show_less\">Co-theannaich</string>\n    <string name=\"post_content_show_more\">Leudaich</string>\n    <string name=\"post_content_warning_show_less\">Seall nas lugha dheth</string>\n    <string name=\"post_content_warning_show_more\">Seall barrachd dheth</string>\n    <string name=\"post_sensitive_media_directions\">Briog air gus a shealltainn</string>\n    <string name=\"post_media_hidden_title\">Meadhanan falaichte</string>\n    <string name=\"post_sensitive_media_title\">Susbaint fhrionasach</string>\n    <string name=\"post_boosted_format\">’Ga bhrosnachadh le %1$s</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"title_licenses\">Ceadachasan</string>\n    <string name=\"title_follow_requests\">Iarrtasan leantainn</string>\n    <string name=\"title_domain_mutes\">Àrainnean falaichte</string>\n    <string name=\"title_blocks\">Cleachdaichean bacte</string>\n    <string name=\"title_mutes\">Cleachdaichean mùchte</string>\n    <string name=\"title_bookmarks\">Comharran-lìn</string>\n    <string name=\"title_followers\">Luchd-leantainn</string>\n    <string name=\"title_follows\">A’ leantainn air</string>\n    <string name=\"title_posts_pinned\">Prìnichte</string>\n    <string name=\"title_posts_with_replies\">Le freagairt</string>\n    <string name=\"title_posts\">Postaichean</string>\n    <string name=\"title_tab_preferences\">Tabaichean</string>\n    <string name=\"title_direct_messages\">Teachdaireachdan dìreach</string>\n    <string name=\"title_public_federated\">Co-naisgte</string>\n    <string name=\"title_public_local\">Ionadail</string>\n    <string name=\"title_home\">Dachaigh</string>\n    <string name=\"error_media_upload_sending\">Dh’fhàillig leis an luchdadh suas.</string>\n    <string name=\"error_media_upload_image_or_video\">Chan urrainn dhut an dà chuid dealbhan is videothan a cheangal ris an aon phost.</string>\n    <string name=\"error_media_download_permission\">Tha feum air cead gus meadhanan a stòradh.</string>\n    <string name=\"error_media_upload_permission\">Tha feum air cead gus meadhanan a leughadh.</string>\n    <string name=\"error_media_upload_opening\">Cha b’ urrainn dhuinn am faidhle sin fhosgladh.</string>\n    <string name=\"error_media_upload_type\">Cha ghabh an seòrsa de dh’fhaidhle seo a luchdadh suas.</string>\n    <string name=\"error_compose_character_limit\">Tha am post ro fhada!</string>\n    <string name=\"error_retrieving_oauth_token\">Cha deach leinn tòcan clàraidh a-steach fhaighinn. Ma mhaireas an duilgheadas seo, feuch “Clàraich a-steach le brabhsair” on chlàr-taice.</string>\n    <string name=\"error_authorization_denied\">Chaidh an t-ùghdarrachadh a dhiùltadh. Ma tha thu cinnteach gun do chuir thu a-steach an teisteas ceart, feuch “Clàraich a-steach le brabhsair” on chlàr-taice.</string>\n    <string name=\"error_authorization_unknown\">Thachair mearachd leis an ùghdarrachadh nach do dh’aithnich sinn. Ma mhaireas an duilgheadas seo, feuch “Clàraich a-steach le brabhsair” on chlàr-taice.</string>\n    <string name=\"error_no_web_browser_found\">Cha do lorg sinn brabhsair-lìn a chleachdadh sinn.</string>\n    <string name=\"error_failed_app_registration\">Dh’fhàillig leis an dearbhadh leis an ionstans ud. Ma mhaireas an duilgheadas seo, feuch “Clàraich a-steach le brabhsair” on chlàr-taice.</string>\n    <string name=\"error_invalid_domain\">Chuir thu a-steach àrainn-lìn mì-dhligheach</string>\n    <string name=\"error_empty\">Chan fhaod seo a bhith falamh.</string>\n    <string name=\"error_network\">Thachair mearachd leis an lìonra. Thoir sùil air a’ cheangal agad is feuch ris a-rithist.</string>\n    <string name=\"error_generic\">Thachair mearachd.</string>\n    <string name=\"follow_requests_info\">Ged nach eil an cunntas agad glaiste, tha sgioba %1$s dhen bheachd gum b’ fheàirrde thu lèirmheas a dhèanamh air na h-iarrtasan leantainn o na cunntasan seo a làimh.</string>\n    <string name=\"dialog_delete_conversation_warning\">A bheil thu airson an còmhradh seo a sguabadh às?</string>\n    <string name=\"action_delete_conversation\">Sguab às an còmhradh</string>\n    <string name=\"action_unbookmark\">Thoir an comharra-lìn air falbh</string>\n    <string name=\"pref_title_confirm_favourites\">Seall dearbhadh mus cuir thu post ris na h-annsachdan</string>\n    <string name=\"duration_30_days\">30 latha</string>\n    <string name=\"duration_90_days\">90 latha</string>\n    <string name=\"duration_180_days\">180 latha</string>\n    <string name=\"duration_365_days\">365 latha</string>\n    <string name=\"duration_14_days\">14 làithean</string>\n    <string name=\"duration_60_days\">60 latha</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Sgrìobh post</string>\n    <string name=\"notification_sign_up_format\">Chlàraich %1$s</string>\n    <string name=\"notification_sign_up_name\">Clàraidhean</string>\n    <string name=\"notification_sign_up_description\">Brathan mu cleachdaichean ùra</string>\n    <string name=\"notification_update_format\">Dheasaich %1$s am post aca</string>\n    <string name=\"notification_update_name\">Deasachadh puist</string>\n    <string name=\"notification_update_description\">Brathan nuair a thèid postaichean a rinn thu conaltradh leotha a dheasachadh</string>\n    <string name=\"title_login\">Clàraich a-steach</string>\n    <string name=\"error_could_not_load_login_page\">Cha b’ urrainn dhuinn duilleag a’ chlàraidh a-steach fhosgladh.</string>\n    <string name=\"saving_draft\">A’ sàbhaladh na dreuchd…</string>\n    <string name=\"action_dismiss\">Leig seachad</string>\n    <string name=\"action_details\">Fiosrachadh</string>\n    <string name=\"account_date_joined\">Air ballrachd fhaighinn %1$s</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"action_edit_image\">Deasaich an dealbh</string>\n    <string name=\"error_following_hashtag_format\">Mearachd a’ leantainn air #%1$s</string>\n    <string name=\"error_multimedia_size_limit\">Chan fhaod na faidhlichean video ’ fuaime a bhith nas motha na %1$s MB.</string>\n    <string name=\"error_unfollowing_hashtag_format\">Mearachd a’ sgur de leantainn air #%1$s</string>\n    <string name=\"error_loading_account_details\">Mearachd a’ luchdadh fiosrachadh a’ chunntais</string>\n    <string name=\"error_image_edit_failed\">Cha b’ urrainn dhuinn an dealbh a dheasachadh.</string>\n    <string name=\"duration_no_change\">(Gun atharrachadh)</string>\n    <string name=\"pref_title_show_self_username\">Seall an t-ainm-cleachdaiche air na bàraichean-inneal</string>\n    <string name=\"set_focus_description\">Thoir gogag no slaod an cearcall a thaghadh puing an fhòcais a chithear air na dealbhagan an-còmhnaidh.</string>\n    <string name=\"description_post_language\">Cànan a’ phuist</string>\n    <string name=\"pref_show_self_username_always\">An-còmhnaidh</string>\n    <string name=\"pref_show_self_username_disambiguate\">Nuair a bhios iomadh cunntas air an clàradh a-steach</string>\n    <string name=\"pref_show_self_username_never\">Chan ann idir</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"action_set_focus\">Suidhich puing an fhòcais</string>\n    <string name=\"delete_scheduled_post_warning\">A bheil thu airson am post sgeidealaichte seo a sguabadh às?</string>\n    <string name=\"instance_rule_info\">Le clàradh a-steach, bidh tu ag aontachadh ri riaghailtean %1$s.</string>\n    <string name=\"instance_rule_title\">riaghailtean %1$s</string>\n    <string name=\"action_add_reaction\">cuir frith-ghnìomh ris</string>\n    <string name=\"failed_to_pin\">Dh’fhàillig leis a’ phrìneachadh</string>\n    <string name=\"failed_to_unpin\">Dh’fhàillig leis an dì-phrìneachadh</string>\n    <string name=\"compose_save_draft_loses_media\">A bheil thu airson a shàbhaladh ’na dhreachd? (Thèid na ceanglachain a luchdadh suas a-rithist nuair a dh’aisigeas tu an dreuchd.)</string>\n    <string name=\"a11y_label_loading_thread\">A’ luchdadh an t-snàithlein</string>\n    <string name=\"pref_title_reading_order\">Òrdugh an leughaidh</string>\n    <string name=\"pref_reading_order_oldest_first\">As sine an toiseach</string>\n    <string name=\"pref_reading_order_newest_first\">As ùire an toiseach</string>\n    <string name=\"action_unfollow_hashtag_format\">A bheil thu airson sgur de #%1$s a leantainn?</string>\n    <string name=\"mute_notifications_switch\">Mùch na brathan</string>\n    <string name=\"hint_media_description_missing\">Bu chòir do thuairisgeul a bhith aig a’ mheadhan.</string>\n    <string name=\"report_category_violation\">Briseadh riaghailte</string>\n    <string name=\"report_category_spam\">Spama</string>\n    <string name=\"report_category_other\">Eile</string>\n    <string name=\"pref_summary_http_proxy_disabled\">À comas</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;cha deach a shuidheachadh&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;mì-dhligheach&gt;</string>\n    <string name=\"failed_to_remove_from_list\">Cha deach leinn an cunntas a thoirt air falbh on liosta</string>\n    <string name=\"title_edits\">Deasachaidhean</string>\n    <string name=\"status_created_at_now\">an-dràsta</string>\n    <string name=\"pref_default_post_language\">Cànan nam post (’ga shioncronachadh leis an fhrithealaiche)</string>\n    <string name=\"status_created_info\">Chruthaich %1$s</string>\n    <string name=\"status_edit_info\">Dheasaich %1$s</string>\n    <string name=\"no_lists\">Chan eil liosta sam bith agad.</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"pref_title_http_proxy_port_message\">Bu chòir dhan phort a bhith eadar %1$d is %2$d</string>\n    <string name=\"error_following_hashtags_unsupported\">Cha chuir an t-ionstans seo taic ri leantainn thagaichean hais.</string>\n    <string name=\"error_muting_hashtag_format\">Mearachd a’ mùchadh #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Mearachd a’ dì-mhùchadh #%1$s</string>\n    <string name=\"title_followed_hashtags\">Tagaichean hais ’gan leantainn</string>\n    <string name=\"notification_report_name\">Gearanan</string>\n    <string name=\"notification_report_description\">Brathan mu ghearanan na maorsainneachd</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"action_post_failed\">Dh’fhàillig leis an luchdadh suas</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Dh’fhàillig luchdadh suas a’ phuist agad is chaidh a shàbhaladh ’na dhreachd.\n\\n\n\\nCha d’ fhuair sinn grèim air an fhrithealaiche no dhiùlt e am post.</item>\n        <item quantity=\"two\"/>\n        <item quantity=\"few\"/>\n        <item quantity=\"other\">Dh’fhàillig luchdadh suas nam postaichean agad is chaidh an sàbhaladh ’nan dreachdan.\n\\n\n\\nCha d’ fhuair sinn grèim air an fhrithealaiche no dhiùlt e na postaichean.</item>\n    </plurals>\n    <string name=\"action_post_failed_show_drafts\">Seall na dreachdan</string>\n    <string name=\"action_post_failed_do_nothing\">Leig seachad</string>\n    <string name=\"confirmation_hashtag_unfollowed\">Chan eil #%1$s a’ leantainn tuilleadh</string>\n    <string name=\"description_post_edited\">Chaidh a dheasachadh</string>\n    <string name=\"action_browser_login\">Clàraich a-steach le brabhsair</string>\n    <string name=\"action_add_or_remove_from_list\">Cuir ris no thoir air falbh on liosta</string>\n    <string name=\"failed_to_add_to_list\">Cha deach leinn an cunntas a chur ris an liosta</string>\n    <string name=\"description_login\">Obraichidh seo mar as trice. Cha dèid dàta fhoillseachadh do dh’aplacaidean eile.</string>\n    <string name=\"description_browser_login\">Dh’fhaoidte gun cuir seo taic ri dòighean dearbhaidh a bharrachd ach bi feum air brabhsair a chuireas taic ris.</string>\n    <string name=\"action_discard\">Tilg air falbh na h-atharraichean</string>\n    <string name=\"action_continue_edit\">Lean air an deasachadh</string>\n    <string name=\"post_edited\">Air a dheasachadh %1$s</string>\n    <string name=\"notification_report_format\">Gearan ùr air %1$s</string>\n    <string name=\"notification_header_report_format\">Rinn %1$s gearan mu %2$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · Tha postaichean ris, %2$d dhiubh</string>\n    <string name=\"action_share_account_link\">Co-roinn ceangal dhan chunntas</string>\n    <string name=\"account_username_copied\">Chaidh lethbhreac a dhèanamh dhen ainm-chleachdaiche</string>\n    <string name=\"compose_unsaved_changes\">Tha atharraichean gun sàbhaladh agad.</string>\n    <string name=\"error_status_source_load\">Dh’fhàillig luchdadh bun-tùs a’ phuist on fhrithealaiche.</string>\n    <string name=\"action_share_account_username\">Co-roinn ainm-cleachdaiche a’ chunntais</string>\n    <string name=\"send_account_link_to\">Co-roinn URL a’ chunntais le…</string>\n    <string name=\"send_account_username_to\">Co-roinn ainm-cleachdaiche a’ chunntais le…</string>\n    <string name=\"dialog_follow_hashtag_title\">Lean an taga hais</string>\n    <string name=\"post_media_image\">Dealbh</string>\n    <string name=\"filter_action_warn\">Thoir rabhadh</string>\n    <string name=\"filter_action_hide\">Falaich</string>\n    <string name=\"action_refresh\">Ath-nuadhaich</string>\n    <string name=\"notification_unknown_name\">Neo-aithnichte</string>\n    <string name=\"socket_timeout_exception\">Thug conaltradh ris an fhrithealaiche ro fhada</string>\n    <string name=\"ui_error_unknown\">chan eil fhios dè an t-adhbhar</string>\n    <string name=\"ui_error_bookmark\">Cha deach leinn comharra-lìn a chur ris a’ phost: %1$s</string>\n    <string name=\"ui_error_clear_notifications\">Dh’fhàillig falamhachadh nam brathan: %1$s</string>\n    <string name=\"ui_error_favourite\">Cha deach leinn am post a chur ris na h-annsachdan: %1$s</string>\n    <string name=\"ui_error_reblog\">Dh’fhàillig brosnachadh a’ phuist: %1$s</string>\n    <string name=\"ui_error_vote\">Dh’fhàillig bhòtadh sa chunntas-bheachd: %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">Dh’fhàillig le gabhail ris an iarrtas leantainn: %1$s</string>\n    <string name=\"ui_error_reject_follow_request\">Dh’fhàillig le diùltadh an iarrtais leantainn: %1$s</string>\n    <string name=\"ui_success_accepted_follow_request\">Chaidh gabhail ris an iarrtas leantainn</string>\n    <string name=\"ui_success_rejected_follow_request\">Chaidh iarrtas leantainn a bhacadh</string>\n    <string name=\"select_list_manage\">Stiùirich na liostaichean</string>\n    <string name=\"status_filtered_show_anyway\">Seall e co-dhiù</string>\n    <string name=\"status_filter_placeholder_label_format\">Criathraichte: %1$s</string>\n    <string name=\"pref_title_account_filter_keywords\">Pròifilean</string>\n    <string name=\"hint_filter_title\">A’ chriathrag agam</string>\n    <string name=\"filter_description_warn\">Falaich le rabhadh</string>\n    <string name=\"filter_description_hide\">Falaich uile gu lèir</string>\n    <string name=\"label_filter_action\">Gnìomh na criathraige</string>\n    <string name=\"label_filter_context\">Co-theacsaichean na criathraige</string>\n    <string name=\"label_filter_keywords\">Faclan no abairtean-luirg rin criathradh</string>\n    <string name=\"action_add\">Cuir ris</string>\n    <string name=\"filter_edit_keyword_title\">Deasaich am facal-luirg</string>\n    <string name=\"title_public_trending_hashtags\">Tagaichean hais a’ treandadh</string>\n    <string name=\"accessibility_talking_about_tag\">Tha %1$d a’ bruidhinn mun taga hais %2$s</string>\n    <string name=\"total_usage\">Cleachdadh iomlan</string>\n    <string name=\"total_accounts\">Cunntasan iomlan</string>\n    <string name=\"pref_title_show_stat_inline\">Seall stadastaireachd nam post san loidhne-ama</string>\n    <string name=\"filter_keyword_display_format\">%1$s (facal slàn)</string>\n    <string name=\"filter_keyword_addition_title\">Cuir facal-luirg ris</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"label_filter_title\">Tiotal</string>\n    <string name=\"help_empty_home\">Seo <b>loidhne-ama do dhachaigh</b>. Seallaidh i na postaichean o chionn goirid aig na cunntasan a leanas tu. \n\\n \n\\nAirson cunntasan a rùrachadh, lorg iad air tè dhe na loidhnichean-ama eile; mar eisimpleir, loidhne-ama ionadail an ionstans agad {{group}}. Air neo lorg cunntasan a-rèir ainm {{search}}; mar eisimpleir, lorg “Tusky” ach am faigh thu grèim air a’ chunntas againne air Mastodon.</string>\n    <string name=\"compose_delete_draft\">A bheil thu airson an dreachd a sguabadh às?</string>\n    <string name=\"load_newest_notifications\">Luchdaich na brathan as ùire</string>\n    <string name=\"error_missing_edits\">Tha fios aig an fhrithealaiche gun deach am post seo a dheasachadh ach chan eil lethbhreac dhen deasachadh aige-san is chan urrainn dhuinn a shealltainn dhut. \n\\n \n\\nSeo <a href=\"https://github.com/mastodon/mastodon/issues/25398\">duilgheadas Mastodon #25398</a>.</string>\n    <string name=\"pref_ui_text_size\">Meud teacsa na eadar-aghaidh</string>\n    <string name=\"notification_listenable_worker_name\">Gnìomhachd sa chùlaibh</string>\n    <string name=\"notification_listenable_worker_description\">Brathan nuair a bhios Tusky ag obair sa chùlaibh</string>\n    <string name=\"notification_notification_worker\">A’ faighinn nam brathan…</string>\n    <string name=\"notification_prune_cache\">Obair-ghlèidhidh air an tasgadan…</string>\n    <string name=\"about_device_info_title\">An t-uidheam agad</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nTionndadh dhe Android: %3$s\n\\nTionndadh dhen SDK: %4$d</string>\n    <string name=\"about_account_info_title\">An cunntas agad</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nTionndadh: %3$s</string>\n    <string name=\"about_copy\">Dèan lethbhreac de thionndadh is fiosrachadh an uidheim</string>\n    <string name=\"about_copied\">Chaidh lethbhreac de thionndadh is fiosrachadh an uidheim a dhèanamh</string>\n    <string name=\"list_exclusive_label\">Falaich o loidhne-ama na dachaigh</string>\n    <string name=\"error_media_upload_sending_fmt\">Dh’fhàillig leis an luchdadh suas: %1$s</string>\n    <string name=\"action_follow_hashtag\">Lean taga hais ùr</string>\n    <string name=\"action_translate\">Eadar-theangaich</string>\n    <string name=\"action_show_original\">Seall an tionndadh tùsail</string>\n    <string name=\"label_image\">Dealbh</string>\n    <string name=\"pref_title_per_timeline_preferences\">Roghainnean do loidhne-ama fa leth</string>\n    <string name=\"label_expires_after\">Falbhaidh an ùine air an dèidh</string>\n    <string name=\"report_category_legal\">Laghail</string>\n    <string name=\"dialog_delete_filter_text\">A bheil thu airson a’ chriathrag “%1$s” a sguabadh às?</string>\n    <string name=\"list_reply_policy_none\">Chan eil gin</string>\n    <string name=\"error_media_playback\">Cha b’ urrainn dhuinn a chluich: %1$s</string>\n    <string name=\"app_theme_system_black\">Cleachd co-dhealbhachd an t-siostaim (dubh)</string>\n    <string name=\"pref_title_show_self_boosts\">Seall na bhrosnaichear fhèin</string>\n    <string name=\"pref_title_show_self_boosts_description\">Cuideigin a’ brosnachadh am post aca fhèin</string>\n    <string name=\"url_copied\">Chaidh lethbhreac dhen URL a dhèanamh</string>\n    <string name=\"confirmation_hashtag_copied\">Chaidh lethbhreac a dhèanamh dhe “#%1$s”</string>\n    <string name=\"reply_sending\">’Ga chur…</string>\n    <string name=\"reply_sending_long\">Tha an fhreagairt agad ’ga cur.</string>\n    <string name=\"pref_default_reply_privacy\">Prìobhaideachd nam freagairtean (gun sioncronachadh leis an fhrithealaiche)</string>\n    <string name=\"help_empty_conversations\">Seo na <b>teachdaireachdan prìobhaideach</b> agad ris an canar còmhraidhean no teachdaireachdan dìreach (DM) cuideachd. \\u0020 \\u0020\n\\n \\u0020\n\\nAirson teachdaireachd phrìobhaideach a chruthachadh, suidhich faicsinneachd {{public}} puist air {{mail}} <i>Dìreach</i> agus thoir iomradh air cleachdaiche no dhà san teacsa. \\u0020 \\u0020\n\\n \\u0020\n\\nMar eisimpleir, ’s urrainn dhut tòiseachadh air sealladh pròifil cunntais agus gnogag a thoirt air putan a’ chruthachaidh [iconics gmd_edit] agus an fhaicsinneachd atharrachadh. \\u0020</string>\n    <string name=\"help_empty_lists\">Seo <b>sealladh nan liostaichean</b> agad. ’S urrainn dhut iomadh liosta phrìobhaideach a chruthachadh ’s cunntasan a chur riutha. \\u0020 \n\\n \n\\n \\u0020THOIR AN AIRE nach urrainn dhut ach cunntasan a leanas tu a chur ris na liostaichean agad. \\u0020 \n\\n \n\\n \\u0020’S urrainn dhut na liostaichean seo a chleachdadh ’nan tabaichean ann an “Roghainnean a’ chunntais” [iconics gmd_account_circle] [iconics gmd_navigate_next] “Tabaichean”. \\u0020</string>\n    <string name=\"list_reply_policy_list\">Buill na liosta</string>\n    <string name=\"list_reply_policy_followed\">Cleachdaiche sam bith a leanas mi</string>\n    <string name=\"list_reply_policy_label\">Seall na freagairtean gu</string>\n    <string name=\"dialog_save_profile_changes_message\">A bheil thu airson na h-atharraichean air a’ phròifil agad a shàbhaladh?</string>\n    <string name=\"muting_hashtag_success_format\">A’ mùchadh an taga hais #%1$s mar rabhadh</string>\n    <string name=\"error_blocking_domain\">Dh’fhàillig le mùchadh %1$s: %2$s</string>\n    <string name=\"error_unblocking_domain\">Dh’fhàillig le dì-mhùchadh %1$s: %2$s</string>\n    <string name=\"pref_default_reply_privacy_explanation\">Bi ro-thaghadh na prìobhaideachd an eisimeil air a’ phost dhan fhreagair thu.</string>\n    <string name=\"pref_match_default_post_privacy\">A-rèir prìobhaideachd bhunaiteach nam post</string>\n    <string name=\"post_privacy_direct\">Dìreach</string>\n    <string name=\"dialog_delete_filter_positive_action\">Sguab às</string>\n    <string name=\"label_translating\">’Ga eadar-theangachadh…</string>\n    <string name=\"label_translated\">Air eadar-theangachadh o %1$s le %2$s</string>\n    <string name=\"action_view_filter\">Seall a’ chriathrag</string>\n    <string name=\"unmuting_hashtag_success_format\">A’ dì-mhùchadh an taga hais #%1$s</string>\n    <string name=\"following_hashtag_success_format\">A’ leantainn an taga hais #%1$s a-nis</string>\n    <string name=\"unfollowing_hashtag_success_format\">Air sgur de leantainn an taga hais #%1$s</string>\n    <string name=\"pref_title_confirm_follows\">Seall dearbhadh mus lean thu</string>\n    <string name=\"ui_error_translate\">Cha b’ urrainn dhuinn seo eadar-theangachadh: %1$s</string>\n    <string name=\"unknown_notification_type\">Seòrsa bratha nach aithne dhuinn</string>\n    <string name=\"dialog_follow_warning\">A bheil thu airson an cunntas seo a leantainn?</string>\n    <string name=\"pref_title_show_notifications_filter\">Seall criathrag nam brathan</string>\n    <string name=\"error_deleting_filter\">Mearachd le sguabadh às na criathraige “%1$s”</string>\n    <string name=\"error_saving_filter\">Mearachd le sàbhaladh na criathraige “%1$s”</string>\n    <string name=\"title_public_trending_statuses\">Postaichean a’ treandadh</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-gl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"action_content_warning\">Aviso sobre o contido</string>\n    <string name=\"action_toggle_visibility\">Visibilidade da publicación</string>\n    <string name=\"action_access_scheduled_posts\">Publicacións programadas</string>\n    <string name=\"action_access_drafts\">Borradores</string>\n    <string name=\"action_search\">Buscar</string>\n    <string name=\"action_reject\">Rexeitar</string>\n    <string name=\"action_accept\">Aceptar</string>\n    <string name=\"action_undo\">Desfacer</string>\n    <string name=\"action_edit_own_profile\">Editar</string>\n    <string name=\"action_edit_profile\">Editar perfil</string>\n    <string name=\"action_save\">Gardar</string>\n    <string name=\"action_open_drawer\">Abrir editor</string>\n    <string name=\"action_hide_media\">Agochar multimedia</string>\n    <string name=\"action_mention\">Mencionar</string>\n    <string name=\"action_unmute_conversation\">Reactivar conversa</string>\n    <string name=\"action_mute_conversation\">Acalar conversa</string>\n    <string name=\"action_unmute_domain\">Reactivar %1$s</string>\n    <string name=\"action_mute_domain\">Acalar %1$s</string>\n    <string name=\"action_unmute_desc\">Reactivar %1$s</string>\n    <string name=\"action_unmute\">Reactivar</string>\n    <string name=\"action_mute\">Acalar</string>\n    <string name=\"action_share\">Compartir</string>\n    <string name=\"action_photo_take\">Facer foto</string>\n    <string name=\"action_add_poll\">Engadir enquisa</string>\n    <string name=\"action_add_media\">Engadir multimedia</string>\n    <string name=\"action_open_in_web\">Abrir no navegador</string>\n    <string name=\"action_view_media\">Multimedia</string>\n    <string name=\"action_view_follow_requests\">Solicitudes de seguimento</string>\n    <string name=\"action_view_domain_mutes\">Dominios agochados</string>\n    <string name=\"action_view_blocks\">Usuarias bloqueadas</string>\n    <string name=\"action_view_mutes\">Usuarias acaladas</string>\n    <string name=\"action_view_bookmarks\">Marcadores</string>\n    <string name=\"action_view_favourites\">Favoritos</string>\n    <string name=\"action_view_account_preferences\">Preferencias da conta</string>\n    <string name=\"action_view_preferences\">Preferencias</string>\n    <string name=\"action_view_profile\">Perfil</string>\n    <string name=\"action_close\">Pechar</string>\n    <string name=\"action_retry\">Intenta outra vez</string>\n    <string name=\"action_send_public\">PUBLICA!</string>\n    <string name=\"action_send\">PUBLICAR</string>\n    <string name=\"action_delete_and_redraft\">Eliminar e reescribir</string>\n    <string name=\"action_delete\">Eliminar</string>\n    <string name=\"action_edit\">Editar</string>\n    <string name=\"action_report\">Denunciar</string>\n    <string name=\"action_show_reblogs\">Mostrar promocións</string>\n    <string name=\"action_hide_reblogs\">Agochar promocións</string>\n    <string name=\"action_unblock\">Desbloquear</string>\n    <string name=\"action_block\">Bloquear</string>\n    <string name=\"action_unfollow\">Deixar de seguir</string>\n    <string name=\"action_follow\">Seguir</string>\n    <string name=\"action_logout_confirm\">Tes a certeza de querer pechar a sesión %1$s? Isto eliminará todos os datos locais da conta, incluíndo borradores e preferencias.</string>\n    <string name=\"action_logout\">Pechar sesión</string>\n    <string name=\"action_login\">Acceder con Tusky</string>\n    <string name=\"action_compose\">Redactar</string>\n    <string name=\"action_more\">Máis</string>\n    <string name=\"action_unfavourite\">Retirar favorito</string>\n    <string name=\"action_bookmark\">Marcar</string>\n    <string name=\"action_favourite\">Favorito</string>\n    <string name=\"action_unreblog\">Retirar a promoción</string>\n    <string name=\"action_reblog\">Promover</string>\n    <string name=\"action_reply\">Responder</string>\n    <string name=\"action_quick_reply\">Resposta rápida</string>\n    <string name=\"report_comment_hint\">Comentarios adicionais?</string>\n    <string name=\"report_username_format\">Denunciar a @%1$s</string>\n    <string name=\"notification_subscription_format\">%1$s acaba de publicar</string>\n    <string name=\"notification_follow_request_format\">%1$s solicitou seguirte</string>\n    <string name=\"notification_follow_format\">%1$s seguiute</string>\n    <string name=\"notification_favourite_format\">%1$s fixo favorita a publicación</string>\n    <string name=\"notification_reblog_format\">%1$s promoveu a túa publicación</string>\n    <string name=\"footer_empty\">Nada por aquí. Arrastra cara abaixo para actualizar!</string>\n    <string name=\"message_empty\">Nada por aquí.</string>\n    <string name=\"post_content_show_less\">Contraer</string>\n    <string name=\"post_content_show_more\">Expandir</string>\n    <string name=\"post_content_warning_show_less\">Ver menos</string>\n    <string name=\"post_content_warning_show_more\">Ver máis</string>\n    <string name=\"post_sensitive_media_directions\">Preme para ver</string>\n    <string name=\"post_media_hidden_title\">Multimedia agochado</string>\n    <string name=\"post_sensitive_media_title\">Contido sensible</string>\n    <string name=\"post_boosted_format\">%1$s promoveu</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"title_licenses\">Licenzas</string>\n    <string name=\"title_announcements\">Anuncios</string>\n    <string name=\"title_scheduled_posts\">Publicacións programadas</string>\n    <string name=\"title_drafts\">Borradores</string>\n    <string name=\"title_edit_profile\">Edita o teu perfil</string>\n    <string name=\"title_follow_requests\">Solicitudes de seguimento</string>\n    <string name=\"title_domain_mutes\">Dominios agochados</string>\n    <string name=\"title_blocks\">Usuarias bloqueadas</string>\n    <string name=\"title_mutes\">Usuarias acaladas</string>\n    <string name=\"title_bookmarks\">Marcadores</string>\n    <string name=\"title_favourites\">Favoritos</string>\n    <string name=\"title_followers\">Seguidoras</string>\n    <string name=\"title_follows\">Segue</string>\n    <string name=\"title_posts_pinned\">Fixado</string>\n    <string name=\"title_posts_with_replies\">Con respostas</string>\n    <string name=\"title_posts\">Publicacións</string>\n    <string name=\"title_view_thread\">Fío</string>\n    <string name=\"title_tab_preferences\">Pestanas</string>\n    <string name=\"title_direct_messages\">Mensaxes directas</string>\n    <string name=\"title_public_federated\">Federada</string>\n    <string name=\"title_public_local\">Local</string>\n    <string name=\"title_notifications\">Notificacións</string>\n    <string name=\"title_home\">Inicio</string>\n    <string name=\"error_sender_account_gone\">Produciuse un erro ao enviar a publicación.</string>\n    <string name=\"error_media_upload_sending\">Produciuse un fallo no envío.</string>\n    <string name=\"error_media_upload_image_or_video\">As imaxes e vídeo non poden engadirse simultáneamente á mesma publicación.</string>\n    <string name=\"error_media_download_permission\">Requírese o permiso de almacenaxe do multimedia.</string>\n    <string name=\"error_media_upload_permission\">Requírese o permiso de lectura do multimedia.</string>\n    <string name=\"error_media_upload_opening\">Non se puido abrir o ficheiro.</string>\n    <string name=\"error_media_upload_type\">Non pode enviarse ese tipo de ficheiro.</string>\n    <string name=\"error_compose_character_limit\">A publicación é demasiado longa!</string>\n    <string name=\"error_retrieving_oauth_token\">Non se obtivo o token de acceso. Se non o consigues, inténtao desde Acceder no Navegador.</string>\n    <string name=\"error_authorization_denied\">A autorización foi rexeitada. Se tes a certeza de que as credenciais son correctas, inténtao desde Acceder no Navegador no menú.</string>\n    <string name=\"error_authorization_unknown\">Produciuse un erro non identificado na autorización. Se persiste, inténtao desde Acceder no Navegador.</string>\n    <string name=\"error_no_web_browser_found\">Non se atopou un navegador para utilizar.</string>\n    <string name=\"error_failed_app_registration\">Produciuse un fallo na autenticación nesta instancia. Se persiste, inténtao desde Acceder no Navegador no menú.</string>\n    <string name=\"error_invalid_domain\">O dominio escrito non é válido</string>\n    <string name=\"error_empty\">Isto non pode estar baleiro.</string>\n    <string name=\"error_network\">Produciuse un fallo na rede. Comproba a conexión e inténtao outra vez.</string>\n    <string name=\"error_generic\">Algo fallou.</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"action_unsubscribe_account\">Desubscribir</string>\n    <string name=\"action_subscribe_account\">Subscribir</string>\n    <string name=\"drafts_post_reply_removed\">Retirouse a publicación para a que redactaches a resposta</string>\n    <string name=\"duration_indefinite\">Sen límite</string>\n    <string name=\"label_duration\">Duración</string>\n    <string name=\"create_poll_title\">Enquisa</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Activar xestos de desprazamento para moverse entre pestanas</string>\n    <string name=\"failed_search\">Fallou a busca</string>\n    <string name=\"title_accounts\">Contas</string>\n    <string name=\"report_description_remote_instance\">A conta pertence a outro servidor. Queres enviar unha copia anónima da denuncia alí tamén?</string>\n    <string name=\"report_description_1\">A denuncia vaise enviar á moderación do teu servidor. Podes engadir algunha explicación ou razón pola que estás denunciando a conta:</string>\n    <string name=\"failed_fetch_posts\">Fallou a obtención dos estados</string>\n    <string name=\"failed_report\">Fallo ao realizar a denuncia</string>\n    <string name=\"report_remote_instance\">Reenviar a %1$s</string>\n    <string name=\"hint_additional_info\">Comentarios adicionais</string>\n    <string name=\"report_sent_success\">Denuncia feita sobre @%1$s</string>\n    <string name=\"button_done\">Feito</string>\n    <string name=\"button_back\">Atrás</string>\n    <string name=\"button_continue\">Continuar</string>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">queda %1$d segundo</item>\n        <item quantity=\"other\">quedan %1$d segundos</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">queda %1$d minuto</item>\n        <item quantity=\"other\">quedan %1$d minutos</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">queda %1$d hora</item>\n        <item quantity=\"other\">quedan %1$d horas</item>\n    </plurals>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">queda %1$d día</item>\n        <item quantity=\"other\">quedan %1$d días</item>\n    </plurals>\n    <string name=\"poll_ended_created\">Rematou unha enquisa creada por ti</string>\n    <string name=\"poll_ended_voted\">Rematou unha enquisa na que votaches</string>\n    <string name=\"poll_vote\">Votar</string>\n    <string name=\"poll_info_closed\">pechada</string>\n    <string name=\"poll_info_time_absolute\">remata en %1$s</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s persoa</item>\n        <item quantity=\"other\">%1$s persoas</item>\n    </plurals>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s voto</item>\n        <item quantity=\"other\">%1$s votos</item>\n    </plurals>\n    <string name=\"poll_info_format\">%1$s • %2$s</string>\n    <string name=\"compose_preview_image_description\">Accións para a imaxe %1$s</string>\n    <string name=\"notification_clear_text\">Tes a certeza de que queres borrar permanentemente todas as notificacións?</string>\n    <string name=\"compose_shortcut_short_label\">Redactar</string>\n    <string name=\"compose_shortcut_long_label\">Redactar publicación</string>\n    <string name=\"filter_apply\">Aplicar</string>\n    <string name=\"notifications_apply_filter\">Filtrar</string>\n    <string name=\"notifications_clear\">Borrar</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"select_list_title\">Escoller lista</string>\n    <string name=\"hashtags\">Cancelos</string>\n    <string name=\"pick_hashtag_hint\">Cancelo sen #</string>\n    <string name=\"add_hashtag_title\">Engadir cancelo</string>\n    <string name=\"hint_list_name\">Nome da lista</string>\n    <string name=\"description_poll\">Enquisa con opcións: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"description_visibility_direct\">Directa</string>\n    <string name=\"description_visibility_private\">Seguidoras</string>\n    <string name=\"description_visibility_unlisted\">Limitada</string>\n    <string name=\"description_visibility_public\">Pública</string>\n    <string name=\"description_post_bookmarked\">Marcado</string>\n    <string name=\"description_post_favourited\">Favorecido</string>\n    <string name=\"description_post_reblogged\">Repetido</string>\n    <string name=\"description_post_media_no_description_placeholder\">Sen descrición</string>\n    <string name=\"description_post_cw\">Aviso sobre o contido: %1$s</string>\n    <string name=\"description_post_media\">Multimedia: %1$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s e %3$d máis</string>\n    <string name=\"conversation_2_recipients\">%1$s e %2$s</string>\n    <string name=\"title_favourited_by\">Favorecido por</string>\n    <string name=\"title_reblogged_by\">Promovido por</string>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\">%1$s Promoción</item>\n        <item quantity=\"other\">%1$s Promocións</item>\n    </plurals>\n    <plurals name=\"favs\">\n        <item quantity=\"one\">%1$s Favorito</item>\n        <item quantity=\"other\">%1$s Favoritos</item>\n    </plurals>\n    <string name=\"pin_action\">Fixar</string>\n    <string name=\"unpin_action\">Desprender</string>\n    <string name=\"label_remote_account\">A información inferior sobre a usuaria podería non estar completa. Preme para ver o perfil completo no navegador.</string>\n    <string name=\"pref_title_absolute_time\">Usar hora absoluta</string>\n    <string name=\"profile_metadata_content_label\">Contido</string>\n    <string name=\"profile_metadata_label_label\">Etiqueta</string>\n    <string name=\"profile_metadata_add\">engadir datos</string>\n    <string name=\"profile_metadata_label\">Metadatos do perfil</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_apache_2\">Con licenza Apache License (ver abaixo)</string>\n    <string name=\"license_description\">Tusky ten código e ferramentas dos seguintes proxectos de código aberto:</string>\n    <string name=\"unreblog_private\">Retirar promoción</string>\n    <string name=\"reblog_private\">Promover para a audiencia orixinal</string>\n    <string name=\"account_moved_description\">%1$s migrou a:</string>\n    <string name=\"profile_badge_bot_text\">Robot</string>\n    <string name=\"download_failed\">Fallou a descarga</string>\n    <string name=\"caption_notoemoji\">Conxunto actual de emojis de Google</string>\n    <string name=\"caption_twemoji\">Conxunto de emojis estándar en Mastodon</string>\n    <string name=\"caption_blobmoji\">Os emojis Blob coñecidos de Android 4.4-7.1</string>\n    <string name=\"caption_systememoji\">O conxunto de emojis predeterminados do sistema</string>\n    <string name=\"restart\">Reiniciar</string>\n    <string name=\"later\">Máis tarde</string>\n    <string name=\"restart_emoji\">Deberás reiniciar Tusky para aplicar os cambios</string>\n    <string name=\"restart_required\">Require reiniciar app</string>\n    <string name=\"action_open_post\">Abrir publicación</string>\n    <string name=\"expand_collapse_all_posts\">Expandir/Contraer todas as publicacións</string>\n    <string name=\"performing_lookup_title\">Facendo a busca…</string>\n    <string name=\"download_fonts\">Deberás descargar primeiro estes conxuntos de emojis</string>\n    <string name=\"system_default\">Predeterminado do sistema</string>\n    <string name=\"emoji_style\">Estilo dos emoji</string>\n    <string name=\"error_no_custom_emojis\">A túa instancia %1$s non ten emojis personalizados</string>\n    <string name=\"action_compose_shortcut\">Redactar</string>\n    <string name=\"send_post_notification_saved_content\">Gardouse unha copia da publicación nos borradores</string>\n    <string name=\"send_post_notification_cancel_title\">Envío cancelado</string>\n    <string name=\"send_post_notification_channel_name\">Ao enviar Publicacións</string>\n    <string name=\"send_post_notification_error_title\">Produciuse un erro ao enviar a mensaxe</string>\n    <string name=\"send_post_notification_title\">Enviando publicación…</string>\n    <string name=\"compose_save_draft\">Gardar borrador?</string>\n    <string name=\"lock_account_label_description\">Require que aprobes manualmente as seguidoras</string>\n    <string name=\"lock_account_label\">Bloquear conta</string>\n    <string name=\"action_remove\">Retirar</string>\n    <string name=\"action_set_caption\">Definir descrición</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Describe para persoas con deficiencias visuais (límite %1$d caracter)</item>\n        <item quantity=\"other\">Describe para persoas con deficiencias visuais (límite %1$d caracteres)</item>\n    </plurals>\n    <string name=\"compose_active_account_description\">Publicar como %1$s</string>\n    <string name=\"action_remove_from_list\">Retirar conta da lista</string>\n    <string name=\"action_add_to_list\">Engadir conta á lista</string>\n    <string name=\"hint_search_people_list\">Atopar persoas ás que segues</string>\n    <string name=\"action_delete_list\">Eliminar lista</string>\n    <string name=\"action_rename_list\">Actualizar lista</string>\n    <string name=\"action_create_list\">Crear lista</string>\n    <string name=\"error_delete_list\">Non se puido eliminar a lista</string>\n    <string name=\"error_rename_list\">Non se actualizou a lista</string>\n    <string name=\"error_create_list\">Non se puido crear a lista</string>\n    <string name=\"title_lists\">Listas</string>\n    <string name=\"action_lists\">Listas</string>\n    <string name=\"add_account_description\">Engadir unha nova conta Mastodon</string>\n    <string name=\"add_account_name\">Engadir conta</string>\n    <string name=\"filter_add_description\">Frase a filtrar</string>\n    <string name=\"filter_dialog_whole_word_description\">Cando a palabra ou frase é só alfanumérica, só se aplicará se concorda a palabra completa</string>\n    <string name=\"filter_dialog_whole_word\">Palabra completa</string>\n    <string name=\"filter_dialog_update_button\">Actualiza</string>\n    <string name=\"filter_dialog_remove_button\">Retirar</string>\n    <string name=\"filter_edit_title\">Editar filtro</string>\n    <string name=\"filter_addition_title\">Engadir filtro</string>\n    <string name=\"pref_title_thread_filter_keywords\">Conversas</string>\n    <string name=\"pref_title_public_filter_keywords\">Cronoloxías públicas</string>\n    <string name=\"load_more_placeholder_text\">Cargar máis</string>\n    <string name=\"replying_to\">En resposta a @%1$s</string>\n    <string name=\"title_media\">Multimedia</string>\n    <string name=\"pref_title_alway_open_spoiler\">Despregar sempre publicacións marcadas con avisos sobre o contido</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Mostrar sempre multimedia sensible</string>\n    <string name=\"follows_you\">Séguete</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm</string>\n    <string name=\"abbreviated_hours_ago\">%1$dh</string>\n    <string name=\"abbreviated_days_ago\">%1$dd</string>\n    <string name=\"abbreviated_years_ago\">%1$da</string>\n    <string name=\"abbreviated_in_seconds\">hai %1$ds</string>\n    <string name=\"abbreviated_in_hours\">en %1$dh</string>\n    <string name=\"abbreviated_in_minutes\">hai %1$dm</string>\n    <string name=\"abbreviated_in_days\">hai %1$dd</string>\n    <string name=\"abbreviated_in_years\">hai %1$da</string>\n    <string name=\"state_follow_requested\">Seguimento solicitado</string>\n    <string name=\"post_media_attachments\">Anexos</string>\n    <string name=\"post_media_audio\">Audio</string>\n    <string name=\"post_media_video\">Vídeo</string>\n    <string name=\"post_media_images\">Imaxes</string>\n    <string name=\"post_share_link\">ligazón á publicación</string>\n    <string name=\"post_share_content\">contido da publicación</string>\n    <string name=\"about_tusky_account\">Perfil de Tusky</string>\n    <string name=\"about_bug_feature_request_site\">Informar de fallos e solicitar funcións:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_project_site\">Web do proxecto: https://tusky.app</string>\n    <string name=\"about_tusky_license\">Tusky é software libre e de código aberto. Está baixo a licenza GNU General Public License Version 3. Podes ver a licenza aquí: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <string name=\"about_powered_by_tusky\">Desenvolta por Tusky</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_title_activity\">Sobre</string>\n    <string name=\"description_account_locked\">Conta bloqueada</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d nova interacción</item>\n        <item quantity=\"other\">%1$d novas interaccións</item>\n    </plurals>\n    <string name=\"notification_summary_small\">%1$s e %2$s</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, e %3$s</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s e %4$d outras</string>\n    <string name=\"notification_mention_format\">%1$s mencionoute</string>\n    <string name=\"notification_subscription_description\">Notificacións cando alguén a quen estás subscrita publica novo contido</string>\n    <string name=\"notification_subscription_name\">Novas publicacións</string>\n    <string name=\"notification_poll_description\">Notificacións cando rematan as enquisas</string>\n    <string name=\"notification_poll_name\">Resultados de enquisas</string>\n    <string name=\"notification_favourite_description\">Notificacións cando as túas publicacións son favorecidas</string>\n    <string name=\"notification_favourite_name\">Favoritos</string>\n    <string name=\"notification_boost_description\">Notificacións cando as túas publicacións sexan promovidas</string>\n    <string name=\"notification_boost_name\">Promocións</string>\n    <string name=\"notification_follow_request_description\">Notificacións de solicitudes de seguimento</string>\n    <string name=\"notification_follow_request_name\">Solicitudes de seguimento</string>\n    <string name=\"notification_follow_description\">Notificacións sobre novas seguidoras</string>\n    <string name=\"notification_follow_name\">Novas seguidoras</string>\n    <string name=\"notification_mention_descriptions\">Notificación de novas mencións</string>\n    <string name=\"notification_mention_name\">Novas mencións</string>\n    <string name=\"post_text_size_largest\">O máis grande</string>\n    <string name=\"post_text_size_large\">Grande</string>\n    <string name=\"post_text_size_medium\">Medio</string>\n    <string name=\"post_text_size_small\">Pequeno</string>\n    <string name=\"post_text_size_smallest\">O máis pequeno</string>\n    <string name=\"pref_post_text_size\">Tamaño do texto do estado</string>\n    <string name=\"post_privacy_followers_only\">Só seguidoras</string>\n    <string name=\"post_privacy_unlisted\">Limitada</string>\n    <string name=\"post_privacy_public\">Pública</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Abaixo</string>\n    <string name=\"pref_main_nav_position_option_top\">Arriba</string>\n    <string name=\"pref_main_nav_position\">Posición de navegación principal</string>\n    <string name=\"pref_failed_to_sync\">Fallou a sincr. das preferencias</string>\n    <string name=\"pref_publishing\">Predeterminado ao publicar</string>\n    <string name=\"pref_default_media_sensitivity\">Marcar sempre multimedia como sensible (sincr. co servidor)</string>\n    <string name=\"pref_default_post_privacy\">Privacidade da publicación (sincr. co servidor)</string>\n    <string name=\"pref_title_http_proxy_port\">Porto proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_server\">Servidor proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_enable\">Activar proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_settings\">Proxy HTTP</string>\n    <string name=\"pref_title_proxy_settings\">Proxy</string>\n    <string name=\"pref_title_show_media_preview\">Descarga vista previa do multimedia</string>\n    <string name=\"pref_title_show_replies\">Mostar respostas</string>\n    <string name=\"pref_title_show_boosts\">Mostrar promocións</string>\n    <string name=\"pref_title_post_tabs\">Cronoloxía de Inicio</string>\n    <string name=\"pref_title_post_filter\">Filtros na cronoloxía</string>\n    <string name=\"pref_title_animate_custom_emojis\">Animar emojis personalizados</string>\n    <string name=\"pref_title_gradient_for_media\">Mostra gradientes coloridos para multimedia oculto</string>\n    <string name=\"pref_title_animate_gif_avatars\">Animar avatares GIF</string>\n    <string name=\"pref_title_bot_overlay\">Mostra marca para robots</string>\n    <string name=\"pref_title_language\">Idioma</string>\n    <string name=\"pref_title_custom_tabs\">Usar pestanas personalizadas de Chrome</string>\n    <string name=\"pref_title_browser_settings\">Navegador</string>\n    <string name=\"app_theme_system\">Usar deseño do sistema</string>\n    <string name=\"app_theme_auto\">Automático ao solpor</string>\n    <string name=\"app_theme_black\">Negro</string>\n    <string name=\"app_theme_light\">Claro</string>\n    <string name=\"app_them_dark\">Escuro</string>\n    <string name=\"pref_title_timeline_filters\">Filtros</string>\n    <string name=\"pref_title_timelines\">Cronoloxías</string>\n    <string name=\"pref_title_app_theme\">Decorado da aplicación</string>\n    <string name=\"pref_title_appearance_settings\">Aparencia</string>\n    <string name=\"pref_title_notification_filters\">Tipos de notificación activados</string>\n    <string name=\"pref_title_notification_alert_light\">Notificar coa luz</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Notificar con vibración</string>\n    <string name=\"pref_title_notification_alert_sound\">Nofiticar cun ton</string>\n    <string name=\"pref_title_notification_alerts\">Alertas</string>\n    <string name=\"pref_title_notifications_enabled\">Notificacións</string>\n    <string name=\"pref_title_edit_notification_settings\">Notificacións</string>\n    <string name=\"visibility_direct\">Directa: Só para as persoas mencionadas</string>\n    <string name=\"visibility_private\">Só seguidoras: visible só polas seguidoras</string>\n    <string name=\"visibility_unlisted\">Limitada: non mostrar en cronoloxías públicas</string>\n    <string name=\"visibility_public\">Pública: Publicar en cronoloxías públicas</string>\n    <string name=\"dialog_mute_hide_notifications\">Agochar notificacións</string>\n    <string name=\"dialog_mute_warning\">Acalar a @%1$s?</string>\n    <string name=\"dialog_block_warning\">Bloquear a @%1$s?</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Agochar todo o dominio</string>\n    <string name=\"mute_domain_warning\">Tes a certeza de querer bloquear a todo %1$s? Non verás o contido dese dominio en ningunha cronoloxía pública ou nas notificacións. As túas seguidoras nese dominio serán retiradas.</string>\n    <string name=\"dialog_redraft_post_warning\">Eliminar e reescribir esta publicación?</string>\n    <string name=\"dialog_delete_post_warning\">Eliminar esta publicación?</string>\n    <string name=\"dialog_unfollow_warning\">Deixar de seguir esta conta?</string>\n    <string name=\"dialog_message_cancel_follow_request\">Revogar a solicitude de seguimento?</string>\n    <string name=\"dialog_download_image\">Descargar</string>\n    <string name=\"dialog_message_uploading_media\">Enviando…</string>\n    <string name=\"dialog_title_finishing_media_upload\">Rematando o envío de multimedia</string>\n    <string name=\"dialog_whats_an_instance\">Aquí podes escribir o enderezo ou dominio de calquera instancia, como mastodon.gal, icosahedron.website, social.techncs.de, e <a href=\"https://instances.social\">máis!</a> \n\\n\n\\nSe aínda non tes unha conta, podes escribir o nome da instancia á que desexas unirte e crear unha conta nela.\n\\n\n\\nUnha instancia é o lugar onde se hospeda a túa conta, pero podes comunicarte facilmente e seguir a persoas noutras instancias como se estiveses alí.\n\\n\n\\nPodes atopar máis información en <a href=\"https://joinmastodon.org\">joinmastodon.org</a>.</string>\n    <string name=\"login_connection\">Conectando…</string>\n    <string name=\"link_whats_an_instance\">Que é unha instancia?</string>\n    <string name=\"label_header\">Cabeceira</string>\n    <string name=\"label_avatar\">Avatar</string>\n    <string name=\"label_quick_reply\">Responder…</string>\n    <string name=\"search_no_results\">Sen resultados</string>\n    <string name=\"hint_search\">Buscar…</string>\n    <string name=\"hint_note\">Acerca de</string>\n    <string name=\"hint_display_name\">Nome público</string>\n    <string name=\"hint_content_warning\">Aviso sobre o contido</string>\n    <string name=\"hint_compose\">Que contas?</string>\n    <string name=\"draft_deleted\">Borrador eliminado</string>\n    <string name=\"drafts_failed_loading_reply\">Fallou a carga da información da Resposta</string>\n    <string name=\"drafts_post_failed_to_send\">Fallou o envío da publicación!</string>\n    <string name=\"dialog_delete_list_warning\">Tes a certeza de querer eliminar a lista %1$s?</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Non podes enviar máis de %1$d anexo multimedia.</item>\n        <item quantity=\"other\">Non podes enviar máis de %1$d anexos multimedia.</item>\n    </plurals>\n    <string name=\"wellbeing_hide_stats_profile\">Agochar estatísticas cuantitativas nos perfís</string>\n    <string name=\"wellbeing_hide_stats_posts\">Agochar estatísticas cuantitativas nas publicacións</string>\n    <string name=\"limit_notifications\">Limitar notificacións da cronoloxía</string>\n    <string name=\"review_notifications\">Revisar as Notificacións</string>\n    <string name=\"wellbeing_mode_notice\">Agocharemos algunha información que podería afectar ao teu benestar mental. Isto inclúe:\n\\n\n\\n- Notificacións sobre Promocións/Favorecementos/Seguimentos\n\\n- Número de Favorecementos/Promocións nas publicacións\n\\n- Estatísticas de Seguidoras/Publicacións nos perfís\n\\n\n\\nAs notificacións tipo push non estarán afectadas, mais podes revisar as preferencias de notificacións manualmente.</string>\n    <string name=\"account_note_saved\">Gardado!</string>\n    <string name=\"account_note_hint\">Nota privada sobre esta conta</string>\n    <string name=\"pref_title_wellbeing_mode\">Benestar</string>\n    <string name=\"pref_title_hide_top_toolbar\">Agochar o título da barra de ferramentas superior</string>\n    <string name=\"pref_title_confirm_reblogs\">Pedir confirmación antes de promover</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Ver vista previa das ligazóns nas cronoloxías</string>\n    <string name=\"warning_scheduling_interval\">Mastodon ten un intervalo mínimo de 5 minutos para as programacións.</string>\n    <string name=\"no_announcements\">Non hai anuncios.</string>\n    <string name=\"no_scheduled_posts\">Non tes estados programados.</string>\n    <string name=\"no_drafts\">Non tes borradores.</string>\n    <string name=\"post_lookup_error_format\">Erro ao buscar publicación %1$s</string>\n    <string name=\"edit_poll\">Editar</string>\n    <string name=\"poll_new_choice_hint\">Opción %1$d</string>\n    <string name=\"poll_allow_multiple_choices\">Varias opcións</string>\n    <string name=\"add_poll_choice\">Engadir opción</string>\n    <string name=\"duration_7_days\">7 días</string>\n    <string name=\"duration_3_days\">3 días</string>\n    <string name=\"duration_1_day\">1 día</string>\n    <string name=\"duration_6_hours\">6 horas</string>\n    <string name=\"duration_1_hour\">1 hora</string>\n    <string name=\"duration_30_min\">30 minutos</string>\n    <string name=\"duration_5_min\">5 minutos</string>\n    <string name=\"hint_domain\">En que instancia?</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s visible</string>\n    <string name=\"confirmation_unmuted\">Usuaria reactivada</string>\n    <string name=\"confirmation_unblocked\">Usuaria desbloqueada</string>\n    <string name=\"confirmation_reported\">Enviado!</string>\n    <string name=\"send_media_to\">Compartir multimedia en…</string>\n    <string name=\"send_post_content_to\">Compartir publicación en…</string>\n    <string name=\"send_post_link_to\">Compartir URL da publicación con…</string>\n    <string name=\"downloading_media\">Descargando multimedia</string>\n    <string name=\"download_media\">Descargar multimedia</string>\n    <string name=\"action_share_as\">Compartir como…</string>\n    <string name=\"action_open_as\">Abrir como %1$s</string>\n    <string name=\"action_copy_link\">Copiar ligazón</string>\n    <string name=\"download_image\">Descargando %1$s</string>\n    <string name=\"action_open_media_n\">Abrir multimedia #%1$d</string>\n    <string name=\"title_links_dialog\">Ligazóns</string>\n    <string name=\"title_mentions_dialog\">Mencións</string>\n    <string name=\"title_hashtags_dialog\">Cancelos</string>\n    <string name=\"action_open_faved_by\">Mostrar favoritos</string>\n    <string name=\"action_open_reblogged_by\">Mostrar promocións</string>\n    <string name=\"action_open_reblogger\">Abrir autor da promoción</string>\n    <string name=\"action_hashtags\">Cancelos</string>\n    <string name=\"action_mentions\">Mencións</string>\n    <string name=\"action_links\">Ligazóns</string>\n    <string name=\"action_add_tab\">Engadir pestana</string>\n    <string name=\"action_reset_schedule\">Restablecer</string>\n    <string name=\"action_schedule_post\">Programar publicación</string>\n    <string name=\"action_emoji_keyboard\">Teclado Emoji</string>\n    <string name=\"follow_requests_info\">Aínda que a túa conta non está bloqueada, a administración de %1$s opina que debes revisar manualmente as peticións de seguimento destas contas.</string>\n    <string name=\"dialog_delete_conversation_warning\">Eliminar esta conversa?</string>\n    <string name=\"action_delete_conversation\">Eliminar conversa</string>\n    <string name=\"action_unbookmark\">Retirar marcador</string>\n    <string name=\"pref_title_confirm_favourites\">Pedir confirmación antes de favorecer</string>\n    <string name=\"duration_14_days\">14 días</string>\n    <string name=\"duration_30_days\">30 días</string>\n    <string name=\"duration_60_days\">60 días</string>\n    <string name=\"duration_90_days\">90 días</string>\n    <string name=\"duration_180_days\">180 días</string>\n    <string name=\"duration_365_days\">365 días</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Redactar publicación</string>\n    <string name=\"notification_sign_up_format\">%1$s creou a conta</string>\n    <string name=\"notification_sign_up_name\">Rexistros</string>\n    <string name=\"notification_sign_up_description\">Notificacións sobre novas usuarias</string>\n    <string name=\"notification_update_name\">Edicións da publicación</string>\n    <string name=\"account_date_joined\">Creada %1$s</string>\n    <string name=\"title_login\">Acceder</string>\n    <string name=\"notification_update_description\">Notificacións cando son editadas publicacións coas que interactuaches</string>\n    <string name=\"notification_update_format\">%1$s editou a publicación</string>\n    <string name=\"action_dismiss\">Desbotar</string>\n    <string name=\"action_details\">Detalles</string>\n    <string name=\"error_could_not_load_login_page\">Non se puido cargar a páxina de inicio.</string>\n    <string name=\"saving_draft\">Gardando borrador…</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"action_edit_image\">Editar imaxe</string>\n    <string name=\"error_loading_account_details\">Fallou a carga dos detalles da conta</string>\n    <string name=\"error_image_edit_failed\">A imaxe non puido ser editada.</string>\n    <string name=\"set_focus_description\">Toca ou arrastra o círculo para escoller onde centrar a imaxe e sexa máis visible nas miniaturas.</string>\n    <string name=\"duration_no_change\">(Sen cambio)</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"error_multimedia_size_limit\">Os ficheiros de vídeo e audio non poden superar os %1$s MB.</string>\n    <string name=\"description_post_language\">Idioma de publicación</string>\n    <string name=\"action_set_focus\">Definir o foco</string>\n    <string name=\"error_following_hashtag_format\">Produciuse un erro ao seguir #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Produciuse un erro ao retirar o seguimento de #%1$s</string>\n    <string name=\"instance_rule_title\">Normas de %1$s</string>\n    <string name=\"instance_rule_info\">Ao iniciar sesión aceptas as normas de %1$s.</string>\n    <string name=\"action_add_reaction\">engadir reacción</string>\n    <string name=\"compose_save_draft_loses_media\">Gardar borrador? (Os adxuntos serán enviados outra vez cando restablezas o borrador.)</string>\n    <string name=\"pref_title_show_self_username\">Mostrar identificador na barra ferramentas</string>\n    <string name=\"delete_scheduled_post_warning\">Eliminar publicación programada?</string>\n    <string name=\"failed_to_pin\">Produciuse un fallo ao fixar</string>\n    <string name=\"failed_to_unpin\">Produciuse un fallo ao desprender</string>\n    <string name=\"pref_show_self_username_always\">Sempre</string>\n    <string name=\"pref_show_self_username_disambiguate\">Cando hai máis dunha conta activa</string>\n    <string name=\"pref_show_self_username_never\">Nunca</string>\n    <string name=\"notification_report_description\">Notificacións sobre temas de moderación</string>\n    <string name=\"report_category_spam\">Spam</string>\n    <string name=\"action_add_or_remove_from_list\">Engadir ou retirar da lista</string>\n    <string name=\"failed_to_add_to_list\">Fallou a adición da conta á lista</string>\n    <string name=\"failed_to_remove_from_list\">Fallou a retirada da conta da lista</string>\n    <string name=\"action_unfollow_hashtag_format\">Non seguir #%1$s?</string>\n    <string name=\"pref_default_post_language\">Idioma de publicación (sincr. co servidor)</string>\n    <string name=\"notification_report_name\">Denuncias</string>\n    <string name=\"no_lists\">Non tes listas.</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"report_category_violation\">Faltar a unha norma</string>\n    <string name=\"report_category_other\">Outra</string>\n    <string name=\"error_following_hashtags_unsupported\">Esta instancia non é compatible co seguimento de cancelos.</string>\n    <string name=\"title_followed_hashtags\">Cancelos seguidos</string>\n    <string name=\"status_created_at_now\">agora</string>\n    <string name=\"notification_report_format\">Nova denuncia sobre %1$s</string>\n    <string name=\"notification_header_report_format\">%1$s denunciou a %2$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d publicacións anexadas</string>\n    <string name=\"confirmation_hashtag_unfollowed\">Xa non segues a #%1$s</string>\n    <string name=\"hint_media_description_missing\">O multimedia debería ter unha descrición.</string>\n    <string name=\"pref_title_http_proxy_port_message\">O porto debe estar entre %1$d e %2$d</string>\n    <string name=\"error_muting_hashtag_format\">Produciuse un erro ao acalar #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Produciuse un erro ao reactivar #%1$s</string>\n    <string name=\"description_post_edited\">Editado</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"post_edited\">Editado o %1$s</string>\n    <string name=\"error_status_source_load\">Produciuse un fallo na carga da fonte do estado desde o servidor.</string>\n    <string name=\"a11y_label_loading_thread\">Cargando fío</string>\n    <string name=\"mute_notifications_switch\">Acalar notificacións</string>\n    <string name=\"title_edits\">Edicións</string>\n    <string name=\"status_edit_info\">Editada: %1$s</string>\n    <string name=\"status_created_info\">Creado por %1$s</string>\n    <string name=\"action_discard\">Desbotar cambios</string>\n    <string name=\"action_continue_edit\">Continuar a edición</string>\n    <string name=\"compose_unsaved_changes\">Hai cambios non gardados.</string>\n    <string name=\"action_share_account_link\">Comparte ligazón da conta</string>\n    <string name=\"action_share_account_username\">Comparte identificador da conta</string>\n    <string name=\"send_account_link_to\">Compartir URL da conta en…</string>\n    <string name=\"send_account_username_to\">Compartir identificador da conta en…</string>\n    <string name=\"account_username_copied\">Identificador copiado</string>\n    <string name=\"pref_title_reading_order\">Orde de lectura</string>\n    <string name=\"pref_reading_order_oldest_first\">O máis antigo primeiro</string>\n    <string name=\"pref_reading_order_newest_first\">As novidades primeiro</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;sen definir&gt;</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Desactivado</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;non válido&gt;</string>\n    <string name=\"action_post_failed\">Produciuse un fallo no envío</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Produciuse un fallo no envío da publicación e gardouse nos borradores.\n\\n\n\\nPode que o servidor non estivese accesible ou que rexeitase a publicación.</item>\n        <item quantity=\"other\">Produciuse un fallo no envío das túas publicacións e gardáronse nos borradores.\n\\n\n\\nPode que o servidor non estivese accesible ou que rexeitase as publicacións.</item>\n    </plurals>\n    <string name=\"action_post_failed_show_drafts\">Mostrar borradores</string>\n    <string name=\"action_post_failed_do_nothing\">Desbotar</string>\n    <string name=\"action_browser_login\">Acceder no navegador</string>\n    <string name=\"description_browser_login\">Pode ter compatibilidade para métodos adicionais de autenticación, pero require un navegador compatíbel.</string>\n    <string name=\"description_login\">Funciona case sempre. Non se filtran datos a outras apps.</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d persoas están falando do cancelo %2$s</string>\n    <string name=\"title_public_trending_hashtags\">Cancelos populares</string>\n    <string name=\"total_usage\">Uso total</string>\n    <string name=\"total_accounts\">Total de contas</string>\n    <string name=\"dialog_follow_hashtag_title\">Seguir cancelo</string>\n    <string name=\"help_empty_home\">Esta é a túa <b>cronoloxía de inicio</b>. Mostra as publicacións recentes das contas que segues.\n\\n\n\\nPara atopar contas podes mirar nalgunha das outras cronoloxías. Por exemplo, na cronoloxía local da túa instancia {{group}}. Ou buscalas polo seu nome {{search}}; por exemplo busca «Tusky» para atopar a nosa conta en Mastodon.</string>\n    <string name=\"post_media_image\">Imaxe</string>\n    <string name=\"hint_filter_title\">O meu filtro</string>\n    <string name=\"action_refresh\">Actualizar</string>\n    <string name=\"notification_unknown_name\">Descoñecido</string>\n    <string name=\"socket_timeout_exception\">Estamos tardando demasiado en conectar co servidor</string>\n    <string name=\"ui_error_unknown\">razón descoñecida</string>\n    <string name=\"ui_error_bookmark\">Fallou engadir a marcadores: %1$s</string>\n    <string name=\"ui_error_clear_notifications\">Fallou a limpeza das notificacións: %1$s</string>\n    <string name=\"ui_error_vote\">Fallou a votación na enquisa: %1$s</string>\n    <string name=\"ui_error_favourite\">Fallou favorecer a publicación: %1$s</string>\n    <string name=\"ui_error_reblog\">Fallou promover a publicación: %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">Fallou a aceptación da solicitude de seguimento: %1$s</string>\n    <string name=\"ui_error_reject_follow_request\">Fallou o rexeitamento da solicitude de seguimento: %1$s</string>\n    <string name=\"ui_success_accepted_follow_request\">Aceptado o seguimento</string>\n    <string name=\"ui_success_rejected_follow_request\">Bloqueada a solicitude de seguimento</string>\n    <string name=\"status_filtered_show_anyway\">Mostrar igualmente</string>\n    <string name=\"status_filter_placeholder_label_format\">Filtro: %1$s</string>\n    <string name=\"pref_title_account_filter_keywords\">Perfís</string>\n    <string name=\"label_filter_title\">Título</string>\n    <string name=\"filter_action_warn\">Aviso</string>\n    <string name=\"filter_action_hide\">Agochar</string>\n    <string name=\"filter_description_warn\">Ocultar toda a publicación cun aviso</string>\n    <string name=\"filter_description_hide\">Agochar completamente</string>\n    <string name=\"label_filter_action\">Acción do filtro</string>\n    <string name=\"label_filter_context\">Ámbitos para o filtro</string>\n    <string name=\"label_filter_keywords\">Palabras clave a filtrar</string>\n    <string name=\"action_add\">Engadir</string>\n    <string name=\"filter_keyword_display_format\">%1$s (palabra completa)</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"pref_title_show_stat_inline\">Mostrar estatísticas da publicación na cronoloxía</string>\n    <string name=\"filter_keyword_addition_title\">Engadir palabra clave</string>\n    <string name=\"filter_edit_keyword_title\">Editar palabra clave</string>\n    <string name=\"select_list_manage\">Xestionar listas</string>\n    <string name=\"error_missing_edits\">O teu servidor sabe que a publicación foi editada, pero non ten unha copia das edicións, polo que non pode mostralas.\n\\n\n\\nÉ un <a href=\"https://github.com/mastodon/mastodon/issues/25398\">problema coñecido</a> en Mastodon.</string>\n    <string name=\"load_newest_notifications\">Cargar as notificacións máis recentes</string>\n    <string name=\"compose_delete_draft\">Eliminar borrador?</string>\n    <string name=\"pref_ui_text_size\">Tamaño da letra</string>\n    <string name=\"notification_listenable_worker_name\">Actividade en segundo plano</string>\n    <string name=\"notification_listenable_worker_description\">Notificacións cando Tusky está a funcionar en segundo plano</string>\n    <string name=\"notification_notification_worker\">Obtendo as notificacións…</string>\n    <string name=\"notification_prune_cache\">Mantemento da caché…</string>\n    <string name=\"error_media_upload_sending_fmt\">Produciuse un fallo no envío: %1$s</string>\n    <string name=\"about_device_info_title\">O teu dispositivo</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nVersión de Android: %3$s\n\\nVersión SDK: %4$d</string>\n    <string name=\"about_account_info_title\">A túa conta</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nVersión: %3$s</string>\n    <string name=\"about_copied\">Copiouse a información sobre o dispositivo e versión</string>\n    <string name=\"about_copy\">Copiar a información da versión e o dispositivo</string>\n    <string name=\"dialog_delete_filter_positive_action\">Eliminar</string>\n    <string name=\"list_exclusive_label\">Agochar na cronoloxía de inicio</string>\n    <string name=\"dialog_delete_filter_text\">Eliminar o filtro \\'%1$s\\'?</string>\n    <string name=\"error_media_playback\">Produciuse un fallo ao reproducir: %1$s</string>\n    <string name=\"help_empty_conversations\">Aquí están as túas <b>mensaxes privadas</b>; tamén chamadas conversas ou mensaxes directas (DM); \n\\n\n\\nAs mensaxes privadas créanse establecendo a visibilidade {{public}} da publicación como {{mail}} <i>Directa</i> e mencionando a unha ou máis usuarias no texto.\n\\n\n\\nPor exemplo podes ir ao perfil dunha conta e tocar no botón escribir {{edit}} e cambiar a visibilidade.\n\\n\n\\nTen en conta que as mensaxes no Fediverso non están cifradas de extremo-a-extremo. Non compartas información sensible.</string>\n    <string name=\"muting_hashtag_success_format\">Acalar o cancelo #%1$s cun aviso</string>\n    <string name=\"unmuting_hashtag_success_format\">Reactivar o cancelo #%1$s</string>\n    <string name=\"action_view_filter\">Ver filtro</string>\n    <string name=\"following_hashtag_success_format\">Agora segues o cancelo #%1$s</string>\n    <string name=\"unfollowing_hashtag_success_format\">Xa non segues o cancelo #%1$s</string>\n    <string name=\"dialog_save_profile_changes_message\">Queres gardar os cambios no teu perfil?</string>\n    <string name=\"help_empty_lists\">Esta é a <b>vista de listas</b>. Podes definir varias listas privadas e engadir contas a elas.\n\\n\n\\nTEN EN CONTA que só podes engadir contas que estás a seguir.\n\\n\n\\nEstas listas pódense usar como pestanas configurando as Pestanas nas Preferencias da conta {{manage_accounts}} {{chevron_right}}.</string>\n    <string name=\"error_blocking_domain\">Non se acalou a %1$s: %2$s</string>\n    <string name=\"error_unblocking_domain\">Non se reactivou a %1$s: %2$s</string>\n    <string name=\"label_image\">Imaxe</string>\n    <string name=\"app_theme_system_black\">Usar o deseño do Sistema (negro)</string>\n    <string name=\"title_public_trending_statuses\">Publicacións populares</string>\n    <string name=\"list_reply_policy_none\">Ninguén</string>\n    <string name=\"list_reply_policy_list\">Compoñentes da lista</string>\n    <string name=\"list_reply_policy_followed\">Calquera usuaria seguida</string>\n    <string name=\"list_reply_policy_label\">Mostrar respostas a</string>\n    <string name=\"pref_title_show_self_boosts_description\">Alguén que promove as súas propias publicacións</string>\n    <string name=\"pref_title_show_self_boosts\">Mostrar autopromocións</string>\n    <string name=\"pref_title_per_timeline_preferences\">Preferencias nas cronoloxías</string>\n    <string name=\"pref_title_show_notifications_filter\">Mostrar Filtro das notificacións</string>\n    <string name=\"reply_sending\">Enviando…</string>\n    <string name=\"reply_sending_long\">Enviouse a resposta.</string>\n    <string name=\"action_translate\">Traducir</string>\n    <string name=\"action_show_original\">Mostrar orixinal</string>\n    <string name=\"label_translated\">Traducida do %1$s con %2$s</string>\n    <string name=\"label_translating\">Traducindo…</string>\n    <string name=\"ui_error_translate\">Non se puido traducir: %1$s</string>\n    <string name=\"dialog_follow_warning\">Seguir esta conta?</string>\n    <string name=\"report_category_legal\">Legal</string>\n    <string name=\"pref_title_confirm_follows\">Pedir confirmación antes de seguir</string>\n    <string name=\"unknown_notification_type\">Tipo de notificación descoñecido</string>\n    <string name=\"pref_default_reply_privacy\">Privacidade da resposta (non sincr. co servidor)</string>\n    <string name=\"action_follow_hashtag\">Seguir un novo cancelo</string>\n    <string name=\"url_copied\">URL copiado</string>\n    <string name=\"error_deleting_filter\">Produciuse un erro ao eliminar o filtro «%1$s»</string>\n    <string name=\"error_saving_filter\">Produciuse un erro ao gardar o filtro «%1$s»</string>\n    <string name=\"confirmation_hashtag_copied\">«#%1$s» copiado</string>\n    <string name=\"pref_default_reply_privacy_explanation\">O nivel de privacidade preseleccionado dependerá da publicación á que respondas.</string>\n    <string name=\"pref_match_default_post_privacy\">Seguir a privacidade predeterminada da publicación</string>\n    <string name=\"post_privacy_direct\">Directa</string>\n    <string name=\"label_expires_after\">Caduca após</string>\n    <string name=\"notification_policies_title\">Configuración das notificacións</string>\n    <string name=\"notification_policies_filter_out\">Xestiona as notificacións de…</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">Persoas que non segues</string>\n    <string name=\"notification_policies_filter_dont_follow_description\">Ata que as aprobes manualmente</string>\n    <string name=\"notification_policies_filter_not_following_title\">Persoas que non te seguen</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">Novas contas</string>\n    <string name=\"unknown_notification_filter_new_accounts_description\">Creadas nos últimos 30 días</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_title\">Mencións privadas non solicitadas</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_description\">Filtradas a non ser que sexa resposta á túa propia mención ou se segues á remitente</string>\n    <string name=\"unknown_notification_filter_moderated_accounts\">Contas moderadas</string>\n    <string name=\"unknown_notification_filter_moderated_accounts_description\">Limitadas pola moderación do servidor</string>\n    <string name=\"filtered_notifications\">Notificacións filtradas</string>\n    <string name=\"notifications_from_people_you_may_know\">Notificacións de %1$d persoas que igual coñeces</string>\n    <string name=\"notification_policy_accept\">Aceptar</string>\n    <string name=\"notification_policy_filter\">Filtrar</string>\n    <string name=\"notification_policy_ignore\">Ignorar</string>\n    <string name=\"filtered_notifications_title\">Notificacións Filtradas</string>\n    <string name=\"accept_notification_request\">Aceptar solicitude de notificación</string>\n    <string name=\"dismiss_notification_request\">Desbotar solicitude de notificación</string>\n    <string name=\"open_settings\">Abrir as preferencias</string>\n    <string name=\"notifications_from\">Notificacións de %1$s</string>\n    <string name=\"action_accept_notification_request\">Aceptar</string>\n    <string name=\"action_dismiss_notification_request\">Desbotar</string>\n    <string name=\"notification_policies_not_supported\">Esta ferramenta só é compatible con servidores Mastodon 4.3.0 ou superior.</string>\n    <string name=\"notification_policies_filter_not_following_description\">Incluíndo as persoas que te seguen desde fai menos de 3 días</string>\n    <string name=\"post_replied\">Con resposta</string>\n    <string name=\"post_replied_format\">Como resposta a %1$s</string>\n    <string name=\"post_replied_self\">Continuación do fío</string>\n    <string name=\"preview_card_by_author\">Por %1$s</string>\n    <string name=\"preview_card_more_by_author\">Máis de %1$s</string>\n    <string name=\"follow_hashtag_success\">Segues o cancelo %1$s</string>\n    <string name=\"unknown_notification_type_explanation\">Tusky non recoñece este tipo de notificación e non pode mostrala. Deberías poder vela na interface web da túa instancia. Informa ao equipo de desenvolvemento de Tusky para que poidan engadir esta notificación!</string>\n    <string name=\"relationship_severance_event_account_suspension\">A administración de %1$s suspendeu a %2$s, polo que non recibirás actualizacións nin poderás interactuar con esa conta.</string>\n    <string name=\"moderation_warning_action_mark_statuses_as_sensitive\">Algunha das túas publicacións marcouse como sensible.</string>\n    <string name=\"relationship_severance_event_domain_block\">A administración de %1$s bloqueou a %2$s, que inclúe %3$s das túas seguidoras e %4$s seguimentos.</string>\n    <string name=\"notification_severed_relationship_name\">Relacións perdidas</string>\n    <string name=\"notification_moderation_warning_name\">Avisos da moderación</string>\n    <string name=\"notification_unknown_description\">Tipo de notificación descoñecido</string>\n    <string name=\"notification_channel_other\">Outro</string>\n    <string name=\"notification_channel_other_description\">Outras notificacións, como relacións perdidas e avisos da moderación</string>\n    <string name=\"notification_channel_admin\">Admin</string>\n    <string name=\"notification_channel_admin_description\">Notificacións para admins, como denuncias ou novas contas</string>\n    <string name=\"relationship_severance_event_title\">Relación perdida</string>\n    <string name=\"relationship_severance_event_user_domain_block\">Bloqueaches a %1$s, eliminando a %2$s das túas seguidoras e %3$s seguimentos.</string>\n    <plurals name=\"accounts\">\n        <item quantity=\"one\">%1$s conta</item>\n        <item quantity=\"other\">%1$s contas</item>\n    </plurals>\n    <string name=\"moderation_warning\">Recibiches un aviso da Moderación.</string>\n    <string name=\"moderation_warning_action_delete_statuses\">Elimináronse algunha das túas publicacións.</string>\n    <string name=\"moderation_warning_action_disable\">Desactivouse a túa conta.</string>\n    <string name=\"moderation_warning_action_none\">A túa conta recibeu un aviso da Moderación.</string>\n    <string name=\"moderation_warning_action_sensitive\">A partir de agora as túas publicacións marcaranse como sensibles.</string>\n    <string name=\"moderation_warning_action_silence\">A túa conta está limitada.</string>\n    <string name=\"moderation_warning_action_suspend\">A túa conta está suspendida.</string>\n    <string name=\"poll\">Enquisa</string>\n    <plurals name=\"media_attachments\">\n        <item quantity=\"one\">%1$s anexo multimedia</item>\n        <item quantity=\"other\">%1$s anexos multimedia</item>\n    </plurals>\n    <string name=\"notification_info_reply\">Resposta</string>\n    <string name=\"notification_info_private_mention\">Mención privada</string>\n    <string name=\"notification_info_mention\">Mención</string>\n    <string name=\"notification_info_private_reply\">Resposta privada</string>\n    <string name=\"action_reblog_private\">Promover só para seguidoras</string>\n    <string name=\"action_reblog_public\">Promover publicamente</string>\n    <string name=\"action_reblog_unlisted\">Promover para fóra de listas</string>\n    <string name=\"poll_show_results\">Mostrar resultados</string>\n    <string name=\"no\">Non</string>\n    <string name=\"confirm_dismiss_caption\">Desbotar cambios na descrición?</string>\n    <string name=\"yes\">Si</string>\n    <string name=\"unmute_success\">Reactivouse a %1$s</string>\n    <string name=\"block_failure\">Fallou o bloqueo de %1$s: %2$s</string>\n    <string name=\"mute_failure\">Fallou o silenciamento de %1$s: %2$s</string>\n    <string name=\"unblock_failure\">Fallou o desbloqueo de %1$s: %2$s</string>\n    <string name=\"accept_follow_request_failure\">Fallou a aceptación da solicitude de seguimento de %1$s: %2$s</string>\n    <string name=\"unblock_success\">Desbloqueouse a %1$s</string>\n    <string name=\"unmute_failure\">Fallou a reactivación de %1$s: %2$s</string>\n    <string name=\"reject_follow_request_failure\">Fallou o rexeitamento da solicitude de seguimento de %1$s: %2$s</string>\n    <string name=\"filter_action_blur\">Esvaecer</string>\n    <string name=\"filter_description_blur\">Ocultar multimedia cun aviso</string>\n    <string name=\"reblog_privacy_followers_only_description\">Só as túas seguidras verán a promoción</string>\n    <string name=\"reblog_confirm\">Promover a publicación?</string>\n    <string name=\"favourite_confirm\">Favorecer a publicación?</string>\n    <string name=\"reblog_privacy_unlisted_description\">Igual que público pero non se mostra en cronoloxías públicas</string>\n    <string name=\"reblog_privacy_public_description\">Todo o mundo pode ver a promoción</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-hi/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"action_login\">हिंदी</string>\n    <string name=\"title_favourites\">पसंदीदा</string>\n    <string name=\"title_drafts\">प्रारूप</string>\n    <string name=\"action_logout\">लॉग आउट</string>\n    <string name=\"action_view_preferences\">प्राथमिकताएं</string>\n    <string name=\"action_view_account_preferences\">खाता प्राथमिकताएं</string>\n    <string name=\"action_edit_profile\">प्रोफाइल एडिट करें</string>\n    <string name=\"action_search\">खोज</string>\n    <string name=\"about_title_activity\">के बारे में</string>\n    <string name=\"title_posts_with_replies\">उत्तरों के साथ</string>\n    <string name=\"title_followers\">अनुगामी</string>\n    <string name=\"action_reply\">उत्तर दें</string>\n    <string name=\"action_follow\">फ़ॉलो</string>\n    <string name=\"action_unfollow\">अनफ़ॉलो</string>\n    <string name=\"action_block\">ब्लॉक</string>\n    <string name=\"action_unblock\">अनब्लॉक</string>\n    <string name=\"action_hide_reblogs\">बूस्ट छिपाएं</string>\n    <string name=\"action_show_reblogs\">बूस्ट दिखाएं</string>\n    <string name=\"action_report\">रिपोर्ट करें</string>\n    <string name=\"action_edit\">एडिट करें</string>\n    <string name=\"action_delete\">डिलीट करें</string>\n    <string name=\"action_delete_and_redraft\">डिलीट एवं रिड्राफ्ट करें</string>\n    <string name=\"action_send\">टूट करें</string>\n    <string name=\"action_send_public\">टूट!</string>\n    <string name=\"action_retry\">पुनः प्रयास करें</string>\n    <string name=\"action_close\">बंद करें</string>\n    <string name=\"action_view_profile\">प्रोफाइल</string>\n    <string name=\"description_visibility_private\">अनुगामी</string>\n    <string name=\"error_media_upload_sending\">अपलोड विफल रहा।</string>\n    <string name=\"error_media_download_permission\">मीडिया को स्टोर करने की अनुमति आवश्यक है।</string>\n    <string name=\"error_media_upload_permission\">मीडिया पढ़ने की अनुमति आवश्यक है।</string>\n    <string name=\"error_media_upload_opening\">वह फ़ाइल नहीं खोली जा सकी।</string>\n    <string name=\"error_media_upload_type\">उस प्रकार की फ़ाइल अपलोड नहीं की जा सकती।</string>\n    <string name=\"error_generic\">एक त्रुटि हुई।</string>\n    <string name=\"action_reset_schedule\">रीसेट</string>\n    <string name=\"error_retrieving_oauth_token\">लॉगिन टोकन प्राप्त करने में विफल।</string>\n    <string name=\"error_authorization_denied\">प्राधिकरण करने के से इनकार कर दिया।</string>\n    <string name=\"error_authorization_unknown\">एक अज्ञात प्राधिकरण त्रुटि हुई।</string>\n    <string name=\"error_no_web_browser_found\">उपयोग करने के लिए वेब ब्राउज़र नहीं मिला।</string>\n    <string name=\"error_invalid_domain\">अमान्य डोमेन दर्ज किया गया</string>\n    <string name=\"error_empty\">यह खाली नहीं हो सकता।</string>\n    <string name=\"error_network\">नेटवर्क त्रुटि हुई! कृपया अपना कनेक्शन जांचें और पुनः प्रयास करें!</string>\n    <string name=\"title_lists\">सूचियाँ</string>\n    <string name=\"action_lists\">सूचियाँ</string>\n    <string name=\"description_poll\">जनमत के विकल्प: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"action_view_bookmarks\">बुकमार्क</string>\n    <string name=\"edit_poll\">संपादित करें</string>\n    <string name=\"action_add_poll\">जनमत शुरू करें</string>\n    <string name=\"create_poll_title\">पोल</string>\n    <string name=\"title_accounts\">खाता</string>\n    <string name=\"button_done\">पूर्ण</string>\n    <string name=\"button_back\">पीछे</string>\n    <string name=\"button_continue\">जारी रखें</string>\n    <string name=\"poll_vote\">वोट</string>\n    <string name=\"poll_info_closed\">बन्द है</string>\n    <string name=\"compose_shortcut_short_label\">लिखें</string>\n    <string name=\"title_posts_pinned\">पिन की गई</string>\n    <string name=\"title_posts\">पोस्ट</string>\n    <string name=\"title_home\">घर</string>\n    <string name=\"license_description\">टस्की में निम्नलिखित ओपन सोर्स परियोजनाओं से कोड और संपत्ति हैं:</string>\n    <string name=\"restart_emoji\">इन परिवर्तनों को लागू करने के लिए आपको टस्की को पुनः आरंभ करना होगा</string>\n    <string name=\"about_tusky_account\">टस्की की प्रोफाइल</string>\n    <string name=\"about_bug_feature_request_site\">बग रिपोर्ट और सुविधा अनुरोध:\n\\n https://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_project_site\">परियोजना की वेबसाइट:\n\\n https://tusky.app</string>\n    <string name=\"about_tusky_license\">टस्की स्वतंत्र और ओपन-सोर्स सॉफ्टवेयर है। यह GNU जनरल पब्लिक लाइसेंस संस्करण 3 के तहत लाइसेंस प्राप्त है। आप लाइसेंस यहां देख सकते हैं: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <string name=\"about_powered_by_tusky\">टस्की द्वारा संचालित</string>\n    <string name=\"about_tusky_version\">टस्की %1$s</string>\n    <string name=\"description_account_locked\">बंद खाता</string>\n    <string name=\"notification_summary_small\">%1$s तथा %2$s</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, तथा %3$s</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s तथा %4$d अन्य लोग</string>\n    <string name=\"notification_poll_name\">जनमत</string>\n    <string name=\"notification_favourite_name\">पसंदीदा</string>\n    <string name=\"post_text_size_largest\">सबसे बड़ा</string>\n    <string name=\"post_text_size_large\">बड़ा</string>\n    <string name=\"post_text_size_medium\">मध्यम</string>\n    <string name=\"post_text_size_small\">छोटा</string>\n    <string name=\"post_text_size_smallest\">सबसे छोटा</string>\n    <string name=\"post_privacy_unlisted\">असूचीबद्ध</string>\n    <string name=\"post_privacy_public\">सार्वजनिक</string>\n    <string name=\"pref_main_nav_position_option_bottom\">सबसे नीचे</string>\n    <string name=\"pref_main_nav_position_option_top\">ऊपर</string>\n    <string name=\"pref_main_nav_position\">मुख्य नेविगेशन स्थिति</string>\n    <string name=\"pref_failed_to_sync\">सेटिंग्स सिंक करने में विफल</string>\n    <string name=\"pref_default_media_sensitivity\">हमेशा मीडिया को संवेदनशील के रूप में चिह्नित करें</string>\n    <string name=\"pref_default_post_privacy\">डिफ़ॉल्ट पोस्ट गोपनीयता</string>\n    <string name=\"pref_title_show_media_preview\">मीडिया पूर्वावलोकन डाउनलोड करें</string>\n    <string name=\"pref_title_show_replies\">जवाब दिखाएँ</string>\n    <string name=\"pref_title_post_tabs\">टैब्स</string>\n    <string name=\"pref_title_gradient_for_media\">छिपे हुए मीडिया के लिए रंगीन ग्रेडिएंट दिखाएं</string>\n    <string name=\"pref_title_bot_overlay\">बॉट्स के लिए संकेतक दिखाएं</string>\n    <string name=\"pref_title_language\">भाषा</string>\n    <string name=\"pref_title_custom_tabs\">क्रोम कस्टम टैब का उपयोग करें</string>\n    <string name=\"pref_title_browser_settings\">ब्राउज़र</string>\n    <string name=\"app_theme_system\">सिस्टम डिज़ाइन का उपयोग करें</string>\n    <string name=\"app_theme_auto\">सूर्यास्त के समय स्वचालित</string>\n    <string name=\"app_theme_black\">Black</string>\n    <string name=\"app_them_dark\">अंधकार</string>\n    <string name=\"pref_title_timeline_filters\">फिल्टर</string>\n    <string name=\"pref_title_appearance_settings\">दिखावट</string>\n    <string name=\"pref_title_notification_filters\">मुझे सूचित करें जब</string>\n    <string name=\"pref_title_notification_alert_light\">रोशनी के साथ सूचित करें</string>\n    <string name=\"pref_title_notification_alert_vibrate\">कंपन के साथ सूचित करें</string>\n    <string name=\"pref_title_notification_alert_sound\">एक ध्वनि के साथ सूचित करें</string>\n    <string name=\"pref_title_notifications_enabled\">सूचनाएं</string>\n    <string name=\"pref_title_edit_notification_settings\">सूचनाएं</string>\n    <string name=\"visibility_direct\">प्रत्यक्ष: केवल उल्लिखित उपयोगकर्ताओं को पोस्ट करें</string>\n    <string name=\"visibility_private\">केवल फ़ॉलोअर के लिए : केवल फ़ॉलोअर के लिए पोस्ट करें</string>\n    <string name=\"visibility_unlisted\">असूचीबद्ध: सार्वजनिक टाइमलाइन में न दिखाएं</string>\n    <string name=\"visibility_public\">सार्वजनिक: सार्वजनिक टाइमलाइन पर पोस्ट करें</string>\n    <string name=\"dialog_mute_warning\">म्यूट @%1$s?</string>\n    <string name=\"mute_domain_warning_dialog_ok\">संपूर्ण डोमेन छिपाएं</string>\n    <string name=\"dialog_download_image\">डाउनलोड</string>\n    <string name=\"dialog_message_uploading_media\">अपलोड हो रहा है…</string>\n    <string name=\"login_connection\">कनेक्ट कर रहे…</string>\n    <string name=\"label_header\">हैडर</string>\n    <string name=\"label_avatar\">अवतार</string>\n    <string name=\"label_quick_reply\">जवाब दें…</string>\n    <string name=\"search_no_results\">कोई परिणाम नहीं</string>\n    <string name=\"hint_search\">खोज</string>\n    <string name=\"hint_note\">जीवनी</string>\n    <string name=\"hint_display_name\">प्रदर्शित होने वाला नाम</string>\n    <string name=\"hint_content_warning\">विषय वस्तु चेतावनी</string>\n    <string name=\"hint_compose\">क्या हो रहा है?</string>\n    <string name=\"confirmation_reported\">भेज दिया!</string>\n    <string name=\"downloading_media\">मीडिया डाउनलोड हो रहा है</string>\n    <string name=\"download_media\">मीडिया डाउनलोड करें</string>\n    <string name=\"title_links_dialog\">लिंक</string>\n    <string name=\"action_copy_link\">लिंक कॉपी करें</string>\n    <string name=\"action_open_media_n\">मीडिया खोलें #%1$d</string>\n    <string name=\"title_mentions_dialog\">ज़िक्र</string>\n    <string name=\"title_hashtags_dialog\">हैशटैग</string>\n    <string name=\"action_open_faved_by\">पसंदीदा दिखाएँ</string>\n    <string name=\"action_hashtags\">हैशटैग</string>\n    <string name=\"action_mentions\">ज़िक्र</string>\n    <string name=\"action_add_tab\">ऐड टैब</string>\n    <string name=\"action_schedule_post\">अनुसूची टूट</string>\n    <string name=\"action_emoji_keyboard\">इमोजी कीबोर्ड</string>\n    <string name=\"action_content_warning\">विषय वस्तु चेतावनी</string>\n    <string name=\"action_toggle_visibility\">टूट दृश्यता</string>\n    <string name=\"action_access_scheduled_posts\">अनुसूचित टूट</string>\n    <string name=\"action_accept\">स्वीकार करें</string>\n    <string name=\"action_access_drafts\">ड्राफ्ट</string>\n    <string name=\"action_reject\">अस्वीकार करें</string>\n    <string name=\"action_undo\">पूर्ववत करें</string>\n    <string name=\"action_edit_own_profile\">संपादित करें</string>\n    <string name=\"action_save\">सेव</string>\n    <string name=\"action_hide_media\">मीडिया छिपाओ</string>\n    <string name=\"action_mention\">ज़िक्र</string>\n    <string name=\"action_unmute_conversation\">बातचीत को अनम्यूट करें</string>\n    <string name=\"action_unmute_domain\">अनम्यूट %1$s</string>\n    <string name=\"action_unmute\">अनम्यूट</string>\n    <string name=\"action_mute\">म्यूट</string>\n    <string name=\"action_mute_domain\">म्यूट %1$s</string>\n    <string name=\"action_mute_conversation\">बातचीत को म्यूट करें</string>\n    <string name=\"action_share\">शेयर</string>\n    <string name=\"action_photo_take\">फोटो खींचिए</string>\n    <string name=\"action_add_media\">ऐड मीडिया</string>\n    <string name=\"action_open_in_web\">ब्राउज़र में खोलें</string>\n    <string name=\"action_view_media\">मीडिया</string>\n    <string name=\"error_sender_account_gone\">टोट भेजने में त्रुटि।</string>\n    <string name=\"action_bookmark\">बुकमार्क</string>\n    <string name=\"action_reblog\">बढ़ावा दें</string>\n    <string name=\"action_quick_reply\">तुरंत जवाब</string>\n    <string name=\"report_comment_hint\">अतिरिक्त टिप्पणियां?</string>\n    <string name=\"report_username_format\">रिपोर्ट @%1$s</string>\n    <string name=\"notification_favourite_format\">%1$s ने आपके टूट को पसंद किया</string>\n    <string name=\"notification_reblog_format\">%1$s ने आपके टूट को बढावा दिया</string>\n    <string name=\"footer_empty\">यहाँ कुछ नहीं। ताज़ा करने के लिए नीचे खींचो!</string>\n    <string name=\"message_empty\">यहाँ कुछ नहीं।</string>\n    <string name=\"post_content_warning_show_less\">कम दिखाएं</string>\n    <string name=\"post_content_warning_show_more\">और दिखाओ</string>\n    <string name=\"post_sensitive_media_directions\">देखने के लिए क्लिक करें</string>\n    <string name=\"post_media_hidden_title\">मीडिया छिपा हुआ</string>\n    <string name=\"post_sensitive_media_title\">संवेदनशील विषय वस्तु</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"title_licenses\">लाइसेंस</string>\n    <string name=\"title_view_thread\">टूट</string>\n    <string name=\"title_scheduled_posts\">अनुसूचित टूट</string>\n    <string name=\"title_domain_mutes\">छिपे हुए डोमेन</string>\n    <string name=\"title_mutes\">म्यूट किए गए उपयोगकर्ता</string>\n    <string name=\"title_bookmarks\">बुकमार्क</string>\n    <string name=\"title_tab_preferences\">टैब्स</string>\n    <string name=\"title_direct_messages\">सीधे संदेश</string>\n    <string name=\"title_public_federated\">संघीय</string>\n    <string name=\"title_public_local\">स्थानीय</string>\n    <string name=\"title_notifications\">सूचनाएं</string>\n    <string name=\"add_poll_choice\">विकल्प जोड़ें</string>\n    <string name=\"poll_new_choice_hint\">विकल्प %1$d</string>\n    <string name=\"poll_allow_multiple_choices\">कई विकल्प</string>\n    <string name=\"duration_7_days\">7 दिन</string>\n    <string name=\"duration_3_days\">3 दिन</string>\n    <string name=\"duration_1_day\">1 दिन</string>\n    <string name=\"duration_6_hours\">6 घंटे</string>\n    <string name=\"duration_1_hour\">1 घंटा</string>\n    <string name=\"duration_30_min\">30 मिनिट</string>\n    <string name=\"duration_5_min\">5 मिनट</string>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d घंटा शेष</item>\n        <item quantity=\"other\">%1$d घंटे शेष</item>\n    </plurals>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d दिन शेष</item>\n        <item quantity=\"other\">%1$d दिन शेष</item>\n    </plurals>\n    <string name=\"poll_ended_created\">आपके द्वारा बनाया गया एक जनमत समाप्त हो गया है</string>\n    <string name=\"poll_ended_voted\">आपके द्वारा मतदान किया गया जनमत समाप्त हो गया है</string>\n    <string name=\"poll_info_time_absolute\">%1$s समाप्त होगा</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s व्यक्ति</item>\n        <item quantity=\"other\">%1$s लोग</item>\n    </plurals>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s वोट</item>\n        <item quantity=\"other\">%1$s वोट</item>\n    </plurals>\n    <string name=\"hashtags\">हैशटैग</string>\n    <string name=\"poll_info_format\"> <!-- 15 वोट • 1 घंटा बाकी --> %1$s • %2$s</string>\n    <string name=\"list\">सूची</string>\n    <string name=\"description_post_bookmarked\">बुकमार्क किया हुआ</string>\n    <string name=\"hint_list_name\">सूची का नाम</string>\n    <string name=\"description_post_media_no_description_placeholder\">कोई विवरण नहीं</string>\n    <string name=\"description_post_media\">मीडिया: %1$s</string>\n    <string name=\"profile_metadata_add\">जानकारी जोड़ें</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"profile_metadata_label\">प्रोफ़ाइल मेटाडेटा</string>\n    <string name=\"download_failed\">डाउनलोड विफल</string>\n    <string name=\"action_open_post\">टूट खोलें</string>\n    <string name=\"performing_lookup_title\">देखने की क्रिया जारी…</string>\n    <string name=\"system_default\">सिस्टम डिफ़ॉल्ट</string>\n    <string name=\"emoji_style\">इमोजी का अंदाज</string>\n    <string name=\"send_post_notification_cancel_title\">भेजना रद्द हो गया</string>\n    <string name=\"send_post_notification_channel_name\">टूट भेज रहे</string>\n    <string name=\"send_post_notification_title\">टूट भेज रहे…</string>\n    <string name=\"compose_save_draft\">लिखने को सुरक्षित करें?</string>\n    <string name=\"lock_account_label\">खाता लॉक करें</string>\n    <string name=\"action_set_caption\">कैप्शन सेट करें</string>\n    <string name=\"add_account_name\">खाता जोड़ो</string>\n    <string name=\"filter_dialog_whole_word\">पूरा शब्द</string>\n    <string name=\"filter_edit_title\">फ़िल्टर संपादित करें</string>\n    <string name=\"filter_addition_title\">फिल्टर लगाएं</string>\n    <string name=\"pref_title_public_filter_keywords\">सार्वजनिक टाइमलाइन</string>\n    <string name=\"load_more_placeholder_text\">और लोड करें</string>\n    <string name=\"pref_title_show_cards_in_timelines\">टाइमलाइन में लिंक प्रीव्यू दिखाएं</string>\n    <string name=\"warning_scheduling_interval\">मास्टोडन का न्यूनतम शेड्यूलिंग अंतराल 5 मिनट है।</string>\n    <string name=\"no_drafts\">आपके पास कोई ड्राफ्ट नहीं है।</string>\n    <string name=\"post_lookup_error_format\">%1$s पोस्ट खोजने में त्रुटि</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">टैब के बीच स्विच करने के लिए स्वाइप जेस्चर को सक्षम करें</string>\n    <string name=\"failed_search\">खोज करने में विफल</string>\n    <string name=\"report_description_remote_instance\">खाता किसी अन्य सर्वर से है। रिपोर्ट की अनाम प्रति वहां भी भेजें?</string>\n    <string name=\"report_description_1\">रिपोर्ट आपके सर्वर मॉडरेटर को भेजी जाएगी। आप इस बारे में स्पष्टीकरण दे सकते हैं कि आप इस खाते को रिपोर्ट क्यों कर रहे हैं:</string>\n    <string name=\"failed_report\">रिपोर्ट करने में विफल</string>\n    <string name=\"report_remote_instance\">%1$s को आगे भेजें</string>\n    <string name=\"hint_additional_info\">अतिरिक्त टिप्पणियां</string>\n    <string name=\"report_sent_success\">\\@%1$s सफलतापूर्वक रिपोर्ट किए गए</string>\n    <string name=\"compose_preview_image_description\">तस्वीरों के लिए क्रिया %1$s</string>\n    <string name=\"notification_clear_text\">क्या आप अपनी सभी सूचनाओं को स्थायी रूप से साफ़ करना चाहते हैं?</string>\n    <string name=\"compose_shortcut_long_label\">टूट लिखें</string>\n    <string name=\"filter_apply\">लागू करें</string>\n    <string name=\"notifications_apply_filter\">फ़िल्टर</string>\n    <string name=\"notifications_clear\">साफ करें</string>\n    <string name=\"select_list_title\">सूची का चयन करें</string>\n    <string name=\"add_hashtag_title\">हैशटैग जोड़ें</string>\n    <string name=\"description_visibility_direct\">प्रत्यक्ष</string>\n    <string name=\"description_visibility_unlisted\">असूचीबद्ध</string>\n    <string name=\"description_visibility_public\">सार्वजनिक</string>\n    <string name=\"description_post_cw\">विषय वस्तु चेतावनी: %1$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s तथा %3$d अन्य लोग</string>\n    <string name=\"conversation_2_recipients\">%1$s तथा %2$s</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> ने बढ़ावा दिया</item>\n        <item quantity=\"other\"><b>%1$s</b> ने बढ़ावा दिया</item>\n    </plurals>\n    <string name=\"pin_action\">पिन</string>\n    <string name=\"unpin_action\">अनपिन</string>\n    <string name=\"label_remote_account\">नीचे दी गई जानकारी उपयोगकर्ता की प्रोफ़ाइल को अपूर्ण रूप से दर्शा सकती है। ब्राउज़र में पूर्ण प्रोफ़ाइल खोलने के लिए यहां दबाएं।</string>\n    <string name=\"pref_title_absolute_time\">पूर्ण समय का उपयोग करें</string>\n    <string name=\"profile_metadata_content_label\">विषय वस्तु</string>\n    <string name=\"profile_metadata_label_label\">लेबल</string>\n    <string name=\"license_apache_2\">अपाचे लाइसेंस के तहत लाइसेंस प्राप्त (प्रतिलिपि नीचे उपलब्ध)</string>\n    <string name=\"account_moved_description\">%1$s यहां चले गए हैं:</string>\n    <string name=\"profile_badge_bot_text\">बोट</string>\n    <string name=\"caption_notoemoji\">गूगल का इमोजी सेट</string>\n    <string name=\"caption_twemoji\">मास्टोडन का मानक इमोजी सेट</string>\n    <string name=\"caption_systememoji\">आपके डिवाइस का डिफ़ॉल्ट इमोजी सेट</string>\n    <string name=\"restart\">पुनः आरंभ करें</string>\n    <string name=\"later\">बाद में</string>\n    <string name=\"restart_required\">एप्लिकेशन को पुनः आरंभ की आवश्यकता है</string>\n    <string name=\"download_fonts\">आपको पहले इस इमोजी सेट को डाउनलोड करना होगा</string>\n    <string name=\"action_compose_shortcut\">लिखें</string>\n    <string name=\"send_post_notification_saved_content\">टूट की एक प्रति आपके ड्राफ्ट में सहेज ली गई है</string>\n    <string name=\"send_post_notification_error_title\">टूट भेजने में त्रुटि</string>\n    <string name=\"filter_dialog_remove_button\">हटाएँ</string>\n    <string name=\"action_remove\">हटा दें</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\"/>\n        <item quantity=\"other\">दृष्टिहीन लोगों के लिए वर्णन करें\n\\n(%1$d वर्ण सीमा)</item>\n    </plurals>\n    <string name=\"compose_active_account_description\">%1$s खाते के साथ पोस्ट कर रहे</string>\n    <string name=\"action_remove_from_list\">सूची से खाता निकालें</string>\n    <string name=\"action_add_to_list\">सूची में खाता जोड़ें</string>\n    <string name=\"hint_search_people_list\">उन लोगों की खोज करें जिन्हें आप फ़ॉलो करते हैं</string>\n    <string name=\"action_delete_list\">सूची हटाएँ</string>\n    <string name=\"action_rename_list\">सूची का नाम बदलें</string>\n    <string name=\"action_create_list\">एक सूची बनाएं</string>\n    <string name=\"error_delete_list\">सूची नहीं हटाई जा सकी</string>\n    <string name=\"error_rename_list\">सूची का नाम नहीं बदल सके</string>\n    <string name=\"error_create_list\">सूची नहीं बना सके</string>\n    <string name=\"add_account_description\">नया मास्टोडन खाता जोड़ें</string>\n    <string name=\"filter_add_description\">फ़िल्टर करने के लिए वाक्यांश</string>\n    <string name=\"filter_dialog_whole_word_description\">जब संकेत शब्द या वाक्यांश केवल अल्फ़ान्यूमेरिक होता है, तो यह केवल तभी लागू होगा जब यह पूरे शब्द से मेल खाता होगा</string>\n    <string name=\"filter_dialog_update_button\">अपडेट करें</string>\n    <string name=\"pref_title_thread_filter_keywords\">संवाद</string>\n    <string name=\"replying_to\">\\@%1$s को जवाब दे रहे है</string>\n    <string name=\"title_media\">मीडिया</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">संवेदनशील विषय वस्तु</string>\n    <string name=\"follows_you\">आपको फॉलो करते है</string>\n    <string name=\"state_follow_requested\">फ़ॉलो करने का अनुरोध किया हुआ</string>\n    <string name=\"post_media_video\">वीडियो</string>\n    <string name=\"post_media_images\">तस्वीरें</string>\n    <string name=\"post_share_link\">टूट का लिंक साझा करें</string>\n    <string name=\"post_share_content\">टूट की विषय वस्तु साझा करें</string>\n    <string name=\"notification_mention_format\">%1$s ने आपका जिक्र किया</string>\n    <string name=\"notification_poll_description\">जनमत खत्म होने के बारे में सूचनाएं</string>\n    <string name=\"notification_favourite_description\">सूचनाएं जब आपके टूट पसंद किये जाये</string>\n    <string name=\"notification_follow_request_description\">फ़ॉलो अनुरोध के बारे में सूचनाएं</string>\n    <string name=\"notification_follow_request_name\">फ़ॉलो अनुरोध</string>\n    <string name=\"notification_mention_descriptions\">नए ज़िक्र के बारे में सूचनाएं</string>\n    <string name=\"notification_mention_name\">नए ज़िक्र</string>\n    <string name=\"pref_publishing\">प्रकाशित कर रहे हैं (सर्वे के साथ समन्वयित)</string>\n    <string name=\"pref_title_http_proxy_port\">एच टी टी पी प्रॉक्सी पोर्ट</string>\n    <string name=\"pref_title_http_proxy_server\">एच टी टी पी प्रॉक्सी सर्वर</string>\n    <string name=\"pref_title_http_proxy_enable\">एच टी टी पी प्रॉक्सी सक्षम करें</string>\n    <string name=\"pref_title_http_proxy_settings\">एच टी टी पी प्रॉक्सी</string>\n    <string name=\"pref_title_proxy_settings\">प्रॉक्सी</string>\n    <string name=\"pref_title_post_filter\">टाइमलाइन छानने का काम</string>\n    <string name=\"app_theme_light\">प्रकाश</string>\n    <string name=\"pref_title_timelines\">टाइमलाइन</string>\n    <string name=\"pref_title_app_theme\">एप्लिकेशन थीम</string>\n    <string name=\"pref_title_notification_alerts\">सूचनाएं</string>\n    <string name=\"dialog_mute_hide_notifications\">सूचनाएं छिपाएं</string>\n    <string name=\"dialog_block_warning\">ब्लॉक @%1$s?</string>\n    <string name=\"dialog_title_finishing_media_upload\">मीडिया अपलोड समाप्त हो रहा</string>\n    <string name=\"confirmation_unmuted\">उपयोगकर्ता अनम्यूट किए गए</string>\n    <string name=\"confirmation_unblocked\">उपयोगकर्ता अनब्लॉक किए गए</string>\n    <string name=\"send_media_to\">मीडिया को साझा करें …</string>\n    <string name=\"send_post_content_to\">टूट को साझा करें …</string>\n    <string name=\"send_post_link_to\">टूट यूआरएल को साझा करें …</string>\n    <string name=\"action_share_as\">साझा करें …</string>\n    <string name=\"action_open_as\">%1$s के रूप में खोलें</string>\n    <string name=\"download_image\">%1$s डाउनलोड हो रहा है</string>\n    <string name=\"action_links\">लिंक</string>\n    <string name=\"action_unmute_desc\">अनम्यूट %1$s</string>\n    <string name=\"action_view_domain_mutes\">छिपे हुए डोमेन</string>\n    <string name=\"action_view_blocks\">रोके गए उपयोगकर्ता</string>\n    <string name=\"action_view_mutes\">म्यूट किए गए उपयोगकर्ता</string>\n    <string name=\"action_view_favourites\">पसंदीदा</string>\n    <string name=\"action_logout_confirm\">क्या आप %1$s खाते से लॉग आउट करना चाहते हैं?</string>\n    <string name=\"action_compose\">लिखें</string>\n    <string name=\"action_unfavourite\">नापसन्द</string>\n    <string name=\"action_favourite\">पसंद</string>\n    <string name=\"title_edit_profile\">अपनी प्रोफाइल एडिट करें</string>\n    <string name=\"title_follow_requests\">फ़ॉलो अनुरोध</string>\n    <string name=\"title_blocks\">रोके गए उपयोगकर्ता</string>\n    <string name=\"notification_follow_description\">नए फ़ॉलोअर की सूचनाएं</string>\n    <string name=\"notification_follow_name\">नए फ़ॉलोअर</string>\n    <string name=\"post_privacy_followers_only\">केवल फ़ॉलोअर के लिए</string>\n    <string name=\"dialog_unfollow_warning\">इस खाते को अनफ़ॉलो करें?</string>\n    <string name=\"dialog_message_cancel_follow_request\">फ़ॉलो अनुरोध को रद्द करें?</string>\n    <string name=\"action_view_follow_requests\">फ़ॉलो अनुरोध</string>\n    <string name=\"notification_follow_request_format\">%1$s ने आपको फ़ॉलो करने का अनुरोध किया</string>\n    <string name=\"notification_follow_format\">%1$s ने आपको फ़ॉलो किया</string>\n    <string name=\"pref_title_show_boosts\">बूस्ट दिखाएं</string>\n    <string name=\"action_open_reblogged_by\">बूस्ट दिखाएं</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> ने पसंद किया</item>\n        <item quantity=\"other\"><b>%1$s</b> ने पसंद किया</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d सेकेंड शेष</item>\n        <item quantity=\"other\">%1$d सेकेंड शेष</item>\n    </plurals>\n    <string name=\"error_compose_character_limit\">पोस्ट बहुत लंबा है!</string>\n    <string name=\"error_failed_app_registration\">उस सर्वर से प्रमाणित करने में विफल।</string>\n    <string name=\"error_multimedia_size_limit\">वीडियो और ऑडियो फ़ाइलों का आकार %1$s एमबी से अधिक नहीं हो सकता है।</string>\n    <string name=\"error_image_edit_failed\">फोटो संपादित नहीं किया जा सका।</string>\n    <string name=\"error_media_upload_image_or_video\">फोटो और वीडियो दोनों को एक ही पोस्ट से अटैच नहीं किया जा सकता है।</string>\n    <string name=\"error_loading_account_details\">खाता विवरण लोड करने में विफल रहा</string>\n    <string name=\"error_could_not_load_login_page\">लॉगिन पेज लोड नहीं किया जा सका।</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-hu/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">Hiba történt.</string>\n    <string name=\"error_network\">Hálózati hiba történt. Kérjük, ellenőrizd a kapcsolatot, és próbáld meg újra.</string>\n    <string name=\"error_empty\">Ez nem lehet üres.</string>\n    <string name=\"error_invalid_domain\">Helytelen domain</string>\n    <string name=\"error_failed_app_registration\">Sikertelen hitelesítés ezen a példányon. Ha ez továbbra is fennáll, próbáld a Bejelentkezés Böngészőben opciót a menüben.</string>\n    <string name=\"error_no_web_browser_found\">Nem található használható böngésző.</string>\n    <string name=\"error_authorization_unknown\">Azonosítatlan hitelesítési hiba történt. Ha ez továbbra is fennáll, próbáld a Bejelentkezés Böngészőben opciót a menüben.</string>\n    <string name=\"error_authorization_denied\">Engedély megtagadva. Ha biztos vagy benne, hogy a megfelelő hitelesítési adatokat adtad meg, próbáld a Bejelentkezés Böngészőben funkciót a menüben.</string>\n    <string name=\"error_retrieving_oauth_token\">Bejelentkezési token megszerzése sikertelen. Ha ez továbbra is fennáll, próbáld a Bejelentkezés Böngészőben opciót a menüben.</string>\n    <string name=\"error_compose_character_limit\">Túl hosszú a bejegyzés!</string>\n    <string name=\"error_media_upload_type\">Ilyen típusú fájlt nem lehet feltölteni.</string>\n    <string name=\"error_media_upload_opening\">Fájl megnyitása sikertelen.</string>\n    <string name=\"error_media_upload_permission\">Média olvasási engedély szükséges.</string>\n    <string name=\"error_media_download_permission\">Média tárolási engedély szükséges.</string>\n    <string name=\"error_media_upload_image_or_video\">Képek és videók egyszerre nem csatolhatóak ugyanazon bejegyzéshez.</string>\n    <string name=\"error_media_upload_sending\">Feltöltés sikertelen.</string>\n    <string name=\"error_sender_account_gone\">Nem sikerült elküldeni a bejegyzést.</string>\n    <string name=\"title_home\">Kezdőlap</string>\n    <string name=\"title_notifications\">Értesítések</string>\n    <string name=\"title_public_local\">Helyi</string>\n    <string name=\"title_public_federated\">Föderációs</string>\n    <string name=\"title_direct_messages\">Közvetlen üzenetek</string>\n    <string name=\"title_tab_preferences\">Lapok</string>\n    <string name=\"title_view_thread\">Szál</string>\n    <string name=\"title_posts\">Bejegyzések</string>\n    <string name=\"title_posts_with_replies\">Válaszokkal</string>\n    <string name=\"title_posts_pinned\">Kitűzött</string>\n    <string name=\"title_follows\">Követett</string>\n    <string name=\"title_followers\">Követő</string>\n    <string name=\"title_favourites\">Kedvencek</string>\n    <string name=\"title_mutes\">Némított felhasználók</string>\n    <string name=\"title_blocks\">Letiltott felhasználók</string>\n    <string name=\"title_follow_requests\">Követési kérelmek</string>\n    <string name=\"title_edit_profile\">Profilod szerkesztése</string>\n    <string name=\"title_drafts\">Piszkozatok</string>\n    <string name=\"title_licenses\">Licenszek</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s megtolta</string>\n    <string name=\"post_sensitive_media_title\">Érzékeny tartalom</string>\n    <string name=\"post_media_hidden_title\">Rejtett média</string>\n    <string name=\"post_sensitive_media_directions\">Kattints a megtekintéshez</string>\n    <string name=\"post_content_warning_show_more\">Több megjelenítése</string>\n    <string name=\"post_content_warning_show_less\">Kevesebb megjelenítése</string>\n    <string name=\"post_content_show_more\">Kibontás</string>\n    <string name=\"post_content_show_less\">Összecsukás</string>\n    <string name=\"message_empty\">Nincs itt semmi.</string>\n    <string name=\"footer_empty\">Üres tartalom. Húzd le a frissítéshez!</string>\n    <string name=\"notification_reblog_format\">%1$s megtolta a bejegyzésedet</string>\n    <string name=\"notification_favourite_format\">%1$s kedvencnek jelölte a bejegyzésedet</string>\n    <string name=\"notification_follow_format\">%1$s bekövetett</string>\n    <string name=\"report_username_format\">\\@%1$s jelentése</string>\n    <string name=\"report_comment_hint\">Egyéb megjegyzés?</string>\n    <string name=\"action_quick_reply\">Gyors válasz</string>\n    <string name=\"action_reply\">Válasz</string>\n    <string name=\"action_reblog\">Megtolás</string>\n    <string name=\"action_favourite\">Kedvencnek jelölés</string>\n    <string name=\"action_more\">Több</string>\n    <string name=\"action_compose\">Szerkesztés</string>\n    <string name=\"action_login\">Bejelentkezés Tuskyval</string>\n    <string name=\"action_logout\">Kijelentkezés</string>\n    <string name=\"action_logout_confirm\">Biztosan ki szeretnél jelentkezni a következőből: %1$s? A fiók minden helyi adata vázlatokkal és beállításokkal együtt törlődni fog.</string>\n    <string name=\"action_follow\">Követés</string>\n    <string name=\"action_unfollow\">Követés vége</string>\n    <string name=\"action_block\">Letiltás</string>\n    <string name=\"action_unblock\">Letiltás feloldása</string>\n    <string name=\"action_hide_reblogs\">Megtolások elrejtése</string>\n    <string name=\"action_show_reblogs\">Megtolások megjelenítése</string>\n    <string name=\"action_report\">Bejelentés</string>\n    <string name=\"action_delete\">Törlés</string>\n    <string name=\"action_send\">TÜLK</string>\n    <string name=\"action_send_public\">TÜLK!</string>\n    <string name=\"action_retry\">Próbáld újra</string>\n    <string name=\"action_close\">Bezárás</string>\n    <string name=\"action_view_profile\">Profil</string>\n    <string name=\"action_view_preferences\">Beállítások</string>\n    <string name=\"action_view_account_preferences\">Fiókbeállítások</string>\n    <string name=\"action_view_favourites\">Kedvencek</string>\n    <string name=\"action_view_mutes\">Némított felhasználók</string>\n    <string name=\"action_view_blocks\">Letiltott felhasználók</string>\n    <string name=\"action_view_follow_requests\">Követési kérelmek</string>\n    <string name=\"action_view_media\">Média</string>\n    <string name=\"action_open_in_web\">Megnyitás böngészőben</string>\n    <string name=\"action_add_media\">Média csatolása</string>\n    <string name=\"action_photo_take\">Kép készítése</string>\n    <string name=\"action_share\">Megosztás</string>\n    <string name=\"action_mute\">Némítás</string>\n    <string name=\"action_unmute\">Némítás feloldása</string>\n    <string name=\"action_mention\">Megemlítés</string>\n    <string name=\"action_hide_media\">Média elrejtése</string>\n    <string name=\"action_open_drawer\">Menü megnyitása</string>\n    <string name=\"action_save\">Mentés</string>\n    <string name=\"action_edit_profile\">Profil szerkesztése</string>\n    <string name=\"action_edit_own_profile\">Szerkesztés</string>\n    <string name=\"action_undo\">Visszavonás</string>\n    <string name=\"action_accept\">Elfogadás</string>\n    <string name=\"action_reject\">Elutasítás</string>\n    <string name=\"action_search\">Keresés</string>\n    <string name=\"action_access_drafts\">Piszkozatok</string>\n    <string name=\"action_toggle_visibility\">Bejegyzés láthatósága</string>\n    <string name=\"action_content_warning\">Tartalom figyelmeztetés</string>\n    <string name=\"action_emoji_keyboard\">Emodzsi billentyűzet</string>\n    <string name=\"action_add_tab\">Fül hozzáadása</string>\n    <string name=\"action_links\">Hivatkozások</string>\n    <string name=\"action_mentions\">Említések</string>\n    <string name=\"action_hashtags\">Hashtagek</string>\n    <string name=\"action_open_faved_by\">Kedvencek megjelenítése</string>\n    <string name=\"title_hashtags_dialog\">Hashtagek</string>\n    <string name=\"title_mentions_dialog\">Említések</string>\n    <string name=\"title_links_dialog\">Hivatkozások</string>\n    <string name=\"download_image\">%1$s letöltése</string>\n    <string name=\"action_copy_link\">Hivatkozás másolása</string>\n    <string name=\"action_open_as\">Megnyitás mint %1$s</string>\n    <string name=\"action_share_as\">Megosztás mint …</string>\n    <string name=\"send_post_link_to\">Bejegyzés webcímének megosztása…</string>\n    <string name=\"send_post_content_to\">Bejegyzés megosztása…</string>\n    <string name=\"confirmation_reported\">Elküldve!</string>\n    <string name=\"confirmation_unblocked\">Felhasználó letiltása feloldva</string>\n    <string name=\"confirmation_unmuted\">Felhasználó némítása feloldva</string>\n    <string name=\"hint_domain\">Melyik példány?</string>\n    <string name=\"hint_compose\">Mi jár a fejedben?</string>\n    <string name=\"hint_content_warning\">Tartalom figyelmeztetés</string>\n    <string name=\"hint_display_name\">Megjelenítési név</string>\n    <string name=\"hint_note\">Bemutatkozás</string>\n    <string name=\"hint_search\">Keresés…</string>\n    <string name=\"search_no_results\">Nincs találat</string>\n    <string name=\"label_quick_reply\">Válasz…</string>\n    <string name=\"label_avatar\">Profilkép</string>\n    <string name=\"label_header\">Fejléc</string>\n    <string name=\"link_whats_an_instance\">Mi az a példány?</string>\n    <string name=\"login_connection\">Csatlakozás…</string>\n    <string name=\"dialog_whats_an_instance\">Bármely példány címét vagy domain nevét beírhatod ide, mint a mastodon.social, az icosahedron.website, a social.tchncs.de és <a href=\"https://instances.social\">mások!</a> \\u0020 \n\\n \\u0020 \n\\nHa még nincs fiókod, beírhatod annak a példánynak a címét, amelyhez csatlakoznál, majd azon létrehozhatsz egy fiókot. \\u0020 \n\\n \\u0020 \n\\nA példány az a hely, ahol a fiókadataidat tárolják, de ettől még ugyanúgy kommunikálhatsz más példányokon lévő emberekkel, mintha ugyanazon az oldalon lennétek. \\u0020 \n\\n \\u0020 \n\\nTöbb információt találhatsz itt: <a href=\"https://joinmastodon.org\">joinmastodon.org</a>. \\u0020</string>\n    <string name=\"dialog_title_finishing_media_upload\">Média feltöltés befejezése</string>\n    <string name=\"dialog_message_uploading_media\">Feltöltés…</string>\n    <string name=\"dialog_download_image\">Letöltés</string>\n    <string name=\"dialog_message_cancel_follow_request\">Visszavonod a követési kérelmet?</string>\n    <string name=\"dialog_unfollow_warning\">Követés megszüntetése?</string>\n    <string name=\"dialog_delete_post_warning\">Törlöd ezt a bejegyzést?</string>\n    <string name=\"visibility_public\">Nyilvános: Bejegyzés nyilvános idővonalra</string>\n    <string name=\"visibility_unlisted\">Listázatlan: Nem jelenik meg a nyilvános idővonalon</string>\n    <string name=\"visibility_private\">Csak követőknek: Bejegyzés csak követőknek</string>\n    <string name=\"visibility_direct\">Közvetlen: Bejegyzés csak a megemlített felhasználóknak</string>\n    <string name=\"pref_title_edit_notification_settings\">Értesítések</string>\n    <string name=\"pref_title_notifications_enabled\">Értesítések</string>\n    <string name=\"pref_title_notification_alerts\">Figyelmeztetések</string>\n    <string name=\"pref_title_notification_alert_sound\">Értesítés hanggal</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Értesítés rezgéssel</string>\n    <string name=\"pref_title_notification_alert_light\">Értesítés fénnyel</string>\n    <string name=\"pref_title_notification_filters\">Értesítsen, ha</string>\n    <string name=\"pref_title_appearance_settings\">Megjelenés</string>\n    <string name=\"pref_title_timelines\">Idővonalak</string>\n    <string name=\"app_them_dark\">Sötét</string>\n    <string name=\"app_theme_light\">Világos</string>\n    <string name=\"app_theme_black\">Fekete</string>\n    <string name=\"app_theme_auto\">Automatikus naplementekor</string>\n    <string name=\"pref_title_browser_settings\">Böngésző</string>\n    <string name=\"pref_title_custom_tabs\">Hivatkozások megnyitása az alkalmazáson belül</string>\n    <string name=\"pref_title_post_filter\">Idővonal szűrése</string>\n    <string name=\"pref_title_post_tabs\">Saját idővonal</string>\n    <string name=\"pref_title_show_boosts\">Megtolások megjelenítése</string>\n    <string name=\"pref_title_show_replies\">Válaszok megjelenítése</string>\n    <string name=\"pref_title_show_media_preview\">Médiaelőnézet megjelenítése</string>\n    <string name=\"pref_title_proxy_settings\">Proxy</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP proxy</string>\n    <string name=\"pref_title_http_proxy_enable\">HTTP proxy engedélyezése</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP proxy szerver</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP Proxy port</string>\n    <string name=\"pref_default_post_privacy\">Bejegyzések láthatósága (a kiszolgálóval szinkronizálva)</string>\n    <string name=\"pref_default_media_sensitivity\">Minden média kényesnek jelölése (a kiszolgálóval szinkronizálva)</string>\n    <string name=\"pref_failed_to_sync\">A beállítások szinkronizálása nem sikerült</string>\n    <string name=\"post_privacy_public\">Nyilvános</string>\n    <string name=\"post_privacy_unlisted\">Listázatlan</string>\n    <string name=\"post_privacy_followers_only\">Csak követőknek</string>\n    <string name=\"pref_post_text_size\">Bejegyzés szövegének mérete</string>\n    <string name=\"post_text_size_smallest\">Legkisebb</string>\n    <string name=\"post_text_size_small\">Kicsi</string>\n    <string name=\"post_text_size_medium\">Közepes</string>\n    <string name=\"post_text_size_large\">Nagy</string>\n    <string name=\"post_text_size_largest\">Legnagyobb</string>\n    <string name=\"notification_mention_name\">Új említések</string>\n    <string name=\"notification_mention_descriptions\">Értesítések új említések esetén</string>\n    <string name=\"notification_follow_name\">Új követők</string>\n    <string name=\"notification_follow_description\">Értesítések új követőkről</string>\n    <string name=\"notification_boost_name\">Megtolások</string>\n    <string name=\"notification_boost_description\">Értesítések a bejegyzéseid megtolásáról</string>\n    <string name=\"notification_favourite_name\">Kedvencek</string>\n    <string name=\"notification_favourite_description\">Értesítések a bejegyzéseid kedvencnek jelöléséről</string>\n    <string name=\"notification_mention_format\">%1$s megemlített téged</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s és még %4$d</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s meg %3$s</string>\n    <string name=\"notification_summary_small\">%1$s és %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d új interakció</item>\n        <item quantity=\"other\">%1$d új interakció</item>\n    </plurals>\n    <string name=\"description_account_locked\">Zárolt fiók</string>\n    <string name=\"about_title_activity\">Rólunk</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">Projekt honlapja: https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Hibajelentés &amp; új funkciók igénylése:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Tusky profilja</string>\n    <string name=\"post_share_content\">Bejegyzés tartalmának megosztása</string>\n    <string name=\"post_share_link\">Bejegyzés hivatkozásának megosztása</string>\n    <string name=\"post_media_images\">Képek</string>\n    <string name=\"post_media_video\">Videó</string>\n    <string name=\"state_follow_requested\">Követés kérelmezve</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"follows_you\">Követ téged</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Mindig mutassa a kényes tartalmat</string>\n    <string name=\"title_media\">Média</string>\n    <string name=\"load_more_placeholder_text\">Több betöltése</string>\n    <string name=\"add_account_name\">Fiók hozzáadása</string>\n    <string name=\"add_account_description\">Új Mastodon-fiók hozzáadása</string>\n    <string name=\"action_lists\">Listák</string>\n    <string name=\"title_lists\">Listák</string>\n    <string name=\"action_remove\">Törlés</string>\n    <string name=\"lock_account_label\">Fiók zárolása</string>\n    <string name=\"compose_save_draft\">Elmented a piszkozatot?</string>\n    <string name=\"send_post_notification_title\">Bejegyzés küldése…</string>\n    <string name=\"send_post_notification_error_title\">A bejegyzés elküldése sikertelen</string>\n    <string name=\"send_post_notification_channel_name\">Bejegyzések elküldése</string>\n    <string name=\"send_post_notification_cancel_title\">Küldés megszakítva</string>\n    <string name=\"send_post_notification_saved_content\">A bejegyzés másolatát elmentettük a piszkozataid közé</string>\n    <string name=\"action_compose_shortcut\">Szerkesztés</string>\n    <string name=\"error_no_custom_emojis\">A(z) %1$s példánynak nincsenek egyéni emodzsijai</string>\n    <string name=\"emoji_style\">Emodzsik stílusa</string>\n    <string name=\"system_default\">Rendszer alapértelmezése</string>\n    <string name=\"download_fonts\">Először le kell töltened ezeket az emodzsikészleteket</string>\n    <string name=\"performing_lookup_title\">Keresés…</string>\n    <string name=\"action_open_post\">Bejegyzés megnyitása</string>\n    <string name=\"restart_required\">Az app újraindítása szükséges</string>\n    <string name=\"restart_emoji\">A beállítások érvényesítéséhez újra kell indítani a Tuskyt</string>\n    <string name=\"later\">Később</string>\n    <string name=\"restart\">Újraindítás</string>\n    <string name=\"caption_systememoji\">Az eszközöd alapértelmezett emodzsikészlete</string>\n    <string name=\"caption_blobmoji\">Az Android 4.4–7.1 Blob emodzsijai</string>\n    <string name=\"caption_twemoji\">A Mastodon alapértelmezett emodzsikészlete</string>\n    <string name=\"download_failed\">Letöltés sikertelen</string>\n    <string name=\"profile_badge_bot_text\">Bot</string>\n    <string name=\"account_moved_description\">%1$s elköltözött:</string>\n    <string name=\"license_description\">A Tusky a következő nyílt forráskódú projektekből tartalmaz programkódot és más elemeket:</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">Profil metaadatok</string>\n    <string name=\"profile_metadata_add\">adatok hozzáadása</string>\n    <string name=\"profile_metadata_label_label\">Címke</string>\n    <string name=\"profile_metadata_content_label\">Tartalom</string>\n    <string name=\"pref_title_absolute_time\">Abszolút idő használata</string>\n    <string name=\"label_remote_account\">Az alábbi felhasználói profil adatok hiányosak lehetnek. Kattints ide a teljes profil böngészőben való megnyitásához.</string>\n    <string name=\"title_reblogged_by\">Megtolta</string>\n    <string name=\"title_favourited_by\">Kedvencnek jelölte</string>\n    <string name=\"conversation_2_recipients\">%1$s és %2$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Nincs leírás</string>\n    <string name=\"description_visibility_public\">Nyilvános</string>\n    <string name=\"description_visibility_private\">Követők</string>\n    <string name=\"action_unfavourite\">Kedvenc eltávolítása</string>\n    <string name=\"action_delete_and_redraft\">Törlés és újrafogalmazás</string>\n    <string name=\"action_open_media_n\">Média megnyitása: #%1$d</string>\n    <string name=\"download_media\">Média letöltése</string>\n    <string name=\"downloading_media\">Média letöltése</string>\n    <string name=\"send_media_to\">Média megosztása következővel…</string>\n    <string name=\"dialog_redraft_post_warning\">Törlöd és újraírod ezt a bejegyzést?</string>\n    <string name=\"pref_title_timeline_filters\">Szűrők</string>\n    <string name=\"app_theme_system\">Rendszer téma használata</string>\n    <string name=\"pref_title_language\">Nyelv</string>\n    <string name=\"pref_publishing\">Közzététel alapértelmezései</string>\n    <string name=\"notification_poll_name\">Szavazások</string>\n    <string name=\"notification_poll_description\">Értesítés a befejezett szavazásokról</string>\n    <string name=\"about_tusky_license\">Tusky ingyenes és nyílt forráskódú szoftver. A GNU General Public License Version 3 érvényes rá, amit itt tekinthetsz meg: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <string name=\"abbreviated_in_years\">%1$d é múlva</string>\n    <string name=\"abbreviated_in_days\">%1$d n múlva</string>\n    <string name=\"abbreviated_in_hours\">%1$d ó múlva</string>\n    <string name=\"abbreviated_in_minutes\">%1$d p múlva</string>\n    <string name=\"abbreviated_years_ago\">%1$d é</string>\n    <string name=\"abbreviated_days_ago\">%1$d n</string>\n    <string name=\"abbreviated_hours_ago\">%1$d ó</string>\n    <string name=\"abbreviated_minutes_ago\">%1$d p</string>\n    <string name=\"abbreviated_seconds_ago\">%1$d mp</string>\n    <string name=\"replying_to\">Válasz @%1$s részére</string>\n    <string name=\"pref_title_public_filter_keywords\">Nyilvános idővonalak</string>\n    <string name=\"pref_title_thread_filter_keywords\">Beszélgetések</string>\n    <string name=\"filter_addition_title\">Szűrő hozzáadása</string>\n    <string name=\"filter_edit_title\">Szűrő szerkesztése</string>\n    <string name=\"filter_dialog_remove_button\">Eltávolítás</string>\n    <string name=\"filter_dialog_update_button\">Frissítés</string>\n    <string name=\"filter_add_description\">Szűrendő kifejezés</string>\n    <string name=\"error_create_list\">Nem sikerült a lista létrehozása</string>\n    <string name=\"error_rename_list\">Nem sikerült a lista frissítése</string>\n    <string name=\"error_delete_list\">Nem sikerült a lista törlése</string>\n    <string name=\"action_create_list\">Lista létrehozása</string>\n    <string name=\"action_rename_list\">Lista frissítése</string>\n    <string name=\"action_delete_list\">Lista törlése</string>\n    <string name=\"title_domain_mutes\">Rejtett domainek</string>\n    <string name=\"action_unreblog\">Megtolás visszavonása</string>\n    <string name=\"action_view_domain_mutes\">Rejtett domainek</string>\n    <string name=\"action_mute_domain\">%1$s némítása</string>\n    <string name=\"action_open_reblogger\">Megtolás szerkesztő megnyitása</string>\n    <string name=\"action_open_reblogged_by\">Megtolások megjelenítése</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s elrejtése feloldva</string>\n    <string name=\"mute_domain_warning\">Biztos, hogy az egész %1$s domaint le akarod tiltani? Egyetlen nyilvános idővonalon sem fogsz látni semmilyen tartalmat vagy értesítést innen. Az ebből a domainből származó követőidet el fogjuk távolítani.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Teljes domain elrejtése</string>\n    <string name=\"pref_title_app_theme\">Alkalmazástéma</string>\n    <string name=\"pref_title_bot_overlay\">Botok jelölőjének megjelenítése</string>\n    <string name=\"pref_title_animate_gif_avatars\">GIF profilképek animálása</string>\n    <string name=\"abbreviated_in_seconds\">%1$d mp múlva</string>\n    <string name=\"filter_dialog_whole_word\">Teljes szó</string>\n    <string name=\"filter_dialog_whole_word_description\">Ha a kulcsszó csak alfanumerikus karakterekből áll, csak teljes szóra fog illeszkedni</string>\n    <string name=\"hint_search_people_list\">Általad követettek keresése</string>\n    <string name=\"action_add_to_list\">Fiók hozzáadása a listához</string>\n    <string name=\"action_remove_from_list\">Fiók eltávolítása a listából</string>\n    <string name=\"compose_active_account_description\">Bejegyzés mint %1$s</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Tartalom leírása látássérültek számára (%1$d karakteres korlát)</item>\n        <item quantity=\"other\">Tartalom leírása látássérültek számára (%1$d karakteres korlát)</item>\n    </plurals>\n    <string name=\"action_set_caption\">Cím beállítása</string>\n    <string name=\"lock_account_label_description\">Minden követődet külön engedélyezned kell</string>\n    <string name=\"expand_collapse_all_posts\">Összes bejegyzés kibontása/összecsukása</string>\n    <string name=\"caption_notoemoji\">A Google jelenlegi emodzsikészlete</string>\n    <string name=\"reblog_private\">Megtolás az eredeti közönségnek</string>\n    <string name=\"unreblog_private\">Megtolás visszavonása</string>\n    <string name=\"license_apache_2\">Apache licenc alatt közzétéve (másolat alább)</string>\n    <string name=\"unpin_action\">Kitűzés eltávolítása</string>\n    <string name=\"pin_action\">Kitűzés</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> Kedvenc</item>\n        <item quantity=\"other\"><b>%1$s</b> Kedvenc</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> megtolás</item>\n        <item quantity=\"other\"><b>%1$s</b> megtolás</item>\n    </plurals>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s és még %3$d</string>\n    <string name=\"description_post_media\">Média: %1$s</string>\n    <string name=\"description_post_cw\">Tartalomfigyelmeztetés: %1$s</string>\n    <string name=\"description_post_reblogged\">Megtolt</string>\n    <string name=\"description_post_favourited\">Kedvelt</string>\n    <string name=\"description_visibility_unlisted\">Listázatlan</string>\n    <string name=\"description_visibility_direct\">Közvetlen</string>\n    <string name=\"description_poll\">Szavazás válaszokkal: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"hint_list_name\">Lista neve</string>\n    <string name=\"pick_hashtag_hint\">Hashtag # nélkül</string>\n    <string name=\"notifications_clear\">Törlés</string>\n    <string name=\"notifications_apply_filter\">Szűrés</string>\n    <string name=\"filter_apply\">Alkalmaz</string>\n    <string name=\"compose_shortcut_long_label\">Bejegyzés létrehozása</string>\n    <string name=\"compose_shortcut_short_label\">Szerkesztés</string>\n    <string name=\"notification_clear_text\">Biztos, hogy minden értesítésedet véglegesen törlöd?</string>\n    <string name=\"compose_preview_image_description\">Műveletek a(z) %1$s képpel</string>\n    <string name=\"poll_info_format\"> \\u0020<!-- 15 szavazat • 1 óra van hátra --> \\u0020%1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s szavazat</item>\n        <item quantity=\"other\">%1$s szavazat</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">vége: %1$s</string>\n    <string name=\"poll_info_closed\">véget ért</string>\n    <string name=\"poll_vote\">Szavazás</string>\n    <string name=\"poll_ended_voted\">Egy szavazás véget ért, melyben részt vettél</string>\n    <string name=\"poll_ended_created\">Egy szavazás véget ért, melyet te hoztál létre</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d nap van hátra</item>\n        <item quantity=\"other\">%1$d nap van hátra</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d óra van hátra</item>\n        <item quantity=\"other\">%1$d óra van hátra</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d perc van hátra</item>\n        <item quantity=\"other\">%1$d perc van hátra</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d másodperc van hátra</item>\n        <item quantity=\"other\">%1$d másodperc van hátra</item>\n    </plurals>\n    <string name=\"button_continue\">Folytatás</string>\n    <string name=\"button_back\">Vissza</string>\n    <string name=\"button_done\">Kész</string>\n    <string name=\"report_sent_success\">\\@%1$s sikeresen jelentve</string>\n    <string name=\"hint_additional_info\">Egyéb megjegyzések</string>\n    <string name=\"report_remote_instance\">Továbbítás neki: %1$s</string>\n    <string name=\"failed_report\">Nem sikerült a bejelentés</string>\n    <string name=\"failed_fetch_posts\">Sikertelen a bejegyzések letöltése</string>\n    <string name=\"report_description_1\">A bejelentést a szervered moderátorának küldjük el. Alább megadhatsz egy magyarázatot arra, hogy miért jelented be ezt a fiókot:</string>\n    <string name=\"report_description_remote_instance\">A fiók egy másik szerverről származik. Küldjünk oda is egy anonimizált másolatot a bejelentésről?</string>\n    <string name=\"pref_title_alway_open_spoiler\">Tartalomfigyelmeztetéssel ellátott bejegyzések kinyitása mindig</string>\n    <string name=\"title_accounts\">Fiókok</string>\n    <string name=\"failed_search\">Sikertelen keresés</string>\n    <string name=\"action_add_poll\">Szavazás hozzáadása</string>\n    <string name=\"create_poll_title\">Szavazás</string>\n    <string name=\"duration_5_min\">5 perc</string>\n    <string name=\"duration_30_min\">30 perc</string>\n    <string name=\"duration_1_hour\">1 óra</string>\n    <string name=\"duration_6_hours\">6 óra</string>\n    <string name=\"duration_1_day\">1 nap</string>\n    <string name=\"duration_3_days\">3 nap</string>\n    <string name=\"duration_7_days\">7 nap</string>\n    <string name=\"add_poll_choice\">Válasz hozzáadása</string>\n    <string name=\"poll_allow_multiple_choices\">Több lehetőség</string>\n    <string name=\"poll_new_choice_hint\">%1$d. lehetőség</string>\n    <string name=\"edit_poll\">Szerkesztés</string>\n    <string name=\"title_scheduled_posts\">Időzített bejegyzések</string>\n    <string name=\"action_edit\">Szerkesztés</string>\n    <string name=\"action_access_scheduled_posts\">Időzített bejegyzések</string>\n    <string name=\"action_schedule_post\">Bejegyzés Időzítése</string>\n    <string name=\"action_reset_schedule\">Visszaállítás</string>\n    <string name=\"post_lookup_error_format\">Hiba a bejegyzés keresésekor: %1$s</string>\n    <string name=\"title_bookmarks\">Könyvjelzők</string>\n    <string name=\"action_bookmark\">Könyvjelzőzés</string>\n    <string name=\"action_view_bookmarks\">Könyvjelzők</string>\n    <string name=\"about_powered_by_tusky\">Tusky által hajtva</string>\n    <string name=\"description_post_bookmarked\">Könyvjelzőzve</string>\n    <string name=\"select_list_title\">Lista kiválasztása</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"no_drafts\">Nincs egy piszkozatod sem.</string>\n    <string name=\"no_scheduled_posts\">Nincs egy ütemezett bejegyzésed sem.</string>\n    <string name=\"warning_scheduling_interval\">A Mastodonban a legrövidebb ütemezhető időintervallum 5 perc.</string>\n    <string name=\"notification_follow_request_name\">Követési kérelmek</string>\n    <string name=\"pref_title_confirm_reblogs\">Jóváhagyás megjelenítése megtolás előtt</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Hivatkozás előnézetének megjelenítése az idővonalakon</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Lapok közötti váltás engedélyezése csúsztatással</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s személy</item>\n        <item quantity=\"other\">%1$s személy</item>\n    </plurals>\n    <string name=\"hashtags\">Hashtagek</string>\n    <string name=\"add_hashtag_title\">Hashtag hozzáadása</string>\n    <string name=\"notification_follow_request_description\">Értesítések a követési kérésekről</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Lent</string>\n    <string name=\"pref_main_nav_position_option_top\">Fent</string>\n    <string name=\"pref_main_nav_position\">Fő navigálási pozíció</string>\n    <string name=\"pref_title_gradient_for_media\">Színes homály megjelenítése a rejtett médiánál</string>\n    <string name=\"dialog_mute_hide_notifications\">Értesítések elrejtése</string>\n    <string name=\"dialog_block_warning\">Letiltod: @%1$s?</string>\n    <string name=\"dialog_mute_warning\">Elnémítod: @%1$s?</string>\n    <string name=\"action_unmute_conversation\">Beszélgetés némításának feloldása</string>\n    <string name=\"action_mute_conversation\">Beszélgetés némítása</string>\n    <string name=\"action_unmute_domain\">%1$s némításának feloldása</string>\n    <string name=\"action_unmute_desc\">%1$s némításának feloldása</string>\n    <string name=\"notification_follow_request_format\">%1$s kéri, hogy követhessen</string>\n    <string name=\"pref_title_hide_top_toolbar\">Felső eszköztár címének elrejtése</string>\n    <string name=\"account_note_saved\">Elmentve!</string>\n    <string name=\"account_note_hint\">Saját, mások számára nem látható megjegyzés erről a fiókról</string>\n    <string name=\"no_announcements\">Nincsenek közlemények.</string>\n    <string name=\"title_announcements\">Közlemények</string>\n    <string name=\"drafts_post_reply_removed\">A bejegyzést, melyre válaszul piszkozatot készítettél törölték</string>\n    <string name=\"draft_deleted\">Piszkozat törölve</string>\n    <string name=\"drafts_failed_loading_reply\">Nem sikerült a Válasz információit betölteni</string>\n    <string name=\"drafts_post_failed_to_send\">Ezt a bejegyzést nem tudtuk elküldeni!</string>\n    <string name=\"dialog_delete_list_warning\">Tényleg törlöd a(z) %1$s listát?</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Nem tölthetsz fel %1$d médiacsatolmányból többet.</item>\n        <item quantity=\"other\">Nem tölthetsz fel %1$d médiacsatolmányból többet.</item>\n    </plurals>\n    <string name=\"wellbeing_hide_stats_profile\">Profilok mérőszámainak elrejtése</string>\n    <string name=\"wellbeing_hide_stats_posts\">Bejegyzések mérőszámainak elrejtése</string>\n    <string name=\"limit_notifications\">Idővonali értesítések korlátozása</string>\n    <string name=\"review_notifications\">Értesítések áttekintése</string>\n    <string name=\"wellbeing_mode_notice\">Néhány információ, mely befolyásolhatja a mentális jóllétedet, rejtve marad. Ilyenek például:\n\\n\n\\n - Kedvencek, megtolások és követések értesítései\n\\n - Kedvenc- és megtolásszámlálók a bejegyzéseken\n\\n - Követő- és bejegyzésstatisztikák a profilokon\n\\n\n\\nA leküldéses értesítéseket ez nem befolyásolja, de kézzel átnézheted az értesítési beállításaidat.</string>\n    <string name=\"duration_indefinite\">Végtelen</string>\n    <string name=\"label_duration\">Időtartam</string>\n    <string name=\"post_media_attachments\">Csatolmányok</string>\n    <string name=\"post_media_audio\">Audio</string>\n    <string name=\"notification_subscription_description\">Értesítések az általam követettek új bejegyzéseiről</string>\n    <string name=\"notification_subscription_name\">Új bejegyzések</string>\n    <string name=\"notification_subscription_format\">%1$s épp bejegyzést írt</string>\n    <string name=\"pref_title_wellbeing_mode\">Jóllét</string>\n    <string name=\"pref_title_animate_custom_emojis\">Egyéni emodzsik animálása</string>\n    <string name=\"action_unsubscribe_account\">Leiratkozás</string>\n    <string name=\"action_subscribe_account\">Feliratkozás</string>\n    <string name=\"follow_requests_info\">Bár a fiókod nincs zárolva, a(z) %1$s csapata úgy gondolta, hogy ezen fiókok követési kéréseit kézzel kellene átnézned.</string>\n    <string name=\"dialog_delete_conversation_warning\">Töröljük ezt a beszélgetést?</string>\n    <string name=\"action_delete_conversation\">Beszélgetés törlése</string>\n    <string name=\"action_unbookmark\">Könyvjelző törlése</string>\n    <string name=\"pref_title_confirm_favourites\">Jóváhagyás megjelenítése kedvencnek jelölés előtt</string>\n    <string name=\"notification_update_format\">%1$s szerkesztette a bejegyzését</string>\n    <string name=\"notification_sign_up_format\">%1$s regisztrált</string>\n    <string name=\"notification_sign_up_name\">Regisztrációk</string>\n    <string name=\"notification_sign_up_description\">Értesítések az új felhasználókról</string>\n    <string name=\"duration_14_days\">14 nap</string>\n    <string name=\"duration_30_days\">30 nap</string>\n    <string name=\"duration_60_days\">60 nap</string>\n    <string name=\"duration_90_days\">90 nap</string>\n    <string name=\"duration_180_days\">180 nap</string>\n    <string name=\"duration_365_days\">365 nap</string>\n    <string name=\"notification_update_name\">Bejegyzések szerkesztése</string>\n    <string name=\"notification_update_description\">Értesítések olyan bejegyzések szerkesztéséről, melyekkel már dolgod volt</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Bejegyzés Létrehozása</string>\n    <string name=\"action_dismiss\">Elvetés</string>\n    <string name=\"action_details\">Részletek</string>\n    <string name=\"account_date_joined\">Csatlakozva %1$s</string>\n    <string name=\"title_login\">Bejelentkezés</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"error_could_not_load_login_page\">Nem tudtuk betölteni a bejelentkező oldalt.</string>\n    <string name=\"saving_draft\">Vázlat mentése…</string>\n    <string name=\"action_edit_image\">Kép szerkesztése</string>\n    <string name=\"error_image_edit_failed\">A kép nem szerkeszthető.</string>\n    <string name=\"error_loading_account_details\">Nem sikerült betölteni a fiókadatokat</string>\n    <string name=\"pref_title_show_self_username\">Felhasználónév megjelenítése az eszköztáron</string>\n    <string name=\"delete_scheduled_post_warning\">Töröljük ezt az időzített bejegyzést?</string>\n    <string name=\"set_focus_description\">Koppintsd vagy húzd a kört, hogy kijelöld azt a fókuszpontot, mely mindig látható lesz az előnézetekben.</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"error_multimedia_size_limit\">A videó- és hangfájlok mérete nem lehet %1$s MB-nál nagyobb.</string>\n    <string name=\"description_post_language\">Bejegyzés nyelve</string>\n    <string name=\"pref_show_self_username_always\">Mindig</string>\n    <string name=\"pref_show_self_username_disambiguate\">Ha több fiók is be van jelentkezve</string>\n    <string name=\"pref_show_self_username_never\">Soha</string>\n    <string name=\"duration_no_change\">(Nincs változás)</string>\n    <string name=\"action_set_focus\">Fókuszpont beállítása</string>\n    <string name=\"error_following_hashtag_format\">Hiba a(z) #%1$s követésekor</string>\n    <string name=\"error_unfollowing_hashtag_format\">Hiba a(z) #%1$s követésének befejezésekor</string>\n    <string name=\"action_add_reaction\">reakció hozzáadása</string>\n    <string name=\"instance_rule_info\">A bejelentkezéssel elfogadod a(z) %1$s szabályait.</string>\n    <string name=\"instance_rule_title\">%1$s szabályai</string>\n    <string name=\"compose_save_draft_loses_media\">Elmentsük a vázlatot? (A mellékleteket újra feltöltjük, amikor a vázlatot visszaállítod.)</string>\n    <string name=\"failed_to_pin\">Nem sikerült kitűzni</string>\n    <string name=\"failed_to_unpin\">Nem sikerült a kitűzés visszavonása</string>\n    <string name=\"action_add_or_remove_from_list\">Hozzáadás vagy törlés a listáról</string>\n    <string name=\"no_lists\">Nincs egy listád se.</string>\n    <string name=\"action_unfollow_hashtag_format\">Megszünteted a követését: #%1$s?</string>\n    <string name=\"hint_media_description_missing\">A médiához leírást is kell adni.</string>\n    <string name=\"pref_default_post_language\">Bejegyzések nyelve (a kiszolgálóval szinkronizálva)</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"report_category_violation\">Szabálysértés</string>\n    <string name=\"pref_title_http_proxy_port_message\">A portnak %1$d és %2$d között kell lennie</string>\n    <string name=\"status_created_at_now\">most</string>\n    <string name=\"description_post_edited\">Szerkesztve</string>\n    <string name=\"error_following_hashtags_unsupported\">Ez a kiszolgáló nem támogatja a hashtagek követését.</string>\n    <string name=\"error_muting_hashtag_format\">Hiba a(z) #%1$s némításakor</string>\n    <string name=\"error_unmuting_hashtag_format\">Hiba a(z) #%1$s némításának feloldásakor</string>\n    <string name=\"notification_report_format\">Új jelentés itt: %1$s</string>\n    <string name=\"notification_header_report_format\">%1$s jelentette: %2$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d bejegyzés csatolva</string>\n    <string name=\"confirmation_hashtag_unfollowed\">#%1$s kikövetve</string>\n    <string name=\"notification_report_name\">Bejelentések</string>\n    <string name=\"notification_report_description\">Értesítések moderációs bejelentésekről</string>\n    <string name=\"failed_to_add_to_list\">Nem sikerült a fiókot a listához adni</string>\n    <string name=\"failed_to_remove_from_list\">Nem sikerült a fiókot levenni a listáról</string>\n    <string name=\"report_category_spam\">Spam</string>\n    <string name=\"report_category_other\">Egyéb</string>\n    <string name=\"post_edited\">%1$s szerkesztve</string>\n    <string name=\"error_status_source_load\">Nem sikerült letölteni a kiszolgálóról az állapotforrást.</string>\n    <string name=\"title_followed_hashtags\">Követett hashtagek</string>\n    <string name=\"a11y_label_loading_thread\">Szál betöltése</string>\n    <string name=\"pref_title_reading_order\">Olvasási sorrend</string>\n    <string name=\"pref_reading_order_oldest_first\">Régebbi elöl</string>\n    <string name=\"pref_reading_order_newest_first\">Újabb elöl</string>\n    <string name=\"mute_notifications_switch\">Értesítések némítása</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Letiltva</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;nincs beállítva&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;érvénytelen&gt;</string>\n    <string name=\"title_edits\">Szerkesztések</string>\n    <string name=\"status_created_info\">%1$s-kor létrehozta</string>\n    <string name=\"status_edit_info\">%1$s-kor szerkesztette</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"action_discard\">Változtatások elvetése</string>\n    <string name=\"action_continue_edit\">Szerkesztés folytatása</string>\n    <string name=\"compose_unsaved_changes\">Elmentetlen változtatásaid vannak.</string>\n    <string name=\"action_share_account_link\">Fiókhivatkozás megosztása</string>\n    <string name=\"action_share_account_username\">Fiók felhasználói nevének megosztása</string>\n    <string name=\"send_account_link_to\">Fiók webcímének megosztása…</string>\n    <string name=\"send_account_username_to\">Fiók felhasználói nevének megosztása vele…</string>\n    <string name=\"account_username_copied\">Felhasználónév másolva</string>\n    <string name=\"action_post_failed\">Feltöltés meghiúsult</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">A bejegyzésed feltöltése meghiúsult, és a vázlatokba mentettük el.\n\\n\n\\nVagy a kiszolgálót nem lehetett elérni, vagy visszautasította a bejegyzést.</item>\n        <item quantity=\"other\">A bejegyzésed feltöltése meghiúsult, és a vázlatokba mentettük el.\n\\n\n\\nVagy a kiszolgálót nem lehetett elérni, vagy visszautasította a bejegyzést.</item>\n    </plurals>\n    <string name=\"action_post_failed_show_drafts\">Vázlatok megjelenítése</string>\n    <string name=\"action_post_failed_do_nothing\">Elvetés</string>\n    <string name=\"action_browser_login\">Bejelentkezés Böngészővel</string>\n    <string name=\"description_login\">A legtöbb esetben működik. Nem szivárog ki adat más alkalmazások számára.</string>\n    <string name=\"description_browser_login\">Támogathat más hitelesítési módozatokat is, de ehhez támogatott böngészőre van szükség.</string>\n    <string name=\"title_public_trending_hashtags\">Népszerű hashtagek</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d ember beszél a %2$s hashtagről</string>\n    <string name=\"total_usage\">Összes használat</string>\n    <string name=\"total_accounts\">Összes fiók</string>\n    <string name=\"dialog_follow_hashtag_title\">Hashtag követése</string>\n    <string name=\"action_refresh\">Frissítés</string>\n    <string name=\"notification_unknown_name\">Ismeretlen</string>\n    <string name=\"ui_error_favourite\">Bejegyzés kedvencnek jelölése sikertelen: %1$s</string>\n    <string name=\"ui_error_reblog\">Bejegyzés megtolása sikertelen: %1$s</string>\n    <string name=\"ui_error_vote\">Szavazat leadása sikertelen: %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">Követési kérés elfogadása sikertelen: %1$s</string>\n    <string name=\"status_filtered_show_anyway\">Mutatás mindenképpen</string>\n    <string name=\"status_filter_placeholder_label_format\">Szűrve: %1$s</string>\n    <string name=\"pref_title_account_filter_keywords\">Profil</string>\n    <string name=\"socket_timeout_exception\">A kapcsolatfelvétel a kiszolgálóddal túl sokáig tartott</string>\n    <string name=\"ui_error_unknown\">ismeretlen ok</string>\n    <string name=\"ui_error_bookmark\">Bejegyzés könyvjelzőzése sikertelen: %1$s</string>\n    <string name=\"ui_error_clear_notifications\">Értesítések törlése sikertelen: %1$s</string>\n    <string name=\"filter_action_warn\">Figyelmeztetés</string>\n    <string name=\"filter_action_hide\">Elrejtés</string>\n    <string name=\"filter_description_warn\">Elrejtés figyelmeztetéssel</string>\n    <string name=\"filter_description_hide\">Elrejtés teljesen</string>\n    <string name=\"label_filter_action\">Szűrőművelet</string>\n    <string name=\"ui_success_rejected_follow_request\">Követési kérelem letiltva</string>\n    <string name=\"hint_filter_title\">Saját szűrő</string>\n    <string name=\"label_filter_title\">Cím</string>\n    <string name=\"action_add\">Hozzáadás</string>\n    <string name=\"filter_keyword_display_format\">%1$s (teljes szó)</string>\n    <string name=\"label_filter_context\">Szűrőkontextus</string>\n    <string name=\"label_filter_keywords\">Szűrendő kulcsszavak vagy kifejezések</string>\n    <string name=\"pref_title_show_stat_inline\">Bejegyzésstatisztikák megjelenítése az idővonalon</string>\n    <string name=\"ui_error_reject_follow_request\">Követési kérés elutasítása sikertelen: %1$s</string>\n    <string name=\"ui_success_accepted_follow_request\">Követési kérelem elfogadva</string>\n    <string name=\"filter_keyword_addition_title\">Kulcsszó hozzáadása</string>\n    <string name=\"filter_edit_keyword_title\">Kulcsszó szerkesztése</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"help_empty_home\">Ez a <b>kezdőlapod idővonala</b>. Megjeleníti a követett fiókok legfrissebb bejegyzéseit. \\u0020 \n\\n \\u0020 \n\\nMás fiókokat más idővonalakon fedezhetsz fel. Például a példányod helyi idővonalán {{group}}. Vagy megkeresheted őket név szerint {{search}}; például keress rá a Tuskyra, hogy megtaláld a Mastodon-fiókunkat.</string>\n    <string name=\"post_media_image\">Kép</string>\n    <string name=\"select_list_manage\">Listák kezelése</string>\n    <string name=\"pref_ui_text_size\">Felület betűmérete</string>\n    <string name=\"notification_listenable_worker_name\">Háttértevékenység</string>\n    <string name=\"notification_listenable_worker_description\">Értesítések, amikor a Tusky a háttérben működik</string>\n    <string name=\"notification_notification_worker\">Értesítések lekérése…</string>\n    <string name=\"notification_prune_cache\">Gyorsítótár karbantartása…</string>\n    <string name=\"load_newest_notifications\">Legújabb értesítések betöltése</string>\n    <string name=\"compose_delete_draft\">Töröljük a vázlatot?</string>\n    <string name=\"error_missing_edits\">A kiszolgálód tudja, hogy ezt a bejegyzést szerkesztették, de nincs másolata a szekesztésekről, így ezeket nem tudja megjeleníteni. \n\\n \n\\nEz egy ismert probléma: <a href=\"https://github.com/mastodon/mastodon/issues/25398\">#25398-as számú Mastodon jegy</a>.</string>\n    <string name=\"reply_sending\">Küldés…</string>\n    <string name=\"reply_sending_long\">A válaszodat épp elküldjük.</string>\n    <string name=\"label_image\">Kép</string>\n    <string name=\"about_account_info_title\">Saját fiók</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nAndroid verzió: %3$s\n\\nSDK verzió: %4$d</string>\n    <string name=\"about_device_info_title\">Saját eszközöd</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nVerzió: %3$s</string>\n    <string name=\"about_copy\">Verzió és eszköz információk másolása</string>\n    <string name=\"about_copied\">Verzió és eszköz információ lemásolva</string>\n    <string name=\"action_translate\">Fordítás</string>\n    <string name=\"action_show_original\">Eredeti megjelenítése</string>\n    <string name=\"label_translating\">Fordítás…</string>\n    <string name=\"label_translated\">Fordítva %1$s forrásból %2$s eszközzel</string>\n    <string name=\"list_exclusive_label\">Elrejtés a saját idővonalról</string>\n    <string name=\"ui_error_translate\">Nem lehet lefordítani: %1$s</string>\n    <string name=\"error_media_playback\">Lejátszás sikertelen: %1$s</string>\n    <string name=\"dialog_delete_filter_text\">Szűrő \\'%1$s\\' törlése?</string>\n    <string name=\"dialog_delete_filter_positive_action\">Törlés</string>\n    <string name=\"dialog_save_profile_changes_message\">El akarod menteni a profilod változásait?</string>\n    <string name=\"app_theme_system_black\">Rendszerséma Használata (fekete)</string>\n    <string name=\"action_view_filter\">Szűrő megtekintése</string>\n    <string name=\"following_hashtag_success_format\">Most már követed a(z) #%1$s hashtaget</string>\n    <string name=\"unmuting_hashtag_success_format\">#%1$s hashtag némításának feloldása</string>\n    <string name=\"muting_hashtag_success_format\">#%1$s hashtag elnémítása figyelmeztetésként</string>\n    <string name=\"unfollowing_hashtag_success_format\">Már nem követed a(z) #%1$s hashtaget</string>\n    <string name=\"help_empty_conversations\">It találhatóak a <b>privát üzeneteid</b>; melyeket néha beszélgetéseknek vagy közvetlen üzeneteknek hívunk (DM). \\u0020 \\u0020\n\\n \\u0020 \\u0020\n\\nPrivát üzeneteket az ilyen bejegyzések láthatóságának {{public}} publikusról {{mail}} <i>közvetlenre</i> állításával, és egy vagy több felhasználó megemlítésével hozhatsz létre. \\u0020 \\u0020\n\\n \\u0020 \\u0020\n\\nPéldául indulhatsz egy profilról, a létrehozás gombra kattintva [iconics gmd_edit], majd a láthatóságot megváltoztatva. \\u0020</string>\n    <string name=\"title_public_trending_statuses\">Felkapott bejegyzések</string>\n    <string name=\"help_empty_lists\">Ez a <b>listanézeted</b>. Privát listákat hozhatsz létre és fiókokat adhatsz hozzájuk. \\u0020 \\u0020\n\\n \\u0020 \\u0020\n\\nMEGJEGYZÉS: Csak olyan fiókot rakhatsz a listádra, melyet követsz is. \\u0020 \\u0020\n\\n \\u0020 \\u0020\n\\n Ezeket a listákat lapokként használhatod a Fiókbeállítások [iconics gmd_account_circle] [iconics gmd_navigate_next] Lapok alatt. \\u0020</string>\n    <string name=\"error_blocking_domain\">Nem sikerült némítani %1$s: %2$s</string>\n    <string name=\"error_unblocking_domain\">Nem sikerült a némítás feloldása %1$s: %2$s</string>\n    <string name=\"error_media_upload_sending_fmt\">A feltöltés sikertelen: %1$s</string>\n    <string name=\"pref_title_per_timeline_preferences\">Idővonalankénti beállítások</string>\n    <string name=\"list_reply_policy_none\">Senki</string>\n    <string name=\"list_reply_policy_list\">A lista tagjai</string>\n    <string name=\"list_reply_policy_followed\">Bármely követett felhasználó</string>\n    <string name=\"list_reply_policy_label\">Erre való válaszok megjelenítése</string>\n    <string name=\"pref_title_show_self_boosts\">Önmegtolások megjelenítése</string>\n    <string name=\"pref_title_show_self_boosts_description\">Valaki a saját bejegyzését tolja meg</string>\n    <string name=\"pref_title_show_notifications_filter\">Értesítésszűrő megjelenítése</string>\n    <string name=\"action_follow_hashtag\">Új hashtag követése</string>\n    <string name=\"url_copied\">Webcím másolva</string>\n    <string name=\"dialog_follow_warning\">Követed ezt a fiókot?</string>\n    <string name=\"pref_default_reply_privacy\">Válasz láthatósága (nincs szinkronizálva a kiszolgálóval)</string>\n    <string name=\"label_expires_after\">Lejárat:</string>\n    <string name=\"pref_title_confirm_follows\">Megerősítés megjelenítése követés előtt</string>\n    <string name=\"report_category_legal\">Jogi információk</string>\n    <string name=\"unknown_notification_type\">Isneretlen értesítési típus</string>\n    <string name=\"pref_default_reply_privacy_explanation\">Az előre beállított láthatóság a bejegyzésen múlik, amelyre válaszol.</string>\n    <string name=\"pref_match_default_post_privacy\">Bejegyzések alapértelmezett láthatóságának követése</string>\n    <string name=\"post_privacy_direct\">Közvetlen</string>\n    <string name=\"error_deleting_filter\">Hiba a(z) „%1$s” szűrő törlésekor</string>\n    <string name=\"error_saving_filter\">Hiba a(z) „%1$s” szűrő mentésekor</string>\n    <string name=\"confirmation_hashtag_copied\">„#%1$s” másolva</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-in/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_empty\">Kolom ini tidak boleh kosong.</string>\n    <string name=\"error_invalid_domain\">Domain yang dimasukkan tidak valid</string>\n    <string name=\"error_no_web_browser_found\">Tidak dapat menemukan browser untuk digunakan.</string>\n    <string name=\"error_authorization_unknown\">\"Terjadi kesalahan otorisasi yang tidak diketahui. Jika ini  berlanjut, coba Masuk di Browser dari menu.\"</string>\n    <string name=\"error_authorization_denied\">Otorisasi ditolak. Jika Anda yakin telah memberikan kredensial yang benar, coba Masuk di Browser dari menu.</string>\n    <string name=\"error_retrieving_oauth_token\">Gagal mendapatkan token masuk. Jika ini terus berlanjut, coba Masuk di Browser dari menu.</string>\n    <string name=\"title_login\">Masuk</string>\n    <string name=\"title_home\">Beranda</string>\n    <string name=\"title_notifications\">Notifikasi</string>\n    <string name=\"title_public_local\">Lokal</string>\n    <string name=\"title_direct_messages\">Pesan langsung</string>\n    <string name=\"error_multimedia_size_limit\">Berkas video dan audio tidak boleh melebihi %1$s MB.</string>\n    <string name=\"error_image_edit_failed\">Gambar tidak dapat diubah.</string>\n    <string name=\"error_media_upload_type\">Jenis berkas tersebut tidak dapat diunggah.</string>\n    <string name=\"error_media_upload_opening\">Berkas itu tidak dapat dibuka.</string>\n    <string name=\"error_media_upload_sending\">Gagal mengunggah.</string>\n    <string name=\"title_tab_preferences\">Tab</string>\n    <string name=\"title_view_thread\">Utas</string>\n    <string name=\"error_following_hashtag_format\">Terjadi kesalahan saat mengikuti #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Terjadi kesalahan saat berhenti mengikuti #%1$s</string>\n    <string name=\"error_could_not_load_login_page\">Tidak dapat memuat halaman masuk.</string>\n    <string name=\"title_posts\">Postingan</string>\n    <string name=\"title_posts_with_replies\">Dengan balasan</string>\n    <string name=\"title_posts_pinned\">Disematkan</string>\n    <string name=\"title_follows\">Mengikuti</string>\n    <string name=\"title_followers\">Pengikut</string>\n    <string name=\"title_favourites\">Favorit</string>\n    <string name=\"title_bookmarks\">Markah</string>\n    <string name=\"title_blocks\">Pengguna diblokir</string>\n    <string name=\"title_domain_mutes\">Domain tersembunyi</string>\n    <string name=\"title_edit_profile\">Ubah profil</string>\n    <string name=\"title_drafts\">Draf</string>\n    <string name=\"title_scheduled_posts\">Postingan terjadwal</string>\n    <string name=\"error_compose_character_limit\">Postingan terlalu panjang!</string>\n    <string name=\"error_media_upload_permission\">Izin untuk membaca media diperlukan.</string>\n    <string name=\"error_media_download_permission\">Izin untuk menyimpan media diperlukan.</string>\n    <string name=\"title_licenses\">Lisensi</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_media_hidden_title\">Media disembunyikan</string>\n    <string name=\"post_sensitive_media_directions\">Klik untuk melihat</string>\n    <string name=\"post_content_warning_show_more\">Tampilkan Lebih Banyak</string>\n    <string name=\"post_content_warning_show_less\">Tampilkan Lebih Sedikit</string>\n    <string name=\"message_empty\">Tidak ada apa pun disini.</string>\n    <string name=\"notification_follow_format\">%1$s mengikuti Anda</string>\n    <string name=\"report_username_format\">Laporkan @%1$s</string>\n    <string name=\"action_follow\">Ikuti</string>\n    <string name=\"action_unfollow\">Berhenti Mengikuti</string>\n    <string name=\"action_block\">Blokir</string>\n    <string name=\"action_unblock\">Buka blokir</string>\n    <string name=\"action_report\">Laporkan</string>\n    <string name=\"action_delete\">Hapus</string>\n    <string name=\"action_retry\">Coba lagi</string>\n    <string name=\"action_close\">Tutup</string>\n    <string name=\"action_view_profile\">Profil</string>\n    <string name=\"action_view_preferences\">Preferensi</string>\n    <string name=\"action_view_account_preferences\">Preferensi Akun</string>\n    <string name=\"action_view_favourites\">Favorit</string>\n    <string name=\"action_view_bookmarks\">Markah</string>\n    <string name=\"action_view_mutes\">Pengguna dibisukan</string>\n    <string name=\"action_view_blocks\">Pengguna diblokir</string>\n    <string name=\"action_view_media\">Media</string>\n    <string name=\"action_open_in_web\">Buka di peramban</string>\n    <string name=\"action_add_media\">Tambahkan media</string>\n    <string name=\"action_photo_take\">Ambil gambar</string>\n    <string name=\"action_share\">Bagikan</string>\n    <string name=\"action_mute\">Bisukan</string>\n    <string name=\"action_unmute_desc\">Jangan bisukan %1$s</string>\n    <string name=\"action_mute_domain\">Bisukan %1$s</string>\n    <string name=\"action_unmute_domain\">Jangan bisukan %1$s</string>\n    <string name=\"action_unmute_conversation\">Jangan bisukan percakapan</string>\n    <string name=\"action_save\">Simpan</string>\n    <string name=\"action_edit_profile\">Ubah profil</string>\n    <string name=\"action_edit_own_profile\">Ubah</string>\n    <string name=\"action_undo\">Batalkan</string>\n    <string name=\"action_reject\">Tolak</string>\n    <string name=\"action_accept\">Terima</string>\n    <string name=\"action_search\">Cari</string>\n    <string name=\"action_access_drafts\">Draf</string>\n    <string name=\"action_reset_schedule\">Setel Ulang</string>\n    <string name=\"action_links\">Tautan</string>\n    <string name=\"action_details\">Detail</string>\n    <string name=\"action_copy_link\">Salin tautan</string>\n    <string name=\"download_image\">Mengunduh %1$s</string>\n    <string name=\"download_media\">Unduh media</string>\n    <string name=\"downloading_media\">Mengunduh media</string>\n    <string name=\"confirmation_reported\">Terkirim!</string>\n    <string name=\"hint_compose\">Apa yang terjadi?</string>\n    <string name=\"hint_search\">Cari…</string>\n    <string name=\"login_connection\">Menghubungkan…</string>\n    <string name=\"dialog_title_finishing_media_upload\">Menyelesaikan Pengunggahan Media</string>\n    <string name=\"dialog_block_warning\">Blokir @%1$s?</string>\n    <string name=\"dialog_mute_warning\">Bisukan @%1$s?</string>\n    <string name=\"dialog_delete_conversation_warning\">Hapus percakapan ini?</string>\n    <string name=\"pref_title_notification_alert_sound\">Beri tahu dengan suara</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Beri tahu dengan getaran</string>\n    <string name=\"pref_title_notification_alert_light\">Beri tahu dengan lampu</string>\n    <string name=\"app_them_dark\">Gelap</string>\n    <string name=\"app_theme_light\">Terang</string>\n    <string name=\"app_theme_black\">Hitam</string>\n    <string name=\"pref_title_timelines\">Linimasa</string>\n    <string name=\"pref_title_app_theme\">Tema Aplikasi</string>\n    <string name=\"pref_title_browser_settings\">Peramban</string>\n    <string name=\"pref_title_show_replies\">Tampilkan balasan</string>\n    <string name=\"pref_main_nav_position_option_top\">Atas</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Bawah</string>\n    <string name=\"post_privacy_public\">Publik</string>\n    <string name=\"post_text_size_small\">Kecil</string>\n    <string name=\"post_text_size_medium\">Sedang</string>\n    <string name=\"post_text_size_large\">Besar</string>\n    <string name=\"post_text_size_largest\">Terbesar</string>\n    <string name=\"pref_show_self_username_always\">Selalu</string>\n    <string name=\"pref_show_self_username_never\">Jangan Pernah</string>\n    <string name=\"notification_follow_name\">Pengikut Baru</string>\n    <string name=\"notification_follow_description\">Notifikasi tentang pengikut baru</string>\n    <string name=\"notification_sign_up_name\">Daftar</string>\n    <string name=\"about_title_activity\">Tentang</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_powered_by_tusky\">Dipersembahkan oleh Tusky</string>\n    <string name=\"post_media_video\">Video</string>\n    <string name=\"post_media_audio\">Audio</string>\n    <string name=\"post_media_attachments\">Lampiran</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"follows_you\">Mengikuti Anda</string>\n    <string name=\"add_account_description\">Tambahkan Akun Mastodon baru</string>\n    <string name=\"action_lists\">Daftar</string>\n    <string name=\"title_lists\">Daftar</string>\n    <string name=\"error_rename_list\">Tidak dapat mengubah nama daftar</string>\n    <string name=\"error_delete_list\">Tidak dapat menghapus daftar</string>\n    <string name=\"action_create_list\">Buat daftar</string>\n    <string name=\"action_rename_list\">Ubah nama daftar</string>\n    <string name=\"action_delete_list\">Hapus daftar</string>\n    <string name=\"lock_account_label\">Kunci akun</string>\n    <string name=\"system_default\">Bawaan sistem</string>\n    <string name=\"action_compose_shortcut\">Tulis</string>\n    <string name=\"restart\">Mulai ulang</string>\n    <string name=\"account_note_saved\">Disimpan!</string>\n    <string name=\"error_generic\">Terjadi kesalahan.</string>\n    <string name=\"error_network\">Terjadi kesalahan pada jaringan! Harap periksa koneksi Anda dan coba lagi!</string>\n    <string name=\"error_loading_account_details\">Gagal memuat detail akun</string>\n    <string name=\"error_sender_account_gone\">Gagal mengirim postingan.</string>\n    <string name=\"title_mutes\">Pengguna dibisukan</string>\n    <string name=\"title_announcements\">Pengumuman</string>\n    <string name=\"post_sensitive_media_title\">Konten sensitif</string>\n    <string name=\"notification_follow_request_format\">%1$s meminta untuk mengikuti anda</string>\n    <string name=\"action_edit\">Ubah</string>\n    <string name=\"action_delete_conversation\">Hapus percakapan</string>\n    <string name=\"action_unmute\">Jangan bisukan</string>\n    <string name=\"action_mute_conversation\">Bisukan percakapan</string>\n    <string name=\"action_schedule_post\">Jadwalkan Postingan</string>\n    <string name=\"action_access_scheduled_posts\">Postingan terjadwal</string>\n    <string name=\"label_quick_reply\">Balas…</string>\n    <string name=\"dialog_message_uploading_media\">Mengunggah…</string>\n    <string name=\"dialog_mute_hide_notifications\">Sembunyikan notifikasi</string>\n    <string name=\"pref_title_appearance_settings\">Penampilan</string>\n    <string name=\"pref_title_language\">Bahasa</string>\n    <string name=\"post_text_size_smallest\">Terkecil</string>\n    <string name=\"notification_favourite_name\">Favorit</string>\n    <string name=\"post_media_images\">Gambar</string>\n    <string name=\"add_account_name\">Tambah Akun</string>\n    <string name=\"error_create_list\">Tidak dapat membuat daftar</string>\n    <string name=\"later\">Nanti</string>\n    <string name=\"error_failed_app_registration\">Gagal mengautentikasi dengan instance tersebut. Jika ini berlanjut, coba Masuk di Browser dari menu.</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Tulis Postingan</string>\n    <string name=\"error_media_upload_image_or_video\">Gambar dan video tidak dapat disematkan ke dalam post yang sama.</string>\n    <string name=\"title_public_federated\">Federasi</string>\n    <string name=\"title_follow_requests\">Permintaan mengikuti</string>\n    <string name=\"post_boosted_format\">%1$s ter-boost</string>\n    <string name=\"post_content_show_more\">Meluaskan</string>\n    <string name=\"footer_empty\">Tidak ada apapun di sini. Tarik ke bawah untuk menyegarkan!</string>\n    <string name=\"notification_reblog_format\">%1$s telah meng-boost post mu</string>\n    <string name=\"notification_favourite_format\">%1$s memfavoritkan post mu</string>\n    <string name=\"notification_sign_up_format\">%1$s mendaftar</string>\n    <string name=\"notification_subscription_format\">%1$s baru saja memosting</string>\n    <string name=\"notification_update_format\">%1$s mengedit post mereka</string>\n    <string name=\"report_comment_hint\">Komentar tambahan?</string>\n    <string name=\"action_reply\">Balas</string>\n    <string name=\"action_quick_reply\">Balas Cepat</string>\n    <string name=\"action_reblog\">Boost</string>\n    <string name=\"action_unreblog\">Hapus boost</string>\n    <string name=\"action_favourite\">Favorit</string>\n    <string name=\"action_unfavourite\">Hapus favorit</string>\n    <string name=\"action_unbookmark\">Hapus bookmark</string>\n    <string name=\"action_more\">Lebih</string>\n    <string name=\"action_compose\">Menyusun</string>\n    <string name=\"action_login\">Masuk dengan Mastodon</string>\n    <string name=\"action_logout\">Keluar</string>\n    <string name=\"action_logout_confirm\">Apakah kamu yakin ingin keluar dari akun %1$s?</string>\n    <string name=\"action_hide_reblogs\">Sembunyikan boost</string>\n    <string name=\"action_show_reblogs\">Tampilkan boost</string>\n    <string name=\"action_view_domain_mutes\">Domain tersembunyi</string>\n    <string name=\"action_view_follow_requests\">Permintaan mengikuti</string>\n    <string name=\"action_add_poll\">Tambah pemilihan</string>\n    <string name=\"action_mention\">Sebut</string>\n    <string name=\"action_hide_media\">Sembunyikan media</string>\n    <string name=\"action_open_drawer\">Buka laci</string>\n    <string name=\"action_delete_and_redraft\">Hapus dan draf ulang</string>\n    <string name=\"action_share_as\">Bagikan sebagai…</string>\n    <string name=\"send_post_link_to\">Bagikan URL post kepada…</string>\n    <string name=\"action_toggle_visibility\">Visibilitas post</string>\n    <string name=\"send_post_content_to\">Bagikan post kepada…</string>\n    <string name=\"hint_content_warning\">Peringatan konten</string>\n    <string name=\"hint_display_name\">Nama tampilan</string>\n    <string name=\"action_content_warning\">Peringatan konten</string>\n    <string name=\"action_emoji_keyboard\">Papan ketik Emoji</string>\n    <string name=\"action_add_tab\">Tambah Tab</string>\n    <string name=\"action_hashtags\">Hashtag</string>\n    <string name=\"action_open_reblogger\">Buka penulis boost</string>\n    <string name=\"action_open_reblogged_by\">Tampilkan boost</string>\n    <string name=\"action_open_faved_by\">Tampilkan favorit</string>\n    <string name=\"action_dismiss\">Menolak</string>\n    <string name=\"title_hashtags_dialog\">Hashtag</string>\n    <string name=\"title_links_dialog\">Tautan</string>\n    <string name=\"action_open_media_n\">Buka media #%1$d</string>\n    <string name=\"action_open_as\">Buka sebagai %1$s</string>\n    <string name=\"send_media_to\">Bagikan media kepada…</string>\n    <string name=\"confirmation_unblocked\">Pengguna ter-unblock</string>\n    <string name=\"hint_domain\">Instansi yang mana?</string>\n    <string name=\"hint_note\">Bio</string>\n    <string name=\"search_no_results\">Tidak ada hasil</string>\n    <string name=\"link_whats_an_instance\">Apa itu instansi?</string>\n    <string name=\"dialog_download_image\">Unduh</string>\n    <string name=\"dialog_message_cancel_follow_request\">Tarik kembali permintaan mengikuti?</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Sembunyikan keseluruhan domain</string>\n    <string name=\"visibility_public\">Publik: Post untuk linimasa publik</string>\n    <string name=\"visibility_unlisted\">Tak terdaftar: Jangan tampilkan di linimasa publik</string>\n    <string name=\"visibility_private\">Hanya pengikut: Post hanya untuk pengikut</string>\n    <string name=\"visibility_direct\">Langsung: Post kepada pengguna yang disebut saja</string>\n    <string name=\"pref_title_edit_notification_settings\">Pemberitahuan</string>\n    <string name=\"pref_title_notifications_enabled\">Pemberitahuan</string>\n    <string name=\"pref_title_notification_alerts\">Peringatan</string>\n    <string name=\"action_add_reaction\">tambah reaksi</string>\n    <string name=\"dialog_unfollow_warning\">Unfollow akun ini?</string>\n    <string name=\"dialog_delete_post_warning\">Hapus post ini?</string>\n    <string name=\"dialog_redraft_post_warning\">Hapus dan draf ulang post ini?</string>\n    <string name=\"pref_title_notification_filters\">Beritahu saya ketika</string>\n    <string name=\"error_following_hashtags_unsupported\">Instance ini tidak mendukung hashtag berikut.</string>\n    <string name=\"error_muting_hashtag_format\">Kesalahan menonaktifkan #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Kesalahan mengaktifkan #%1$s</string>\n    <string name=\"error_status_source_load\">Gagal memuat sumber status dari server.</string>\n    <string name=\"title_public_trending_hashtags\">Hashtag yang sedang tren</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-is/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"action_login\">Skrá inn með Tusky</string>\n    <string name=\"link_whats_an_instance\">Hvað er tilvik?</string>\n    <string name=\"title_favourites\">Eftirlæti</string>\n    <string name=\"title_drafts\">Drög</string>\n    <string name=\"action_logout\">Skrá út</string>\n    <string name=\"action_view_preferences\">Kjörstillingar</string>\n    <string name=\"action_view_account_preferences\">Eiginleikar notandaaðgangs</string>\n    <string name=\"action_edit_profile\">Breyta notandasniði</string>\n    <string name=\"action_search\">Leita</string>\n    <string name=\"about_title_activity\">Um hugbúnaðinn</string>\n    <string name=\"action_lists\">Listar</string>\n    <string name=\"title_lists\">Listar</string>\n    <string name=\"error_generic\">Villa kom upp.</string>\n    <string name=\"error_network\">Villa kom upp í netkerfi. Athugaðu nettenginguna þína og prófaðu svo aftur.</string>\n    <string name=\"error_empty\">Þetta má ekki vera tómt.</string>\n    <string name=\"error_invalid_domain\">Ógilt lén sett inn</string>\n    <string name=\"error_failed_app_registration\">Mistókst að auðkenna gagnvart þessu tilviki. Ef þetta er viðvarandi skaltu prófa \\'Skrá inn í vafra\\' úr valmyndinni.</string>\n    <string name=\"error_no_web_browser_found\">Gat ekki fundið neinn vafra til að nota.</string>\n    <string name=\"error_authorization_unknown\">Óskilgreind auðkenningarvilla kom upp. Mistókst að auðkenna gagnvart þessu tilviki. Ef þetta er viðvarandi skaltu prófa \\'Skrá inn í vafra\\' úr valmyndinni.</string>\n    <string name=\"error_authorization_denied\">Heimild var hafnað. Mistókst að auðkenna gagnvart þessu tilviki. Ef þetta er viðvarandi skaltu prófa \\'Skrá inn í vafra\\' úr valmyndinni.</string>\n    <string name=\"error_retrieving_oauth_token\">Mistókst að fá innskráningarteikn. Mistókst að auðkenna gagnvart þessu tilviki. Ef þetta er viðvarandi skaltu prófa \\'Skrá inn í vafra\\' úr valmyndinni.</string>\n    <string name=\"error_compose_character_limit\">Færslan er of löng!</string>\n    <string name=\"error_media_upload_type\">Þessa tegund skrár er ekki hægt að senda inn.</string>\n    <string name=\"error_media_upload_opening\">Ekki var hægt að opna skrána.</string>\n    <string name=\"error_media_upload_permission\">Krafist er heimilda til að lesa gögn.</string>\n    <string name=\"error_media_download_permission\">Krafist er heimilda til að geyma gögn.</string>\n    <string name=\"error_media_upload_image_or_video\">Ekki er hægt að hengja bæði myndir og myndskeið við sömu færslu.</string>\n    <string name=\"error_media_upload_sending\">Innsendingin mistókst.</string>\n    <string name=\"error_sender_account_gone\">Villa við að senda færslu.</string>\n    <string name=\"title_home\">Heim</string>\n    <string name=\"title_notifications\">Tilkynningar</string>\n    <string name=\"title_public_local\">Staðvært</string>\n    <string name=\"title_public_federated\">Sameiginlegt</string>\n    <string name=\"title_direct_messages\">Bein skilaboð</string>\n    <string name=\"title_tab_preferences\">Flipar</string>\n    <string name=\"title_view_thread\">Þráður</string>\n    <string name=\"title_posts\">Færslur</string>\n    <string name=\"title_posts_with_replies\">Með svörum</string>\n    <string name=\"title_posts_pinned\">Fest</string>\n    <string name=\"title_follows\">Fylgist með</string>\n    <string name=\"title_followers\">Fylgjendur</string>\n    <string name=\"title_bookmarks\">Bókamerki</string>\n    <string name=\"title_mutes\">Þaggaðir notendur</string>\n    <string name=\"title_blocks\">Útilokaðir notendur</string>\n    <string name=\"title_domain_mutes\">Falin lén</string>\n    <string name=\"title_follow_requests\">Fylgjendabeiðnir</string>\n    <string name=\"title_edit_profile\">Breyta notandasniðinu þínu</string>\n    <string name=\"title_scheduled_posts\">Áætlaðar færslur</string>\n    <string name=\"title_licenses\">Notkunarleyfi</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s endurbirti</string>\n    <string name=\"post_sensitive_media_title\">Viðkvæmt efni</string>\n    <string name=\"post_media_hidden_title\">Myndefni er falið</string>\n    <string name=\"post_sensitive_media_directions\">Ýttu til að skoða</string>\n    <string name=\"post_content_warning_show_more\">Sýna meira</string>\n    <string name=\"post_content_warning_show_less\">Sýna minna</string>\n    <string name=\"post_content_show_more\">Fletta út</string>\n    <string name=\"post_content_show_less\">Fella saman</string>\n    <string name=\"message_empty\">Ekkert hér.</string>\n    <string name=\"footer_empty\">Ekkert hér. Togaðu niður til að endurhlaða!</string>\n    <string name=\"notification_reblog_format\">%1$s endurbirti færsluna þína</string>\n    <string name=\"notification_favourite_format\">%1$s setti færslu frá þér í eftirlæti</string>\n    <string name=\"notification_follow_format\">%1$s fylgist núna með þér</string>\n    <string name=\"report_username_format\">Kæra @%1$s</string>\n    <string name=\"report_comment_hint\">Aðrar athugasemdir?</string>\n    <string name=\"action_quick_reply\">Snöggt svar</string>\n    <string name=\"action_reply\">Svara</string>\n    <string name=\"action_reblog\">Endurbirta</string>\n    <string name=\"action_unreblog\">Fjarlægja endurbirtingu</string>\n    <string name=\"action_favourite\">Eftirlæti</string>\n    <string name=\"action_bookmark\">Bókamerki</string>\n    <string name=\"action_unfavourite\">Fjarlægja eftirlæti</string>\n    <string name=\"action_more\">Meira</string>\n    <string name=\"action_compose\">Semja skilaboð</string>\n    <string name=\"action_logout_confirm\">Ertu viss um að þú viljir skrá þig út af notandaaðgangnum %1$s? Þetta mun eyða öllum staðværum gögnum af aðgangnum, þar með talið drögum og kjörstillingum.</string>\n    <string name=\"action_follow\">Fylgja</string>\n    <string name=\"action_unfollow\">Hætta að fylgjast með</string>\n    <string name=\"action_block\">Útiloka</string>\n    <string name=\"action_unblock\">Aflétta útilokun</string>\n    <string name=\"action_hide_reblogs\">Fela endurbirtingar</string>\n    <string name=\"action_show_reblogs\">Sýna endurbirtingar</string>\n    <string name=\"action_report\">Tilkynna</string>\n    <string name=\"action_edit\">Breyta</string>\n    <string name=\"action_delete\">Eyða</string>\n    <string name=\"action_delete_and_redraft\">Eyða og endurvinna drög</string>\n    <string name=\"action_send\">BIRTA</string>\n    <string name=\"action_send_public\">BIRTA!</string>\n    <string name=\"action_retry\">Reyna aftur</string>\n    <string name=\"action_close\">Loka</string>\n    <string name=\"action_view_profile\">Notandasnið</string>\n    <string name=\"action_view_favourites\">Eftirlæti</string>\n    <string name=\"action_view_bookmarks\">Bókamerki</string>\n    <string name=\"action_view_mutes\">Þaggaðir notendur</string>\n    <string name=\"action_view_blocks\">Útilokaðir notendur</string>\n    <string name=\"action_view_domain_mutes\">Falin lén</string>\n    <string name=\"action_view_follow_requests\">Fylgjendabeiðnir</string>\n    <string name=\"action_view_media\">Myndefni</string>\n    <string name=\"action_open_in_web\">Opna í vafra</string>\n    <string name=\"action_add_media\">Bæta við myndefni</string>\n    <string name=\"action_add_poll\">Bæta við könnun</string>\n    <string name=\"action_photo_take\">Taka ljósmynd</string>\n    <string name=\"action_share\">Deila</string>\n    <string name=\"action_mute\">Þagga niður</string>\n    <string name=\"action_unmute\">Ekki þagga</string>\n    <string name=\"action_mute_domain\">Þagga niður í %1$s</string>\n    <string name=\"action_mention\">Tilvísun</string>\n    <string name=\"action_hide_media\">Fela myndefni</string>\n    <string name=\"action_open_drawer\">Opna sleða</string>\n    <string name=\"action_save\">Vista</string>\n    <string name=\"action_edit_own_profile\">Breyta</string>\n    <string name=\"action_undo\">Afturkalla</string>\n    <string name=\"action_accept\">Samþykkja</string>\n    <string name=\"action_reject\">Hafna</string>\n    <string name=\"action_access_drafts\">Drög</string>\n    <string name=\"action_access_scheduled_posts\">Áætlaðar færslur</string>\n    <string name=\"action_toggle_visibility\">Sýnileiki færslu</string>\n    <string name=\"action_content_warning\">Aðvörun vegna efnis</string>\n    <string name=\"action_emoji_keyboard\">Lyklaborð með tjáningartáknum</string>\n    <string name=\"action_schedule_post\">Tímasetja færslu</string>\n    <string name=\"action_reset_schedule\">Frumstilla</string>\n    <string name=\"action_add_tab\">Bæta við flipa</string>\n    <string name=\"action_links\">Tenglar</string>\n    <string name=\"action_mentions\">Tilvísanir</string>\n    <string name=\"action_hashtags\">Myllumerki</string>\n    <string name=\"action_open_reblogger\">Opna höfund endurbirtingar</string>\n    <string name=\"action_open_reblogged_by\">Sýna endurbirtingar</string>\n    <string name=\"action_open_faved_by\">Birta eftirlæti</string>\n    <string name=\"title_hashtags_dialog\">Myllumerki</string>\n    <string name=\"title_mentions_dialog\">Tilvísanir</string>\n    <string name=\"title_links_dialog\">Tenglar</string>\n    <string name=\"action_open_media_n\">Opna myndefni #%1$d</string>\n    <string name=\"download_image\">Sæki %1$s</string>\n    <string name=\"action_copy_link\">Afrita tengilinn</string>\n    <string name=\"action_open_as\">Opna sem %1$s</string>\n    <string name=\"action_share_as\">Deila sem …</string>\n    <string name=\"download_media\">Sækja myndefni</string>\n    <string name=\"downloading_media\">Næ í myndefni</string>\n    <string name=\"send_post_link_to\">Deila slóð á færslu til…</string>\n    <string name=\"send_post_content_to\">Deila færslu með…</string>\n    <string name=\"send_media_to\">Deila myndefni með…</string>\n    <string name=\"confirmation_reported\">Sent!</string>\n    <string name=\"confirmation_unblocked\">Hætt að útiloka notanda</string>\n    <string name=\"confirmation_unmuted\">Hætt að þagga niður í notanda</string>\n    <string name=\"confirmation_domain_unmuted\">Hætt að fela %1$s</string>\n    <string name=\"hint_domain\">Hvaða tilvik?</string>\n    <string name=\"hint_compose\">Hvað er í gangi hérna?</string>\n    <string name=\"hint_content_warning\">Aðvörun vegna efnis</string>\n    <string name=\"hint_display_name\">Birtingarnafn</string>\n    <string name=\"hint_note\">Æviágrip</string>\n    <string name=\"hint_search\">Leita…</string>\n    <string name=\"search_no_results\">Engar niðurstöður</string>\n    <string name=\"label_quick_reply\">Svara…</string>\n    <string name=\"label_avatar\">Auðkennismynd</string>\n    <string name=\"label_header\">Haus</string>\n    <string name=\"login_connection\">Tengist…</string>\n    <string name=\"dialog_whats_an_instance\">Hægt er að setja hér inn vistfang eða lén á hvaða tilviki sem er, svo sem mastodon.social, icosahedron.website, social.tchncs.de og <a href=\"https://instances.social\">fleiri!</a> \n\\n \\u0020\n\\nEf þú ert ekki ennþá með notandaaðgang, geturðu sett inn nafnið á því tilviki sem þú vilt tilheyra og búið til aðgang þar. \\u0020\n\\n \\u0020\n\\nTilvik er ákveðinn einn vefþjónn þar sem notandaaðgangurinn þinn er hýstur, en eftir sem áður er auðvelt fyrir þig að eiga í samskiptum við fólk og fylgjast með einstaklingum á öðrum tilvikum, rétt eins og þið væruð á sama vefsvæðinu. \\u0020\n\\n \\u0020\n\\nNánari upplýsingar má finna á <a href=\"https://joinmastodon.org\">joinmastodon.org</a>.</string>\n    <string name=\"dialog_title_finishing_media_upload\">Klára innsendingu myndefnis</string>\n    <string name=\"dialog_message_uploading_media\">Sendi inn…</string>\n    <string name=\"dialog_download_image\">Sækja</string>\n    <string name=\"dialog_message_cancel_follow_request\">Afturkalla beiðni um að fylgjast með?</string>\n    <string name=\"dialog_unfollow_warning\">Hætta að fylgjast með þessum aðgangi?</string>\n    <string name=\"dialog_delete_post_warning\">Eyða þessari færslu?</string>\n    <string name=\"dialog_redraft_post_warning\">Eyða og endurvinna þessa færslu?</string>\n    <string name=\"mute_domain_warning\">Ertu alveg algjörlega viss um að þú viljir loka á allt %1$s? Þú munt ekki sjá efni frá þessu léni í neinum opinberum tímalínum eða í tilkynningunum þínum. Fylgjendur þínir frá þessu léni verða fjarlægðir.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Fela allt lénið</string>\n    <string name=\"visibility_public\">Opinbert: Senda á opinberar tímalínur</string>\n    <string name=\"visibility_unlisted\">Óskráð: Ekki birt á opinberum tímalínum</string>\n    <string name=\"visibility_private\">Einungis fylgjendur: Senda einungis á fylgjendur</string>\n    <string name=\"visibility_direct\">Beint: Senda einungis á notendur sem minnst er á</string>\n    <string name=\"pref_title_edit_notification_settings\">Tilkynningar</string>\n    <string name=\"pref_title_notifications_enabled\">Tilkynningar</string>\n    <string name=\"pref_title_notification_alerts\">Aðvaranir</string>\n    <string name=\"pref_title_notification_alert_sound\">Aðvara með hljóði</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Aðvara með titringi</string>\n    <string name=\"pref_title_notification_alert_light\">Aðvara með ljósi</string>\n    <string name=\"pref_title_notification_filters\">Virkar tegundir tilkynninga</string>\n    <string name=\"pref_title_appearance_settings\">Útlit</string>\n    <string name=\"pref_title_app_theme\">Þema forrits</string>\n    <string name=\"pref_title_timelines\">Tímalínur</string>\n    <string name=\"pref_title_timeline_filters\">Síur</string>\n    <string name=\"app_them_dark\">Dökkt</string>\n    <string name=\"app_theme_light\">Ljóst</string>\n    <string name=\"app_theme_black\">Svart</string>\n    <string name=\"app_theme_auto\">Sjálfvirkt við sólarlag</string>\n    <string name=\"app_theme_system\">Nota kerfishönnun</string>\n    <string name=\"pref_title_browser_settings\">Vafri</string>\n    <string name=\"pref_title_custom_tabs\">Nota sérsniðna flipa Chrome</string>\n    <string name=\"pref_title_language\">Tungumál</string>\n    <string name=\"pref_title_bot_overlay\">Birta merki á róbótum</string>\n    <string name=\"pref_title_animate_gif_avatars\">Sýna hreyfingar GIF-auðkennismynda</string>\n    <string name=\"pref_title_post_filter\">Síun tímalínu</string>\n    <string name=\"pref_title_post_tabs\">Heimatímalína</string>\n    <string name=\"pref_title_show_boosts\">Sýna endurbirtingar</string>\n    <string name=\"pref_title_show_replies\">Sýna svör</string>\n    <string name=\"pref_title_show_media_preview\">Sækja forskoðanir á myndefni</string>\n    <string name=\"pref_title_proxy_settings\">Milliþjónn</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP-milliþjónn</string>\n    <string name=\"pref_title_http_proxy_enable\">Virkja HTTP-milliþjón</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP-milliþjónn (proxy)</string>\n    <string name=\"pref_title_http_proxy_port\">Gátt HTTP milliþjóns (vefsels)</string>\n    <string name=\"pref_default_post_privacy\">Gagnaleynd færslna (samstillt við netþjón)</string>\n    <string name=\"pref_default_media_sensitivity\">Alltaf merkja myndefni sem viðkvæmt (samstillt við netþjón)</string>\n    <string name=\"pref_publishing\">Sjálfgefnar stillingar færslna</string>\n    <string name=\"pref_failed_to_sync\">Mistókst að samstilla kjörstillingar</string>\n    <string name=\"post_privacy_public\">Opinbert</string>\n    <string name=\"post_privacy_unlisted\">Óskráð</string>\n    <string name=\"post_privacy_followers_only\">Einungis fylgjendur</string>\n    <string name=\"pref_post_text_size\">Textastærð stöðufærslu</string>\n    <string name=\"post_text_size_smallest\">Minnstu</string>\n    <string name=\"post_text_size_small\">Lítið</string>\n    <string name=\"post_text_size_medium\">Miðlungs</string>\n    <string name=\"post_text_size_large\">Stórt</string>\n    <string name=\"post_text_size_largest\">Stærst</string>\n    <string name=\"notification_mention_name\">Nýjar tilvísanir</string>\n    <string name=\"notification_mention_descriptions\">Tilkynningar um nýjar tilvísanir</string>\n    <string name=\"notification_follow_name\">Nýir fylgjendur</string>\n    <string name=\"notification_follow_description\">Tilkynningar um nýja fylgjendur</string>\n    <string name=\"notification_boost_name\">Endurbirtingar</string>\n    <string name=\"notification_boost_description\">Tilkynningar þegar færslurnar þínar eru endurbirtar</string>\n    <string name=\"notification_favourite_name\">Eftirlæti</string>\n    <string name=\"notification_favourite_description\">Tilkynningar þegar færslurnar þínar eru settar í eftirlæti</string>\n    <string name=\"notification_poll_name\">Niðurstöður könnunar</string>\n    <string name=\"notification_poll_description\">Tilkynningar um kannanir sem er lokið</string>\n    <string name=\"notification_mention_format\">%1$s minntist á þig</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s og %4$d til viðbótar</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s og %3$s</string>\n    <string name=\"notification_summary_small\">%1$s og %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d ný aðgerð</item>\n        <item quantity=\"other\">%1$d nýjar aðgerðir</item>\n    </plurals>\n    <string name=\"description_account_locked\">Læstur notandaaðgangur</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_powered_by_tusky\">Keyrir á Tusky</string>\n    <string name=\"about_tusky_license\">Tusky er frjáls hugbúnaður með opinn grunnkóða. Hann er gefinn út með GNU General Public notkunarleyfi, útgáfu 3. Þú getur skoðað notkunarleyfið hér: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <string name=\"about_project_site\">Vefsvæði verkefnisins: https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Villutilkynningar og beiðnir um nýja eiginleika:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Notandasnið Tusky</string>\n    <string name=\"post_share_content\">Deila efni úr færslu</string>\n    <string name=\"post_share_link\">Deila tengli á færslu</string>\n    <string name=\"post_media_images\">Myndir</string>\n    <string name=\"post_media_video\">Myndskeið</string>\n    <string name=\"state_follow_requested\">Beðið um að fylgja</string>\n    <string name=\"abbreviated_in_years\">eftir %1$dár</string>\n    <string name=\"abbreviated_in_days\">eftir %1$dd</string>\n    <string name=\"abbreviated_in_hours\">eftir %1$dklst</string>\n    <string name=\"abbreviated_in_minutes\">eftir %1$dm</string>\n    <string name=\"abbreviated_in_seconds\">eftir %1$ds</string>\n    <string name=\"abbreviated_years_ago\">%1$dár</string>\n    <string name=\"abbreviated_days_ago\">%1$dd</string>\n    <string name=\"abbreviated_hours_ago\">%1$dklst</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"follows_you\">Fylgir þér</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Alltaf birta myndefni sem merkt er viðkvæmt</string>\n    <string name=\"pref_title_alway_open_spoiler\">Alltaf fletta út færslum sem eru með aðvörun vegna efnis</string>\n    <string name=\"title_media\">Gagnaskrár</string>\n    <string name=\"replying_to\">Svar til @%1$s</string>\n    <string name=\"load_more_placeholder_text\">Hlaða inn fleiru</string>\n    <string name=\"pref_title_public_filter_keywords\">Opinberar tímalínur</string>\n    <string name=\"pref_title_thread_filter_keywords\">Samtöl</string>\n    <string name=\"filter_addition_title\">Bæta við síu</string>\n    <string name=\"filter_edit_title\">Breyta síu</string>\n    <string name=\"filter_dialog_remove_button\">Fjarlægja</string>\n    <string name=\"filter_dialog_update_button\">Uppfæra</string>\n    <string name=\"filter_dialog_whole_word\">Heil orð</string>\n    <string name=\"filter_dialog_whole_word_description\">Þegar stikkorð eða frasi er einungis tölur og bókstafir, verður það aðeins notað ef það samsvarar heilu orði</string>\n    <string name=\"filter_add_description\">Frasi sem á að sía</string>\n    <string name=\"add_account_name\">Bæta við aðgang</string>\n    <string name=\"add_account_description\">Bæta við nýjum Mastodon-aðgangi</string>\n    <string name=\"error_create_list\">Ekki tókst að búa til lista</string>\n    <string name=\"error_rename_list\">Ekki tókst að uppfæra lista</string>\n    <string name=\"error_delete_list\">Ekki tókst að eyða lista</string>\n    <string name=\"action_create_list\">Búa til lista</string>\n    <string name=\"action_rename_list\">Uppfæra lista</string>\n    <string name=\"action_delete_list\">Eyða lista</string>\n    <string name=\"hint_search_people_list\">Leita að fólki sem þú fylgist með</string>\n    <string name=\"action_add_to_list\">Bæta notandaaðgangi á listann</string>\n    <string name=\"action_remove_from_list\">Fjarlægja notandaaðganginn af listanum</string>\n    <string name=\"compose_active_account_description\">Sendi sem %1$s</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Lýstu þessu fyrir sjónskerta (hámark %1$d stafur)</item>\n        <item quantity=\"other\">Lýstu þessu fyrir sjónskerta (hámark %1$d stafir)</item>\n    </plurals>\n    <string name=\"action_set_caption\">Setja skýringatexta</string>\n    <string name=\"action_remove\">Fjarlægja</string>\n    <string name=\"lock_account_label\">Læsa notandaaðgangi</string>\n    <string name=\"lock_account_label_description\">Krefst þess að þú samþykkir fylgjendur handvirkt</string>\n    <string name=\"compose_save_draft\">Vista drög?</string>\n    <string name=\"send_post_notification_title\">Sendi færslu…</string>\n    <string name=\"send_post_notification_error_title\">Villa við að senda færslu</string>\n    <string name=\"send_post_notification_channel_name\">Sendi færslur</string>\n    <string name=\"send_post_notification_cancel_title\">Aflýsti sendingu</string>\n    <string name=\"send_post_notification_saved_content\">Afrit af færslunni hefur verið vistað í drögunum þínum</string>\n    <string name=\"action_compose_shortcut\">Semja skilaboð</string>\n    <string name=\"error_no_custom_emojis\">Tilvikið þitt %1$s er ekki með nein sérsniðin tjáningartákn</string>\n    <string name=\"emoji_style\">Stíll tjáningartákna</string>\n    <string name=\"system_default\">Sjálfgefið í kerfinu</string>\n    <string name=\"download_fonts\">Þú þarft fyrst að ná í þessi táknmyndasett</string>\n    <string name=\"performing_lookup_title\">Framkvæmi uppflettingu…</string>\n    <string name=\"expand_collapse_all_posts\">Þenja út / Fella saman allar stöðufærslur</string>\n    <string name=\"action_open_post\">Opna færslu</string>\n    <string name=\"restart_required\">Endurræsing forrits er nauðsynleg</string>\n    <string name=\"restart_emoji\">Það þarf að endurræsa Tusky til að breytingarnar taki gildi</string>\n    <string name=\"later\">Seinna</string>\n    <string name=\"restart\">Endurræsa</string>\n    <string name=\"caption_systememoji\">Sjálfgefið táknmyndasett á tækinu þínu</string>\n    <string name=\"caption_blobmoji\">Blob-táknmyndasettið sem þekkt var í Android 4.4–7.1</string>\n    <string name=\"caption_twemoji\">Staðlaða Mastodon táknmyndasettið</string>\n    <string name=\"caption_notoemoji\">Núverandi táknmyndasett Google</string>\n    <string name=\"download_failed\">Niðurhal mistókst</string>\n    <string name=\"profile_badge_bot_text\">Róbót</string>\n    <string name=\"account_moved_description\">%1$s hefur verið flutt á:</string>\n    <string name=\"reblog_private\">Endurbirta til upphaflegra lesenda</string>\n    <string name=\"unreblog_private\">Taka úr endurbirtingu</string>\n    <string name=\"license_description\">Tusky inniheldur kóða og gögn frá eftirfarandi verkefnum með opinn grunnkóða:</string>\n    <string name=\"license_apache_2\">Notkunarleyfi er samkvæmt Apache hugbúnaðarleyfinu (afrit fyrir neðan)</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">Lýsigögn notandasniðs</string>\n    <string name=\"profile_metadata_add\">bæta við gögnum</string>\n    <string name=\"profile_metadata_label_label\">Merking</string>\n    <string name=\"profile_metadata_content_label\">Efni</string>\n    <string name=\"pref_title_absolute_time\">Nota algildan tíma</string>\n    <string name=\"label_remote_account\">Ekki er víst að upplýsingarnar hér að neðan endurspegli notandasniðið að fullu. Opnaðu fullt notandasnið í vafra.</string>\n    <string name=\"unpin_action\">Losa</string>\n    <string name=\"pin_action\">Festa</string>\n    <string name=\"title_reblogged_by\">Endurbirt af</string>\n    <string name=\"title_favourited_by\">Sett í eftirlæti af</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s og %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s og %3$d til viðbótar</string>\n    <string name=\"description_post_media\">Myndefni: %1$s</string>\n    <string name=\"description_post_cw\">Aðvörun vegna efnis: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Engin lýsing</string>\n    <string name=\"description_post_reblogged\">Endurbloggað</string>\n    <string name=\"description_post_favourited\">Í eftirlætum</string>\n    <string name=\"description_post_bookmarked\">Bókamerkt</string>\n    <string name=\"description_visibility_public\">Opinbert</string>\n    <string name=\"description_visibility_unlisted\">Óskráð</string>\n    <string name=\"description_visibility_private\">Fylgjendur</string>\n    <string name=\"description_visibility_direct\">Beint</string>\n    <string name=\"description_poll\">Könnun með valkostunum: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"hint_list_name\">Heiti á lista</string>\n    <string name=\"pick_hashtag_hint\">Myllumerki án #</string>\n    <string name=\"select_list_title\">Veldu lista</string>\n    <string name=\"list\">Listi</string>\n    <string name=\"notifications_clear\">Eyða</string>\n    <string name=\"notifications_apply_filter\">Sía</string>\n    <string name=\"filter_apply\">Virkja</string>\n    <string name=\"compose_shortcut_long_label\">Semja færslu</string>\n    <string name=\"compose_shortcut_short_label\">Semja skilaboð</string>\n    <string name=\"notification_clear_text\">Ertu viss um að þú viljir endanlega eyða öllum tilkynningunum þínum?</string>\n    <string name=\"compose_preview_image_description\">Aðgerðir fyrir mynd %1$s</string>\n    <string name=\"poll_info_format\">%1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s atkvæði</item>\n        <item quantity=\"other\">%1$s atkvæði</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">lýkur %1$s</string>\n    <string name=\"poll_info_closed\">lokað</string>\n    <string name=\"poll_vote\">Greiða atkvæði</string>\n    <string name=\"poll_ended_voted\">Könnun sem þú tókst þátt í er lokið</string>\n    <string name=\"poll_ended_created\">Könnuninni þinni er lokið</string>\n    <string name=\"button_continue\">Halda áfram</string>\n    <string name=\"button_back\">Til baka</string>\n    <string name=\"button_done\">Lokið</string>\n    <string name=\"report_sent_success\">Tókst að kæra @%1$s</string>\n    <string name=\"hint_additional_info\">Aðrar athugasemdir</string>\n    <string name=\"report_remote_instance\">Áframsenda til %1$s</string>\n    <string name=\"failed_report\">Mistókst að kæra</string>\n    <string name=\"failed_fetch_posts\">Mistókst að sækja stöðufærslur</string>\n    <string name=\"report_description_1\">Kæran verður send á umsjónarmenn vefþjónsins þíns. Þú getur gefið skýringu hér fyrir neðan á því af hverju þú ert að kæra þennan notandaaðgang:</string>\n    <string name=\"report_description_remote_instance\">Notandaaðgangurinn er af öðrum vefþjóni. Á einnig að senda nafnlaust afrit af kærunni þangað?</string>\n    <string name=\"title_accounts\">Notandaaðgangar</string>\n    <string name=\"failed_search\">Tókst ekki að leita</string>\n    <string name=\"create_poll_title\">Athuga</string>\n    <string name=\"duration_5_min\">5 mínútur</string>\n    <string name=\"duration_30_min\">30 mínútur</string>\n    <string name=\"duration_1_hour\">1 klukkustund</string>\n    <string name=\"duration_6_hours\">6 klukkustundir</string>\n    <string name=\"duration_1_day\">1 dagur</string>\n    <string name=\"duration_3_days\">3 dagar</string>\n    <string name=\"duration_7_days\">7 dagar</string>\n    <string name=\"add_poll_choice\">Bæta við valkosti</string>\n    <string name=\"poll_allow_multiple_choices\">Margir valkostir</string>\n    <string name=\"poll_new_choice_hint\">Valkostur %1$d</string>\n    <string name=\"edit_poll\">Breyta</string>\n    <string name=\"post_lookup_error_format\">Villa við að fletta upp færslunni %1$s</string>\n    <string name=\"no_drafts\">Þú ert ekki með nein drög.</string>\n    <string name=\"no_scheduled_posts\">Þú ert ekki með neinar áætlaðar stöðufærslur.</string>\n    <string name=\"warning_scheduling_interval\">Mastodon er með 5 mínútna lágmarksbil fyrir áætlaðar aðgerðir.</string>\n    <string name=\"notification_follow_request_name\">Fylgjendabeiðnir</string>\n    <string name=\"hashtags\">Myllumerki</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\">%1$s eftirlæti</item>\n        <item quantity=\"other\">%1$s eftirlæti</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\">%1$s endurbirting</item>\n        <item quantity=\"other\">%1$s endurbirtingar</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d sekúnda eftir</item>\n        <item quantity=\"other\">%1$d sekúndur eftir</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d mínúta eftir</item>\n        <item quantity=\"other\">%1$d mínútur eftir</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d klukkustund eftir</item>\n        <item quantity=\"other\">%1$d klukkustundir eftir</item>\n    </plurals>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d dagur eftir</item>\n        <item quantity=\"other\">%1$d dagar eftir</item>\n    </plurals>\n    <string name=\"account_note_saved\">Vistað!</string>\n    <string name=\"account_note_hint\">Þín eigin einkaathugasemd um þennan aðgang</string>\n    <string name=\"pref_title_hide_top_toolbar\">Fela titil á verkfærastikunni efst</string>\n    <string name=\"pref_title_confirm_reblogs\">Birta staðfestingu áður en endurbirting fer fram</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Birta forskoðun tengla á tímalínum</string>\n    <string name=\"no_announcements\">Það eru engar tilkynningar.</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Virkja strokuhreyfingu til að skipta milli flipa</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s aðili</item>\n        <item quantity=\"other\">%1$s aðilar</item>\n    </plurals>\n    <string name=\"add_hashtag_title\">Bæta við myllumerki</string>\n    <string name=\"notification_follow_request_description\">Tilkynningar um fylgjendabeiðnir</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Neðst</string>\n    <string name=\"pref_main_nav_position_option_top\">Efst</string>\n    <string name=\"pref_main_nav_position\">Aðalstaða leiðsagnar</string>\n    <string name=\"pref_title_gradient_for_media\">Birta litstigla í stað falins myndefnis</string>\n    <string name=\"dialog_mute_hide_notifications\">Fela tilkynningar</string>\n    <string name=\"dialog_mute_warning\">Þagga niður í @%1$s?</string>\n    <string name=\"dialog_block_warning\">Loka á @%1$s?</string>\n    <string name=\"action_unmute_conversation\">Hætta að þagga niður í samtali</string>\n    <string name=\"action_mute_conversation\">Þagga niður í samtali</string>\n    <string name=\"action_unmute_domain\">Afþagga %1$s</string>\n    <string name=\"action_unmute_desc\">Afþagga %1$s</string>\n    <string name=\"notification_follow_request_format\">%1$s bað um að fylgjast með þér</string>\n    <string name=\"title_announcements\">Tilkynningar</string>\n    <string name=\"wellbeing_mode_notice\">Sumar upplýsingar sem gætu haft áhrif á andlega vellíðan þína verða faldar. Þetta hefur áhrif á:\n\\n\n\\n - Eftirlæti/Endurbirtingar/Tilkynningar um fylgjendabeiðnir\n\\n - Eftirlæti/Talningu á endurbirtingum færslna\n\\n - Fylgjendur/Tölfræði færslna í notendasniðum\n\\n\n\\n Þetta hefur ekki áhrif á ýti-tilkynningar, en þú getur yfirfarið handvirkt kjörstillingar þínar varðandi tilkynningar.</string>\n    <string name=\"action_unsubscribe_account\">Segja upp áskrift</string>\n    <string name=\"action_subscribe_account\">Gerast áskrifandi</string>\n    <string name=\"pref_title_animate_custom_emojis\">Hreyfa sérsniðin tjáningartákn</string>\n    <string name=\"drafts_post_reply_removed\">Færslan sem þú gerðir drög að svari við hefur verið fjarlægð</string>\n    <string name=\"draft_deleted\">Eyddi drögum</string>\n    <string name=\"drafts_failed_loading_reply\">Mistókst að hlaða inn svarupplýsingum</string>\n    <string name=\"drafts_post_failed_to_send\">Mistókst að senda þessa færslu!</string>\n    <string name=\"post_media_attachments\">Viðhengi</string>\n    <string name=\"post_media_audio\">Hljóð</string>\n    <string name=\"dialog_delete_list_warning\">Ertu viss um að þú viljir eyða %1$s listanum?</string>\n    <string name=\"duration_indefinite\">Ótiltekið</string>\n    <string name=\"label_duration\">Tímalengd</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Þú getur ekki sent inn fleiri en %1$d myndefnisviðhengi.</item>\n        <item quantity=\"other\">Þú getur ekki sent inn fleiri en %1$d myndefnisviðhengi.</item>\n    </plurals>\n    <string name=\"wellbeing_hide_stats_profile\">Fela magntölfræði notendasniða</string>\n    <string name=\"wellbeing_hide_stats_posts\">Fela magntölfræði færslna</string>\n    <string name=\"limit_notifications\">Takmarka tilkynningar á tímalínu</string>\n    <string name=\"review_notifications\">Yfirfara tilkynningar</string>\n    <string name=\"pref_title_wellbeing_mode\">Vellíðan</string>\n    <string name=\"notification_subscription_description\">Tilkynningar þegar einhver sem þú ert áskrifandi að hefur birt nýja færslu</string>\n    <string name=\"notification_subscription_name\">Nýjar færslur</string>\n    <string name=\"notification_subscription_format\">%1$s sendi inn rétt í þessu</string>\n    <string name=\"follow_requests_info\">Jafnvel þótt aðgangurinn þinn sé ekki læstur, fannst starfsfólki %1$s að þú gætir viljað yfirfara handvirkt fylgjendabeiðnir frá þessum aðgöngum.</string>\n    <string name=\"action_unbookmark\">Fjarlægja bókamerki</string>\n    <string name=\"pref_title_confirm_favourites\">Birta staðfestingu áður en sett er í eftirlæti</string>\n    <string name=\"dialog_delete_conversation_warning\">Eyða þessu samtali?</string>\n    <string name=\"action_delete_conversation\">Eyða samtali</string>\n    <string name=\"duration_30_days\">30 dagar</string>\n    <string name=\"duration_60_days\">60 dagar</string>\n    <string name=\"duration_90_days\">90 dagar</string>\n    <string name=\"duration_180_days\">180 dagar</string>\n    <string name=\"duration_365_days\">365 dagar</string>\n    <string name=\"duration_14_days\">14 dagar</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Semja færslu</string>\n    <string name=\"notification_sign_up_format\">%1$s skráði sig</string>\n    <string name=\"notification_update_format\">%1$s breytti færslunni sinni</string>\n    <string name=\"notification_sign_up_name\">Nýskráningar</string>\n    <string name=\"notification_sign_up_description\">Tilkynningar um nýja notendur</string>\n    <string name=\"notification_update_name\">Breytingar á færslum</string>\n    <string name=\"notification_update_description\">Tilkynningar þegar færslum sem þú hefur átt við er breytt</string>\n    <string name=\"account_date_joined\">Skráði sig %1$s</string>\n    <string name=\"title_login\">Skrá inn</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"error_could_not_load_login_page\">Gat ekki lesið innskráningarsíðuna.</string>\n    <string name=\"action_edit_image\">Breyta mynd</string>\n    <string name=\"saving_draft\">Vista drög…</string>\n    <string name=\"action_dismiss\">Afgreiða</string>\n    <string name=\"action_details\">Nánar</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"error_multimedia_size_limit\">Myndskeiða- og hljóðskrár geta ekki verið stærri en %1$s MB.</string>\n    <string name=\"description_post_language\">Tungumál færslu</string>\n    <string name=\"duration_no_change\">(engin breyting)</string>\n    <string name=\"error_following_hashtag_format\">Villa við að fylgjast með #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Villa við að hætta að fylgjast með #%1$s</string>\n    <string name=\"error_loading_account_details\">Mistókst að hlaða inn nánari upplýsingum notandaaðgangs</string>\n    <string name=\"error_image_edit_failed\">Ekki var hægt að breyta myndinni.</string>\n    <string name=\"delete_scheduled_post_warning\">Eyða þessari áætluðu færslu?</string>\n    <string name=\"instance_rule_title\">Reglur %1$s</string>\n    <string name=\"instance_rule_info\">Með því að skrá þig inn samþykkir þú reglurnar á %1$s.</string>\n    <string name=\"action_add_reaction\">bæta við viðbrögðum</string>\n    <string name=\"set_focus_description\">Ýttu eða dragðu hringinn til að setja virknistað sem verður ævinlega sýnilegur í smámyndum.</string>\n    <string name=\"compose_save_draft_loses_media\">Vista drög? (Viðhengi verða send inn aftur þegar þú endurheimtir drögin.)</string>\n    <string name=\"failed_to_pin\">Mistókst að festa</string>\n    <string name=\"failed_to_unpin\">Mistókst að losa</string>\n    <string name=\"pref_show_self_username_always\">Alltaf</string>\n    <string name=\"pref_show_self_username_disambiguate\">Þegar er skráð inn á mörgum aðgöngum</string>\n    <string name=\"action_set_focus\">Setja virknistað</string>\n    <string name=\"pref_show_self_username_never\">Aldrei</string>\n    <string name=\"pref_title_show_self_username\">Birta notandanafn á verkfærastikum</string>\n    <string name=\"action_add_or_remove_from_list\">Bæta við eða fjarlægja af lista</string>\n    <string name=\"failed_to_add_to_list\">Mistókst að bæta notandaaðgangnum á listann</string>\n    <string name=\"failed_to_remove_from_list\">Mistókst að fjarlægja notandaaðganginn af listanum</string>\n    <string name=\"no_lists\">Þú ert ekki með neina lista.</string>\n    <string name=\"pref_default_post_language\">Tungumál færslna (samstillt við netþjón)</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"error_following_hashtags_unsupported\">Þessi netþjónn styður ekki að fylgst sé með myllumerkjum.</string>\n    <string name=\"title_followed_hashtags\">Myllumerki sem fylgst er með</string>\n    <string name=\"status_created_at_now\">núna</string>\n    <string name=\"action_unfollow_hashtag_format\">Hætta að fylgjast með #%1$s?</string>\n    <string name=\"notification_report_format\">Ný kæra vegna %1$s</string>\n    <string name=\"notification_header_report_format\">%1$s kærði %2$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d færslur viðhengdar</string>\n    <string name=\"post_edited\">Breytti %1$s</string>\n    <string name=\"confirmation_hashtag_unfollowed\">Hætt að fylgjast með #%1$s</string>\n    <string name=\"notification_report_name\">Kærur</string>\n    <string name=\"notification_report_description\">Tilkynningar um kærur umsjónarmanna</string>\n    <string name=\"description_post_edited\">Breytti</string>\n    <string name=\"report_category_violation\">Brot á reglu</string>\n    <string name=\"report_category_spam\">Ruslpóstur</string>\n    <string name=\"report_category_other\">Annað</string>\n    <string name=\"error_muting_hashtag_format\">Villa við að þagga niður í #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Villa við að hætta að þagga niður í #%1$s</string>\n    <string name=\"hint_media_description_missing\">Myndefni ætti að vera með lýsingu.</string>\n    <string name=\"pref_title_http_proxy_port_message\">Gáttin ætti að vera á milli %1$d og %2$d</string>\n    <string name=\"error_status_source_load\">Mistókst að hlaða inn uppruna stöðufærslu af netþjóninum.</string>\n    <string name=\"a11y_label_loading_thread\">Hleð inn þræði</string>\n    <string name=\"pref_title_reading_order\">Lestrarröð</string>\n    <string name=\"pref_reading_order_oldest_first\">Elsta fyrst</string>\n    <string name=\"pref_reading_order_newest_first\">Nýjasta fyrst</string>\n    <string name=\"compose_unsaved_changes\">Þú ert með óvistaðar breytingar.</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Óvirkt</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;ekki stillt&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;ógilt&gt;</string>\n    <string name=\"title_edits\">Breytingar</string>\n    <string name=\"status_created_info\">%1$s bjó til</string>\n    <string name=\"status_edit_info\">%1$s breytti</string>\n    <string name=\"post_media_alt\">TEXTI</string>\n    <string name=\"action_discard\">Henda breytingum</string>\n    <string name=\"action_continue_edit\">Halda breytingum áfram</string>\n    <string name=\"action_share_account_link\">Deila tengli á notandaaðgang</string>\n    <string name=\"action_share_account_username\">Deila notandanafni aðgangs</string>\n    <string name=\"send_account_link_to\">Deila slóð aðgangs til…</string>\n    <string name=\"send_account_username_to\">Deila notandanafni aðgangs til…</string>\n    <string name=\"account_username_copied\">Notandanafn afritað</string>\n    <string name=\"mute_notifications_switch\">Þagga tilkynningar</string>\n    <string name=\"title_public_trending_hashtags\">Vinsæl myllumerki</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d manns eru að tala um myllumerkið %2$s</string>\n    <string name=\"action_post_failed\">Innsending mistókst</string>\n    <string name=\"action_post_failed_show_drafts\">Birta drög</string>\n    <string name=\"action_post_failed_do_nothing\">Afgreiða</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Ekki tókst að senda inn færsluna þína og hefur hún verið vistuð í Drög.\n\\n\n\\nAnnað hvort náðist ekki í netþjóninn, eða hann hafnaði færslunni.</item>\n        <item quantity=\"other\">Ekki tókst að senda inn færslurnar þína og hafa þær verið vistaðar í Drög.\n\\n\n\\nAnnað hvort náðist ekki í netþjóninn, eða hann hafnaði færslunum.</item>\n    </plurals>\n    <string name=\"action_browser_login\">Skrá inn í vafra</string>\n    <string name=\"description_login\">Virkar í flestum tilvikum. Engum gögnum er lekið til annarra forrita.</string>\n    <string name=\"description_browser_login\">Gæti stutt fleiri aðferðir til auðkenningar, en krefst studds vafra.</string>\n    <string name=\"total_usage\">Heildarnotkun</string>\n    <string name=\"total_accounts\">Aðgangar alls</string>\n    <string name=\"dialog_follow_hashtag_title\">Fylgjast með myllumerki</string>\n    <string name=\"notification_unknown_name\">Óþekkt</string>\n    <string name=\"action_refresh\">Endurlesa</string>\n    <string name=\"status_filtered_show_anyway\">Birta samt</string>\n    <string name=\"status_filter_placeholder_label_format\">Síað: %1$s</string>\n    <string name=\"pref_title_account_filter_keywords\">Notendasnið</string>\n    <string name=\"pref_title_show_stat_inline\">Sýna tölfræði færslu í tímalínu</string>\n    <string name=\"ui_error_favourite\">Mistókst að setja færslu í eftirlæti: %1$s</string>\n    <string name=\"ui_error_reblog\">Mistókst að endurbirta færslu: %1$s</string>\n    <string name=\"ui_error_vote\">Mistókst að greiða atkvæði í könnun: %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">Mistókst að samþykkja fylgjendabeiðni: %1$s</string>\n    <string name=\"hint_filter_title\">Sían mín</string>\n    <string name=\"label_filter_title\">Titill</string>\n    <string name=\"filter_action_warn\">Aðvörun</string>\n    <string name=\"filter_action_hide\">Fela</string>\n    <string name=\"filter_description_warn\">Fela alla færsluna með aðvörun</string>\n    <string name=\"filter_description_hide\">Fela alveg</string>\n    <string name=\"ui_error_bookmark\">Mistókst að bókamerkja færslu: %1$s</string>\n    <string name=\"socket_timeout_exception\">Rann út á tíma við að tengjast netþjóninum þínum</string>\n    <string name=\"ui_error_unknown\">óþekkt ástæða</string>\n    <string name=\"ui_error_clear_notifications\">Vandamál með hreinsun á tilkynningum: %1$s</string>\n    <string name=\"ui_error_reject_follow_request\">Mistókst að hafna fylgjendabeiðni: %1$s</string>\n    <string name=\"ui_success_accepted_follow_request\">Samþykkt beiðni um að fylgjast með</string>\n    <string name=\"ui_success_rejected_follow_request\">Lokað á beiðni um að fylgjast með</string>\n    <string name=\"label_filter_action\">Aðgerð síu</string>\n    <string name=\"label_filter_context\">Samhengi síu</string>\n    <string name=\"label_filter_keywords\">Stikkorð eða setningar sem á að sía</string>\n    <string name=\"action_add\">Bæta við</string>\n    <string name=\"filter_keyword_display_format\">%1$s (heilt orð)</string>\n    <string name=\"filter_keyword_addition_title\">Bæta við stikkorði</string>\n    <string name=\"filter_edit_keyword_title\">Breyta stikkorði</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"post_media_image\">Mynd</string>\n    <string name=\"select_list_manage\">Sýsla með lista</string>\n    <string name=\"help_empty_home\">Þetta er <b>tímalínan þín</b>. Hún sýnir nýlegar færslur þeirra sem þú fylgist með. \n\\n \\u0020\n\\nTil að skoða hvað aðrir eru að gera getur þú til dæmis uppgötvað viðkomandi í einni af hinum tímalínunum. Til dæmis á staðværu tímalínu netþjónsins þíns {{group}}. Eða að þú leitar að þeim eftir nafni {{search}}; til dæmis geturðu leitað að Tusky til að finna Mastodon-aðganginn okkar.</string>\n    <string name=\"pref_ui_text_size\">Textastærð viðmóts</string>\n    <string name=\"notification_listenable_worker_name\">Bakgrunnsvirkni</string>\n    <string name=\"notification_listenable_worker_description\">Tilkynningar þegar Tusky er að vinna í bakgrunni</string>\n    <string name=\"notification_notification_worker\">Sæki tilkynningar…</string>\n    <string name=\"notification_prune_cache\">Viðhaldsvinna biðminnis…</string>\n    <string name=\"load_newest_notifications\">Hlaða inn nýjustu tilkynningum</string>\n    <string name=\"compose_delete_draft\">Eyða drögum?</string>\n    <string name=\"error_missing_edits\">Þjónninn þinn veit að þessari færslu hefur verið breytt, en er hins vegar ekki með afrit af breytingunum, þannig að ekki er hægt að sýna þér þær. \n\\n \\u0020\n\\nÞetta er <a href=\"https://github.com/mastodon/mastodon/issues/25398\">Mastodon verkbeiðni #25398</a>.</string>\n    <string name=\"about_device_info_title\">Tækið þitt</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nAndroid-útgáfa: %3$s\n\\nSDK-útgáfa: %4$d</string>\n    <string name=\"about_account_info_title\">Notandaaðgangurinn þinn</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nÚtgáfa: %3$s</string>\n    <string name=\"about_copy\">Afrita upplýsingar um útgáfu og tæki</string>\n    <string name=\"about_copied\">Afritaði upplýsingar um útgáfu og tæki</string>\n    <string name=\"list_exclusive_label\">Fela frá tímalínu</string>\n    <string name=\"error_media_playback\">Afspilun mistókst: %1$s</string>\n    <string name=\"dialog_delete_filter_text\">Eyða síunni \\'%1$s\\'?</string>\n    <string name=\"dialog_delete_filter_positive_action\">Eyða</string>\n    <string name=\"muting_hashtag_success_format\">Þagga niður í myllumerkinu #%1$s sem aðvörun</string>\n    <string name=\"unmuting_hashtag_success_format\">Hætti að þagga niður í myllumerkinu #%1$s</string>\n    <string name=\"action_view_filter\">Skoða síu</string>\n    <string name=\"following_hashtag_success_format\">Fylgist núna með myllumerkinu #%1$s</string>\n    <string name=\"unfollowing_hashtag_success_format\">Fylgist ekki lengur með myllumerkinu #%1$s</string>\n    <string name=\"dialog_save_profile_changes_message\">Viltu vista breytingarnar á notandasniðinu þínu?</string>\n    <string name=\"error_blocking_domain\">Mistókst að þagga niður í %1$s: %2$s</string>\n    <string name=\"error_unblocking_domain\">Mistókst að hætta að þagga niður í %1$s: %2$s</string>\n    <string name=\"error_media_upload_sending_fmt\">Innsendingin mistókst: %1$s</string>\n    <string name=\"help_empty_conversations\">Hér eru <b>einkaskilaboðin</b> þín; stundum kölluð samtöl eða bein skilaboð (DM). \n\\n \\u0020\n\\nEinkaskilaboð eru gerð með því að stilla sýnileika {{public}} færslu {{mail}} á <i>Beint</i> og að minnast á einn eða fleiri notendur í textanum. \\u0020\n\\n \\u0020\n\\nÞú getur til dæmis farið á notandaaðgang einhvers og ýtt á \\'Útbúa\\'-hnappinn {{edit}} og breytt sýnileikanum.\n\\n\n\\nAthugaðu að skilaboð í Fediverse-almannarýminu eru ekki dulrituð enda-í-enda. Ekki deila neinum viðkvæmum upplýsingum.</string>\n    <string name=\"help_empty_lists\">Þetta er <b>listasýnin</b> þín. Þú getur skilgreint fjölmarga einkalista og bætt notendaaðgöngum á þá. \n\\n \\u0020\n\\nATHUGAÐU: þú getur bara bætt notendaaðgöngum sem þú fylgist með á listana þína. \\u0020\n\\n \\u0020\n\\nÞessa lista má nota sem flipa í Kjörstillingar aðgangs{{manage_accounts}} {{chevron_right} flipunum.</string>\n    <string name=\"label_image\">Mynd</string>\n    <string name=\"app_theme_system_black\">Nota hönnun kerfis (svart)</string>\n    <string name=\"title_public_trending_statuses\">Færslur í umræðunni</string>\n    <string name=\"list_reply_policy_label\">Birta svör til</string>\n    <string name=\"list_reply_policy_none\">Engra</string>\n    <string name=\"list_reply_policy_list\">Meðlima listans</string>\n    <string name=\"list_reply_policy_followed\">Hvers þess sem fylgst er með</string>\n    <string name=\"pref_title_show_self_boosts\">Sýna sjálfs-endurbirtingar</string>\n    <string name=\"pref_title_show_self_boosts_description\">Einhver endurbirtir sína eigin færslu</string>\n    <string name=\"pref_title_per_timeline_preferences\">Kjörstillingar á hverja tímalínu</string>\n    <string name=\"reply_sending_long\">Verið er að senda svarið þitt.</string>\n    <string name=\"reply_sending\">Sendi…</string>\n    <string name=\"pref_title_show_notifications_filter\">Birta tilkynningasíu</string>\n    <string name=\"action_translate\">Þýða</string>\n    <string name=\"action_show_original\">Sýna upprunalegt</string>\n    <string name=\"label_translating\">Þýði…</string>\n    <string name=\"label_translated\">Þýtt úr %1$s með %2$s</string>\n    <string name=\"ui_error_translate\">Tókst ekki að þýða: %1$s</string>\n    <string name=\"action_follow_hashtag\">Fylgjast með nýju myllumerki</string>\n    <string name=\"confirmation_hashtag_copied\">\\'#%1$s\\' afrituð</string>\n    <string name=\"dialog_follow_warning\">Fylgjast með þessum aðgangi?</string>\n    <string name=\"error_saving_filter\">Villa við að vista síuna \\'%1$s\\'</string>\n    <string name=\"error_deleting_filter\">Villa við að eyða síunni \\'%1$s\\'</string>\n    <string name=\"url_copied\">Slóð afrituð</string>\n    <string name=\"label_expires_after\">Rennur út eftir</string>\n    <string name=\"notification_policy_accept\">Samþykkja</string>\n    <string name=\"post_privacy_direct\">Beint</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">Fólk sem þú fylgist ekki með</string>\n    <string name=\"notification_policies_filter_not_following_title\">Fólk sem fylgist ekki með þér</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">Nýir aðgangar</string>\n    <string name=\"notification_policy_filter\">Sía</string>\n    <string name=\"notification_policy_ignore\">Hunsa</string>\n    <string name=\"post_replied\">Svaraði</string>\n    <string name=\"post_replied_format\">Í svari til %1$s</string>\n    <string name=\"post_replied_self\">Samtal heldur áfram</string>\n    <string name=\"action_dismiss_notification_request\">Afgreiða</string>\n    <string name=\"report_category_legal\">Lögformlegt</string>\n    <string name=\"pref_title_confirm_follows\">Birta staðfestingarglugga áður en fylgst er með</string>\n    <string name=\"notification_policies_filter_dont_follow_description\">Þar til þú samþykkir handvirkt viðkomandi</string>\n    <string name=\"unknown_notification_type\">Óþekkt tegund tilkynningar</string>\n    <string name=\"unknown_notification_filter_moderated_accounts\">Notendaaðgangar í umsjón</string>\n    <string name=\"unknown_notification_filter_moderated_accounts_description\">Takmarkaðir af umsjónaraðilum netþjóns</string>\n    <string name=\"notification_policies_not_supported\">Þessi eiginleiki er aðeins tiltækur á Mastodon-netþjónum af útgáfu v4.3.0 eða nýrri.</string>\n    <string name=\"filtered_notifications\">Síaðar tilkynningar</string>\n    <string name=\"notifications_from_people_you_may_know\">Tilkynningar frá %1$d aðilum sem þú gætir þekkt</string>\n    <string name=\"filtered_notifications_title\">Síaðar tilkynningar</string>\n    <string name=\"accept_notification_request\">Samþykkja beiðni um tilkynningar</string>\n    <string name=\"dismiss_notification_request\">Hafna beiðni um tilkynningar</string>\n    <string name=\"open_settings\">Opna kjörstillingar</string>\n    <string name=\"notifications_from\">Tilkynningar frá %1$s</string>\n    <string name=\"action_accept_notification_request\">Samþykkja</string>\n    <string name=\"notification_policies_filter_not_following_description\">Þar með talið fólk sem hefur fylgst með þér í minna en 3 daga</string>\n    <string name=\"unknown_notification_filter_new_accounts_description\">Útbúið innan síðustu 30 daga</string>\n    <string name=\"follow_hashtag_success\">Fylgdist með myllumerki %1$s</string>\n    <string name=\"pref_default_reply_privacy\">Gagnaleynd svars (ekki samstillt við netþjón)</string>\n    <string name=\"pref_match_default_post_privacy\">Samsvara sjálfgefinni gagnaleynd færslna</string>\n    <string name=\"pref_default_reply_privacy_explanation\">Forvalin gagnaleynd fer eftir færslunni sem þú ert að svara.</string>\n    <string name=\"preview_card_by_author\">Frá %1$s</string>\n    <string name=\"preview_card_more_by_author\">Meira frá %1$s</string>\n    <string name=\"notification_policies_title\">Stefna varðandi tilkynningar</string>\n    <string name=\"notification_policies_filter_out\">Sýsla með tilkynningar frá…</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_title\">Óumbeðið einkaspjall</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_description\">Síað nema það sé í svari við þínu eigin spjalli (minnist á e-n) eða ef þú fylgist með sendandanum</string>\n    <string name=\"action_reblog_private\">Endurbirting aðeins til fylgjenda</string>\n    <string name=\"action_reblog_public\">Opinber endurbirting</string>\n    <string name=\"action_reblog_unlisted\">Óskráð endurbirting</string>\n    <string name=\"notification_severed_relationship_name\">Tapaðar tengingar</string>\n    <string name=\"notification_moderation_warning_name\">Aðvaranir umsjónaraðila</string>\n    <string name=\"notification_unknown_description\">Óþekkt tegund tilkynningar</string>\n    <string name=\"notification_channel_other\">Annað</string>\n    <string name=\"notification_channel_other_description\">Aðrar tilkynningar, eins og um rofnar tengingar og aðvaranir umsjónaraðila</string>\n    <string name=\"notification_channel_admin\">Stjórnandi</string>\n    <string name=\"notification_channel_admin_description\">Tilkynningar stjórnanda, eins og nýjar kærur eða nýskráningar</string>\n    <string name=\"moderation_warning_action_delete_statuses\">Sumar færslurnar þínar hafa verið fjarlægðar.</string>\n    <string name=\"moderation_warning_action_disable\">Aðgangurinn þinn hefur verið gerður óvirkur.</string>\n    <string name=\"moderation_warning_action_mark_statuses_as_sensitive\">Sumar færslurnar þínar hafa verið merktar sem viðkvæmt efni.</string>\n    <plurals name=\"media_attachments\">\n        <item quantity=\"one\">%1$s myndefnisviðhengi</item>\n        <item quantity=\"other\">%1$s myndefnisviðhengi</item>\n    </plurals>\n    <string name=\"notification_info_reply\">Svara</string>\n    <string name=\"notification_info_private_mention\">Minnst á í einkaspjalli</string>\n    <string name=\"notification_info_mention\">Minnst á</string>\n    <string name=\"notification_info_private_reply\">Einkasvar</string>\n    <string name=\"relationship_severance_event_title\">Tenging tapaðist</string>\n    <plurals name=\"accounts\">\n        <item quantity=\"one\">%1$s aðgangur</item>\n        <item quantity=\"other\">%1$s aðgangar</item>\n    </plurals>\n    <string name=\"relationship_severance_event_account_suspension\">Stjórnandi frá %1$s hefur sett %2$s í bið, sem þýðir að þú getur ekki lengur séð neitt frá þeim eða átt í samskiptum við þá.</string>\n    <string name=\"relationship_severance_event_domain_block\">Stjórnandi frá %1$s hefur lokað á %2$s, þar með talda %3$s af þeim sem fylgjast með þér og %4$s sem þú fylgist með.</string>\n    <string name=\"relationship_severance_event_user_domain_block\">Þú hefur lokað á %1$s, þar með fjarlægt %2$s af þeim sem fylgjast með þér og %3$s sem þú fylgist með.</string>\n    <string name=\"moderation_warning\">Þú hefur fengið aðvörun frá umsjónaraðila.</string>\n    <string name=\"moderation_warning_action_none\">Aðgangurinn þinn hefur fengið aðvörun frá umsjónaraðila.</string>\n    <string name=\"moderation_warning_action_sensitive\">Færslurnar þínar verða héðan í frá merktar sem viðkvæmt efni.</string>\n    <string name=\"moderation_warning_action_silence\">Aðgangurinn þinn hefur verið takmarkaður.</string>\n    <string name=\"moderation_warning_action_suspend\">Aðgangurinn þinn hefur verið settur í bið.</string>\n    <string name=\"poll\">Könnun</string>\n    <string name=\"unknown_notification_type_explanation\">Tusky þekkir ekki þessa tegund tilkynninga og getur ekki birt þér hana. Mögulega getur vefviðmót netþjónsins þíns birt þetta. Láttu hönnuði Tusky samt vita svo þeir getir bætt við stuðningi við þessa tegund tilkynninga!</string>\n    <string name=\"poll_show_results\">Birta niðurstöður</string>\n    <string name=\"yes\">Já</string>\n    <string name=\"no\">Nei</string>\n    <string name=\"confirm_dismiss_caption\">Henda breytingum á skýringatexta?</string>\n    <string name=\"unblock_success\">Aflæsti %1$s</string>\n    <string name=\"unmute_success\">Hætti að þagga %1$s</string>\n    <string name=\"mute_failure\">Mistókst að þagga %1$s: %2$s</string>\n    <string name=\"unblock_failure\">Mistókst að aflæsa %1$s: %2$s</string>\n    <string name=\"unmute_failure\">Mistókst að afþagga %1$s: %2$s</string>\n    <string name=\"accept_follow_request_failure\">Mistókst að samþykkja beiðni um að fylgjast með frá %1$s: %2$s</string>\n    <string name=\"block_failure\">Mistókst að loka á %1$s: %2$s</string>\n    <string name=\"reject_follow_request_failure\">Mistókst að hafna beiðni um að fylgjast með frá %1$s: %2$s</string>\n    <string name=\"reblog_privacy_followers_only_description\">Einungis þeir sem fylgjast með þér geta séð endurbirtinguna þína</string>\n    <string name=\"filter_action_blur\">Móða</string>\n    <string name=\"filter_description_blur\">Fela myndefni með aðvörun</string>\n    <string name=\"reblog_privacy_public_description\">Allir geta séð endurbirtinguna þína</string>\n    <string name=\"reblog_privacy_unlisted_description\">Sama og opinbert, en verður ekki birt á opinberum tímalínum</string>\n    <string name=\"reblog_confirm\">Endurbirta þessa færslu?</string>\n    <string name=\"favourite_confirm\">Setja þessa færslu í eftirlæti?</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-it/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">Si è verificato un errore.</string>\n    <string name=\"error_network\">Si è verificato un errore di rete. Per favore controlla la tua connessione e riprova.</string>\n    <string name=\"error_empty\">Questo non può essere vuoto.</string>\n    <string name=\"error_invalid_domain\">Inserito un dominio non valido</string>\n    <string name=\"error_failed_app_registration\">Autenticazione con quell\\'istanza fallita. Se il problema persiste, prova a collegarti dal browser nel menù.</string>\n    <string name=\"error_no_web_browser_found\">Nessun browser web utilizzabile trovato.</string>\n    <string name=\"error_authorization_unknown\">Sì è verificato un errore di autenticazione non identificato. Se il problema persiste, prova a collegarti dal browser nel menù.</string>\n    <string name=\"error_authorization_denied\">Autorizzazione negata. Se sei sicuro di aver usato le credenziali corrette, prova a collegarti con il browser nel menu.</string>\n    <string name=\"error_retrieving_oauth_token\">Acquisizione token di accesso fallita. Se il problema persiste, prova a collegarti dal browser nel menu.</string>\n    <string name=\"error_compose_character_limit\">Il post è troppo lungo!</string>\n    <string name=\"error_media_upload_type\">Quel tipo di file non può essere caricato.</string>\n    <string name=\"error_media_upload_opening\">Non è stato possibile aprire quel file.</string>\n    <string name=\"error_media_upload_permission\">È richiesto il permesso di leggere file.</string>\n    <string name=\"error_media_download_permission\">È richiesto il permesso di salvare file.</string>\n    <string name=\"error_media_upload_image_or_video\">Non è possibile allegare nello stesso post immagini e video.</string>\n    <string name=\"error_media_upload_sending\">Il caricamento è fallito.</string>\n    <string name=\"error_sender_account_gone\">Errore nell\\'invio del post.</string>\n    <string name=\"title_home\">Home</string>\n    <string name=\"title_notifications\">Notifiche</string>\n    <string name=\"title_public_local\">Locale</string>\n    <string name=\"title_public_federated\">Federata</string>\n    <string name=\"title_direct_messages\">Messaggi diretti</string>\n    <string name=\"title_tab_preferences\">Schede</string>\n    <string name=\"title_view_thread\">Conversazione</string>\n    <string name=\"title_posts\">Post</string>\n    <string name=\"title_posts_with_replies\">Con risposte</string>\n    <string name=\"title_posts_pinned\">Fissati</string>\n    <string name=\"title_follows\">Seguiti</string>\n    <string name=\"title_followers\">Seguaci</string>\n    <string name=\"title_favourites\">Preferiti</string>\n    <string name=\"title_mutes\">Utenti silenziati</string>\n    <string name=\"title_blocks\">Utenti bloccati</string>\n    <string name=\"title_follow_requests\">Richieste di seguirti</string>\n    <string name=\"title_edit_profile\">Modifica il tuo profilo</string>\n    <string name=\"title_drafts\">Bozze</string>\n    <string name=\"title_licenses\">Licenze</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s ha condiviso</string>\n    <string name=\"post_sensitive_media_title\">Contenuto sensibile</string>\n    <string name=\"post_media_hidden_title\">Media nascosto</string>\n    <string name=\"post_sensitive_media_directions\">Clicca per visualizzare</string>\n    <string name=\"post_content_warning_show_more\">Mostra di più</string>\n    <string name=\"post_content_warning_show_less\">Mostra di meno</string>\n    <string name=\"post_content_show_more\">Espandi</string>\n    <string name=\"post_content_show_less\">Riduci</string>\n    <string name=\"message_empty\">Qui non c\\'è nulla.</string>\n    <string name=\"footer_empty\">Qui non c\\'è nulla. Trascina verso il basso per aggiornare!</string>\n    <string name=\"notification_reblog_format\">%1$s ha condiviso il tuo post</string>\n    <string name=\"notification_favourite_format\">%1$s ha messo il tuo messaggio nei preferiti</string>\n    <string name=\"notification_follow_format\">%1$s ti segue</string>\n    <string name=\"report_username_format\">Segnala @%1$s</string>\n    <string name=\"report_comment_hint\">Commenti aggiuntivi?</string>\n    <string name=\"action_quick_reply\">Risposta veloce</string>\n    <string name=\"action_reply\">Rispondi</string>\n    <string name=\"action_reblog\">Condividi</string>\n    <string name=\"action_unreblog\">Rimuovi condivisione</string>\n    <string name=\"action_favourite\">Aggiungi ai preferiti</string>\n    <string name=\"action_unfavourite\">Rimuovi preferito</string>\n    <string name=\"action_more\">Di più</string>\n    <string name=\"action_compose\">Componi</string>\n    <string name=\"action_login\">Accedi con Tusky</string>\n    <string name=\"action_logout\">Disconnettiti</string>\n    <string name=\"action_logout_confirm\">Sei sicuro di volerti disconnettere dall\\'account %1$s? Questo cancellerà tutti i dati locali dell\\'account, incluse bozze e preferenze.</string>\n    <string name=\"action_follow\">Segui</string>\n    <string name=\"action_unfollow\">Smetti di seguire</string>\n    <string name=\"action_block\">Blocca</string>\n    <string name=\"action_unblock\">Sblocca</string>\n    <string name=\"action_hide_reblogs\">Nascondi ricondivisioni</string>\n    <string name=\"action_show_reblogs\">Mostra ricondivisioni</string>\n    <string name=\"action_report\">Segnala</string>\n    <string name=\"action_delete\">Elimina</string>\n    <string name=\"action_send\">Pubblica</string>\n    <string name=\"action_send_public\">Pubblica!</string>\n    <string name=\"action_retry\">Riprova</string>\n    <string name=\"action_close\">Chiudi</string>\n    <string name=\"action_view_profile\">Profilo</string>\n    <string name=\"action_view_preferences\">Preferenze</string>\n    <string name=\"action_view_account_preferences\">Preferenze account</string>\n    <string name=\"action_view_favourites\">Preferiti</string>\n    <string name=\"action_view_mutes\">Utenti silenziati</string>\n    <string name=\"action_view_blocks\">Utenti bloccati</string>\n    <string name=\"action_view_follow_requests\">Richieste di seguirti</string>\n    <string name=\"action_view_media\">Media</string>\n    <string name=\"action_open_in_web\">Apri nel browser</string>\n    <string name=\"action_add_media\">Aggiungi media</string>\n    <string name=\"action_photo_take\">Scatta foto</string>\n    <string name=\"action_share\">Condividi</string>\n    <string name=\"action_mute\">Silenzia</string>\n    <string name=\"action_unmute\">Smetti di silenziare</string>\n    <string name=\"action_mention\">Menzione</string>\n    <string name=\"action_hide_media\">Nascondi media</string>\n    <string name=\"action_open_drawer\">Apri compositore</string>\n    <string name=\"action_save\">Salva</string>\n    <string name=\"action_edit_profile\">Modifica profilo</string>\n    <string name=\"action_edit_own_profile\">Modifica</string>\n    <string name=\"action_undo\">Annulla</string>\n    <string name=\"action_accept\">Accetta</string>\n    <string name=\"action_reject\">Rifiuta</string>\n    <string name=\"action_search\">Cerca</string>\n    <string name=\"action_access_drafts\">Bozze</string>\n    <string name=\"action_toggle_visibility\">Visibilità dei post</string>\n    <string name=\"action_content_warning\">Avviso di contenuto sensibile</string>\n    <string name=\"action_emoji_keyboard\">Tastiera emoji</string>\n    <string name=\"action_add_tab\">Aggiungi scheda</string>\n    <string name=\"action_links\">Collegamenti</string>\n    <string name=\"action_mentions\">Menzioni</string>\n    <string name=\"action_hashtags\">Hashtag</string>\n    <string name=\"action_open_reblogger\">Vai all\\'autore della condivisione</string>\n    <string name=\"action_open_reblogged_by\">Mostra ricondivisioni</string>\n    <string name=\"action_open_faved_by\">Mostra preferiti</string>\n    <string name=\"title_hashtags_dialog\">Hashtag</string>\n    <string name=\"title_mentions_dialog\">Menzioni</string>\n    <string name=\"title_links_dialog\">Collegamenti</string>\n    <string name=\"action_open_media_n\">Apri media #%1$d</string>\n    <string name=\"download_image\">Scaricando %1$s</string>\n    <string name=\"action_copy_link\">Copia collegamento</string>\n    <string name=\"action_open_as\">Apri come %1$s</string>\n    <string name=\"action_share_as\">Condividi come …</string>\n    <string name=\"send_post_link_to\">Condividi URL del post su…</string>\n    <string name=\"send_post_content_to\">Condividi post su…</string>\n    <string name=\"send_media_to\">Condividi media su…</string>\n    <string name=\"confirmation_reported\">Inviato!</string>\n    <string name=\"confirmation_unblocked\">Utente sbloccato</string>\n    <string name=\"confirmation_unmuted\">Utente non più silenziato</string>\n    <string name=\"hint_domain\">Quale istanza?</string>\n    <string name=\"hint_compose\">Cosa succede?</string>\n    <string name=\"hint_content_warning\">Avviso di contenuto sensibile</string>\n    <string name=\"hint_display_name\">Mostra nome</string>\n    <string name=\"hint_note\">Biografia</string>\n    <string name=\"hint_search\">Cerca…</string>\n    <string name=\"search_no_results\">Nessun risultato</string>\n    <string name=\"label_quick_reply\">Rispondi…</string>\n    <string name=\"label_avatar\">Avatar</string>\n    <string name=\"label_header\">Intestazione</string>\n    <string name=\"link_whats_an_instance\">Cos\\'è un\\'istanza?</string>\n    <string name=\"login_connection\">Connessione…</string>\n    <string name=\"dialog_whats_an_instance\">L\\'indirizzo o il dominio di qualsiasi istanza può essere inserito qui, come mastodon.social, icosahedron.website, social.tchncs.de, e <a href=\"https://instances.social\">altro!</a> \n\\n \n\\nSe non hai ancora un account, puoi inserire il nome di un\\'istanza alla quale vuoi iscriverti e creare un account. \n\\n \n\\nUn\\'istanza è il luogo dove l\\'account è custodito, ma puoi facilmente comunicare e seguire gente su altre istanze come se fossero sullo stesso sito. \n\\n \n\\nPiù info possono essere trovate su <a href=\"https://joinmastodon.org\">joinmastodon.org</a>.</string>\n    <string name=\"dialog_title_finishing_media_upload\">Terminando il caricamento dei media</string>\n    <string name=\"dialog_message_uploading_media\">Caricamento…</string>\n    <string name=\"dialog_download_image\">Scarica</string>\n    <string name=\"dialog_message_cancel_follow_request\">Revocare la richiesta di seguire?</string>\n    <string name=\"dialog_unfollow_warning\">Smettere di seguire questo account?</string>\n    <string name=\"dialog_delete_post_warning\">Eliminare questo post?</string>\n    <string name=\"visibility_public\">Pubblico: visibile sulle timeline pubbliche</string>\n    <string name=\"visibility_unlisted\">Non in elenco: non visibile sulle timeline pubbliche</string>\n    <string name=\"visibility_private\">Solo chi ti segue: visibile solo da chi ti segue</string>\n    <string name=\"visibility_direct\">Diretto: visibile solo agli utenti menzionati</string>\n    <string name=\"pref_title_edit_notification_settings\">Notifiche</string>\n    <string name=\"pref_title_notifications_enabled\">Notifiche</string>\n    <string name=\"pref_title_notification_alerts\">Allarmi</string>\n    <string name=\"pref_title_notification_alert_sound\">Notifica con suoneria</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Notifica con vibrazione</string>\n    <string name=\"pref_title_notification_alert_light\">Notifica con luce</string>\n    <string name=\"pref_title_notification_filters\">Tipi di notifica abilitati</string>\n    <string name=\"pref_title_appearance_settings\">Aspetto</string>\n    <string name=\"pref_title_app_theme\">Tema dell\\'app</string>\n    <string name=\"pref_title_timelines\">Timeline</string>\n    <string name=\"pref_title_timeline_filters\">Filtri</string>\n    <string name=\"app_them_dark\">Scuro</string>\n    <string name=\"app_theme_light\">Chiaro</string>\n    <string name=\"app_theme_black\">Nero</string>\n    <string name=\"app_theme_auto\">Automatico al tramonto</string>\n    <string name=\"app_theme_system\">Usa tema di sistema</string>\n    <string name=\"pref_title_browser_settings\">Browser</string>\n    <string name=\"pref_title_custom_tabs\">Usa Custom Tabs di Chrome</string>\n    <string name=\"pref_title_language\">Lingua</string>\n    <string name=\"pref_title_post_filter\">Filtraggio della timeline</string>\n    <string name=\"pref_title_post_tabs\">Timeline principale</string>\n    <string name=\"pref_title_show_boosts\">Mostra ricondivisioni</string>\n    <string name=\"pref_title_show_replies\">Mostra risposte</string>\n    <string name=\"pref_title_show_media_preview\">Mostra anteprime media</string>\n    <string name=\"pref_title_proxy_settings\">Proxy</string>\n    <string name=\"pref_title_http_proxy_settings\">Proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_enable\">Abilita proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_server\">Server proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_port\">Porta proxy HTTP</string>\n    <string name=\"pref_default_post_privacy\">Privacy dei post (sincronizzato sul server)</string>\n    <string name=\"pref_default_media_sensitivity\">Segna sempre media come sensibili (sincronizzato sul server)</string>\n    <string name=\"pref_publishing\">Predefiniti di pubblicazione</string>\n    <string name=\"pref_failed_to_sync\">Sincronizzazione preferenze fallita</string>\n    <string name=\"post_privacy_public\">Pubblico</string>\n    <string name=\"post_privacy_unlisted\">Non in elenco</string>\n    <string name=\"post_privacy_followers_only\">Solo seguaci</string>\n    <string name=\"pref_post_text_size\">Dimensione del testo dei post</string>\n    <string name=\"post_text_size_smallest\">Piccolissimo</string>\n    <string name=\"post_text_size_small\">Piccolo</string>\n    <string name=\"post_text_size_medium\">Normale</string>\n    <string name=\"post_text_size_large\">Grande</string>\n    <string name=\"post_text_size_largest\">Grandissimo</string>\n    <string name=\"notification_mention_name\">Nuove menzioni</string>\n    <string name=\"notification_mention_descriptions\">Notifiche di quando vieni menzionato da qualcuno</string>\n    <string name=\"notification_follow_name\">Nuovi seguaci</string>\n    <string name=\"notification_follow_description\">Notifiche su nuovi seguaci</string>\n    <string name=\"notification_boost_name\">Ricondivisioni</string>\n    <string name=\"notification_boost_description\">Notifiche sui tuoi post che vengono condivisi</string>\n    <string name=\"notification_favourite_name\">Preferiti</string>\n    <string name=\"notification_favourite_description\">Notifiche quando i tuoi post vengono segnati come preferiti</string>\n    <string name=\"notification_mention_format\">%1$s ti ha menzionato</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s e %4$d altri</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s e %3$s</string>\n    <string name=\"notification_summary_small\">%1$s e %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d nuova interazione</item>\n        <item quantity=\"many\">%1$d nuove interazioni</item>\n        <item quantity=\"other\">%1$d nuove interazioni</item>\n    </plurals>\n    <string name=\"description_account_locked\">Account bloccato</string>\n    <string name=\"about_title_activity\">A proposito</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_tusky_license\">Tusky è un programma libero ed open source. È distribuito con licenza GNU General Public License Version 3. Puoi leggere la licenza qui: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">Sito web del progetto: https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Segnala problemi e richiedi funzionalità:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Profilo di Tusky</string>\n    <string name=\"post_share_content\">Condividi contenuto del post</string>\n    <string name=\"post_share_link\">Condividi collegamento al post</string>\n    <string name=\"post_media_images\">Immagini</string>\n    <string name=\"post_media_video\">Video</string>\n    <string name=\"state_follow_requested\">Richiesta inviata</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">in %1$d a</string>\n    <string name=\"abbreviated_in_days\">in %1$dg</string>\n    <string name=\"abbreviated_in_hours\">in %1$do</string>\n    <string name=\"abbreviated_in_minutes\">in %1$d min</string>\n    <string name=\"abbreviated_in_seconds\">in %1$ds</string>\n    <string name=\"abbreviated_years_ago\">%1$da</string>\n    <string name=\"abbreviated_days_ago\">%1$dg</string>\n    <string name=\"abbreviated_hours_ago\">%1$do</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dmin</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"follows_you\">Ti segue</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Mostra sempre i media sensibili</string>\n    <string name=\"title_media\">Media</string>\n    <string name=\"replying_to\">Rispondendo a @%1$s</string>\n    <string name=\"load_more_placeholder_text\">Carica altro</string>\n    <string name=\"pref_title_public_filter_keywords\">Timeline pubbliche</string>\n    <string name=\"pref_title_thread_filter_keywords\">Conversazioni</string>\n    <string name=\"filter_addition_title\">Aggiungi filtro</string>\n    <string name=\"filter_edit_title\">Modifica filtro</string>\n    <string name=\"filter_dialog_remove_button\">Rimuovi</string>\n    <string name=\"filter_dialog_update_button\">Aggiorna</string>\n    <string name=\"filter_add_description\">Frase da filtrare</string>\n    <string name=\"add_account_name\">Aggiungi account</string>\n    <string name=\"add_account_description\">Aggiungi un nuovo Account Mastodon</string>\n    <string name=\"action_lists\">Liste</string>\n    <string name=\"title_lists\">Liste</string>\n    <string name=\"error_create_list\">Non è stato possibile creare la lista</string>\n    <string name=\"error_rename_list\">Non è stato possibile aggiornare la lista</string>\n    <string name=\"error_delete_list\">Non è stato possibile eliminare la lista</string>\n    <string name=\"action_create_list\">Crea lista</string>\n    <string name=\"action_rename_list\">Aggiorna lista</string>\n    <string name=\"action_delete_list\">Elimina lista</string>\n    <string name=\"hint_search_people_list\">Cerca tra le persone che segui</string>\n    <string name=\"action_add_to_list\">Aggiungi un account alla lista</string>\n    <string name=\"action_remove_from_list\">Rimuovi un account dalla lista</string>\n    <string name=\"compose_active_account_description\">Pubblicando come %1$s</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Descrivi i contenuti per gli ipovedenti (limite di %1$d carattere)</item>\n        <item quantity=\"many\">Descrivi i contenuti per gli ipovedenti (limite di %1$d caratteri)</item>\n        <item quantity=\"other\">Descrivi i contenuti per gli ipovedenti (limite di %1$d caratteri)</item>\n    </plurals>\n    <string name=\"action_set_caption\">Inserisci descrizione</string>\n    <string name=\"action_remove\">Rimuovi</string>\n    <string name=\"lock_account_label\">Blocca account</string>\n    <string name=\"lock_account_label_description\">Richiedi una tua approvazione manuale per seguirti</string>\n    <string name=\"compose_save_draft\">Salvare bozza?</string>\n    <string name=\"send_post_notification_title\">Inviando il post…</string>\n    <string name=\"send_post_notification_error_title\">Errore durante l\\'invio</string>\n    <string name=\"send_post_notification_channel_name\">Invio post</string>\n    <string name=\"send_post_notification_cancel_title\">Invio annullato</string>\n    <string name=\"send_post_notification_saved_content\">Una copia del post è stata salvata nelle tue bozze</string>\n    <string name=\"action_compose_shortcut\">Componi</string>\n    <string name=\"error_no_custom_emojis\">La tua istanza %1$s non ha nessuna emoji personalizzata</string>\n    <string name=\"emoji_style\">Stile delle emoji</string>\n    <string name=\"system_default\">Predefinite del sistema</string>\n    <string name=\"download_fonts\">Dovrai prima scaricare questo pacchetto di emoji</string>\n    <string name=\"performing_lookup_title\">Ricerca in corso…</string>\n    <string name=\"expand_collapse_all_posts\">Espandi/riduci tutti i post</string>\n    <string name=\"action_open_post\">Apri post</string>\n    <string name=\"restart_required\">Riavvio dell\\'app richiesto</string>\n    <string name=\"restart_emoji\">Devi riavviare Tusky per applicare queste modifiche</string>\n    <string name=\"later\">Più tardi</string>\n    <string name=\"restart\">Riavvia</string>\n    <string name=\"caption_systememoji\">Le emoji predefinite del tuo dispositivo</string>\n    <string name=\"caption_blobmoji\">Le emoji Blob di Android 4.4-7.1</string>\n    <string name=\"caption_twemoji\">Le emoji standard di Mastodon</string>\n    <string name=\"download_failed\">Scaricamento fallito</string>\n    <string name=\"profile_badge_bot_text\">Bot</string>\n    <string name=\"account_moved_description\">%1$s si è spostato su:</string>\n    <string name=\"reblog_private\">Condividi con la visibilità originale</string>\n    <string name=\"unreblog_private\">Annulla condivisione</string>\n    <string name=\"license_description\">Tusky contiene codice e risorse dai seguenti progetti open source:</string>\n    <string name=\"license_apache_2\">Licenziata sotto la Licenza Apache (copia sotto)</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">Metadati del profilo</string>\n    <string name=\"profile_metadata_add\">aggiungi dati</string>\n    <string name=\"profile_metadata_label_label\">Etichetta</string>\n    <string name=\"profile_metadata_content_label\">Contenuto</string>\n    <string name=\"pref_title_absolute_time\">Usa ora assoluta</string>\n    <string name=\"label_remote_account\">Il profilo dell\\'utente mostrato qui sotto potrebbe essere incompleto. Premi per aprire il profilo completo nel browser.</string>\n    <string name=\"unpin_action\">Non fissare in cima</string>\n    <string name=\"pin_action\">Fissa</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\">%1$s preferito</item>\n        <item quantity=\"many\">%1$s preferiti</item>\n        <item quantity=\"other\">%1$s preferiti</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\">%1$s ricondivisione</item>\n        <item quantity=\"many\">%1$s ricondivisioni</item>\n        <item quantity=\"other\">%1$s ricondivisioni</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">Condiviso da</string>\n    <string name=\"title_favourited_by\">Aggiunto ai preferiti da</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s e %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s ed altri %3$d</string>\n    <string name=\"description_post_media\">Media: %1$s</string>\n    <string name=\"description_post_cw\">Contenuto sensibile: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Nessuna descrizione</string>\n    <string name=\"description_post_reblogged\">Ribloggato</string>\n    <string name=\"description_post_favourited\">Messo nei preferiti</string>\n    <string name=\"description_visibility_public\">Pubblico</string>\n    <string name=\"description_visibility_unlisted\">Non in elenco</string>\n    <string name=\"description_visibility_private\">Solo seguaci</string>\n    <string name=\"description_visibility_direct\">Diretti</string>\n    <string name=\"hint_list_name\">Nome della lista</string>\n    <string name=\"download_media\">Scarica media</string>\n    <string name=\"downloading_media\">Scaricando media</string>\n    <string name=\"compose_shortcut_long_label\">Componi post</string>\n    <string name=\"pick_hashtag_hint\">Hashtag senza #</string>\n    <string name=\"compose_shortcut_short_label\">Componi</string>\n    <string name=\"notifications_clear\">Cancella</string>\n    <string name=\"notifications_apply_filter\">Filtra</string>\n    <string name=\"filter_apply\">Applica</string>\n    <string name=\"pref_title_bot_overlay\">Mostra indicatore bot</string>\n    <string name=\"notification_clear_text\">Sei sicuro di voler permanentemente eliminare tutte le tue notifiche?</string>\n    <string name=\"action_delete_and_redraft\">Cancella e riscrivi</string>\n    <string name=\"dialog_redraft_post_warning\">Cancellare e riscrivere questo post?</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s voto</item>\n        <item quantity=\"many\">%1$s voti</item>\n        <item quantity=\"other\">%1$s voti</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">si conclude alle %1$s</string>\n    <string name=\"poll_info_closed\">concluso</string>\n    <string name=\"poll_vote\">Vota</string>\n    <string name=\"title_domain_mutes\">Domini nascosti</string>\n    <string name=\"action_view_domain_mutes\">Domini nascosti</string>\n    <string name=\"action_mute_domain\">Silenzia %1$s</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s mostrati</string>\n    <string name=\"mute_domain_warning\">Sei sicuro di voler bloccare tutto %1$s? Non vedrai nessun contenuto da quel dominio in nessuna timeline pubblica o nelle tue notifiche. I tuoi seguaci che stanno in quel dominio saranno rimossi.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Nascondi l\\'intero dominio</string>\n    <string name=\"pref_title_animate_gif_avatars\">Riproduci avatar animati</string>\n    <string name=\"notification_poll_name\">Risultati del sondaggio</string>\n    <string name=\"notification_poll_description\">Notifiche sui sondaggi che si sono conclusi</string>\n    <string name=\"filter_dialog_whole_word\">Parola intera</string>\n    <string name=\"filter_dialog_whole_word_description\">Quando la parola chiave o la frase sono composte da soli caratteri alfanumerici, sarà applicata solo se corrisponde alla parola completa</string>\n    <string name=\"caption_notoemoji\">Set di emoji di Google</string>\n    <string name=\"title_bookmarks\">Segnalibri</string>\n    <string name=\"action_bookmark\">Segnalibro</string>\n    <string name=\"action_edit\">Modifica</string>\n    <string name=\"action_view_bookmarks\">Segnalibri</string>\n    <string name=\"action_add_poll\">Aggiungi sondaggio</string>\n    <string name=\"about_powered_by_tusky\">Fatto usando Tusky</string>\n    <string name=\"pref_title_alway_open_spoiler\">Espandi sempre i post segnalati come contenuto sensibile</string>\n    <string name=\"description_post_bookmarked\">Messo nei segnalibri</string>\n    <string name=\"description_poll\">Sondaggio con scelte: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"select_list_title\">Scegli lista</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"compose_preview_image_description\">Azioni per l\\'immagine %1$s</string>\n    <string name=\"poll_ended_voted\">Un sondaggio in cui hai votato si è concluso</string>\n    <string name=\"poll_ended_created\">Un sondaggio che hai creato si è concluso</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d giorno rimasto</item>\n        <item quantity=\"many\">%1$d giorni rimasti</item>\n        <item quantity=\"other\">%1$d giorni rimasti</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d ora rimasta</item>\n        <item quantity=\"many\">%1$d ore rimaste</item>\n        <item quantity=\"other\">%1$d ore rimaste</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d minuto rimasto</item>\n        <item quantity=\"many\">%1$d minuti rimasti</item>\n        <item quantity=\"other\">%1$d minuti rimasti</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d secondo rimasto</item>\n        <item quantity=\"many\">%1$d secondi rimasti</item>\n        <item quantity=\"other\">%1$d secondi rimasti</item>\n    </plurals>\n    <string name=\"button_continue\">Continua</string>\n    <string name=\"button_back\">Indietro</string>\n    <string name=\"button_done\">Fatto</string>\n    <string name=\"report_sent_success\">Segnalato @%1$s con successo</string>\n    <string name=\"hint_additional_info\">Altri commenti</string>\n    <string name=\"report_remote_instance\">Inoltra a %1$s</string>\n    <string name=\"failed_report\">Segnalazione fallita</string>\n    <string name=\"failed_fetch_posts\">Scaricamento dei post fallito</string>\n    <string name=\"report_description_1\">La segnalazione sarà inviata al moderatore del tuo server. Puoi spiegare perché stai segnalando l\\'utente qui sotto:</string>\n    <string name=\"report_description_remote_instance\">L\\'utente è su un altro server. Mandare una copia della segnalazione anche lì?</string>\n    <string name=\"title_accounts\">Utenti</string>\n    <string name=\"failed_search\">Errore durante la ricerca</string>\n    <string name=\"create_poll_title\">Sondaggio</string>\n    <string name=\"duration_5_min\">5 minuti</string>\n    <string name=\"duration_30_min\">30 minuti</string>\n    <string name=\"duration_1_hour\">1 ora</string>\n    <string name=\"duration_6_hours\">6 ore</string>\n    <string name=\"duration_1_day\">1 giorno</string>\n    <string name=\"duration_3_days\">3 giorni</string>\n    <string name=\"duration_7_days\">7 giorni</string>\n    <string name=\"add_poll_choice\">Aggiungi scelta</string>\n    <string name=\"poll_allow_multiple_choices\">Scelte multiple</string>\n    <string name=\"poll_new_choice_hint\">Scelta %1$d</string>\n    <string name=\"edit_poll\">Modifica</string>\n    <string name=\"post_lookup_error_format\">Errore nella ricerca del post %1$s</string>\n    <string name=\"title_scheduled_posts\">Post programmati</string>\n    <string name=\"action_access_scheduled_posts\">Post programmati</string>\n    <string name=\"action_schedule_post\">Programma un post</string>\n    <string name=\"action_reset_schedule\">Ripristina</string>\n    <string name=\"poll_info_format\">%1$s • %2$s</string>\n    <string name=\"no_drafts\">Non hai bozze.</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s persona</item>\n        <item quantity=\"many\">%1$s persone</item>\n        <item quantity=\"other\">%1$s persone</item>\n    </plurals>\n    <string name=\"hashtags\">Hashtag</string>\n    <string name=\"add_hashtag_title\">Aggiungi hashtag</string>\n    <string name=\"dialog_mute_warning\">Silenziare @%1$s?</string>\n    <string name=\"dialog_block_warning\">Bloccare @%1$s?</string>\n    <string name=\"action_unmute_domain\">Smetti di silenziare %1$s</string>\n    <string name=\"action_unmute_conversation\">Smetti di silenziare la conversazione</string>\n    <string name=\"action_mute_conversation\">Silenzia conversazione</string>\n    <string name=\"notification_follow_request_format\">%1$s ha chiesto di seguirti</string>\n    <string name=\"action_unmute_desc\">Smetti di silenziare %1$s</string>\n    <string name=\"notification_follow_request_name\">Richieste di seguirti</string>\n    <string name=\"account_note_saved\">Salvato!</string>\n    <string name=\"account_note_hint\">La tua nota privata su questo account</string>\n    <string name=\"pref_title_hide_top_toolbar\">Nascondi il titolo della barra degli strumenti in alto</string>\n    <string name=\"pref_title_confirm_reblogs\">Chiedi conferma prima di condividere</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Mostra le anteprime dei collegamenti nelle timeline</string>\n    <string name=\"warning_scheduling_interval\">Mastodon ha un intervallo di programmazione minimo di 5 minuti.</string>\n    <string name=\"no_announcements\">Non ci sono annunci.</string>\n    <string name=\"no_scheduled_posts\">Non hai post programmati.</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Abilita il gesto di scorrimento per passare da una scheda all\\'altra</string>\n    <string name=\"notification_follow_request_description\">Notifiche sulle richieste di essere seguiti</string>\n    <string name=\"pref_main_nav_position_option_bottom\">In fondo</string>\n    <string name=\"pref_main_nav_position_option_top\">In cima</string>\n    <string name=\"pref_main_nav_position\">Posizione barra di navigazione principale</string>\n    <string name=\"pref_title_gradient_for_media\">Mostra gradienti colorati per i media nascosti</string>\n    <string name=\"dialog_mute_hide_notifications\">Nascondi notifiche</string>\n    <string name=\"title_announcements\">Annunci</string>\n    <string name=\"wellbeing_hide_stats_profile\">Nascondi statistiche quantitative sui profili</string>\n    <string name=\"wellbeing_hide_stats_posts\">Nascondi le statistiche quantitative sui post</string>\n    <string name=\"limit_notifications\">Limita le notifiche della timeline</string>\n    <string name=\"review_notifications\">Rivedi le notifiche</string>\n    <string name=\"pref_title_wellbeing_mode\">Benessere</string>\n    <string name=\"notification_subscription_description\">Notifiche di nuovi post di qualcuno a cui sei iscritto</string>\n    <string name=\"notification_subscription_name\">Nuovi post</string>\n    <string name=\"notification_subscription_format\">%1$s ha appena pubblicato</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Non puoi caricare più di %1$d allegato multimediale.</item>\n        <item quantity=\"many\">Non puoi caricare più di %1$d allegati multimediali.</item>\n        <item quantity=\"other\">Non puoi caricare più di %1$d allegati multimediali.</item>\n    </plurals>\n    <string name=\"drafts_post_reply_removed\">Il post a cui hai scritto una bozza di risposta è stato rimosso</string>\n    <string name=\"draft_deleted\">Bozza eliminata</string>\n    <string name=\"drafts_post_failed_to_send\">L\\'invio di questo post è fallito!</string>\n    <string name=\"dialog_delete_list_warning\">Sei sicuro di voler cancellare la lista %1$s?</string>\n    <string name=\"duration_indefinite\">Indefinita</string>\n    <string name=\"label_duration\">Durata</string>\n    <string name=\"post_media_attachments\">Allegati</string>\n    <string name=\"post_media_audio\">Audio</string>\n    <string name=\"pref_title_animate_custom_emojis\">Riproduci emoji animate</string>\n    <string name=\"action_subscribe_account\">Iscriviti</string>\n    <string name=\"dialog_delete_conversation_warning\">Rimuovere questa conversazione?</string>\n    <string name=\"drafts_failed_loading_reply\">Errore nel recupero delle informazioni sulla risposta</string>\n    <string name=\"action_unsubscribe_account\">Disiscriviti</string>\n    <string name=\"action_delete_conversation\">Elimina conversazione</string>\n    <string name=\"wellbeing_mode_notice\">Alcune informazioni che potrebbero influenzare il tuo benessere mentale saranno nascoste. Questo include:\n\\n\n\\n- Notifiche riguardo a Preferiti/Boost/Following\n\\n- Conteggio dei Preferiti/Boost nei post\n\\n- Statistiche riguardo a Preferiti/Post nei profili\n\\n\n\\nLe notifiche push non saranno influenzate, ma puoi modificare le tue impostazioni delle notifiche manualmente.</string>\n    <string name=\"action_unbookmark\">Rimuovi segnalibro</string>\n    <string name=\"pref_title_confirm_favourites\">Chiedi conferma prima di mettere nei preferiti</string>\n    <string name=\"duration_14_days\">14 giorni</string>\n    <string name=\"duration_30_days\">30 giorni</string>\n    <string name=\"duration_60_days\">60 giorni</string>\n    <string name=\"duration_90_days\">90 giorni</string>\n    <string name=\"duration_180_days\">180 giorni</string>\n    <string name=\"duration_365_days\">365 giorni</string>\n    <string name=\"follow_requests_info\">Anche se il tuo account non è bloccato, lo staff di %1$s ha pensato che potresti voler verificare le richieste di seguirti da parte questi utenti manualmente.</string>\n    <string name=\"notification_sign_up_format\">%1$s si è registrato</string>\n    <string name=\"title_login\">Accesso</string>\n    <string name=\"notification_update_format\">%1$s ha modificato il suo post</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Componi post</string>\n    <string name=\"notification_sign_up_name\">Registrazioni</string>\n    <string name=\"notification_sign_up_description\">Notifiche di quando qualcuno si è registrato</string>\n    <string name=\"notification_update_name\">Modifiche ai post</string>\n    <string name=\"notification_update_description\">Notifiche di quando i post con cui hai interagito vengono modificati</string>\n    <string name=\"error_could_not_load_login_page\">Non è stato possibile caricare la pagina di accesso.</string>\n    <string name=\"action_edit_image\">Modifica immagine</string>\n    <string name=\"saving_draft\">Salvataggio bozza…</string>\n    <string name=\"action_dismiss\">Scartare</string>\n    <string name=\"action_details\">Dettagli</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"account_date_joined\">Registrato da %1$s</string>\n    <string name=\"error_multimedia_size_limit\">Video and audio files non possono eccedere %1$s MB in dimensione.</string>\n    <string name=\"error_image_edit_failed\">L\\'immagine non può essere modificata.</string>\n    <string name=\"error_following_hashtag_format\">Errore provando a seguire #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Errore smettendo di provare a seguire #%1$s</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"error_loading_account_details\">Caricamento dettagli utente fallito</string>\n    <string name=\"delete_scheduled_post_warning\">Cancellare questo post programmato?</string>\n    <string name=\"instance_rule_title\">Regole di %1$s</string>\n    <string name=\"instance_rule_info\">Facendo il log in accetti le regole di %1$s.</string>\n    <string name=\"set_focus_description\">Tappa o crea un cerchio per scegliere il punto focale che sarà sempre visibile nelle anteprime.</string>\n    <string name=\"action_set_focus\">Imposta punto focale</string>\n    <string name=\"description_post_language\">Lingua del post</string>\n    <string name=\"pref_show_self_username_always\">Sempre</string>\n    <string name=\"pref_show_self_username_never\">Mai</string>\n    <string name=\"pref_show_self_username_disambiguate\">Quando connesso con più account</string>\n    <string name=\"duration_no_change\">(nessuna modifica)</string>\n    <string name=\"pref_title_show_self_username\">Mostra nome utente nelle barre strumenti</string>\n    <string name=\"action_add_or_remove_from_list\">Aggiunti o rimuovi dalla lista</string>\n    <string name=\"failed_to_add_to_list\">Aggiunta dell\\'account alla lista fallita</string>\n    <string name=\"failed_to_remove_from_list\">Rimozione dell\\'account dalla lista fallita</string>\n    <string name=\"compose_save_draft_loses_media\">Salvare bozza? (gli allegati verranno ricaricati quando ripristini la bozza.)</string>\n    <string name=\"failed_to_pin\">Fissaggio fallito</string>\n    <string name=\"hint_media_description_missing\">I media dovrebbero avere una descrizione.</string>\n    <string name=\"no_lists\">Non hai alcuna lista.</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"pref_default_post_language\">Lingua per i post creati (sincronizzato sul server)</string>\n    <string name=\"notification_report_description\">Notifiche sulle segnalazioni da moderare</string>\n    <string name=\"failed_to_unpin\">Rimozione del fissaggio fallita</string>\n    <string name=\"pref_title_http_proxy_port_message\">Il port dovrebbe essere tra %1$d e %2$d</string>\n    <string name=\"report_category_violation\">Violazione di una regola</string>\n    <string name=\"status_created_at_now\">adesso</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"notification_report_name\">Segnalazioni</string>\n    <string name=\"error_muting_hashtag_format\">Errore nel silenziamento di #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Errore nella rimozione del silenziamento di #%1$s</string>\n    <string name=\"title_followed_hashtags\">Hashtag seguiti</string>\n    <string name=\"description_post_edited\">Modificato</string>\n    <string name=\"error_following_hashtags_unsupported\">Questa istanza non permette di seguire gli hashtag.</string>\n    <string name=\"action_discard\">Scarta modifiche</string>\n    <string name=\"action_continue_edit\">Continua a modificare</string>\n    <string name=\"notification_report_format\">Nuova segnalazione su %1$s</string>\n    <string name=\"notification_header_report_format\">%1$s ha segnalato %2$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d post allegati</string>\n    <string name=\"action_add_reaction\">aggiungi reazione</string>\n    <string name=\"compose_unsaved_changes\">Hai delle modifiche non salvate.</string>\n    <string name=\"confirmation_hashtag_unfollowed\">Non segui più #%1$s</string>\n    <string name=\"error_status_source_load\">Caricamento dello status della sorgente dal server fallito.</string>\n    <string name=\"post_edited\">Modificato %1$s</string>\n    <string name=\"mute_notifications_switch\">Silenzia notifiche</string>\n    <string name=\"title_edits\">Modifiche</string>\n    <string name=\"report_category_spam\">Spam</string>\n    <string name=\"status_edit_info\">%1$s ha modificato</string>\n    <string name=\"status_created_info\">%1$s ha creato</string>\n    <string name=\"report_category_other\">Altro</string>\n    <string name=\"action_unfollow_hashtag_format\">Smettere di seguire #%1$s?</string>\n    <string name=\"action_post_failed\">Caricamento fallito</string>\n    <string name=\"action_browser_login\">Accedi dal browser</string>\n    <string name=\"a11y_label_loading_thread\">Carico il thread</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Disattivato</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;non impostato&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;non valido&gt;</string>\n    <string name=\"pref_reading_order_newest_first\">Più nuovi prima</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Non è stato possibile caricare il tuo post ed è stato salvato nelle bozze.\n\\n\n\\nNon è stato possibile contattare il server oppure il server ha rifiutato il post.</item>\n        <item quantity=\"many\">Non è stato possibile caricare i tuoi post e sono stati salvati nelle bozze.\n\\n\n\\nNon è stato possibile contattare il server oppure il server ha rifiutato i post.</item>\n        <item quantity=\"other\">Non è stato possibile caricare i tuoi post e sono stati salvati nelle bozze.\n\\n\n\\nNon è stato possibile contattare il server oppure il server ha rifiutato i post.</item>\n    </plurals>\n    <string name=\"action_post_failed_show_drafts\">Mostra bozze</string>\n    <string name=\"action_post_failed_do_nothing\">Chiudi</string>\n    <string name=\"send_account_username_to\">Condividi nome utente dell\\'account a…</string>\n    <string name=\"pref_title_reading_order\">Ordine di lettura</string>\n    <string name=\"description_login\">Funziona nella maggior parte dei casi. Nessun dato è trasferito ad altre app.</string>\n    <string name=\"description_browser_login\">Potrebbe supportare differenti metodi di autenticazione, ma richiede un browser supportato.</string>\n    <string name=\"pref_reading_order_oldest_first\">Più vecchi prima</string>\n    <string name=\"action_share_account_link\">Condividi link dell\\'account</string>\n    <string name=\"action_share_account_username\">Condividi il nome utente dell\\'account</string>\n    <string name=\"send_account_link_to\">Condividi URL account a…</string>\n    <string name=\"account_username_copied\">Nome utente copiato</string>\n    <string name=\"dialog_follow_hashtag_title\">Segui hashtag</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d persone parlano dell\\'hashtag %2$s</string>\n    <string name=\"total_usage\">Utilizzo totale</string>\n    <string name=\"total_accounts\">Account totali</string>\n    <string name=\"action_refresh\">Ricarica</string>\n    <string name=\"title_public_trending_hashtags\">Hashtag di tendenza</string>\n    <string name=\"help_empty_home\">Questa è la tua <b>Timeline principale</b>. Mostra i post più recenti degli account che segui. \n\\n \n\\nPer esplorare gli account puoi scoprirli in una delle altre timeline. Per esempio la timeline locale della tua istanza {{group}}. O puoi cercarli per fine {{search}}; per esempio cerca \\\"Tusky\\\" per trovare il nostro account Mastodon.</string>\n    <string name=\"notification_unknown_name\">Sconosciuto</string>\n    <string name=\"post_media_image\">Immagine</string>\n    <string name=\"label_filter_title\">Titolo</string>\n    <string name=\"filter_action_warn\">Avvisa</string>\n    <string name=\"filter_action_hide\">Nascondi</string>\n    <string name=\"ui_error_bookmark\">Salvataggio nei segnalibri fallito: %1$s</string>\n    <string name=\"socket_timeout_exception\">Contattare il tuo server ha richiesto troppo tempo</string>\n    <string name=\"ui_error_unknown\">motivo sconosciuto</string>\n    <string name=\"ui_error_clear_notifications\">Cancellazione notifiche fallita: %1$s</string>\n    <string name=\"ui_error_favourite\">Impossibile mettere nei preferiti: %1$s</string>\n    <string name=\"ui_error_reblog\">Condivisione del post fallita: %1$s</string>\n    <string name=\"ui_error_reject_follow_request\">Rifiuto richiesta di follow fallita: %1$s</string>\n    <string name=\"ui_error_vote\">Votazione al sondaggio fallita: %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">Accettazione richiesta di follow fallita: %1$s</string>\n    <string name=\"ui_success_accepted_follow_request\">Richiesta di follow accettata</string>\n    <string name=\"ui_success_rejected_follow_request\">Richiesta di follow bloccata</string>\n    <string name=\"select_list_manage\">Gestisci liste</string>\n    <string name=\"status_filtered_show_anyway\">Mostra comunque</string>\n    <string name=\"status_filter_placeholder_label_format\">Filtrato: %1$s</string>\n    <string name=\"pref_title_account_filter_keywords\">Profili</string>\n    <string name=\"hint_filter_title\">I miei filtri</string>\n    <string name=\"action_add\">Aggiungi</string>\n    <string name=\"pref_title_show_stat_inline\">Mostra le statistiche del post nella timeline</string>\n    <string name=\"filter_description_warn\">Nascondi l\\'intero post con un avviso</string>\n    <string name=\"filter_keyword_display_format\">%1$s (parola intera)</string>\n    <string name=\"filter_description_hide\">Nascondi completamente</string>\n    <string name=\"label_filter_action\">Azioni del filtro</string>\n    <string name=\"label_filter_context\">Contesti di filtraggio</string>\n    <string name=\"label_filter_keywords\">Parole chiave i frasi da filtrare</string>\n    <string name=\"filter_keyword_addition_title\">Aggiungi parola chiave</string>\n    <string name=\"filter_edit_keyword_title\">Modifica parola chiave</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"load_newest_notifications\">Carica le notifiche più recenti</string>\n    <string name=\"compose_delete_draft\">Cancellare bozza?</string>\n    <string name=\"error_missing_edits\">Il tuo server sa che questo post è stato modificato, ma non ha una copia delle modifiche, quindi non ti può essere mostrato. \n\\n \n\\nQuesto è il <a href=\"https://github.com/mastodon/mastodon/issues/25398\">problema Mastodon #25398</a>.</string>\n    <string name=\"pref_ui_text_size\">Dimensione testo dell\\'UI</string>\n    <string name=\"notification_listenable_worker_name\">Attività in secondo piano</string>\n    <string name=\"notification_listenable_worker_description\">Notifiche mentre Tusky è attivo in secondo piano</string>\n    <string name=\"notification_notification_worker\">Recupero notifiche…</string>\n    <string name=\"notification_prune_cache\">Manutenzione cache…</string>\n    <string name=\"about_device_info_title\">Il tuo dispositivo</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nVersione Android: %3$s\n\\nVersione SDK: %4$d</string>\n    <string name=\"about_account_info_title\">Il tuo account</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nVersione: %3$s</string>\n    <string name=\"list_exclusive_label\">Nascondi dalla timeline principale</string>\n    <string name=\"error_media_playback\">Playback fallito: %1$s</string>\n    <string name=\"dialog_delete_filter_text\">Cancellare filtro \\'%1$s\\'?</string>\n    <string name=\"dialog_delete_filter_positive_action\">Cancella</string>\n    <string name=\"about_copy\">Copia versione e informazioni dispositivo</string>\n    <string name=\"about_copied\">Versione e informazioni dispositivo copiate</string>\n    <string name=\"dialog_save_profile_changes_message\">Vuoi salvare le modifiche al tuo profilo?</string>\n    <string name=\"error_media_upload_sending_fmt\">Il caricamento è fallito: %1$s</string>\n    <string name=\"label_image\">Immagine</string>\n    <string name=\"app_theme_system_black\">Usa design di sistema (nero)</string>\n    <string name=\"help_empty_conversations\">Questi sono i tuoi <b>messaggi privati</b>; a volte sono chiamati conversazioni o messaggi diretti (DM). \\u0020\n\\n \\u0020\n\\nI messaggi privati sono creati impostando la visibilità {{public}} di un post su {{mail}} <i>Privato</i> e menzionando uno o più utenti nel testo. \\u0020\n\\n \\u0020\n\\nPer esempio puoi andare su un profilo e creare un messaggio {{edit}} e cambiare la visibilità.\n\\n\n\\nRicorda che i messaggi nel Fediverso non sono criptati end-to-end. Non condividere informazioni sensibili.</string>\n    <string name=\"unfollowing_hashtag_success_format\">Non segui più l\\'hashtag #%1$s</string>\n    <string name=\"unmuting_hashtag_success_format\">Riattivazione dell\\'hashtag #%1$s</string>\n    <string name=\"action_view_filter\">Vedi filtro</string>\n    <string name=\"following_hashtag_success_format\">Ora segui l\\'hashtag #%1$s</string>\n    <string name=\"muting_hashtag_success_format\">Hashtag #%1$s silenziato come avvertimento</string>\n    <string name=\"help_empty_lists\">Questa è la <b>vista delle tue liste</b>. Puoi definire un numero di liste private a cui aggiungere account. \n\\n \n\\nRICORDA che puoi aggiungere alle liste solo account che già segui. \n\\n \n\\nQueste liste possono essere utilizzate come scheda dalle Impostazioni account {{manage_accounts}} {{chevron_right}} Schede.</string>\n    <string name=\"title_public_trending_statuses\">Post di tendenza</string>\n    <string name=\"error_blocking_domain\">Silenziamento di %1$s fallito: %2$s</string>\n    <string name=\"error_unblocking_domain\">Riattivazione di %1$s fallito: %2$s</string>\n    <string name=\"pref_title_show_self_boosts\">Mostra boost ai tuoi post</string>\n    <string name=\"list_reply_policy_none\">Nessuno</string>\n    <string name=\"list_reply_policy_list\">Membri della lista</string>\n    <string name=\"list_reply_policy_followed\">Qualsiasi utente seguito</string>\n    <string name=\"list_reply_policy_label\">Mostra risposte a</string>\n    <string name=\"pref_title_show_self_boosts_description\">Qualcuno boosta il proprio post</string>\n    <string name=\"reply_sending\">Invio…</string>\n    <string name=\"reply_sending_long\">La tua risposta viene inviata.</string>\n    <string name=\"action_translate\">Traduci</string>\n    <string name=\"action_show_original\">Mostra originale</string>\n    <string name=\"label_translating\">Traduzione…</string>\n    <string name=\"label_translated\">Tradotto da %1$s con %2$s</string>\n    <string name=\"ui_error_translate\">Impossibile tradurre: %1$s</string>\n    <string name=\"pref_title_per_timeline_preferences\">Preferenze per timeline</string>\n    <string name=\"pref_title_show_notifications_filter\">Mostra filtro notifiche</string>\n    <string name=\"dialog_follow_warning\">Seguire questo account?</string>\n    <string name=\"report_category_legal\">Legale</string>\n    <string name=\"pref_title_confirm_follows\">Mostra conferma prima di seguire</string>\n    <string name=\"unknown_notification_type\">Tipo di notifica sconosciuto</string>\n    <string name=\"url_copied\">URL copiato</string>\n    <string name=\"confirmation_hashtag_copied\">\\'#%1$s\\' copiato</string>\n    <string name=\"pref_default_reply_privacy\">Privacy della risposta (non sincronizzato sul server)</string>\n    <string name=\"error_deleting_filter\">Errore nella cancellazione del filtro \\'%1$s\\'</string>\n    <string name=\"error_saving_filter\">Errore nel salvataggio del filtro \\'%1$s\\'</string>\n    <string name=\"action_follow_hashtag\">Segui un nuovo hashtag</string>\n    <string name=\"pref_default_reply_privacy_explanation\">La privacy preselezionata dipenderà dal post a cui stai rispondendo.</string>\n    <string name=\"pref_match_default_post_privacy\">Stessa privacy predefinita del post</string>\n    <string name=\"post_privacy_direct\">Diretto</string>\n    <string name=\"label_expires_after\">Scade dopo</string>\n    <string name=\"notification_policies_filter_dont_follow_description\">Fino a che non le approvi manualmente</string>\n    <string name=\"notification_policies_title\">Impostazioni notifiche</string>\n    <string name=\"notification_policies_filter_out\">Gestisci notifiche da…</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">Persone che non segui</string>\n    <string name=\"notification_policies_filter_not_following_title\">Persone che non ti seguono</string>\n    <string name=\"notification_policies_filter_not_following_description\">Incluse persone che ti seguono da meno di 3 giorni</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">Nuovi account</string>\n    <string name=\"unknown_notification_filter_new_accounts_description\">Creati negli ultimi 30 giorni</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_title\">Menzioni private non richieste</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_description\">Filtrate a meno che siano in risposta a una loro menzione o se segui il mittente</string>\n    <string name=\"unknown_notification_filter_moderated_accounts\">Account moderati</string>\n    <string name=\"unknown_notification_filter_moderated_accounts_description\">Limitato dai moderatori del server</string>\n    <string name=\"notification_policies_not_supported\">Questa funzione è supportata sui server che usano Mastodon v.4.3.0 o successiva.</string>\n    <string name=\"filtered_notifications\">Notifiche filtrate</string>\n    <string name=\"notifications_from_people_you_may_know\">Notifiche da %1$d persone che potresti conoscere</string>\n    <string name=\"notification_policy_accept\">Accetta</string>\n    <string name=\"notification_policy_filter\">Filtra</string>\n    <string name=\"notification_policy_ignore\">Ignora</string>\n    <string name=\"filtered_notifications_title\">Notifiche filtrate</string>\n    <string name=\"accept_notification_request\">Accetta richieste di notifica</string>\n    <string name=\"open_settings\">Apri preferenze</string>\n    <string name=\"notifications_from\">Notifiche da %1$s</string>\n    <string name=\"action_accept_notification_request\">Accetta</string>\n    <string name=\"action_dismiss_notification_request\">Ignora</string>\n    <string name=\"dismiss_notification_request\">Ignora richiesta di notifica</string>\n    <string name=\"post_replied_format\">In risposta a %1$s</string>\n    <string name=\"post_replied\">Con risposta</string>\n    <string name=\"post_replied_self\">Thread continuato</string>\n    <string name=\"follow_hashtag_success\">Hashtag %1$s seguito</string>\n    <string name=\"preview_card_by_author\">Da %1$s</string>\n    <string name=\"preview_card_more_by_author\">Altro da %1$s</string>\n    <string name=\"notification_severed_relationship_name\">Connessioni perse</string>\n    <string name=\"notification_moderation_warning_name\">Avvisi di moderazione</string>\n    <string name=\"notification_unknown_description\">Tipo di notifica ignoto</string>\n    <string name=\"notification_channel_other\">Altro</string>\n    <string name=\"notification_channel_other_description\">Altre notifiche, come connessioni perse e avvisi di moderazione</string>\n    <string name=\"notification_channel_admin\">Amministratore</string>\n    <string name=\"notification_channel_admin_description\">Notifiche amministratore, come nuove segnalazioni o iscrizioni</string>\n    <string name=\"relationship_severance_event_title\">Connessione persa</string>\n    <string name=\"relationship_severance_event_user_domain_block\">Hai bloccato %1$s, rimuovendo %2$s dai tuoi follower e %3$s che segui.</string>\n    <string name=\"unknown_notification_type_explanation\">Tusky non riconosce questo tipo di notifica e non te la può mostrare. L\\'interfaccia web potrebbe essere in grado di farlo. Per favore informa gli sviluppatori di Tusky così che possano aggiungerne il supporto!</string>\n    <string name=\"moderation_warning_action_mark_statuses_as_sensitive\">Alcuni tuoi post sono stati indicati come sensibili.</string>\n    <string name=\"relationship_severance_event_account_suspension\">Un amministratore di %1$s ha sospeso %2$s, il che significa che non riceverai più i loro aggiornamenti e non potrai interagire con loro.</string>\n    <string name=\"relationship_severance_event_domain_block\">Un amministratore di %1$s ha bloccato %2$s, includendo %3$s dei tuoi follower e %4$s che segui tu.</string>\n    <plurals name=\"accounts\">\n        <item quantity=\"one\">%1$s account</item>\n        <item quantity=\"many\">%1$s account</item>\n        <item quantity=\"other\">%1$s account</item>\n    </plurals>\n    <string name=\"moderation_warning\">Hai ricevuto un avviso di moderazione.</string>\n    <string name=\"moderation_warning_action_delete_statuses\">Alcuni dei tuoi post sono stati rimossi.</string>\n    <string name=\"moderation_warning_action_disable\">Il tuo account è stato disattivato.</string>\n    <string name=\"moderation_warning_action_none\">Il tuo account ha ricevuto un avviso di moderazione.</string>\n    <string name=\"moderation_warning_action_sensitive\">I tuoi post saranno indicati come sensibili da ora in poi.</string>\n    <string name=\"moderation_warning_action_silence\">Il tuo account è stato limitato.</string>\n    <string name=\"moderation_warning_action_suspend\">Il tuo account è stato sospeso.</string>\n    <string name=\"poll\">Sondaggio</string>\n    <plurals name=\"media_attachments\">\n        <item quantity=\"one\">%1$s allegato multimediale</item>\n        <item quantity=\"many\">%1$s allegati multimediali</item>\n        <item quantity=\"other\">%1$s allegati multimediali</item>\n    </plurals>\n    <string name=\"notification_info_reply\">Rispondi</string>\n    <string name=\"notification_info_private_mention\">Menzione privata</string>\n    <string name=\"notification_info_mention\">Menzione</string>\n    <string name=\"notification_info_private_reply\">Risposta privata</string>\n    <string name=\"action_reblog_private\">Ricondividi solo per chi ti segue</string>\n    <string name=\"action_reblog_public\">Ricondividi pubblicamente</string>\n    <string name=\"action_reblog_unlisted\">Ricondivisione non in elenco</string>\n    <string name=\"no\">No</string>\n    <string name=\"poll_show_results\">Mostra risultati</string>\n    <string name=\"yes\">Sì</string>\n    <string name=\"confirm_dismiss_caption\">Scartare le modifiche alla didascalia?</string>\n    <string name=\"mute_failure\">Silenziamento di %1$s fallito: %2$s</string>\n    <string name=\"unblock_failure\">Sblocco di %1$s fallito: %2$s</string>\n    <string name=\"unmute_failure\">Riattivazione di %1$s fallita: %2$s</string>\n    <string name=\"reject_follow_request_failure\">Respingimento richiesta follow di %1$s fallita: %2$s</string>\n    <string name=\"unblock_success\">Sbloccato %1$s</string>\n    <string name=\"unmute_success\">Riattivato %1$s</string>\n    <string name=\"block_failure\">Blocco di %1$s fallito: %2$s</string>\n    <string name=\"accept_follow_request_failure\">Accettazione del follow di %1$s fallita: %2$s</string>\n    <string name=\"filter_description_blur\">Nascondi media con un avviso</string>\n    <string name=\"reblog_privacy_followers_only_description\">Solo chi ti segue può vedere le tue ricondivisioni</string>\n    <string name=\"reblog_confirm\">Ricondividere questo post?</string>\n    <string name=\"favourite_confirm\">Mettere questo post tra i preferiti?</string>\n    <string name=\"filter_action_blur\">Sfoca</string>\n    <string name=\"reblog_privacy_unlisted_description\">Uguale a \\\"Pubblico\\\" ma non verrà mai mostrato nelle timeline pubbliche</string>\n    <string name=\"reblog_privacy_public_description\">Tutti possono vedere la tua ricondivisione</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-iw/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    </resources>"
  },
  {
    "path": "app/src/main/res/values-ja/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">エラーが発生しました。</string>\n    <string name=\"error_empty\">本文なしでは投稿できません。</string>\n    <string name=\"error_invalid_domain\">無効なドメインです</string>\n    <string name=\"error_failed_app_registration\">そのインスタンスでの認証に失敗しました。失敗が続く場合、メニューからブラウザでのログインを試してください。</string>\n    <string name=\"error_no_web_browser_found\">ウェブブラウザが見つかりませんでした。</string>\n    <string name=\"error_authorization_unknown\">不明な承認エラーが発生しました。失敗が続く場合、メニューからブラウザでのログインを試してください。</string>\n    <string name=\"error_authorization_denied\">認証が拒否されました。正しい認証情報を入力したことが確かな場合、メニューからブラウザでのログインを試してください。</string>\n    <string name=\"error_retrieving_oauth_token\">ログイントークンの取得に失敗しました。もし失敗が続く場合、メニューからブラウザでのログインを試してください。</string>\n    <string name=\"error_compose_character_limit\">投稿文が長すぎます！</string>\n    <string name=\"error_media_upload_type\">その形式のファイルはアップロードできません。</string>\n    <string name=\"error_media_upload_opening\">ファイルを開けませんでした。</string>\n    <string name=\"error_media_upload_permission\">メディアの読み取り許可が必要です。</string>\n    <string name=\"error_media_download_permission\">メディアの書き込み許可が必要です。</string>\n    <string name=\"error_media_upload_image_or_video\">画像と動画を同時に投稿することはできません。</string>\n    <string name=\"error_media_upload_sending\">アップロードに失敗しました。</string>\n    <string name=\"error_sender_account_gone\">投稿送信時のエラーです。</string>\n    <string name=\"title_home\">ホーム</string>\n    <string name=\"title_notifications\">通知</string>\n    <string name=\"title_public_local\">ローカル</string>\n    <string name=\"title_public_federated\">連合</string>\n    <string name=\"title_direct_messages\">ダイレクトメッセージ</string>\n    <string name=\"title_tab_preferences\">タブ</string>\n    <string name=\"title_view_thread\">スレッド</string>\n    <string name=\"title_posts\">投稿</string>\n    <string name=\"title_posts_with_replies\">投稿と返信</string>\n    <string name=\"title_posts_pinned\">ピン留め</string>\n    <string name=\"title_follows\">フォロー</string>\n    <string name=\"title_followers\">フォロワー</string>\n    <string name=\"title_favourites\">お気に入り</string>\n    <string name=\"title_mutes\">ミュートしたユーザー</string>\n    <string name=\"title_blocks\">ブロックしたユーザー</string>\n    <string name=\"title_follow_requests\">フォローリクエスト</string>\n    <string name=\"title_edit_profile\">プロフィールを編集</string>\n    <string name=\"title_drafts\">下書き</string>\n    <string name=\"title_licenses\">ライセンス</string>\n    <string name=\"post_boosted_format\">%1$sさんがブーストしました</string>\n    <string name=\"post_sensitive_media_title\">閲覧注意</string>\n    <string name=\"post_media_hidden_title\">非表示のメディア</string>\n    <string name=\"post_sensitive_media_directions\">タップして表示</string>\n    <string name=\"post_content_warning_show_more\">続きを表示</string>\n    <string name=\"post_content_warning_show_less\">続きを隠す</string>\n    <string name=\"post_content_show_more\">続きを読む</string>\n    <string name=\"post_content_show_less\">閉じる</string>\n    <string name=\"message_empty\">何もありません。</string>\n    <string name=\"footer_empty\">現在投稿はありません。更新するにはプルダウンしてください！</string>\n    <string name=\"notification_reblog_format\">%1$sさんが投稿をブーストしました</string>\n    <string name=\"notification_favourite_format\">%1$sさんが投稿をお気に入りに登録しました</string>\n    <string name=\"notification_follow_format\">%1$sさんにフォローされました</string>\n    <string name=\"report_username_format\">\\@%1$sさんを通報</string>\n    <string name=\"report_comment_hint\">コメント</string>\n    <string name=\"action_quick_reply\">クイック返信</string>\n    <string name=\"action_reply\">返信</string>\n    <string name=\"action_reblog\">ブースト</string>\n    <string name=\"action_favourite\">お気に入り</string>\n    <string name=\"action_more\">その他</string>\n    <string name=\"action_compose\">投稿する</string>\n    <string name=\"action_login\">Tusky でログイン</string>\n    <string name=\"action_logout\">ログアウト</string>\n    <string name=\"action_logout_confirm\">アカウント %1$s からログアウトしてもよろしいですか？ログアウトすると、下書きや詳細設定を含めて、ローカルに保存されているアカウントの全てのデータが削除されます。</string>\n    <string name=\"action_follow\">フォローする</string>\n    <string name=\"action_unfollow\">フォロー解除</string>\n    <string name=\"action_block\">ブロック</string>\n    <string name=\"action_unblock\">ブロック解除</string>\n    <string name=\"action_hide_reblogs\">ブーストを非表示</string>\n    <string name=\"action_show_reblogs\">ブーストを表示</string>\n    <string name=\"action_report\">通報</string>\n    <string name=\"action_delete\">削除</string>\n    <string name=\"action_delete_and_redraft\">削除して編集</string>\n    <string name=\"action_send\">トゥート</string>\n    <string name=\"action_send_public\">トゥート！</string>\n    <string name=\"action_retry\">再試行</string>\n    <string name=\"action_close\">閉じる</string>\n    <string name=\"action_view_profile\">プロフィール</string>\n    <string name=\"action_view_preferences\">設定</string>\n    <string name=\"action_view_account_preferences\">アカウント設定</string>\n    <string name=\"action_view_favourites\">お気に入り</string>\n    <string name=\"action_view_mutes\">ミュートしたユーザー</string>\n    <string name=\"action_view_blocks\">ブロックしたユーザー</string>\n    <string name=\"action_view_follow_requests\">フォローリクエスト</string>\n    <string name=\"action_view_media\">メディア</string>\n    <string name=\"action_open_in_web\">ブラウザで開く</string>\n    <string name=\"action_add_media\">メディアを追加</string>\n    <string name=\"action_photo_take\">写真を撮る</string>\n    <string name=\"action_share\">共有</string>\n    <string name=\"action_mute\">ミュート</string>\n    <string name=\"action_unmute\">ミュート解除</string>\n    <string name=\"action_mention\">返信</string>\n    <string name=\"action_hide_media\">メディアを隠す</string>\n    <string name=\"action_open_drawer\">メニューを開く</string>\n    <string name=\"action_save\">保存</string>\n    <string name=\"action_edit_profile\">プロフィールを編集</string>\n    <string name=\"action_edit_own_profile\">編集</string>\n    <string name=\"action_undo\">取り消す</string>\n    <string name=\"action_accept\">許可</string>\n    <string name=\"action_reject\">拒否</string>\n    <string name=\"action_search\">検索</string>\n    <string name=\"action_access_drafts\">下書き</string>\n    <string name=\"action_toggle_visibility\">投稿の公開範囲</string>\n    <string name=\"action_content_warning\">注意書き</string>\n    <string name=\"action_emoji_keyboard\">絵文字キーボード</string>\n    <string name=\"action_add_tab\">タブの追加</string>\n    <string name=\"action_links\">リンク</string>\n    <string name=\"action_hashtags\">ハッシュタグ</string>\n    <string name=\"title_hashtags_dialog\">ハッシュタグ</string>\n    <string name=\"title_links_dialog\">リンク</string>\n    <string name=\"download_image\">%1$s をダウンロードしています</string>\n    <string name=\"action_copy_link\">リンクをコピー</string>\n    <string name=\"action_open_as\">%1$s として開く</string>\n    <string name=\"action_share_as\">共有先…</string>\n    <string name=\"send_post_link_to\">投稿URLを共有…</string>\n    <string name=\"send_post_content_to\">投稿を共有…</string>\n    <string name=\"send_media_to\">メディアを共有…</string>\n    <string name=\"confirmation_reported\">送信しました！</string>\n    <string name=\"confirmation_unblocked\">ブロックを解除しました</string>\n    <string name=\"confirmation_unmuted\">ミュートを解除しました</string>\n    <string name=\"hint_domain\">インスタンス</string>\n    <string name=\"hint_compose\">今なにしてる？</string>\n    <string name=\"hint_content_warning\">注意書き</string>\n    <string name=\"hint_display_name\">表示名</string>\n    <string name=\"hint_note\">プロフィール</string>\n    <string name=\"hint_search\">ユーザーを検索…</string>\n    <string name=\"search_no_results\">見つかりませんでした</string>\n    <string name=\"label_quick_reply\">返信…</string>\n    <string name=\"label_avatar\">アイコン</string>\n    <string name=\"label_header\">ヘッダー</string>\n    <string name=\"link_whats_an_instance\">インスタンスとは？</string>\n    <string name=\"login_connection\">接続中…</string>\n    <string name=\"dialog_whats_an_instance\">mastodon.social, icosahedron.website, social.tchncs.deや<a href=\"https://instances.social\">その他</a> のような、あらゆるインスタンスのアドレスやドメインを入力できます。 \\u0020\n\\n \\u0020\n\\nまだアカウントをお持ちでない場合は、参加したいインスタンスの名前を入力することで そのインスタンスにアカウントを作成できます。 \\u0020\n\\n \\u0020\n\\nインスタンスはあなたのアカウントが提供される単独の場所ですが、他のインスタンスのユーザーとあたかも同じ場所にいるように簡単にコミュニケーションをとったりフォローしたりできます。 \\u0020\n\\n \\u0020\n\\nさらに詳しい情報は<a href=\"https://joinmastodon.org\">joinmastodon.org</a>でご覧いただけます。 </string>\n    <string name=\"dialog_title_finishing_media_upload\">メディアをアップロードしています</string>\n    <string name=\"dialog_message_uploading_media\">アップロード中…</string>\n    <string name=\"dialog_download_image\">ダウンロード</string>\n    <string name=\"dialog_message_cancel_follow_request\">フォローリクエストを取り消しますか？</string>\n    <string name=\"dialog_unfollow_warning\">このアカウントをフォロー解除しますか？</string>\n    <string name=\"dialog_delete_post_warning\">本当に削除しますか？</string>\n    <string name=\"visibility_public\">公開：公開タイムラインに投稿する</string>\n    <string name=\"visibility_unlisted\">未収載：公開タイムラインには表示しない</string>\n    <string name=\"visibility_private\">フォロワー限定：フォロワーだけに公開</string>\n    <string name=\"visibility_direct\">ダイレクト：返信先のユーザーだけに公開</string>\n    <string name=\"pref_title_edit_notification_settings\">通知</string>\n    <string name=\"pref_title_notifications_enabled\">通知</string>\n    <string name=\"pref_title_notification_alerts\">通知時の動作</string>\n    <string name=\"pref_title_notification_alert_sound\">着信音を鳴らす</string>\n    <string name=\"pref_title_notification_alert_vibrate\">バイブレーションする</string>\n    <string name=\"pref_title_notification_alert_light\">通知ランプ</string>\n    <string name=\"pref_title_notification_filters\">通知の種類</string>\n    <string name=\"pref_title_appearance_settings\">表示</string>\n    <string name=\"pref_title_app_theme\">アプリテーマ</string>\n    <string name=\"pref_title_timelines\">タイムライン</string>\n    <string name=\"pref_title_timeline_filters\">フィルター</string>\n    <string name=\"app_them_dark\">ダーク</string>\n    <string name=\"app_theme_light\">ライト</string>\n    <string name=\"app_theme_black\">ブラック</string>\n    <string name=\"app_theme_auto\">日没による自動設定</string>\n    <string name=\"pref_title_browser_settings\">ブラウザ</string>\n    <string name=\"pref_title_custom_tabs\">Chrome Custom Tabsを使用する</string>\n    <string name=\"pref_title_language\">言語</string>\n    <string name=\"pref_title_post_filter\">タイムラインのフィルタリング</string>\n    <string name=\"pref_title_post_tabs\">タブ</string>\n    <string name=\"pref_title_show_boosts\">ブーストを表示</string>\n    <string name=\"pref_title_show_replies\">返信を表示</string>\n    <string name=\"pref_title_show_media_preview\">メディアのプレビューを表示する</string>\n    <string name=\"pref_title_proxy_settings\">プロキシー</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTPプロキシー</string>\n    <string name=\"pref_title_http_proxy_enable\">HTTPプロキシーを有効化</string>\n    <string name=\"pref_title_http_proxy_server\">HTTPプロキシーサーバー</string>\n    <string name=\"pref_title_http_proxy_port\">HTTPプロキシーポート</string>\n    <string name=\"pref_default_post_privacy\">デフォルトの投稿プライバシー</string>\n    <string name=\"pref_default_media_sensitivity\">メディアを常に閲覧注意としてマークする</string>\n    <string name=\"pref_publishing\">投稿</string>\n    <string name=\"pref_failed_to_sync\">設定の同期に失敗しました</string>\n    <string name=\"post_privacy_public\">公開</string>\n    <string name=\"post_privacy_unlisted\">未収載</string>\n    <string name=\"post_privacy_followers_only\">フォロワーに限定</string>\n    <string name=\"pref_post_text_size\">投稿のテキストサイズ</string>\n    <string name=\"post_text_size_smallest\">最小</string>\n    <string name=\"post_text_size_small\">小</string>\n    <string name=\"post_text_size_medium\">中</string>\n    <string name=\"post_text_size_large\">大</string>\n    <string name=\"post_text_size_largest\">最大</string>\n    <string name=\"notification_mention_name\">新しい返信</string>\n    <string name=\"notification_mention_descriptions\">新しい返信の通知</string>\n    <string name=\"notification_follow_name\">新しいフォロワー</string>\n    <string name=\"notification_follow_description\">新しいフォロワーの通知</string>\n    <string name=\"notification_boost_name\">ブースト</string>\n    <string name=\"notification_boost_description\">あなたの投稿がブーストされたときの通知</string>\n    <string name=\"notification_favourite_name\">お気に入り</string>\n    <string name=\"notification_favourite_description\">あなたの投稿がお気に入りに登録されたときの通知</string>\n    <string name=\"notification_mention_format\">%1$sさんが返信しました</string>\n    <string name=\"notification_summary_large\">%1$sさん、%2$sさん、%3$sさんと他%4$d人</string>\n    <string name=\"notification_summary_medium\">%1$sさん、%2$sさん、%3$sさん</string>\n    <string name=\"notification_summary_small\">%1$sさん、%2$sさん</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"other\">%1$d件の新しい通知</item>\n    </plurals>\n    <string name=\"description_account_locked\">非公開アカウント</string>\n    <string name=\"about_title_activity\">このアプリについて</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_tusky_license\">Tuskyは無料のオープンソースソフトウェアです。<!--\n     -->GNU General Public License Version 3 の下で使用許諾されています。<!--\n     -->ライセンスはここからご覧いただけます： https://www.gnu.org/licenses/gpl-3.0.ja.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">プロジェクトのウェブサイト (英語): https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">バグ報告と機能リクエスト (英語): https://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Tusky公式アカウント</string>\n    <string name=\"post_share_content\">投稿の内容を共有</string>\n    <string name=\"post_share_link\">投稿へのリンクを共有</string>\n    <string name=\"post_media_images\">画像</string>\n    <string name=\"post_media_video\">動画</string>\n    <string name=\"state_follow_requested\">フォローリクエスト中</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"status_created_at_now\">現在</string>\n    <string name=\"abbreviated_in_years\">%1$d年後</string>\n    <string name=\"abbreviated_in_days\">%1$d日後</string>\n    <string name=\"abbreviated_in_hours\">%1$d時間後</string>\n    <string name=\"abbreviated_in_minutes\">%1$d分後</string>\n    <string name=\"abbreviated_in_seconds\">%1$d秒後</string>\n    <string name=\"abbreviated_years_ago\">%1$d年前</string>\n    <string name=\"abbreviated_days_ago\">%1$d日前</string>\n    <string name=\"abbreviated_hours_ago\">%1$d時間前</string>\n    <string name=\"abbreviated_minutes_ago\">%1$d分前</string>\n    <string name=\"abbreviated_seconds_ago\">%1$d秒前</string>\n    <string name=\"follows_you\">あなたをフォロー中</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">閲覧注意のメディアを常に表示</string>\n    <string name=\"title_media\">メディア</string>\n    <string name=\"replying_to\">\\@%1$sに返信</string>\n    <string name=\"load_more_placeholder_text\">さらに読み込む</string>\n    <string name=\"filter_addition_title\">フィルターを追加</string>\n    <string name=\"filter_edit_title\">フィルターを編集</string>\n    <string name=\"add_account_name\">アカウントを追加</string>\n    <string name=\"add_account_description\">新しいMastodonアカウントを追加</string>\n    <string name=\"action_lists\">リスト</string>\n    <string name=\"title_lists\">リスト</string>\n    <string name=\"error_rename_list\">リスト名を更新できませんでした</string>\n    <string name=\"action_rename_list\">リスト名の更新</string>\n    <string name=\"compose_active_account_description\">%1$sとして投稿</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"other\">視覚障害者のためのコンテキストを記入してください (%1$d文字まで)</item>\n    </plurals>\n    <string name=\"action_set_caption\">説明を設定</string>\n    <string name=\"action_remove\">消去</string>\n    <string name=\"lock_account_label\">アカウントをロック</string>\n    <string name=\"lock_account_label_description\">フォロワーを手動で承認する必要があります</string>\n    <string name=\"compose_save_draft\">下書きを保存しますか？</string>\n    <string name=\"send_post_notification_title\">投稿を送信中です…</string>\n    <string name=\"send_post_notification_error_title\">投稿の送信エラー</string>\n    <string name=\"send_post_notification_channel_name\">投稿の送信中</string>\n    <string name=\"send_post_notification_cancel_title\">送信がキャンセルされました</string>\n    <string name=\"send_post_notification_saved_content\">投稿のコピーが下書きに保存されました</string>\n    <string name=\"action_compose_shortcut\">投稿する</string>\n    <string name=\"error_no_custom_emojis\">インスタンス %1$s にはカスタム絵文字がありません</string>\n    <string name=\"emoji_style\">絵文字スタイル</string>\n    <string name=\"system_default\">システムのデフォルト</string>\n    <string name=\"download_fonts\">最初にこれらの絵文字セットをダウンロードする必要があります</string>\n    <string name=\"performing_lookup_title\">検索中…</string>\n    <string name=\"expand_collapse_all_posts\">全て開く/閉じる</string>\n    <string name=\"action_open_post\">投稿を開く</string>\n    <string name=\"restart_required\">アプリの再起動が必要です</string>\n    <string name=\"restart_emoji\">これらの変更を適用するには、Tuskyの再起動が必要になります</string>\n    <string name=\"later\">後で</string>\n    <string name=\"restart\">再起動</string>\n    <string name=\"caption_systememoji\">あなたのデバイスのデフォルト絵文字セットです</string>\n    <string name=\"caption_blobmoji\">Android 4.4-7.1で知られる、Blob絵文字です</string>\n    <string name=\"caption_twemoji\">Mastodonの標準絵文字セットです</string>\n    <string name=\"download_failed\">ダウンロード失敗</string>\n    <string name=\"profile_badge_bot_text\">ボット</string>\n    <string name=\"account_moved_description\">%1$s は引っ越しました:</string>\n    <string name=\"reblog_private\">ブースト</string>\n    <string name=\"unreblog_private\">ブーストを解除</string>\n    <string name=\"license_description\">Tuskyは、以下のオープンソース プロジェクトからのコードとアセットを含んでいます:</string>\n    <string name=\"license_apache_2\">Apache Licenseの下にライセンスされています（下記をコピー）</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">プロフィール メタデータ</string>\n    <string name=\"profile_metadata_add\">データを追加</string>\n    <string name=\"profile_metadata_label_label\">ラベル</string>\n    <string name=\"profile_metadata_content_label\">内容</string>\n    <string name=\"pref_title_absolute_time\">絶対時間で表示</string>\n    <string name=\"label_remote_account\">以下の情報は不正確な可能性があります。タップしてブラウザでプロフィールを開く</string>\n    <string name=\"unpin_action\">固定表示を解除</string>\n    <string name=\"pin_action\">プロフィールに固定</string>\n    <plurals name=\"favs\">\n        <item quantity=\"other\"><b>%1$s</b> お気に入り</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"other\"><b>%1$s</b> ブースト</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">ブーストした人物</string>\n    <string name=\"title_favourited_by\">お気に入りした人物</string>\n    <string name=\"description_visibility_public\">公開</string>\n    <string name=\"description_visibility_unlisted\">未収載</string>\n    <string name=\"description_visibility_direct\">ダイレクト</string>\n    <string name=\"hint_list_name\">リスト名</string>\n    <string name=\"error_network\">ネットワークエラーが発生しました。接続を確認してもう一度試してください。</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"action_unreblog\">ブーストを解除</string>\n    <string name=\"action_unfavourite\">お気に入りを解除</string>\n    <string name=\"action_open_reblogged_by\">ブーストを表示</string>\n    <string name=\"download_media\">メディアをダウンロード</string>\n    <string name=\"downloading_media\">メディアをダウンロード中</string>\n    <string name=\"app_theme_system\">システムの設定を利用</string>\n    <string name=\"notifications_clear\">削除</string>\n    <string name=\"notifications_apply_filter\">フィルター</string>\n    <string name=\"notification_clear_text\">すべての通知を完全に削除してよろしいですか？</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"other\">%1$s票</item>\n    </plurals>\n    <string name=\"poll_vote\">投票</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"other\">残り%1$d日</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"other\">残り%1$d時間</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"other\">残り%1$d分</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"other\">残り%1$d秒</item>\n    </plurals>\n    <string name=\"title_domain_mutes\">非表示のドメイン</string>\n    <string name=\"action_view_domain_mutes\">非表示のドメイン</string>\n    <string name=\"action_mute_domain\">%1$sをミュート</string>\n    <string name=\"notification_poll_name\">投票</string>\n    <string name=\"notification_poll_description\">投票の集計が完了したときの通知</string>\n    <string name=\"pref_title_thread_filter_keywords\">会話</string>\n    <string name=\"caption_notoemoji\">Googleの現在の絵文字セットです</string>\n    <string name=\"action_add_poll\">投票</string>\n    <string name=\"action_mentions\">返信</string>\n    <string name=\"title_mentions_dialog\">返信</string>\n    <string name=\"dialog_redraft_post_warning\">この投稿を削除し、下書きに戻しますか？</string>\n    <string name=\"filter_dialog_remove_button\">削除</string>\n    <string name=\"filter_dialog_update_button\">更新</string>\n    <string name=\"error_create_list\">リストを作成できませんでした</string>\n    <string name=\"error_delete_list\">リストを削除できませんでした</string>\n    <string name=\"action_create_list\">リストの作成</string>\n    <string name=\"action_delete_list\">リストの削除</string>\n    <string name=\"hint_search_people_list\">フォロワーを検索</string>\n    <string name=\"action_add_to_list\">リストにアカウントを追加</string>\n    <string name=\"action_remove_from_list\">リストからアカウントを削除</string>\n    <string name=\"poll_ended_voted\">参加した投票の結果がでました</string>\n    <string name=\"poll_ended_created\">作成した投票の結果がでました</string>\n    <string name=\"create_poll_title\">投票</string>\n    <string name=\"duration_5_min\">5分</string>\n    <string name=\"duration_30_min\">30分</string>\n    <string name=\"duration_1_hour\">1時間</string>\n    <string name=\"duration_6_hours\">6時間</string>\n    <string name=\"duration_1_day\">1日</string>\n    <string name=\"duration_3_days\">3日</string>\n    <string name=\"duration_7_days\">7日</string>\n    <string name=\"add_poll_choice\">選択肢を追加</string>\n    <string name=\"poll_allow_multiple_choices\">複数選択可</string>\n    <string name=\"edit_poll\">編集</string>\n    <string name=\"pref_title_bot_overlay\">ボットマークを表示</string>\n    <string name=\"pref_title_animate_gif_avatars\">GIFアバターを動かす</string>\n    <string name=\"pref_title_public_filter_keywords\">公開タイムライン</string>\n    <string name=\"description_post_cw\">閲覧注意：%1$s</string>\n    <string name=\"filter_apply\">適用</string>\n    <string name=\"poll_info_closed\">投票終了</string>\n    <string name=\"title_accounts\">アカウント</string>\n    <string name=\"failed_search\">検索に失敗しました</string>\n    <string name=\"action_reset_schedule\">リセット</string>\n    <string name=\"title_bookmarks\">ブックマーク</string>\n    <string name=\"action_bookmark\">ブックマーク</string>\n    <string name=\"action_edit\">編集</string>\n    <string name=\"action_view_bookmarks\">ブックマーク</string>\n    <string name=\"title_scheduled_posts\">予約投稿</string>\n    <string name=\"action_access_scheduled_posts\">予約投稿</string>\n    <string name=\"action_schedule_post\">予約投稿</string>\n    <string name=\"description_visibility_private\">フォロワー</string>\n    <string name=\"conversation_2_recipients\">%1$sさん、%2$sさん</string>\n    <string name=\"notification_follow_request_name\">フォローリクエスト</string>\n    <string name=\"action_unmute_desc\">%1$sさんのミュートを解除</string>\n    <string name=\"notification_follow_request_format\">%1$sさんがあなたにフォローリクエストしました</string>\n    <string name=\"report_sent_success\">\\@%1$sさんを通報しました</string>\n    <string name=\"no_scheduled_posts\">予約した投稿はありません。</string>\n    <string name=\"no_drafts\">下書きはありません。</string>\n    <string name=\"poll_new_choice_hint\">項目 %1$d</string>\n    <string name=\"report_description_remote_instance\">このアカウントは外部のサーバーにあります。匿名化された通報の複製をそちらにも送信しますか？</string>\n    <string name=\"report_description_1\">通報をサーバーのモデレーターに送信します。以下にこのアカウントを通報理由を入力できます:</string>\n    <string name=\"failed_fetch_posts\">投稿を取得できませんでした</string>\n    <string name=\"button_done\">完了</string>\n    <string name=\"button_back\">戻る</string>\n    <string name=\"button_continue\">続ける</string>\n    <string name=\"compose_shortcut_short_label\">投稿</string>\n    <string name=\"compose_shortcut_long_label\">投稿する</string>\n    <string name=\"list\">リスト</string>\n    <string name=\"hashtags\">ハッシュタグ</string>\n    <string name=\"add_hashtag_title\">ハッシュタグを追加</string>\n    <string name=\"description_post_media_no_description_placeholder\">説明なし</string>\n    <string name=\"description_post_media\">メディア: %1$s</string>\n    <string name=\"conversation_more_recipients\">%1$sさん、%2$sさんと他%3$d人</string>\n    <string name=\"conversation_1_recipients\">%1$sさん</string>\n    <string name=\"filter_add_description\">フィルターする語句</string>\n    <string name=\"filter_dialog_whole_word_description\">キーワードまたは語句が英数字のみである時、単語全体と一致する場合のみ適用されます</string>\n    <string name=\"notification_follow_request_description\">フォローリクエストについての通知</string>\n    <string name=\"pref_main_nav_position_option_bottom\">下部</string>\n    <string name=\"pref_main_nav_position_option_top\">上部</string>\n    <string name=\"pref_main_nav_position\">メインナビゲーションの位置</string>\n    <string name=\"pref_title_gradient_for_media\">非表示のメディアを色付きのぼかしで表示する</string>\n    <string name=\"dialog_mute_hide_notifications\">通知を非表示</string>\n    <string name=\"dialog_mute_warning\">\\@%1$sさんをミュートしますか？</string>\n    <string name=\"dialog_block_warning\">\\@%1$sさんをブロックしますか？</string>\n    <string name=\"pref_title_alway_open_spoiler\">閲覧注意としてマークされた投稿を常に展開する</string>\n    <string name=\"action_open_media_n\">メディア #%1$d を開く</string>\n    <string name=\"action_open_faved_by\">お気に入りを表示</string>\n    <string name=\"action_open_reblogger\">ブーストしたユーザーを開く</string>\n    <string name=\"action_unmute_conversation\">会話のミュートを解除</string>\n    <string name=\"action_mute_conversation\">会話をミュート</string>\n    <string name=\"action_unmute_domain\">%1$sのミュートを解除</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">タブ間の切り替えにスワイプのジェスチャーを有効化</string>\n    <string name=\"pref_title_show_cards_in_timelines\">リンクのプレビューをタイムラインに表示</string>\n    <string name=\"pref_title_confirm_reblogs\">ブーストする前に確認を表示</string>\n    <string name=\"pick_hashtag_hint\">ハッシュタグ (#をつけない)</string>\n    <string name=\"select_list_title\">リストを選択</string>\n    <string name=\"poll_info_format\"> <!-- 15 votes • 1 hour left --> %1$s • %2$s</string>\n    <string name=\"poll_info_time_absolute\">%1$sに終了</string>\n    <string name=\"hint_additional_info\">追加コメント</string>\n    <string name=\"report_remote_instance\">%1$sに転送</string>\n    <string name=\"failed_report\">通報に失敗しました</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"other\">%1$s人</item>\n    </plurals>\n    <string name=\"warning_scheduling_interval\">Mastodonにおける予約までの最小間隔は5分です。</string>\n    <string name=\"notification_subscription_format\">%1$sさんが投稿しました</string>\n    <string name=\"title_announcements\">お知らせ</string>\n    <string name=\"mute_domain_warning\">本当に %1$s のすべてをブロックするのですか？ そのドメインからのコンテンツは、公開タイムラインや通知に表示されなくなります。また、そのドメインのフォロワーは削除されます。</string>\n    <string name=\"post_media_audio\">音声</string>\n    <string name=\"mute_domain_warning_dialog_ok\">ドメイン全体を非表示</string>\n    <string name=\"about_powered_by_tusky\">Tuskyによって提供されています</string>\n    <string name=\"delete_scheduled_post_warning\">この予約投稿を削除しますか？</string>\n    <string name=\"instance_rule_info\">ログインにより %1$s のルールに同意することになります。</string>\n    <string name=\"action_unbookmark\">ブックマークを削除</string>\n    <string name=\"action_delete_conversation\">会話を削除</string>\n    <string name=\"action_details\">詳細情報</string>\n    <string name=\"notification_sign_up_format\">%1$sさんがサインアップしました</string>\n    <string name=\"action_add_or_remove_from_list\">リストへの追加または削除</string>\n    <string name=\"description_post_language\">投稿言語</string>\n    <string name=\"description_post_favourited\">お気に入りに追加しました</string>\n    <string name=\"description_post_bookmarked\">ブックマークに追加しました</string>\n    <string name=\"label_duration\">期間</string>\n    <string name=\"duration_indefinite\">無期限</string>\n    <string name=\"duration_14_days\">14日間</string>\n    <string name=\"duration_30_days\">30日間</string>\n    <string name=\"duration_60_days\">60日間</string>\n    <string name=\"no_lists\">まだリストがありません。</string>\n    <string name=\"pref_title_show_self_username\">ツールバーにユーザー名を表示する</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"compose_save_draft_loses_media\">下書きを保存しますか？ (添付ファイルは下書きの復元時に再アップロードされます。)</string>\n    <string name=\"duration_90_days\">90日間</string>\n    <string name=\"duration_180_days\">180日間</string>\n    <string name=\"duration_365_days\">365日間</string>\n    <string name=\"limit_notifications\">タイムライン通知を制限する</string>\n    <string name=\"wellbeing_hide_stats_posts\">投稿上の数値的な統計情報を隠す</string>\n    <string name=\"failed_to_pin\">ピン留めに失敗しました</string>\n    <string name=\"failed_to_unpin\">ピン留めの解除に失敗しました</string>\n    <string name=\"description_post_reblogged\">リブログしました</string>\n    <string name=\"saving_draft\">下書きの保存中…</string>\n    <string name=\"pref_default_post_language\">デフォルトの投稿言語</string>\n    <string name=\"pref_show_self_username_always\">常に表示</string>\n    <string name=\"pref_show_self_username_disambiguate\">複数アカウントでのログイン時</string>\n    <string name=\"pref_show_self_username_never\">表示しない</string>\n    <string name=\"notification_subscription_name\">新しい投稿</string>\n    <string name=\"notification_subscription_description\">あなたが購読した誰かが新しい投稿をしたときの通知</string>\n    <string name=\"filter_dialog_whole_word\">単語全体</string>\n    <string name=\"compose_preview_image_description\">画像 %1$s に対する操作</string>\n    <string name=\"duration_no_change\">(変更なし)</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"error_multimedia_size_limit\">ビデオと音声ファイルのサイズは %1$s MB を超えることはできません。</string>\n    <string name=\"error_image_edit_failed\">画像が編集できませんでした。</string>\n    <string name=\"title_login\">ログイン</string>\n    <string name=\"action_edit_image\">画像の編集</string>\n    <string name=\"instance_rule_title\">%1$s のルール</string>\n    <string name=\"error_following_hashtags_unsupported\">このインスタンスはハッシュタグのフォローに対応していません。</string>\n    <string name=\"title_followed_hashtags\">フォローしたハッシュタグ</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s のミュートが解除されました</string>\n    <string name=\"action_unfollow_hashtag_format\">#%1$s をフォロー解除しますか？</string>\n    <string name=\"notification_sign_up_description\">新規ユーザーに関する通知</string>\n    <string name=\"notification_update_name\">投稿の編集</string>\n    <string name=\"notification_report_format\">%1$s に関する新しい報告</string>\n    <string name=\"notification_update_format\">%1$sさんが投稿を編集しました</string>\n    <string name=\"post_edited\">%1$s を編集しました</string>\n    <string name=\"notification_header_report_format\">%1$sさんが %2$s を報告しました</string>\n    <string name=\"action_dismiss\">キャンセル</string>\n    <string name=\"confirmation_hashtag_unfollowed\">#%1$s をフォロー解除しました</string>\n    <string name=\"pref_title_animate_custom_emojis\">カスタム絵文字のアニメーションを有効化</string>\n    <string name=\"dialog_delete_conversation_warning\">この会話を削除しますか？</string>\n    <string name=\"notification_sign_up_name\">サインアップ</string>\n    <string name=\"notification_report_name\">報告</string>\n    <string name=\"notification_report_description\">モデレーション報告に関する通知</string>\n    <string name=\"post_media_attachments\">添付ファイル</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"failed_to_add_to_list\">アカウントのリストへの追加に失敗しました</string>\n    <string name=\"failed_to_remove_from_list\">アカウントのリストからの削除に失敗しました</string>\n    <string name=\"no_announcements\">アナウンスはありません。</string>\n    <string name=\"description_post_edited\">編集しました</string>\n    <string name=\"pref_title_confirm_favourites\">お気に入りに追加する前に確認を表示する</string>\n    <string name=\"pref_title_hide_top_toolbar\">トップバーのタイトルを隠す</string>\n    <string name=\"pref_title_wellbeing_mode\">ウェルビーイング</string>\n    <string name=\"account_note_hint\">このアカウントに関するプライベートメモ</string>\n    <string name=\"account_note_saved\">保存しました！</string>\n    <string name=\"wellbeing_hide_stats_profile\">プロフィール上の数値的な統計情報を隠す</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"other\">%1$d 個以上のメディア添付ファイルはアップロードできません。</item>\n    </plurals>\n    <string name=\"dialog_delete_list_warning\">リスト %1$s を本当に削除しますか？</string>\n    <string name=\"drafts_post_failed_to_send\">この投稿の送信に失敗しました！</string>\n    <string name=\"drafts_failed_loading_reply\">返信情報の読み込みに失敗しました</string>\n    <string name=\"draft_deleted\">下書きを削除しました</string>\n    <string name=\"drafts_post_reply_removed\">下書きの返信先の投稿が削除されました</string>\n    <string name=\"action_subscribe_account\">購読する</string>\n    <string name=\"wellbeing_mode_notice\">あなたのメンタルヘルスに影響を与える可能性のある情報は隠されます。例:\n\\n\n\\n - お気に入り/ブースト/フォローの通知\n\\n - 投稿のお気に入り/ブーストの数\n\\n - プロフィールのフォロワー/投稿の統計情報\n\\n\n\\n プッシュ通知には影響ありませんが、通知設定は手動で確認できます。</string>\n    <string name=\"review_notifications\">通知の確認</string>\n    <string name=\"action_unsubscribe_account\">購読の解除</string>\n    <string name=\"report_category_violation\">ルール違反</string>\n    <string name=\"report_category_spam\">スパム</string>\n    <string name=\"report_category_other\">その他</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">投稿する</string>\n    <string name=\"error_following_hashtag_format\">#%1$s のフォローエラー</string>\n    <string name=\"error_unfollowing_hashtag_format\">#%1$s のフォロー解除エラー</string>\n    <string name=\"error_could_not_load_login_page\">ログインページが読み込めませんでした。</string>\n    <string name=\"error_loading_account_details\">アカウントの詳細情報の読み込みに失敗しました</string>\n    <string name=\"hint_media_description_missing\">メディアには説明文が必要です。</string>\n    <string name=\"title_edits\">編集</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"error_muting_hashtag_format\">#%1$s のミュート中にエラーが起こりました</string>\n    <string name=\"error_unmuting_hashtag_format\">#%1$s のミュート解除中にエラーが起こりました</string>\n    <string name=\"action_add_reaction\">リアクションを追加</string>\n    <string name=\"action_discard\">変更を破棄</string>\n    <string name=\"action_continue_edit\">編集を続ける</string>\n    <string name=\"action_share_account_link\">アカウントへのリンクを共有</string>\n    <string name=\"action_share_account_username\">アカウントのユーザー名を共有</string>\n    <string name=\"send_account_link_to\">アカウント URL を共有…</string>\n    <string name=\"send_account_username_to\">アカウントのユーザー名を共有…</string>\n    <string name=\"account_username_copied\">ユーザー名がコピーされました</string>\n    <string name=\"a11y_label_loading_thread\">スレッドの読み込み中</string>\n    <string name=\"pref_reading_order_newest_first\">新しい順</string>\n    <string name=\"pref_title_reading_order\">読む順番</string>\n    <string name=\"pref_reading_order_oldest_first\">古い順</string>\n    <string name=\"set_focus_description\">サムネイル画像で常に表示される中心点を設定するには、円をタップまたはドラッグして中してくだだい。</string>\n    <string name=\"mute_notifications_switch\">通知のミュート</string>\n    <string name=\"account_date_joined\">%1$s に参加</string>\n    <string name=\"status_edit_info\">%1$s 編集</string>\n    <string name=\"status_created_info\">%1$s の投稿</string>\n    <string name=\"post_lookup_error_format\">投稿 %1$s の検索エラー</string>\n    <string name=\"follow_requests_info\">アカウントがロックされていなかったとしても、%1$s のスタッフは以下のアカウントのフォローリクエストを確認した方がいいと判断しました。</string>\n    <string name=\"action_set_focus\">中心点の設定</string>\n    <string name=\"compose_unsaved_changes\">保存していない変更があります。</string>\n    <string name=\"error_status_source_load\">サーバーからステータスの元情報を取得できませんでした。</string>\n    <string name=\"pref_summary_http_proxy_disabled\">無効</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;設定なし&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;無効&gt;</string>\n    <string name=\"notification_update_description\">やり取りした投稿が編集されたときの通知</string>\n    <string name=\"pref_title_http_proxy_port_message\">ポートは %1$d から %2$d の間でなければなりません</string>\n    <string name=\"action_post_failed\">アップロードに失敗しました</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"other\">アップロードに失敗した投稿は下書きに保存されました。\n\\n\n\\nサーバーと接続できなかったか、投稿が拒否されました。</item>\n    </plurals>\n    <string name=\"action_post_failed_show_drafts\">下書きを表示</string>\n    <string name=\"action_post_failed_do_nothing\">閉じる</string>\n    <string name=\"action_browser_login\">ブラウザでログイン</string>\n    <string name=\"description_login\">ほとんどの場合に動作します。他のアプリにはデータが漏洩しません。</string>\n    <string name=\"description_browser_login\">追加の認証方法がサポートされる可能性がありますが、対応ブラウザが必要です。</string>\n    <string name=\"dialog_follow_hashtag_title\">ハッシュタグをフォロー</string>\n    <string name=\"post_media_image\">画像</string>\n    <string name=\"notification_unknown_name\">不明</string>\n    <string name=\"select_list_manage\">リストを管理する</string>\n    <string name=\"status_filtered_show_anyway\">とにかく表示する</string>\n    <string name=\"pref_title_account_filter_keywords\">プロフィール</string>\n    <string name=\"title_public_trending_hashtags\">トレンドのハッシュタグ</string>\n    <string name=\"pref_title_show_stat_inline\">タイムラインに投稿の統計情報を表示する</string>\n    <string name=\"pref_ui_text_size\">UI のテキストサイズ</string>\n    <string name=\"notification_listenable_worker_name\">バックグラウンドアクティビティ</string>\n    <string name=\"notification_listenable_worker_description\">Tusky がバックグラウンドで動作中の通知</string>\n    <string name=\"notification_notification_worker\">通知を取得中…</string>\n    <string name=\"notification_prune_cache\">キャッシュの整理中…</string>\n    <string name=\"label_filter_context\">フィルターコンテキスト</string>\n    <string name=\"filter_action_warn\">警告</string>\n    <string name=\"label_filter_keywords\">フィルターするキーワードまたはフレーズ</string>\n    <string name=\"filter_action_hide\">非表示</string>\n    <string name=\"filter_description_warn\">警告付きで隠す</string>\n    <string name=\"filter_description_hide\">完全に隠す</string>\n    <string name=\"label_filter_action\">フィルターアクション</string>\n    <string name=\"action_refresh\">再読み込み</string>\n    <string name=\"ui_error_reblog\">投稿のブーストに失敗しました: %1$s</string>\n    <string name=\"ui_error_clear_notifications\">通知の消去に失敗しました: %1$s</string>\n    <string name=\"ui_error_favourite\">投稿のお気に入りに失敗しました: %1$s</string>\n    <string name=\"ui_error_bookmark\">投稿のブックマークに失敗しました: %1$s</string>\n    <string name=\"ui_success_rejected_follow_request\">フォローリクエストがブロックされました</string>\n    <string name=\"ui_success_accepted_follow_request\">フォローリクエストが許可されました</string>\n    <string name=\"ui_error_vote\">投票に失敗しました: %1$s</string>\n    <string name=\"action_add\">追加</string>\n    <string name=\"filter_keyword_display_format\">%1$s (単語全体)</string>\n    <string name=\"filter_keyword_addition_title\">キーワードを追加</string>\n    <string name=\"total_usage\">合計使用量</string>\n    <string name=\"total_accounts\">総アカウント</string>\n    <string name=\"ui_error_unknown\">不明な理由</string>\n    <string name=\"ui_error_accept_follow_request\">フォローリクエストの承認に失敗しました: %1$s</string>\n    <string name=\"ui_error_reject_follow_request\">フォローリクエストの拒否に失敗しました: %1$s</string>\n    <string name=\"hint_filter_title\">フィルター</string>\n    <string name=\"label_filter_title\">タイトル</string>\n    <string name=\"filter_edit_keyword_title\">キーワードを編集</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"load_newest_notifications\">最新の通知を読み込む</string>\n    <string name=\"compose_delete_draft\">下書きを削除しますか？</string>\n    <string name=\"error_media_upload_sending_fmt\">アップロードに失敗しました: %1$s</string>\n    <string name=\"error_missing_edits\">あなたのサーバーは、この投稿が変更されたことを把握していますが、編集履歴のコピーを備えていないので、表示できません。 \n\\n \n\\nこれは<a href=\"https://github.com/mastodon/mastodon/issues/25398\">Mastodonのissue #25398</a>です。</string>\n    <string name=\"title_public_trending_statuses\">トレンドの投稿</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nAndroid バージョン: %3$s\n\\nSDK バージョン: %4$d</string>\n    <string name=\"about_account_info_title\">あなたのアカウント</string>\n    <string name=\"about_device_info_title\">あなたのデバイス</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nバージョン: %3$s</string>\n    <string name=\"about_copy\">バージョンとデバイス情報をコピー</string>\n    <string name=\"about_copied\">バージョンとデバイス情報をコピーしました</string>\n    <string name=\"error_media_playback\">再生に失敗しました: \\t%1$s</string>\n    <string name=\"dialog_delete_filter_text\">フィルタ「%1$s」を削除しますか？</string>\n    <string name=\"dialog_delete_filter_positive_action\">削除する</string>\n    <string name=\"dialog_save_profile_changes_message\">プロファイルの変更を保存しますか？</string>\n    <string name=\"app_theme_system_black\">システムのデザインを使用 (ブラック)</string>\n    <string name=\"list_exclusive_label\">ホームタイムラインで隠す</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d 個の投稿を添付</string>\n    <string name=\"unmuting_hashtag_success_format\">ハッシュタグ #%1$s のミュートを解除</string>\n    <string name=\"action_view_filter\">フィルタを表示</string>\n    <string name=\"status_filter_placeholder_label_format\">フィルタ済み: %1$s</string>\n    <string name=\"error_unblocking_domain\">%1$s のミュート解除に失敗しました: %2$s</string>\n    <string name=\"error_blocking_domain\">%1$s のミュートに失敗しました: %2$s</string>\n    <string name=\"label_image\">画像</string>\n    <string name=\"list_reply_policy_list\">リストのメンバー</string>\n    <string name=\"pref_title_show_self_boosts\">自己ブーストを表示</string>\n    <string name=\"pref_title_show_self_boosts_description\">自分自身の投稿をブーストしている誰か</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-kab/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"action_login\">Qqen s Tusky</string>\n    <string name=\"title_favourites\">Ismenyifen</string>\n    <string name=\"title_drafts\">Irewwayen</string>\n    <string name=\"action_logout\">Senser tuqqna</string>\n    <string name=\"action_view_preferences\">Iɣewwaṛen</string>\n    <string name=\"action_view_account_preferences\">Iɣewwaṛen n umiḍan</string>\n    <string name=\"action_edit_profile\">Ẓreg amaɣnu</string>\n    <string name=\"action_search\">Nadi</string>\n    <string name=\"about_title_activity\">Ɣef</string>\n    <string name=\"action_lists\">Tabdart</string>\n    <string name=\"title_lists\">Tabdarin</string>\n    <string name=\"error_compose_character_limit\">Tasuffeɣt ɣezzifet aṭas!</string>\n    <string name=\"title_home\">Agejdan</string>\n    <string name=\"title_tab_preferences\">Iccaren</string>\n    <string name=\"title_view_thread\">Asqerdec</string>\n    <string name=\"title_posts\">Tisuffaɣ</string>\n    <string name=\"title_posts_with_replies\">S tririyin</string>\n    <string name=\"title_edit_profile\">Ẓreg amaɣnu-ik</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_content_warning_show_more\">Sken ugar</string>\n    <string name=\"post_content_warning_show_less\">Sken drus</string>\n    <string name=\"message_empty\">Ulac walu da.</string>\n    <string name=\"notification_follow_format\">%1$s yeṭṭafar-ik·ikem-id</string>\n    <string name=\"action_reply\">Err</string>\n    <string name=\"action_more\">Ugar</string>\n    <string name=\"action_compose\">Azen</string>\n    <string name=\"action_follow\">Ḍfeṛ</string>\n    <string name=\"action_unfollow\">Ur ṭṭafar ara</string>\n    <string name=\"action_edit\">Ẓreg</string>\n    <string name=\"action_delete\">Kkes</string>\n    <string name=\"action_delete_and_redraft\">Kkes tɛiwdeḍ tira</string>\n    <string name=\"action_send\">Jewweq</string>\n    <string name=\"action_send_public\">JEWWEQ!</string>\n    <string name=\"action_retry\">Ɛreḍ tikkelt-nniḍen</string>\n    <string name=\"action_close\">Mdel</string>\n    <string name=\"action_view_profile\">Amaɣnu</string>\n    <string name=\"action_view_favourites\">Ismenyifen</string>\n    <string name=\"action_open_in_web\">Ldi deg uminig</string>\n    <string name=\"action_share\">Bḍu</string>\n    <string name=\"action_mute\">Sgugem</string>\n    <string name=\"action_access_drafts\">Irewwayen</string>\n    <string name=\"action_open_faved_by\">Sken-d ismenyifen</string>\n    <string name=\"notification_favourite_name\">Ismenyifen</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\">%1$s n usmenyaf</item>\n        <item quantity=\"other\">%1$s n usmenyafen</item>\n    </plurals>\n    <string name=\"no_drafts\">Ur tesɛiḍ ara irewwayen.</string>\n    <string name=\"error_generic\">Tella-d tucḍa.</string>\n    <string name=\"title_notifications\">Tilɣa</string>\n    <string name=\"link_whats_an_instance\">D acu i ttummant?</string>\n    <string name=\"title_bookmarks\">Ticraḍ</string>\n    <string name=\"action_bookmark\">Rnu ɣer ticraḍ</string>\n    <string name=\"action_view_bookmarks\">Ticraḍ</string>\n    <string name=\"action_mute_domain\">Sgugem %1$s</string>\n    <string name=\"action_mention\">Bder</string>\n    <string name=\"action_save\">Sekles</string>\n    <string name=\"action_edit_own_profile\">Ẓreg</string>\n    <string name=\"action_undo\">Sefsex</string>\n    <string name=\"action_emoji_keyboard\">Anasiw n imujiyen</string>\n    <string name=\"action_add_tab\">Rnu iccer</string>\n    <string name=\"action_copy_link\">Nɣel aseɣwen</string>\n    <string name=\"action_open_as\">Ldi amzun d %1$s</string>\n    <string name=\"action_share_as\">Bḍu amzun d…</string>\n    <string name=\"send_post_link_to\">Bḍu aseɣwen n tijewwiq s…</string>\n    <string name=\"send_post_content_to\">Bḍu tijewwiqt d…</string>\n    <string name=\"hint_domain\">Anta tummant?</string>\n    <string name=\"hint_compose\">d-acu i gellan d amaynut?</string>\n    <string name=\"hint_search\">Nadi…</string>\n    <string name=\"label_quick_reply\">Tiririt…</string>\n    <string name=\"label_avatar\">Tugna n umaɣnu</string>\n    <string name=\"dialog_download_image\">Sider</string>\n    <string name=\"dialog_delete_post_warning\">Kkes tijewwiqt-a?</string>\n    <string name=\"pref_title_edit_notification_settings\">Ẓreg tilɣa</string>\n    <string name=\"pref_title_appearance_settings\">Agrudem</string>\n    <string name=\"app_theme_light\">Aceɛlal</string>\n    <string name=\"app_theme_black\">Aberkan</string>\n    <string name=\"pref_title_language\">Tutlayt</string>\n    <string name=\"pref_title_post_tabs\">Agejdan</string>\n    <string name=\"pref_title_proxy_settings\">Apṛuksi</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s d %4$d nniḍen</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, akked %3$s</string>\n    <string name=\"notification_summary_small\">%1$s akked %2$s</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_tusky_account\">Amaɣnu n Tusky</string>\n    <string name=\"post_media_images\">Tugniwin</string>\n    <string name=\"post_media_video\">Tibidyutin</string>\n    <string name=\"follows_you\">Yeṭṭafar-ik·ikem-id</string>\n    <string name=\"filter_dialog_remove_button\">Kkes</string>\n    <string name=\"filter_dialog_update_button\">Lqem</string>\n    <string name=\"add_account_name\">Rnu amiḍan</string>\n    <string name=\"add_account_description\">Rnu yiwen umiḍan amaynut n Maṣṭudun</string>\n    <string name=\"action_compose_shortcut\">Aru</string>\n    <string name=\"error_no_custom_emojis\">Tummant-ik·im %1$s ur tesɛi ara imujiyen udmawanen</string>\n    <string name=\"action_open_post\">Ldi tijewwiqt</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"pin_action\">Senṭeḍ</string>\n    <string name=\"action_view_mutes\">Imiḍanen yettwasgugmen</string>\n    <string name=\"action_view_blocks\">Imiḍan yettusḥebsen</string>\n    <string name=\"action_view_domain_mutes\">Tiɣula yettwaffren</string>\n    <string name=\"action_view_follow_requests\">Isuturen n teḍfeṛt</string>\n    <string name=\"action_view_media\">Taɣwalt</string>\n    <string name=\"notifications_clear\">Kkes</string>\n    <string name=\"title_mutes\">Imiḍanen yettwasgugmen</string>\n    <string name=\"title_blocks\">Imiḍan yettusḥebsen</string>\n    <string name=\"title_domain_mutes\">Tiɣula yettwaffren</string>\n    <string name=\"title_follow_requests\">Ḍfer issutar</string>\n    <string name=\"pref_title_notifications_enabled\">Tilɣa</string>\n    <string name=\"title_media\">Taɣwalt</string>\n    <string name=\"action_remove\">Kkes</string>\n    <string name=\"compose_shortcut_short_label\">Azen</string>\n    <string name=\"edit_poll\">Ẓreg</string>\n    <string name=\"title_posts_pinned\">Yettwasenteḍ</string>\n    <string name=\"action_add_media\">Rnu amidya</string>\n    <string name=\"action_add_poll\">Rnu assenqed</string>\n    <string name=\"action_photo_take\">Ṭef tugna</string>\n    <string name=\"action_toggle_visibility\">Timeẓriwt n yizen</string>\n    <string name=\"action_schedule_post\">Sɣiwes tijewwaqt-a</string>\n    <string name=\"post_share_content\">Bḍu agbur n tijewwiqt-a</string>\n    <string name=\"post_share_link\">Bḍu aseɣwen ɣer tijewwiqt</string>\n    <string name=\"filter_addition_title\">Rnu amsizdeg</string>\n    <string name=\"filter_edit_title\">Ẓreg amsizdeg</string>\n    <string name=\"action_create_list\">Snulfu-d tabdart</string>\n    <string name=\"action_rename_list\">Snifel isem n tebdart</string>\n    <string name=\"action_delete_list\">Kkes tabdart-a</string>\n    <string name=\"action_add_to_list\">Rnu yiwen umiḍan ɣer tabdart</string>\n    <string name=\"action_remove_from_list\">Kkes amiḍan seg tabdart</string>\n    <string name=\"profile_metadata_add\">Rnu isefka</string>\n    <string name=\"hint_list_name\">Isem n tebdart</string>\n    <string name=\"select_list_title\">Fren tabdart</string>\n    <string name=\"list\">Tabdart</string>\n    <string name=\"notifications_apply_filter\">Sizdeg</string>\n    <string name=\"title_accounts\">Imiḍanen</string>\n    <string name=\"add_poll_choice\">Rnu yiwen wefran</string>\n    <string name=\"report_username_format\">Cetki ɣef @%1$s</string>\n    <string name=\"action_report\">Cetki fell-as</string>\n    <string name=\"action_reject\">Ggami</string>\n    <string name=\"download_image\">Yessidired %1$s</string>\n    <string name=\"send_media_to\">Bḍu tugna s…</string>\n    <string name=\"login_connection\">itteqqen…</string>\n    <string name=\"dialog_message_uploading_media\">Issalay…</string>\n    <string name=\"pref_title_timeline_filters\">Imzizdigen</string>\n    <string name=\"app_theme_auto\">Awurman akken yella yiṭij</string>\n    <string name=\"pref_title_browser_settings\">Iminig</string>\n    <string name=\"pref_title_show_replies\">Sken-d tiririyin</string>\n    <string name=\"pref_title_http_proxy_settings\">Apṛuksi HTTP</string>\n    <string name=\"pref_title_http_proxy_server\">Tansa n upṛuksi HTTP</string>\n    <string name=\"notification_follow_name\">Imeḍfaṛen imaynuten</string>\n    <string name=\"notification_poll_name\">Igmaḍ n ufmiḍi</string>\n    <string name=\"notification_mention_format\">Yuder-ik-id %1$s</string>\n    <string name=\"description_account_locked\">Yettwargel umiḍan</string>\n    <string name=\"abbreviated_years_ago\">%1$dis aya</string>\n    <string name=\"abbreviated_days_ago\">%1$dus aya</string>\n    <string name=\"replying_to\">Tettaraḍ-as i @%1$s</string>\n    <string name=\"load_more_placeholder_text\">Awi-d ugar</string>\n    <string name=\"pref_title_thread_filter_keywords\">Idewenniyen</string>\n    <string name=\"lock_account_label\">Rgel amiḍan</string>\n    <string name=\"performing_lookup_title\">Yettnadi…</string>\n    <string name=\"restart\">Ales tanekra</string>\n    <string name=\"download_failed\">Tuccḍa n usider</string>\n    <string name=\"account_moved_description\">Igujj %1$s ɣer:</string>\n    <string name=\"unpin_action\">Kkes asenṭeḍ</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s akked %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s akked %3$d nniḍen</string>\n    <string name=\"compose_shortcut_long_label\">Aru izen</string>\n    <string name=\"poll_info_format\">%1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s n wedɣar</item>\n        <item quantity=\"other\">%1$s n yedɣaren</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">ad ifak deg %1$s</string>\n    <string name=\"poll_info_closed\">ifuk</string>\n    <string name=\"poll_vote\">Dɣer</string>\n    <string name=\"poll_ended_voted\">Ifuk, tura kan, yiwen wedɣar t tteki-iḍ degs</string>\n    <string name=\"poll_ended_created\">Ifukk yiwen wedɣar id snulfaḍ</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d n wass id yugran</item>\n        <item quantity=\"other\">%1$d n wussan id yugran</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d wesrag id yugran</item>\n        <item quantity=\"other\">%1$d n yisragen id yugran</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d n tasdidt id yugran</item>\n        <item quantity=\"other\">%1$d n tisdidin id yugran</item>\n    </plurals>\n    <string name=\"button_continue\">Kemmel</string>\n    <string name=\"button_back\">Uɣal</string>\n    <string name=\"failed_report\">Tella-d tuccḍa deg cetki</string>\n    <string name=\"failed_search\">Tucḍa n unadi</string>\n    <string name=\"create_poll_title\">Assenqed</string>\n    <string name=\"duration_5_min\">5 n tisdidin</string>\n    <string name=\"duration_30_min\">30 n tisdidin</string>\n    <string name=\"duration_1_hour\">1 n wesrag</string>\n    <string name=\"duration_6_hours\">6 n yisragen</string>\n    <string name=\"duration_1_day\">1 n wass</string>\n    <string name=\"duration_3_days\">3 n wussan</string>\n    <string name=\"duration_7_days\">7 n wussan</string>\n    <string name=\"poll_new_choice_hint\">Tafrant %1$d</string>\n    <string name=\"title_follows\">Ig ṭṭafar</string>\n    <string name=\"title_followers\">Imeḍfaṛen</string>\n    <string name=\"hint_search_people_list\">Nadi ɣef medden ar at ḍfereḍ</string>\n    <string name=\"description_visibility_private\">Imeḍfaṛen</string>\n    <string name=\"action_links\">Iseɣwan</string>\n    <string name=\"action_mentions\">Tibdarin</string>\n    <string name=\"title_mentions_dialog\">Tibdarin</string>\n    <string name=\"title_links_dialog\">Iseɣwan</string>\n    <string name=\"confirmation_reported\">Yettwaceyyeɛ!</string>\n    <string name=\"search_no_results\">Ula d yiwen n ugmuḍ</string>\n    <string name=\"post_privacy_followers_only\">I yimeḍfaṛen kan</string>\n    <string name=\"pref_post_text_size\">Teɣzi n weḍṛis</string>\n    <string name=\"about_powered_by_tusky\">Yettwamdemmar s Tusky</string>\n    <string name=\"about_project_site\">Asmel Web n usenfaṛ:\n\\nhttps://tusky.app</string>\n    <string name=\"abbreviated_hours_ago\">%1$dsr</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dtsd</string>\n    <string name=\"abbreviated_seconds_ago\">%1$dtsn</string>\n    <string name=\"compose_save_draft\">Sekles amzun d arewway?</string>\n    <string name=\"later\">Ticki</string>\n    <string name=\"profile_badge_bot_text\">Aṛubut</string>\n    <string name=\"description_post_bookmarked\">Yettwarna ɣer ticṛad</string>\n    <string name=\"abbreviated_in_hours\">deg %1$dsr</string>\n    <string name=\"abbreviated_in_minutes\">deg %1$dtsd</string>\n    <string name=\"abbreviated_in_seconds\">deg %1$dtsn</string>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d n tasint id yugran</item>\n        <item quantity=\"other\">%1$d n tasinin id yugran</item>\n    </plurals>\n    <string name=\"post_sensitive_media_title\">Agbur amḥulfu</string>\n    <string name=\"pref_default_media_sensitivity\">Creḍ amidya amzun d amḥulfu (yettwasɣiwes akked uqeddac)</string>\n    <string name=\"action_reset_schedule\">Wennez tikkelt-nniḍen</string>\n    <string name=\"error_media_upload_sending\">Asali ur yeddi ara.</string>\n    <string name=\"error_sender_account_gone\">Tuccḍa deg tuzna n tsuffeɣt.</string>\n    <string name=\"title_public_local\">Adigan</string>\n    <string name=\"title_licenses\">Turagin</string>\n    <string name=\"post_boosted_format\">Yebḍa-t %1$s</string>\n    <string name=\"notification_reblog_format\">%1$s yebḍa tasuffeɣt-ik·im</string>\n    <string name=\"notification_favourite_format\">%1$s yerna izen-ik·im ɣer ismenyafen-is</string>\n    <string name=\"action_quick_reply\">Tiririt taruradt</string>\n    <string name=\"action_reblog\">Zuzer</string>\n    <string name=\"action_unreblog\">Kkes beṭṭu</string>\n    <string name=\"action_hide_reblogs\">Ffer izuzar</string>\n    <string name=\"action_show_reblogs\">Sken-d izuzar</string>\n    <string name=\"action_unmute\">Ur sgugum ara</string>\n    <string name=\"action_accept\">Ddeg</string>\n    <string name=\"action_hashtags\">Ihacṭagen</string>\n    <string name=\"action_open_reblogged_by\">Sken-d izuzar</string>\n    <string name=\"title_hashtags_dialog\">Ihacṭagen</string>\n    <string name=\"confirmation_unmuted\">Aseqdac nni ur yettwasgugem ara tura</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s ur yettwaffer ara</string>\n    <string name=\"hint_note\">Assisen</string>\n    <string name=\"label_header\">Tugna n yiɣef n umaɣnu</string>\n    <string name=\"error_empty\">Ur ilaq ara ad yili d ilem.</string>\n    <string name=\"action_block\">Cekkel</string>\n    <string name=\"action_unblock\">Kkes tacekkalt</string>\n    <string name=\"confirmation_unblocked\">Tettwakkes tacekkalt ɣef umiḍan-nni</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s n wemdan</item>\n        <item quantity=\"other\">%1$s n yemdanen</item>\n    </plurals>\n    <string name=\"report_remote_instance\">Bren-it ɣer %1$s</string>\n    <string name=\"pref_title_app_theme\">Asentel n wesnas</string>\n    <string name=\"no_scheduled_posts\">Ulac ɣur-k·m ula d yiwet n tjewwiqt yettwasɣawsen.</string>\n    <string name=\"action_access_scheduled_posts\">Tijewwiqin yettwasɣawsen</string>\n    <string name=\"title_scheduled_posts\">Tisuffaɣ yettwasɣawsen</string>\n    <string name=\"pref_title_show_boosts\">Sken-d izuzar</string>\n    <string name=\"hashtags\">Ihacṭagen</string>\n    <string name=\"notification_follow_request_name\">Isuturen n teḍfeṛt</string>\n    <string name=\"notification_boost_name\">Izuzar</string>\n    <string name=\"profile_metadata_content_label\">Agbur</string>\n    <string name=\"button_done\">Immed</string>\n    <string name=\"label_image\">Tugna</string>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\">%1$s n uzuzar</item>\n        <item quantity=\"other\">%1$s n yizurar</item>\n    </plurals>\n    <string name=\"action_translate\">Suqel</string>\n    <string name=\"pref_main_nav_position_option_top\">D asawen</string>\n    <string name=\"system_default\">Akken yella unagraw</string>\n    <string name=\"duration_90_days\">90 n wussan</string>\n    <string name=\"action_hide_media\">Seggelmes amidya</string>\n    <string name=\"dialog_block_warning\">Sewḥel @%1$s?</string>\n    <string name=\"duration_14_days\">14 n wussan</string>\n    <string name=\"description_post_media_no_description_placeholder\">Ur yesɛi ara aglam</string>\n    <string name=\"action_post_failed_do_nothing\">Zgel</string>\n    <string name=\"duration_30_days\">30 n wussan</string>\n    <string name=\"duration_60_days\">60 n wussan</string>\n    <string name=\"duration_180_days\">180 n wussan</string>\n    <string name=\"duration_365_days\">365 n wussan</string>\n    <string name=\"action_subscribe_account\">Ḍfeṛ</string>\n    <string name=\"account_date_joined\">Da seg ass n %1$s</string>\n    <string name=\"post_media_audio\">Ameslaw</string>\n    <string name=\"action_reblog_private\">Izuzar n imeḍfaṛen kan</string>\n    <string name=\"action_reblog_public\">Azuzer azayaz</string>\n    <string name=\"pref_title_show_self_boosts\">Sken-d izuzar-ik·im</string>\n    <string name=\"action_delete_conversation\">Kkes asqerdec</string>\n    <string name=\"action_mute_conversation\">Sgugem asqerced-a</string>\n    <string name=\"action_open_drawer\">Ldi umuɣ</string>\n    <string name=\"action_content_warning\">Agbur amḥulfu</string>\n    <string name=\"action_open_reblogger\">Wali ameskar n uzuzer</string>\n    <string name=\"action_dismiss\">Mdel</string>\n    <string name=\"action_details\">Talqayt</string>\n    <string name=\"account_username_copied\">Yettwanɣel isem n useqdac</string>\n    <string name=\"hint_content_warning\">Agbur amḥulfu</string>\n    <string name=\"dialog_mute_warning\">Sgugem @%1$s?</string>\n    <string name=\"dialog_mute_hide_notifications\">Ffer ilɣa</string>\n    <string name=\"app_them_dark\">Ubrik</string>\n    <string name=\"post_text_size_small\">Ameẓyan</string>\n    <string name=\"post_text_size_medium\">Alemmas</string>\n    <string name=\"post_privacy_direct\">Srid</string>\n    <string name=\"notification_channel_admin\">Anedbal</string>\n    <string name=\"notification_subscription_name\">Tisuffaɣ timaynutin</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"title_reblogged_by\">Yezzuzer-it</string>\n    <string name=\"profile_metadata_label_label\">Tabzimt</string>\n    <string name=\"description_visibility_public\">Azayez</string>\n    <string name=\"description_visibility_unlisted\">War tabdart</string>\n    <string name=\"description_visibility_direct\">Srid</string>\n    <string name=\"description_post_edited\">Tettwaẓreg</string>\n    <string name=\"label_translating\">Yessuqul…</string>\n    <string name=\"profile_metadata_label\">Iɣefisefka n umaɣnu</string>\n    <string name=\"add_hashtag_title\">Rnu ahacṭag</string>\n    <string name=\"description_post_language\">Tutlayt n tsuffeɣt</string>\n    <string name=\"account_note_hint\">Tazmilt-ik·im ɣef umiḍan-a</string>\n    <string name=\"dialog_delete_filter_positive_action\">Kkes</string>\n    <string name=\"yes\">Ih</string>\n    <string name=\"no\">Uhu</string>\n    <string name=\"pref_show_self_username_never\">Werǧin</string>\n    <string name=\"notification_mention_name\">Ibdaren imaynuten</string>\n    <string name=\"notification_report_name\">Ineqqisen</string>\n    <string name=\"notification_unknown_name\">Arussin</string>\n    <string name=\"notification_channel_other\">Wayeḍ</string>\n    <string name=\"notification_sign_up_name\">Imiḍan imaynuten</string>\n    <string name=\"post_media_image\">Tugna</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"status_created_at_now\">tura</string>\n    <string name=\"status_filtered_show_anyway\">Sken akken yebɣu yili</string>\n    <string name=\"abbreviated_in_years\">deg %1$dsg</string>\n    <string name=\"abbreviated_in_days\">deg %1$dsn</string>\n    <string name=\"pref_title_account_filter_keywords\">Imaɣnuyen</string>\n    <string name=\"unreblog_private\">Kkes azuzer</string>\n    <string name=\"report_category_spam\">D aspam</string>\n    <string name=\"report_category_other\">Ayen-nniḍen</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"status_edit_info\">Tettwaẓreg: %1$s</string>\n    <string name=\"status_created_info\">Tennulfa-d: %1$s</string>\n    <string name=\"pref_title_reading_order\">Asmizzwer n tɣuṛi</string>\n    <string name=\"label_filter_title\">Azwel</string>\n    <string name=\"filter_action_hide\">Ffer-it</string>\n    <string name=\"action_add\">Rnu</string>\n    <string name=\"notification_policy_accept\">Qbel</string>\n    <string name=\"notification_policy_filter\">Sizdeg</string>\n    <string name=\"notification_policy_ignore\">Zgel</string>\n    <string name=\"action_accept_notification_request\">Qbel</string>\n    <string name=\"action_dismiss_notification_request\">Zgel</string>\n    <string name=\"notification_info_reply\">Tiririt</string>\n    <string name=\"notification_info_mention\">Abdar</string>\n    <string name=\"title_public_federated\">S lmendad</string>\n    <string name=\"title_login\">Qqen</string>\n    <string name=\"title_announcements\">Ilɣa</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"post_edited\">Tettwaẓreg%1$s</string>\n    <string name=\"action_post_failed_show_drafts\">Sken-d irewwayen</string>\n    <string name=\"post_privacy_public\">Azayez</string>\n    <string name=\"post_privacy_unlisted\">War tabdart</string>\n    <string name=\"pref_main_nav_position_option_bottom\">D akessar</string>\n    <string name=\"about_device_info_title\">Ibenk-ik·im</string>\n    <string name=\"about_account_info_title\">Amiḍan-ik·im</string>\n    <string name=\"description_post_media\">Amidya: %1$s</string>\n    <string name=\"account_note_saved\">Yettwasekles!</string>\n    <string name=\"description_post_favourited\">Yettwasmenyaf</string>\n    <string name=\"reply_sending\">Tuzna…</string>\n    <string name=\"send_post_notification_cancel_title\">Tuzna tettwasefsex</string>\n    <string name=\"label_duration\">Tanzagt</string>\n    <string name=\"review_notifications\">Senqed ilɣa</string>\n    <string name=\"action_unsubscribe_account\">Sefsex amulteɣ</string>\n    <string name=\"draft_deleted\">Yettwakkes urewway</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Suddes tsuffeɣt</string>\n    <string name=\"action_unmute_conversation\">Kkes asgugem i usqerdec</string>\n    <string name=\"action_unmute_domain\">Kkesasgugem %1$s</string>\n    <string name=\"download_media\">Sader amkdya</string>\n    <string name=\"downloading_media\">Asadar n umidya</string>\n    <string name=\"hint_display_name\">S\\'en isem</string>\n    <string name=\"pref_title_notification_alerts\">Alɣu</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;arameɣtu&gt;</string>\n    <string name=\"post_text_size_large\">Hraw</string>\n    <string name=\"post_text_size_largest\">Ahrawan</string>\n    <string name=\"pref_show_self_username_always\">Yl tikkelt</string>\n    <string name=\"send_post_notification_channel_name\">Tuzna n tsuffaɣ</string>\n    <string name=\"title_favourited_by\">Yettwasmenyaf sɣur</string>\n    <string name=\"filter_apply\">Snes</string>\n    <string name=\"hint_additional_info\">Iwenniten niḍen</string>\n    <string name=\"poll\">Afmiḍi</string>\n    <string name=\"action_unmute_desc\">Kkes asgugem %1$s</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Yensa</string>\n    <string name=\"post_media_attachments\">Imeddayen</string>\n    <string name=\"action_refresh\">Snirem</string>\n    <string name=\"report_category_legal\">Alugan</string>\n    <string name=\"title_direct_messages\">Iznan usriden</string>\n    <string name=\"title_edits\">Yeẓreg</string>\n    <string name=\"post_replied\">Yerra-d</string>\n    <string name=\"action_unbookmark\">Kkes ticreḍt n usebter</string>\n    <string name=\"action_favourite\">Asmenyaf</string>\n    <string name=\"post_content_show_less\">Fneẓ</string>\n    <string name=\"report_comment_hint\">Iwenniten niḍen ?</string>\n    <string name=\"action_unfavourite\">Kkes asmenyaf</string>\n    <string name=\"send_post_notification_title\">Tuzna n tsuffeɣt…</string>\n    <string name=\"duration_no_change\">(Ulac beddel)</string>\n    <string name=\"saving_draft\">Asekles n urewway…</string>\n    <string name=\"action_unfollow_hashtag_format\">Urṭṭafar ara #%1$s?</string>\n    <string name=\"post_media_hidden_title\">Amidya yeffren</string>\n    <string name=\"title_followed_hashtags\">Ihacṭagen yettwaḍefren</string>\n    <string name=\"action_edit_image\">Ẓreɣ tugna</string>\n    <string name=\"pref_publishing\">Tuzna n yimezwer</string>\n    <string name=\"poll_allow_multiple_choices\">Aṭas n ufran</string>\n    <string name=\"action_add_reaction\">rnu tasedmirt</string>\n    <string name=\"filter_dialog_whole_word\">Awal ummid</string>\n    <string name=\"emoji_style\">Aɣanib n yimujit</string>\n    <string name=\"notification_update_name\">Tasuffeɣt yettwaẓergen</string>\n    <string name=\"state_follow_requested\">Aḍfarvyettwaqbal</string>\n    <string name=\"instance_rule_title\">%1$s yilugan</string>\n    <plurals name=\"accounts\">\n        <item quantity=\"one\">%1$s n umiḍan</item>\n        <item quantity=\"other\">%1$s n imiḍanen</item>\n    </plurals>\n    <string name=\"notification_info_private_mention\">Abdar uslig</string>\n    <string name=\"pref_ui_text_size\">Tiddi n weḍris n wegrudem</string>\n    <string name=\"preview_card_by_author\">Sɣur %1$s</string>\n    <string name=\"preview_card_more_by_author\">Ugar sɣur %1$s</string>\n    <string name=\"filtered_notifications\">Ilɣa yettwasizdgen</string>\n    <string name=\"filtered_notifications_title\">Ilɣa yettwasizdgen</string>\n    <string name=\"open_settings\">Ldi tixtiṛiyin</string>\n    <string name=\"poll_show_results\">Sken-d igemmad</string>\n    <string name=\"notifications_from\">Ilɣa sɣur %1$s</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">Imiḍan imaynuten</string>\n    <string name=\"action_open_media_n\">Ldi amidya #%1$d</string>\n    <string name=\"action_share_account_link\">Bḍu aseɣwen n umiḍan</string>\n    <string name=\"action_share_account_username\">Bḍu isem n useqdac n umiḍan</string>\n    <string name=\"send_account_link_to\">Bḍu aseɣwen URL n umiḍan d…</string>\n    <string name=\"send_account_username_to\">Bḍu isem n useqdac n umiḍan d…</string>\n    <string name=\"action_follow_hashtag\">Ḍfer ahacṭag amaynut</string>\n    <string name=\"pick_hashtag_hint\">Ahacṭag s war #</string>\n    <string name=\"compose_preview_image_description\">Tigawin n tugna %1$s</string>\n    <string name=\"ui_error_translate\">Ur yezmir ara ad yessuqel: %1$s</string>\n    <string name=\"app_theme_system\">Seqdec asentel n unagraw</string>\n    <string name=\"pref_title_http_proxy_enable\">Rmed apṛuksi HTTP</string>\n    <string name=\"app_theme_system_black\">Seqdec asentel n unagraw (Ubrik)</string>\n    <string name=\"notification_info_private_reply\">Tiririt tusligt</string>\n    <string name=\"post_replied_format\">Deg tririt i %1$s</string>\n    <string name=\"compose_active_account_description\">Tsuffuɣeḍ amzun d %1$s</string>\n    <string name=\"notification_sign_up_format\">%1$s yesnulfa-d amiḍan</string>\n    <string name=\"action_browser_login\">Qqen s yimining Web</string>\n    <string name=\"load_newest_notifications\">Sali-d ilɣa imaynuten</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nLqem: %3$s</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-ko/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">오류가 발생했습니다.</string>\n    <string name=\"error_network\">네트워크 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도하십시오.</string>\n    <string name=\"error_empty\">내용을 입력하십시오.</string>\n    <string name=\"error_invalid_domain\">도메인이 올바르지 않습니다</string>\n    <string name=\"error_failed_app_registration\">인증에 실패했습니다. 이 화면이 계속된다면, 브라우저에 메뉴에서 로그인을 시도하십시오.</string>\n    <string name=\"error_no_web_browser_found\">사용 가능한 웹 브라우저를 찾을 수 없습니다.</string>\n    <string name=\"error_authorization_unknown\">알 수 없는 인증 오류가 발생했습니다.</string>\n    <string name=\"error_authorization_denied\">인증이 거부되었습니다. 올바른 자격 증명을 입력했는지 확인하면 메뉴에서 브라우저로 로그인해 보세요.</string>\n    <string name=\"error_retrieving_oauth_token\">로그인 토큰을 받아올 수 없습니다. 이 증상이 지속된다면, 메뉴에서 브라우저로 로그인을 시도하십시오.</string>\n    <string name=\"error_compose_character_limit\">게시물 길이가 너무 깁니다!</string>\n    <string name=\"error_media_upload_type\">이 파일은 첨부할 수 없습니다.</string>\n    <string name=\"error_media_upload_opening\">이 파일을 읽지 못했습니다.</string>\n    <string name=\"error_media_upload_permission\">미디어를 읽기 위한 권한이 필요합니다.</string>\n    <string name=\"error_media_download_permission\">미디어를 저장하기 위한 권한이 필요합니다.</string>\n    <string name=\"error_media_upload_image_or_video\">이미지와 비디오는 동시에 첨부할 수 없습니다.</string>\n    <string name=\"error_media_upload_sending\">파일을 업로드하지 못했습니다.</string>\n    <string name=\"error_sender_account_gone\">툿을 전송하지 못했습니다.</string>\n    <string name=\"title_home\">홈</string>\n    <string name=\"title_notifications\">알림</string>\n    <string name=\"title_public_local\">로컬</string>\n    <string name=\"title_public_federated\">연합</string>\n    <string name=\"title_direct_messages\">다이렉트 메시지</string>\n    <string name=\"title_tab_preferences\">탭</string>\n    <string name=\"title_view_thread\">툿</string>\n    <string name=\"title_posts\">툿</string>\n    <string name=\"title_posts_with_replies\">툿과 답장</string>\n    <string name=\"title_posts_pinned\">고정된 툿</string>\n    <string name=\"title_follows\">팔로우</string>\n    <string name=\"title_followers\">팔로워</string>\n    <string name=\"title_favourites\">좋아요</string>\n    <string name=\"title_mutes\">뮤트한 유저</string>\n    <string name=\"title_blocks\">블록한 유저</string>\n    <string name=\"title_domain_mutes\">숨긴 도메인</string>\n    <string name=\"title_follow_requests\">팔로우 요청</string>\n    <string name=\"title_edit_profile\">프로필 편집</string>\n    <string name=\"title_drafts\">임시 저장</string>\n    <string name=\"title_licenses\">라이선스</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s님이 부스트 했습니다</string>\n    <string name=\"post_sensitive_media_title\">민감한 미디어</string>\n    <string name=\"post_media_hidden_title\">미디어 숨겨짐</string>\n    <string name=\"post_sensitive_media_directions\">클릭하여 보기</string>\n    <string name=\"post_content_warning_show_more\">더 보기</string>\n    <string name=\"post_content_warning_show_less\">숨기기</string>\n    <string name=\"post_content_show_more\">더 보기</string>\n    <string name=\"post_content_show_less\">줄이기</string>\n    <string name=\"message_empty\">메시지가 없습니다.</string>\n    <string name=\"footer_empty\">게시물이 없습니다. 아래로 당겨서 새로고침하세요!</string>\n    <string name=\"notification_reblog_format\">%1$s님이 부스트 했습니다</string>\n    <string name=\"notification_favourite_format\">%1$s님이 당신의 게시물을 좋아합니다</string>\n    <string name=\"notification_follow_format\">%1$s님이 나를 팔로우 했습니다</string>\n    <string name=\"report_username_format\">\\@%1$s 신고</string>\n    <string name=\"report_comment_hint\">코멘트</string>\n    <string name=\"action_quick_reply\">빠른 답장</string>\n    <string name=\"action_reply\">답장</string>\n    <string name=\"action_reblog\">부스트</string>\n    <string name=\"action_unreblog\">부스트 해제</string>\n    <string name=\"action_favourite\">좋아요</string>\n    <string name=\"action_unfavourite\">좋아요 취소</string>\n    <string name=\"action_more\">더 보기</string>\n    <string name=\"action_compose\">작성</string>\n    <string name=\"action_login\">마스토돈에 로그인</string>\n    <string name=\"action_logout\">로그아웃</string>\n    <string name=\"action_logout_confirm\">정말로 %1$s에서 로그아웃하시겠습니까?</string>\n    <string name=\"action_follow\">팔로우</string>\n    <string name=\"action_unfollow\">팔로우 해제</string>\n    <string name=\"action_block\">차단</string>\n    <string name=\"action_unblock\">차단 해제</string>\n    <string name=\"action_hide_reblogs\">이 유저의 부스트 숨기기</string>\n    <string name=\"action_show_reblogs\">부스트한 유저 보이기</string>\n    <string name=\"action_report\">신고</string>\n    <string name=\"action_delete\">삭제</string>\n    <string name=\"action_delete_and_redraft\">지우고 다시 쓰기</string>\n    <string name=\"action_send\">툿</string>\n    <string name=\"action_send_public\">툿!</string>\n    <string name=\"action_retry\">다시 시도</string>\n    <string name=\"action_close\">닫기</string>\n    <string name=\"action_view_profile\">프로필</string>\n    <string name=\"action_view_preferences\">설정</string>\n    <string name=\"action_view_account_preferences\">계정 설정</string>\n    <string name=\"action_view_favourites\">좋아요</string>\n    <string name=\"action_view_mutes\">뮤트한 유저</string>\n    <string name=\"action_view_blocks\">블록한 유저</string>\n    <string name=\"action_view_domain_mutes\">숨긴 도메인</string>\n    <string name=\"action_view_follow_requests\">팔로우 요청</string>\n    <string name=\"action_view_media\">미디어</string>\n    <string name=\"action_open_in_web\">브라우저에서 열기</string>\n    <string name=\"action_add_media\">미디어 추가</string>\n    <string name=\"action_photo_take\">사진 촬영</string>\n    <string name=\"action_share\">공유</string>\n    <string name=\"action_mute\">뮤트</string>\n    <string name=\"action_unmute\">뮤트 해제</string>\n    <string name=\"action_mute_domain\">%1$s 전체를 숨김</string>\n    <string name=\"action_mention\">멘션</string>\n    <string name=\"action_hide_media\">미디어 숨기기</string>\n    <string name=\"action_open_drawer\">메뉴 열기</string>\n    <string name=\"action_save\">저장</string>\n    <string name=\"action_edit_profile\">프로필 편집</string>\n    <string name=\"action_edit_own_profile\">편집</string>\n    <string name=\"action_undo\">실행 취소</string>\n    <string name=\"action_accept\">수락</string>\n    <string name=\"action_reject\">거절</string>\n    <string name=\"action_search\">검색</string>\n    <string name=\"action_access_drafts\">임시 저장</string>\n    <string name=\"action_toggle_visibility\">공개 범위</string>\n    <string name=\"action_content_warning\">열람 주의</string>\n    <string name=\"action_emoji_keyboard\">이모지 추가</string>\n    <string name=\"action_add_tab\">탭 추가</string>\n    <string name=\"action_links\">링크</string>\n    <string name=\"action_mentions\">멘션</string>\n    <string name=\"action_hashtags\">해시태그</string>\n    <string name=\"action_open_reblogger\">부스트한 유저의 프로필로 이동</string>\n    <string name=\"action_open_reblogged_by\">부스트 보이기</string>\n    <string name=\"action_open_faved_by\">좋아요한 유저 보이기</string>\n    <string name=\"title_hashtags_dialog\">해시태그</string>\n    <string name=\"title_mentions_dialog\">멘션</string>\n    <string name=\"title_links_dialog\">링크</string>\n    <string name=\"action_open_media_n\">미디어 #%1$d 열기</string>\n    <string name=\"download_image\">%1$s 다운로드 중</string>\n    <string name=\"action_copy_link\">링크 복사</string>\n    <string name=\"action_share_as\">공유</string>\n    <string name=\"download_media\">다운로드</string>\n    <string name=\"downloading_media\">미디어 다운로드 중</string>\n    <string name=\"send_post_link_to\">툿 URL 공유</string>\n    <string name=\"send_post_content_to\">툿 공유</string>\n    <string name=\"send_media_to\">미디어 공유</string>\n    <string name=\"confirmation_reported\">신고를 보냈습니다!</string>\n    <string name=\"confirmation_unblocked\">차단이 해제됨</string>\n    <string name=\"confirmation_unmuted\">뮤트가 해제됨</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s 숨김 해제됨</string>\n    <string name=\"hint_domain\">인스턴스 주소</string>\n    <string name=\"hint_compose\">지금 무엇을 하고 있나요?</string>\n    <string name=\"hint_content_warning\">열람 주의</string>\n    <string name=\"hint_display_name\">표시되는 이름</string>\n    <string name=\"hint_note\">자기소개</string>\n    <string name=\"hint_search\">검색...</string>\n    <string name=\"search_no_results\">검색 결과가 없습니다</string>\n    <string name=\"label_quick_reply\">답장</string>\n    <string name=\"label_avatar\">아바타</string>\n    <string name=\"label_header\">헤더</string>\n    <string name=\"link_whats_an_instance\">인스턴스가 무엇인가요?</string>\n    <string name=\"login_connection\">연결 중...</string>\n    <string name=\"dialog_whats_an_instance\">인스턴스의 도메인 주소나 IP주소를 입력하실 수 있습니다. mastodon.social, icosahedron.website, social.tchncs.de 등이 있으며, 그 외에도 <a href=\"https://instances.social\">더 많은 인스턴스</a>가 당신을 기다리고 있습니다! \\u0020\n\\n \\u0020\n\\n만약 계정이 없으시다면, 인스턴스 주소를 입력하신 후에 계정을 만드실 수 있습니다. \\u0020\n\\n \\u0020\n\\n여러분이 어느 인스턴스에 가입하시더라도, 다른 인스턴스에 있는 유저들과 문제 없이 소통하실 수 있습니다. \\u0020\n\\n \\u0020\n\\n자세한 사항은 <a href=\"https://joinmastodon.org\">joinmastodon.org</a>을 참조하세요. </string>\n    <string name=\"dialog_title_finishing_media_upload\">미디어 업로드 완료</string>\n    <string name=\"dialog_message_uploading_media\">업로드 중...</string>\n    <string name=\"dialog_download_image\">다운로드</string>\n    <string name=\"dialog_message_cancel_follow_request\">팔로우 요청을 취소하시겠습니까?</string>\n    <string name=\"dialog_unfollow_warning\">이 계정을 팔로우 해제하시겠습니까?</string>\n    <string name=\"dialog_delete_post_warning\">이 툿을 삭제하시겠습니까?</string>\n    <string name=\"dialog_redraft_post_warning\">이 툿을 지우고 다시 작성하시겠습니까?</string>\n    <string name=\"mute_domain_warning\">정말로 %1$s 전체를 숨기시겠습니까? 모든 공개 타임라인과 알림에서 해당 도메인에서 작성된 컨텐츠를 보지 못합니다. 해당 도메인 팔로워와의 관계가 사라집니다.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">도메인 전체를 숨기기</string>\n    <string name=\"visibility_public\">공개: 공개 타임라인에 표시</string>\n    <string name=\"visibility_unlisted\">비표시: 공개 타임라인에 표시하지 않음</string>\n    <string name=\"visibility_private\">비공개: 팔로워에게만 공개</string>\n    <string name=\"visibility_direct\">다이렉트: 멘션한 사용자에게만 공개</string>\n    <string name=\"pref_title_edit_notification_settings\">알림</string>\n    <string name=\"pref_title_notifications_enabled\">알림</string>\n    <string name=\"pref_title_notification_alerts\">알림</string>\n    <string name=\"pref_title_notification_alert_sound\">소리</string>\n    <string name=\"pref_title_notification_alert_vibrate\">진동</string>\n    <string name=\"pref_title_notification_alert_light\">LED 상태표시등</string>\n    <string name=\"pref_title_notification_filters\">알림</string>\n    <string name=\"pref_title_appearance_settings\">화면</string>\n    <string name=\"pref_title_app_theme\">어플리케이션 테마</string>\n    <string name=\"pref_title_timelines\">타임라인</string>\n    <string name=\"pref_title_timeline_filters\">필터</string>\n    <string name=\"app_them_dark\">어두움</string>\n    <string name=\"app_theme_light\">밝음</string>\n    <string name=\"app_theme_black\">검정</string>\n    <string name=\"app_theme_auto\">시간에 따라 자동으로 변경</string>\n    <string name=\"app_theme_system\">시스템 기본값</string>\n    <string name=\"pref_title_browser_settings\">웹 브라우저</string>\n    <string name=\"pref_title_custom_tabs\">Chrome 커스텀 탭 사용</string>\n    <string name=\"pref_title_language\">언어/Language</string>\n    <string name=\"pref_title_bot_overlay\">봇 식별자 추가</string>\n    <string name=\"pref_title_animate_gif_avatars\">GIF 아바타 애니메이션 보이기</string>\n    <string name=\"pref_title_post_filter\">타임라인 필터링</string>\n    <string name=\"pref_title_post_tabs\">탭</string>\n    <string name=\"pref_title_show_boosts\">부스트 보이기</string>\n    <string name=\"pref_title_show_replies\">답장 보이기</string>\n    <string name=\"pref_title_show_media_preview\">미디어 미리보기 다운로드</string>\n    <string name=\"pref_title_proxy_settings\">프록시</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP 프록시</string>\n    <string name=\"pref_title_http_proxy_enable\">HTTP 프록시 사용하기</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP 프록시 서버</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP 프록시 포트</string>\n    <string name=\"pref_default_post_privacy\">기본 공개 범위</string>\n    <string name=\"pref_default_media_sensitivity\">미디어를 항상 열람주의로 설정</string>\n    <string name=\"pref_publishing\">게시물 작성 (서버와 동기화)</string>\n    <string name=\"pref_failed_to_sync\">설정을 동기화하지 못했습니다</string>\n    <string name=\"post_privacy_public\">공개</string>\n    <string name=\"post_privacy_unlisted\">타임라인에 비표시</string>\n    <string name=\"post_privacy_followers_only\">비공개</string>\n    <string name=\"pref_post_text_size\">게시물 글자 크기</string>\n    <string name=\"post_text_size_smallest\">매우 작게</string>\n    <string name=\"post_text_size_small\">작게</string>\n    <string name=\"post_text_size_medium\">보통</string>\n    <string name=\"post_text_size_large\">크게</string>\n    <string name=\"post_text_size_largest\">매우 크게</string>\n    <string name=\"notification_mention_name\">멘션</string>\n    <string name=\"notification_mention_descriptions\">누군가 나를 멘션할 때 알림</string>\n    <string name=\"notification_follow_name\">팔로우</string>\n    <string name=\"notification_follow_description\">누군가 나를 팔로우할 때 알림</string>\n    <string name=\"notification_boost_name\">부스트</string>\n    <string name=\"notification_boost_description\">누군가 내 게시물을 부스트할 때 알림</string>\n    <string name=\"notification_favourite_name\">좋아요</string>\n    <string name=\"notification_favourite_description\">누군가 내 게시물을 좋아요 했을 때 알림</string>\n    <string name=\"notification_poll_name\">투표</string>\n    <string name=\"notification_poll_description\">투표가 종료되었을 때 알림</string>\n    <string name=\"notification_mention_format\">%1$s님이 당신을 멘션했습니다</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s, 그 외 %4$d개</string>\n    <string name=\"notification_summary_medium\">%1$s님, %2$s님, %3$s님</string>\n    <string name=\"notification_summary_small\">%1$s와 %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"other\">%1$d개의 새로운 알림이 있습니다</item>\n    </plurals>\n    <string name=\"description_account_locked\">계정 잠김</string>\n    <string name=\"about_title_activity\">이 앱에 관하여</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_tusky_license\">Tusky는 무료이며 오픈 소스입니다. 이 프로젝트는 GNU General Public License Version 3에 의해 배포됩니다. 이 페이지에서 라이선스 전문(영문)을 열람하실 수 있습니다: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">프로젝트 홈페이지:\n\\n https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">버그 신고/건의사항:\n\\n https://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Tusky 공식 계정</string>\n    <string name=\"post_share_content\">이 툿의 내용 공유</string>\n    <string name=\"post_share_link\">이 툿의 링크 공유</string>\n    <string name=\"post_media_images\">사진</string>\n    <string name=\"post_media_video\">비디오</string>\n    <string name=\"state_follow_requested\">팔로우 요청함</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">%1$d년 후</string>\n    <string name=\"abbreviated_in_days\">%1$d일 후</string>\n    <string name=\"abbreviated_in_hours\">%1$d시간 후</string>\n    <string name=\"abbreviated_in_minutes\">%1$d분 후</string>\n    <string name=\"abbreviated_in_seconds\">%1$d초 후</string>\n    <string name=\"abbreviated_years_ago\">%1$d년</string>\n    <string name=\"abbreviated_days_ago\">%1$d일</string>\n    <string name=\"abbreviated_hours_ago\">%1$d시간</string>\n    <string name=\"abbreviated_minutes_ago\">%1$d분</string>\n    <string name=\"abbreviated_seconds_ago\">%1$d초</string>\n    <string name=\"follows_you\">당신을 팔로우합니다</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">민감한 컨텐츠 항상 보이기</string>\n    <string name=\"title_media\">미디어</string>\n    <string name=\"replying_to\">\\@%1$s에게 답장</string>\n    <string name=\"load_more_placeholder_text\">더 불러오기</string>\n    <string name=\"pref_title_public_filter_keywords\">공개 타임라인</string>\n    <string name=\"pref_title_thread_filter_keywords\">대화</string>\n    <string name=\"filter_addition_title\">필터 추가</string>\n    <string name=\"filter_edit_title\">필터 편집</string>\n    <string name=\"filter_dialog_remove_button\">삭제</string>\n    <string name=\"filter_dialog_update_button\">변경 사항 저장</string>\n    <string name=\"filter_dialog_whole_word\">단어 전체에 매칭</string>\n    <string name=\"filter_dialog_whole_word_description\">키워드나 문장이 영숫자로만 이루어져 있을 경우, 단어 전체와 일치할 때에만 필터링합니다.</string>\n    <string name=\"filter_add_description\">필터링할 문구 입력</string>\n    <string name=\"add_account_name\">계정 추가</string>\n    <string name=\"add_account_description\">마스토돈 계정을 추가합니다</string>\n    <string name=\"action_lists\">리스트</string>\n    <string name=\"title_lists\">리스트</string>\n    <string name=\"error_create_list\">리스트를 만들 수 없습니다.</string>\n    <string name=\"error_rename_list\">리스트의 이름을 변경할 수 없습니다.</string>\n    <string name=\"error_delete_list\">리스트를 삭제할 수 없습니다.</string>\n    <string name=\"action_create_list\">리스트 생성</string>\n    <string name=\"action_rename_list\">리스트 이름 바꾸기</string>\n    <string name=\"action_delete_list\">리스트 삭제</string>\n    <string name=\"hint_search_people_list\">당신을 팔로우하는 사람 검색</string>\n    <string name=\"action_add_to_list\">리스트에 계정 추가</string>\n    <string name=\"action_remove_from_list\">리스트에서 계정 삭제</string>\n    <string name=\"compose_active_account_description\">%1$s로서 포스팅</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"other\">시각 장애인을 위한 설명\n\\n(%1$d글자 작성 가능)</item>\n    </plurals>\n    <string name=\"action_set_caption\">설명 추가</string>\n    <string name=\"action_remove\">삭제</string>\n    <string name=\"lock_account_label\">계정 잠금</string>\n    <string name=\"lock_account_label_description\">팔로워를 수동으로 승인합니다</string>\n    <string name=\"compose_save_draft\">작성 중인 내용을 저장하시겠습니까?</string>\n    <string name=\"send_post_notification_title\">툿을 보내고 있습니다…</string>\n    <string name=\"send_post_notification_error_title\">툿을 보낼 수 없습니다</string>\n    <string name=\"send_post_notification_channel_name\">툿을 보내고 있습니다</string>\n    <string name=\"send_post_notification_cancel_title\">보내기 취소됨</string>\n    <string name=\"send_post_notification_saved_content\">복사본이 임시 저장에 저장되었습니다</string>\n    <string name=\"action_compose_shortcut\">글쓰기</string>\n    <string name=\"error_no_custom_emojis\">이 인스턴스 %1$s 은(는) 커스텀 이모지가 없습니다.</string>\n    <string name=\"emoji_style\">이모지 스타일</string>\n    <string name=\"system_default\">시스템 기본</string>\n    <string name=\"download_fonts\">시스템 기본 외의 이모지를 설정하시려면 우선 다운로드해야 합니다</string>\n    <string name=\"performing_lookup_title\">탐색하고 있습니다…</string>\n    <string name=\"expand_collapse_all_posts\">모두 보이기/줄이기</string>\n    <string name=\"action_open_post\">툿 열기</string>\n    <string name=\"restart_required\">어플리케이션 재시작 필요</string>\n    <string name=\"restart_emoji\">변경 사항을 적용하려면 Tusky를 재시작해야 합니다</string>\n    <string name=\"later\">다음에</string>\n    <string name=\"restart\">지금 재시작</string>\n    <string name=\"caption_systememoji\">이 디바이스의 기본 이모지</string>\n    <string name=\"caption_blobmoji\">Android 4.4~7.1에 내장된 기본 이모지</string>\n    <string name=\"caption_twemoji\">Mastodon 표준 이모지</string>\n    <string name=\"caption_notoemoji\">현재 Google이 배포 중인 이모지</string>\n    <string name=\"download_failed\">다운로드 실패</string>\n    <string name=\"profile_badge_bot_text\">봇</string>\n    <string name=\"account_moved_description\">%1$s는 계정을 이동했습니다:</string>\n    <string name=\"reblog_private\">원래의 수신자들에게 부스트</string>\n    <string name=\"unreblog_private\">부스트 해제</string>\n    <string name=\"license_description\">Tusky에는 다음 오픈 소스 프로젝트의 요소/코드를 일부 활용하였습니다:</string>\n    <string name=\"license_apache_2\">Apache License()에 의해 배포됨</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">프로필 메타데이터</string>\n    <string name=\"profile_metadata_add\">항목 추가</string>\n    <string name=\"profile_metadata_label_label\">라벨</string>\n    <string name=\"profile_metadata_content_label\">내용</string>\n    <string name=\"pref_title_absolute_time\">절대 시각 사용</string>\n    <string name=\"label_remote_account\">다음 정보는 원본과 차이가 있을 수 있습니다. 브라우저로 프로필을 확인하시려면 여기를 누르세요.</string>\n    <string name=\"unpin_action\">고정 해제</string>\n    <string name=\"pin_action\">고정</string>\n    <plurals name=\"favs\">\n        <item quantity=\"other\"><b>%1$s</b> 좋아요</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"other\"><b>%1$s</b> 부스트</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">부스트한 유저</string>\n    <string name=\"title_favourited_by\">좋아요한 유저</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s와 %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s 외 %3$d명</string>\n    <string name=\"description_post_media\">미디어: %1$s</string>\n    <string name=\"description_post_cw\">열람주의: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">설명 없음</string>\n    <string name=\"description_post_reblogged\">부스트함</string>\n    <string name=\"description_post_favourited\">좋아요함</string>\n    <string name=\"description_visibility_public\">공개</string>\n    <string name=\"description_visibility_unlisted\">타임라인에 비표시</string>\n    <string name=\"description_visibility_private\">비공개</string>\n    <string name=\"description_visibility_direct\">다이렉트</string>\n    <string name=\"description_poll\">투표 선택지: %1$s, %2$s, %3$s, %4$s, %5$s</string>\n    <string name=\"hint_list_name\">리스트 이름</string>\n    <string name=\"pick_hashtag_hint\">#를 제외한 해시태그</string>\n    <string name=\"notifications_clear\">알림 지우기</string>\n    <string name=\"notifications_apply_filter\">필터</string>\n    <string name=\"filter_apply\">적용</string>\n    <string name=\"compose_shortcut_long_label\">툿 작성하기</string>\n    <string name=\"compose_shortcut_short_label\">작성</string>\n    <string name=\"notification_clear_text\">모든 알림을 영구적으로 지우시겠습니까?</string>\n    <string name=\"compose_preview_image_description\">이미지 %1$s를...</string>\n    <string name=\"poll_info_format\"> <!-- 15 명 참여 • 1 시간 남음 --> %1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"other\">%1$s 명 참여</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">%1$s에 종료</string>\n    <string name=\"poll_info_closed\">마감됨</string>\n    <string name=\"poll_vote\">투표</string>\n    <string name=\"poll_ended_voted\">당신이 참여한 투표가 종료되었습니다</string>\n    <string name=\"poll_ended_created\">당신이 시작한 투표가 종료되었습니다</string>\n    <!--These are for timestamps on polls -->\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"other\">%1$d일 남음</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"other\">%1$d시간 남음</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"other\">%1$d분 남음</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"other\">%1$d초 남음</item>\n    </plurals>\n    <string name=\"button_continue\">다음</string>\n    <string name=\"button_back\">이전</string>\n    <string name=\"button_done\">완료</string>\n    <string name=\"report_sent_success\">\\@%1$s를 신고하였습니다</string>\n    <string name=\"hint_additional_info\">부가 설명</string>\n    <string name=\"report_remote_instance\">%1$s에 포워딩</string>\n    <string name=\"failed_report\">신고하지 못했습니다</string>\n    <string name=\"failed_fetch_posts\">게시물을 불러오지 못했습니다</string>\n    <string name=\"report_description_1\">인스턴스 관리자에게 신고합니다. 이 계정을 신고하려는 이유를 작성하실 수 있습니다:</string>\n    <string name=\"report_description_remote_instance\">이 유저는 다른 인스턴스에 속해 있습니다. 그 인스턴스에도 익명으로 신고 내용을 보내시겠습니까?</string>\n    <string name=\"action_open_as\">%1$s(으)로 열기</string>\n    <string name=\"title_accounts\">계정</string>\n    <string name=\"failed_search\">검색하지 못했습니다</string>\n    <string name=\"pref_title_alway_open_spoiler\">열람주의로 설정된 툿을 항상 펼치기</string>\n    <string name=\"action_add_poll\">투표 추가</string>\n    <string name=\"create_poll_title\">투표</string>\n    <string name=\"duration_5_min\">5분</string>\n    <string name=\"duration_30_min\">30분</string>\n    <string name=\"duration_1_hour\">1시간</string>\n    <string name=\"duration_6_hours\">6시간</string>\n    <string name=\"duration_1_day\">1일</string>\n    <string name=\"duration_3_days\">3일</string>\n    <string name=\"duration_7_days\">7일</string>\n    <string name=\"add_poll_choice\">항목 추가</string>\n    <string name=\"poll_allow_multiple_choices\">여러 항목 선택 가능</string>\n    <string name=\"poll_new_choice_hint\">%1$d번 항목</string>\n    <string name=\"edit_poll\">수정</string>\n    <string name=\"action_edit\">수정</string>\n    <string name=\"hashtags\">해시태그</string>\n    <string name=\"notification_follow_request_name\">팔로우 요청</string>\n    <string name=\"error_multimedia_size_limit\">비디오또는 오디오파일의 용량은 %1$s MB를 넘을 수 없습니다.</string>\n    <string name=\"error_image_edit_failed\">이 이미지는 수정할 수 없습니다.</string>\n    <string name=\"error_following_hashtag_format\"># %1$s 를 팔로우 하는 중 오류가 발생했습니다.</string>\n    <string name=\"error_media_upload_sending_fmt\">\"업로드 실패 :  %1$s\"</string>\n    <string name=\"error_loading_account_details\">계정 세부정보를 불러오는 것에 실패했습니다.</string>\n    <string name=\"error_could_not_load_login_page\">로그인 페이지를 불러올 수 없습니다.</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-large/dimens.xml",
    "content": "<resources>\n    <dimen name=\"status_media_preview_height\">160dp</dimen>\n    <dimen name=\"status_detail_media_preview_height\">180dp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-large/styles.xml",
    "content": "<resources>\n    <style name=\"TuskyDialogActivityTheme\" parent=\"@style/TuskyTheme\">\n        <item name=\"android:windowFrame\">@null</item>\n        <item name=\"android:windowBackground\">@drawable/background_dialog_activity</item>\n        <item name=\"android:windowIsFloating\">true</item>\n        <item name=\"android:windowContentOverlay\">@null</item>\n        <item name=\"android:windowSoftInputMode\">stateAlwaysVisible|adjustResize</item>\n        <item name=\"android:windowCloseOnTouchOutside\">false</item>\n        <item name=\"android:windowActionModeOverlay\">true</item>\n    </style>\n\n    <style name=\"TuskyDialogActivityBlackTheme\" parent=\"@style/TuskyBlackTheme\">\n        <item name=\"android:windowFrame\">@null</item>\n        <item name=\"android:windowBackground\">@drawable/background_dialog_activity</item>\n        <item name=\"android:windowIsFloating\">true</item>\n        <item name=\"android:windowContentOverlay\">@null</item>\n        <item name=\"android:windowSoftInputMode\">stateAlwaysVisible|adjustResize</item>\n        <item name=\"android:windowCloseOnTouchOutside\">false</item>\n        <item name=\"android:windowActionModeOverlay\">true</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-large-land/dimens.xml",
    "content": "<resources>\n    <dimen name=\"dialog_activity_vertical_inset\">16dp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-lb/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">Et ass ee Feeler geschitt.</string>\n    <string name=\"error_empty\">Dëst Feld däerf net eidel sinn.</string>\n    <string name=\"error_invalid_domain\">Et gouf eng ongülteg Domän aginn</string>\n    <string name=\"error_network\">Et ass een Netzwierkfeeler geschitt. Iwwerpréif wgl. deng Verbindung a probéier et nach eng Kéier.</string>\n    <string name=\"error_failed_app_registration\">D\\'Authentifizéierung mat dëser Instanz ass feelgeschloen. Wann dëse Problem weider besteet, probéier Am Browser umellen am Menü.</string>\n    <string name=\"error_no_web_browser_found\">Et konnt kee Browser fir ze notze fonnt ginn.</string>\n    <string name=\"error_retrieving_oauth_token\">Ofruffe vum Umeldungs-Token feelgeschloen, probéier Am Browser Umellen am Menü.</string>\n    <string name=\"error_loading_account_details\">Luede vun de Kontdetailer feelgeschloen</string>\n    <string name=\"error_could_not_load_login_page\">Umeldungssäit konnt net geluede ginn.</string>\n    <string name=\"error_compose_character_limit\">Däi Post ass ze laang!</string>\n    <string name=\"error_multimedia_size_limit\">Video- an Audiodateie kënnen net iwwer %1$s MB grouss sinn.</string>\n    <string name=\"error_image_edit_failed\">D\\'Bild konnt net beaarbecht ginn.</string>\n    <string name=\"error_authorization_unknown\">Et ass en onidentifizéierten Autorisatiounsfeeler opgetrueden. Wann e weider besteet, probéier Am Browser umellen am Menü.</string>\n    <string name=\"error_authorization_denied\">Autorisatioun ofgeleent. Wann s de sécher bass, datt s du déi korrekt Umeldungsinformatiounen uginn hues, probéier Am Browser umellen am Menü.</string>\n    <string name=\"post_content_warning_show_less\">Manner uweisen</string>\n    <string name=\"error_media_upload_type\">Dësen Dateityp kann net eropgeluede ginn.</string>\n    <string name=\"error_media_upload_opening\">Dës Datei konnt net opgemaach ginn.</string>\n    <string name=\"error_media_upload_permission\">Berechtegung fir Media ze liesen erfuerderlech.</string>\n    <string name=\"error_media_download_permission\">Berechtegung fir Media ze späicheren erfuerderlech.</string>\n    <string name=\"error_media_upload_image_or_video\">Et kënnen net Biller a Videoen um selwechte Post ugehaang ginn.</string>\n    <string name=\"error_media_upload_sending\">Den Upload ass feelgeschloen.</string>\n    <string name=\"error_media_upload_sending_fmt\">Den Upload ass feelgeschloen: %1$s</string>\n    <string name=\"error_sender_account_gone\">Feeler beim Schécke vum Post.</string>\n    <string name=\"error_following_hashtag_format\">Feeler beim Verfollege vu(n) #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Feeler beim Entfollege vu(n) #%1$s</string>\n    <string name=\"error_following_hashtags_unsupported\">Dës Instanz ënnerstëtzt d\\'Verfollege vun Hashtags net.</string>\n    <string name=\"error_muting_hashtag_format\">Feeler beim Stommschalten vo(n) #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Feeler beim Ophiewe vun der Stommschaltung vu(n) #%1$s</string>\n    <string name=\"error_blocking_domain\">Feeler beim Stommschalten vu(n) %1$s: %2$s</string>\n    <string name=\"error_unblocking_domain\">Feeler beim Ophiewe vun der Stommschaltung vu(n) %1$s: %2$s</string>\n    <string name=\"error_status_source_load\">D\\'Statusquell konnt net vum Server geluede ginn.</string>\n    <string name=\"title_login\">Umelden</string>\n    <string name=\"title_home\">Startsäit</string>\n    <string name=\"title_posts_with_replies\">Mat Äntwerten</string>\n    <string name=\"title_domain_mutes\">Ausgeblent Domänen</string>\n    <string name=\"dialog_follow_hashtag_title\">Hashtag verfollegen</string>\n    <string name=\"post_content_show_less\">Reduzéieren</string>\n    <string name=\"error_deleting_filter\">Feeler beim Läsche vum Filter \\\"%1$s\\\"</string>\n    <string name=\"error_saving_filter\">Feeler beim Späichere vum Filter \\\"%1$s\\\"</string>\n    <string name=\"title_notifications\">Benoriichtegungen</string>\n    <string name=\"title_public_local\">Lokal</string>\n    <string name=\"title_public_trending_hashtags\">Ugesot Hashtags</string>\n    <string name=\"title_public_trending_statuses\">Ugesot Posts</string>\n    <string name=\"title_public_federated\">Federéiert</string>\n    <string name=\"title_direct_messages\">Direktnoriichten</string>\n    <string name=\"title_tab_preferences\">Tabs</string>\n    <string name=\"title_view_thread\">Thread</string>\n    <string name=\"title_posts\">Posts</string>\n    <string name=\"title_posts_pinned\">Ugespéngelt</string>\n    <string name=\"title_follows\">Verfollegen ech</string>\n    <string name=\"title_followers\">Verfollege mech</string>\n    <string name=\"title_favourites\">Favoritten</string>\n    <string name=\"title_bookmarks\">Lieszeechen</string>\n    <string name=\"title_mutes\">Stommgeschalt Profiller</string>\n    <string name=\"title_blocks\">Blockéiert Profiller</string>\n    <string name=\"title_follow_requests\">Follower-Ufroen</string>\n    <string name=\"title_edit_profile\">Däi Profil beaarbechten</string>\n    <string name=\"title_drafts\">Entwërf</string>\n    <string name=\"title_scheduled_posts\">Geplangt Posts</string>\n    <string name=\"title_announcements\">Ukënnegungen</string>\n    <string name=\"title_licenses\">Lizenzen</string>\n    <string name=\"title_followed_hashtags\">Verfollegt Hashtags</string>\n    <string name=\"title_edits\">Beaarbechtungen</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s huet gedeelt</string>\n    <string name=\"post_sensitive_media_title\">Inhaltswarnung</string>\n    <string name=\"post_media_hidden_title\">Mediendateien ausgeblent</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"post_sensitive_media_directions\">Klicke fir unzeweisen</string>\n    <string name=\"post_content_warning_show_more\">Méi uweisen</string>\n    <string name=\"post_content_show_more\">Ausklappen</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-lv/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_invalid_domain\">Ievadīts nederīgs domēns</string>\n    <string name=\"error_empty\">Tas nevar būt tukšs.</string>\n    <string name=\"error_failed_app_registration\">Autentificēšana ar šo instanci neizdevās. Ja tas atkārtojas, izmantojot izvēlni, mēģiniet pieslēgties pārlūkā.</string>\n    <string name=\"error_authorization_unknown\">Radās neidentificēta autorizācijas kļūda. Ja tas atkārtojas, izmantojot izvēlni, mēģiniet pieslēgties pārlūkā.</string>\n    <string name=\"error_authorization_denied\">Autorizācija tika liegta. Ja ir pārliecība, ka ievadīti pareizi pieslēgšanās dati, izmantojot izvēlni, mēģiniet pieslēgties pārlūkā.</string>\n    <string name=\"error_no_web_browser_found\">Nevarēja atrast tīmekļa pārlūku, ko izmantot.</string>\n    <string name=\"error_could_not_load_login_page\">Nevarēja ielādēt pieslēgšanās lapu.</string>\n    <string name=\"error_compose_character_limit\">Ieraksts ir pārāk garš!</string>\n    <string name=\"error_loading_account_details\">Neizdevās ielādēt konta datus</string>\n    <string name=\"error_image_edit_failed\">Attēlu nevarēja rediģēt.</string>\n    <string name=\"error_media_upload_type\">Šī veida failu nevar augšupielādēt.</string>\n    <string name=\"error_media_upload_opening\">Šo failu nevarēja atvērt.</string>\n    <string name=\"error_media_upload_image_or_video\">Ierakstam nevar vienlaicīgi pievienot gan attēlus, gan video.</string>\n    <string name=\"title_public_local\">Vietējā</string>\n    <string name=\"title_notifications\">Paziņojumi</string>\n    <string name=\"title_tab_preferences\">Cilnes</string>\n    <string name=\"title_view_thread\">Pavediens</string>\n    <string name=\"title_posts\">Ieraksti</string>\n    <string name=\"title_bookmarks\">Grāmatzīmes</string>\n    <string name=\"title_follows\">Sekojamie</string>\n    <string name=\"title_mutes\">Apklusinātie lietotāji</string>\n    <string name=\"title_drafts\">Melnraksti</string>\n    <string name=\"title_edit_profile\">Labot savu profilu</string>\n    <string name=\"title_domain_mutes\">Paslēptie domēni</string>\n    <string name=\"title_follow_requests\">Sekošanas pieprasījumi</string>\n    <string name=\"title_scheduled_posts\">Ieplānotie ieraksti</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"title_announcements\">Paziņojumi</string>\n    <string name=\"post_sensitive_media_title\">Sensitīvs saturs</string>\n    <string name=\"post_content_show_less\">Sakļaut</string>\n    <string name=\"post_content_warning_show_more\">Rādīt vairāk</string>\n    <string name=\"post_content_warning_show_less\">Rādīt mazāk</string>\n    <string name=\"message_empty\">Šeit nekā nav.</string>\n    <string name=\"notification_follow_format\">%1$s sāka tev sekot</string>\n    <string name=\"notification_sign_up_format\">%1$s reģistrējās</string>\n    <string name=\"footer_empty\">Šeit nekā nav. Pavelciet uz leju, lai atjauninātu!</string>\n    <string name=\"notification_update_format\">%1$s laboja savu ierakstu</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"action_quick_reply\">Ātrā atbilde</string>\n    <string name=\"action_reply\">Atbildēt</string>\n    <string name=\"action_login\">Pieslēgties ar Tusky</string>\n    <string name=\"action_bookmark\">Atzīmēt ar grāmatzīmi</string>\n    <string name=\"action_unbookmark\">Noņemt grāmatzīmi</string>\n    <string name=\"action_follow\">Sekot</string>\n    <string name=\"action_unblock\">Atbloķēt</string>\n    <string name=\"action_unfollow\">Pārtraukt sekošanu</string>\n    <string name=\"action_edit\">Labot</string>\n    <string name=\"action_delete\">Dzēst</string>\n    <string name=\"action_close\">Aizvērt</string>\n    <string name=\"action_view_profile\">Profils</string>\n    <string name=\"action_delete_conversation\">Dzēst sarunu</string>\n    <string name=\"action_view_preferences\">Iestatījumi</string>\n    <string name=\"action_view_domain_mutes\">Paslēptie domēni</string>\n    <string name=\"action_view_mutes\">Apklusinātie lietotāji</string>\n    <string name=\"action_view_blocks\">Bloķētie lietotāji</string>\n    <string name=\"action_view_media\">Multivide</string>\n    <string name=\"action_share\">Dalīties</string>\n    <string name=\"action_add_poll\">Pievienot aptauju</string>\n    <string name=\"action_photo_take\">Uzņemt fotoattēlu</string>\n    <string name=\"action_mute\">Apklusināt</string>\n    <string name=\"action_mute_domain\">Apklusināt %1$s</string>\n    <string name=\"action_edit_own_profile\">Labot</string>\n    <string name=\"action_accept\">Pieņemt</string>\n    <string name=\"action_reject\">Noraidīt</string>\n    <string name=\"action_edit_profile\">Labot profilu</string>\n    <string name=\"action_search\">Meklēt</string>\n    <string name=\"action_hide_media\">Paslēpt multividi</string>\n    <string name=\"action_undo\">Atcelt</string>\n    <string name=\"action_content_warning\">Satura brīdinājums</string>\n    <string name=\"action_toggle_visibility\">Ieraksta redzamība</string>\n    <string name=\"action_schedule_post\">Ieplānot ierakstu</string>\n    <string name=\"action_emoji_keyboard\">Emocijzīmju tastatūra</string>\n    <string name=\"action_add_tab\">Pievienot cilni</string>\n    <string name=\"action_reset_schedule\">Atiestatīt</string>\n    <string name=\"action_mentions\">Pieminējumi</string>\n    <string name=\"download_image\">Lejupielādē %1$s</string>\n    <string name=\"title_mentions_dialog\">Pieminējumi</string>\n    <string name=\"action_details\">Detaļas</string>\n    <string name=\"title_hashtags_dialog\">Tēmturi</string>\n    <string name=\"confirmation_reported\">Nosūtīts!</string>\n    <string name=\"action_copy_link\">Nokopēt saiti</string>\n    <string name=\"action_open_as\">Atvērt kā %1$s</string>\n    <string name=\"confirmation_unblocked\">Lietotājs atbloķēts</string>\n    <string name=\"hint_note\">Biogrāfija</string>\n    <string name=\"hint_domain\">Kura instance?</string>\n    <string name=\"hint_content_warning\">Satura brīdinājums</string>\n    <string name=\"label_avatar\">Avatars</string>\n    <string name=\"login_connection\">Savienojas…</string>\n    <string name=\"search_no_results\">Nav rezultātu</string>\n    <string name=\"link_whats_an_instance\">Kas ir instance?</string>\n    <string name=\"label_quick_reply\">Atbildēt…</string>\n    <string name=\"dialog_download_image\">Lejupielādēt</string>\n    <string name=\"dialog_delete_post_warning\">Dzēst šo ierakstu?</string>\n    <string name=\"dialog_delete_conversation_warning\">Dzēst šo sarunu?</string>\n    <string name=\"pref_title_language\">Valoda</string>\n    <string name=\"pref_title_post_tabs\">Cilnes</string>\n    <string name=\"pref_title_post_filter\">Laika līnijas filtrēšana</string>\n    <string name=\"pref_title_show_replies\">Rādīt atbildes</string>\n    <string name=\"pref_title_animate_gif_avatars\">Animēt GIF avatarus</string>\n    <string name=\"pref_title_proxy_settings\">Starpniekserveris</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP starpniekserveris</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP starpniekservera ports</string>\n    <string name=\"post_text_size_small\">Mazs</string>\n    <string name=\"post_text_size_medium\">Vidējs</string>\n    <string name=\"post_text_size_large\">Liels</string>\n    <string name=\"post_text_size_largest\">Lielākais</string>\n    <string name=\"pref_show_self_username_always\">Vienmēr</string>\n    <string name=\"pref_show_self_username_never\">Nekad</string>\n    <string name=\"notification_poll_name\">Aptaujas</string>\n    <string name=\"notification_report_name\">Ziņojumi</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"post_media_video\">Video</string>\n    <string name=\"post_media_audio\">Audio</string>\n    <string name=\"post_media_attachments\">Pielikumi</string>\n    <string name=\"state_follow_requested\">Sekošana pieprasīta</string>\n    <string name=\"pref_title_public_filter_keywords\">Publiskās laika līnijas</string>\n    <string name=\"filter_addition_title\">Pievienot filtru</string>\n    <string name=\"pref_title_thread_filter_keywords\">Sarunas</string>\n    <string name=\"filter_dialog_remove_button\">Noņemt</string>\n    <string name=\"filter_dialog_update_button\">Atjaunināt</string>\n    <string name=\"action_lists\">Saraksti</string>\n    <string name=\"title_lists\">Saraksti</string>\n    <string name=\"filter_edit_title\">Labot filtru</string>\n    <string name=\"add_account_name\">Pievienot kontu</string>\n    <string name=\"error_delete_list\">Nevarēja dzēst sarakstu</string>\n    <string name=\"action_create_list\">Izveidot sarakstu</string>\n    <string name=\"action_rename_list\">Pārsaukt sarakstu</string>\n    <string name=\"action_delete_list\">Dzēst sarakstu</string>\n    <string name=\"action_add_to_list\">Pievienot kontu sarakstam</string>\n    <string name=\"action_remove_from_list\">Noņemt kontu no saraksta</string>\n    <string name=\"action_edit_image\">Labot attēlu</string>\n    <string name=\"send_post_notification_title\">Sūta ierakstu…</string>\n    <string name=\"send_post_notification_cancel_title\">Sūtīšana atcelta</string>\n    <string name=\"compose_save_draft_loses_media\">Vai saglabāt melnrakstu (atjaunojot melnrakstu, pielikumi tiks augšupielādēti vēlreiz)?</string>\n    <string name=\"later\">Vēlāk</string>\n    <string name=\"restart\">Sākt no jauna</string>\n    <string name=\"system_default\">Sistēmas noklusējuma</string>\n    <string name=\"action_open_post\">Atvērt ierakstu</string>\n    <string name=\"profile_metadata_content_label\">Saturs</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">Profila metadati</string>\n    <string name=\"profile_metadata_add\">pievienot datus</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s un %3$d citi</string>\n    <string name=\"description_post_media_no_description_placeholder\">Nav apraksta</string>\n    <string name=\"description_post_language\">Ieraksta valoda</string>\n    <string name=\"hint_list_name\">Saraksta nosaukums</string>\n    <string name=\"select_list_title\">Izvēlies sarakstu</string>\n    <string name=\"description_post_edited\">Labots</string>\n    <string name=\"description_post_bookmarked\">Atzīmēts ar grāmatzīmi</string>\n    <string name=\"description_visibility_public\">Publisks</string>\n    <string name=\"hashtags\">Tēmturi</string>\n    <string name=\"notifications_clear\">Dzēst</string>\n    <string name=\"notifications_apply_filter\">Filtrēt</string>\n    <string name=\"filter_apply\">Pielietot</string>\n    <string name=\"button_continue\">Turpināt</string>\n    <string name=\"button_back\">Atpakaļ</string>\n    <string name=\"button_done\">Gatavs</string>\n    <string name=\"hint_additional_info\">Papildu komentāri</string>\n    <string name=\"poll_info_closed\">slēgta</string>\n    <string name=\"poll_vote\">Balsot</string>\n    <string name=\"create_poll_title\">Aptauja</string>\n    <string name=\"report_description_remote_instance\">Konts ir no cita servera. Vai nosūtīt arī tam anonīmu ziņojuma kopiju?</string>\n    <string name=\"duration_30_min\">30 minūtes</string>\n    <string name=\"duration_indefinite\">Bezgalīgi</string>\n    <string name=\"duration_1_hour\">1 stundu</string>\n    <string name=\"duration_6_hours\">6 stundas</string>\n    <string name=\"duration_1_day\">1 dienu</string>\n    <string name=\"duration_3_days\">3 dienas</string>\n    <string name=\"duration_7_days\">7 dienas</string>\n    <string name=\"label_duration\">Ilgums</string>\n    <string name=\"duration_30_days\">30 dienas</string>\n    <string name=\"duration_60_days\">60 dienas</string>\n    <string name=\"duration_180_days\">180 dienas</string>\n    <string name=\"duration_365_days\">365 dienas</string>\n    <string name=\"add_poll_choice\">Pievienot izvēli</string>\n    <string name=\"poll_allow_multiple_choices\">Vairākas izvēles</string>\n    <string name=\"poll_new_choice_hint\">%1$d. izvēle</string>\n    <string name=\"duration_no_change\">(Nav izmaiņu)</string>\n    <string name=\"pref_title_wellbeing_mode\">Labsajūta</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"report_category_violation\">Noteikumu pārkāpums</string>\n    <string name=\"report_category_other\">Cits</string>\n    <string name=\"delete_scheduled_post_warning\">Vai dzēst šo ieplānoto ierakstu?</string>\n    <string name=\"error_generic\">Notika kļūda.</string>\n    <string name=\"error_media_upload_sending\">Augšupielāde neizdevās.</string>\n    <string name=\"error_rename_list\">Nevarēja pārsaukt sarakstu</string>\n    <string name=\"action_add_or_remove_from_list\">Pievienot vai noņemt no saraksta</string>\n    <string name=\"title_licenses\">Licences</string>\n    <string name=\"about_title_activity\">Par</string>\n    <string name=\"edit_poll\">Labot</string>\n    <string name=\"action_access_drafts\">Melnraksti</string>\n    <string name=\"action_block\">Bloķēt</string>\n    <string name=\"action_report\">Ziņot</string>\n    <string name=\"action_open_in_web\">Atvērt pārlūkā</string>\n    <string name=\"duration_5_min\">5 minūtes</string>\n    <string name=\"hint_search\">Meklēt…</string>\n    <string name=\"title_accounts\">Konti</string>\n    <string name=\"title_home\">Sākums</string>\n    <string name=\"title_public_federated\">Apvienotā</string>\n    <string name=\"title_followers\">Sekotāji</string>\n    <string name=\"post_content_show_more\">Izplest</string>\n    <string name=\"action_more\">Vairāk</string>\n    <string name=\"action_retry\">Mēģināt vēlreiz</string>\n    <string name=\"action_view_bookmarks\">Grāmatzīmes</string>\n    <string name=\"action_save\">Saglabāt</string>\n    <string name=\"action_links\">Saites</string>\n    <string name=\"title_links_dialog\">Saites</string>\n    <string name=\"dialog_message_uploading_media\">Augšupielādē…</string>\n    <string name=\"pref_title_timeline_filters\">Filtri</string>\n    <string name=\"pref_title_browser_settings\">Pārlūks</string>\n    <string name=\"post_text_size_smallest\">Mazākais</string>\n    <string name=\"post_media_images\">Attēli</string>\n    <string name=\"action_remove\">Noņemt</string>\n    <string name=\"profile_badge_bot_text\">Bots</string>\n    <string name=\"description_visibility_private\">Sekotāji</string>\n    <string name=\"list\">Saraksts</string>\n    <string name=\"account_note_saved\">Saglabāts!</string>\n    <string name=\"title_posts_with_replies\">Ar atbildēm</string>\n    <string name=\"report_comment_hint\">Papildu komentāri?</string>\n    <string name=\"action_view_follow_requests\">Sekošanas pieprasījumi</string>\n    <string name=\"action_add_reaction\">pievienot reakciju</string>\n    <string name=\"hint_compose\">Kas notiek?</string>\n    <string name=\"dialog_block_warning\">Bloķēt @%1$s?</string>\n    <string name=\"notification_follow_request_name\">Sekošanas pieprasījumi</string>\n    <string name=\"notification_subscription_name\">Jauni ieraksti</string>\n    <string name=\"follows_you\">Seko tev</string>\n    <string name=\"load_more_placeholder_text\">Ielādēt vairāk</string>\n    <string name=\"compose_save_draft\">Saglabāt melnrakstu?</string>\n    <string name=\"download_failed\">Lejupielāde neizdevās</string>\n    <string name=\"duration_14_days\">14 dienas</string>\n    <string name=\"duration_90_days\">90 dienas</string>\n    <string name=\"draft_deleted\">Melnraksts dzēsts</string>\n    <string name=\"saving_draft\">Saglabā melnrakstu…</string>\n    <string name=\"post_sensitive_media_directions\">Klikšķini, lai apskatītu</string>\n    <string name=\"error_network\">Radās tīkla kļūda. Lūdzu, pārbaudiet savienojumu un mēģiniet vēlreiz.</string>\n    <string name=\"about_tusky_license\">Tusky ir bezmaksas un atvērtā pirmkoda programmatūra. Tā ir licencēta saskaņā ar GNU vispārējās publiskās licences 3. versiju. Licenci var apskatīt šeit: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <string name=\"report_description_1\">Ziņojums tiks nosūtīts jūsu servera moderatoram. Zemāk var sniegt skaidrojumu, kāpēc ziņojat par šo kontu:</string>\n    <string name=\"filter_dialog_whole_word_description\">Ja atslēgvārds vai frāze ir tikai burtciparu, to pielietos tikai tad, ja tas atbildīs visam vārdam</string>\n    <string name=\"label_remote_account\">Tālāk norādītā informācija var nepilnīgi atspoguļot lietotāja profilu. Nospiediet, lai pārlūkprogrammā atvērtu pilnu profilu.</string>\n    <string name=\"notification_report_format\">Jauns ziņojums par %1$s</string>\n    <string name=\"action_mute_conversation\">Apklusināt sarunu</string>\n    <string name=\"action_access_scheduled_posts\">Ieplānotie ieraksti</string>\n    <string name=\"error_multimedia_size_limit\">Video un audio faili nevar pārsniegt %1$s MB izmēru.</string>\n    <string name=\"error_following_hashtags_unsupported\">Šī instance neatbalsta sekošanu tēmturiem.</string>\n    <string name=\"action_hashtags\">Tēmturi</string>\n    <string name=\"send_post_notification_channel_name\">Sūta ierakstus</string>\n    <string name=\"emoji_style\">Emocijzīmju stils</string>\n    <string name=\"add_hashtag_title\">Pievienot tēmturi</string>\n    <string name=\"instance_rule_title\">%1$s noteikumi</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Rādīt saišu priekšskatījumus laika līnijās</string>\n    <string name=\"drafts_post_failed_to_send\">Neizdevās nosūtīt šo ierakstu!</string>\n    <string name=\"title_blocks\">Bloķētie lietotāji</string>\n    <string name=\"pref_title_http_proxy_enable\">Iespējot HTTP starpniekserveri</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP starpniekserveris</string>\n    <string name=\"pref_title_http_proxy_port_message\">Portam būtu jābūt starp %1$d un %2$d</string>\n    <string name=\"action_view_account_preferences\">Konta iestatījumi</string>\n    <string name=\"mute_domain_warning\">Vai tiešām vēlaties bloķēt visu %1$s? Šī domēna saturs netiks rādīts ne publiskajās laika līnijās, ne paziņojumos. Jūsu sekotāji no šī domēna tiks noņemti.</string>\n    <string name=\"send_post_notification_saved_content\">Ieraksta kopija tika saglabāta tavos melnrakstos</string>\n    <string name=\"restart_emoji\">Lai pielietotu šīs izmaiņas, ir jāpārstartē Tusky</string>\n    <string name=\"error_status_source_load\">Neizdevās ielādēt statusa avotu no servera.</string>\n    <string name=\"error_sender_account_gone\">Sūtot ziņu, radās kļūda.</string>\n    <string name=\"title_login\">Pieslēgties</string>\n    <string name=\"title_posts_pinned\">Piesprausts</string>\n    <string name=\"title_followed_hashtags\">Sekotie tēmturi</string>\n    <string name=\"post_boosted_format\">%1$s pastiprināja</string>\n    <string name=\"post_edited\">Labots %1$s</string>\n    <string name=\"notification_subscription_format\">%1$s nupat publicēja</string>\n    <string name=\"report_username_format\">Ziņot par @%1$s</string>\n    <string name=\"notification_header_report_format\">%1$s ziņoja par %2$s</string>\n    <string name=\"action_logout\">Iziet</string>\n    <string name=\"action_show_reblogs\">Parādīt pastiprinājumus</string>\n    <string name=\"action_hide_reblogs\">Paslēpt pastiprinājumus</string>\n    <string name=\"action_open_reblogger\">Atvērt pastiprinājuma autoru</string>\n    <string name=\"action_open_reblogged_by\">Parādīt pastiprinājumus</string>\n    <string name=\"action_share_as\">Dalīties, izmantojot…</string>\n    <string name=\"send_post_content_to\">Dalīties ar ierakstu…</string>\n    <string name=\"hint_display_name\">Nosaukums</string>\n    <string name=\"dialog_mute_warning\">Vai apklusināt @%1$s?</string>\n    <string name=\"dialog_mute_hide_notifications\">Paslēpt paziņojumus</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Paslēpt visu domēnu</string>\n    <string name=\"pref_title_edit_notification_settings\">Paziņojumi</string>\n    <string name=\"pref_title_notifications_enabled\">Paziņojumi</string>\n    <string name=\"pref_title_notification_alerts\">Brīdinājumi</string>\n    <string name=\"pref_title_notification_filters\">Paziņot man, kad</string>\n    <string name=\"app_theme_black\">Melna</string>\n    <string name=\"app_theme_auto\">Automātiski saulrietā</string>\n    <string name=\"app_theme_system\">Izmantot sistēmas dizainu</string>\n    <string name=\"notification_mention_name\">Jauni pieminējumi</string>\n    <string name=\"notification_follow_name\">Jauni sekotāji</string>\n    <string name=\"notification_boost_name\">Pastiprinājumi</string>\n    <string name=\"abbreviated_days_ago\">%1$dd</string>\n    <string name=\"abbreviated_hours_ago\">%1$dh</string>\n    <string name=\"abbreviated_years_ago\">%1$dg</string>\n    <string name=\"filter_dialog_whole_word\">Viss vārds</string>\n    <string name=\"unreblog_private\">Atcelt pastiprināšanu</string>\n    <string name=\"unpin_action\">Atspraust</string>\n    <string name=\"pin_action\">Piespraust</string>\n    <string name=\"action_unfollow_hashtag_format\">Vai pārtraukt sekot #%1$s?</string>\n    <string name=\"about_tusky_account\">Tusky profils</string>\n    <string name=\"performing_lookup_title\">Meklē…</string>\n    <string name=\"mute_notifications_switch\">Apklusināt paziņojumus</string>\n    <string name=\"action_reblog\">Pastiprināt</string>\n    <string name=\"title_edits\">Labojumi</string>\n    <string name=\"action_unreblog\">Noņemt pastiprinājumu</string>\n    <string name=\"notification_update_name\">Ierakstu labojumi</string>\n    <string name=\"send_media_to\">Dalīties ar failu…</string>\n    <string name=\"description_account_locked\">Privāts konts</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm</string>\n    <string name=\"lock_account_label\">Padarīt kontu privātu</string>\n    <string name=\"review_notifications\">Pārskatīt paziņojumus</string>\n    <string name=\"account_date_joined\">Pievienojās %1$s</string>\n    <string name=\"action_discard\">Atmest izmaiņas</string>\n    <string name=\"action_continue_edit\">Turpināt labošanu</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Paziņot ar vibrāciju</string>\n    <string name=\"pref_title_notification_alert_light\">Paziņot ar gaismu</string>\n    <string name=\"dialog_unfollow_warning\">Vai pārtraukt sekot šim kontam?</string>\n    <string name=\"pref_title_appearance_settings\">Izskats</string>\n    <string name=\"pref_title_timelines\">Laika līnijas</string>\n    <string name=\"app_them_dark\">Tumša</string>\n    <string name=\"app_theme_light\">Gaiša</string>\n    <string name=\"pref_title_app_theme\">Lietotnes tēma</string>\n    <string name=\"pref_main_nav_position_option_top\">Augšā</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Apakšā</string>\n    <string name=\"pref_title_show_boosts\">Parādīt pastiprinājumus</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"status_created_at_now\">tikko</string>\n    <string name=\"error_retrieving_oauth_token\">Neizdevās iegūt pieteikšanās pilnvaru. Ja tas atkārtojas, izmantojot izvēlni, mēģiniet pieslēgties pārlūkā.</string>\n    <string name=\"error_media_upload_permission\">Nepieciešama atļauja lasīt multividi.</string>\n    <string name=\"error_media_download_permission\">Nepieciešama atļauja saglabāt multividi.</string>\n    <string name=\"error_following_hashtag_format\">Radās kļūda, sākot sekot #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Radās kļūda, pārtraucot sekot #%1$s</string>\n    <string name=\"error_muting_hashtag_format\">Radās kļūda, apklusinot #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Radās kļūda, atceļot #%1$s apklusināšanu</string>\n    <string name=\"title_direct_messages\">Tiešās ziņas</string>\n    <string name=\"post_media_hidden_title\">Multivide ir paslēpta</string>\n    <string name=\"notification_reblog_format\">%1$s pastiprināja tavu ierakstu</string>\n    <string name=\"notification_follow_request_format\">%1$s lūdza atļauju tev sekot</string>\n    <string name=\"notification_summary_report_format\">%1$s · pievienoti %2$d ieraksti</string>\n    <string name=\"action_compose\">Rakstīt</string>\n    <string name=\"action_logout_confirm\">Vai tiešām vēlies iziet no konta %1$s?</string>\n    <string name=\"action_add_media\">Pievienot multividi</string>\n    <string name=\"action_open_drawer\">Atvērt izvēlni</string>\n    <string name=\"action_open_media_n\">Atvērt multividi #%1$d</string>\n    <string name=\"download_media\">Lejupielādēt multividi</string>\n    <string name=\"downloading_media\">Lejupielādē multividi</string>\n    <string name=\"hint_media_description_missing\">Multividei ir jābūt aprakstam.</string>\n    <string name=\"dialog_title_finishing_media_upload\">Pabeidz multivides augšupielādi</string>\n    <string name=\"pref_default_media_sensitivity\">Vienmēr atzīmēt multividi kā sensitīvu</string>\n    <string name=\"error_no_custom_emojis\">Instancē %1$s nav neviena pielāgota emocijzīmje</string>\n    <string name=\"download_fonts\">Vispirms jālejupielādē šie emocijzīmju komplekti</string>\n    <string name=\"action_compose_shortcut\">Rakstīt</string>\n    <string name=\"caption_blobmoji\">Blob emocijzīmes no Android 4.4–7.1</string>\n    <string name=\"caption_systememoji\">Tavas ierīces noklusējuma emocijzīmju komplekts</string>\n    <string name=\"license_description\">Tusky satur kodu un sastāvdaļas no šādiem atvērtā pirmkoda projektiem:</string>\n    <string name=\"warning_scheduling_interval\">Mastodon minimālais ieplānošanas intervāls ir 5 minūtes.</string>\n    <string name=\"no_scheduled_posts\">Tev nav ieplānotu ziņu.</string>\n    <string name=\"account_note_hint\">Tava privātā piezīme par šo kontu</string>\n    <string name=\"dialog_delete_list_warning\">Vai tiešām vēlies dzēst sarakstu %1$s?</string>\n    <string name=\"follow_requests_info\">Lai arī tavs konts nav privāts, %1$s amatpersonas uzskatīja, ka, iespējams, vēlēsies manuāli pārskatīt sekošanas pieprasījumus no šiem kontiem.</string>\n    <string name=\"instance_rule_info\">Pieslēdzoties tu piekrīti %1$s noteikumiem.</string>\n    <string name=\"compose_active_account_description\">Publicē kā %1$s</string>\n    <string name=\"failed_to_add_to_list\">Neizdevās pievienot kontu sarakstam</string>\n    <string name=\"failed_to_remove_from_list\">Neizdevās noņemt kontu no saraksta</string>\n    <string name=\"license_apache_2\">Licencēts saskaņā ar Apache licenci (kopija zemāk)</string>\n    <string name=\"compose_shortcut_long_label\">Rakstīt ziņu</string>\n    <string name=\"compose_shortcut_short_label\">Rakstīt</string>\n    <string name=\"poll_ended_voted\">Aptauja, kurā tu balsoji, ir noslēgusies</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s un %4$d citi</string>\n    <string name=\"title_media\">Multivide</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Vienmēr rādīt sensitīvu saturu</string>\n    <string name=\"compose_unsaved_changes\">Tev ir nesaglabātas izmaiņas.</string>\n    <string name=\"description_post_media\">Multivide: %1$s</string>\n    <string name=\"description_poll\">Aptauja ar izvēlēm: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"poll_info_format\"> <!-- 15 balsis • atlikusi 1 stunda --> %1$s • %2$s</string>\n    <string name=\"notification_clear_text\">Vai tiešām vēlies neatgriezeniski notīrīt visus paziņojumus?</string>\n    <string name=\"poll_ended_created\">Tevis izveidotā aptauja ir noslēgusies</string>\n    <string name=\"compose_preview_image_description\">Darības ar attēlu %1$s</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Rakstīt ziņu</string>\n    <string name=\"about_bug_feature_request_site\">\"Kļūdu ziņojumi un jaunas funkcionalitātes pieprasījumi:\n\\n\n\\n  https://github.com/tuskyapp/Tusky/issues\"</string>\n    <string name=\"action_mention\">Pieminēt</string>\n    <string name=\"pref_title_gradient_for_media\">Rādīt krāsainus gradientus paslēptajai multividei</string>\n    <string name=\"pref_title_show_media_preview\">Lejupielādēt multivides priekšskatījumus</string>\n    <string name=\"action_unmute\">Atcelt apklusināšanu</string>\n    <string name=\"action_unmute_desc\">Atcelt %1$s apklusināšanu</string>\n    <string name=\"send_post_link_to\">Dalīties ar ieraksta URL…</string>\n    <string name=\"confirmation_unmuted\">Lietotāja apklusināšana atcelta</string>\n    <string name=\"pref_title_custom_tabs\">Izmantot Chrome pielāgotās cilnes</string>\n    <string name=\"action_unmute_domain\">Atcelt %1$s apklusināšanu</string>\n    <string name=\"action_unmute_conversation\">Atcelt sarunas apklusināšanu</string>\n    <string name=\"pref_main_nav_position\">Galvenās navigācijas atrašanās vieta</string>\n    <string name=\"post_privacy_public\">Publisks</string>\n    <string name=\"action_share_account_link\">Dalīties ar saiti uz kontu</string>\n    <string name=\"action_share_account_username\">Dalīties ar konta lietotājvārdu</string>\n    <string name=\"send_account_link_to\">Dalīties ar konta URL…</string>\n    <string name=\"send_account_username_to\">Dalīties ar konta lietotājvārdu…</string>\n    <string name=\"account_username_copied\">Lietotājvārds nokopēts</string>\n    <string name=\"pref_title_notification_alert_sound\">Paziņot ar skaņu</string>\n    <string name=\"label_header\">Galvene</string>\n    <string name=\"pref_title_bot_overlay\">Rādīt botu indikatoru</string>\n    <string name=\"pref_default_post_privacy\">Noklusējuma ierakstu privātums</string>\n    <string name=\"pref_default_post_language\">Noklusējuma ierakstu valoda</string>\n    <string name=\"pref_failed_to_sync\">Neizdevās sinhronizēt iestatījumus</string>\n    <string name=\"pref_post_text_size\">Ierakstu teksta izmērs</string>\n    <string name=\"notification_mention_descriptions\">Paziņojumi par jauniem pieminējumiem</string>\n    <string name=\"notification_follow_request_description\">Paziņojumi par sekošanas pieprasījumiem</string>\n    <string name=\"notification_boost_description\">Paziņojumi par tavu ierakstu pastiprināšanu</string>\n    <string name=\"no_drafts\">Tev nav neviena melnraksta.</string>\n    <string name=\"no_announcements\">Nav paziņojumu.</string>\n    <string name=\"no_lists\">Tev nav neviena saraksta.</string>\n    <string name=\"pref_title_show_self_username\">Rādīt lietotājvārdu rīkjoslās</string>\n    <string name=\"pref_title_confirm_reblogs\">Pirms pastiprināšanas rādīt apstiprināšanas dialogu</string>\n    <string name=\"failed_search\">Meklēšana neizdevās</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Iespējot vilkšanas žestu, lai pārslēgtos starp cilnēm</string>\n    <string name=\"pref_title_hide_top_toolbar\">Paslēpt augšējās rīkjoslas virsrakstu</string>\n    <string name=\"report_remote_instance\">Pārsūtīt uz %1$s</string>\n    <string name=\"failed_report\">Ziņošana neizdevās</string>\n    <string name=\"notification_follow_description\">Paziņojumi par jauniem sekotājiem</string>\n    <string name=\"notification_poll_description\">Paziņojumi par pabeigtajām aptaujām</string>\n    <string name=\"notification_subscription_description\">Paziņojumi par jauniem ierakstiem no kāda, kura ierakstus esi abonējis</string>\n    <string name=\"notification_sign_up_description\">Paziņojumi par jauniem lietotājiem</string>\n    <string name=\"limit_notifications\">Ierobežot laika līnijas paziņojumus</string>\n    <string name=\"wellbeing_hide_stats_profile\">Slēpt profilu kvantitatīvo statistiku</string>\n    <string name=\"wellbeing_hide_stats_posts\">Slēpt ierakstu kvantitatīvo statistiku</string>\n    <string name=\"drafts_failed_loading_reply\">Neizdevās ielādēt atbildes informāciju</string>\n    <string name=\"action_delete_and_redraft\">Dzēst un sākt no jauna</string>\n    <string name=\"action_dismiss\">Aizvākt</string>\n    <string name=\"dialog_message_cancel_follow_request\">Vai atcelt sekošanas pieprasījumu?</string>\n    <string name=\"dialog_redraft_post_warning\">Vai dzēst šo ierakstu un sākt no jauna?</string>\n    <string name=\"about_powered_by_tusky\">Darbību nodrošina Tusky</string>\n    <string name=\"hint_search_people_list\">Meklēt personas, kurām seko</string>\n    <string name=\"send_post_notification_error_title\">Sūtot ziņu, radās kļūda</string>\n    <string name=\"account_moved_description\">%1$s ir pārcēlies uz:</string>\n    <string name=\"failed_to_pin\">Piespraušana neizdevās</string>\n    <string name=\"failed_to_unpin\">Atspraušana neizdevās</string>\n    <string name=\"post_share_content\">Dalīties ar ieraksta saturu</string>\n    <string name=\"set_focus_description\">Pieskaries vai velc apli, lai izvēlētos fokusa punktu, kas vienmēr būs redzams sīktēlos.</string>\n    <string name=\"expand_collapse_all_posts\">Izplest/sakļaut visus ierakstus</string>\n    <string name=\"caption_twemoji\">Mastodon standarta emocijzīmju komplekts</string>\n    <string name=\"caption_notoemoji\">Google aktuālais emocijzīmju komplekts</string>\n    <string name=\"notification_report_description\">Paziņojumi par moderēšanas ziņojumiem</string>\n    <string name=\"notification_mention_format\">%1$s pieminēja tevi</string>\n    <string name=\"notification_summary_small\">%1$s un %2$s</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s un %3$s</string>\n    <string name=\"post_share_link\">Dalīties ar saiti uz ierakstu</string>\n    <string name=\"pref_title_absolute_time\">Izmantot absolūto laiku</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s un %2$s</string>\n    <string name=\"description_post_cw\">Satura brīdinājums: %1$s</string>\n    <string name=\"about_project_site\">Projekta vietne: https://tusky.app</string>\n    <string name=\"a11y_label_loading_thread\">Ielādē pavedienu</string>\n    <string name=\"confirmation_hashtag_unfollowed\">pārtraukta sekošana #%1$s</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s atcelta slēpšana</string>\n    <string name=\"error_create_list\">Nevarēja izveidot sarakstu</string>\n    <string name=\"pref_title_reading_order\">Lasīšanas secība</string>\n    <string name=\"filter_add_description\">Filtrējamā frāze</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Atspējots</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;nav iestatīts&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;nederīgs&gt;</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"add_account_description\">Pievienot jaunu Mastodon kontu</string>\n    <string name=\"pref_title_animate_custom_emojis\">Animēt pielāgotās emocijzīmes</string>\n    <string name=\"notification_sign_up_name\">Jaunu dalībnieku reģistrācija</string>\n    <string name=\"pref_show_self_username_disambiguate\">Kad pievienoti vairāki konti</string>\n    <string name=\"restart_required\">Nepieciešama lietotnes restartēšana</string>\n    <string name=\"reblog_private\">Pastiprināt sākotnējai auditorijai</string>\n    <string name=\"description_post_reblogged\">Pastiprināts</string>\n    <string name=\"replying_to\">Atbildot @%1$s</string>\n    <string name=\"lock_account_label_description\">Prasa manuāli apstiprināt sekotājus</string>\n    <string name=\"title_reblogged_by\">Pastiprināja</string>\n    <plurals name=\"reblogs\">\n        <item quantity=\"zero\"><b>%1$s</b> pastiprinājumi</item>\n        <item quantity=\"one\"><b>%1$s</b> pastiprinājums</item>\n        <item quantity=\"other\"><b>%1$s</b> pastiprinājumi</item>\n    </plurals>\n    <string name=\"title_favourites\">Izlases</string>\n    <string name=\"notification_favourite_format\">%1$s pievienoja tavu ierakstu izlasei</string>\n    <string name=\"action_favourite\">Pievienot izlasei</string>\n    <string name=\"action_unfavourite\">Noņemt no izlases</string>\n    <string name=\"action_send\">PUBLICĒT</string>\n    <string name=\"action_send_public\">PUBLICĒT!</string>\n    <string name=\"action_open_faved_by\">Rādīt izlases</string>\n    <string name=\"pref_publishing\">Publicē (sinhronizēts ar serveri)</string>\n    <string name=\"notification_favourite_name\">Izlases</string>\n    <string name=\"report_category_spam\">Mēstule</string>\n    <string name=\"action_set_focus\">Iestatīt fokusa punktu</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"zero\">%1$s balsis</item>\n        <item quantity=\"one\">%1$s balss</item>\n        <item quantity=\"other\">%1$s balsis</item>\n    </plurals>\n    <string name=\"pref_reading_order_oldest_first\">Vecākos vispirms</string>\n    <string name=\"pref_reading_order_newest_first\">Jaunākos vispirms</string>\n    <string name=\"status_created_info\">%1$s izveidoja</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"zero\">%1$s personas</item>\n        <item quantity=\"one\">%1$s persona</item>\n        <item quantity=\"other\">%1$s personas</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"zero\">atlikušas %1$d stundas</item>\n        <item quantity=\"one\">atlikusi %1$d stunda</item>\n        <item quantity=\"other\">atlikušas %1$d stundas</item>\n    </plurals>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"zero\">atlikušas %1$d dienas</item>\n        <item quantity=\"one\">atlikusi %1$d diena</item>\n        <item quantity=\"other\">atlikušas %1$d dienas</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"zero\">atlikušas %1$d minūtes</item>\n        <item quantity=\"one\">atlikusi %1$d minūte</item>\n        <item quantity=\"other\">atlikušas %1$d minūtes</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"zero\">atlikušas %1$d sekundes</item>\n        <item quantity=\"one\">atlikusi %1$d sekunde</item>\n        <item quantity=\"other\">atlikušas %1$d sekundes</item>\n    </plurals>\n    <string name=\"action_post_failed\">Augšupielāde neizdevās</string>\n    <string name=\"action_post_failed_show_drafts\">Rādīt melnrakstus</string>\n    <string name=\"action_post_failed_do_nothing\">Aizvākt</string>\n    <string name=\"pick_hashtag_hint\">Tēmturis bez #</string>\n    <string name=\"status_edit_info\">%1$s laboja</string>\n    <string name=\"action_browser_login\">Pieslēgties ar pārlūku</string>\n    <string name=\"description_login\">Strādā vairumā gadījumu. Dati netiek nopludināti uz citām lietotnēm.</string>\n    <string name=\"poll_info_time_absolute\">beidzas %1$s</string>\n    <string name=\"pref_title_confirm_favourites\">Pirms pievienošanas izlasei rādīt apstiprināšanas dialogu</string>\n    <string name=\"action_view_favourites\">Izlases</string>\n    <string name=\"abbreviated_in_days\">pēc %1$dd</string>\n    <string name=\"abbreviated_in_hours\">pēc %1$dh</string>\n    <string name=\"abbreviated_in_minutes\">pēc %1$dm</string>\n    <string name=\"abbreviated_in_years\">pēc %1$dg</string>\n    <string name=\"abbreviated_in_seconds\">pēc %1$ds</string>\n    <string name=\"pref_title_alway_open_spoiler\">Vienmēr izvērst ziņas, kas atzīmētas ar satura brīdinājumu</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"zero\"/>\n        <item quantity=\"one\">Neizdevās augšupielādēt tavu ierakstu un tas tika saglabāts melnrakstos.\n\\n\n\\nVai nu neizdevās sazināties ar serveri, vai arī tas noraidīja ierakstu.</item>\n        <item quantity=\"other\">Neizdevās augšupielādēt tavus ierakstus un tie tika saglabāti melnrakstos.\n\\n\n\\nVai nu neizdevās sazināties ar serveri, vai arī tas noraidīja ierakstus.</item>\n    </plurals>\n    <string name=\"notification_favourite_description\">Paziņojumi par tavu ierakstu pievienošanu izlasei</string>\n    <string name=\"wellbeing_mode_notice\">Daļa informācijas, kas varētu ietekmēt tavu garīgo labsajūtu, tiks slēpta. Tas ietver:\n\\n\n\\n - Pievienošanas izlasei/pastiprināšanas/jaunu sekotāju paziņojumus\n\\n - Izlasēm pievienoto/pastiprinājumu skaitu ierakstiem\n\\n - Sekotāju/ierakstu skaitu profilos\n\\n\n\\n Pašpiegādātie paziņojumi netiks ietekmēti, bet paziņojumu preferences var pārskatīt manuāli.</string>\n    <string name=\"description_browser_login\">Var atbalstīt papildu autentifikācijas metodes, bet ir nepieciešama atbalstīta pārlūkprogramma.</string>\n    <string name=\"dialog_whats_an_instance\">Šeit var ievadīt jebkuras instances adresi vai domēnu, piemēram, mastodon.social, icosahedron.website, social.tchncs.de un <a href=\"https://instances.social\">citus!</a> \\u0020\n\\n \\u0020\n\\nJa tev vēl nav konta, vari ievadīt tās instances nosaukumu, kurai vēlies pievienoties un izveidot kontu. \\u0020\n\\n \\u0020\n\\nInstance ir vieta, kur tiek mitināts tavs konts, taču tu vari viegli sazināties ar cilvēkiem citās instancēs un sekot tiem, it kā atrastos tajā pašā vietnē. \\u0020\n\\n \\u0020\n\\nVairāk informācijas var atrast <a href=\"https://joinmastodon.org\">joinmastodon.org</a>. </string>\n    <string name=\"failed_fetch_posts\">Neizdevās iegūt ierakstus</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d cilvēki runā par tēmturi %2$s</string>\n    <string name=\"total_usage\">Kopējais lietojums</string>\n    <string name=\"total_accounts\">Konti kopā</string>\n    <string name=\"dialog_follow_hashtag_title\">Sekot tēmturim</string>\n    <string name=\"action_refresh\">Atsvaizdināt</string>\n    <string name=\"ui_error_unknown\">nezināms iemesls</string>\n    <string name=\"title_public_trending_hashtags\">Tendenču tēmturi</string>\n    <string name=\"action_add\">Pievienot</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"label_filter_context\">Filtra konteksts</string>\n    <string name=\"label_filter_action\">Filtra darbība</string>\n    <string name=\"hint_filter_title\">Mans filtrs</string>\n    <string name=\"label_filter_title\">Nosaukums</string>\n    <string name=\"ui_success_accepted_follow_request\">Sekošanas pieprasījums pieņemts</string>\n    <string name=\"ui_success_rejected_follow_request\">Sekošanas pieprasījums bloķēts</string>\n    <string name=\"post_privacy_followers_only\">Tikai sekotājiem</string>\n    <string name=\"post_media_image\">Attēls</string>\n    <string name=\"filter_description_hide\">Paslēpt pilnībā</string>\n    <string name=\"select_list_manage\">Pārvaldīt sarakstus</string>\n    <string name=\"filter_keyword_display_format\">%1$s (viss vārds)</string>\n    <string name=\"pref_title_account_filter_keywords\">Profili</string>\n    <string name=\"filter_action_warn\">Brīdināt</string>\n    <string name=\"filter_action_hide\">Paslēpt</string>\n    <string name=\"filter_description_warn\">Paslēpt ar brīdinājumu</string>\n    <string name=\"filter_edit_keyword_title\">Labot atslēgvārdu</string>\n    <string name=\"filter_keyword_addition_title\">Pievienot atslēgvārdu</string>\n    <string name=\"dialog_delete_filter_positive_action\">Dzēst</string>\n    <string name=\"list_reply_policy_label\">Rāda atbildes uz</string>\n    <string name=\"error_media_upload_sending_fmt\">Augšupielāde neizdevās: %1$s</string>\n    <string name=\"notification_unknown_name\">Nezināms</string>\n    <string name=\"about_device_info_title\">Tava ierīce</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nAndroid versija: %3$s\n\\nSDK versija: %4$d</string>\n    <string name=\"about_account_info_title\">Tavs konts</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nVersija: %3$s</string>\n    <string name=\"compose_delete_draft\">Dzēst melnrakstu?</string>\n    <string name=\"label_translating\">Tulko…</string>\n    <string name=\"action_show_original\">Rādīt oriģinālu</string>\n    <string name=\"reply_sending\">Sūta…</string>\n    <string name=\"reply_sending_long\">Tava atbilde tiek sūtīta.</string>\n    <string name=\"label_image\">Attēls</string>\n    <string name=\"dialog_delete_filter_text\">Dzēst filtru \\'%1$s\\'?</string>\n    <string name=\"action_translate\">Tulkot</string>\n    <string name=\"dialog_follow_warning\">Sekot šim kontam?</string>\n    <string name=\"ui_error_translate\">Nevarēja iztulkot: %1$s</string>\n    <string name=\"action_view_filter\">Skatīt filtru</string>\n    <string name=\"label_translated\">Tulkots no %1$s, izmantojot %2$s</string>\n    <string name=\"url_copied\">Url nokopēts</string>\n    <string name=\"confirmation_hashtag_copied\">\\'#%1$s\\' nokopēts</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-ml/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"action_login\">മസ്റ്റഡോൺ വഴി പ്രവേശിക്കുക</string>\n    <string name=\"link_whats_an_instance\">എന്താണ് ഒരു ഇൻസ്റ്റൻസ്?</string>\n    <string name=\"title_favourites\">പ്രിയപ്പെട്ടവ</string>\n    <string name=\"title_drafts\">കരടുകൾ</string>\n    <string name=\"action_logout\">പുറത്തിറങ്ങുക</string>\n    <string name=\"action_view_preferences\">മുൻഗണനകൾ</string>\n    <string name=\"action_view_account_preferences\">അക്കൗണ്ട് മുൻഗണനകൾ</string>\n    <string name=\"action_edit_profile\">പ്രൊഫൈൽ തിരുത്തുക</string>\n    <string name=\"action_search\">തിരയുക</string>\n    <string name=\"about_title_activity\">വിവരം</string>\n    <string name=\"action_lists\">പട്ടികകൾ</string>\n    <string name=\"title_lists\">പട്ടികകൾ</string>\n    <string name=\"error_generic\">ഒരു പിഴവ് സംഭവിച്ചിരിക്കുന്നു.</string>\n    <string name=\"error_network\">ഒരു നെറ്റ്‌വർക്ക് പിഴവ് സംഭവിച്ചിരിക്കുന്നു! ദയവായി താങ്കളുടെ കണക്ഷൻ പരിശോധിച്ചിട്ട് വീണ്ടും ശ്രമിക്കൂ!</string>\n    <string name=\"error_empty\">ഇത് ശൂന്യമാവാൻ പാടില്ല.</string>\n    <string name=\"error_invalid_domain\">അസാധുവായ ഡൊമൈൻ നൽകിയിരിക്കുന്നു</string>\n    <string name=\"error_failed_app_registration\">ആ ഇൻസ്റ്റൻസുമായി ആധികാരികത ഉറപ്പുവരുത്തുന്നതിൽ പരാജയപ്പെട്ടിരിക്കുന്നു.</string>\n    <string name=\"error_no_web_browser_found\">ഉപയോഗിക്കാനായി ഒരു വെബ് ബ്രൗസർ കണ്ടെത്താനായില്ല.</string>\n    <string name=\"error_authorization_unknown\">അജ്ഞാതമായ ഒരു ആധികാരികതാപിഴവ് സംഭവിച്ചിരിക്കുന്നു.</string>\n    <string name=\"error_authorization_denied\">ആധികാരികത ഉറപ്പുവരുത്താനായില്ല.</string>\n    <string name=\"error_retrieving_oauth_token\">ഒരു പ്രവേശന ടോക്കൺ ലഭ്യമാക്കുന്നതിൽ പരാജയപ്പെട്ടു.</string>\n    <string name=\"error_compose_character_limit\">ഈ സ്റ്റാറ്റസ് വളരെ നീളമേറിയതാണ്!</string>\n    <string name=\"error_media_upload_type\">ഇത്തരം ഫയൽ അപ്‌ലോഡ് ചെയ്യാൻ സാധിക്കില്ല.</string>\n    <string name=\"error_media_upload_opening\">ഈ ഫയൽ തുറക്കാനായില്ല.</string>\n    <string name=\"error_media_upload_permission\">മീഡിയ വായിക്കുവാനുള്ള അനുമതി ആവശ്യമാണ്.</string>\n    <string name=\"error_media_download_permission\">മീഡിയ സംഭരിക്കുവാനുള്ള അനുമതി ആവശ്യമാണ്.</string>\n    <string name=\"error_media_upload_image_or_video\">ചിത്രങ്ങളും ചലച്ചിത്രങ്ങളും ഒരുമിച്ച് ഒരു സ്റ്റാറ്റസിലേക്ക് ചേർക്കാനാവില്ല.</string>\n    <string name=\"error_media_upload_sending\">അപ്‌ലോഡ് പരാജയപ്പെട്ടു.</string>\n    <string name=\"error_sender_account_gone\">ടൂട്ട് അയയ്ക്കുന്നതിൽ പിഴവ്.</string>\n    <string name=\"title_home\">പൂമുഖം</string>\n    <string name=\"title_notifications\">അറിയിപ്പുകൾ</string>\n    <string name=\"title_public_local\">ലോക്കൽ</string>\n    <string name=\"title_public_federated\">ഫെഡറേറ്റഡ്</string>\n    <string name=\"title_direct_messages\">നേരേയുള്ള സന്ദേശങ്ങൾ</string>\n    <string name=\"title_tab_preferences\">ടാബുകൾ</string>\n    <string name=\"title_view_thread\">ടൂട്ട്</string>\n    <string name=\"title_posts\">പോസ്റ്റുകൾ</string>\n    <string name=\"title_posts_with_replies\">മറുപടികളോടൊപ്പം</string>\n    <string name=\"title_posts_pinned\">പിൻ ചെയ്തത്</string>\n    <string name=\"title_follows\">പിന്തുടരലുകൾ</string>\n    <string name=\"title_followers\">പിന്തുടരുന്നവർ</string>\n    <string name=\"title_mutes\">നിശ്ശബ്ദരാക്കിയ ഉപയോക്താക്കൾ</string>\n    <string name=\"title_blocks\">നിരോധിച്ച ഉപയോഗതാക്കൾ</string>\n    <string name=\"title_follow_requests\">പിന്തുടാനുള്ള അപേക്ഷകൾ</string>\n    <string name=\"title_edit_profile\">പ്രൊഫൈൽ തിരുത്തുക</string>\n    <string name=\"action_reply\">മറുപടി</string>\n    <string name=\"action_reblog\">ബൂസ്റ്റ്</string>\n    <string name=\"action_unreblog\">ബൂസ്റ്റ് പിൻവലിക്കുക</string>\n    <string name=\"action_favourite\">ഇഷ്ടപ്പെട്ടവ</string>\n    <string name=\"action_unfavourite\">ഇഷ്ടപ്പെട്ടവയിൽ നിന്നും കളയുക</string>\n    <string name=\"action_more\">കൂടുതൽ</string>\n    <string name=\"action_follow\">പിന്തുടരുക</string>\n    <string name=\"action_unfollow\">പിന്‍തുടരുന്നത് അവസാനിപ്പിക്കുക</string>\n    <string name=\"action_retry\">വീണ്ടും ശ്രമിക്കുക</string>\n    <string name=\"action_view_follow_requests\">പിന്‍തുടരുവാനുള്ള അഭ്യര്‍ത്ഥനകള്‍</string>\n    <string name=\"title_domain_mutes\">മറച്ചുവെച്ച ഡൊമൈനുകൾ</string>\n    <string name=\"description_visibility_private\">പിന്തുടരുന്നവർ</string>\n    <string name=\"footer_empty\">പുതിയത് ലഭിക്കാൻ താഴേക്ക് വലിക്കുക</string>\n    <string name=\"message_empty\">ലഭ്യമല്ല</string>\n    <string name=\"post_content_show_less\">ചുരുക്കുക</string>\n    <string name=\"post_content_show_more\">വിപുലപ്പെടുത്തുക</string>\n    <string name=\"post_content_warning_show_less\">അൽപ്പം കാണിക്കൂ</string>\n    <string name=\"post_content_warning_show_more\">കൂടുതൽ കാണിക്കൂ</string>\n    <string name=\"post_sensitive_media_directions\">തുറന്ന് കാണുവാൻ</string>\n    <string name=\"post_media_hidden_title\">മറയ്ക്കപ്പെട്ട മീഡിയ</string>\n    <string name=\"post_sensitive_media_title\">സെൻസിറ്റീവ് ഉള്ളടക്കം</string>\n    <string name=\"title_licenses\">അനുവാദം</string>\n    <string name=\"title_scheduled_posts\">മുന്‍നിശ്ചയിച്ച ടൂറ്റ്‌സ്</string>\n    <string name=\"title_bookmarks\">ബുക് മാർക്ക്</string>\n    <string name=\"action_reset_schedule\">പുനഃക്രമീകരിക്കുക</string>\n    <string name=\"action_open_in_web\">ബ്രൗസറിൽ തുറക്കുക</string>\n    <string name=\"action_view_media\">മാധ്യമം</string>\n    <string name=\"action_view_domain_mutes\">മറയ്ക്കപ്പെട്ട ഡൊമൈനുകൾ</string>\n    <string name=\"action_view_blocks\">നിരോധിച്ച ഉപയോഗതാക്കൾ</string>\n    <string name=\"action_view_mutes\">നിശ്ശബ്ദമാക്കിയ ഉപയോഗതാക്കൾ</string>\n    <string name=\"action_view_bookmarks\">ബൂക്കമാർക്ക്</string>\n    <string name=\"action_view_favourites\">ഇഷ്ടപ്പെട്ടത്</string>\n    <string name=\"action_view_profile\">പ്രൊഫൈൽ</string>\n    <string name=\"action_close\">നിർത്തുക</string>\n    <string name=\"action_send_public\">ടൂട്ട്!</string>\n    <string name=\"action_send\">ടൂട്ട്</string>\n    <string name=\"action_delete_and_redraft\">നീക്കം ചെയ്യത് പുതിയത് എഴുതുക</string>\n    <string name=\"action_delete\">നീക്കം ചെയ്യുക</string>\n    <string name=\"action_edit\">തിരുത്ത്</string>\n    <string name=\"action_report\">അറിയിക്കുക</string>\n    <string name=\"action_show_reblogs\">ബൂട്ട്‌സ് കാണിക്കുക</string>\n    <string name=\"action_hide_reblogs\">ബൂട്ട്‌സ് മറയ്‌ക്കുക</string>\n    <string name=\"action_unblock\">നിരോധനം നീക്കുക</string>\n    <string name=\"action_block\">നിരോധിക്കുക</string>\n    <string name=\"action_logout_confirm\">ഈ അക്കൗണ്ടിൽ നിന്നും പുറത്തു പോകാൻ ഉറപ്പിച്ചോ %1$s?</string>\n    <string name=\"action_compose\">എഴുതുക</string>\n    <string name=\"action_quick_reply\">പെട്ടന്നുള്ള മറുപടി</string>\n    <string name=\"report_comment_hint\">കൂടുതൽ പറയാൻ ഉണ്ടോ?</string>\n    <string name=\"report_username_format\">അറിയിക്കുക @%1$s</string>\n    <string name=\"notification_follow_format\">%1$s നിങ്ങളെ പിന്തുടരുന്നു</string>\n    <string name=\"notification_favourite_name\">പ്രിയപ്പെട്ടവ</string>\n    <string name=\"title_media\">മാധ്യമം</string>\n    <string name=\"action_open_reblogged_by\">ബൂട്ട്‌സ് കാണിക്കുക</string>\n    <string name=\"edit_poll\">തിരുത്ത്</string>\n    <string name=\"compose_shortcut_short_label\">എഴുതുക</string>\n    <string name=\"action_compose_shortcut\">എഴുതുക</string>\n    <string name=\"notification_follow_request_name\">പിന്തുടാനുള്ള അപേക്ഷകൾ</string>\n    <string name=\"pref_title_show_boosts\">ബൂട്ട്‌സ് കാണിക്കുക</string>\n    <string name=\"action_access_scheduled_posts\">മുന്‍നിശ്ചയിച്ച ടൂറ്റ്‌സ്</string>\n    <string name=\"action_access_drafts\">കരടുകൾ</string>\n    <string name=\"action_edit_own_profile\">തിരുത്ത്</string>\n    <string name=\"pref_title_edit_notification_settings\">അറിയിപ്പുകൾ</string>\n    <string name=\"pref_title_post_tabs\">ടാബുകൾ</string>\n    <string name=\"pref_title_notifications_enabled\">അറിയിപ്പുകൾ</string>\n    <string name=\"title_announcements\">പ്രഖ്യാപനങ്ങൾ</string>\n    <string name=\"later\">പിന്നീട്</string>\n    <string name=\"account_note_saved\">സംരക്ഷിച്ചു!</string>\n    <string name=\"post_boosted_format\">%1$s ബൂസ്റ്റ് ചെയ്തു</string>\n    <string name=\"search_no_results\">ഫലങ്ങൾ ഒന്നും ഇല്ല</string>\n    <string name=\"confirmation_reported\">അയച്ചൂ!</string>\n    <string name=\"action_share\">പങ്കിടുക</string>\n    <string name=\"pref_title_browser_settings\">ബ്രൗസർ</string>\n    <string name=\"notification_mention_name\">പുതിയ സൂചനകൾ</string>\n    <string name=\"action_links\">ലിങ്കുകൾ</string>\n    <string name=\"unreblog_private\">ബൂസ്റ്റ് ചെയ്യേണ്ട</string>\n    <string name=\"filter_apply\">പ്രയോഗിക്കുക</string>\n    <string name=\"add_account_name\">അക്കൗണ്ട് ചേർക്കുക</string>\n    <string name=\"profile_badge_bot_text\">യന്ത്രം‍</string>\n    <string name=\"pref_title_appearance_settings\">രൂപം</string>\n    <string name=\"follows_you\">നിങ്ങളെ പിന്തുടരുന്നു</string>\n    <string name=\"action_photo_take\">ഫോട്ടോ എടുക്കുക</string>\n    <string name=\"hint_search\">തിരയുക…</string>\n    <string name=\"post_media_images\">ചിത്രങ്ങൾ</string>\n    <string name=\"load_more_placeholder_text\">കൂടുതൽ ലഭ്യമാക്കുക</string>\n    <string name=\"title_mentions_dialog\">സൂചനകൾ</string>\n    <string name=\"hint_note\">ബയോ</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"pref_title_thread_filter_keywords\">സംഭാഷണങ്ങൾ</string>\n    <string name=\"label_quick_reply\">മറുപടി…</string>\n    <string name=\"action_reject\">നിരസിക്കുക</string>\n    <string name=\"app_theme_black\">കറുപ്പ്</string>\n    <string name=\"button_continue\">തുടരുക</string>\n    <string name=\"pref_title_timelines\">സമയരേഖകൾ</string>\n    <string name=\"pref_title_proxy_settings\">പ്രോക്സി</string>\n    <string name=\"pref_title_notification_alerts\">മുന്നറിയിപ്പുകൾ</string>\n    <string name=\"notifications_clear\">മായ്ക്കുക</string>\n    <string name=\"action_remove\">നീക്കം ചെയ്യുക</string>\n    <string name=\"notification_boost_name\">ബൂസ്റ്റുകൾ</string>\n    <string name=\"action_add_media\">മീഡിയ ചേർ‍ക്കുക</string>\n    <string name=\"title_accounts\">അക്കൗണ്ടുകൾ</string>\n    <string name=\"pref_title_show_replies\">മറുപടികൾ കാണിക്കൂ</string>\n    <string name=\"action_save\">സംരക്ഷിക്കുക</string>\n    <string name=\"pref_title_timeline_filters\">ഫിൽടറുകൾ</string>\n    <string name=\"pref_title_language\">ഭാഷ</string>\n    <string name=\"profile_metadata_content_label\">ഉള്ളടക്കം</string>\n    <string name=\"action_mentions\">സൂചനകൾ</string>\n    <string name=\"filter_dialog_update_button\">പുതുക്കുക</string>\n    <string name=\"label_avatar\">അവതാർ</string>\n    <string name=\"title_links_dialog\">ലിങ്കുകൾ</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_media_video\">വിഡിയോ</string>\n    <string name=\"action_mention\">സൂചിപ്പിക്കുക</string>\n    <string name=\"filter_dialog_remove_button\">നീക്കം ചെയ്യുക</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-nb-rNO/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">En feil har oppstått.</string>\n    <string name=\"error_network\">En nettverksfeil har oppstått. Sjekk tilkoblingen og prøv igjen.</string>\n    <string name=\"error_empty\">Denne kan ikke være tom.</string>\n    <string name=\"error_invalid_domain\">Ugyldig domene</string>\n    <string name=\"error_failed_app_registration\">Kunne ikke autentisere med den instansen. Hvis dette fortsetter å skje, prøv å logge inn i nettleseren fra menyen.</string>\n    <string name=\"error_no_web_browser_found\">Fant ingen nettleser som kunne brukes.</string>\n    <string name=\"error_authorization_unknown\">En ukjent autoriseringsfeil oppsto. Hvis dette fortsetter, prøv å logge inn i nettleseren fra menyen.</string>\n    <string name=\"error_authorization_denied\">Autorisasjon ble nektet. Hvis du er sikker på at du oppga riktige data, prøv å logge inn i nettleseren fra menyen.</string>\n    <string name=\"error_retrieving_oauth_token\">Henting av logintoken feilet. Hvis dette fortsetter, prøv å logge inn i nettleseren fra menyen.</string>\n    <string name=\"error_compose_character_limit\">Innlegget er for langt!</string>\n    <string name=\"error_media_upload_type\">Den filtypen kan ikke lastes opp.</string>\n    <string name=\"error_media_upload_opening\">Den filen kunne ikke åpnes.</string>\n    <string name=\"error_media_upload_permission\">Trenger tillatelse til å lese media.</string>\n    <string name=\"error_media_download_permission\">Trenger tillatelse for å lagre media.</string>\n    <string name=\"error_media_upload_image_or_video\">Bilder og videoer kan ikke legges til samme innlegg.</string>\n    <string name=\"error_media_upload_sending\">Opplastingen feilet.</string>\n    <string name=\"error_sender_account_gone\">En feil oppsto under sending av innlegget.</string>\n    <string name=\"title_home\">Hjem</string>\n    <string name=\"title_notifications\">Varsler</string>\n    <string name=\"title_public_local\">Lokal</string>\n    <string name=\"title_public_federated\">Føderert</string>\n    <string name=\"title_direct_messages\">Direktemeldinger</string>\n    <string name=\"title_tab_preferences\">Faner</string>\n    <string name=\"title_view_thread\">Tråd</string>\n    <string name=\"title_posts\">Innlegg</string>\n    <string name=\"title_posts_with_replies\">Med svar</string>\n    <string name=\"title_posts_pinned\">Festet</string>\n    <string name=\"title_follows\">Følger</string>\n    <string name=\"title_followers\">Følgere</string>\n    <string name=\"title_favourites\">Favoritter</string>\n    <string name=\"title_mutes\">Dempede brukere</string>\n    <string name=\"title_blocks\">Blokkerte brukere</string>\n    <string name=\"title_follow_requests\">Følgeforespørsler</string>\n    <string name=\"title_edit_profile\">Endre profilen din</string>\n    <string name=\"title_drafts\">Utkast</string>\n    <string name=\"title_licenses\">Lisenser</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s delte</string>\n    <string name=\"post_sensitive_media_title\">Sensitivt innhold</string>\n    <string name=\"post_media_hidden_title\">Media skjult</string>\n    <string name=\"post_sensitive_media_directions\">Trykk for å vise</string>\n    <string name=\"post_content_warning_show_more\">Vis mer</string>\n    <string name=\"post_content_warning_show_less\">Vis mindre</string>\n    <string name=\"post_content_show_more\">Utvid</string>\n    <string name=\"post_content_show_less\">Skjul</string>\n    <string name=\"message_empty\">Ingenting her.</string>\n    <string name=\"footer_empty\">Ingenting her. Dra ned for å oppdatere!</string>\n    <string name=\"notification_reblog_format\">%1$s delte innlegget ditt</string>\n    <string name=\"notification_favourite_format\">%1$s favoriserte innlegget ditt</string>\n    <string name=\"notification_follow_format\">%1$s følger deg</string>\n    <string name=\"report_username_format\">Rapporter @%1$s</string>\n    <string name=\"report_comment_hint\">Ytterligere kommentarer?</string>\n    <string name=\"action_quick_reply\">Hurtigsvar</string>\n    <string name=\"action_reply\">Svar</string>\n    <string name=\"action_reblog\">Del</string>\n    <string name=\"action_unreblog\">Fjern deling</string>\n    <string name=\"action_favourite\">Legg til i favoritter</string>\n    <string name=\"action_unfavourite\">Fjern favoritt</string>\n    <string name=\"action_more\">Mer</string>\n    <string name=\"action_compose\">Skriv</string>\n    <string name=\"action_login\">Logg inn med Tusky</string>\n    <string name=\"action_logout\">Logg ut</string>\n    <string name=\"action_logout_confirm\">Er du sikker på at du vil logge ut fra kontoen %1$s? Dette vil slette all lokal data for kontoen, som utkast og instillinger.</string>\n    <string name=\"action_follow\">Følg</string>\n    <string name=\"action_unfollow\">Slutt å følge</string>\n    <string name=\"action_block\">Blokkér</string>\n    <string name=\"action_unblock\">Fjern blokkering</string>\n    <string name=\"action_hide_reblogs\">Skjul delinger</string>\n    <string name=\"action_show_reblogs\">Vis delte inlegg</string>\n    <string name=\"action_report\">Rapporter</string>\n    <string name=\"action_delete\">Slett</string>\n    <string name=\"action_send\">TUT</string>\n    <string name=\"action_send_public\">TUT!</string>\n    <string name=\"action_retry\">Prøv igjen</string>\n    <string name=\"action_close\">Steng</string>\n    <string name=\"action_view_profile\">Profil</string>\n    <string name=\"action_view_preferences\">Innstillinger</string>\n    <string name=\"action_view_account_preferences\">Kontoinnstillinger</string>\n    <string name=\"action_view_favourites\">Favoritter</string>\n    <string name=\"action_view_mutes\">Dempede brukere</string>\n    <string name=\"action_view_blocks\">Blokkerte brukere</string>\n    <string name=\"action_view_follow_requests\">Følgeforespørsler</string>\n    <string name=\"action_view_media\">Media</string>\n    <string name=\"action_open_in_web\">Åpne i nettleser</string>\n    <string name=\"action_add_media\">Legg til media</string>\n    <string name=\"action_photo_take\">Ta bilde</string>\n    <string name=\"action_share\">Del</string>\n    <string name=\"action_mute\">Demp</string>\n    <string name=\"action_unmute\">Fjern demping</string>\n    <string name=\"action_mention\">Nevn</string>\n    <string name=\"action_hide_media\">Skjul media</string>\n    <string name=\"action_open_drawer\">Åpne skuff</string>\n    <string name=\"action_save\">Lagre</string>\n    <string name=\"action_edit_profile\">Endre profil</string>\n    <string name=\"action_edit_own_profile\">Endre</string>\n    <string name=\"action_undo\">Angre</string>\n    <string name=\"action_accept\">Aksepter</string>\n    <string name=\"action_reject\">Avvis</string>\n    <string name=\"action_search\">Søk</string>\n    <string name=\"action_access_drafts\">Utkast</string>\n    <string name=\"action_toggle_visibility\">Synlighet på innlegg</string>\n    <string name=\"action_content_warning\">Innholdsadvarsel</string>\n    <string name=\"action_emoji_keyboard\">Emoji-tastatur</string>\n    <string name=\"action_add_tab\">Legg til fane</string>\n    <string name=\"action_links\">Lenker</string>\n    <string name=\"action_mentions\">Nevnelser</string>\n    <string name=\"action_hashtags\">Emneknagger</string>\n    <string name=\"action_open_reblogger\">Åpne deler</string>\n    <string name=\"action_open_reblogged_by\">Vis delinger</string>\n    <string name=\"action_open_faved_by\">Vis favoritter</string>\n    <string name=\"title_hashtags_dialog\">Stikkord</string>\n    <string name=\"title_mentions_dialog\">Nevnelser</string>\n    <string name=\"title_links_dialog\">Lenker</string>\n    <string name=\"action_open_media_n\">Åpne media #%1$d</string>\n    <string name=\"download_image\">Laster ned %1$s</string>\n    <string name=\"action_copy_link\">Kopier lenken</string>\n    <string name=\"action_open_as\">Åpne som %1$s</string>\n    <string name=\"action_share_as\">Del som …</string>\n    <string name=\"download_media\">Last ned media</string>\n    <string name=\"downloading_media\">Laster ned media</string>\n    <string name=\"send_post_link_to\">Del tut-URL til…</string>\n    <string name=\"send_post_content_to\">Del tut til…</string>\n    <string name=\"send_media_to\">Del media til…</string>\n    <string name=\"confirmation_reported\">Sendt!</string>\n    <string name=\"confirmation_unblocked\">Fjernet blokkering av bruker</string>\n    <string name=\"confirmation_unmuted\">Fjernet demping av bruker</string>\n    <string name=\"hint_domain\">Hvilken instanse?</string>\n    <string name=\"hint_compose\">Hva skjer?</string>\n    <string name=\"hint_content_warning\">Innholdsadvarsel</string>\n    <string name=\"hint_display_name\">Visningsnavn</string>\n    <string name=\"hint_note\">Biografi</string>\n    <string name=\"hint_search\">Søk…</string>\n    <string name=\"search_no_results\">Ingen resultater</string>\n    <string name=\"label_quick_reply\">Svar…</string>\n    <string name=\"label_avatar\">Avatar</string>\n    <string name=\"label_header\">Overskrift</string>\n    <string name=\"link_whats_an_instance\">Hva er en instans?</string>\n    <string name=\"login_connection\">Kobler til…</string>\n    <string name=\"dialog_whats_an_instance\">Addressen eller domenet til enhver instans kan legges til her, f. eks. mastodon.social, icosahedron.website, social.tchncs.de og <a href=\"https://instances.social\">mer!</a> \n\\n \n\\nHvis du ikke har en konto kan du oppgi navnet på instansen du vil bli medlem av, og lage en konto der. \n\\n \n\\nEn instans der hvor du har kontoen din, men du kan lett kommunisere med og følge andre personer på andre instanser, som om du var på den samme nettsiden. \n\\n \n\\nDu kan finne mer info på <a href=\"https://joinmastodon.org\">joinmastodon.org</a>. </string>\n    <string name=\"dialog_title_finishing_media_upload\">Opplasting av media er ferdig</string>\n    <string name=\"dialog_message_uploading_media\">Laster opp…</string>\n    <string name=\"dialog_download_image\">Last ned</string>\n    <string name=\"dialog_message_cancel_follow_request\">Trekk tilbake følgeforespørselen?</string>\n    <string name=\"dialog_unfollow_warning\">Slutt å følge denne kontoen?</string>\n    <string name=\"dialog_delete_post_warning\">Slett dette innlegget?</string>\n    <string name=\"visibility_public\">Offentlig: Vis i offentlige tidslinjer</string>\n    <string name=\"visibility_unlisted\">Ikke oppført: Ikke vis i offentlige tidslinjer</string>\n    <string name=\"visibility_private\">Bare følgere: Vis bare til følgere</string>\n    <string name=\"visibility_direct\">Direkte: Vis bare til nevnte brukere</string>\n    <string name=\"pref_title_edit_notification_settings\">Varsler</string>\n    <string name=\"pref_title_notifications_enabled\">Varsler</string>\n    <string name=\"pref_title_notification_alerts\">Varsling</string>\n    <string name=\"pref_title_notification_alert_sound\">Varsle med lyd</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Varsle med vibrasjon</string>\n    <string name=\"pref_title_notification_alert_light\">Varsle med lys</string>\n    <string name=\"pref_title_notification_filters\">Varsle meg når</string>\n    <string name=\"pref_title_appearance_settings\">Utseende</string>\n    <string name=\"pref_title_app_theme\">Apptema</string>\n    <string name=\"pref_title_timelines\">Tidslinjer</string>\n    <string name=\"pref_title_timeline_filters\">Filtere</string>\n    <string name=\"pref_title_browser_settings\">Nettleser</string>\n    <string name=\"pref_title_custom_tabs\">Bruk Chrome-tilpassede faner</string>\n    <string name=\"pref_title_language\">Språk</string>\n    <string name=\"pref_title_post_filter\">Tidslinjefiltrering</string>\n    <string name=\"pref_title_post_tabs\">Faner</string>\n    <string name=\"pref_title_show_boosts\">Vis delinger</string>\n    <string name=\"pref_title_show_replies\">Vis svar</string>\n    <string name=\"pref_title_show_media_preview\">Last ned forhåndsvisning av media</string>\n    <string name=\"pref_title_proxy_settings\">Proxy</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP-proxy</string>\n    <string name=\"pref_title_http_proxy_enable\">Skru på HTTP-proxy</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP-proxyserver</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP-proxyport</string>\n    <string name=\"pref_default_media_sensitivity\">Marker alltid media som sensitivt</string>\n    <string name=\"pref_publishing\">Publiserer (synkronisert med server)</string>\n    <string name=\"pref_failed_to_sync\">Synkronisering av innstillinger feilet</string>\n    <string name=\"pref_post_text_size\">Størrelse på statustekst</string>\n    <string name=\"notification_follow_name\">Nye følgere</string>\n    <string name=\"notification_follow_description\">Varsler om nye følgere</string>\n    <string name=\"notification_boost_name\">Delte innlegg</string>\n    <string name=\"notification_boost_description\">Varsler når innleggene dine blir delt</string>\n    <string name=\"notification_favourite_name\">Favoritter</string>\n    <string name=\"notification_favourite_description\">Varsler når innleggene dine blir favorisert</string>\n    <string name=\"notification_mention_format\">%1$s nevnte deg</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s og %4$d andre</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, og %3$s</string>\n    <string name=\"notification_summary_small\">%1$s og %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d ny interaksjon</item>\n        <item quantity=\"other\">%1$d nye interaksjoner</item>\n    </plurals>\n    <string name=\"description_account_locked\">Låst konto</string>\n    <string name=\"about_title_activity\">Om</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_bug_feature_request_site\">Rapporter feil og ønsker om funksjonalitet her:\n\\n https://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Tuskys Profil</string>\n    <string name=\"post_share_content\">Del inneholdet i innlegget</string>\n    <string name=\"post_share_link\">Del lenke til tuten</string>\n    <string name=\"post_media_images\">Bilder</string>\n    <string name=\"post_media_video\">Video</string>\n    <string name=\"state_follow_requested\">Forespørsel sendt</string>\n    <string name=\"abbreviated_in_days\">om %1$dd</string>\n    <string name=\"abbreviated_in_hours\">om %1$dh</string>\n    <string name=\"abbreviated_in_minutes\">om %1$dm</string>\n    <string name=\"abbreviated_in_seconds\">om %1$ds</string>\n    <string name=\"abbreviated_years_ago\">%1$dy</string>\n    <string name=\"abbreviated_days_ago\">%1$dd</string>\n    <string name=\"abbreviated_hours_ago\">%1$dh</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"follows_you\">Følger deg</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Vis alltid sensitivt innhold</string>\n    <string name=\"title_media\">Media</string>\n    <string name=\"replying_to\">Svarer til @%1$s</string>\n    <string name=\"load_more_placeholder_text\">last mer</string>\n    <string name=\"pref_title_public_filter_keywords\">Offentlige tidslinjer</string>\n    <string name=\"pref_title_thread_filter_keywords\">Samtaler</string>\n    <string name=\"filter_addition_title\">Legg til filter</string>\n    <string name=\"filter_edit_title\">Endre filter</string>\n    <string name=\"filter_dialog_remove_button\">Fjern</string>\n    <string name=\"filter_dialog_update_button\">Oppdater</string>\n    <string name=\"filter_add_description\">Filtrer frase</string>\n    <string name=\"add_account_name\">Legg til konto</string>\n    <string name=\"add_account_description\">Legg til ny Mastodon-konto</string>\n    <string name=\"action_lists\">Lister</string>\n    <string name=\"title_lists\">Lister</string>\n    <string name=\"error_create_list\">Kunne ikke opprette liste</string>\n    <string name=\"error_rename_list\">Kunne ikke gi liste nytt navn</string>\n    <string name=\"error_delete_list\">Kunne ikke slette liste</string>\n    <string name=\"action_create_list\">Opprett en liste</string>\n    <string name=\"action_rename_list\">Gi listen nytt navn</string>\n    <string name=\"action_delete_list\">Fjern listen</string>\n    <string name=\"hint_search_people_list\">Søk etter personer du følger</string>\n    <string name=\"action_add_to_list\">Legg til konto i listen</string>\n    <string name=\"action_remove_from_list\">Fjern konto fra listen</string>\n    <string name=\"pref_default_post_privacy\">Standardinnstilling for innlegg</string>\n    <string name=\"notification_mention_name\">Nye nevnelser</string>\n    <string name=\"notification_mention_descriptions\">Varsler om nye nevnelser</string>\n    <string name=\"about_tusky_license\">Tusky er fri og åpen kildekode. Applikasjonen er lisensiert under GNU General Public License versjon 3. Du kan se lisensen her: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <string name=\"about_project_site\">Hjemmeside:\n\\n https://tusky.app</string>\n    <string name=\"abbreviated_in_years\">om %1$dy</string>\n    <string name=\"compose_active_account_description\">Poster som %1$s</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Beskriv innhold for de med nedsatt synsevne\n\\n(maks %1$d tegn)</item>\n        <item quantity=\"other\">Beskriv innhold for de med nedsatt synsevne\n\\n(maks %1$d tegn)</item>\n    </plurals>\n    <string name=\"action_set_caption\">Sett bildetekst</string>\n    <string name=\"action_remove\">Slett</string>\n    <string name=\"lock_account_label\">Lås konto</string>\n    <string name=\"lock_account_label_description\">Krever at du manuelt godkjenner nye følgere</string>\n    <string name=\"compose_save_draft\">Lagre utkast?</string>\n    <string name=\"send_post_notification_title\">Sender innlegg…</string>\n    <string name=\"send_post_notification_error_title\">Det oppsto en feil under sending av innlegget</string>\n    <string name=\"send_post_notification_channel_name\">Sender innleggene</string>\n    <string name=\"send_post_notification_cancel_title\">Sending avbrutt</string>\n    <string name=\"send_post_notification_saved_content\">En kopi av innlegget er lagret i utkastene dine</string>\n    <string name=\"action_compose_shortcut\">Skriv</string>\n    <string name=\"error_no_custom_emojis\">Instansen %1$s har ingen egendefinerte emojis</string>\n    <string name=\"emoji_style\">Emoji-stil</string>\n    <string name=\"system_default\">Systemstandard</string>\n    <string name=\"download_fonts\">Du må laste ned emoji-samlingene før de kan brukes</string>\n    <string name=\"performing_lookup_title\">Søker…</string>\n    <string name=\"expand_collapse_all_posts\">Utvid/Gjem alle statuser</string>\n    <string name=\"action_open_post\">Åpne tut</string>\n    <string name=\"restart_required\">Omstart av applikasjonen kreves</string>\n    <string name=\"restart_emoji\">Du må starte Tusky på nytt for at endringene blir aktivert</string>\n    <string name=\"later\">Senere</string>\n    <string name=\"restart\">Start på nytt</string>\n    <string name=\"caption_systememoji\">Standard-emojis for din enhet</string>\n    <string name=\"caption_blobmoji\">Blob-emojis kjent fra Android 4.4–7.1</string>\n    <string name=\"caption_twemoji\">Mastadons standard emoji-samling</string>\n    <string name=\"download_failed\">Nedlasting feilet</string>\n    <string name=\"profile_badge_bot_text\">Robot</string>\n    <string name=\"account_moved_description\">%1$s har flyttet til:</string>\n    <string name=\"reblog_private\">Del til opprinnelig publikum</string>\n    <string name=\"unreblog_private\">Fjern deling</string>\n    <string name=\"license_description\">Tusky inneholder programkode og elementer fra følgende åpen kildekode-prosjekter:</string>\n    <string name=\"license_apache_2\">Lisensiert under Apache License (kopi under)</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">Profilmetadata</string>\n    <string name=\"profile_metadata_add\">legg til data</string>\n    <string name=\"profile_metadata_label_label\">Ledetekst</string>\n    <string name=\"profile_metadata_content_label\">Innhold</string>\n    <string name=\"pref_title_absolute_time\">Bruk absolutt tid</string>\n    <string name=\"label_remote_account\">Informasjonen under kan være mangelfull. Trykk for å åpne komplett brukerprofil i nettleseren.</string>\n    <string name=\"unpin_action\">Fjern feste</string>\n    <string name=\"pin_action\">Fest</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> Favoritt</item>\n        <item quantity=\"other\"><b>%1$s</b> Favoritter</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\">Delt <b>%1$s</b> gang</item>\n        <item quantity=\"other\">Delt <b>%1$s</b> ganger</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">Delt av</string>\n    <string name=\"title_favourited_by\">Favorisert av</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s og %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s og %3$d fler</string>\n    <string name=\"description_post_media\">Media: %1$s</string>\n    <string name=\"description_post_cw\">Innholdsadvarsel: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Ingen beskrivelse</string>\n    <string name=\"description_post_reblogged\">Reblogget</string>\n    <string name=\"description_post_favourited\">Favorisert</string>\n    <string name=\"description_visibility_public\">Offentlig</string>\n    <string name=\"description_visibility_unlisted\">Ikke listet</string>\n    <string name=\"description_visibility_private\">Følgere</string>\n    <string name=\"description_visibility_direct\">Direkte</string>\n    <string name=\"hint_list_name\">Listenavn</string>\n    <string name=\"pick_hashtag_hint\">Emneord uten #</string>\n    <string name=\"notifications_clear\">Fjern</string>\n    <string name=\"notifications_apply_filter\">Filter</string>\n    <string name=\"filter_apply\">Bruk</string>\n    <string name=\"compose_shortcut_long_label\">Skriv innlegg</string>\n    <string name=\"compose_shortcut_short_label\">Skriv</string>\n    <string name=\"pref_title_bot_overlay\">Vis robotindikator</string>\n    <string name=\"notification_clear_text\">Er du sikker på at du vil slette alle varsler?</string>\n    <string name=\"action_delete_and_redraft\">Slett og skriv på nytt</string>\n    <string name=\"dialog_redraft_post_warning\">Vil du slette denne tuten og skrive den på nytt?</string>\n    <string name=\"poll_info_format\"> <!-- 15 votes • 1 hour left --> %1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s stemme</item>\n        <item quantity=\"other\">%1$s stemmer</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">avsluttes %1$s</string>\n    <string name=\"poll_info_closed\">stengt</string>\n    <string name=\"poll_vote\">Stem</string>\n    <string name=\"app_them_dark\">Mørk</string>\n    <string name=\"app_theme_light\">Lys</string>\n    <string name=\"app_theme_black\">Svart</string>\n    <string name=\"app_theme_auto\">Automatisk ved solnedgang</string>\n    <string name=\"app_theme_system\">Bruk systeminnstillinger</string>\n    <string name=\"post_privacy_public\">Offentlig</string>\n    <string name=\"post_privacy_unlisted\">Ikke listet</string>\n    <string name=\"post_privacy_followers_only\">Kun følgere</string>\n    <string name=\"post_text_size_smallest\">Minste</string>\n    <string name=\"post_text_size_small\">Liten</string>\n    <string name=\"post_text_size_medium\">Medium</string>\n    <string name=\"post_text_size_large\">Stor</string>\n    <string name=\"post_text_size_largest\">Størst</string>\n    <string name=\"notification_poll_name\">Avstemminger</string>\n    <string name=\"notification_poll_description\">Varsler om avstemminger som er avsluttet</string>\n    <string name=\"poll_ended_voted\">En avstemming du har stemt på er avsluttet</string>\n    <string name=\"poll_ended_created\">En avstemming du opprettet er avsluttet</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d dag igjen</item>\n        <item quantity=\"other\">%1$d dager igjen</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d time igjen</item>\n        <item quantity=\"other\">%1$d timer igjen</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d minutt igjen</item>\n        <item quantity=\"other\">%1$d minutter igjen</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d sekund igjen</item>\n        <item quantity=\"other\">%1$d sekunder igjen</item>\n    </plurals>\n    <string name=\"compose_preview_image_description\">Handlinger for bilde %1$s</string>\n    <string name=\"pref_title_animate_gif_avatars\">Animer GIF-avatarer</string>\n    <string name=\"description_poll\">Avstemming med valg: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"caption_notoemoji\">Googles nåværende emoji-samling</string>\n    <string name=\"button_continue\">Fortsett</string>\n    <string name=\"button_back\">Tilbake</string>\n    <string name=\"button_done\">Ferdig</string>\n    <string name=\"report_sent_success\">\\@%1$s er rapportert</string>\n    <string name=\"hint_additional_info\">Flere kommentarer</string>\n    <string name=\"report_remote_instance\">Videresend til %1$s</string>\n    <string name=\"failed_report\">Klarte ikke å rapportere</string>\n    <string name=\"failed_fetch_posts\">Klarte ikke å hente innlegg</string>\n    <string name=\"report_description_1\">Rapporten vil bli sendt til instansmoderatoren. Under kan du skrive en forklaring på hvorfor du rapporterer denne kontoen:</string>\n    <string name=\"report_description_remote_instance\">Kontoen tilhører en annen instans. Vil du også sende en anonymisert kopi av rapporten dit?</string>\n    <string name=\"title_domain_mutes\">Skjulte domener</string>\n    <string name=\"action_view_domain_mutes\">Skjulte domener</string>\n    <string name=\"action_mute_domain\">Demp %1$s</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s er ikke lenger skjult</string>\n    <string name=\"mute_domain_warning\">Er du sikker på at du vil blokkere alt fra %1$s? Du kommer ikke til å se innhold fra domenet i noen offentlige tidslinjer, eller i varslene dine. Kontoer som følger deg fra dette domenet vil bli fjernet.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Skjul hele domenet</string>\n    <string name=\"filter_dialog_whole_word\">Helt ord</string>\n    <string name=\"filter_dialog_whole_word_description\">Når nøkkelordet eller frasen kun inneholder bokstaver og tall, vil det bare brukes dersom det stemmer overens med hele ordet</string>\n    <string name=\"title_accounts\">Kontoer</string>\n    <string name=\"failed_search\">Klarte ikke å søke</string>\n    <string name=\"pref_title_alway_open_spoiler\">Ekspander alltid innlegg markert med innholdsadvarsel</string>\n    <string name=\"action_add_poll\">Legg til avstemming</string>\n    <string name=\"create_poll_title\">Avstemming</string>\n    <string name=\"duration_5_min\">5 minutter</string>\n    <string name=\"duration_30_min\">30 minutter</string>\n    <string name=\"duration_1_hour\">1 time</string>\n    <string name=\"duration_6_hours\">6 timer</string>\n    <string name=\"duration_1_day\">1 dag</string>\n    <string name=\"duration_3_days\">3 dager</string>\n    <string name=\"duration_7_days\">7 dager</string>\n    <string name=\"add_poll_choice\">Legg til valg</string>\n    <string name=\"poll_allow_multiple_choices\">Flere valg</string>\n    <string name=\"poll_new_choice_hint\">Valg %1$d</string>\n    <string name=\"edit_poll\">Endre</string>\n    <string name=\"title_scheduled_posts\">Planlagte innlegg</string>\n    <string name=\"action_edit\">Rediger</string>\n    <string name=\"action_access_scheduled_posts\">Planlagte innlegg</string>\n    <string name=\"action_schedule_post\">Planlegg innlegg</string>\n    <string name=\"action_reset_schedule\">Tilbakestill</string>\n    <string name=\"post_lookup_error_format\">Det oppsto en feil under henting av %1$s</string>\n    <string name=\"about_powered_by_tusky\">Drevet av Tusky</string>\n    <string name=\"title_bookmarks\">Bokmerker</string>\n    <string name=\"action_bookmark\">Bokmerke</string>\n    <string name=\"action_view_bookmarks\">Bokmerker</string>\n    <string name=\"description_post_bookmarked\">Bokmerke lagt til</string>\n    <string name=\"select_list_title\">Velg liste</string>\n    <string name=\"list\">Liste</string>\n    <string name=\"no_scheduled_posts\">Du har ingen planlagte innlegg.</string>\n    <string name=\"no_drafts\">Du har ikke lagret noen utkast.</string>\n    <string name=\"warning_scheduling_interval\">Mastodon har et minimums planleggingsinterval på 5 minutter.</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Vis forhåndsvisning av linker i tidslinjer</string>\n    <string name=\"pref_title_confirm_reblogs\">Vis bekreftelser før deling</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Skru på sveiping for å bytte mellom faner</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s person</item>\n        <item quantity=\"other\">%1$s personer</item>\n    </plurals>\n    <string name=\"notification_follow_request_description\">Varsler om følgeforespørsler</string>\n    <string name=\"notification_follow_request_name\">Følgeforespørsler</string>\n    <string name=\"dialog_mute_warning\">Dempe @%1$s?</string>\n    <string name=\"dialog_block_warning\">Blokkere @%1$s?</string>\n    <string name=\"action_unmute_conversation\">Fjern demping av samtale</string>\n    <string name=\"action_mute_conversation\">Demp samtale</string>\n    <string name=\"hashtags\">Stikkord</string>\n    <string name=\"add_hashtag_title\">Legg til stikkord</string>\n    <string name=\"notification_follow_request_format\">%1$s ønsker å følge deg</string>\n    <string name=\"pref_title_gradient_for_media\">Vis fargerike gradienter for skjult media</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Bunn</string>\n    <string name=\"pref_main_nav_position_option_top\">Topp</string>\n    <string name=\"pref_main_nav_position\">Plassering av hovednavigasjon</string>\n    <string name=\"action_unmute_domain\">Fjern demping av %1$s</string>\n    <string name=\"dialog_mute_hide_notifications\">Skjul varsler</string>\n    <string name=\"action_unmute_desc\">Fjern demping av %1$s</string>\n    <string name=\"pref_title_hide_top_toolbar\">Skjul tittelen på den øverste verktøylinjen</string>\n    <string name=\"account_note_saved\">Lagret!</string>\n    <string name=\"account_note_hint\">Ditt private notat om denne kontoen</string>\n    <string name=\"no_announcements\">Det er ingen kunngjøringer.</string>\n    <string name=\"title_announcements\">Kunngjøringer</string>\n    <string name=\"wellbeing_hide_stats_profile\">Skjul kvantitativ informasjon på profiler</string>\n    <string name=\"wellbeing_hide_stats_posts\">Skjul kvantitativ statistikk på innleggene</string>\n    <string name=\"limit_notifications\">Begrens tidslinjevarsler</string>\n    <string name=\"review_notifications\">Se over varsler</string>\n    <string name=\"wellbeing_mode_notice\">Informasjon som kan påvirke ditt mentale velvære vil bli skjult. Dette inkluderer:\n\\n\n\\n - Varsler om favorisering, deling og følgere\n\\n - Antall favoriseringer og delinger av innlegg\n\\n - Antall følgere og innlegg på profiler\n\\n\n\\n Push-varsler vil ikke påvirkes, men du kan se over dine varselinnstillinger manuelt.</string>\n    <string name=\"pref_title_wellbeing_mode\">Velvære</string>\n    <string name=\"notification_subscription_description\">Varsler når noen jeg følger publiserer et nytt innlegg</string>\n    <string name=\"notification_subscription_name\">Nye innlegg</string>\n    <string name=\"notification_subscription_format\">%1$s postet akkurat</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Du kan ikke laste opp flere enn %1$d mediavedlegg.</item>\n        <item quantity=\"other\">Du kan ikke laste opp flere enn %1$d mediavedlegg.</item>\n    </plurals>\n    <string name=\"duration_indefinite\">Uendelig</string>\n    <string name=\"label_duration\">Varighet</string>\n    <string name=\"dialog_delete_list_warning\">Er du sikker på at du vil slette listen %1$s?</string>\n    <string name=\"post_media_attachments\">Vedlegg</string>\n    <string name=\"post_media_audio\">Lyd</string>\n    <string name=\"drafts_post_reply_removed\">Innlegget du hadde opprettet et utkast som svar på har blitt fjernet</string>\n    <string name=\"draft_deleted\">Utkast slettet</string>\n    <string name=\"drafts_failed_loading_reply\">Lasting av svarinformasjon feilet</string>\n    <string name=\"drafts_post_failed_to_send\">Sending av innlegg feilet!</string>\n    <string name=\"pref_title_animate_custom_emojis\">Animer egendefinerte emojis</string>\n    <string name=\"action_unsubscribe_account\">Avslutt abonnementet</string>\n    <string name=\"action_subscribe_account\">Abonner</string>\n    <string name=\"follow_requests_info\">Selv om kontoen din ikke er låst, har %1$s administratorer markert disse følgeforespørsler for manuell godkjenning.</string>\n    <string name=\"dialog_delete_conversation_warning\">Slett denne samtalen?</string>\n    <string name=\"action_delete_conversation\">Slett samtale</string>\n    <string name=\"action_unbookmark\">Fjern bokmerke</string>\n    <string name=\"pref_title_confirm_favourites\">Vis bekreftelser når favoritt skal legges til</string>\n    <string name=\"duration_30_days\">30 dager</string>\n    <string name=\"duration_60_days\">60 dager</string>\n    <string name=\"duration_90_days\">90 dager</string>\n    <string name=\"duration_180_days\">180 dager</string>\n    <string name=\"duration_365_days\">365 dager</string>\n    <string name=\"duration_14_days\">14 dager</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Skriv innlegg</string>\n    <string name=\"notification_sign_up_format\">%1$s registrerte seg</string>\n    <string name=\"notification_sign_up_name\">Registreringer</string>\n    <string name=\"notification_sign_up_description\">Varslinger om nye brukere</string>\n    <string name=\"notification_update_format\">%1$s redigerte innlegget sitt</string>\n    <string name=\"notification_update_name\">Redigerte innlegg</string>\n    <string name=\"notification_update_description\">Varslinger når et innlegg du har interagert med er redigert</string>\n    <string name=\"title_login\">Logg inn</string>\n    <string name=\"error_could_not_load_login_page\">Klarte ikke å laste innloggingssiden.</string>\n    <string name=\"action_dismiss\">Avvis</string>\n    <string name=\"action_details\">Detaljer</string>\n    <string name=\"account_date_joined\">Ble med %1$s</string>\n    <string name=\"saving_draft\">Lagrer utkast…</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"action_edit_image\">Rediger bilde</string>\n    <string name=\"error_image_edit_failed\">Bildet kunne ikke redigeres.</string>\n    <string name=\"error_loading_account_details\">Lasting av kontodetaljer feilet</string>\n    <string name=\"error_multimedia_size_limit\">Video- og lydfiler kan ikke være større enn %1$s MB.</string>\n    <string name=\"error_following_hashtag_format\">Det oppsto en feil under følging av #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Kunne ikke slutte å følge #%1$s</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"duration_no_change\">(Ingen endring)</string>\n    <string name=\"description_post_language\">Innleggspråk</string>\n    <string name=\"action_set_focus\">Sett fokuspunkt</string>\n    <string name=\"set_focus_description\">Trykk eller dra sirkelen for å velge fokuspunktet som alltid skal være synlig i miniatyrbilder.</string>\n    <string name=\"pref_show_self_username_always\">Alltid</string>\n    <string name=\"pref_show_self_username_disambiguate\">Når flere konti er logget inn</string>\n    <string name=\"pref_show_self_username_never\">Aldri</string>\n    <string name=\"pref_title_show_self_username\">Vis brukernavn på verktøylinjer</string>\n    <string name=\"delete_scheduled_post_warning\">Slette dette planlagte innlegget?</string>\n    <string name=\"instance_rule_title\">Regler på %1$s</string>\n    <string name=\"instance_rule_info\">Ved å logge inn godtar du reglene på %1$s.</string>\n    <string name=\"compose_save_draft_loses_media\">Lagre utkast? (Vedlegg vil bli lastet opp igjen når du fortsetter å jobbe på utkastet.)</string>\n    <string name=\"failed_to_pin\">Klarte ikke å feste</string>\n    <string name=\"failed_to_unpin\">Klarte ikke å løsne</string>\n    <string name=\"action_add_reaction\">Legg til reaksjon</string>\n    <string name=\"action_add_or_remove_from_list\">Legg til eller fjern fra liste</string>\n    <string name=\"failed_to_add_to_list\">Klarte ikke å legge til kontoen til listen</string>\n    <string name=\"failed_to_remove_from_list\">Klarte ikke å fjerne kontoen fra listen</string>\n    <string name=\"pref_default_post_language\">Standardspråk på innlegg</string>\n    <string name=\"no_lists\">Du har ingen lister.</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"status_created_at_now\">nå</string>\n    <string name=\"post_edited\">Redigert %1$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d innlegg vedlagt</string>\n    <string name=\"notification_report_format\">Ny rapport på %1$s</string>\n    <string name=\"notification_header_report_format\">%1$s rapporterte %2$s</string>\n    <string name=\"notification_report_description\">Varsler om moderasjonsrapporter</string>\n    <string name=\"notification_report_name\">Rapporter</string>\n    <string name=\"description_post_edited\">Redigert</string>\n    <string name=\"error_following_hashtags_unsupported\">Denne instansen støtter ikke følging av emneknagger.</string>\n    <string name=\"title_followed_hashtags\">Fulgte Emneknagger</string>\n    <string name=\"report_category_violation\">Regelbrudd</string>\n    <string name=\"report_category_spam\">Spam</string>\n    <string name=\"report_category_other\">Annet</string>\n    <string name=\"action_unfollow_hashtag_format\">Slutte å følge #%1$s?</string>\n    <string name=\"confirmation_hashtag_unfollowed\">Sluttet å følge #%1$s</string>\n    <string name=\"a11y_label_loading_thread\">Laster tråd</string>\n    <string name=\"help_empty_home\">Dette er <b>Hjemmetidslinjen</b>din. Den viser de nyeste innleggene av kontoer du følger. \n\\n \n\\nFor å utforske kontoer kan du enten oppdage dem i en av tidslinjene dine, for eksempel den lokale tidslinjen for instansen din {{group}}, eller du kan søke etter navnet deres {{search}}; søk for eksempel etter Tusky før å finne Mastodonkonten vår.</string>\n    <string name=\"pref_title_reading_order\">Leserekkefølge</string>\n    <string name=\"pref_reading_order_oldest_first\">Eldste først</string>\n    <string name=\"pref_ui_text_size\">Skriftstørrelse for brukergrensesnitt</string>\n    <string name=\"pref_reading_order_newest_first\">Nyeste først</string>\n    <string name=\"dialog_follow_hashtag_title\">Følg emneknagg</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d folk snakker om emneknaggen %2$s</string>\n    <string name=\"total_usage\">Total bruk</string>\n    <string name=\"total_accounts\">Totale kontoer</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;ikke satt&gt;</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Deaktivert</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;ugyldig&gt;</string>\n    <string name=\"notification_listenable_worker_name\">Bakgrunnsaktivitet</string>\n    <string name=\"notification_listenable_worker_description\">Varsler når Tusky arbeider i bakgrunnen</string>\n    <string name=\"notification_notification_worker\">Henter varsler…</string>\n    <string name=\"notification_prune_cache\">Cache-vedlikehold…</string>\n    <string name=\"mute_notifications_switch\">Demp varsler</string>\n    <string name=\"title_edits\">Endringer</string>\n    <string name=\"status_created_info\">Skapt: %1$s</string>\n    <string name=\"status_edit_info\">Endret: %1$s</string>\n    <string name=\"hint_media_description_missing\">Media bør ha en beskrivelse.</string>\n    <string name=\"action_refresh\">Oppdater</string>\n    <string name=\"post_media_image\">Bilde</string>\n    <string name=\"ui_error_bookmark\">Å bokmerke innlegget misslyktes: %1$s</string>\n    <string name=\"hint_filter_title\">Mitt filter</string>\n    <string name=\"filter_edit_keyword_title\">Endre nøkkelord</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"pref_title_http_proxy_port_message\">Portnummer burde være mellom %1$d og %2$d</string>\n    <string name=\"action_post_failed\">Opplastningen mislyktes</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Opplastingen mislyktes og har blitt lagret som utkast.\n\\n\n\\nEnten kunne ikke tjeneren ikke kontaktes, eller så ble posten avvist.</item>\n        <item quantity=\"other\">Opplastningen av innleggene dine mislyktes og de har blitt lagret som utkast.\n\\n\n\\nEnten kunne ikke tjeneren nås, eller så ble opplastningen avvist.</item>\n    </plurals>\n    <string name=\"action_post_failed_show_drafts\">Vis utkast</string>\n    <string name=\"action_post_failed_do_nothing\">Lukk</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"notification_unknown_name\">Ukjent</string>\n    <string name=\"socket_timeout_exception\">Det tok for lang tid å kontaktere tjeneren din</string>\n    <string name=\"ui_error_clear_notifications\">Sletting av vasler feilet: %1$s</string>\n    <string name=\"ui_error_reject_follow_request\">Avvisning av følgeforespørselen misslyktes: %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">Godtagelse av følgeforespørsel mislykktes: %1$s</string>\n    <string name=\"error_muting_hashtag_format\">Kunne ikke dempe #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Kunne ikke skru av dempingen av #%1$s</string>\n    <string name=\"action_browser_login\">Logg inn med nettleseren</string>\n    <string name=\"description_browser_login\">Kan støtte flere autentiseringsmetoder, men trenger en støttet nettleser.</string>\n    <string name=\"description_login\">Virker som oftest. Ingen informasjon deles med andre apper.</string>\n    <string name=\"ui_success_accepted_follow_request\">Følgeforespørsel akseptert</string>\n    <string name=\"action_discard\">Forkast endringer</string>\n    <string name=\"action_continue_edit\">Fortsett endring</string>\n    <string name=\"compose_unsaved_changes\">Du har ulagrede endringer.</string>\n    <string name=\"select_list_manage\">Forvalte lister</string>\n    <string name=\"ui_error_reblog\">Deling av innlegget feilet: %1$s</string>\n    <string name=\"ui_error_unknown\">ukjent grunn</string>\n    <string name=\"ui_error_favourite\">Favorisering av innlegg feilet: %1$s</string>\n    <string name=\"ui_error_vote\">Stemming mislykkes: %1$s</string>\n    <string name=\"filter_description_hide\">Gjem helt</string>\n    <string name=\"label_filter_action\">Filterhandling</string>\n    <string name=\"filter_action_hide\">Gjem</string>\n    <string name=\"filter_description_warn\">Gjem med et varsel</string>\n    <string name=\"action_share_account_link\">Del link til profil</string>\n    <string name=\"action_share_account_username\">Del brukernavnet til kontoen</string>\n    <string name=\"send_account_link_to\">Del konto-URL med…</string>\n    <string name=\"send_account_username_to\">Del kontoens brukernavn med…</string>\n    <string name=\"account_username_copied\">Brukernavn kopiert</string>\n    <string name=\"error_status_source_load\">Kunne ikke laste status fra tjeneren.</string>\n    <string name=\"status_filtered_show_anyway\">Vis likevel</string>\n    <string name=\"status_filter_placeholder_label_format\">Filtrert: %1$s</string>\n    <string name=\"pref_title_account_filter_keywords\">Profiler</string>\n    <string name=\"action_add\">Legg til</string>\n    <string name=\"filter_keyword_display_format\">%1$s (helt ord)</string>\n    <string name=\"label_filter_context\">Filtrer sammenhenger</string>\n    <string name=\"label_filter_keywords\">Nøkkelord eller fraser som filtreres</string>\n    <string name=\"ui_success_rejected_follow_request\">Følgeforespørsel blokkert</string>\n    <string name=\"label_filter_title\">Tittel</string>\n    <string name=\"filter_action_warn\">Varsle</string>\n    <string name=\"filter_keyword_addition_title\">Legg til nøkkelord</string>\n    <string name=\"title_public_trending_hashtags\">Trendy hashtaggs</string>\n    <string name=\"pref_title_show_stat_inline\">Vis poststatistikk i tidslinjen</string>\n    <string name=\"load_newest_notifications\">Last de nyeste varslene</string>\n    <string name=\"compose_delete_draft\">Del utkast?</string>\n    <string name=\"error_missing_edits\">Serveren din vet at denne posten ble endret, men har ingen kopi av entringene så de kann ikke vises. \n\\n \n\\nDette er <a href=\"https://github.com/mastodon/mastodon/issues/25398\">Mastodon issue #25398</a>.</string>\n    <string name=\"pref_title_show_self_boosts\">Vis selvompostinger</string>\n    <string name=\"error_media_upload_sending_fmt\">Opplasting feilet: %1$s</string>\n    <string name=\"error_blocking_domain\">Kunne ikke dempe %1$s: %2$s</string>\n    <string name=\"error_unblocking_domain\">Kunne ikke skru av dempingen av %1$s: %2$s</string>\n    <string name=\"error_deleting_filter\">Kunne ikke slette filter \\'%1$s\\'</string>\n    <string name=\"error_saving_filter\">Kunne ikke lagre filter \\'%1$s\\'</string>\n    <string name=\"title_public_trending_statuses\">Trendende poster</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-night/theme_colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">@color/tusky_blue_light</color>\n    <color name=\"colorSecondary\">@color/tusky_blue_light</color>\n    <color name=\"colorSurface\">@color/tusky_grey_30</color>\n    <color name=\"colorPrimaryDark\">@color/tusky_grey_25</color>\n\n    <color name=\"colorOnPrimary\">@color/tusky_grey_10</color>\n\n    <color name=\"colorBackground\">@color/tusky_grey_20</color>\n    <color name=\"windowBackground\">@color/tusky_grey_10</color>\n\n    <color name=\"colorSecondaryContainer\">@color/tusky_grey_blue_dark</color>\n\n    <color name=\"textColorPrimary\">@color/white</color>\n    <color name=\"textColorSecondary\">@color/tusky_grey_90</color>\n    <color name=\"textColorTertiary\">@color/tusky_grey_70</color>\n    <color name=\"textColorDisabled\">@color/tusky_grey_40</color>\n\n    <color name=\"iconColor\">@color/tusky_grey_70</color>\n\n    <color name=\"colorBackgroundAccent\">@color/tusky_grey_40</color>\n    <color name=\"colorBackgroundHighlight\">@color/tusky_grey_50</color>\n    <color name=\"dividerColor\">@color/tusky_grey_40</color>\n    <color name=\"dividerColorOther\">@color/tusky_grey_10</color>\n\n    <color name=\"favoriteButtonActiveColor\">@color/tusky_orange</color>\n\n    <color name=\"warning_color\">@color/tusky_red_lighter</color>\n\n    <color name=\"headerBackgroundFilter\">@color/header_background_filter_dark</color>\n\n    <bool name=\"lightNavigationBar\">false</bool>\n\n    <color name=\"botBadgeForeground\">@color/white</color>\n    <color name=\"botBadgeBackground\">@color/tusky_grey_10</color>\n\n    <color name=\"toolbarIconBackgroundColor\">#CC444B5D</color>\n\n    <color name=\"placeholderColor\">@color/tusky_grey_40</color>\n\n    <!-- colors used to show inserted/deleted text -->\n    <color name=\"view_edits_background_insert\">@color/tusky_green_dark</color>\n    <color name=\"view_edits_background_delete\">@color/tusky_red</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-nl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">Er deed zich een fout voor.</string>\n    <string name=\"error_network\">Er deed zich een netwerkfout voor. Controleer je verbinding en probeer opnieuw.</string>\n    <string name=\"error_empty\">Dit mag niet leeg zijn.</string>\n    <string name=\"error_invalid_domain\">Ongeldige domeinnaam ingevoerd</string>\n    <string name=\"error_failed_app_registration\">Authenticatie met die server is mislukt. Als het probleem blijft, probeer dan de browser login via het menu.</string>\n    <string name=\"error_no_web_browser_found\">Kon geen bruikbare webbrowser vinden.</string>\n    <string name=\"error_authorization_unknown\">Er deed zich een onbekende autorisatiefout voor. Als dit blijft gebeuren, kan je proberen om via de browser in te loggen.</string>\n    <string name=\"error_authorization_denied\">Autorisatie werd geweigerd. Als je zeker weet dat je de correcte gegevens hebt ingevoerd, probeer dan in te loggen in de browser via het menu.</string>\n    <string name=\"error_retrieving_oauth_token\">Kon geen inlogsleutel verkrijgen. Als het probleem zich blijft herhalen; probeer dan om in te loggen via de browser.</string>\n    <string name=\"error_compose_character_limit\">Tekst van dit bericht is te lang!</string>\n    <string name=\"error_media_upload_type\">Dit bestandstype kan niet geüpload worden.</string>\n    <string name=\"error_media_upload_opening\">Bestand kon niet worden geopend.</string>\n    <string name=\"error_media_upload_permission\">Er is toestemming nodig om deze media te lezen.</string>\n    <string name=\"error_media_download_permission\">Er is toestemming nodig om media op te slaan.</string>\n    <string name=\"error_media_upload_image_or_video\">Afbeeldingen en video\\'s kunnen niet samen aan hetzelfde bericht worden toegevoegd.</string>\n    <string name=\"error_media_upload_sending\">Uploaden mislukt.</string>\n    <string name=\"error_sender_account_gone\">Fout tijdens verzenden bericht.</string>\n    <string name=\"title_home\">Start</string>\n    <string name=\"title_notifications\">Meldingen</string>\n    <string name=\"title_public_local\">Lokaal</string>\n    <string name=\"title_public_federated\">Gefedereerd</string>\n    <string name=\"title_direct_messages\">Privéberichten</string>\n    <string name=\"title_tab_preferences\">Tabs</string>\n    <string name=\"title_view_thread\">Gesprek</string>\n    <string name=\"title_posts\">Berichten</string>\n    <string name=\"title_posts_with_replies\">Met reacties</string>\n    <string name=\"title_posts_pinned\">Vastgezet</string>\n    <string name=\"title_follows\">Volgend</string>\n    <string name=\"title_followers\">Volgers</string>\n    <string name=\"title_favourites\">Favorieten</string>\n    <string name=\"title_mutes\">Genegeerde gebruikers</string>\n    <string name=\"title_blocks\">Geblokkeerde gebruikers</string>\n    <string name=\"title_follow_requests\">Volgverzoeken</string>\n    <string name=\"title_edit_profile\">Je profiel bewerken</string>\n    <string name=\"title_drafts\">Concepten</string>\n    <string name=\"title_licenses\">Licenties</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s boostte</string>\n    <string name=\"post_sensitive_media_title\">Gevoelige inhoud</string>\n    <string name=\"post_media_hidden_title\">Verborgen media</string>\n    <string name=\"post_sensitive_media_directions\">Klik om te bekijken</string>\n    <string name=\"post_content_warning_show_more\">Meer tonen</string>\n    <string name=\"post_content_warning_show_less\">Minder tonen</string>\n    <string name=\"post_content_show_more\">Uitklappen</string>\n    <string name=\"post_content_show_less\">Inklappen</string>\n    <string name=\"message_empty\">Hier is niets.</string>\n    <string name=\"footer_empty\">Niets te zien. Swipe naar beneden om te verversen!</string>\n    <string name=\"notification_reblog_format\">%1$s boostte jouw bericht</string>\n    <string name=\"notification_favourite_format\">%1$s markeerde jouw bericht als favoriet</string>\n    <string name=\"notification_follow_format\">%1$s volgt jou</string>\n    <string name=\"report_username_format\">\\@%1$s rapporteren</string>\n    <string name=\"report_comment_hint\">Extra opmerkingen?</string>\n    <string name=\"action_quick_reply\">Snel reageren</string>\n    <string name=\"action_reply\">Reageren</string>\n    <string name=\"action_reblog\">Boosten</string>\n    <string name=\"action_unreblog\">Boost verwijderen</string>\n    <string name=\"action_favourite\">Als favoriet markeren</string>\n    <string name=\"action_unfavourite\">Favoriet verwijderen</string>\n    <string name=\"action_more\">Meer</string>\n    <string name=\"action_compose\">Bericht schrijven</string>\n    <string name=\"action_login\">Aanmelden met Tusky</string>\n    <string name=\"action_logout\">Uitloggen</string>\n    <string name=\"action_logout_confirm\">Weet je zeker dat je %1$s wil afmelden? Dit verwijdert alle lokale gegevens van het account, inclusief conceptberichten en voorkeuren.</string>\n    <string name=\"action_follow\">Volgen</string>\n    <string name=\"action_unfollow\">Ontvolgen</string>\n    <string name=\"action_block\">Blokkeren</string>\n    <string name=\"action_unblock\">Deblokkeren</string>\n    <string name=\"action_hide_reblogs\">Boosts verbergen</string>\n    <string name=\"action_show_reblogs\">Boosts tonen</string>\n    <string name=\"action_report\">Rapporteren</string>\n    <string name=\"action_delete\">Verwijderen</string>\n    <string name=\"action_send\">Toot!</string>\n    <string name=\"action_send_public\">Toot!</string>\n    <string name=\"action_retry\">Opnieuw proberen</string>\n    <string name=\"action_close\">Sluiten</string>\n    <string name=\"action_view_profile\">Profiel</string>\n    <string name=\"action_view_preferences\">Voorkeuren</string>\n    <string name=\"action_view_account_preferences\">Accountvoorkeuren</string>\n    <string name=\"action_view_favourites\">Favorieten</string>\n    <string name=\"action_view_mutes\">Genegeerde gebruikers</string>\n    <string name=\"action_view_blocks\">Geblokkeerde gebruikers</string>\n    <string name=\"action_view_follow_requests\">Volgverzoeken</string>\n    <string name=\"action_view_media\">Media</string>\n    <string name=\"action_open_in_web\">In browser openen</string>\n    <string name=\"action_add_media\">Media toevoegen</string>\n    <string name=\"action_photo_take\">Foto maken</string>\n    <string name=\"action_share\">Delen</string>\n    <string name=\"action_mute\">Negeren</string>\n    <string name=\"action_unmute\">Niet langer negeren</string>\n    <string name=\"action_mention\">Vermelden</string>\n    <string name=\"action_hide_media\">Media verbergen</string>\n    <string name=\"action_open_drawer\">Menu openen</string>\n    <string name=\"action_save\">Opslaan</string>\n    <string name=\"action_edit_profile\">Profiel bewerken</string>\n    <string name=\"action_edit_own_profile\">Bewerken</string>\n    <string name=\"action_undo\">Ongedaan maken</string>\n    <string name=\"action_accept\">Accepteren</string>\n    <string name=\"action_reject\">Afwijzen</string>\n    <string name=\"action_search\">Zoeken</string>\n    <string name=\"action_access_drafts\">Concepten</string>\n    <string name=\"action_toggle_visibility\">Zichtbaarheid van berichten</string>\n    <string name=\"action_content_warning\">Inhoudswaarschuwing</string>\n    <string name=\"action_emoji_keyboard\">Emojis</string>\n    <string name=\"action_add_tab\">Tab toevoegen</string>\n    <string name=\"action_links\">Links</string>\n    <string name=\"action_mentions\">Vermeldingen</string>\n    <string name=\"action_hashtags\">Hashtags</string>\n    <string name=\"action_open_reblogger\">Auteur van deze boost openen</string>\n    <string name=\"action_open_reblogged_by\">Boosts tonen</string>\n    <string name=\"action_open_faved_by\">Favorieten tonen</string>\n    <string name=\"title_hashtags_dialog\">Hashtags</string>\n    <string name=\"title_mentions_dialog\">Vermeldingen</string>\n    <string name=\"title_links_dialog\">Links</string>\n    <string name=\"action_open_media_n\">Media #%1$d openen</string>\n    <string name=\"download_image\">%1$s aan het downloaden</string>\n    <string name=\"action_copy_link\">Link kopiëren</string>\n    <string name=\"action_open_as\">Als %1$s openen</string>\n    <string name=\"action_share_as\">Delen als …</string>\n    <string name=\"send_post_link_to\">Link naar het bericht delen met…</string>\n    <string name=\"send_post_content_to\">Inhoud van het bericht delen met…</string>\n    <string name=\"send_media_to\">Media delen met …</string>\n    <string name=\"confirmation_reported\">Verzonden!</string>\n    <string name=\"confirmation_unblocked\">Gebruiker gedeblokkeerd</string>\n    <string name=\"confirmation_unmuted\">Gebruiker wordt niet langer genegeerd</string>\n    <string name=\"hint_domain\">Welke server?</string>\n    <string name=\"hint_compose\">Wat wil je kwijt?</string>\n    <string name=\"hint_content_warning\">Inhoudswaarschuwing</string>\n    <string name=\"hint_display_name\">Weergavenaam</string>\n    <string name=\"hint_note\">Bio</string>\n    <string name=\"hint_search\">Zoeken…</string>\n    <string name=\"search_no_results\">Geen resultaten</string>\n    <string name=\"label_quick_reply\">Reageren…</string>\n    <string name=\"label_avatar\">Profielfoto</string>\n    <string name=\"label_header\">Omslagfoto</string>\n    <string name=\"link_whats_an_instance\">Wat is een server?</string>\n    <string name=\"login_connection\">Aan het verbinden…</string>\n    <string name=\"dialog_whats_an_instance\">Het adres of domein van eender welke server kan hier worden ingevoerd, zoals mastodon.social, mastodon.nl, mastodon-belgium.be en <a href=\"https://instances.social\">nog veel meer!</a> \\u0020 \n\\n \\u0020 \n\\nWanneer je nog geen account hebt, kun je de naam van de server waar jij je graag wil registeren invoeren, waarna je daar een account kunt aanmaken. \\u0020 \n\\n \\u0020 \n\\nOp Mastodon is een server (Engels: instance) een computerserver waar jouw account zich bevindt (vergelijk het met een e-mailserver). Je kan eenvoudig mensen van andere servers volgen en met ze communiceren, alsof jullie met elkaar op dezelfde website zitten. \\u0020 \n\\n \\u0020 \n\\n Meer informatie kun je vinden op <a href=\"https://joinmastodon.org\">joinmastodon.org</a>. \\u0020</string>\n    <string name=\"dialog_title_finishing_media_upload\">Uploaden media bijna voltooid</string>\n    <string name=\"dialog_message_uploading_media\">Aan het uploaden…</string>\n    <string name=\"dialog_download_image\">Downloaden</string>\n    <string name=\"dialog_message_cancel_follow_request\">Volgverzoek annuleren?</string>\n    <string name=\"dialog_unfollow_warning\">Dit account ontvolgen?</string>\n    <string name=\"dialog_delete_post_warning\">Dit bericht verwijderen?</string>\n    <string name=\"visibility_public\">Openbaar: op openbare tijdlijnen tonen</string>\n    <string name=\"visibility_unlisted\">Minder openbaar: niet op openbare tijdlijnen tonen</string>\n    <string name=\"visibility_private\">Alleen volgers: alleen aan jouw volgers tonen</string>\n    <string name=\"visibility_direct\">Direct: alleen aan vermelde gebruikers tonen</string>\n    <string name=\"pref_title_edit_notification_settings\">Meldingen</string>\n    <string name=\"pref_title_notifications_enabled\">Meldingen</string>\n    <string name=\"pref_title_notification_alerts\">Waarschuwingen</string>\n    <string name=\"pref_title_notification_alert_sound\">geluid</string>\n    <string name=\"pref_title_notification_alert_vibrate\">trillen</string>\n    <string name=\"pref_title_notification_alert_light\">licht</string>\n    <string name=\"pref_title_notification_filters\">Waarschuw mij wanneer</string>\n    <string name=\"pref_title_appearance_settings\">Uiterlijk</string>\n    <string name=\"pref_title_app_theme\">Thema</string>\n    <string name=\"pref_title_timelines\">Tijdlijnen</string>\n    <string name=\"app_them_dark\">Donker</string>\n    <string name=\"app_theme_light\">Licht</string>\n    <string name=\"app_theme_black\">Zwart</string>\n    <string name=\"app_theme_auto\">Automatisch bij zonsondergang</string>\n    <string name=\"app_theme_system\">Systeemthema gebruiken</string>\n    <string name=\"pref_title_browser_settings\">Browser</string>\n    <string name=\"pref_title_custom_tabs\">Aangepaste chrome-tabbladen gebruiken</string>\n    <string name=\"pref_title_language\">Taal</string>\n    <string name=\"pref_title_post_filter\">Tijdlijnen filteren</string>\n    <string name=\"pref_title_post_tabs\">Hoofdtijdlijn</string>\n    <string name=\"pref_title_show_boosts\">Boosts tonen</string>\n    <string name=\"pref_title_show_replies\">Reacties tonen</string>\n    <string name=\"pref_title_show_media_preview\">Media previews downloaden</string>\n    <string name=\"pref_title_proxy_settings\">Proxy</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP-proxy</string>\n    <string name=\"pref_title_http_proxy_enable\">HTTP-proxy inschakelen</string>\n    <string name=\"pref_title_http_proxy_server\">Serveradres van HTTP-proxy</string>\n    <string name=\"pref_title_http_proxy_port\">Poort van HTTP-proxy</string>\n    <string name=\"pref_default_post_privacy\">Zichtbaarheid van jouw berichten (gesynchroniseerd met de server)</string>\n    <string name=\"pref_default_media_sensitivity\">Media altijd als gevoelig markeren (gesynchroniseerd met de server)</string>\n    <string name=\"pref_publishing\">Standaardinstellingen voor berichten</string>\n    <string name=\"pref_failed_to_sync\">Voorkeuren synchroniseren mislukt</string>\n    <string name=\"post_privacy_public\">Openbaar</string>\n    <string name=\"post_privacy_unlisted\">Minder openbaar</string>\n    <string name=\"post_privacy_followers_only\">Alleen volgers</string>\n    <string name=\"pref_post_text_size\">Tekstgrootte van berichten</string>\n    <string name=\"post_text_size_smallest\">Kleinst</string>\n    <string name=\"post_text_size_small\">Klein</string>\n    <string name=\"post_text_size_medium\">Standaard</string>\n    <string name=\"post_text_size_large\">Groot</string>\n    <string name=\"post_text_size_largest\">Grootst</string>\n    <string name=\"notification_mention_name\">Nieuwe vermeldingen</string>\n    <string name=\"notification_mention_descriptions\">Meldingen over nieuwe vermeldingen</string>\n    <string name=\"notification_follow_name\">Nieuwe volgers</string>\n    <string name=\"notification_follow_description\">Meldingen over nieuwe volgers</string>\n    <string name=\"notification_boost_name\">Boosts</string>\n    <string name=\"notification_boost_description\">Meldingen wanneer jouw berichten worden geboost</string>\n    <string name=\"notification_favourite_name\">Favorieten</string>\n    <string name=\"notification_favourite_description\">Meldingen wanneer jouw berichten als favoriet worden gemarkeerd</string>\n    <string name=\"notification_mention_format\">%1$s heeft je vermeld</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s en %4$d anderen</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s en %3$s</string>\n    <string name=\"notification_summary_small\">%1$s en %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d nieuwe interactie</item>\n        <item quantity=\"other\">%1$d nieuwe interacties</item>\n    </plurals>\n    <string name=\"description_account_locked\">Besloten account</string>\n    <string name=\"about_title_activity\">Over</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_tusky_license\">Tusky is vrije opensource software. De licentie valt onder de GNU Algemene Publieke Licentie versie 3. Je kunt de licentie hier bekijken: https://www.gnu.org/licenses/gpl-3.0.nl.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">Projectwebsite: https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Fouten melden &amp; nieuwe functies aanvragen:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Tusky\\'s profiel</string>\n    <string name=\"post_share_content\">Inhoud van bericht delen</string>\n    <string name=\"post_share_link\">Link naar het bericht delen</string>\n    <string name=\"post_media_images\">Afbeeldingen</string>\n    <string name=\"post_media_video\">Video</string>\n    <string name=\"state_follow_requested\">Volgverzoek verzonden</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">over %1$dj</string>\n    <string name=\"abbreviated_in_days\">over %1$dd</string>\n    <string name=\"abbreviated_in_hours\">over %1$du</string>\n    <string name=\"abbreviated_in_minutes\">over %1$dmin</string>\n    <string name=\"abbreviated_in_seconds\">over %1$ds</string>\n    <string name=\"abbreviated_years_ago\">%1$dj</string>\n    <string name=\"abbreviated_days_ago\">%1$dd</string>\n    <string name=\"abbreviated_hours_ago\">%1$du</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dmin</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"follows_you\">Volgt jou</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Gevoelige inhoud altijd tonen</string>\n    <string name=\"title_media\">Media</string>\n    <string name=\"replying_to\">Aan het reageren op @%1$s</string>\n    <string name=\"load_more_placeholder_text\">Meer laden</string>\n    <string name=\"add_account_name\">Account toevoegen</string>\n    <string name=\"add_account_description\">Een nieuw Mastodonaccount toevoegen</string>\n    <string name=\"action_lists\">Lijsten</string>\n    <string name=\"title_lists\">Lijsten</string>\n    <string name=\"compose_active_account_description\">Berichten plaatsen als %1$s</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Beschrijf inhoud voor iemand met een visuele beperking (tekenlimiet is %1$d)</item>\n        <item quantity=\"other\">Beschrijf inhoud voor mensen met een visuele beperking (tekenlimiet is %1$d)</item>\n    </plurals>\n    <string name=\"action_set_caption\">Beschrijving toevoegen</string>\n    <string name=\"action_remove\">Verwijderen</string>\n    <string name=\"lock_account_label\">Account besloten maken</string>\n    <string name=\"lock_account_label_description\">Handmatige goedkeuring voor volgers vereist</string>\n    <string name=\"compose_save_draft\">Concept bewaren?</string>\n    <string name=\"send_post_notification_title\">Bericht wordt verzonden…</string>\n    <string name=\"send_post_notification_error_title\">Verzenden van het bericht is mislukt</string>\n    <string name=\"send_post_notification_channel_name\">Berichten worden verzonden</string>\n    <string name=\"send_post_notification_cancel_title\">Verzenden geannuleerd</string>\n    <string name=\"send_post_notification_saved_content\">Een kopie van het bericht werd als concept opgeslagen</string>\n    <string name=\"action_compose_shortcut\">Bericht schrijven</string>\n    <string name=\"error_no_custom_emojis\">Jouw server %1$s heeft geen lokale emojis</string>\n    <string name=\"emoji_style\">Emojistijl</string>\n    <string name=\"system_default\">Systeemstandaard</string>\n    <string name=\"download_fonts\">Je moet eerst deze emoji-sets downloaden</string>\n    <string name=\"performing_lookup_title\">Aan het zoeken…</string>\n    <string name=\"expand_collapse_all_posts\">Alle berichten in- of uitklappen</string>\n    <string name=\"action_open_post\">Bericht openen</string>\n    <string name=\"restart_required\">App opnieuw opstarten vereist</string>\n    <string name=\"restart_emoji\">Je moet Tusky opnieuw opstarten om deze veranderingen te kunnen doorvoeren</string>\n    <string name=\"later\">Later</string>\n    <string name=\"restart\">Opnieuw opstarten</string>\n    <string name=\"caption_systememoji\">Standaard emojiset van jouw apparaat</string>\n    <string name=\"caption_blobmoji\">De Blob-emojis van Android 4.4–7.1</string>\n    <string name=\"caption_twemoji\">Standaard emojiset van Mastodon</string>\n    <string name=\"download_failed\">Downloaden mislukt</string>\n    <string name=\"profile_badge_bot_text\">Bot</string>\n    <string name=\"account_moved_description\">%1$s is verhuisd naar:</string>\n    <string name=\"reblog_private\">Boost naar oorspronkelijke ontvangers</string>\n    <string name=\"unreblog_private\">Niet meer boosten</string>\n    <string name=\"license_description\">Tusky bevat broncode en onderdelen van de volgende opensourceprojecten:</string>\n    <string name=\"license_apache_2\">Gelicenseerd onder de Apache-licentie (kopie hieronder)</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">Metadata profiel</string>\n    <string name=\"profile_metadata_add\">Metadata toevoegen</string>\n    <string name=\"profile_metadata_label_label\">Label</string>\n    <string name=\"profile_metadata_content_label\">Inhoud</string>\n    <string name=\"pref_title_absolute_time\">Absolute tijdsaanduidingen gebruiken</string>\n    <string name=\"label_remote_account\">De informatie hieronder kan een incompleet beeld geven van dit gebruikersprofiel. Druk hier om het volledige profiel in de webbrowser te openen.</string>\n    <string name=\"unpin_action\">Losmaken</string>\n    <string name=\"pin_action\">Vastmaken</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> favoriet</item>\n        <item quantity=\"other\"><b>%1$s</b> favorieten</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> boost</item>\n        <item quantity=\"other\"><b>%1$s</b> boosts</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">Geboost door</string>\n    <string name=\"title_favourited_by\">Als favoriet gemarkeerd door</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s en %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s en %3$d anderen</string>\n    <string name=\"description_post_media\">Media: %1$s</string>\n    <string name=\"description_post_cw\">Inhoudswaarschuwing: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Geen beschrijving</string>\n    <string name=\"description_post_reblogged\">Geboost</string>\n    <string name=\"description_post_favourited\">Als favoriet gemarkeerd</string>\n    <string name=\"description_visibility_public\">Openbaar</string>\n    <string name=\"description_visibility_unlisted\">Minder openbaar</string>\n    <string name=\"description_visibility_private\">Volgers</string>\n    <string name=\"description_visibility_direct\">Direct</string>\n    <string name=\"download_media\">Media downloaden</string>\n    <string name=\"downloading_media\">Media aan het downloaden</string>\n    <string name=\"pref_title_timeline_filters\">Filters</string>\n    <string name=\"pref_title_public_filter_keywords\">Openbare tijdlijnen</string>\n    <string name=\"pref_title_thread_filter_keywords\">Gesprekken</string>\n    <string name=\"filter_addition_title\">Filter toevoegen</string>\n    <string name=\"filter_edit_title\">Filter bewerken</string>\n    <string name=\"filter_dialog_remove_button\">Verwijderen</string>\n    <string name=\"filter_dialog_update_button\">Bijwerken</string>\n    <string name=\"filter_add_description\">Zinsdeel om te filteren</string>\n    <string name=\"error_create_list\">Kon de lijst niet aanmaken</string>\n    <string name=\"error_rename_list\">Kon lijst niet updaten</string>\n    <string name=\"error_delete_list\">Kon de lijst niet verwijderen</string>\n    <string name=\"action_create_list\">Lijst aanmaken</string>\n    <string name=\"action_rename_list\">Lijst updaten</string>\n    <string name=\"action_delete_list\">Lijst verwijderen</string>\n    <string name=\"hint_search_people_list\">Naar mensen zoeken die je volgt</string>\n    <string name=\"action_add_to_list\">Account aan de lijst toevoegen</string>\n    <string name=\"action_remove_from_list\">Account uit de lijst verwijderen</string>\n    <string name=\"hint_list_name\">Naam van lijst</string>\n    <string name=\"pick_hashtag_hint\">Hashtag zonder #</string>\n    <string name=\"action_delete_and_redraft\">Verwijderen en herschrijven</string>\n    <string name=\"dialog_redraft_post_warning\">Dit bericht verwijderen en herschrijven?</string>\n    <string name=\"notifications_clear\">Verwijderen</string>\n    <string name=\"notifications_apply_filter\">Filteren</string>\n    <string name=\"filter_apply\">Toepassen</string>\n    <string name=\"compose_shortcut_long_label\">Bericht schrijven</string>\n    <string name=\"compose_shortcut_short_label\">Schrijven</string>\n    <string name=\"pref_title_bot_overlay\">Indicator voor bots tonen</string>\n    <string name=\"notification_clear_text\">Weet je zeker dat je alle meldingen permanent wilt verwijderen?</string>\n    <string name=\"poll_info_format\"> \\u0020<!-- 15 votes • 1 hour left --> \\u0020%1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s stem</item>\n        <item quantity=\"other\">%1$s stemmen</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">eindigt om %1$s</string>\n    <string name=\"poll_info_closed\">gesloten</string>\n    <string name=\"poll_vote\">Stemmen</string>\n    <string name=\"notification_poll_name\">Polls</string>\n    <string name=\"notification_poll_description\">Meldingen over polls die zijn beëindigd</string>\n    <string name=\"poll_ended_voted\">Een poll waarin jij hebt gestemd, is beëindigd</string>\n    <string name=\"poll_ended_created\">Een poll die jij hebt aangemaakt, is beëindigd</string>\n    <string name=\"title_domain_mutes\">Verborgen domeinen</string>\n    <string name=\"action_view_domain_mutes\">Verborgen domeinen</string>\n    <string name=\"action_mute_domain\">%1$s negeren</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s niet meer verborgen</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Volledig domein verbergen</string>\n    <string name=\"pref_title_animate_gif_avatars\">GIF-profielfoto\\'s animeren</string>\n    <string name=\"caption_notoemoji\">Google\\'s huidige emojiset</string>\n    <string name=\"mute_domain_warning\">Weet je zeker dat je alles van %1$s wilt blokkeren? Je zult op alle openbare tijdlijnen en in jouw meldingen geen inhoud van dat domein zien. Jouw volgers van dat domein worden verwijderd.</string>\n    <string name=\"description_poll\">Poll met keuzes: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"compose_preview_image_description\">Acties voor afbeelding %1$s</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">nog %1$d dag</item>\n        <item quantity=\"other\">nog %1$d dagen</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">nog %1$d uur</item>\n        <item quantity=\"other\">nog %1$d uur</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">nog %1$d minuut</item>\n        <item quantity=\"other\">nog %1$d minuten</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">nog %1$d seconde</item>\n        <item quantity=\"other\">nog %1$d seconden</item>\n    </plurals>\n    <string name=\"button_continue\">Doorgaan</string>\n    <string name=\"button_back\">Terug</string>\n    <string name=\"button_done\">Klaar</string>\n    <string name=\"report_sent_success\">Het rapporteren van @%1$s is geslaagd</string>\n    <string name=\"hint_additional_info\">Extra opmerkingen</string>\n    <string name=\"report_remote_instance\">Doorsturen naar %1$s</string>\n    <string name=\"failed_report\">Het rapporteren is mislukt</string>\n    <string name=\"failed_fetch_posts\">Het ophalen van berichten is mislukt</string>\n    <string name=\"report_description_1\">Dit rapport wordt naar jouw de moderator(en) van jouw server gestuurd. Je kunt hieronder uitleggen waarom je het account wilt rapporteren:</string>\n    <string name=\"report_description_remote_instance\">Het account is van een andere server. Wil je ook een geanonimiseerde kopie van je rapport daarnaartoe sturen?</string>\n    <string name=\"filter_dialog_whole_word\">Heel woord</string>\n    <string name=\"filter_dialog_whole_word_description\">Wanneer het trefwoord of zinsdeel alfanumeriek is, wordt het alleen gefilterd wanneer het hele woord overeenkomt</string>\n    <string name=\"duration_5_min\">5 minuten</string>\n    <string name=\"duration_30_min\">30 minuten</string>\n    <string name=\"duration_1_hour\">1 uur</string>\n    <string name=\"duration_6_hours\">6 uur</string>\n    <string name=\"duration_1_day\">1 dag</string>\n    <string name=\"duration_3_days\">3 dagen</string>\n    <string name=\"duration_7_days\">7 dagen</string>\n    <string name=\"add_poll_choice\">Optie toevoegen</string>\n    <string name=\"poll_allow_multiple_choices\">Meerdere opties</string>\n    <string name=\"poll_new_choice_hint\">Optie %1$d</string>\n    <string name=\"edit_poll\">Bewerken</string>\n    <string name=\"title_bookmarks\">Bladwijzers</string>\n    <string name=\"title_scheduled_posts\">Ingeplande berichten</string>\n    <string name=\"action_bookmark\">Bladwijzer</string>\n    <string name=\"action_edit\">Bewerken</string>\n    <string name=\"action_view_bookmarks\">Bladwijzers</string>\n    <string name=\"action_add_poll\">Poll toevoegen</string>\n    <string name=\"action_access_scheduled_posts\">Ingeplande berichten</string>\n    <string name=\"action_schedule_post\">Bericht inplannen</string>\n    <string name=\"action_reset_schedule\">Opnieuw beginnen</string>\n    <string name=\"about_powered_by_tusky\">Mogelijk gemaakt door Tusky</string>\n    <string name=\"pref_title_alway_open_spoiler\">Berichten met inhoudswaarschuwingen altijd uitklappen</string>\n    <string name=\"description_post_bookmarked\">Toegevoegd aan bladwijzers</string>\n    <string name=\"select_list_title\">Lijst kiezen</string>\n    <string name=\"list\">Lijst</string>\n    <string name=\"title_accounts\">Accounts</string>\n    <string name=\"failed_search\">Zoeken mislukt</string>\n    <string name=\"create_poll_title\">Poll</string>\n    <string name=\"post_lookup_error_format\">Fout tijdens het opzoeken van bericht %1$s</string>\n    <string name=\"no_drafts\">Je hebt geen concepten.</string>\n    <string name=\"no_scheduled_posts\">Je hebt geen ingeplande berichten.</string>\n    <string name=\"warning_scheduling_interval\">Om een bericht in te plannen moet je een tijdstip kiezen dat minstens 5 minuten in de toekomst ligt.</string>\n    <string name=\"notification_follow_request_name\">Volgverzoeken</string>\n    <string name=\"hashtags\">Hashtags</string>\n    <string name=\"post_media_attachments\">Bijlagen</string>\n    <string name=\"action_unsubscribe_account\">Afmelden</string>\n    <string name=\"action_subscribe_account\">Abonneren</string>\n    <string name=\"drafts_post_reply_removed\">Het bericht waarvoor jij een reactie had opgesteld, is verwijderd</string>\n    <string name=\"drafts_post_failed_to_send\">Het versturen van dit bericht is mislukt!</string>\n    <string name=\"dialog_delete_list_warning\">Weet je zeker dat je lijst %1$s wilt verwijderen?</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Je kan niet meer dan %1$d mediabijlage uploaden.</item>\n        <item quantity=\"other\">Je kan niet meer dan %1$d mediabijlagen uploaden.</item>\n    </plurals>\n    <string name=\"limit_notifications\">Meldingen op tijdlijn beperken</string>\n    <string name=\"account_note_saved\">Opgeslagen!</string>\n    <string name=\"account_note_hint\">Jouw eigen opmerking over dit account</string>\n    <string name=\"pref_title_wellbeing_mode\">Welzijn</string>\n    <string name=\"pref_title_hide_top_toolbar\">De bovenste werkbalk verbergen</string>\n    <string name=\"pref_title_confirm_reblogs\">Vraag bevestiging voor het boosten</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Linkpreviews in tijdlijnen weergeven</string>\n    <string name=\"no_announcements\">Er zijn geen aankondigingen.</string>\n    <string name=\"duration_indefinite\">Voor altijd</string>\n    <string name=\"label_duration\">Duur</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Swipebewegingen om tussen tabs te wisselen inschakelen</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s persoon</item>\n        <item quantity=\"other\">%1$s mensen</item>\n    </plurals>\n    <string name=\"add_hashtag_title\">Hashtag toevoegen</string>\n    <string name=\"post_media_audio\">Geluid</string>\n    <string name=\"notification_subscription_description\">Meldingen wanneer iemand waar je op bent geabonneerd een nieuw bericht plaatst</string>\n    <string name=\"notification_subscription_name\">Nieuwe berichten</string>\n    <string name=\"notification_follow_request_description\">Meldingen over volgverzoeken</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Onderaan</string>\n    <string name=\"pref_main_nav_position_option_top\">Bovenaan</string>\n    <string name=\"pref_title_animate_custom_emojis\">Lokale emojis animeren</string>\n    <string name=\"pref_title_gradient_for_media\">Kleurverloop weergeven voor verborgen media</string>\n    <string name=\"dialog_mute_hide_notifications\">Meldingen verbergen</string>\n    <string name=\"dialog_mute_warning\">\\@%1$s negeren?</string>\n    <string name=\"dialog_block_warning\">\\@%1$s blokkeren?</string>\n    <string name=\"action_unmute_conversation\">Gesprek niet meer negeren</string>\n    <string name=\"action_mute_conversation\">Gesprek negeren</string>\n    <string name=\"action_unmute_domain\">%1$s niet langer negeren</string>\n    <string name=\"action_unmute_desc\">%1$s niet langer negeren</string>\n    <string name=\"notification_subscription_format\">%1$s heeft zojuist een bericht geplaatst</string>\n    <string name=\"notification_follow_request_format\">%1$s heeft je een volgverzoek gestuurd</string>\n    <string name=\"title_announcements\">Aankondigingen</string>\n    <string name=\"review_notifications\">Meldingen beoordelen</string>\n    <string name=\"draft_deleted\">Concept verwijderd</string>\n    <string name=\"wellbeing_hide_stats_posts\">Kwantitatieve statistieken voor berichten verbergen</string>\n    <string name=\"drafts_failed_loading_reply\">Laden van reactie-informatie mislukt</string>\n    <string name=\"wellbeing_hide_stats_profile\">Kwantitatieve statistieken in profielen verbergen</string>\n    <string name=\"pref_main_nav_position\">Positie van de hoofdnavigatie</string>\n    <string name=\"dialog_delete_conversation_warning\">Dit gesprek verwijderen?</string>\n    <string name=\"action_delete_conversation\">Gesprek verwijderen</string>\n    <string name=\"follow_requests_info\">Ook al heb je geen besloten account, de medewerkers van %1$s dachten dat je misschien de volgverzoeken van deze accounts handmatig zou willen controleren.</string>\n    <string name=\"wellbeing_mode_notice\">Informatie die je geestelijk welzijn kan beïnvloeden, zal worden verborgen. Het gaat om:\n\\n\n\\n- Meldingen over favorieten, boosts en volgers\n\\n- Weergave van het aantal favorieten en boosts per bericht\n\\n- Statistieken over het aantal volgers en berichten op profielen\n\\n\n\\nPushmeldingen worden hierdoor niet beïnvloed, maar je kunt de voorkeuren voor meldingen handmatig wijzigen.</string>\n    <string name=\"notification_sign_up_format\">%1$s heeft zich geregistreerd</string>\n    <string name=\"error_multimedia_size_limit\">Afbeeldingen en video\\'s mogen niet groter zijn dan %1$s MB.</string>\n    <string name=\"error_image_edit_failed\">Deze afbeelding kon niet worden bewerkt.</string>\n    <string name=\"title_login\">Inloggen</string>\n    <string name=\"notification_update_format\">%1$s heeft diens bericht bewerkt</string>\n    <string name=\"action_unbookmark\">Bladwijzer verwijderen</string>\n    <string name=\"action_dismiss\">Afwijzen</string>\n    <string name=\"action_details\">Details</string>\n    <string name=\"notification_sign_up_name\">Registraties</string>\n    <string name=\"notification_sign_up_description\">Meldingen over nieuwe gebruikers</string>\n    <string name=\"notification_update_name\">Bewerkingen van berichten</string>\n    <string name=\"notification_update_description\">Meldingen wanneer berichten waarmee je interactie had werden bewerkt</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"action_edit_image\">Afbeelding bewerken</string>\n    <string name=\"duration_30_days\">30 dagen</string>\n    <string name=\"duration_60_days\">60 dagen</string>\n    <string name=\"duration_14_days\">14 dagen</string>\n    <string name=\"duration_90_days\">90 dagen</string>\n    <string name=\"duration_180_days\">180 dagen</string>\n    <string name=\"duration_365_days\">365 dagen</string>\n    <string name=\"pref_title_confirm_favourites\">Vraag bevestiging voor het markeren als favoriet</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Bericht schrijven</string>\n    <string name=\"account_date_joined\">Geregistreerd in %1$s</string>\n    <string name=\"saving_draft\">Concept wordt opgeslagen…</string>\n    <string name=\"error_loading_account_details\">Laden van accountdetails mislukt</string>\n    <string name=\"error_could_not_load_login_page\">De inlogpagina kon niet worden geladen.</string>\n    <string name=\"description_post_language\">Taal van jouw berichten</string>\n    <string name=\"duration_no_change\">(geen verandering)</string>\n    <string name=\"pref_title_show_self_username\">Gebruikersnaam op werkbalken tonen</string>\n    <string name=\"set_focus_description\">Tik of sleep de cirkel naar een centraal punt dat op elke miniatuur zichtbaar moet blijven.</string>\n    <string name=\"pref_show_self_username_always\">Altijd</string>\n    <string name=\"pref_show_self_username_disambiguate\">Wanneer meerdere accounts zijn ingelogd</string>\n    <string name=\"pref_show_self_username_never\">Nooit</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"action_set_focus\">Centraal punt instellen</string>\n    <string name=\"error_following_hashtag_format\">Fout tijdens het volgen van #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Fout tijdens het ontvolgen van #%1$s</string>\n    <string name=\"delete_scheduled_post_warning\">Dit ingeplande bericht verwijderen?</string>\n    <string name=\"pref_title_reading_order\">Leesvolgorde</string>\n    <string name=\"pref_reading_order_oldest_first\">Oudste eerst</string>\n    <string name=\"pref_reading_order_newest_first\">Nieuwste eerst</string>\n    <string name=\"failed_to_add_to_list\">Account aan de lijst toevoegen is mislukt</string>\n    <string name=\"action_add_or_remove_from_list\">Toevoegen aan of verwijderen van lijst</string>\n    <string name=\"failed_to_pin\">Vastmaken mislukt</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Uitgeschakeld</string>\n    <string name=\"failed_to_remove_from_list\">Account van de lijst verwijderen is mislukt</string>\n    <string name=\"compose_unsaved_changes\">Er zijn niet opgeslagen wijzigingen.</string>\n    <string name=\"mute_notifications_switch\">Meldingen negeren</string>\n    <string name=\"title_edits\">Bewerkingen</string>\n    <string name=\"pref_default_post_language\">Taal van je berichten (gesynchroniseerd met de server)</string>\n    <string name=\"notification_report_name\">Rapporten</string>\n    <string name=\"description_post_edited\">Bewerkt</string>\n    <string name=\"status_edit_info\">Bewerkt: %1$s</string>\n    <string name=\"status_created_info\">Gemaakt: %1$s</string>\n    <string name=\"instance_rule_info\">Door in te loggen ben je het eens met de regels van %1$s.</string>\n    <string name=\"report_category_spam\">Spam</string>\n    <string name=\"report_category_other\">Overig</string>\n    <string name=\"hint_media_description_missing\">Media moet een beschrijving hebben.</string>\n    <string name=\"failed_to_unpin\">Losmaken mislukt</string>\n    <string name=\"instance_rule_title\">%1$s regels</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"report_category_violation\">Regelovertreding</string>\n    <string name=\"no_lists\">Je hebt geen lijsten.</string>\n    <string name=\"status_created_at_now\">nu</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"action_unfollow_hashtag_format\">#%1$s ontvolgen?</string>\n    <string name=\"error_muting_hashtag_format\">Fout bij negeren #%1$s</string>\n    <string name=\"action_continue_edit\">Verder bewerken</string>\n    <string name=\"notification_report_format\">Nieuw rapport over %1$s</string>\n    <string name=\"account_username_copied\">Gebruikersnaam gekopieerd</string>\n    <string name=\"confirmation_hashtag_unfollowed\">#%1$s ontvolgd</string>\n    <string name=\"title_followed_hashtags\">Gevolgde hashtags</string>\n    <string name=\"dialog_follow_hashtag_title\">Hashtag volgen</string>\n    <string name=\"action_post_failed\">Upload mislukt</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Je bericht kan niet worden geüpload en is opgeslagen in concepten.\n\\n\n\\nEr kon geen contact worden opgenomen met de server, of het bericht werd geweigerd.</item>\n        <item quantity=\"other\">Je berichten kunnen niet worden geüpload en zijn opgeslagen in concepten.\n\\n\n\\nEr kon geen contact worden opgenomen met de server of de berichten werden geweigerd.</item>\n    </plurals>\n    <string name=\"action_post_failed_do_nothing\">Afwijzen</string>\n    <string name=\"action_post_failed_show_drafts\">Concepten tonen</string>\n    <string name=\"error_unmuting_hashtag_format\">Fout bij het niet langer negeren van #%1$s</string>\n    <string name=\"action_browser_login\">Inloggen met een browser</string>\n    <string name=\"action_add_reaction\">reactie toevoegen</string>\n    <string name=\"action_discard\">Veranderingen niet opslaan</string>\n    <string name=\"post_edited\">Bewerkt %1$s</string>\n    <string name=\"notification_header_report_format\">%1$s heeft %2$s gerapporteerd</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d berichten bijgevoegd</string>\n    <string name=\"action_share_account_link\">Link naar account delen</string>\n    <string name=\"action_share_account_username\">Gebruikersnaam van het account delen</string>\n    <string name=\"send_account_username_to\">Gebruikersnaam van het account delen met…</string>\n    <string name=\"send_account_link_to\">Link van het account delen met…</string>\n    <string name=\"error_following_hashtags_unsupported\">Deze server ondersteunt het volgen van hashtags niet.</string>\n    <string name=\"error_status_source_load\">Fout bij het laden van de berichtbron van de server.</string>\n    <string name=\"title_public_trending_hashtags\">Populaire hashtags</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;niet ingesteld&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;ongeldig&gt;</string>\n    <string name=\"action_refresh\">Verversen</string>\n    <string name=\"post_media_image\">Afbeelding</string>\n    <string name=\"ui_error_reblog\">Bericht boosten is mislukt: %1$s</string>\n    <string name=\"ui_error_vote\">Stemmen in peiling mislukt: %1$s</string>\n    <string name=\"pref_title_http_proxy_port_message\">Poort moet tussen %1$d en %2$d liggen</string>\n    <string name=\"notification_unknown_name\">Onbekend</string>\n    <string name=\"ui_error_clear_notifications\">Meldingen verwijderen is mislukt: %1$s</string>\n    <string name=\"ui_success_accepted_follow_request\">Volgverzoek geaccepteerd</string>\n    <string name=\"select_list_manage\">Lijsten beheren</string>\n    <string name=\"pref_title_account_filter_keywords\">Profielen</string>\n    <string name=\"status_filtered_show_anyway\">Toch tonen</string>\n    <string name=\"status_filter_placeholder_label_format\">Gefilterd: %1$s</string>\n    <string name=\"hint_filter_title\">Mijn filter</string>\n    <string name=\"label_filter_action\">Filteractie</string>\n    <string name=\"filter_action_warn\">Waarschuwen</string>\n    <string name=\"filter_action_hide\">Verbergen</string>\n    <string name=\"filter_description_warn\">Met een waarschuwing verbergen</string>\n    <string name=\"filter_description_hide\">Volledig verbergen</string>\n    <string name=\"action_add\">Toevoegen</string>\n    <string name=\"filter_keyword_display_format\">%1$s (volledig woord)</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d mensen bespreken hashtag %2$s</string>\n    <string name=\"total_usage\">Totaal gebruik</string>\n    <string name=\"total_accounts\">Totaal accounts</string>\n    <string name=\"ui_error_reject_follow_request\">Volgverzoek afwijzen is mislukt: %1$s</string>\n    <string name=\"pref_title_show_stat_inline\">Berichtstatistieken in tijdlijn tonen</string>\n    <string name=\"ui_error_unknown\">onbekende reden</string>\n    <string name=\"ui_error_accept_follow_request\">Volgverzoek accepteren is mislukt: %1$s</string>\n    <string name=\"label_filter_title\">Titel</string>\n    <string name=\"load_newest_notifications\">Nieuwste meldingen laden</string>\n    <string name=\"compose_delete_draft\">Concept verwijderen?</string>\n    <string name=\"notification_notification_worker\">Meldingen ophalen…</string>\n    <string name=\"notification_listenable_worker_name\">Achtergrondactiviteit</string>\n    <string name=\"notification_listenable_worker_description\">Meldingen als Tusky op de achtergrond bezig is</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nAndroid versie: %3$s\n\\nSDK versie: %4$d</string>\n    <string name=\"about_account_info_title\">Je account</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nVersie: %3$s</string>\n    <string name=\"about_copy\">Versie en apparaatinformatie kopiëren</string>\n    <string name=\"about_copied\">Versie en apparaatinformatie gekopieerd</string>\n    <string name=\"error_media_upload_sending_fmt\">Het uploaden is mislukt: %1$s</string>\n    <string name=\"socket_timeout_exception\">Contact zoeken met je server duurde te lang</string>\n    <string name=\"dialog_delete_filter_positive_action\">Verwijderen</string>\n    <string name=\"dialog_delete_filter_text\">Verwijder filter \\'%1$s\\'?</string>\n    <string name=\"pref_ui_text_size\">UI tekstgrootte</string>\n    <string name=\"notification_prune_cache\">Cache onderhoud…</string>\n    <string name=\"about_device_info_title\">Je apparaat</string>\n    <string name=\"dialog_save_profile_changes_message\">Wil je de wijzigingen aan je profiel bewaren?</string>\n    <string name=\"notification_policies_title\">Meldingsbeleid</string>\n    <string name=\"label_translated\">Uit het %1$s met %2$s vertaald</string>\n    <string name=\"help_empty_lists\">Dit zijn je <b>lijsten</b>. Je kunt privélijsten maken en er accounts aan toevoegen. \\u0020 \\u0020\n\\n \\u0020 \\u0020\n\\nMERK OP dat je enkel accounts aan lijsten kunt toevoegen als je deze volgt. \\u0020 \\u0020\n\\n \\u0020 \\u0020\n\\nJe kunt je lijsten als tabbladen toevoegen in je account-instellingen [iconics gmd_account_circle] [iconics gmd_navigate_next] tabs. \\u0020</string>\n    <string name=\"notification_policies_filter_not_following_description\">Inclusief accounts die jou korter dan 3 dagen volgen</string>\n    <string name=\"help_empty_home\">Dit is je <b> hoofdtijdlijn</b>. Hier zie je de berichten van de mensen die jij volgt. \\u0020 \n\\n \n\\nOm andere accounts te ontdekken, kan je andere tijdlijnen bekijken, bijvoorbeeld je lokale tijdlijn van jouw server {{group}}. Of je kan zoeken op naam {{search}}, bijvoorbeeld typ \\\"tusky\\\" in het zoekveld om onze Mastodonaccount te vinden.</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_description\">Gefilterd, tenzij het een reactie is op je eigen vermelding, of als je het account volgt</string>\n    <string name=\"help_empty_conversations\">Dit zijn je <b>privé berichten</b>, ook wel conversaties of direct messages genoemd (DM). \\u0020\n\\n \\u0020\n\\nPrivé berichten maak je door het zichtbaarheidsinstellingen {{public}} van een bericht op {{mail}} <i>Direct</i> te zetten, en dan één of meerdere accounts te vermelden in je bericht. \\u0020 \\u0020\n\\n \\u0020\n\\nBijvoorbeeld: je kan op het profiel van een account op de toot-knop [iconics gmd_edit] klikken en dan de zichtbaarheid veranderen. \\u0020</string>\n    <string name=\"post_privacy_direct\">Direct</string>\n    <string name=\"pref_default_reply_privacy_explanation\">De gekozen zichtbaarheid hangt af van het bericht waarop je reageert.</string>\n    <string name=\"pref_match_default_post_privacy\">Standaardzichtbaarheid overnemen</string>\n    <string name=\"notification_report_description\">Meldingen over rapporten ivm moderatie</string>\n    <string name=\"label_translating\">Aan het vertalen…</string>\n    <string name=\"description_login\">Werkt in de meeste gevallen. Gegevens worden niet met andere apps gedeeld.</string>\n    <string name=\"unmuting_hashtag_success_format\">Hashtag #%1$s niet meer negeren</string>\n    <string name=\"list_exclusive_label\">Van de hoofdtijdlijn verbergen</string>\n    <string name=\"action_view_filter\">Filter bekijken</string>\n    <string name=\"following_hashtag_success_format\">Je volgt nu hashtag #%1$s</string>\n    <string name=\"a11y_label_loading_thread\">Het gesprek wordt geladen</string>\n    <string name=\"ui_error_bookmark\">Bericht als bladwijzer opslaan mislukt: %1$s</string>\n    <string name=\"action_follow_hashtag\">Een nieuwe hashtag volgen</string>\n    <string name=\"action_translate\">Vertalen</string>\n    <string name=\"action_show_original\">Origineel tonen</string>\n    <string name=\"url_copied\">URL gekopieerd</string>\n    <string name=\"confirmation_hashtag_copied\">\\'#%1$s\\' gekopieerd</string>\n    <string name=\"reply_sending\">wordt verstuurd…</string>\n    <string name=\"label_image\">Afbeelding</string>\n    <string name=\"app_theme_system_black\">Systeemthema gebruiken (zwart)</string>\n    <string name=\"pref_default_reply_privacy\">Zichtbaarheid van reacties (niet met de server gesynchroniseerd)</string>\n    <string name=\"ui_error_translate\">Fout bij het vertalen: %1$s</string>\n    <string name=\"error_missing_edits\">Je server weet dat dit bericht bewerkt is, maar kent de bewerkingsgeschiedenis niet, en kan deze dus niet tonen. \n\\n \n\\nDit gaat om <a href=\"https://github.com/mastodon/mastodon/issues/25398\">Mastodon issue #25398</a>.</string>\n    <string name=\"list_reply_policy_list\">Leden van de lijst</string>\n    <string name=\"list_reply_policy_followed\">Iedereen die jij volgt</string>\n    <string name=\"unknown_notification_type\">Onbekend type melding</string>\n    <string name=\"list_reply_policy_label\">Reacties tonen aan</string>\n    <string name=\"label_filter_keywords\">Trefwoorden of zinnen te filteren</string>\n    <string name=\"filter_keyword_addition_title\">Trefwoord toevoegen</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">Accounts die jij niet volgt</string>\n    <string name=\"notification_policies_filter_dont_follow_description\">Tot jij ze handmatig goedkeurt</string>\n    <string name=\"notification_policies_filter_not_following_title\">Accounts die jou niet volgen</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">Nieuwe accounts</string>\n    <string name=\"unknown_notification_filter_new_accounts_description\">Tijdens de laatste 30 dagen aangemaakt</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_title\">Ongewenste privéberichten</string>\n    <string name=\"unknown_notification_filter_moderated_accounts\">Gemodereerde accounts</string>\n    <string name=\"notification_policies_not_supported\">Deze functie werkt enkel op Mastodonservers die v4.3.0 of hoger geïnstalleerd hebben.</string>\n    <string name=\"filtered_notifications\">Gefilterde meldingen</string>\n    <string name=\"notifications_from_people_you_may_know\">Meldingen van %1$d mensen die je misschien kent</string>\n    <string name=\"notification_policy_filter\">Filteren</string>\n    <string name=\"notification_policy_ignore\">Negeren</string>\n    <string name=\"filtered_notifications_title\">Gefilterde meldingen</string>\n    <string name=\"accept_notification_request\">Meldingsverzoek accepteren</string>\n    <string name=\"open_settings\">Instellingen openen</string>\n    <string name=\"notifications_from\">Meldingen van %1$s</string>\n    <string name=\"action_accept_notification_request\">Accepteren</string>\n    <string name=\"notification_policies_filter_out\">Meldingen behandelen van…</string>\n    <string name=\"dismiss_notification_request\">Meldingsverzoek afwijzen</string>\n    <string name=\"notification_policy_accept\">Accepteren</string>\n    <string name=\"unknown_notification_filter_moderated_accounts_description\">Beperkt door de servermoderatoren</string>\n    <string name=\"action_dismiss_notification_request\">Afwijzen</string>\n    <string name=\"reply_sending_long\">Je reactie wordt verstuurd.</string>\n    <string name=\"pref_title_per_timeline_preferences\">Instellingen per tijdlijn</string>\n    <string name=\"label_expires_after\">Geldig tot</string>\n    <string name=\"compose_save_draft_loses_media\">Concept opslaan? (Bijlagen zullen opnieuw geüpload worden, wanneer je je concept herstelt.)</string>\n    <string name=\"description_browser_login\">Kan extra authenticatiemethoden ondersteunen, maar vereist een geschikte browser.</string>\n    <string name=\"muting_hashtag_success_format\">Hashtag #%1$s als waarschuwing negeren</string>\n    <string name=\"unfollowing_hashtag_success_format\">Je volgt hashtag #%1$s niet meer</string>\n    <string name=\"error_blocking_domain\">Negeren van %1$s mislukt: %2$s</string>\n    <string name=\"error_unblocking_domain\">Niet langer negeren van %1$s mislukt: %2$s</string>\n    <string name=\"dialog_follow_warning\">Deze account volgen?</string>\n    <string name=\"pref_title_confirm_follows\">Vraag bevestiging voor het volgen</string>\n    <string name=\"report_category_legal\">Legaal</string>\n    <string name=\"pref_title_show_self_boosts_description\">Deze persoon boost diens eigen bericht</string>\n    <string name=\"pref_title_show_notifications_filter\">Meldingsfilter tonen</string>\n    <string name=\"ui_error_favourite\">Markeren als favoriet is mislukt: %1$s</string>\n    <string name=\"ui_success_rejected_follow_request\">Volgverzoek geblokkeerd</string>\n    <string name=\"title_public_trending_statuses\">Populaire berichten</string>\n    <string name=\"error_deleting_filter\">Fout bij het verwijderen van filter \\'%1$s\\'</string>\n    <string name=\"error_saving_filter\">Fout bij het opslaan van de filter \\'%1$s\\'</string>\n    <string name=\"list_reply_policy_none\">Niemand</string>\n    <string name=\"filter_edit_keyword_title\">Trefwoord bewerken</string>\n    <string name=\"error_media_playback\">Afspelen mislukt: %1$s</string>\n    <string name=\"label_filter_context\">Inhoud filteren</string>\n    <string name=\"pref_title_show_self_boosts\">Boosts van jezelf tonen</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-oc/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">S\\'es produch una error.</string>\n    <string name=\"error_empty\">Aquò pot pas èsser void.</string>\n    <string name=\"error_invalid_domain\">Lo domeni picat es pas valid</string>\n    <string name=\"error_failed_app_registration\">L\\'autenticacion en aquesta instància a fracassat. Se ten de se produire, ensajatz la connexion via Navigador via lo menú.</string>\n    <string name=\"error_no_web_browser_found\">Cap de navegador web pas trobat d’utilizar.</string>\n    <string name=\"error_authorization_unknown\">S\\'es produch una error d\\'autorizacion pas identificada. Se ten de se produire, ensajatz la connexion via Navigador via lo menú.</string>\n    <string name=\"error_authorization_denied\">L\\'autorizacion es estada regetada.</string>\n    <string name=\"error_retrieving_oauth_token\">Fracàs de l’obtencion del geton d\\'iniciacion de session.</string>\n    <string name=\"error_compose_character_limit\">La publicacion es tròp longa !</string>\n    <string name=\"error_media_upload_type\">Aqueste tip de fichièr se pòt pas mandar.</string>\n    <string name=\"error_media_upload_opening\">Aqueste tip de fichièr se pòt pas dobrir.</string>\n    <string name=\"error_media_upload_permission\">Cal permís de lectura del mèdia.</string>\n    <string name=\"error_media_download_permission\">Cal pemís d\\'escritura dins lo mèdia.</string>\n    <string name=\"error_media_upload_image_or_video\">Se pòt pas ajustar imatges e una vidèo dins la meteissa publicacion.</string>\n    <string name=\"error_media_upload_sending\">Fracàs en mandant.</string>\n    <string name=\"error_sender_account_gone\">Error en enviant la publicacion.</string>\n    <string name=\"title_home\">Acuèlh</string>\n    <string name=\"title_notifications\">Notificacions</string>\n    <string name=\"title_public_federated\">Federacion</string>\n    <string name=\"title_view_thread\">Fil</string>\n    <string name=\"title_posts\">Pòstes</string>\n    <string name=\"title_posts_with_replies\">Amb responsas</string>\n    <string name=\"title_follows\">Abonament</string>\n    <string name=\"title_followers\">Seguidors</string>\n    <string name=\"title_favourites\">Preferits</string>\n    <string name=\"title_mutes\">Utilizaires silenciats</string>\n    <string name=\"title_blocks\">Utilizaires blocats</string>\n    <string name=\"title_follow_requests\">Demandas d’abonament</string>\n    <string name=\"title_edit_profile\">Modificar lo perfil</string>\n    <string name=\"title_drafts\">Borrolhons</string>\n    <string name=\"title_licenses\">Licéncias</string>\n    <string name=\"post_boosted_format\">%1$s a partejat</string>\n    <string name=\"post_sensitive_media_title\">Contengut sensible</string>\n    <string name=\"post_media_hidden_title\">Mèdia amagat</string>\n    <string name=\"post_sensitive_media_directions\">Clicar per mostrar</string>\n    <string name=\"post_content_warning_show_more\">Mostrar mai</string>\n    <string name=\"post_content_warning_show_less\">Mostrar mens</string>\n    <string name=\"post_content_show_more\">Desplegar</string>\n    <string name=\"post_content_show_less\">Replegar</string>\n    <string name=\"footer_empty\">I a pas res aquí. Davalatz per actualizar !</string>\n    <string name=\"notification_reblog_format\">%1$s a partejat vòstra publicacion</string>\n    <string name=\"notification_favourite_format\">%1$s a aimat vòstra publicacion</string>\n    <string name=\"notification_follow_format\">%1$s vos sèc</string>\n    <string name=\"report_username_format\">Denonciar @%1$s</string>\n    <string name=\"report_comment_hint\">Cap comentari addicional ?</string>\n    <string name=\"action_quick_reply\">Responsa rapida</string>\n    <string name=\"action_reply\">Respondre</string>\n    <string name=\"action_reblog\">Partejar</string>\n    <string name=\"action_favourite\">Aimar</string>\n    <string name=\"action_more\">Mai</string>\n    <string name=\"action_compose\">Redactar</string>\n    <string name=\"action_login\">Començar la session amb Tusky</string>\n    <string name=\"action_logout\">Tampar la session</string>\n    <string name=\"action_logout_confirm\">Volètz vertadièrament vos desconnectar del compte %1$s ?\n\\nAquò suprimirà totas las donadas localas del compte, tanben los borrolhons e las preferéncias.</string>\n    <string name=\"action_follow\">Seguir</string>\n    <string name=\"action_unfollow\">Quitar de seguir</string>\n    <string name=\"action_block\">Blocar</string>\n    <string name=\"action_unblock\">Quitar de blocar</string>\n    <string name=\"action_hide_reblogs\">Rescondre los partatges</string>\n    <string name=\"action_show_reblogs\">Mostrar los retuts</string>\n    <string name=\"action_report\">Senhalar</string>\n    <string name=\"action_delete\">Escafar</string>\n    <string name=\"action_send\">TUT</string>\n    <string name=\"action_send_public\">TUT !</string>\n    <string name=\"action_retry\">Tornar ensajar</string>\n    <string name=\"action_close\">Tampar</string>\n    <string name=\"action_view_profile\">Perfil</string>\n    <string name=\"action_view_preferences\">Preferéncias</string>\n    <string name=\"action_view_favourites\">Preferits</string>\n    <string name=\"action_view_mutes\">Utilizaires silenciats</string>\n    <string name=\"action_view_blocks\">Utilizaires blocats</string>\n    <string name=\"action_view_follow_requests\">Demandas d’abonament</string>\n    <string name=\"action_view_media\">Mèdia</string>\n    <string name=\"action_open_in_web\">Dobrir al navegador</string>\n    <string name=\"action_add_media\">Ajustar un mèdia</string>\n    <string name=\"action_photo_take\">Prendre una fotografia</string>\n    <string name=\"action_share\">Partejar</string>\n    <string name=\"action_mute\">Silenciar</string>\n    <string name=\"action_unmute\">Quitar de silenciar</string>\n    <string name=\"action_mention\">Mencionar</string>\n    <string name=\"action_hide_media\">Amagar los mèdias</string>\n    <string name=\"action_open_drawer\">Dobrir lo repertòri</string>\n    <string name=\"action_save\">Enregistrar</string>\n    <string name=\"action_edit_profile\">Modificar lo perfil</string>\n    <string name=\"action_edit_own_profile\">Modificar</string>\n    <string name=\"action_undo\">Anullar</string>\n    <string name=\"action_accept\">Acceptar</string>\n    <string name=\"action_reject\">Regetar</string>\n    <string name=\"action_search\">Cercar</string>\n    <string name=\"action_access_drafts\">Borrolhons</string>\n    <string name=\"action_toggle_visibility\">Visibilitat de la publicacion</string>\n    <string name=\"action_content_warning\">Avis de contengut</string>\n    <string name=\"action_emoji_keyboard\">Clavièr Emoji</string>\n    <string name=\"download_image\">Telecargament %1$s</string>\n    <string name=\"action_copy_link\">Copiar lo ligam</string>\n    <string name=\"send_post_link_to\">Partejar l\\'URL del tut amb…</string>\n    <string name=\"send_post_content_to\">Partejar vòstre tut amb…</string>\n    <string name=\"send_media_to\">Partejar l’imatge amb…</string>\n    <string name=\"confirmation_reported\">Enviat !</string>\n    <string name=\"confirmation_unblocked\">Utilizaire desblocat</string>\n    <string name=\"confirmation_unmuted\">Utilizaire sortit del silenci</string>\n    <string name=\"hint_domain\">Quina instància ?</string>\n    <string name=\"hint_compose\">A de qué pensatz ?</string>\n    <string name=\"hint_content_warning\">Avís de contengut</string>\n    <string name=\"hint_display_name\">Nom visible</string>\n    <string name=\"hint_note\">Biografia</string>\n    <string name=\"hint_search\">Cercar…</string>\n    <string name=\"search_no_results\">I a pas cap de resulat</string>\n    <string name=\"label_quick_reply\">Responsa…</string>\n    <string name=\"label_header\">Bandièra</string>\n    <string name=\"link_whats_an_instance\">Que es una instància ?</string>\n    <string name=\"login_connection\">Connexion…</string>\n    <string name=\"dialog_whats_an_instance\">Aquí podètz picar l\\'adreça o domini de quina que siá instància, \\u0020coma mastodont.cat, mastodon.social, icosahedron.website o \\u0020<a href=\"https://instances.social\">fòrca mai !</a> \n\\n \n\\nSi encara non avètz cap de compte, podètz picar lo nom de l’instància ont vos agradariá \\u0020anar e crear un compte enlà. \n\\n \n\\n \n\\n \n\\nAvètz mas d’informacins a <a href=\"https://joinmastodon.org\">joinmastodon.org</a>. \\u0020</string>\n    <string name=\"dialog_title_finishing_media_upload\">Finalizacion del mandadís del mèdia</string>\n    <string name=\"dialog_message_uploading_media\">Mandadís…</string>\n    <string name=\"dialog_download_image\">Telecargar</string>\n    <string name=\"dialog_message_cancel_follow_request\">Anullar la demandar d’abonament ?</string>\n    <string name=\"dialog_unfollow_warning\">Volètz quitar de seguir aqueste compte ?</string>\n    <string name=\"dialog_delete_post_warning\">Suprimir aqueste tut ?</string>\n    <string name=\"visibility_public\">Publica : es visibla a la cronologia publica</string>\n    <string name=\"visibility_unlisted\">Pas listada :es pas visibla a las cronologias publicas</string>\n    <string name=\"visibility_private\">Solament seguidors : pas que visibla pels vòstres seguidors</string>\n    <string name=\"visibility_direct\">Dirècta : pas que visibla al monde mencionats</string>\n    <string name=\"pref_title_edit_notification_settings\">Modificar las notificacions</string>\n    <string name=\"pref_title_notifications_enabled\">Modificar las notificacions</string>\n    <string name=\"pref_title_notification_alerts\">Alèrtas</string>\n    <string name=\"pref_title_notification_alert_sound\">Notificar amb un son</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Notificra amb una vibracion</string>\n    <string name=\"pref_title_notification_alert_light\">Notificar amb lo lum led</string>\n    <string name=\"pref_title_notification_filters\">Tipes de notificacion activats</string>\n    <string name=\"pref_title_appearance_settings\">Aparéncia</string>\n    <string name=\"pref_title_app_theme\">Tèma de l’app</string>\n    <string name=\"app_them_dark\">Escur</string>\n    <string name=\"app_theme_light\">Luminós</string>\n    <string name=\"app_theme_black\">Negre</string>\n    <string name=\"app_theme_auto\">Alba automatica</string>\n    <string name=\"pref_title_browser_settings\">Navegador</string>\n    <string name=\"pref_title_custom_tabs\">Onglets personalizats de Chrome</string>\n    <string name=\"pref_title_post_filter\">Filtre de la cronologia</string>\n    <string name=\"pref_title_post_tabs\">Fil principal</string>\n    <string name=\"pref_title_show_boosts\">Mostrar los retuts</string>\n    <string name=\"pref_title_show_replies\">Mostrar las responsas</string>\n    <string name=\"pref_title_show_media_preview\">Mostrar los apercebuts</string>\n    <string name=\"pref_title_http_proxy_settings\">Proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_enable\">Activar lo proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_server\">Servidor proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_port\">Pòrt del servidor proxy HTTP</string>\n    <string name=\"pref_default_post_privacy\">Privacitat dels tuts (alinhat sul servidor)</string>\n    <string name=\"pref_publishing\">Publicacion predeterminada</string>\n    <string name=\"post_privacy_public\">Publica</string>\n    <string name=\"post_privacy_unlisted\">Pas listat</string>\n    <string name=\"post_privacy_followers_only\">Seguidors solament</string>\n    <string name=\"pref_post_text_size\">Talha de text de l\\'estatut</string>\n    <string name=\"post_text_size_smallest\">Mendre</string>\n    <string name=\"post_text_size_small\">Pichona</string>\n    <string name=\"post_text_size_medium\">Mejana</string>\n    <string name=\"post_text_size_large\">Granda</string>\n    <string name=\"post_text_size_largest\">Grandassa</string>\n    <string name=\"notification_mention_name\">Mencions nòvas</string>\n    <string name=\"notification_mention_descriptions\">Notificacions de mencions noves</string>\n    <string name=\"notification_follow_name\">Seguidors nòus</string>\n    <string name=\"notification_follow_description\">Notificacions de nòus seguidors</string>\n    <string name=\"notification_boost_name\">Retuts</string>\n    <string name=\"notification_boost_description\">Notificacions de compartiment de vòstras publicacions</string>\n    <string name=\"notification_favourite_name\">Preferits</string>\n    <string name=\"notification_favourite_description\">Notificacions s’agradan vòstres tuts</string>\n    <string name=\"notification_mention_format\">%1$s vos mencionan</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s e %4$d mai</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s e %3$s</string>\n    <string name=\"notification_summary_small\">%1$s e %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d interaccion nòva</item>\n        <item quantity=\"other\">%1$d interaccions nòvas</item>\n    </plurals>\n    <string name=\"description_account_locked\">Compte blocat</string>\n    <string name=\"about_title_activity\">A prepaus</string>\n    <string name=\"about_tusky_license\">Tusky es programa gratuit, liure e de còdi dobèrt. Es publicat jols tèrmes de la licéncia publica generala GNU version 3. Podètz trobar les licéncia aquí : https://www.gnu.org/licenses/gpl-3.0.ca.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">Site web del projècte : https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Rapòrts d\\'errors e demandas de foncionalitats :\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Perfil de Tusky</string>\n    <string name=\"post_share_content\">Partejar lo contengut del tut</string>\n    <string name=\"post_share_link\">Partejar lo ligam del tut</string>\n    <string name=\"post_media_images\">Imatges</string>\n    <string name=\"post_media_video\">Vidèo</string>\n    <string name=\"state_follow_requested\">Demanda d’abonament</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">en %1$d ans</string>\n    <string name=\"abbreviated_in_days\">en %1$dd</string>\n    <string name=\"abbreviated_in_hours\">en %1$dh</string>\n    <string name=\"abbreviated_in_minutes\">en %1$dm</string>\n    <string name=\"abbreviated_in_seconds\">en %1$ds</string>\n    <string name=\"abbreviated_years_ago\">%1$d ans</string>\n    <string name=\"follows_you\">Vos sèc</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Mostrar totjorn los mèdias sensibles</string>\n    <string name=\"title_media\">Mèdia</string>\n    <string name=\"replying_to\">En responsa a @%1$s</string>\n    <string name=\"load_more_placeholder_text\">Cargar mai</string>\n    <string name=\"add_account_name\">Apondre un compte</string>\n    <string name=\"add_account_description\">Apondre un nòu compte Mastodon</string>\n    <string name=\"action_lists\">Listas</string>\n    <string name=\"title_lists\">Listas</string>\n    <string name=\"compose_active_account_description\">Publicar coma %1$s</string>\n    <string name=\"action_set_caption\">Apondre una legenda</string>\n    <string name=\"action_remove\">Levar</string>\n    <string name=\"lock_account_label\">Clavar lo compte</string>\n    <string name=\"lock_account_label_description\">Demanda que validetz manualament los seguidors</string>\n    <string name=\"compose_save_draft\">Salvar lo borrolhon ?</string>\n    <string name=\"send_post_notification_title\">Mandadís del tut…</string>\n    <string name=\"send_post_notification_error_title\">Error en enviar lo tut</string>\n    <string name=\"send_post_notification_channel_name\">Mandadís dels tuts</string>\n    <string name=\"send_post_notification_cancel_title\">Mandadís anullat</string>\n    <string name=\"send_post_notification_saved_content\">Una còpia del tut es estat salvat dins los borrolhons</string>\n    <string name=\"action_compose_shortcut\">Redactar</string>\n    <string name=\"error_no_custom_emojis\">L’instància %1$s es pas compatibla amb los emoji personalizats</string>\n    <string name=\"emoji_style\">Estil dels Emoji</string>\n    <string name=\"system_default\">Çò del sistèma</string>\n    <string name=\"download_fonts\">D’en primièr vos cal telecargar los emojis seguents</string>\n    <string name=\"performing_lookup_title\">Recèrca…</string>\n    <string name=\"expand_collapse_all_posts\">Desplegar/Plegar totes los estatuts</string>\n    <string name=\"action_open_post\">Dobrir lo tut</string>\n    <string name=\"restart_required\">Reaviada necessària</string>\n    <string name=\"restart_emoji\">Vos caldrà reaviar Tusky per aplicar aquestes cambiaments</string>\n    <string name=\"later\">Mai tard</string>\n    <string name=\"restart\">Reaviar</string>\n    <string name=\"caption_systememoji\">Los emoji per defaut de vòstre aparelh</string>\n    <string name=\"caption_blobmoji\">Emoji basats en Blob emojis coneguts d\\'Android 4.4–7.1</string>\n    <string name=\"caption_twemoji\">Emoji estandards de Mastodon</string>\n    <string name=\"download_failed\">Fracàs del telecargament</string>\n    <string name=\"profile_badge_bot_text\">Robòt</string>\n    <string name=\"account_moved_description\">%1$s mudèt los catons a :</string>\n    <string name=\"reblog_private\">Partejar al public d’origina</string>\n    <string name=\"unreblog_private\">Quitar de partejar</string>\n    <string name=\"license_description\">Tusky content de còdis e compausants dels projèctes liures seguents :</string>\n    <string name=\"license_apache_2\">Licéncia Apache License (còpia çai-jos)</string>\n    <string name=\"profile_metadata_label\">Metadonada del perfil</string>\n    <string name=\"profile_metadata_add\">Contengut</string>\n    <string name=\"profile_metadata_label_label\">Nom</string>\n    <string name=\"profile_metadata_content_label\">Contengut</string>\n    <string name=\"pref_title_absolute_time\">Utilizar lo format de temps absolut</string>\n    <string name=\"label_remote_account\">Las informacions çai-jos son pas lo rebat del perfil complèt de l’utilizaire. Tocatz per dobrir lo perfil complèt dins lo navigador.</string>\n    <string name=\"unpin_action\">Tirar del perfil</string>\n    <string name=\"pin_action\">Penjar</string>\n    <string name=\"error_network\">Una error ret s’es producha. Mercés de verificar la connexion e tornar ensajar.</string>\n    <string name=\"title_public_local\">Local</string>\n    <string name=\"title_direct_messages\">Messatges dirèctes</string>\n    <string name=\"title_tab_preferences\">Onglets</string>\n    <string name=\"title_posts_pinned\">Penjats</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"message_empty\">Pas res aicí.</string>\n    <string name=\"action_unreblog\">Suprimir lo partatge</string>\n    <string name=\"action_unfavourite\">Suprimir lo favorit</string>\n    <string name=\"action_view_account_preferences\">Preferéncias del compte</string>\n    <string name=\"action_add_tab\">Ajustar un onglet</string>\n    <string name=\"action_links\">Ligams</string>\n    <string name=\"action_mentions\">Mencions</string>\n    <string name=\"action_hashtags\">Etiquetas</string>\n    <string name=\"action_open_reblogger\">Dobrir l’autor del partatge</string>\n    <string name=\"action_open_reblogged_by\">Mostrar los retuts</string>\n    <string name=\"action_open_faved_by\">Mostrar los favorits</string>\n    <string name=\"title_hashtags_dialog\">Etiquetas</string>\n    <string name=\"title_mentions_dialog\">Mencions</string>\n    <string name=\"title_links_dialog\">Ligams</string>\n    <string name=\"action_open_media_n\">Dobrir lo mèdia #%1$d</string>\n    <string name=\"action_open_as\">Dobrir coma %1$s</string>\n    <string name=\"action_share_as\">Partejar coma…</string>\n    <string name=\"download_media\">Telecargar lo mèdia</string>\n    <string name=\"downloading_media\">Telecargament del mèdia</string>\n    <string name=\"label_avatar\">Avatar</string>\n    <string name=\"pref_title_timelines\">Flux d’actualitats</string>\n    <string name=\"pref_title_timeline_filters\">Filtres</string>\n    <string name=\"pref_title_language\">Lenga</string>\n    <string name=\"pref_title_proxy_settings\">Servidor mandatari</string>\n    <string name=\"pref_default_media_sensitivity\">Totjorn marcar los mèdias coma sensibles (alinhat sul servidor)</string>\n    <string name=\"pref_failed_to_sync\">Fracàs de la sincronizacion de las preferéncias</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"abbreviated_days_ago\">%1$dd</string>\n    <string name=\"abbreviated_hours_ago\">%1$dh</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"pref_title_public_filter_keywords\">Flux publics</string>\n    <string name=\"pref_title_thread_filter_keywords\">Discutidas</string>\n    <string name=\"filter_addition_title\">Ajustar un filtre</string>\n    <string name=\"filter_edit_title\">Modificar un filtre</string>\n    <string name=\"filter_dialog_remove_button\">Suprimir</string>\n    <string name=\"filter_dialog_update_button\">Actualizar</string>\n    <string name=\"filter_add_description\">Frasa de filtrar</string>\n    <string name=\"error_create_list\">Creacion impossibla de la lsita</string>\n    <string name=\"error_rename_list\">Impossible d’actualizar la lista</string>\n    <string name=\"error_delete_list\">Supression impossibla de la lista</string>\n    <string name=\"action_create_list\">Crear una lista</string>\n    <string name=\"action_rename_list\">Actualizar la lista</string>\n    <string name=\"action_delete_list\">Suprimir la lista</string>\n    <string name=\"hint_search_people_list\">Cercar lo monde que seguètz</string>\n    <string name=\"action_add_to_list\">Ajustar un compte a la lista</string>\n    <string name=\"action_remove_from_list\">Suprimir aqueste compte de la lista</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Descriure lo contengut pels mal vesents (%1$d caractèr maximum)</item>\n        <item quantity=\"other\">Descriure los contenguts pels mal vesents (%1$d caractèrs maximum)</item>\n    </plurals>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> Favorit</item>\n        <item quantity=\"other\"><b>%1$s</b> Favorits</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> Partatge</item>\n        <item quantity=\"other\"><b>%1$s</b> Partatges</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">Partejat per</string>\n    <string name=\"title_favourited_by\">Aimat per</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s e %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s e %3$d mai</string>\n    <string name=\"description_post_media\">Mèdia : %1$s</string>\n    <string name=\"description_post_cw\">Avertiment : %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Cap de descripcion</string>\n    <string name=\"description_post_reblogged\">Repartajat</string>\n    <string name=\"description_post_favourited\">Mes en favorit</string>\n    <string name=\"description_visibility_public\">Publica</string>\n    <string name=\"description_visibility_unlisted\">Pas listada</string>\n    <string name=\"description_visibility_private\">Seguidors</string>\n    <string name=\"description_visibility_direct\">Dirècte</string>\n    <string name=\"hint_list_name\">Nom de la lista</string>\n    <string name=\"pick_hashtag_hint\">Etiquetas sens #</string>\n    <string name=\"compose_shortcut_long_label\">Escriure una publicacion</string>\n    <string name=\"compose_shortcut_short_label\">Redactar</string>\n    <string name=\"action_delete_and_redraft\">Suprimir e reformular</string>\n    <string name=\"dialog_redraft_post_warning\">Suprimir e reformular aqueste tut ?</string>\n    <string name=\"app_theme_system\">Utilizar lo tèma sistèma</string>\n    <string name=\"notifications_clear\">Suprimir</string>\n    <string name=\"notifications_apply_filter\">Filtrar</string>\n    <string name=\"filter_apply\">Aplicar</string>\n    <string name=\"pref_title_bot_overlay\">Mostrar coma indicator pels robòts</string>\n    <string name=\"notification_clear_text\">Netejar totas las notificacions d’un biais permanent ?</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s vòte</item>\n        <item quantity=\"other\">%1$s votes</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">S’acaba a %1$s</string>\n    <string name=\"poll_info_closed\">acabat</string>\n    <string name=\"poll_vote\">Votar</string>\n    <string name=\"notification_poll_name\">Resultats del sondatge</string>\n    <string name=\"notification_poll_description\">Notificacion de sondatges tampats</string>\n    <string name=\"poll_info_format\">%1$s • %2$s</string>\n    <string name=\"poll_ended_voted\">Un sondatge ont avètz votat es acabat</string>\n    <string name=\"poll_ended_created\">Un sondatge qu’avètz creat es acabat</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d jorn restant</item>\n        <item quantity=\"other\">%1$d jorns restant</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d ora restant</item>\n        <item quantity=\"other\">%1$d oras restant</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d minuta restant</item>\n        <item quantity=\"other\">%1$d minutas restant</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d segonda restant</item>\n        <item quantity=\"other\">%1$d segondas restant</item>\n    </plurals>\n    <string name=\"compose_preview_image_description\">Accions per l’imatge %1$s</string>\n    <string name=\"pref_title_animate_gif_avatars\">Activar l’animacion dels avatars</string>\n    <string name=\"caption_notoemoji\">Jòc d’emoji actuals de Google</string>\n    <string name=\"description_poll\">Sondatge amb opcion : %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"button_continue\">Contunhar</string>\n    <string name=\"button_back\">Tornar</string>\n    <string name=\"button_done\">Acabat</string>\n    <string name=\"report_sent_success\">\\@%1$s corrèctament senhalat</string>\n    <string name=\"hint_additional_info\">Comentaris suplementaris</string>\n    <string name=\"report_remote_instance\">Transferir a %1$s</string>\n    <string name=\"failed_report\">Fracàs del senhalament</string>\n    <string name=\"failed_fetch_posts\">Recuperacion dels estatuts impossibla</string>\n    <string name=\"report_description_1\">Lo senhalament serà enviat a vòstres moderators de servidor. Podètz fornir una explicacion de perque senhalatz lo compte çai-jos :</string>\n    <string name=\"report_description_remote_instance\">Aqueste compte es en un autre servidor. Enviar una còpia anonimizada del senhalament ?</string>\n    <string name=\"title_domain_mutes\">Domenis resconduts</string>\n    <string name=\"action_view_domain_mutes\">Domenis resconduts</string>\n    <string name=\"action_mute_domain\">Rescondre %1$s</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s es pas mai rescondut</string>\n    <string name=\"mute_domain_warning\">Volètz vertadièrament blocar complètament %1$s ? Veiretz pas mai de contengut venent d’aqueste domeni, nimai los flux d’actualitat o las notificacion. Vòstres seguidors d’aqueste domeni seràn tirats.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Rescondre tot lo domeni</string>\n    <string name=\"filter_dialog_whole_word\">Mot complèt</string>\n    <string name=\"filter_dialog_whole_word_description\">Quand un mot clau o una frasa es solament alfanumeric, serà pas qu’aplicat se correspond al mot complèt</string>\n    <string name=\"pref_title_alway_open_spoiler\">Totjorn desplegar las publicacions marcadas amb un avertiment de contengut</string>\n    <string name=\"title_accounts\">Comptes</string>\n    <string name=\"failed_search\">Fracàs de la recèrca</string>\n    <string name=\"action_add_poll\">Ajustar un sondatge</string>\n    <string name=\"create_poll_title\">Sondatge</string>\n    <string name=\"duration_5_min\">5 minutas</string>\n    <string name=\"duration_30_min\">30 minutas</string>\n    <string name=\"duration_1_hour\">1 ora</string>\n    <string name=\"duration_6_hours\">6 oras</string>\n    <string name=\"duration_1_day\">1 jorn</string>\n    <string name=\"duration_3_days\">3 jorns</string>\n    <string name=\"duration_7_days\">7 jorns</string>\n    <string name=\"add_poll_choice\">Ajustar d’opcions</string>\n    <string name=\"poll_allow_multiple_choices\">Opcions multiplas</string>\n    <string name=\"poll_new_choice_hint\">Opcion %1$d</string>\n    <string name=\"edit_poll\">Modificar</string>\n    <string name=\"title_scheduled_posts\">Tuts planificats</string>\n    <string name=\"action_edit\">Modificar</string>\n    <string name=\"action_access_scheduled_posts\">Tuts planificats</string>\n    <string name=\"action_schedule_post\">Planificar de tuts</string>\n    <string name=\"action_reset_schedule\">Escafar</string>\n    <string name=\"post_lookup_error_format\">Error en cercant la publicacion %1$s</string>\n    <string name=\"about_powered_by_tusky\">Propulsat per Tusky</string>\n    <string name=\"title_bookmarks\">Marcapaginas</string>\n    <string name=\"action_bookmark\">Ajustar als marcapaginas</string>\n    <string name=\"action_view_bookmarks\">Marcapaginas</string>\n    <string name=\"description_post_bookmarked\">Ajustat als marcapaginas</string>\n    <string name=\"select_list_title\">Seleccionar la list</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"no_drafts\">Avètz pas cap de borrolhon.</string>\n    <string name=\"no_scheduled_posts\">Avètz pas cap de tut planificat.</string>\n    <string name=\"warning_scheduling_interval\">L’interval minimum de planificacion sus Mastodon e de 5 minutas.</string>\n    <string name=\"notification_follow_request_name\">Demandas d’abonament</string>\n    <string name=\"hashtags\">Etiquetas</string>\n    <string name=\"action_unmute_desc\">Amagar pas mai a %1$s</string>\n    <string name=\"notification_follow_request_format\">%1$s a demandat a vos seguir</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Mostrar los apercebuts dels ligams</string>\n    <string name=\"notification_subscription_description\">Notificacions quand qualqu’un que seguissètz publica una publicacion novèla</string>\n    <string name=\"dialog_delete_conversation_warning\">Suprimir aquesta conversacion ?</string>\n    <string name=\"notification_subscription_format\">%1$s ven de publicar</string>\n    <string name=\"action_unsubscribe_account\">Quitar de seguir</string>\n    <string name=\"action_subscribe_account\">Seguir</string>\n    <string name=\"draft_deleted\">Borrolhon suprimit</string>\n    <string name=\"drafts_failed_loading_reply\">Fracàs del cargament de las info de responsa</string>\n    <string name=\"drafts_post_failed_to_send\">Fracàs de l’enviament !</string>\n    <string name=\"dialog_delete_list_warning\">Volètz vertadièrament suprimir la lista %1$s ?</string>\n    <string name=\"review_notifications\">Repassar las notificacions</string>\n    <string name=\"account_note_saved\">Enregistrat !</string>\n    <string name=\"account_note_hint\">Vòstra nòta privada tocant aqueste compte</string>\n    <string name=\"no_announcements\">I a pas cap d’anóncia.</string>\n    <string name=\"duration_indefinite\">Infinit</string>\n    <string name=\"label_duration\">Durada</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s persona</item>\n        <item quantity=\"other\">%1$s personas</item>\n    </plurals>\n    <string name=\"add_hashtag_title\">Apondre hashtag</string>\n    <string name=\"post_media_attachments\">Pèças juntas</string>\n    <string name=\"post_media_audio\">Àudio</string>\n    <string name=\"notification_subscription_name\">Publicacions novèlas</string>\n    <string name=\"notification_follow_request_description\">Notificacions de demandas de seguiment</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Enbàs</string>\n    <string name=\"pref_main_nav_position_option_top\">Ennaut</string>\n    <string name=\"pref_main_nav_position\">Posicion de navigacion principala</string>\n    <string name=\"pref_title_animate_custom_emojis\">Emoji animats personalizats</string>\n    <string name=\"pref_title_gradient_for_media\">Afichar un degradat colorat pels mèdias amagats</string>\n    <string name=\"dialog_mute_warning\">Amagar @%1$s ?</string>\n    <string name=\"dialog_block_warning\">Blocar @%1$s ?</string>\n    <string name=\"dialog_mute_hide_notifications\">Amagar las notificacions</string>\n    <string name=\"action_unmute_conversation\">Amagar pas mai la conversacion</string>\n    <string name=\"action_mute_conversation\">Amagar la conversacion</string>\n    <string name=\"action_unmute_domain\">Amagar pas mai a %1$s</string>\n    <string name=\"action_delete_conversation\">Suprimir la conversacion</string>\n    <string name=\"title_announcements\">Anóncias</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Podètz pas enviar mai de %1$d pèça junta.</item>\n        <item quantity=\"other\">Podètz pas enviar mai de %1$d pèças juntas.</item>\n    </plurals>\n    <string name=\"wellbeing_hide_stats_profile\">Amagar las estatisticas dels perfils</string>\n    <string name=\"wellbeing_hide_stats_posts\">Amagar las estatisticas dels tuts</string>\n    <string name=\"limit_notifications\">Limitar las notificacions de la cronologia</string>\n    <string name=\"pref_title_hide_top_toolbar\">Amagar lo títol ennaut de la barra</string>\n    <string name=\"pref_title_confirm_reblogs\">Afichar una confirmacion abans de partejar</string>\n    <string name=\"action_unbookmark\">Tirar dels marcapaginas</string>\n    <string name=\"action_add_reaction\">apondre una reaccion</string>\n    <string name=\"notification_sign_up_name\">Comptes novèls</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"failed_to_pin\">Fracàs en penjant</string>\n    <string name=\"failed_to_unpin\">Fracàs en despenjant</string>\n    <string name=\"description_post_language\">Lenga de la publicacion</string>\n    <string name=\"title_login\">Se desconnectar</string>\n    <string name=\"pref_show_self_username_always\">Totjorn</string>\n    <string name=\"pref_show_self_username_never\">Jamai</string>\n    <string name=\"notification_update_name\">Publicacions modificadas</string>\n    <string name=\"status_count_one_plus\">&gt;1</string>\n    <string name=\"duration_14_days\">14 jorns</string>\n    <string name=\"duration_30_days\">30 jorns</string>\n    <string name=\"error_following_hashtag_format\">Error en seguissent #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Error en quitant de seguir #%1$s</string>\n    <string name=\"notification_sign_up_format\">%1$s a creat un compte</string>\n    <string name=\"notification_update_format\">%1$s a modificat sa publicacion</string>\n    <string name=\"action_dismiss\">Ignorar</string>\n    <string name=\"action_details\">Detalhs</string>\n    <string name=\"action_edit_image\">Modificar l’imatge</string>\n    <string name=\"instance_rule_title\">%1$s règlas</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Compausar una publicacion</string>\n    <string name=\"account_date_joined\">Arribada del %1$s</string>\n    <string name=\"saving_draft\">Enregistrament del borrolhon…</string>\n    <string name=\"error_image_edit_failed\">Se podiá pas modificar l’imatge.</string>\n    <string name=\"pref_title_wellbeing_mode\">Benestar</string>\n    <string name=\"duration_no_change\">(Cap de modificacion)</string>\n    <string name=\"error_loading_account_details\">Fracàs del cargament dels detalhs del compte</string>\n    <string name=\"error_could_not_load_login_page\">Cargament impossible de la pagina de connexion.</string>\n    <string name=\"duration_60_days\">60 jorns</string>\n    <string name=\"duration_90_days\">90 jorns</string>\n    <string name=\"duration_180_days\">180 jorns</string>\n    <string name=\"duration_365_days\">365 jorns</string>\n    <string name=\"error_multimedia_size_limit\">Los fichièrs video e àudio pòdon pas despassar %1$s.</string>\n    <string name=\"action_add_or_remove_from_list\">Apondre o suprimir de la lista</string>\n    <string name=\"set_focus_description\">Tocatz o lisatz lo cercle per causir lo punt focal que deu aparéisser sus las miniaturas.</string>\n    <string name=\"no_lists\">Avètz pas cap de lista.</string>\n    <string name=\"pref_title_show_self_username\">Mostrar lo nom d’utilizaire dins la barra d’aisinas</string>\n    <string name=\"pref_show_self_username_disambiguate\">Quand mai d’un compte es connectat</string>\n    <string name=\"action_set_focus\">Posicionar lo punt focal</string>\n    <string name=\"pref_title_confirm_favourites\">Demandar confirmacion abans d’apondre en favorit</string>\n    <string name=\"error_following_hashtags_unsupported\">Aquesta instància pren pas en carga l’abonament a las etiquetas.</string>\n    <string name=\"title_followed_hashtags\">Etiquetas seguidas</string>\n    <string name=\"confirmation_hashtag_unfollowed\">#%1$s pas mai seguit</string>\n    <string name=\"delete_scheduled_post_warning\">Suprimir la publicacion programada ?</string>\n    <string name=\"drafts_post_reply_removed\">La publicacion a la quala respondiá lo borrolhon foguèt suprimida</string>\n    <string name=\"instance_rule_info\">En vos connectant acceptatz las règlas de %1$s.</string>\n    <string name=\"action_unfollow_hashtag_format\">Quitar de seguir #%1$s ?</string>\n    <string name=\"status_created_at_now\">ara</string>\n    <string name=\"notification_report_format\">Senhalament novèl sus %1$s</string>\n    <string name=\"notification_header_report_format\">%1$s a senhalat %2$s</string>\n    <string name=\"notification_report_name\">Senhalaments</string>\n    <string name=\"report_category_violation\">Violacion de las règlas</string>\n    <string name=\"report_category_other\">Autre</string>\n    <string name=\"failed_to_add_to_list\">Fracàs de l’apondon del compte a la lista</string>\n    <string name=\"failed_to_remove_from_list\">Fracàs de la supression del compte de la lista</string>\n    <string name=\"notification_sign_up_description\">Notificacions quand qualqu’un crèa un compte novèl</string>\n    <string name=\"notification_report_description\">Notificacions a prepaus dels senhalament a la moderacion</string>\n    <string name=\"notification_update_description\">Notificacions quand una publicacion ont avètz reagit es modificada</string>\n    <string name=\"follow_requests_info\">Malgrat que vòstre compte siá pas verrolhat, l\\'equipa de %1$s a pensat que volriatz validar manualament las demandas de d\\'abonament provenent d\\'aqueles comptes.</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Activar lo limpament per se desplaçar demest los onglets</string>\n    <string name=\"compose_save_draft_loses_media\">Enregistrar lo borrolhon ? (Las pèças juntas seràn enviadas tornamai quand restauretz lo borrolhon.)</string>\n    <string name=\"pref_default_post_language\">Lenga de publicacion (alinhat sul servidor)</string>\n    <string name=\"report_category_spam\">Messatge indesirable</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"wellbeing_mode_notice\">D\\'unas informacions susceptiblas d\\'afectar vòstre benestar mental seràn amagadas. S\\'agís :\n\\n\n\\n - de notificacions de favorits, de partatge e de seguiment\n\\n - del nombre dels favorits/partatges de las publicacions\n\\n - de las estatisticas suls perfils\n\\n\n\\n Las notificacions « push » seràn pas afectadas, mas podètz reveire vòstras preferéncias de notificacion manualament.</string>\n    <string name=\"hint_media_description_missing\">Los mèdias devon aver una descripcion.</string>\n    <string name=\"pref_title_http_proxy_port_message\">Lo pòrt deu èsser entre %1$d e %2$d</string>\n    <string name=\"error_muting_hashtag_format\">Fracàs en silenciant #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Fracàs en quitant de silenciar #%1$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d publicacions juntadas</string>\n    <string name=\"post_edited\">%1$s modificat</string>\n    <string name=\"description_post_edited\">Modificada</string>\n    <string name=\"error_status_source_load\">Fracàs del cargament de l’estatut a partir del servidor.</string>\n    <string name=\"mute_notifications_switch\">Amudir las notificacions</string>\n    <string name=\"status_created_info\">%1$s creèt</string>\n    <string name=\"title_edits\">Modificacions</string>\n    <string name=\"status_edit_info\">%1$s modifiquèt</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"action_discard\">Ignorar las modificacions</string>\n    <string name=\"action_continue_edit\">Téner de modificar</string>\n    <string name=\"compose_unsaved_changes\">Avètz de modificacions pas salvadas.</string>\n    <string name=\"a11y_label_loading_thread\">Cargament del fil</string>\n    <string name=\"pref_title_reading_order\">Òrdre de lectura</string>\n    <string name=\"pref_reading_order_oldest_first\">Mai ancians en primièr</string>\n    <string name=\"pref_reading_order_newest_first\">Mai recents primièr</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Desactivat</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;pas definit&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;invalid&gt;</string>\n    <string name=\"action_share_account_link\">Partejar lo ligam al compte</string>\n    <string name=\"action_share_account_username\">Partejar lo nom d’utilizaire del compte</string>\n    <string name=\"send_account_link_to\">Partejar l’URL del compte amb…</string>\n    <string name=\"send_account_username_to\">Partejar lo nom d’utilizaire del compte amb…</string>\n    <string name=\"account_username_copied\">Nom d’utilizaire copiat</string>\n    <string name=\"action_post_failed\">Mandadís fracassat</string>\n    <string name=\"action_post_failed_show_drafts\">Afichar los borrolhons</string>\n    <string name=\"action_post_failed_do_nothing\">Ignorar</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Vòstra publicacion a pas pogut s’enviar e es estada salvada als borrolhons.\n\\n\n\\nSiá se podiá pas contactar lo servidor, siá aquel a regetat la publicacion.</item>\n        <item quantity=\"other\">Vòstras publicacions an pas pogut s’enviar e son estadas salvadas als borrolhons.\n\\n\n\\nSiá se podiá pas contactar lo servidor, siá aquel a regetat las publicacions.</item>\n    </plurals>\n    <string name=\"action_browser_login\">Connexion via Navigador</string>\n    <string name=\"description_browser_login\">Poiriá prendre en carga de metòdes d’autentificacions suplementaris, mas requerís un navigador compatible.</string>\n    <string name=\"description_login\">Fonciona los tres quarts del temps. Cap de donadas pèrdon pas per las autras aplicacions.</string>\n    <string name=\"dialog_follow_hashtag_title\">Seguir lo hashtag</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d personas parlan d’aqueste hashtag %2$s</string>\n    <string name=\"total_usage\">Utilizacion totala</string>\n    <string name=\"total_accounts\">Total de comptes</string>\n    <string name=\"title_public_trending_hashtags\">Hashtags populars</string>\n    <string name=\"action_refresh\">Actualizar</string>\n    <string name=\"notification_unknown_name\">Desconegut</string>\n    <string name=\"socket_timeout_exception\">La connexion al vòstre servidor a pres tròp de temps</string>\n    <string name=\"ui_error_bookmark\">Marcatge impossibla de la publicacion : %1$s</string>\n    <string name=\"ui_error_clear_notifications\">Netejatge de las notificacions fracassat : %1$s</string>\n    <string name=\"ui_success_accepted_follow_request\">Demanda d’abonament acceptada</string>\n    <string name=\"ui_success_rejected_follow_request\">Demanda d’abonament blocada</string>\n    <string name=\"status_filtered_show_anyway\">Afichar ça que la</string>\n    <string name=\"status_filter_placeholder_label_format\">Filtrat : %1$s</string>\n    <string name=\"pref_title_account_filter_keywords\">Perfils</string>\n    <string name=\"ui_error_unknown\">rason desconeguda</string>\n    <string name=\"hint_filter_title\">Mon filtre</string>\n    <string name=\"label_filter_title\">Títol</string>\n    <string name=\"filter_action_warn\">Avís</string>\n    <string name=\"filter_action_hide\">Rescondre</string>\n    <string name=\"filter_description_warn\">Rescondre amb un avís</string>\n    <string name=\"filter_description_hide\">Rescondre complètament</string>\n    <string name=\"label_filter_action\">Accion del filtre</string>\n    <string name=\"label_filter_context\">Contèxts del filtre</string>\n    <string name=\"action_add\">Ajustar</string>\n    <string name=\"filter_keyword_display_format\">%1$s (mot entièr)</string>\n    <string name=\"filter_keyword_addition_title\">Ajustrar mot clau</string>\n    <string name=\"filter_edit_keyword_title\">Modificar mot clau</string>\n    <string name=\"filter_description_format\">%1$s : %2$s</string>\n    <string name=\"label_filter_keywords\">Mots clau o frasas de filtrar</string>\n    <string name=\"post_media_image\">Imatge</string>\n    <string name=\"select_list_manage\">Gerir las listas</string>\n    <string name=\"ui_error_favourite\">Fracàs de la mes en favorit : %1$s</string>\n    <string name=\"ui_error_reblog\">Fracàs en partejant : %1$s</string>\n    <string name=\"ui_error_vote\">Fracàs del vòt : %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">Fracàs de l’acceptacion de la demanda : %1$s</string>\n    <string name=\"ui_error_reject_follow_request\">Fracàs del refús de la demanda : %1$s</string>\n    <string name=\"pref_title_show_stat_inline\">Mostrar las estatisticas dins la cronologia</string>\n    <string name=\"help_empty_home\">Aquò es vòstra <b>cronologia</b>. Mòstra las publicacions recentas dels comptes que seguissètz. \n\\n \n\\nPer explorar mai de compte podètz siá los descobrir dins d’autres fils, per exemple lo fil local de vòstra instància {{group}}, siá los trapar per lor nom {{search}}, per exemple « Tusky » per trobar nòstre compte Mastodon.</string>\n    <string name=\"error_missing_edits\">Vòstre servidor sap qu’aquesta publicacion foguèt modificada mas ten pas cap de còpia de las modificacions doncas vos las pòt afichar. \n\\n \n\\nAquò es un problèma de <a href=\"https://github.com/mastodon/mastodon/issues/25398\">Mastodon #25398</a>.</string>\n    <string name=\"load_newest_notifications\">Cargar las notificacions mai recentas</string>\n    <string name=\"compose_delete_draft\">Suprimir lo borrolhon ?</string>\n    <string name=\"pref_ui_text_size\">talha tèxte UI</string>\n    <string name=\"notification_listenable_worker_name\">activitat en rèireplan</string>\n    <string name=\"notification_listenable_worker_description\">Notificacions quand Tuska s’executa en rèireplan</string>\n    <string name=\"notification_notification_worker\">Recuperacion de las notificacions…</string>\n    <string name=\"notification_prune_cache\">Manteniment del cache…</string>\n    <string name=\"about_device_info_title\">Vòstre aparelh</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nversion d’Android : %3$s\n\\nversion del SDK : %4$d</string>\n    <string name=\"about_account_info_title\">Vòstre compte</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nVersion : %3$s</string>\n    <string name=\"error_media_upload_sending_fmt\">Fracàs del mandadís : %1$s</string>\n    <string name=\"label_image\">Imatge</string>\n    <string name=\"about_copied\">Version e info aparelh copiadas</string>\n    <string name=\"about_copy\">Copiar la version e las info aparelh</string>\n    <string name=\"error_media_playback\">La lectura a fraccasat : %1$s</string>\n    <string name=\"dialog_delete_filter_positive_action\">Suprimir</string>\n    <string name=\"dialog_delete_filter_text\">Suprimir lo filtre « %1$s » ?</string>\n    <string name=\"dialog_save_profile_changes_message\">Volètz enregistrar las modificacions del perfil ?</string>\n    <string name=\"title_public_trending_statuses\">Publicacions tendéncia</string>\n    <string name=\"error_blocking_domain\">Impossible de rescondre %1$s : %2$s</string>\n    <string name=\"list_reply_policy_none\">Degun</string>\n    <string name=\"list_reply_policy_label\">Mostrar las responsas a</string>\n    <string name=\"list_reply_policy_followed\">Totes los utilizaires seguits</string>\n    <string name=\"list_reply_policy_list\">Membres de la lista</string>\n    <string name=\"action_view_filter\">Veire filtre</string>\n    <string name=\"app_theme_system_black\">Utilizar lo design sistèma (negre)</string>\n    <string name=\"error_unblocking_domain\">Impossible de tornar mostrar %1$s : %2$s</string>\n    <string name=\"pref_title_show_self_boosts\">Mostrar los pròpris partatges</string>\n    <string name=\"pref_title_show_self_boosts_description\">Qualqu’un parteja son pròpri messatge</string>\n    <string name=\"reply_sending\">Mandadís…</string>\n    <string name=\"reply_sending_long\">Responsa enviada.</string>\n    <string name=\"action_translate\">Traduire</string>\n    <string name=\"action_show_original\">Veire l’original</string>\n    <string name=\"label_translating\">Traduccion…</string>\n    <string name=\"label_translated\">Traduch de %1$s amb %2$s</string>\n    <string name=\"ui_error_translate\">Impossible de traduire : %1$s</string>\n    <string name=\"muting_hashtag_success_format\">Rescondre l’etiqueta #%1$s coma avertiment</string>\n    <string name=\"unmuting_hashtag_success_format\">Afichatge de l’etiqueta #%1$s</string>\n    <string name=\"pref_title_per_timeline_preferences\">Preferéncias per fil cronologic</string>\n    <string name=\"dialog_follow_warning\">Seguir aqueste compte ?</string>\n    <string name=\"pref_title_confirm_follows\">Afichar una confirmacion abans de seguir</string>\n    <string name=\"unknown_notification_type\">Tipe de notificacion desconegut</string>\n    <string name=\"list_exclusive_label\">Amagar del flux d’actualitat principal</string>\n    <string name=\"following_hashtag_success_format\">Seguiment de l’etiqueta #%1$s</string>\n    <string name=\"unfollowing_hashtag_success_format\">Arrèst del seguiment de l’etiqueta #%1$s</string>\n    <string name=\"pref_title_show_notifications_filter\">Mostrar lo filtre de las notificacions</string>\n    <string name=\"url_copied\">Url copiada</string>\n    <string name=\"confirmation_hashtag_copied\">« %1$s » copiat</string>\n    <string name=\"post_privacy_direct\">Dirècte</string>\n    <string name=\"report_category_legal\">Avís legal</string>\n    <string name=\"action_follow_hashtag\">Seguir una etiqueta novèla</string>\n    <string name=\"pref_match_default_post_privacy\">Far correspondre la privacitat de las publicacions</string>\n    <string name=\"pref_default_reply_privacy_explanation\">La privacitat preseleccionada dependra de la publicacion a la quala respondètz.</string>\n    <string name=\"pref_default_reply_privacy\">Privacitat de las responsas (alinhat sul servidor)</string>\n    <string name=\"label_expires_after\">Expira aprèp</string>\n    <string name=\"notification_policies_title\">Politica de notificacion</string>\n    <string name=\"notification_policies_filter_out\">Gerir las notificacions de…</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">Lo monde que seguissètz pas</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">Comptes novèls</string>\n    <string name=\"unknown_notification_filter_moderated_accounts\">Comptes moderats</string>\n    <string name=\"filtered_notifications\">Notificacions filtradas</string>\n    <string name=\"notification_policy_accept\">Acceptar</string>\n    <string name=\"notification_policy_filter\">Filtrar</string>\n    <string name=\"notification_policy_ignore\">Ignorar</string>\n    <string name=\"filtered_notifications_title\">Notificacions filtradas</string>\n    <string name=\"open_settings\">Dobrir las preferéncias</string>\n    <string name=\"notifications_from\">Notificacions de %1$s</string>\n    <string name=\"action_accept_notification_request\">Acceptar</string>\n    <string name=\"action_dismiss_notification_request\">Ignorar</string>\n    <string name=\"error_deleting_filter\">Error de supression del filtre « %1$s »</string>\n    <string name=\"error_saving_filter\">Error en enregistrant lo filtre « %1$s »</string>\n    <string name=\"preview_card_by_author\">Per %1$s</string>\n    <string name=\"preview_card_more_by_author\">Mai de %1$s</string>\n    <string name=\"unknown_notification_filter_new_accounts_description\">Creat las darrièrs 30 jorns</string>\n    <string name=\"relationship_severance_event_title\">Connexion perduda</string>\n    <plurals name=\"accounts\">\n        <item quantity=\"one\">%1$s compte</item>\n        <item quantity=\"other\">%1$s comptes</item>\n    </plurals>\n    <string name=\"notification_info_private_reply\">Responsa en privat</string>\n    <string name=\"action_reblog_private\">Partatge pels seguidors solament</string>\n    <string name=\"action_reblog_public\">Partatge public</string>\n    <string name=\"action_reblog_unlisted\">Partatge non listat</string>\n    <string name=\"notification_policies_filter_not_following_title\">Personas que vos seguisson pas</string>\n    <string name=\"poll\">Sondatge</string>\n    <string name=\"notification_info_reply\">Respondre</string>\n    <string name=\"notification_info_private_mention\">Mencion privada</string>\n    <string name=\"notification_info_mention\">Mencion</string>\n    <plurals name=\"media_attachments\">\n        <item quantity=\"one\">%1$s mèdia junt</item>\n        <item quantity=\"other\">%1$s mèdias junts</item>\n    </plurals>\n    <string name=\"yes\">Òc</string>\n    <string name=\"no\">Non</string>\n    <string name=\"notification_severed_relationship_name\">Connexions perdudas</string>\n    <string name=\"notification_moderation_warning_name\">Avertiments de moderacion</string>\n    <string name=\"notification_unknown_description\">Tipe de notificacion desconegut</string>\n    <string name=\"notification_channel_other\">Autre</string>\n    <string name=\"notification_channel_admin\">Admin</string>\n    <string name=\"follow_hashtag_success\">%1$s etiqueta seguida</string>\n    <string name=\"post_replied\">Respondut</string>\n    <string name=\"post_replied_format\">En responsa a %1$s</string>\n    <string name=\"post_replied_self\">Seguida del fil</string>\n    <string name=\"poll_show_results\">Mostrar los resultats</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-or/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"title_home\">ଗୃହ</string>\n    <string name=\"title_notifications\">ଵିଜ୍ଞପ୍ତି</string>\n    <string name=\"post_content_show_more\">ପ୍ରସାରଣ</string>\n    <string name=\"post_content_show_less\">ସଙ୍କୋଚନ</string>\n    <string name=\"action_reply\">ପ୍ରତ୍ୟୁତ୍ତର</string>\n    <string name=\"action_retry\">ପୁନଃଚେଷ୍ଟା କରିବା</string>\n    <string name=\"action_hide_media\">ମିଡ଼ିଆ ଲୁଚାଅ</string>\n    <string name=\"action_edit_own_profile\">ସମ୍ପାଦନା</string>\n    <string name=\"action_undo\">ପୂର୍ଵଵତ୍</string>\n    <string name=\"action_search\">ସନ୍ଧାନ</string>\n    <string name=\"action_more\">ଅଧିକ</string>\n    <string name=\"action_edit\">ସମ୍ପାଦନା</string>\n    <string name=\"action_view_media\">ମିଡ଼ିଆ</string>\n    <string name=\"action_details\">ଵିଵରଣୀ</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-pa/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    </resources>"
  },
  {
    "path": "app/src/main/res/values-pl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">Wystąpił błąd.</string>\n    <string name=\"error_empty\">To nie może pozostać puste.</string>\n    <string name=\"error_invalid_domain\">Wprowadzono nieprawidłową domenę</string>\n    <string name=\"error_failed_app_registration\">Nie udało się uwierzytelnić z tą instancją. Jeśli problem będzie się powtarzał, spróbuj zalogować się za pomocą przeglądarki z menu aplikacji.</string>\n    <string name=\"error_no_web_browser_found\">Nie znaleziono przeglądarki internetowej.</string>\n    <string name=\"error_authorization_unknown\">Wystąpił nieokreślony błąd podczas próby autoryzacji. Jeśli problem będzie się powtarzał, spróbuj zalogować się za pomocą przeglądarki z menu aplikacji.</string>\n    <string name=\"error_authorization_denied\">Odmówiono autoryzacji. Jeśli jesteś pewien poprawności wprowadzonych danych, spróbuj zalogowania się za pomocą przeglądarki dostępnej w menu.</string>\n    <string name=\"error_retrieving_oauth_token\">Nie udało się uzyskać tokenu logowania. Jeśli problem będzie się powtarzał, spróbuj zalogować się za pomocą przeglądarki z menu aplikacji.</string>\n    <string name=\"error_compose_character_limit\">Zbyt długi wpis!</string>\n    <string name=\"error_media_upload_type\">Ten format pliku nie może zostać wysłany.</string>\n    <string name=\"error_media_upload_opening\">Nie można otworzyć tego pliku.</string>\n    <string name=\"error_media_upload_permission\">Wymagane jest pozwolenie na dostęp do plików z urządzenia.</string>\n    <string name=\"error_media_download_permission\">Wymagane jest pozwolenie na przechowywanie plików na urządzeniu.</string>\n    <string name=\"error_media_upload_image_or_video\">Do wpisu nie mogą być dołączone jednocześnie obrazy i pliki wideo.</string>\n    <string name=\"error_media_upload_sending\">Wysyłanie nie powiodło się.</string>\n    <string name=\"error_sender_account_gone\">Wysyłanie wpisu nie powiodło się.</string>\n    <string name=\"title_home\">Strona główna</string>\n    <string name=\"title_notifications\">Powiadomienia</string>\n    <string name=\"title_public_local\">Lokalne</string>\n    <string name=\"title_public_federated\">Sfederowane</string>\n    <string name=\"title_view_thread\">Wątek</string>\n    <string name=\"title_posts\">Wpisy</string>\n    <string name=\"title_posts_with_replies\">Z odpowiedziami</string>\n    <string name=\"title_follows\">Obserwowanych</string>\n    <string name=\"title_followers\">Obserwujących</string>\n    <string name=\"title_favourites\">Ulubione</string>\n    <string name=\"title_mutes\">Wyciszeni użytkownicy</string>\n    <string name=\"title_blocks\">Zablokowani użytkownicy</string>\n    <string name=\"title_follow_requests\">Prośby o obserwację</string>\n    <string name=\"title_edit_profile\">Edytuj profil</string>\n    <string name=\"title_drafts\">Szkice</string>\n    <string name=\"title_licenses\">Licencje</string>\n    <string name=\"post_boosted_format\">%1$s podbił/a</string>\n    <string name=\"post_sensitive_media_title\">Treści wrażliwe</string>\n    <string name=\"post_media_hidden_title\">Ukryto multimedia</string>\n    <string name=\"post_sensitive_media_directions\">Naciśnij, aby wyświetlić</string>\n    <string name=\"post_content_warning_show_more\">Pokaż więcej</string>\n    <string name=\"post_content_warning_show_less\">Pokaż mniej</string>\n    <string name=\"footer_empty\">Pusto tutaj. Pociągnij, aby odświeżyć!</string>\n    <string name=\"notification_reblog_format\">%1$s podbił/a Twój wpis</string>\n    <string name=\"notification_favourite_format\">%1$s dodał/a Twój post do ulubionych</string>\n    <string name=\"notification_follow_format\">%1$s zaczął/-ęła Cię obserwować</string>\n    <string name=\"report_username_format\">Zgłoś @%1$s</string>\n    <string name=\"report_comment_hint\">Dodatkowe komentarze?</string>\n    <string name=\"action_quick_reply\">Szybka odpowiedź</string>\n    <string name=\"action_reply\">Odpowiedz</string>\n    <string name=\"action_reblog\">Podbij</string>\n    <string name=\"action_favourite\">Dodaj do ulubionych</string>\n    <string name=\"action_more\">Więcej</string>\n    <string name=\"action_compose\">Napisz</string>\n    <string name=\"action_login\">Zaloguj się z Tusky</string>\n    <string name=\"action_logout\">Wyloguj się</string>\n    <string name=\"action_logout_confirm\">Czy na pewno chcesz wylogować się z konta %1$s?</string>\n    <string name=\"action_follow\">Obserwuj</string>\n    <string name=\"action_unfollow\">Przestań obserwować</string>\n    <string name=\"action_block\">Zablokuj</string>\n    <string name=\"action_unblock\">Odblokuj</string>\n    <string name=\"action_hide_reblogs\">Ukryj podbicia</string>\n    <string name=\"action_show_reblogs\">Pokaż podbicia</string>\n    <string name=\"action_report\">Zgłoś</string>\n    <string name=\"action_delete\">Usuń</string>\n    <string name=\"action_send\">Wyślij</string>\n    <string name=\"action_send_public\">Wyślij!</string>\n    <string name=\"action_retry\">Spróbuj ponownie</string>\n    <string name=\"action_close\">Zamknij</string>\n    <string name=\"action_view_profile\">Profil</string>\n    <string name=\"action_view_preferences\">Preferencje</string>\n    <string name=\"action_view_favourites\">Ulubione</string>\n    <string name=\"action_view_mutes\">Wyciszeni użytkownicy</string>\n    <string name=\"action_view_blocks\">Zablokowani użytkownicy</string>\n    <string name=\"action_view_follow_requests\">Prośby o obserwację</string>\n    <string name=\"action_view_media\">Multimedia</string>\n    <string name=\"action_open_in_web\">Otwórz w przeglądarce</string>\n    <string name=\"action_add_media\">Dodaj treści multimedialne</string>\n    <string name=\"action_photo_take\">Wykonaj zdjęcie</string>\n    <string name=\"action_share\">Udostępnij</string>\n    <string name=\"action_mute\">Wycisz</string>\n    <string name=\"action_unmute\">Cofnij wyciszenie</string>\n    <string name=\"action_mention\">Wspomnij</string>\n    <string name=\"action_hide_media\">Ukryj multimedia</string>\n    <string name=\"action_open_drawer\">Otwórz szufladkę</string>\n    <string name=\"action_save\">Zapisz</string>\n    <string name=\"action_edit_profile\">Edytuj profil</string>\n    <string name=\"action_edit_own_profile\">Edytuj</string>\n    <string name=\"action_undo\">Cofnij</string>\n    <string name=\"action_accept\">Akceptuj</string>\n    <string name=\"action_reject\">Odrzuć</string>\n    <string name=\"action_search\">Szukaj</string>\n    <string name=\"action_access_drafts\">Szkice</string>\n    <string name=\"action_toggle_visibility\">Widoczność wpisu</string>\n    <string name=\"action_content_warning\">Ostrzeżenie o zawartości</string>\n    <string name=\"action_emoji_keyboard\">Klawiatura emoji</string>\n    <string name=\"download_image\">Pobieranie %1$s</string>\n    <string name=\"action_copy_link\">Skopiuj odnośnik</string>\n    <string name=\"send_post_link_to\">Udostępnij URL do…</string>\n    <string name=\"send_post_content_to\">Udostępnij wpis do…</string>\n    <string name=\"confirmation_reported\">Wyślij!</string>\n    <string name=\"confirmation_unblocked\">Odblokowano użytkownika</string>\n    <string name=\"confirmation_unmuted\">Cofnięto wyciszenie użytkownika</string>\n    <string name=\"hint_domain\">Jaka instancja?</string>\n    <string name=\"hint_compose\">Co Ci chodzi po głowie?</string>\n    <string name=\"hint_content_warning\">Ostrzeżenie o zawartości</string>\n    <string name=\"hint_display_name\">Nazwa wyświetlana</string>\n    <string name=\"hint_note\">Biografia</string>\n    <string name=\"hint_search\">Szukaj…</string>\n    <string name=\"search_no_results\">Brak wyników</string>\n    <string name=\"label_quick_reply\">Odpowiedz…</string>\n    <string name=\"label_avatar\">Obraz profilowy</string>\n    <string name=\"label_header\">Nagłówek</string>\n    <string name=\"link_whats_an_instance\">Czym jest instancja?</string>\n    <string name=\"login_connection\">Łączenie…</string>\n    <string name=\"dialog_whats_an_instance\">Tutaj można wprowadzić domenę lub adres instancji, np. mastodon.social, icosahedron.website, social.tchncs.de, i <a href=\"https://instances.social\">wiele więcej!</a> \\u0020\n\\n \\u0020\n\\nJeżeli nie posiadasz jeszcze konta, wprowadź tu nazwę instancji, na której chcesz się zarejestrować. \\u0020\n\\n \\u0020\n\\nInstancja jest miejscem, na którym znajduje się twoje konto, lecz możesz prosto komunikować się z ludźmi na innych instancjach i obserwować ich, tak jakbyście byli na jednej stronie. \\u0020\n\\n \\u0020\n\\nWięcej informacji można znaleźć na <a href=\"https://joinmastodon.org\">joinmastodon.org</a>. </string>\n    <string name=\"dialog_title_finishing_media_upload\">Kończenie wysyłania treści</string>\n    <string name=\"dialog_message_uploading_media\">Wysyłanie…</string>\n    <string name=\"dialog_download_image\">Pobierz</string>\n    <string name=\"dialog_message_cancel_follow_request\">Czy chcesz anulować prośbę o obserwację?</string>\n    <string name=\"dialog_unfollow_warning\">Czy chcesz przestać obserwować to konto?</string>\n    <string name=\"visibility_public\">Publiczne: Opublikuj na publicznych osiach czasu</string>\n    <string name=\"visibility_unlisted\">Niepubliczne: Nie wyświetlaj na publicznych osiach czasu</string>\n    <string name=\"visibility_private\">Tylko obserwający: Widoczne tylko dla obserwujących</string>\n    <string name=\"visibility_direct\">Bezpośrednio: Widoczne tylko dla wspomnianych</string>\n    <string name=\"pref_title_edit_notification_settings\">Powiadomienia</string>\n    <string name=\"pref_title_notifications_enabled\">Powiadomienia</string>\n    <string name=\"pref_title_notification_alerts\">Alerty</string>\n    <string name=\"pref_title_notification_alert_sound\">Powiadamiaj dźwiękiem</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Powiadamiaj wibracją</string>\n    <string name=\"pref_title_notification_alert_light\">Powiadamiaj diodą</string>\n    <string name=\"pref_title_notification_filters\">Powiadom mnie, gdy</string>\n    <string name=\"pref_title_appearance_settings\">Wygląd</string>\n    <string name=\"pref_title_app_theme\">Motyw</string>\n    <string name=\"app_them_dark\">Ciemny</string>\n    <string name=\"app_theme_light\">Jasny</string>\n    <string name=\"app_theme_black\">Czarny</string>\n    <string name=\"app_theme_auto\">Zmieniaj automatycznie po zachodzie słońca</string>\n    <string name=\"pref_title_browser_settings\">Przeglądarka</string>\n    <string name=\"pref_title_custom_tabs\">Używaj niestandardowych kart Chrome</string>\n    <string name=\"pref_title_post_filter\">Filtrowanie osi czasu</string>\n    <string name=\"pref_title_post_tabs\">Karty</string>\n    <string name=\"pref_title_show_boosts\">Pokaż podbicia</string>\n    <string name=\"pref_title_show_replies\">Pokazuj odpowiedzi</string>\n    <string name=\"pref_title_show_media_preview\">Pokazuj podgląd zawartości multimedialnej</string>\n    <string name=\"pref_title_http_proxy_settings\">Proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_enable\">Włącz proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_server\">Serwer proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_port\">Port proxy HTTP</string>\n    <string name=\"pref_default_post_privacy\">Domyślne ustawienia prywatności wpisów</string>\n    <string name=\"pref_publishing\">Publikowanie</string>\n    <string name=\"post_privacy_public\">Publiczne</string>\n    <string name=\"post_privacy_unlisted\">Niewypisane</string>\n    <string name=\"post_privacy_followers_only\">Tylko dla obserwujących</string>\n    <string name=\"pref_post_text_size\">Rozmiar tekstu wpisów</string>\n    <string name=\"post_text_size_smallest\">Najmniejszy</string>\n    <string name=\"post_text_size_small\">Mały</string>\n    <string name=\"post_text_size_medium\">Średni</string>\n    <string name=\"post_text_size_large\">Duży</string>\n    <string name=\"post_text_size_largest\">Ogromny</string>\n    <string name=\"notification_mention_name\">Nowe wspomnienia</string>\n    <string name=\"notification_mention_descriptions\">Powiadomienia o nowych wspomnieniach</string>\n    <string name=\"notification_follow_name\">Nowi obserwujący</string>\n    <string name=\"notification_follow_description\">Powiadomienia o nowych obserwujących</string>\n    <string name=\"notification_boost_name\">Podbicia</string>\n    <string name=\"notification_boost_description\">Powiadomienia o podbiciu wpisów</string>\n    <string name=\"notification_favourite_name\">Ulubione</string>\n    <string name=\"notification_favourite_description\">Powiadomienia o dodaniu wpisów do ulubionych</string>\n    <string name=\"notification_mention_format\">%1$s wspomniał o Tobie</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s i %4$d innych</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, i %3$s</string>\n    <string name=\"notification_summary_small\">%1$s i %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d nowa interakcja</item>\n        <item quantity=\"few\">%1$d nowe interakcje</item>\n        <item quantity=\"many\">%1$d nowych interakcji</item>\n        <item quantity=\"other\">%1$d nowych interakcji</item>\n    </plurals>\n    <string name=\"description_account_locked\">Konto zablokowane</string>\n    <string name=\"about_title_activity\">O programie</string>\n    <string name=\"about_tusky_license\">Tusky jest wolnym i otwartoźródłowym oprogramowaniem. Jest on dostępny na licencji GNU General Public License w wersji trzeciej. Możesz przeczytać przetłumaczoną treść licencji <a href=\"https://web.archive.org/web/20171024013739/http://itlaw.computerworld.pl/wp-content/uploads/2008/03/powszechna-licencja-publiczna-gnu_v2.pdf\">tutaj</a></string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">Strona projektu:\n\\n https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Zgłoszenia błędów i propozycje funkcji:\n\\n https://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Profil Tusky’ego</string>\n    <string name=\"post_share_content\">Udostępnij zawartość wpisu</string>\n    <string name=\"post_share_link\">Udostępnij link do postu</string>\n    <string name=\"post_media_images\">Obrazy</string>\n    <string name=\"post_media_video\">Wideo</string>\n    <string name=\"state_follow_requested\">Wysłano prośbę o obserwację</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">w %1$d lata</string>\n    <string name=\"abbreviated_in_days\">w %1$d dni</string>\n    <string name=\"abbreviated_in_hours\">w %1$d godz.</string>\n    <string name=\"abbreviated_in_minutes\">w %1$d min.</string>\n    <string name=\"abbreviated_in_seconds\">w %1$ds</string>\n    <string name=\"abbreviated_years_ago\">%1$d lat temu</string>\n    <string name=\"abbreviated_days_ago\">%1$d dni temu</string>\n    <string name=\"abbreviated_hours_ago\">%1$d godz. temu</string>\n    <string name=\"abbreviated_minutes_ago\">%1$d min. temu</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds temu</string>\n    <string name=\"follows_you\">Obserwuje Cię</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Zawsze wyświetlaj wrażliwą zawartość</string>\n    <string name=\"title_media\">Zawartość multimedialna</string>\n    <string name=\"replying_to\">Odpowiadasz na wpis autorstwa @%1$s</string>\n    <string name=\"load_more_placeholder_text\">załaduj więcej</string>\n    <string name=\"add_account_name\">Dodaj konto</string>\n    <string name=\"add_account_description\">Dodaj nowe Konto Mastodon</string>\n    <string name=\"action_lists\">Listy</string>\n    <string name=\"title_lists\">Listy</string>\n    <string name=\"compose_active_account_description\">Publikowanie jako %1$s</string>\n    <string name=\"action_set_caption\">Ustaw podpis</string>\n    <string name=\"action_remove\">Usuń</string>\n    <string name=\"lock_account_label\">Zablokuj konto</string>\n    <string name=\"lock_account_label_description\">Wymaga od Ciebie ręcznej akceptacji próśb o obserwacje</string>\n    <string name=\"compose_save_draft\">Czy chcesz zapisać jako szkic?</string>\n    <string name=\"send_post_notification_title\">Wysyłanie wpisu…</string>\n    <string name=\"send_post_notification_error_title\">Wystąpił błąd podczas wysyłania wpisu</string>\n    <string name=\"send_post_notification_channel_name\">Wysyłanie wpisów</string>\n    <string name=\"send_post_notification_cancel_title\">Anulowano wysyłanie</string>\n    <string name=\"send_post_notification_saved_content\">Kopia wpisu została zapisana jako szkic</string>\n    <string name=\"action_compose_shortcut\">Nowy wpis</string>\n    <string name=\"error_no_custom_emojis\">Twoja instancja %1$s nie używa żadnych niestandardowych emoji</string>\n    <string name=\"emoji_style\">Styl emoji</string>\n    <string name=\"system_default\">Domyślny systemu</string>\n    <string name=\"download_fonts\">Musisz najpierw pobrać te zestawy emoji</string>\n    <string name=\"performing_lookup_title\">Wyszukiwanie…</string>\n    <string name=\"expand_collapse_all_posts\">Rozwiń/zwiń wszystkie wpisy</string>\n    <string name=\"action_open_post\">Otwórz wpis</string>\n    <string name=\"restart_required\">Wymagane jest ponowne uruchomienie</string>\n    <string name=\"restart_emoji\">Musisz uruchomić ponownie Tuskyego, aby zastosować zmiany</string>\n    <string name=\"later\">Później</string>\n    <string name=\"restart\">Uruchom ponownie</string>\n    <string name=\"caption_systememoji\">Domyślny zestaw emoji tego urządzenia</string>\n    <string name=\"caption_blobmoji\">Emoji Blob znane z Androida 4.4–7.1</string>\n    <string name=\"caption_twemoji\">Standardowy zestaw emoji Mastodona</string>\n    <string name=\"download_failed\">Pobieranie nie powiodło się</string>\n    <string name=\"account_moved_description\">%1$s przeniósł się na:</string>\n    <string name=\"reblog_private\">Podbij grupie docelowej autora oryginału</string>\n    <string name=\"unreblog_private\">Cofnij podbicie</string>\n    <string name=\"license_description\">Tusky zawiera kod i zasoby następujących projektów open source:</string>\n    <string name=\"license_apache_2\">Na licencji Apache (kopia poniżej)</string>\n    <string name=\"profile_metadata_label\">Metadane profilu</string>\n    <string name=\"profile_metadata_add\">dodaj dane</string>\n    <string name=\"profile_metadata_label_label\">Nazwa</string>\n    <string name=\"profile_metadata_content_label\">Zawartość</string>\n    <string name=\"error_network\">Wystąpił problem z łącznością. Sprawdź swoje połączenie internetowe i spróbuj ponownie.</string>\n    <string name=\"title_direct_messages\">Bezpośrednie wiadomości</string>\n    <string name=\"title_posts_pinned\">Przypięte</string>\n    <string name=\"post_content_show_more\">Rozwiń</string>\n    <string name=\"post_content_show_less\">Zwiń</string>\n    <string name=\"message_empty\">Nic tu nie ma.</string>\n    <string name=\"action_unfavourite\">Usuń z ulubionych</string>\n    <string name=\"action_delete_and_redraft\">Usuń i przeredaguj</string>\n    <string name=\"action_view_account_preferences\">Ustawienia konta</string>\n    <string name=\"action_links\">Linki</string>\n    <string name=\"action_mentions\">Wzmianki</string>\n    <string name=\"action_hashtags\">Hashtagi</string>\n    <string name=\"action_open_faved_by\">Pokaż ulubione</string>\n    <string name=\"title_hashtags_dialog\">Hashtagi</string>\n    <string name=\"title_mentions_dialog\">Wzmianki</string>\n    <string name=\"title_links_dialog\">Linki</string>\n    <string name=\"action_open_as\">Otwórz jako %1$s</string>\n    <string name=\"action_share_as\">Udostępnij jako …</string>\n    <string name=\"title_tab_preferences\">Zakładki</string>\n    <string name=\"title_domain_mutes\">Ukryte domeny</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"action_unreblog\">Cofnij podbicie</string>\n    <string name=\"action_view_domain_mutes\">Ukryte domeny</string>\n    <string name=\"action_add_poll\">Dodaj głosowanie</string>\n    <string name=\"action_mute_domain\">Wycisz %1$s</string>\n    <string name=\"action_add_tab\">Dodaj zakładkę</string>\n    <string name=\"action_open_reblogger\">Otwórz konto osoby podbijającej</string>\n    <string name=\"action_open_reblogged_by\">Pokaż podbicia</string>\n    <string name=\"action_open_media_n\">Otwórz media #%1$d</string>\n    <string name=\"download_media\">Pobierz media</string>\n    <string name=\"downloading_media\">Pobieranie mediów</string>\n    <string name=\"send_media_to\">Wyślij media do…</string>\n    <string name=\"confirmation_domain_unmuted\">Domena %1$s nie jest już schowana</string>\n    <string name=\"dialog_delete_post_warning\">Usunąć ten wpis?</string>\n    <string name=\"dialog_redraft_post_warning\">Usunąć i napisać ponownie ten wpis?</string>\n    <string name=\"mute_domain_warning\">Czy jesteś pewien/pewna że chcesz zablokować wszystko z domeny %1$s? Nie będziesz widzieć zawartości z tej domeny w żadnej osi czasu ani w twoich powiadomieniach. Twoi obserwujący z tej domeny będą usunięci.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Schowaj całą domenę</string>\n    <string name=\"pref_title_timelines\">Osi czasu</string>\n    <string name=\"pref_title_timeline_filters\">Filtry</string>\n    <string name=\"app_theme_system\">Użyj motywu systemu</string>\n    <string name=\"pref_title_language\">Język</string>\n    <string name=\"pref_title_bot_overlay\">Pokaż oznaczenie dla botów</string>\n    <string name=\"pref_title_animate_gif_avatars\">Animuj avatary GIF</string>\n    <string name=\"pref_title_proxy_settings\">Proxy</string>\n    <string name=\"pref_default_media_sensitivity\">Zawsze</string>\n    <string name=\"pref_failed_to_sync\">Synchronizacja ustawień nie powiodła się</string>\n    <string name=\"notification_poll_name\">Ankiety</string>\n    <string name=\"notification_poll_description\">Powiadomienia o głosowaniach, które zostały zakończone</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"pref_title_alway_open_spoiler\">Zawsze rozwijaj wpisy z ostrzeżeniami o zawartości</string>\n    <string name=\"pref_title_public_filter_keywords\">Publiczne osi czasu</string>\n    <string name=\"pref_title_thread_filter_keywords\">Konwersacje</string>\n    <string name=\"filter_addition_title\">Dodaj filtr</string>\n    <string name=\"filter_edit_title\">Edytuj filtr</string>\n    <string name=\"filter_dialog_remove_button\">Usuń</string>\n    <string name=\"filter_dialog_update_button\">Aktualizuj</string>\n    <string name=\"filter_dialog_whole_word\">Całe słowo</string>\n    <string name=\"filter_dialog_whole_word_description\">Kiedy słowo kluczowe lub fraza jest tylko alfanumeryczna, filtr będzie zastosowany jeśli pasuje do całego słowa</string>\n    <string name=\"filter_add_description\">Fraza, która ma być filtrowana</string>\n    <string name=\"error_create_list\">Tworzenie listy nie powiodło się</string>\n    <string name=\"error_rename_list\">Zmiana nazwy listy nie powiodła się</string>\n    <string name=\"error_delete_list\">Usunięcie listy nie powiodło się</string>\n    <string name=\"action_create_list\">Stwórz listę</string>\n    <string name=\"action_rename_list\">Zmień nazwę listy</string>\n    <string name=\"action_delete_list\">Usuń listę</string>\n    <string name=\"hint_search_people_list\">Szukaj osób, których obserwujesz</string>\n    <string name=\"action_add_to_list\">Dodaj konto do listy</string>\n    <string name=\"action_remove_from_list\">Usuń konto z listy</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Wprowadź opis dla niewidomych i niedowidzących\n\\n(maksymalna długość: %1$d)</item>\n        <item quantity=\"few\">Wprowadź opis dla niewidomych i niedowidzących\n\\n(maksymalna długość: %1$d)</item>\n        <item quantity=\"many\">Wprowadź opis dla niewidomych i niedowidzących\n\\n(maksymalna długość: %1$d)</item>\n        <item quantity=\"other\">Wprowadź opis dla niewidomych i niedowidzących\n\\n(maksymalna długość: %1$d)</item>\n    </plurals>\n    <string name=\"caption_notoemoji\">Aktualny zestaw emoji Google</string>\n    <string name=\"profile_badge_bot_text\">Bot</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"pref_title_absolute_time\">Użyj czasu absolutnego</string>\n    <string name=\"label_remote_account\">Informacje poniżej mogą niekompletnie przedstawiać profil użytkownika. Kliknij by otworzyć pełny profil w przeglądarce.</string>\n    <string name=\"unpin_action\">Odepnij z profilu</string>\n    <string name=\"pin_action\">Przypnij do profilu</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> polubienie</item>\n        <item quantity=\"few\"><b>%1$s</b> polubienia</item>\n        <item quantity=\"many\"><b>%1$s</b> polubień</item>\n        <item quantity=\"other\"><b>%1$s</b> polubień</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> podbicie</item>\n        <item quantity=\"few\"><b>%1$s</b> podbicia</item>\n        <item quantity=\"many\"><b>%1$s</b> podbić</item>\n        <item quantity=\"other\"><b>%1$s</b> podbić</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">Podbite przez</string>\n    <string name=\"title_favourited_by\">Polubione przez</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s i %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s i %3$d innych</string>\n    <string name=\"description_post_media\">Media: %1$s</string>\n    <string name=\"description_post_cw\">Ostrzeżenie o zawartości: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Brak opisu</string>\n    <string name=\"description_post_reblogged\">Podbity</string>\n    <string name=\"description_post_favourited\">Polubiony</string>\n    <string name=\"description_visibility_public\">Publiczny</string>\n    <string name=\"description_visibility_unlisted\">Niewidoczne</string>\n    <string name=\"description_visibility_private\">Obserwujący</string>\n    <string name=\"description_visibility_direct\">Bezpośrednio</string>\n    <string name=\"description_poll\">Głosowanie z opcjami: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"hint_list_name\">Nazwa listy</string>\n    <string name=\"pick_hashtag_hint\">Hashtag bez #</string>\n    <string name=\"notifications_clear\">Wyczyść</string>\n    <string name=\"notifications_apply_filter\">Filtr</string>\n    <string name=\"filter_apply\">Zastosuj</string>\n    <string name=\"compose_shortcut_long_label\">Stwórz wpis</string>\n    <string name=\"compose_shortcut_short_label\">Nowy wpis</string>\n    <string name=\"notification_clear_text\">Czy jesteś pewien/pewna, że chcesz wyczyścić wszystkie swoje powiadomienia?</string>\n    <string name=\"compose_preview_image_description\">Opcje dla obrazu %1$s</string>\n    <string name=\"poll_info_format\"> <!-- 15 votes • 1 hour left --> %1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s głos</item>\n        <item quantity=\"few\">%1$s głosy</item>\n        <item quantity=\"many\">%1$s głosów</item>\n        <item quantity=\"other\">%1$s głosów</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">kończy się %1$s</string>\n    <string name=\"poll_info_closed\">zakończone</string>\n    <string name=\"poll_vote\">Głosuj</string>\n    <string name=\"poll_ended_voted\">Głosowanie w którym brałeś(-aś) udział zakończyła się</string>\n    <string name=\"poll_ended_created\">Ankieta, którą stworzyłeś(aś), zakończyła się</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">Został %1$d dzień</item>\n        <item quantity=\"few\">Zostało %1$d dni</item>\n        <item quantity=\"many\">Zostało %1$d dni</item>\n        <item quantity=\"other\">Zostało %1$d dni</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">Została %1$d godzina</item>\n        <item quantity=\"few\">Zostało %1$d godziny</item>\n        <item quantity=\"many\">Zostało %1$d godzin</item>\n        <item quantity=\"other\">Zostało %1$d godzin</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">Została %1$d minuta</item>\n        <item quantity=\"few\">Zostało %1$d minuty</item>\n        <item quantity=\"many\">Zostało %1$d minut</item>\n        <item quantity=\"other\">Zostało %1$d minut</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">Została %1$d sekunda</item>\n        <item quantity=\"few\">Zostało %1$d sekund</item>\n        <item quantity=\"many\">Zostało %1$d sekund</item>\n        <item quantity=\"other\">Zostało %1$d sekund</item>\n    </plurals>\n    <string name=\"button_continue\">Kontynuuj</string>\n    <string name=\"button_back\">Wstecz</string>\n    <string name=\"button_done\">Zakończ</string>\n    <string name=\"report_sent_success\">Zgłoszenie @%1$s powiodło się</string>\n    <string name=\"hint_additional_info\">Dodatkowe komentarze</string>\n    <string name=\"report_remote_instance\">Wyślij zgłoszenie do %1$s</string>\n    <string name=\"failed_report\">Zgłoszenie nie powiodło się</string>\n    <string name=\"failed_fetch_posts\">Pobieranie wpisów nie powiodło się</string>\n    <string name=\"report_description_1\">Zgłoszenie zostanie przesłąne do moderatora twojego serwera. Możesz podać przyczynę zgłoszenia tego konta poniżej:</string>\n    <string name=\"report_description_remote_instance\">To konto jest na innym serwerze. Czy przesłać anonimizowaną kopię zgłoszenia na ten serwer?</string>\n    <string name=\"title_accounts\">Konta</string>\n    <string name=\"failed_search\">Wyszukiwanie nie powidło się</string>\n    <string name=\"create_poll_title\">Głosowanie</string>\n    <string name=\"duration_5_min\">5 minut</string>\n    <string name=\"duration_30_min\">30 minut</string>\n    <string name=\"duration_1_hour\">1 godzina</string>\n    <string name=\"duration_6_hours\">6 godzin</string>\n    <string name=\"duration_1_day\">1 dzień</string>\n    <string name=\"duration_3_days\">3 dni</string>\n    <string name=\"duration_7_days\">7 dni</string>\n    <string name=\"add_poll_choice\">Dodaj wybór</string>\n    <string name=\"poll_allow_multiple_choices\">Kilka wyborów</string>\n    <string name=\"poll_new_choice_hint\">Opcja %1$d</string>\n    <string name=\"edit_poll\">Edytuj</string>\n    <string name=\"title_scheduled_posts\">Zaplanowane wpisy</string>\n    <string name=\"action_edit\">Edytuj</string>\n    <string name=\"action_access_scheduled_posts\">Zaplanowane wpisy</string>\n    <string name=\"action_schedule_post\">Zaplanuj wpis</string>\n    <string name=\"action_reset_schedule\">Resetuj</string>\n    <string name=\"about_powered_by_tusky\">Napędzane przez Tusky</string>\n    <string name=\"post_lookup_error_format\">Błąd przy wyszukiwaniu wpisu %1$s</string>\n    <string name=\"title_bookmarks\">Zakładki</string>\n    <string name=\"action_bookmark\">Dodaj do zakładek</string>\n    <string name=\"action_view_bookmarks\">Zakładki</string>\n    <string name=\"description_post_bookmarked\">Dodany do zakładek</string>\n    <string name=\"select_list_title\">Wybierz listę</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"no_drafts\">Nie masz żadnych szkiców.</string>\n    <string name=\"no_scheduled_posts\">Nie masz żadnych zaplanowanych wpisów.</string>\n    <string name=\"warning_scheduling_interval\">Mastodon umożliwia wysłanie minimalnie 5 minut od zaplanowania.</string>\n    <string name=\"notification_follow_request_name\">Prośby o obserwację</string>\n    <string name=\"pref_title_confirm_reblogs\">Pytaj o potwierdzenie przed podbiciem</string>\n    <string name=\"add_hashtag_title\">Dodaj hashtag</string>\n    <string name=\"dialog_mute_warning\">Wyciszyć @%1$s?</string>\n    <string name=\"dialog_block_warning\">Zablokować @%1$s?</string>\n    <string name=\"action_unmute_conversation\">Cofnij wyciszenie rozmowy</string>\n    <string name=\"action_mute_conversation\">Wycisz rozmowę</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s osoba</item>\n        <item quantity=\"few\">%1$s osoby</item>\n        <item quantity=\"many\">%1$s osób</item>\n        <item quantity=\"other\">%1$s osób</item>\n    </plurals>\n    <string name=\"hashtags\">Hashtagi</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Pokazuj podglądy linków na osiach czasu</string>\n    <string name=\"pref_title_gradient_for_media\">Pokazuj kolorowe gradienty dla ukrytej zawartości multimedialnej</string>\n    <string name=\"dialog_mute_hide_notifications\">Ukryj powiadomienia</string>\n    <string name=\"action_unmute_domain\">Cofnij wyciszenie %1$s</string>\n    <string name=\"action_unmute_desc\">Cofnij wyciszenie %1$s</string>\n    <string name=\"pref_title_hide_top_toolbar\">Ukryj tytuł górnego paska narzędzi</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Dół</string>\n    <string name=\"pref_main_nav_position_option_top\">Góra</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Nie możesz przesłać więcej niż %1$d załącznik.</item>\n        <item quantity=\"few\">Nie możesz przesłać więcej niż %1$d załączniki.</item>\n        <item quantity=\"many\">Nie możesz przesłać więcej niż %1$d załączników.</item>\n        <item quantity=\"other\">Nie możesz przesłać więcej niż %1$d załączników.</item>\n    </plurals>\n    <string name=\"drafts_failed_loading_reply\">Nie udało się załadować informacji o odpowiedzi</string>\n    <string name=\"drafts_post_failed_to_send\">Przesłanie wpisu nie powiodło się!</string>\n    <string name=\"dialog_delete_list_warning\">Czy na pewno chcesz usunąć listę %1$s?</string>\n    <string name=\"no_announcements\">Nie ma ogłoszeń.</string>\n    <string name=\"limit_notifications\">Ogranicz liczbę powiadomień o zmianach na osi czasu</string>\n    <string name=\"label_duration\">Czas trwania</string>\n    <string name=\"notification_subscription_name\">Nowe wpisy</string>\n    <string name=\"wellbeing_mode_notice\">Niektóre informacje, które mogą wpływać na Twój dobrostan psychiczny zostaną ukryte. W ich skład wchodzą:\n\\n\n\\n - powiadomienia o ulubionych/podbiciach/obserwowaniu\n\\n - liczba polubień/podbić wpisu\n\\n - statystyki obserwujących/postów na profilach\n\\n\n\\nNie będzie to miało wpływu na powiadomienia, ale możesz zmienić ustawienia powiadomień ręcznie.</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Włącz gest przesuwania by przełączać między zakładkami</string>\n    <string name=\"post_media_attachments\">Załączniki</string>\n    <string name=\"notification_follow_request_description\">Powiadomienia o prośbach o obserwowanie</string>\n    <string name=\"title_announcements\">Ogłoszenia</string>\n    <string name=\"pref_title_wellbeing_mode\">Zdrowie</string>\n    <string name=\"action_unsubscribe_account\">Anuluj subskrypcję</string>\n    <string name=\"action_subscribe_account\">Zasubskrybuj</string>\n    <string name=\"follow_requests_info\">Mimo tego, że twoje konto nie jest zablokowane, administracja %1$s uznała, że możesz chcieć ręcznie przejrzeć te prośby o obserwację od tych kont.</string>\n    <string name=\"drafts_post_reply_removed\">Wpis dla którego naszkicowałeś/aś odpowiedź został usunięty</string>\n    <string name=\"draft_deleted\">Usunięto szkic</string>\n    <string name=\"wellbeing_hide_stats_profile\">Ukryj ilościowe statystyki na profilach</string>\n    <string name=\"wellbeing_hide_stats_posts\">Ukryj ilościowe statystyki na postach</string>\n    <string name=\"review_notifications\">Przejrzyj powiadomienia</string>\n    <string name=\"account_note_saved\">Zapisano!</string>\n    <string name=\"account_note_hint\">Twoja prywatna notatka o tym koncie</string>\n    <string name=\"duration_indefinite\">Nieograniczony</string>\n    <string name=\"post_media_audio\">Dźwięk</string>\n    <string name=\"notification_subscription_description\">Powiadomienia o opublikowaniu nowego wpisu przez kogoś, kogo obserwujesz</string>\n    <string name=\"pref_main_nav_position\">Pozycja głównego paska nawigacji</string>\n    <string name=\"pref_title_animate_custom_emojis\">Animuj niestandardowe emoji</string>\n    <string name=\"dialog_delete_conversation_warning\">Usunąć tą konwersację?</string>\n    <string name=\"action_delete_conversation\">Usuń konwersację</string>\n    <string name=\"notification_subscription_format\">%1$s opublikował/a post</string>\n    <string name=\"notification_follow_request_format\">%1$s poprosił/a o możliwość obserwowania Cię</string>\n    <string name=\"action_unbookmark\">Usuń z zakładek</string>\n    <string name=\"pref_title_confirm_favourites\">Pytaj o potwierdzenie przed dodaniem do ulubionych</string>\n    <string name=\"duration_14_days\">14 dni</string>\n    <string name=\"duration_30_days\">30 dni</string>\n    <string name=\"duration_60_days\">60 dni</string>\n    <string name=\"duration_90_days\">90 dni</string>\n    <string name=\"duration_180_days\">180 dni</string>\n    <string name=\"duration_365_days\">365 dni</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Utwórz wpis</string>\n    <string name=\"title_login\">Login</string>\n    <string name=\"notification_sign_up_format\">%1$s zarejestrował/a się</string>\n    <string name=\"notification_sign_up_name\">Rejestracje</string>\n    <string name=\"notification_sign_up_description\">Powiadomienia o nowych użytkownikach</string>\n    <string name=\"notification_update_description\">Powiadomienia o edycji wpisów z którymi dokonałeś/aś interakcji</string>\n    <string name=\"notification_update_format\">%1$s edytował/a swój wpis</string>\n    <string name=\"notification_update_name\">Edycje wpisów</string>\n    <string name=\"saving_draft\">Zapisywanie szkicu…</string>\n    <string name=\"error_could_not_load_login_page\">Nie można załadować strony logowania.</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"account_date_joined\">Dołączył/-a %1$s</string>\n    <string name=\"action_edit_image\">Edytuj obraz</string>\n    <string name=\"error_image_edit_failed\">Obrazek nie mógł być zmodyfikowany.</string>\n    <string name=\"action_dismiss\">Odrzuć</string>\n    <string name=\"action_details\">Detale</string>\n    <string name=\"error_loading_account_details\">Ładowanie informacji o koncie nie powiodło się</string>\n    <string name=\"error_multimedia_size_limit\">Pliki wideo i audio nie mogą przekraczać rozmiarem %1$s MB.</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"description_post_language\">Język wpisu</string>\n    <string name=\"duration_no_change\">(bez zmian)</string>\n    <string name=\"error_following_hashtag_format\">Wystąpił błąd podczas obserwowania #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Wystąpił błąd podczas odobserwowywania #%1$s</string>\n    <string name=\"set_focus_description\">Naciśnij lub przeciągnij kółko, aby wybrać punkt centralny, który będzie zawsze widoczny w miniaturkach.</string>\n    <string name=\"action_add_or_remove_from_list\">Dodaj lub usuń z listy</string>\n    <string name=\"failed_to_add_to_list\">Nie udało się dodać konta do listy</string>\n    <string name=\"failed_to_remove_from_list\">Nie udało się usunąć konta z listy</string>\n    <string name=\"action_unfollow_hashtag_format\">Odobserwuj #%1$s?</string>\n    <string name=\"pref_default_post_language\">Domyślny język wpisów</string>\n    <string name=\"pref_show_self_username_never\">Nigdy</string>\n    <string name=\"pref_show_self_username_always\">Zawsze</string>\n    <string name=\"pref_show_self_username_disambiguate\">Gdy wiele kont jest zalogowanych</string>\n    <string name=\"status_created_at_now\">teraz</string>\n    <string name=\"action_add_reaction\">dodaj reakcję</string>\n    <string name=\"notification_header_report_format\">%1$s zgłosił/a %2$s</string>\n    <string name=\"confirmation_hashtag_unfollowed\">Odobserwowano #%1$s</string>\n    <string name=\"notification_report_name\">Zgłoszenia</string>\n    <string name=\"notification_report_description\">Powiadomienia o zgłoszeniach moderacyjnych</string>\n    <string name=\"action_set_focus\">Wybierz punkt centralny</string>\n    <string name=\"compose_save_draft_loses_media\">Czy chcesz zapisać jako szkic? (Załączniki zostaną załadowane ponownie po przywróceniu szkicu.)</string>\n    <string name=\"error_following_hashtags_unsupported\">Ta instancja nie wspiera obserwowania hashtagów.</string>\n    <string name=\"title_followed_hashtags\">Obserwowane hashtagi</string>\n    <string name=\"a11y_label_loading_thread\">Ładowanie wątku</string>\n    <string name=\"instance_rule_info\">Logując się akceptujesz regulamin %1$s.</string>\n    <string name=\"pref_reading_order_oldest_first\">Najpierw najstarsze</string>\n    <string name=\"pref_reading_order_newest_first\">Najpierw najnowsze</string>\n    <string name=\"no_lists\">Nie masz żadnych list.</string>\n    <string name=\"mute_notifications_switch\">Wycisz powiadomienia</string>\n    <string name=\"status_edit_info\">%1$s edytował</string>\n    <string name=\"status_created_info\">%1$s stworzył</string>\n    <string name=\"title_edits\">Edycje</string>\n    <string name=\"compose_unsaved_changes\">Masz niezapisane zmiany.</string>\n    <string name=\"instance_rule_title\">%1$s regulamin</string>\n    <string name=\"action_post_failed\">Błąd wysyłania</string>\n    <string name=\"action_post_failed_show_drafts\">Pokaż szkice</string>\n    <string name=\"action_post_failed_do_nothing\">Odrzuć</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"action_browser_login\">Zaloguj się przez przeglądarkę</string>\n    <string name=\"action_continue_edit\">Kontynuuj edycję</string>\n    <string name=\"report_category_spam\">Spam</string>\n    <string name=\"send_account_link_to\">Udostępnij link do konta…</string>\n    <string name=\"send_account_username_to\">Udostępnij nazwę użytkownika…</string>\n    <string name=\"account_username_copied\">Skopiowano nazwę użytkownika</string>\n    <string name=\"description_post_edited\">Edytowano</string>\n    <string name=\"report_category_other\">Inne</string>\n    <string name=\"post_edited\">Edytowano %1$s</string>\n    <string name=\"delete_scheduled_post_warning\">Usunąć ten zaplanowany wpis?</string>\n    <string name=\"pref_title_reading_order\">Kolejność czytania</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;nieustawiony&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;niepoprawny&gt;</string>\n    <string name=\"pref_title_http_proxy_port_message\">Port powinien być pomiędzy %1$d a %2$d</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Wystąpił problem podczas publikacji posta, ale został on zapisany w szkicach.\n\\n\n\\nAlbo wystąpił problem z połączeniem z serwerem, albo serwer odrzucił post.</item>\n        <item quantity=\"few\"/>\n        <item quantity=\"many\"/>\n        <item quantity=\"other\"/>\n    </plurals>\n    <string name=\"error_muting_hashtag_format\">Wystąpił błąd podczas wyciszania #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Wystąpił błąd podczas zdejmowania wyciszenia #%1$s</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"report_category_violation\">Naruszenie zasad</string>\n    <string name=\"description_login\">Działa w większości przypadków. Dane nie wyciekły do innych aplikacji.</string>\n    <string name=\"description_browser_login\">Może obsługiwać dodatkowe formy weryfikacji, ale wymaga kompatybilnej przeglądarki.</string>\n    <string name=\"notification_report_format\">Nowe zgłoszenie dotyczące %1$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d załączonych postów</string>\n    <string name=\"failed_to_pin\">Błąd w akcji przypinania</string>\n    <string name=\"failed_to_unpin\">Błąd podczas odpinania</string>\n    <string name=\"error_status_source_load\">Błąd ładowania źródła statusu z serwera.</string>\n    <string name=\"pref_title_show_self_username\">Wyświetl nazwy użytkowników w pasku narzędzi</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Wyłączone</string>\n    <string name=\"hint_media_description_missing\">Media powinny mieć opis.</string>\n    <string name=\"action_discard\">Odrzuć zmiany</string>\n    <string name=\"action_share_account_username\">Udostępnij nazwę użytkownika</string>\n    <string name=\"action_share_account_link\">Udostępnij link do konta</string>\n    <string name=\"error_media_upload_sending_fmt\">Wystąpił błąd podczas wysłania: %1$s</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">Nowe konta</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">Ludzie których nie obserwujesz</string>\n    <string name=\"action_refresh\">Odśwież</string>\n    <string name=\"title_public_trending_statuses\">Popularne wpisy</string>\n    <string name=\"title_public_trending_hashtags\">Popularne hashtagi</string>\n    <string name=\"error_saving_filter\">Błąd zapisywania filtru \\\"%1$s\\\"</string>\n    <string name=\"error_deleting_filter\">Błąd usuwania filtru \\\"%1$s\\\"</string>\n    <string name=\"dialog_delete_filter_text\">Usunąć filtr \\\"%1$s\\\"?</string>\n    <string name=\"filter_keyword_addition_title\">Dodaj słowo klucz</string>\n    <string name=\"filter_edit_keyword_title\">Edytuj słowo klucz</string>\n    <string name=\"filter_action_hide\">Ukryj</string>\n    <string name=\"filter_action_warn\">Ostrzeż</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-pt-rBR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">Ocorreu um erro.</string>\n    <string name=\"error_empty\">Não pode estar vazio.</string>\n    <string name=\"error_invalid_domain\">Instância inválida</string>\n    <string name=\"error_failed_app_registration\">Falha na autenticação com essa instância. Se isso persistir, tente Entrar pelo Navegador no menu.</string>\n    <string name=\"error_no_web_browser_found\">Nenhum navegador foi encontrado.</string>\n    <string name=\"error_authorization_unknown\">Ocorreu um erro de autorização não identificado. Se isso persistir, tente Entrar pelo Navegador no menu.</string>\n    <string name=\"error_authorization_denied\">A autorização foi negada. Se você tiver certeza de que forneceu as credenciais corretas, tente Entrar pelo Navegador no menu.</string>\n    <string name=\"error_retrieving_oauth_token\">Falha ao obter um token de login. Se isso persistir, tente Entrar pelo Navegador no menu.</string>\n    <string name=\"error_compose_character_limit\">O toot é muito longo!</string>\n    <string name=\"error_media_upload_type\">Esse tipo de arquivo não pode ser enviado.</string>\n    <string name=\"error_media_upload_opening\">Esse arquivo não pode ser aberto.</string>\n    <string name=\"error_media_upload_permission\">Permissão para ler mídia é necessária.</string>\n    <string name=\"error_media_download_permission\">Permissão para armazenar mídia é necessária.</string>\n    <string name=\"error_media_upload_image_or_video\">Imagens e vídeos não podem ser anexados ao mesmo toot.</string>\n    <string name=\"error_media_upload_sending\">Falha ao enviar.</string>\n    <string name=\"error_sender_account_gone\">Erro ao enviar toot.</string>\n    <string name=\"title_home\">Página inicial</string>\n    <string name=\"title_notifications\">Notificações</string>\n    <string name=\"title_public_local\">Linha local</string>\n    <string name=\"title_public_federated\">Linha global</string>\n    <string name=\"title_direct_messages\">Mensagens diretas</string>\n    <string name=\"title_tab_preferences\">Editar abas</string>\n    <string name=\"title_view_thread\">Fio</string>\n    <string name=\"title_posts\">Toots</string>\n    <string name=\"title_posts_with_replies\">Com respostas</string>\n    <string name=\"title_follows\">Segue</string>\n    <string name=\"title_followers\">Seguidores</string>\n    <string name=\"title_favourites\">Favoritos</string>\n    <string name=\"title_mutes\">Usuários silenciados</string>\n    <string name=\"title_blocks\">Usuários bloqueados</string>\n    <string name=\"title_follow_requests\">Seguidores pendentes</string>\n    <string name=\"title_edit_profile\">Editar perfil</string>\n    <string name=\"title_drafts\">Rascunhos</string>\n    <string name=\"title_licenses\">Licenças</string>\n    <string name=\"post_boosted_format\">%1$s deu boost</string>\n    <string name=\"post_sensitive_media_title\">Mídia sensível</string>\n    <string name=\"post_media_hidden_title\">Mídia sensível</string>\n    <string name=\"post_sensitive_media_directions\">Toque para ver</string>\n    <string name=\"post_content_warning_show_more\">Expandir</string>\n    <string name=\"post_content_warning_show_less\">Ocultar</string>\n    <string name=\"footer_empty\">Nada aqui. Arraste para atualizar!</string>\n    <string name=\"notification_reblog_format\">%1$s deu boost no teu toot</string>\n    <string name=\"notification_favourite_format\">%1$s favoritou teu toot</string>\n    <string name=\"notification_follow_format\">%1$s te seguiu</string>\n    <string name=\"report_username_format\">Denunciar @%1$s</string>\n    <string name=\"report_comment_hint\">Comentários adicionais aqui</string>\n    <string name=\"action_quick_reply\">Resposta rápida</string>\n    <string name=\"action_reply\">Responder</string>\n    <string name=\"action_reblog\">Dar boost</string>\n    <string name=\"action_unreblog\">Desfazer boost</string>\n    <string name=\"action_favourite\">Favoritar</string>\n    <string name=\"action_unfavourite\">Desfavoritar</string>\n    <string name=\"action_more\">Mais</string>\n    <string name=\"action_compose\">Compor</string>\n    <string name=\"action_login\">Entrar com Tusky</string>\n    <string name=\"action_logout\">Sair</string>\n    <string name=\"action_logout_confirm\">Tem certeza de que deseja sair de %1$s? Isso excluirá todos os dados locais da conta, incluindo rascunhos e preferências.</string>\n    <string name=\"action_follow\">Seguir</string>\n    <string name=\"action_unfollow\">Deixar de seguir</string>\n    <string name=\"action_block\">Bloquear</string>\n    <string name=\"action_unblock\">Desbloquear</string>\n    <string name=\"action_hide_reblogs\">Ocultar boosts</string>\n    <string name=\"action_show_reblogs\">Mostrar boosts</string>\n    <string name=\"action_report\">Denunciar</string>\n    <string name=\"action_delete\">Excluir</string>\n    <string name=\"action_send\">TOOT!</string>\n    <string name=\"action_send_public\">TOOT!</string>\n    <string name=\"action_retry\">Tentar novamente</string>\n    <string name=\"action_close\">Fechar</string>\n    <string name=\"action_view_profile\">Perfil</string>\n    <string name=\"action_view_preferences\">Preferências</string>\n    <string name=\"action_view_favourites\">Favoritos</string>\n    <string name=\"action_view_mutes\">Usuários silenciados</string>\n    <string name=\"action_view_blocks\">Usuários bloqueados</string>\n    <string name=\"action_view_follow_requests\">Seguidores pendentes</string>\n    <string name=\"action_view_media\">Mídia</string>\n    <string name=\"action_open_in_web\">Abrir no navegador</string>\n    <string name=\"action_add_media\">Adicionar mídia</string>\n    <string name=\"action_photo_take\">Tirar foto</string>\n    <string name=\"action_share\">Compartilhar</string>\n    <string name=\"action_mute\">Silenciar</string>\n    <string name=\"action_unmute\">Dessilenciar</string>\n    <string name=\"action_mention\">Mencionar</string>\n    <string name=\"action_hide_media\">Ocultar mídia</string>\n    <string name=\"action_open_drawer\">Abrir menu</string>\n    <string name=\"action_save\">Salvar</string>\n    <string name=\"action_edit_profile\">Editar perfil</string>\n    <string name=\"action_edit_own_profile\">Editar</string>\n    <string name=\"action_undo\">Desfazer</string>\n    <string name=\"action_accept\">Aceitar</string>\n    <string name=\"action_reject\">Rejeitar</string>\n    <string name=\"action_search\">Pesquisar</string>\n    <string name=\"action_access_drafts\">Rascunhos</string>\n    <string name=\"action_toggle_visibility\">Privacidade do toot</string>\n    <string name=\"action_content_warning\">Aviso de Conteúdo</string>\n    <string name=\"action_emoji_keyboard\">Teclado de emojis</string>\n    <string name=\"action_add_tab\">Adicionar aba</string>\n    <string name=\"action_links\">Links</string>\n    <string name=\"action_mentions\">Menções</string>\n    <string name=\"action_open_reblogged_by\">Mostrar boosts</string>\n    <string name=\"action_open_faved_by\">Mostrar favoritos</string>\n    <string name=\"title_mentions_dialog\">Menções</string>\n    <string name=\"title_links_dialog\">Links</string>\n    <string name=\"download_image\">Baixando %1$s</string>\n    <string name=\"action_copy_link\">Copiar link</string>\n    <string name=\"action_open_as\">Abrir como %1$s</string>\n    <string name=\"action_share_as\">Compartilhar como…</string>\n    <string name=\"send_post_link_to\">Compartilhar link do toot em…</string>\n    <string name=\"send_post_content_to\">Compartilhar toot em…</string>\n    <string name=\"send_media_to\">Compartilhar mídia via…</string>\n    <string name=\"confirmation_reported\">Enviado!</string>\n    <string name=\"confirmation_unblocked\">Usuário desbloqueado</string>\n    <string name=\"confirmation_unmuted\">Usuário dessilenciado</string>\n    <string name=\"hint_domain\">Qual instância?</string>\n    <string name=\"hint_compose\">No que você está pensando?</string>\n    <string name=\"hint_content_warning\">Aviso de Conteúdo aqui</string>\n    <string name=\"hint_display_name\">Nome de exibição</string>\n    <string name=\"hint_note\">Biografia</string>\n    <string name=\"hint_search\">Pesquisar…</string>\n    <string name=\"search_no_results\">Sem resultados</string>\n    <string name=\"label_quick_reply\">Responder…</string>\n    <string name=\"label_avatar\">Avatar</string>\n    <string name=\"label_header\">Capa</string>\n    <string name=\"link_whats_an_instance\">O que é uma instância?</string>\n    <string name=\"login_connection\">Conectando…</string>\n    <string name=\"dialog_whats_an_instance\">O domínio de qualquer instância pode ser inserido aqui, como mastodon.social, masto.donte.com.br, colorid.es ou qualquer <a href=\"https://instances.social\">outro!</a> \\u0020\n\\n \\u0020\n\\n Se não tem uma conta ainda, insira o nome da instância que gostaria de participar e crie uma conta lá. \\u0020\n\\n \\u0020\n\\n Uma instância é um lugar onde sua conta é hospedada, mas é fácil se comunicar e seguir pessoas de outras instâncias como se todos estivessem no mesmo site. \\u0020\n\\n \\u0020\n\\n Mais informações podem ser encontradas em <a href=\"https://joinmastodon.org\">joinmastodon.org</a>. </string>\n    <string name=\"dialog_title_finishing_media_upload\">Envio de mídia terminando</string>\n    <string name=\"dialog_message_uploading_media\">Enviando…</string>\n    <string name=\"dialog_download_image\">Baixar</string>\n    <string name=\"dialog_message_cancel_follow_request\">Cancelar solicitação para seguir?</string>\n    <string name=\"dialog_unfollow_warning\">Deixar de seguir esta conta?</string>\n    <string name=\"dialog_delete_post_warning\">Excluir este toot?</string>\n    <string name=\"visibility_public\">Público: Postar em linhas públicas</string>\n    <string name=\"visibility_unlisted\">Não-listado: Não postar em linhas públicas</string>\n    <string name=\"visibility_private\">Privado: Postar só para seguidores</string>\n    <string name=\"visibility_direct\">Direto: Postar só para mencionados</string>\n    <string name=\"pref_title_edit_notification_settings\">Editar notificações</string>\n    <string name=\"pref_title_notifications_enabled\">Notificações</string>\n    <string name=\"pref_title_notification_alerts\">Alertas</string>\n    <string name=\"pref_title_notification_alert_sound\">Notificar com som</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Notificar com vibração</string>\n    <string name=\"pref_title_notification_alert_light\">Notificar com luz</string>\n    <string name=\"pref_title_notification_filters\">Notifique-me quando</string>\n    <string name=\"pref_title_appearance_settings\">Aparência</string>\n    <string name=\"pref_title_app_theme\">Temas</string>\n    <string name=\"pref_title_timelines\">Linhas do tempo</string>\n    <string name=\"app_them_dark\">Escuro</string>\n    <string name=\"app_theme_light\">Claro</string>\n    <string name=\"app_theme_black\">AMOLED</string>\n    <string name=\"app_theme_auto\">Automático</string>\n    <string name=\"app_theme_system\">Usar o tema do sistema</string>\n    <string name=\"pref_title_browser_settings\">Navegador</string>\n    <string name=\"pref_title_custom_tabs\">Usar abas do Chrome</string>\n    <string name=\"pref_title_post_filter\">Filtro da linha do tempo</string>\n    <string name=\"pref_title_post_tabs\">Abas</string>\n    <string name=\"pref_title_show_boosts\">Mostrar boosts</string>\n    <string name=\"pref_title_show_replies\">Mostrar respostas</string>\n    <string name=\"pref_title_show_media_preview\">Mostrar prévias de mídia</string>\n    <string name=\"pref_title_proxy_settings\">Proxy</string>\n    <string name=\"pref_title_http_proxy_settings\">Proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_enable\">Ativar proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_server\">Servidor do proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_port\">Porta do proxy HTTP</string>\n    <string name=\"pref_default_post_privacy\">Privacidade padrão dos toots</string>\n    <string name=\"pref_default_media_sensitivity\">Sempre marcar mídia como sensível</string>\n    <string name=\"pref_publishing\">Toots (sincronizado com instância)</string>\n    <string name=\"pref_failed_to_sync\">Erro ao sincronizar configurações</string>\n    <string name=\"post_privacy_public\">Público</string>\n    <string name=\"post_privacy_unlisted\">Não-listado</string>\n    <string name=\"pref_post_text_size\">Tamanho da fonte</string>\n    <string name=\"post_text_size_smallest\">Menor</string>\n    <string name=\"post_text_size_small\">Pequeno</string>\n    <string name=\"post_text_size_medium\">Médio</string>\n    <string name=\"post_text_size_large\">Grande</string>\n    <string name=\"post_text_size_largest\">Maior</string>\n    <string name=\"notification_mention_name\">Novas menções</string>\n    <string name=\"notification_mention_descriptions\">Notificações sobre menções</string>\n    <string name=\"notification_follow_name\">Novos seguidores</string>\n    <string name=\"notification_follow_description\">Notificações sobre novos seguidores</string>\n    <string name=\"notification_boost_name\">Boosts</string>\n    <string name=\"notification_boost_description\">Notificações quando derem boost em meus toots</string>\n    <string name=\"notification_favourite_name\">Favoritos</string>\n    <string name=\"notification_favourite_description\">Notificações quando os meus toots forem marcados como favoritos</string>\n    <string name=\"notification_mention_format\">%1$s te mencionou</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s e %4$d outros</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, e %3$s</string>\n    <string name=\"notification_summary_small\">%1$s e %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d nova interação</item>\n        <item quantity=\"many\">%1$d novas interações</item>\n        <item quantity=\"other\">%1$d novas interações</item>\n    </plurals>\n    <string name=\"description_account_locked\">Perfil trancado</string>\n    <string name=\"about_title_activity\">Sobre</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_tusky_license\">Tusky é um software livre e de código aberto. Ele é licenciado sob a versão 3 da Licença Pública Geral GNU. Leia a licença aqui: https://www.gnu.org/licenses/gpl-3.0.pt-br.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">Site do projeto: https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Reporte bugs e solicite funcionalidades:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Perfil do Tusky</string>\n    <string name=\"post_share_content\">Compartilhar conteúdo do toot</string>\n    <string name=\"post_share_link\">Compartilhar link do toot</string>\n    <string name=\"post_media_images\">Imagens</string>\n    <string name=\"post_media_video\">Vídeo</string>\n    <string name=\"state_follow_requested\">Solicitação enviada</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">em %1$dy</string>\n    <string name=\"abbreviated_in_days\">em %1$dd</string>\n    <string name=\"abbreviated_in_hours\">em %1$dh</string>\n    <string name=\"abbreviated_in_minutes\">em %1$dm</string>\n    <string name=\"abbreviated_in_seconds\">em %1$ds</string>\n    <string name=\"abbreviated_years_ago\">%1$da</string>\n    <string name=\"abbreviated_days_ago\">%1$dd</string>\n    <string name=\"abbreviated_hours_ago\">%1$dh</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"follows_you\">te segue</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Sempre mostrar mídia sensível</string>\n    <string name=\"title_media\">Mídia</string>\n    <string name=\"replying_to\">Respondendo @%1$s</string>\n    <string name=\"load_more_placeholder_text\">carregar mais</string>\n    <string name=\"add_account_name\">Adicionar conta</string>\n    <string name=\"add_account_description\">Adicionar nova conta Mastodon</string>\n    <string name=\"action_lists\">Listas</string>\n    <string name=\"title_lists\">Listas</string>\n    <string name=\"compose_active_account_description\">Postando como %1$s</string>\n    <string name=\"action_set_caption\">Descrever</string>\n    <string name=\"action_remove\">Remover</string>\n    <string name=\"lock_account_label\">Trancar perfil</string>\n    <string name=\"lock_account_label_description\">Requer aprovação manual de seguidores</string>\n    <string name=\"compose_save_draft\">Salvar rascunho?</string>\n    <string name=\"send_post_notification_title\">Enviando toot…</string>\n    <string name=\"send_post_notification_error_title\">Erro ao enviar toot</string>\n    <string name=\"send_post_notification_channel_name\">Enviando toots</string>\n    <string name=\"send_post_notification_cancel_title\">Envio cancelado</string>\n    <string name=\"send_post_notification_saved_content\">Uma cópia do toot foi salva nos seus rascunhos</string>\n    <string name=\"action_compose_shortcut\">Compor</string>\n    <string name=\"error_no_custom_emojis\">A sua instância %1$s não possui emojis personalizados</string>\n    <string name=\"emoji_style\">Estilo de emoji</string>\n    <string name=\"system_default\">Padrão do sistema</string>\n    <string name=\"download_fonts\">É necessário baixar estes pacotes de emojis primeiro</string>\n    <string name=\"performing_lookup_title\">Carregando…</string>\n    <string name=\"expand_collapse_all_posts\">Expandir/Ocultar todos os toots</string>\n    <string name=\"action_open_post\">Abrir toot</string>\n    <string name=\"restart_required\">É necessário reiniciar o aplicativo</string>\n    <string name=\"restart_emoji\">É necessário reiniciar o aplicativo para aplicar as alterações</string>\n    <string name=\"later\">Depois</string>\n    <string name=\"restart\">Reiniciar</string>\n    <string name=\"caption_systememoji\">Pacote de emojis padrão do seu dispositivo</string>\n    <string name=\"caption_blobmoji\">Emojis padrão do Android da versão 4.4 até 7.1</string>\n    <string name=\"caption_twemoji\">Pacote de emojis padrão do Mastodon</string>\n    <string name=\"download_failed\">Erro ao baixar</string>\n    <string name=\"profile_badge_bot_text\">Robô</string>\n    <string name=\"account_moved_description\">%1$s mudou-se para:</string>\n    <string name=\"reblog_private\">Dar boost para o mesmo público</string>\n    <string name=\"unreblog_private\">Desfazer boost</string>\n    <string name=\"license_description\">O Tusky contém código e recursos dos seguintes projetos de código aberto:</string>\n    <string name=\"license_apache_2\">Licenciado sob a licença Apache (cópia abaixo)</string>\n    <string name=\"profile_metadata_label\">Metadados do perfil</string>\n    <string name=\"profile_metadata_add\">Adicionar</string>\n    <string name=\"profile_metadata_label_label\">Rótulo</string>\n    <string name=\"profile_metadata_content_label\">Conteúdo</string>\n    <string name=\"pref_title_absolute_time\">Usar tempo absoluto</string>\n    <string name=\"title_reblogged_by\">Levou boost de</string>\n    <string name=\"title_favourited_by\">Favoritado por</string>\n    <string name=\"description_visibility_public\">Público</string>\n    <string name=\"description_visibility_private\">Seguidores</string>\n    <string name=\"error_network\">Ocorreu um erro de rede. Por favor verifique sua conexão e tente novamente.</string>\n    <string name=\"title_posts_pinned\">Fixado</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_content_show_more\">Mostrar mais</string>\n    <string name=\"post_content_show_less\">Mostrar menos</string>\n    <string name=\"message_empty\">Nada aqui.</string>\n    <string name=\"action_delete_and_redraft\">Excluir e rascunhar</string>\n    <string name=\"action_view_account_preferences\">Preferências da conta</string>\n    <string name=\"action_hashtags\">Hashtags</string>\n    <string name=\"action_open_reblogger\">Ver quem deu boost</string>\n    <string name=\"title_hashtags_dialog\">Hashtags</string>\n    <string name=\"action_open_media_n\">Abrir mídia #%1$d</string>\n    <string name=\"download_media\">Baixar mídia</string>\n    <string name=\"downloading_media\">Baixando mídia</string>\n    <string name=\"dialog_redraft_post_warning\">Excluir e rascunhar este toot?</string>\n    <string name=\"pref_title_timeline_filters\">Filtros</string>\n    <string name=\"pref_title_language\">Idioma</string>\n    <string name=\"post_privacy_followers_only\">Privado</string>\n    <string name=\"notification_poll_name\">Enquetes</string>\n    <string name=\"notification_poll_description\">Notificar sobre enquetes que já terminaram</string>\n    <string name=\"pref_title_public_filter_keywords\">Linhas públicas</string>\n    <string name=\"pref_title_thread_filter_keywords\">Conversas</string>\n    <string name=\"filter_addition_title\">Criar filtro</string>\n    <string name=\"filter_edit_title\">Editar filtro</string>\n    <string name=\"filter_dialog_remove_button\">Excluir</string>\n    <string name=\"filter_dialog_update_button\">Atualizar</string>\n    <string name=\"filter_add_description\">Frase para filtrar</string>\n    <string name=\"error_create_list\">Não foi possível criar a lista</string>\n    <string name=\"error_rename_list\">Não foi possível atualizar a lista</string>\n    <string name=\"error_delete_list\">Não foi possível excluir a lista</string>\n    <string name=\"action_create_list\">Criar uma lista</string>\n    <string name=\"action_rename_list\">Atualizar a lista</string>\n    <string name=\"action_delete_list\">Excluir lista</string>\n    <string name=\"hint_search_people_list\">Pesquisar pessoas que você segue</string>\n    <string name=\"action_add_to_list\">Adicionar conta à lista</string>\n    <string name=\"action_remove_from_list\">Remover conta da lista</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Descreva os conteúdos para deficientes visuais (até %1$d caractere)</item>\n        <item quantity=\"many\">Descreva os conteúdos para deficientes visuais (até %1$d caracteres)</item>\n        <item quantity=\"other\">Descreva os conteúdos para deficientes visuais (até %1$d caracteres)</item>\n    </plurals>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"label_remote_account\">As informações abaixo podem refletir incompletamente o perfil do usuário. Toque aqui para abrir o perfil completo no navegador.</string>\n    <string name=\"unpin_action\">Desafixar</string>\n    <string name=\"pin_action\">Fixar</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> Favorito</item>\n        <item quantity=\"many\"><b>%1$s</b> Favoritos</item>\n        <item quantity=\"other\"><b>%1$s</b> Favoritos</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> Boost</item>\n        <item quantity=\"many\"><b>%1$s</b> Boosts</item>\n        <item quantity=\"other\"><b>%1$s</b> Boosts</item>\n    </plurals>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s e %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s e %3$d outros</string>\n    <string name=\"description_post_media\">Mídia: %1$s</string>\n    <string name=\"description_post_cw\">Aviso de Conteúdo: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Sem descrição</string>\n    <string name=\"description_post_reblogged\">Você deu boost</string>\n    <string name=\"description_post_favourited\">Favoritado</string>\n    <string name=\"description_visibility_unlisted\">Não-listado</string>\n    <string name=\"description_visibility_direct\">Direto</string>\n    <string name=\"hint_list_name\">Nome da lista</string>\n    <string name=\"pick_hashtag_hint\">Hashtag sem #</string>\n    <string name=\"notifications_clear\">Excluir notificações</string>\n    <string name=\"notifications_apply_filter\">Filtrar notificações</string>\n    <string name=\"filter_apply\">Salvar</string>\n    <string name=\"compose_shortcut_long_label\">Compor toot</string>\n    <string name=\"compose_shortcut_short_label\">Compor</string>\n    <string name=\"pref_title_bot_overlay\">Mostrar indicador de robôs</string>\n    <string name=\"notification_clear_text\">Tem certeza de que deseja limpar permanentemente todas as suas notificações?</string>\n    <string name=\"compose_preview_image_description\">Opções para imagem %1$s</string>\n    <string name=\"poll_info_format\"> <!-- 15 votos • 1 hora restante --> %1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s voto</item>\n        <item quantity=\"many\">%1$s votos</item>\n        <item quantity=\"other\">%1$s votos</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">termina em %1$s</string>\n    <string name=\"poll_info_closed\">Terminou</string>\n    <string name=\"poll_vote\">Votar</string>\n    <string name=\"poll_ended_voted\">Uma enquete que você votou terminou</string>\n    <string name=\"poll_ended_created\">Sua enquete terminou</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d dia restante</item>\n        <item quantity=\"many\">%1$d dias restantes</item>\n        <item quantity=\"other\">%1$d dias restantes</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d hora restante</item>\n        <item quantity=\"many\">%1$d horas restantes</item>\n        <item quantity=\"other\">%1$d horas restantes</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d minuto restante</item>\n        <item quantity=\"many\">%1$d minutos restantes</item>\n        <item quantity=\"other\">%1$d minutos restantes</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d segundo restante</item>\n        <item quantity=\"many\">%1$d segundos restantes</item>\n        <item quantity=\"other\">%1$d segundos restantes</item>\n    </plurals>\n    <string name=\"pref_title_animate_gif_avatars\">Reproduzir GIFs</string>\n    <string name=\"description_poll\">Enquete com as opções: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"caption_notoemoji\">Pacote de emojis atual do Google</string>\n    <string name=\"button_continue\">Continuar</string>\n    <string name=\"button_back\">Voltar</string>\n    <string name=\"button_done\">Ok</string>\n    <string name=\"report_sent_success\">\\@%1$s denunciado com sucesso</string>\n    <string name=\"hint_additional_info\">Comentários adicionais</string>\n    <string name=\"report_remote_instance\">Encaminhar para %1$s</string>\n    <string name=\"failed_report\">Erro ao denunciar</string>\n    <string name=\"failed_fetch_posts\">Erro ao carregar toots</string>\n    <string name=\"report_description_1\">A denúncia será enviada aos moderadores da instância. Explique por que denunciou a conta:</string>\n    <string name=\"report_description_remote_instance\">A conta está em outra instância. Enviar uma cópia anônima da denúncia para lá?</string>\n    <string name=\"title_domain_mutes\">Instâncias bloqueadas</string>\n    <string name=\"action_view_domain_mutes\">Instâncias bloqueadas</string>\n    <string name=\"action_mute_domain\">Bloquear %1$s</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s desbloqueada</string>\n    <string name=\"mute_domain_warning\">Tem certeza de que deseja bloquear tudo de %1$s? Você não verá mais o conteúdo desta instância em nenhuma linha do tempo pública ou nas suas notificações. Seus seguidores desta instância serão removidos.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Bloquear instância</string>\n    <string name=\"filter_dialog_whole_word\">Toda palavra</string>\n    <string name=\"filter_dialog_whole_word_description\">Se for apenas alfanumérico, só se aplicará se combinar com a palavra inteira</string>\n    <string name=\"action_add_poll\">Adicionar enquete</string>\n    <string name=\"pref_title_alway_open_spoiler\">Sempre expandir toots com Aviso de Conteúdo</string>\n    <string name=\"title_accounts\">Contas</string>\n    <string name=\"failed_search\">Erro ao pesquisar</string>\n    <string name=\"create_poll_title\">Enquete</string>\n    <string name=\"duration_5_min\">5 minutos</string>\n    <string name=\"duration_30_min\">30 minutos</string>\n    <string name=\"duration_1_hour\">1 hora</string>\n    <string name=\"duration_6_hours\">6 horas</string>\n    <string name=\"duration_1_day\">1 dia</string>\n    <string name=\"duration_3_days\">3 dias</string>\n    <string name=\"duration_7_days\">7 dias</string>\n    <string name=\"add_poll_choice\">Adicionar opção</string>\n    <string name=\"poll_allow_multiple_choices\">Múltiplas opções</string>\n    <string name=\"poll_new_choice_hint\">Opção %1$d</string>\n    <string name=\"edit_poll\">Editar</string>\n    <string name=\"title_scheduled_posts\">Agendados</string>\n    <string name=\"action_edit\">Editar</string>\n    <string name=\"action_access_scheduled_posts\">Agendados</string>\n    <string name=\"action_schedule_post\">Agendar toot</string>\n    <string name=\"action_reset_schedule\">Cancelar</string>\n    <string name=\"post_lookup_error_format\">Erro ao pesquisar %1$s</string>\n    <string name=\"title_bookmarks\">Salvos</string>\n    <string name=\"action_bookmark\">Salvar</string>\n    <string name=\"action_view_bookmarks\">Salvos</string>\n    <string name=\"about_powered_by_tusky\">Desenvolvido por Tusky</string>\n    <string name=\"description_post_bookmarked\">Salvo</string>\n    <string name=\"select_list_title\">Selecionar lista</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"no_scheduled_posts\">Sem toots agendados.</string>\n    <string name=\"no_drafts\">Sem rascunhos.</string>\n    <string name=\"warning_scheduling_interval\">Mastodon possui um intervalo mínimo de 5 minutos para agendar.</string>\n    <string name=\"notification_follow_request_name\">Seguidores pendentes</string>\n    <string name=\"notification_follow_request_format\">%1$s quer te seguir</string>\n    <string name=\"action_mute_conversation\">Silenciar conversa</string>\n    <string name=\"action_unmute_conversation\">Dessilenciar conversa</string>\n    <string name=\"dialog_block_warning\">Bloquear @%1$s?</string>\n    <string name=\"dialog_mute_warning\">Silenciar @%1$s?</string>\n    <string name=\"notification_follow_request_description\">Notificações sobre seguidores pendentes</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s pessoa</item>\n        <item quantity=\"many\">%1$s pessoas</item>\n        <item quantity=\"other\">%1$s pessoas</item>\n    </plurals>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Ativar deslizar para alternar entre abas</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Mostrar prévias de links nas linhas</string>\n    <string name=\"pref_title_confirm_reblogs\">Solicitar confirmação antes de dar boost</string>\n    <string name=\"hashtags\">Hashtags</string>\n    <string name=\"add_hashtag_title\">Adicionar hashtag</string>\n    <string name=\"pref_title_gradient_for_media\">Mostrar blur em mídia sensível</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Inferior</string>\n    <string name=\"pref_main_nav_position_option_top\">Superior</string>\n    <string name=\"pref_main_nav_position\">Posição do menu</string>\n    <string name=\"dialog_mute_hide_notifications\">Ocultar notificações</string>\n    <string name=\"action_unmute_domain\">Desbloquear %1$s</string>\n    <string name=\"action_unmute_desc\">Dessilenciar %1$s</string>\n    <string name=\"pref_title_hide_top_toolbar\">Ocultar o título da barra superior de tarefas</string>\n    <string name=\"notification_subscription_description\">Notificações quando alguém que eu sigo publicar uma novo toot</string>\n    <string name=\"drafts_failed_loading_reply\">Erro ao carregar toot para responder</string>\n    <string name=\"drafts_post_failed_to_send\">Erro ao enviar o toot!</string>\n    <string name=\"drafts_post_reply_removed\">O toot em que se rascunhou uma resposta foi excluído</string>\n    <string name=\"draft_deleted\">Rascunho excluído</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Não é possível anexar mais de %1$d arquivo de mídia.</item>\n        <item quantity=\"many\">Não é possível anexar mais de %1$d arquivos de mídia.</item>\n        <item quantity=\"other\">Não é possível anexar mais de %1$d arquivos de mídia.</item>\n    </plurals>\n    <string name=\"wellbeing_hide_stats_profile\">Ocultar status dos perfis</string>\n    <string name=\"wellbeing_hide_stats_posts\">Ocultar status dos toots</string>\n    <string name=\"limit_notifications\">Limitar notificações da linha do tempo</string>\n    <string name=\"review_notifications\">Revisar notificações</string>\n    <string name=\"wellbeing_mode_notice\">Algumas informações que podem afetar seu bem-estar serão ocultadas. Isso inclui:\n\\n\n\\n- Notificações de favoritos, boosts e seguidores\n\\n- Número de favoritos e boosts nos toots\n\\n- Status de toots e seguidores nos perfis\n\\n\n\\nNotificações push não serão afetadas, mas é possível revisar sua preferência manualmente.</string>\n    <string name=\"account_note_saved\">Salvo!</string>\n    <string name=\"account_note_hint\">Nota pessoal sobre este perfil aqui</string>\n    <string name=\"pref_title_wellbeing_mode\">Bem-estar</string>\n    <string name=\"no_announcements\">Sem comunicados.</string>\n    <string name=\"duration_indefinite\">Indefinido</string>\n    <string name=\"label_duration\">Duração</string>\n    <string name=\"post_media_attachments\">Anexos</string>\n    <string name=\"post_media_audio\">Áudio</string>\n    <string name=\"notification_subscription_name\">Novos toots</string>\n    <string name=\"notification_subscription_format\">%1$s recém tootou</string>\n    <string name=\"title_announcements\">Comunicados</string>\n    <string name=\"follow_requests_info\">Apesar do seu perfil não ser trancado, %1$s exige que você revise a solicitação para te seguir destes perfis manualmente.</string>\n    <string name=\"action_unsubscribe_account\">Cancelar</string>\n    <string name=\"action_subscribe_account\">Notificar</string>\n    <string name=\"pref_title_animate_custom_emojis\">Animar emojis personalizados</string>\n    <string name=\"dialog_delete_conversation_warning\">Excluir esta conversa?</string>\n    <string name=\"action_delete_conversation\">Excluir conversa</string>\n    <string name=\"dialog_delete_list_warning\">Deseja excluir a lista %1$s?</string>\n    <string name=\"action_unbookmark\">Remover do Salvos</string>\n    <string name=\"pref_title_confirm_favourites\">Solicitar confirmação antes de favoritar</string>\n    <string name=\"duration_30_days\">30 dias</string>\n    <string name=\"duration_60_days\">60 dias</string>\n    <string name=\"duration_90_days\">90 dias</string>\n    <string name=\"duration_180_days\">180 dias</string>\n    <string name=\"duration_14_days\">14 dias</string>\n    <string name=\"duration_365_days\">365 dias</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Desabilitado</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;não definido&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;inválido&gt;</string>\n    <string name=\"pref_show_self_username_always\">Sempre</string>\n    <string name=\"error_image_edit_failed\">A imagem não pôde ser editada.</string>\n    <string name=\"error_multimedia_size_limit\">Arquivos de vídeo e áudio não podem exceder %1$s MB de tamanho.</string>\n    <string name=\"hint_media_description_missing\">A mídia deve ter uma descrição.</string>\n    <string name=\"pref_show_self_username_never\">Nunca</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"error_muting_hashtag_format\">Erro ao silenciar #%1$s</string>\n    <string name=\"action_browser_login\">Entrar com Navegador</string>\n    <string name=\"account_username_copied\">Nome de usuário copiado</string>\n    <string name=\"title_followed_hashtags\">Hashtags seguidas</string>\n    <string name=\"action_details\">Detalhes</string>\n    <string name=\"error_following_hashtag_format\">Erro ao seguir #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Erro ao deixar de seguir #%1$s</string>\n    <string name=\"error_could_not_load_login_page\">Não foi possível carregar a página de login.</string>\n    <string name=\"error_loading_account_details\">Falha ao carregar detalhes da conta</string>\n    <string name=\"a11y_label_loading_thread\">Carregando fio</string>\n    <string name=\"instance_rule_info\">Ao entrar, você concorda com as regras de %1$s.</string>\n    <string name=\"pref_title_reading_order\">Ordem de leitura</string>\n    <string name=\"set_focus_description\">Toque ou arraste o círculo para escolher o ponto focal que estará sempre visível nas miniaturas.</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"action_add_or_remove_from_list\">Adicionar ou remover da lista</string>\n    <string name=\"failed_to_pin\">Falha ao fixar</string>\n    <string name=\"failed_to_unpin\">Falha ao desafixar</string>\n    <string name=\"compose_save_draft_loses_media\">Salvar rascunho? (Os anexos serão reenviados assim que você restaurar o rascunho.)</string>\n    <string name=\"status_created_info\">%1$s publicou</string>\n    <string name=\"title_edits\">Edições</string>\n    <string name=\"pref_default_post_language\">Idioma padrão dos toots</string>\n    <string name=\"description_post_language\">Idioma do toot</string>\n    <string name=\"duration_no_change\">(Sem alteração)</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Compor toot</string>\n    <string name=\"report_category_violation\">Violação de regra</string>\n    <string name=\"report_category_spam\">Spam</string>\n    <string name=\"report_category_other\">Outros</string>\n    <string name=\"pref_show_self_username_disambiguate\">Quando várias contas estão conectadas</string>\n    <string name=\"pref_title_http_proxy_port_message\">A porta deve estar entre %1$d e %2$d</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"status_created_at_now\">agora</string>\n    <string name=\"action_post_failed\">Falha ao enviar</string>\n    <string name=\"action_post_failed_show_drafts\">Mostrar rascunhos</string>\n    <string name=\"pref_reading_order_newest_first\">Mais recentes primeiro</string>\n    <string name=\"account_date_joined\">Entrou em %1$s</string>\n    <string name=\"mute_notifications_switch\">Silenciar notificações</string>\n    <string name=\"pref_reading_order_oldest_first\">Mais antigos primeiro</string>\n    <string name=\"failed_to_add_to_list\">Falha ao adicionar a conta à lista</string>\n    <string name=\"description_login\">Funciona na maioria dos casos. Nenhum dado é vazado para outros aplicativos.</string>\n    <string name=\"description_browser_login\">Pode oferecer suporte a métodos de autenticação adicionais, mas requer um navegador compatível.</string>\n    <string name=\"failed_to_remove_from_list\">Falha ao remover a conta da lista</string>\n    <string name=\"status_edit_info\">%1$s editou</string>\n    <string name=\"action_continue_edit\">Continuar editando</string>\n    <string name=\"compose_unsaved_changes\">Você tem alterações não salvas.</string>\n    <string name=\"description_post_edited\">Editado</string>\n    <string name=\"delete_scheduled_post_warning\">Excluir este toot agendado?</string>\n    <string name=\"action_unfollow_hashtag_format\">Deixar de seguir #%1$s?</string>\n    <string name=\"action_share_account_link\">Compartilhar link da conta</string>\n    <string name=\"action_share_account_username\">Compartilhar nome de usuário da conta</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"post_edited\">Editado %1$s</string>\n    <string name=\"no_lists\">Você não tem nenhuma lista.</string>\n    <string name=\"notification_update_format\">%1$s editou um toot</string>\n    <string name=\"error_following_hashtags_unsupported\">Esta instância não oferece o recurso de seguir hashtags.</string>\n    <string name=\"notification_sign_up_description\">Notificações sobre novos usuários</string>\n    <string name=\"action_set_focus\">Definir ponto de foco</string>\n    <string name=\"action_edit_image\">Editar imagem</string>\n    <string name=\"saving_draft\">Salvando rascunho…</string>\n    <string name=\"title_login\">Entrar</string>\n    <string name=\"instance_rule_title\">%1$s regras</string>\n    <string name=\"pref_ui_text_size\">Tamanho do texto da IU</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d pessoas estão falando sobre a hashtag %2$s</string>\n    <string name=\"total_usage\">Uso total</string>\n    <string name=\"notification_listenable_worker_name\">Atividade em segundo plano</string>\n    <string name=\"notification_listenable_worker_description\">Notificações quando o Tusky está trabalhando em segundo plano</string>\n    <string name=\"notification_notification_worker\">Buscando notificações…</string>\n    <string name=\"about_device_info_title\">Seu dispositivo</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nVersão Android: %3$s\n\\nVersão do SDK: %4$d</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nVersão: %3$s</string>\n    <string name=\"about_account_info_title\">Sua conta</string>\n    <string name=\"action_refresh\">Atualizar</string>\n    <string name=\"action_add\">Adicionar</string>\n    <string name=\"notification_unknown_name\">Desconhecido</string>\n    <string name=\"dialog_delete_filter_text\">Excluir filtro \\'%1$s\\'?</string>\n    <string name=\"dialog_delete_filter_positive_action\">Excluir</string>\n    <string name=\"dialog_save_profile_changes_message\">Você deseja salvar as alterações do seu perfil?</string>\n    <string name=\"about_copied\">Versão e informações do dispositivo copiadas</string>\n    <string name=\"status_filter_placeholder_label_format\">Filtrado: %1$s</string>\n    <string name=\"pref_title_account_filter_keywords\">Perfis</string>\n    <string name=\"post_media_image\">Imagem</string>\n    <string name=\"muting_hashtag_success_format\">Silenciando a hashtag #%1$s com um aviso</string>\n    <string name=\"label_filter_title\">Título</string>\n    <string name=\"filter_action_warn\">Aviso</string>\n    <string name=\"filter_action_hide\">Esconder</string>\n    <string name=\"about_copy\">Copiar a versão e as informações do dispositivo</string>\n    <string name=\"load_newest_notifications\">Carregar notificações mais recentes</string>\n    <string name=\"compose_delete_draft\">Excluir rascunho?</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-pt-rPT/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"post_text_size_largest\">Maior</string>\n    <string name=\"notification_subscription_name\">Publicações novas</string>\n    <string name=\"notification_sign_up_name\">Criações de contas</string>\n    <string name=\"notification_summary_small\">%1$s e %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d nova interação</item>\n        <item quantity=\"many\">%1$d novas interações</item>\n        <item quantity=\"other\">%1$d novas interações</item>\n    </plurals>\n    <string name=\"replying_to\">A responder a @%1$s</string>\n    <string name=\"lock_account_label_description\">Necessita de aprovar manualmente os seguidores</string>\n    <string name=\"compose_save_draft\">Guardar rascunho?</string>\n    <string name=\"later\">Depois</string>\n    <string name=\"unpin_action\">Desafixar</string>\n    <string name=\"conversation_2_recipients\">%1$s e %2$s</string>\n    <string name=\"pref_title_wellbeing_mode\">Bem-estar</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Escrever Publicação</string>\n    <string name=\"dialog_delete_list_warning\">Pretende remover a lista %1$s?</string>\n    <string name=\"follow_requests_info\">Apesar do seu perfil não ser privado, %1$s exige que você reveja manualmente as solicitações para te seguir destes perfis.</string>\n    <string name=\"action_subscribe_account\">Subscrever</string>\n    <string name=\"action_unsubscribe_account\">Remover subscrição</string>\n    <string name=\"error_authorization_denied\">Autorização negada. Se tem a certeza que introduziu as credenciais corretas, tente fazer login através do navegador pelo menu.</string>\n    <string name=\"error_retrieving_oauth_token\">Erro ao adquirir token de login. Se o erro persistir, tenta fazer login através do navegador pelo menu.</string>\n    <string name=\"error_compose_character_limit\">A publicação é muito extensa!</string>\n    <string name=\"error_media_upload_type\">Esse tipo de ficheiro não pode ser enviado.</string>\n    <string name=\"error_media_upload_opening\">Não foi possível abrir esse ficheiro.</string>\n    <string name=\"error_media_upload_permission\">É necessária permissão para ler o armazenamento.</string>\n    <string name=\"error_media_download_permission\">É necessária permissão para escrever no armazenamento.</string>\n    <string name=\"error_media_upload_image_or_video\">Não é possível anexar imagens e vídeos na mesma publicação.</string>\n    <string name=\"error_media_upload_sending\">Erro ao enviar.</string>\n    <string name=\"error_sender_account_gone\">Erro ao enviar a publicação.</string>\n    <string name=\"title_home\">Página inicial</string>\n    <string name=\"title_notifications\">Notificações</string>\n    <string name=\"title_public_local\">Local</string>\n    <string name=\"title_public_federated\">Federada</string>\n    <string name=\"title_direct_messages\">Mensagens diretas</string>\n    <string name=\"title_tab_preferences\">Separadores</string>\n    <string name=\"title_view_thread\">Conversa</string>\n    <string name=\"title_posts\">Publicações</string>\n    <string name=\"title_posts_with_replies\">Com respostas</string>\n    <string name=\"title_posts_pinned\">Fixado</string>\n    <string name=\"title_follows\">Segue</string>\n    <string name=\"title_followers\">Seguidores</string>\n    <string name=\"title_favourites\">Favoritos</string>\n    <string name=\"title_bookmarks\">Itens guardados</string>\n    <string name=\"title_mutes\">Utilizadores silenciados</string>\n    <string name=\"title_blocks\">Utilizadores bloqueados</string>\n    <string name=\"title_domain_mutes\">Instâncias bloqueadas</string>\n    <string name=\"title_follow_requests\">Seguidores pendentes</string>\n    <string name=\"post_sensitive_media_title\">Conteúdo sensível</string>\n    <string name=\"title_edit_profile\">Edite o seu perfil</string>\n    <string name=\"post_media_hidden_title\">Conteúdo multimédia ocultado</string>\n    <string name=\"title_drafts\">Rascunhos</string>\n    <string name=\"post_sensitive_media_directions\">Toque para ver</string>\n    <string name=\"post_content_warning_show_more\">Mostrar mais</string>\n    <string name=\"post_content_warning_show_less\">Mostrar menos</string>\n    <string name=\"post_content_show_more\">Expandir</string>\n    <string name=\"post_content_show_less\">Contrair</string>\n    <string name=\"title_scheduled_posts\">Publicações agendadas</string>\n    <string name=\"title_announcements\">Anúncios</string>\n    <string name=\"title_licenses\">Licenças</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s partilhou</string>\n    <string name=\"message_empty\">Nada aqui.</string>\n    <string name=\"footer_empty\">Nada para ver aqui. Arraste para baixo para atualizar!</string>\n    <string name=\"notification_reblog_format\">%1$s partilhou a sua publicação</string>\n    <string name=\"notification_favourite_format\">%1$s gostou da sua publicação</string>\n    <string name=\"notification_follow_format\">%1$s está a seguir-te</string>\n    <string name=\"notification_follow_request_format\">%1$s pediu para te seguir</string>\n    <string name=\"notification_sign_up_format\">%1$s criou conta</string>\n    <string name=\"notification_subscription_format\">%1$s acabou de publicar</string>\n    <string name=\"notification_update_format\">%1$s editou uma publicação</string>\n    <string name=\"report_username_format\">Denunciar @%1$s</string>\n    <string name=\"report_comment_hint\">Comentários adicionais?</string>\n    <string name=\"action_quick_reply\">Resposta Rápida</string>\n    <string name=\"action_reply\">Responder</string>\n    <string name=\"action_reblog\">Fazer boost</string>\n    <string name=\"action_unreblog\">Desfazer boost</string>\n    <string name=\"action_favourite\">Adicionar aos favoritos</string>\n    <string name=\"action_unfavourite\">Remover dos favoritos</string>\n    <string name=\"action_bookmark\">Guardar</string>\n    <string name=\"action_unbookmark\">Remover dos itens guardados</string>\n    <string name=\"action_more\">Mais</string>\n    <string name=\"action_compose\">Escrever</string>\n    <string name=\"action_login\">Login com o Tusky</string>\n    <string name=\"action_logout\">Terminar sessão</string>\n    <string name=\"action_logout_confirm\">Tem a certeza que deseja sair da conta %1$s? Isto vai apagar toda a informação local da conta, incluindo rascunhos e configurações.</string>\n    <string name=\"action_follow\">Seguir</string>\n    <string name=\"action_unfollow\">Deixar de seguir</string>\n    <string name=\"action_block\">Bloquear</string>\n    <string name=\"action_unblock\">Desbloquear</string>\n    <string name=\"action_hide_reblogs\">Esconder boosts</string>\n    <string name=\"action_show_reblogs\">Mostrar boosts</string>\n    <string name=\"action_report\">Denunciar</string>\n    <string name=\"action_edit\">Editar</string>\n    <string name=\"action_delete\">Apagar</string>\n    <string name=\"action_delete_conversation\">Apagar conversa</string>\n    <string name=\"action_delete_and_redraft\">Apagar e criar novo rascunho</string>\n    <string name=\"action_send\">PUBLICAÇÃO</string>\n    <string name=\"action_send_public\">PUBLICAÇÃO!</string>\n    <string name=\"action_retry\">Tentar novamente</string>\n    <string name=\"action_close\">Fechar</string>\n    <string name=\"action_view_profile\">Perfil</string>\n    <string name=\"action_view_preferences\">Configurações</string>\n    <string name=\"action_view_account_preferences\">Configurações da conta</string>\n    <string name=\"action_view_favourites\">Favoritos</string>\n    <string name=\"action_view_bookmarks\">Itens Guardados</string>\n    <string name=\"action_view_mutes\">Utilizadores silenciados</string>\n    <string name=\"action_view_blocks\">Utilizadores bloqueados</string>\n    <string name=\"action_view_domain_mutes\">Instâncias bloqueadas</string>\n    <string name=\"action_view_follow_requests\">Seguidores pendentes</string>\n    <string name=\"action_view_media\">Conteúdo multimédia</string>\n    <string name=\"action_open_in_web\">Abrir no navegador</string>\n    <string name=\"action_add_media\">Adicionar conteúdo multimédia</string>\n    <string name=\"action_add_poll\">Adicionar votação</string>\n    <string name=\"action_photo_take\">Tirar foto</string>\n    <string name=\"action_share\">Partilhar</string>\n    <string name=\"action_mute\">Silenciar</string>\n    <string name=\"action_unmute\">Remover silêncio</string>\n    <string name=\"action_unmute_desc\">Remover %1$s do silêncio</string>\n    <string name=\"action_mute_domain\">Silenciar %1$s</string>\n    <string name=\"action_unmute_domain\">Remover %1$s do silêncio</string>\n    <string name=\"action_mute_conversation\">Silenciar conversa</string>\n    <string name=\"action_unmute_conversation\">Remover conversa do silêncio</string>\n    <string name=\"action_mention\">Mencionar</string>\n    <string name=\"action_hide_media\">Esconder conteúdo multimédia</string>\n    <string name=\"action_open_drawer\">Abrir menu</string>\n    <string name=\"action_search\">Pesquisar</string>\n    <string name=\"action_access_drafts\">Rascunhos</string>\n    <string name=\"action_access_scheduled_posts\">Publicações agendadas</string>\n    <string name=\"action_toggle_visibility\">Privacidade da publicação</string>\n    <string name=\"action_content_warning\">Aviso de conteúdo</string>\n    <string name=\"action_emoji_keyboard\">Teclado de emojis</string>\n    <string name=\"action_schedule_post\">Agendar Pubicação</string>\n    <string name=\"action_reset_schedule\">Redefinir</string>\n    <string name=\"action_add_tab\">Adicionar Separador</string>\n    <string name=\"action_links\">Hiperligações</string>\n    <string name=\"action_mentions\">Menções</string>\n    <string name=\"action_hashtags\">Hashtags</string>\n    <string name=\"action_open_reblogger\">Ver autor do boost</string>\n    <string name=\"action_open_reblogged_by\">Mostrar boosts</string>\n    <string name=\"action_open_faved_by\">Mostrar favoritos</string>\n    <string name=\"title_hashtags_dialog\">Hashtags</string>\n    <string name=\"title_mentions_dialog\">Menções</string>\n    <string name=\"title_links_dialog\">Hiperligações</string>\n    <string name=\"action_open_media_n\">Abrir conteúdo multimédia #%1$d</string>\n    <string name=\"download_image\">A descarregar %1$s</string>\n    <string name=\"action_copy_link\">Copiar a hiperligação</string>\n    <string name=\"action_open_as\">Abrir como %1$s</string>\n    <string name=\"action_share_as\">Partilhar como…</string>\n    <string name=\"download_media\">Descarregar conteúdo multimédia</string>\n    <string name=\"downloading_media\">A descarregar conteúdo multimédia</string>\n    <string name=\"send_post_link_to\">Partilhar ligação da publicação via…</string>\n    <string name=\"send_post_content_to\">Partilhar publicação via…</string>\n    <string name=\"send_media_to\">Partilhar conteúdo multimédia via…</string>\n    <string name=\"confirmation_reported\">Enviado!</string>\n    <string name=\"confirmation_unblocked\">Utilizador desbloqueado</string>\n    <string name=\"confirmation_unmuted\">Utilizador removido do silêncio</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s novamente visível</string>\n    <string name=\"hint_domain\">Que instância?</string>\n    <string name=\"hint_compose\">Em que está a pensar?</string>\n    <string name=\"hint_content_warning\">Aviso de conteúdo</string>\n    <string name=\"hint_display_name\">Nome</string>\n    <string name=\"hint_note\">Biografia</string>\n    <string name=\"hint_search\">Pesquisar…</string>\n    <string name=\"search_no_results\">Sem resultados</string>\n    <string name=\"label_quick_reply\">Responder…</string>\n    <string name=\"label_avatar\">Avatar</string>\n    <string name=\"label_header\">Cabeçalho</string>\n    <string name=\"link_whats_an_instance\">O que é uma instância?</string>\n    <string name=\"login_connection\">A ligar…</string>\n    <string name=\"dialog_whats_an_instance\">O endereço ou domínio de qualquer instância pode ser introduzido aqui, como por exemplo ciberlandia.pt, masto.pt, mastodon.social ou qualquer <a href=\"https://instances.social\">outra!</a> \n\\n \n\\nSe ainda não tem uma conta, insira o nome da instância onde pretende participar e crie uma conta nela. \n\\n \n\\nUma instância é o local onde sua conta é criada, mas pode facilmente seguir e comunicar com pessoas de outras instâncias como se estivessem todos no mesmo site. \n\\n \n\\nMais informações disponíveis em <a href=\"https://joinmastodon.org\">joinmastodon.org</a>.</string>\n    <string name=\"dialog_title_finishing_media_upload\">A Terminar Envio de Conteúdo Multimédia</string>\n    <string name=\"dialog_message_uploading_media\">A enviar…</string>\n    <string name=\"dialog_download_image\">Descarregar</string>\n    <string name=\"dialog_message_cancel_follow_request\">Cancelar o pedido para seguir?</string>\n    <string name=\"dialog_unfollow_warning\">Deixar de seguir esta conta?</string>\n    <string name=\"dialog_delete_post_warning\">Apagar esta publicação?</string>\n    <string name=\"dialog_redraft_post_warning\">Apagar e rescrever esta publicação?</string>\n    <string name=\"dialog_delete_conversation_warning\">Apagar esta conversa?</string>\n    <string name=\"mute_domain_warning\">Tem a certeza que pretende bloquear a instância %1$s? Deixará de poder ver quaisquer conteúdos dessa instância em qualquer timeline pública ou nas suas notificações. Os seus seguidores dessa instância serão removidos.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Bloquear instância</string>\n    <string name=\"dialog_block_warning\">Bloquear @%1$s?</string>\n    <string name=\"dialog_mute_warning\">Silenciar @%1$s?</string>\n    <string name=\"dialog_mute_hide_notifications\">Esconder notificações</string>\n    <string name=\"visibility_public\">Público: Publicar em timelines públicas</string>\n    <string name=\"visibility_unlisted\">Não listado: Não publicar em timelines públicas</string>\n    <string name=\"visibility_private\">Privado: Publicar apenas para os seguidores</string>\n    <string name=\"visibility_direct\">Direto: Publicar apenas para os utilizadores mencionados</string>\n    <string name=\"pref_title_edit_notification_settings\">Notificações</string>\n    <string name=\"pref_title_notifications_enabled\">Notificações</string>\n    <string name=\"pref_title_notification_alerts\">Alertas</string>\n    <string name=\"pref_title_notification_alert_sound\">Notificar com som</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Notificar com vibração</string>\n    <string name=\"pref_title_notification_alert_light\">Notificar com luz</string>\n    <string name=\"pref_title_notification_filters\">Tipos de notificações ativas</string>\n    <string name=\"pref_title_appearance_settings\">Aparência</string>\n    <string name=\"pref_title_app_theme\">Tema da aplicação</string>\n    <string name=\"pref_title_timelines\">Timelines</string>\n    <string name=\"pref_title_timeline_filters\">Filtros</string>\n    <string name=\"app_them_dark\">Escuro</string>\n    <string name=\"app_theme_light\">Claro</string>\n    <string name=\"app_theme_black\">AMOLED</string>\n    <string name=\"app_theme_auto\">Automático ao pôr-do-sol</string>\n    <string name=\"app_theme_system\">Usar o Tema do Sistema</string>\n    <string name=\"pref_title_browser_settings\">Navegador</string>\n    <string name=\"pref_title_custom_tabs\">Usar Separadores Personalizados do Chrome</string>\n    <string name=\"pref_title_language\">Idioma</string>\n    <string name=\"pref_title_bot_overlay\">Mostrar indicador para bots</string>\n    <string name=\"pref_title_animate_gif_avatars\">Reproduzir avatars em GIF</string>\n    <string name=\"pref_title_gradient_for_media\">Mostrar desfoque em conteúdo multimédia sensíveis</string>\n    <string name=\"pref_title_animate_custom_emojis\">Animar emojis personalizados</string>\n    <string name=\"pref_title_post_filter\">Filtro da timeline</string>\n    <string name=\"pref_title_post_tabs\">Timeline inicial</string>\n    <string name=\"pref_title_show_boosts\">Mostrar boosts</string>\n    <string name=\"pref_title_show_replies\">Mostrar respostas</string>\n    <string name=\"pref_title_show_media_preview\">Descarregar pré-visualização de conteúdo multimédia</string>\n    <string name=\"pref_title_proxy_settings\">Proxy</string>\n    <string name=\"pref_title_http_proxy_settings\">Proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_enable\">Ativar proxy HTTP</string>\n    <string name=\"pref_title_http_proxy_server\">Servidor da proxy HTTP</string>\n    <string name=\"pref_default_post_privacy\">Privacidade das publicações (sincronizada com o servidor)</string>\n    <string name=\"pref_default_media_sensitivity\">Classificar sempre o conteúdo multimédia como sensível (sincronizada com o servidor)</string>\n    <string name=\"pref_publishing\">Opções padrão das publicações</string>\n    <string name=\"pref_failed_to_sync\">Erro ao sincronizar configurações</string>\n    <string name=\"pref_main_nav_position\">Posição do menu principal</string>\n    <string name=\"pref_main_nav_position_option_top\">Superior</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Inferior</string>\n    <string name=\"post_privacy_public\">Público</string>\n    <string name=\"pref_title_http_proxy_port\">Porta da proxy HTTP</string>\n    <string name=\"post_privacy_unlisted\">Não listado</string>\n    <string name=\"post_privacy_followers_only\">Apenas seguidores</string>\n    <string name=\"post_text_size_smallest\">Menor</string>\n    <string name=\"post_text_size_small\">Pequeno</string>\n    <string name=\"post_text_size_medium\">Médio</string>\n    <string name=\"post_text_size_large\">Grande</string>\n    <string name=\"notification_mention_name\">Menções novas</string>\n    <string name=\"notification_mention_descriptions\">Notificações para menções novas</string>\n    <string name=\"notification_follow_name\">Novos seguidores</string>\n    <string name=\"pref_post_text_size\">Tamanho do texto da publicação</string>\n    <string name=\"notification_follow_description\">Notificações para seguidores novos</string>\n    <string name=\"notification_follow_request_name\">Seguidores pendentes</string>\n    <string name=\"notification_follow_request_description\">Notificações para seguidores pendentes</string>\n    <string name=\"notification_boost_name\">Partilhas</string>\n    <string name=\"notification_poll_name\">Resultados da votação</string>\n    <string name=\"notification_poll_description\">Notificações para votações terminadas</string>\n    <string name=\"notification_subscription_description\">Notificações quando alguém para quem ativou os alertas enviar uma publicação nova</string>\n    <string name=\"notification_sign_up_description\">Notificações para novos utilizadores</string>\n    <string name=\"notification_update_name\">Edições de publicações</string>\n    <string name=\"notification_boost_description\">Notificações para boosts recebidos</string>\n    <string name=\"notification_favourite_name\">Favoritos</string>\n    <string name=\"notification_favourite_description\">Notificações quando as suas publicações são adicionados aos favoritos</string>\n    <string name=\"notification_update_description\">Notificações quando publicações com as quais interagiu forem editadas</string>\n    <string name=\"notification_mention_format\">%1$s mencionou-te</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s e %4$d outros</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s e %3$s</string>\n    <string name=\"description_account_locked\">Perfil Privado</string>\n    <string name=\"about_title_activity\">Sobre</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_powered_by_tusky\">A correr o Tusky</string>\n    <string name=\"filter_dialog_update_button\">Atualizar</string>\n    <string name=\"about_tusky_license\">Tusky é um software livre e de código aberto, licenciado com a versão 3 da GNU General Public License. Pode ler a licença aqui: https://www.gnu.org/licenses/gpl-3.0.pt-br.html</string>\n    <string name=\"about_project_site\">Página do projeto: https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Reportar erros e pedidos de funcionalidades:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Perfil do Tusky</string>\n    <string name=\"post_share_content\">Partilhar conteúdo da publicação</string>\n    <string name=\"post_share_link\">Partilhar hiperligação da publicação</string>\n    <string name=\"post_media_images\">Imagens</string>\n    <string name=\"post_media_video\">Vídeo</string>\n    <string name=\"post_media_audio\">Áudio</string>\n    <string name=\"post_media_attachments\">Anexos</string>\n    <string name=\"state_follow_requested\">Pedido para seguir enviado</string>\n    <string name=\"abbreviated_in_years\">em %1$dy</string>\n    <string name=\"abbreviated_in_days\">em %1$dd</string>\n    <string name=\"abbreviated_in_hours\">em %1$dh</string>\n    <string name=\"abbreviated_in_minutes\">em %1$dm</string>\n    <string name=\"abbreviated_in_seconds\">em %1$ds</string>\n    <string name=\"abbreviated_years_ago\">%1$da</string>\n    <string name=\"abbreviated_days_ago\">%1$dd</string>\n    <string name=\"abbreviated_hours_ago\">%1$dh</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"follows_you\">Segue-te</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Mostrar sempre conteúdo multimédia sensível</string>\n    <string name=\"pref_title_alway_open_spoiler\">Expandir sempre publicações com Aviso de Conteúdo</string>\n    <string name=\"filter_dialog_whole_word\">Palavra completa</string>\n    <string name=\"title_media\">Conteúdo Multimédia</string>\n    <string name=\"load_more_placeholder_text\">Carregar mais</string>\n    <string name=\"pref_title_public_filter_keywords\">Timelines públicas</string>\n    <string name=\"pref_title_thread_filter_keywords\">Conversas</string>\n    <string name=\"filter_addition_title\">Criar filtro</string>\n    <string name=\"filter_edit_title\">Editar filtro</string>\n    <string name=\"filter_dialog_remove_button\">Remover</string>\n    <string name=\"filter_dialog_whole_word_description\">Se a palavra ou frase for alfanumérica, só será aplicado se corresponder à palavra completa</string>\n    <string name=\"filter_add_description\">Frase para filtrar</string>\n    <string name=\"add_account_name\">Adicionar Conta</string>\n    <string name=\"add_account_description\">Adicionar nova Conta Mastodon</string>\n    <string name=\"action_lists\">Listas</string>\n    <string name=\"error_rename_list\">Não foi possível atualizar a lista</string>\n    <string name=\"title_lists\">Listas</string>\n    <string name=\"error_create_list\">Não foi possível criar a lista</string>\n    <string name=\"error_delete_list\">Não foi possível apagar a lista</string>\n    <string name=\"action_create_list\">Criar lista</string>\n    <string name=\"action_rename_list\">Atualizar lista</string>\n    <string name=\"action_delete_list\">Apagar lista</string>\n    <string name=\"hint_search_people_list\">Pesquisar pessoas que você segue</string>\n    <string name=\"action_add_to_list\">Adicionar conta à lista</string>\n    <string name=\"action_remove_from_list\">Remover conta da lista</string>\n    <string name=\"compose_active_account_description\">Publicar com a conta %1$s</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Descrição para deficientes visuais (até %1$d caractere)</item>\n        <item quantity=\"many\">Descrição para deficientes visuais (até %1$d caracteres)</item>\n        <item quantity=\"other\">Descrição para deficientes visuais (até %1$d caracteres)</item>\n    </plurals>\n    <string name=\"action_set_caption\">Escrever descrição</string>\n    <string name=\"action_remove\">Remover</string>\n    <string name=\"lock_account_label\">Proteger conta</string>\n    <string name=\"send_post_notification_title\">A enviar a publicação…</string>\n    <string name=\"send_post_notification_error_title\">Erro ao enviar a publicação</string>\n    <string name=\"send_post_notification_channel_name\">A Enviar as Publicações</string>\n    <string name=\"send_post_notification_cancel_title\">Envio cancelado</string>\n    <string name=\"send_post_notification_saved_content\">Uma cópia da publicação foi guardada nos seus rascunhos</string>\n    <string name=\"action_compose_shortcut\">Escrever</string>\n    <string name=\"error_no_custom_emojis\">A sua instância, %1$s, não tem emojis personalizados</string>\n    <string name=\"emoji_style\">Estilo dos emojis</string>\n    <string name=\"system_default\">Padrão do sistema</string>\n    <string name=\"download_fonts\">É necessário descarregar estes pacotes de emojis primeiro</string>\n    <string name=\"performing_lookup_title\">A fazer pesquisa…</string>\n    <string name=\"expand_collapse_all_posts\">Expandir/Contrair todas as publicações</string>\n    <string name=\"action_open_post\">Abrir publicação</string>\n    <string name=\"restart_required\">É necessário reiniciar a aplicação</string>\n    <string name=\"restart_emoji\">É necessário reiniciar o Tusky para aplicar as alterações</string>\n    <string name=\"restart\">Reiniciar</string>\n    <string name=\"caption_systememoji\">Pacote de emojis padrão do seu dispositivo</string>\n    <string name=\"caption_blobmoji\">Emojis padrão do Android 4.4 até ao 7.1</string>\n    <string name=\"caption_twemoji\">Pacote de emojis padrão do Mastodon</string>\n    <string name=\"caption_notoemoji\">Pacote de emojis atuais da Google</string>\n    <string name=\"download_failed\">Erro ao descarregar</string>\n    <string name=\"profile_badge_bot_text\">Robô</string>\n    <string name=\"account_moved_description\">%1$s mudou-se para:</string>\n    <string name=\"reblog_private\">Dar boost para o público inicial</string>\n    <string name=\"unreblog_private\">Desfazer boost</string>\n    <string name=\"license_description\">O Tusky contém código e recursos dos seguintes projetos de código aberto:</string>\n    <string name=\"license_apache_2\">Licenciado sob a licença Apache (cópia abaixo)</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">Metadados do perfil</string>\n    <string name=\"profile_metadata_add\">adicionar dados</string>\n    <string name=\"profile_metadata_label_label\">Rótulo</string>\n    <string name=\"profile_metadata_content_label\">Conteúdo</string>\n    <string name=\"pref_title_absolute_time\">Usar tempo absoluto</string>\n    <string name=\"label_remote_account\">As informações abaixo podem refletir, de forma incompleta, o perfil do utilizador. Toque aqui para abrir o perfil completo no navegador.</string>\n    <string name=\"pin_action\">Fixar</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> Favorito</item>\n        <item quantity=\"many\"><b>%1$s</b> Favoritos</item>\n        <item quantity=\"other\"><b>%1$s</b> Favoritos</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> Partilha</item>\n        <item quantity=\"many\"><b>%1$s</b> Partilhas</item>\n        <item quantity=\"other\"><b>%1$s</b> Partilhas</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">Boost dado por</string>\n    <string name=\"title_favourited_by\">Adicionado aos favoritos por</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s e %3$d mais</string>\n    <string name=\"description_post_media\">Conteúdo multimédia: %1$s</string>\n    <string name=\"description_post_cw\">Aviso de conteúdo: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Sem descrição</string>\n    <string name=\"description_post_reblogged\">Republicado</string>\n    <string name=\"description_post_favourited\">Adicionado aos favoritos</string>\n    <string name=\"description_post_bookmarked\">Guardado</string>\n    <string name=\"description_visibility_public\">Pública</string>\n    <string name=\"description_visibility_unlisted\">Não-listada</string>\n    <string name=\"description_visibility_private\">Seguidores</string>\n    <string name=\"description_visibility_direct\">Direta</string>\n    <string name=\"description_poll\">Votação com as opções: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"hint_list_name\">Nome da lista</string>\n    <string name=\"add_hashtag_title\">Adicionar hashtag</string>\n    <string name=\"pick_hashtag_hint\">Hashtag sem #</string>\n    <string name=\"hashtags\">Hashtags</string>\n    <string name=\"select_list_title\">Selecionar lista</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"notifications_clear\">Apagar</string>\n    <string name=\"notifications_apply_filter\">Filtrar</string>\n    <string name=\"filter_apply\">Aplicar</string>\n    <string name=\"compose_shortcut_long_label\">Escrever publicação</string>\n    <string name=\"compose_shortcut_short_label\">Escrever</string>\n    <string name=\"notification_clear_text\">Tem a certeza que pretende limpar todas as suas notificações?</string>\n    <string name=\"compose_preview_image_description\">Ações para imagem %1$s</string>\n    <string name=\"poll_info_format\"> \\u0020<!-- 15 votos • 1 hora restante --> \\u0020%1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s voto</item>\n        <item quantity=\"many\">%1$s votos</item>\n        <item quantity=\"other\">%1$s votos</item>\n    </plurals>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s pessoa</item>\n        <item quantity=\"many\">%1$s pessoas</item>\n        <item quantity=\"other\">%1$s pessoas</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">termina em %1$s</string>\n    <string name=\"poll_info_closed\">terminada</string>\n    <string name=\"poll_vote\">Votar</string>\n    <string name=\"poll_ended_voted\">Uma votação em que votou terminou</string>\n    <string name=\"poll_ended_created\">A sua votação terminou</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d dia restante</item>\n        <item quantity=\"many\">%1$d dias restantes</item>\n        <item quantity=\"other\">%1$d dias restantes</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d hora restante</item>\n        <item quantity=\"many\">%1$d horas restantes</item>\n        <item quantity=\"other\">%1$d horas restantes</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d minuto restante</item>\n        <item quantity=\"many\">%1$d minutos restantes</item>\n        <item quantity=\"other\">%1$d minutos restantes</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d segundo restante</item>\n        <item quantity=\"many\">%1$d segundos restantes</item>\n        <item quantity=\"other\">%1$d segundos restantes</item>\n    </plurals>\n    <string name=\"button_continue\">Continuar</string>\n    <string name=\"button_back\">Retroceder</string>\n    <string name=\"button_done\">Feito</string>\n    <string name=\"report_sent_success\">\\@%1$s denunciada com sucesso</string>\n    <string name=\"hint_additional_info\">Comentários adicionais</string>\n    <string name=\"report_remote_instance\">Encaminhar para %1$s</string>\n    <string name=\"failed_report\">Erro ao denunciar</string>\n    <string name=\"failed_fetch_posts\">Erro ao carregar publicações</string>\n    <string name=\"report_description_1\">A denúncia será enviada aos moderadores da instância. Pode adicionar abaixo uma explicação para a sua denúncia:</string>\n    <string name=\"report_description_remote_instance\">A conta está noutra instância. Quer enviar uma cópia anónima da denúncia para lá?</string>\n    <string name=\"title_accounts\">Contas</string>\n    <string name=\"failed_search\">Erro ao pesquisar</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Ativar gesto de deslizar para alternar entre separadores</string>\n    <string name=\"create_poll_title\">Votação</string>\n    <string name=\"label_duration\">Duração</string>\n    <string name=\"duration_indefinite\">Indefinido</string>\n    <string name=\"duration_5_min\">5 minutos</string>\n    <string name=\"duration_30_min\">30 minutos</string>\n    <string name=\"duration_1_hour\">1 hora</string>\n    <string name=\"duration_6_hours\">6 horas</string>\n    <string name=\"duration_1_day\">1 dia</string>\n    <string name=\"duration_3_days\">3 dias</string>\n    <string name=\"duration_7_days\">7 dias</string>\n    <string name=\"duration_14_days\">14 dias</string>\n    <string name=\"duration_30_days\">30 dias</string>\n    <string name=\"duration_60_days\">60 dias</string>\n    <string name=\"duration_90_days\">90 dias</string>\n    <string name=\"duration_180_days\">180 dias</string>\n    <string name=\"duration_365_days\">365 dias</string>\n    <string name=\"add_poll_choice\">Adicionar opção</string>\n    <string name=\"poll_allow_multiple_choices\">Escolha múltipla</string>\n    <string name=\"poll_new_choice_hint\">Opção %1$d</string>\n    <string name=\"edit_poll\">Editar</string>\n    <string name=\"post_lookup_error_format\">Erro ao pesquisar publicação %1$s</string>\n    <string name=\"no_drafts\">Não tem rascunhos.</string>\n    <string name=\"no_scheduled_posts\">Não tem publicações agendadas.</string>\n    <string name=\"account_note_saved\">Guardado!</string>\n    <string name=\"wellbeing_mode_notice\">Algumas informações que podem afetar seu bem-estar serão ocultadas. Isso inclui:\n\\n\n\\n- Notificações de favoritos, partilhas e seguidores\n\\n- Número de favoritos e partilhas nas publicações\n\\n- Status de publicações e seguidores nos perfis\n\\n\n\\nNotificações push não serão afetadas, mas é possível rever as configurações das notificações manualmente.</string>\n    <string name=\"review_notifications\">Rever Notificações</string>\n    <string name=\"limit_notifications\">Limitar notificações da timeline</string>\n    <string name=\"no_announcements\">Sem anúncios.</string>\n    <string name=\"warning_scheduling_interval\">O Mastodon tem um intervalo mínimo de agendamento de 5 minutos.</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Mostrar pré-visualização de hiperligações nas timelines</string>\n    <string name=\"pref_title_confirm_reblogs\">Mostrar confirmação antes de dar boost</string>\n    <string name=\"pref_title_confirm_favourites\">Mostrar confirmação antes de adicionar aos favoritos</string>\n    <string name=\"pref_title_hide_top_toolbar\">Esconder o título da barra superior</string>\n    <string name=\"account_note_hint\">Nota pessoal sobre este perfil</string>\n    <string name=\"wellbeing_hide_stats_posts\">Esconder estatísticas quantitativas nas publicações</string>\n    <string name=\"wellbeing_hide_stats_profile\">Esconder estatísticas quantitativas nos perfis</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Não é possível enviar mais de %1$d arquivo de conteúdo multimédia.</item>\n        <item quantity=\"many\">Não é possível enviar mais de %1$d arquivos de conteúdo multimédia.</item>\n        <item quantity=\"other\">Não é possível enviar mais de %1$d arquivos de conteúdo multimédia.</item>\n    </plurals>\n    <string name=\"drafts_post_failed_to_send\">Erro ao enviar a publicação!</string>\n    <string name=\"drafts_failed_loading_reply\">Erro ao carregar a informação da resposta</string>\n    <string name=\"draft_deleted\">Rascunho apagado</string>\n    <string name=\"drafts_post_reply_removed\">A publicação para a qual escreveu um rascunho foi apagada</string>\n    <string name=\"error_generic\">Ocorreu um erro.</string>\n    <string name=\"error_network\">Ocorreu um erro de conetividade. Por favor, verifique a sua ligação e tente novamente.</string>\n    <string name=\"error_empty\">Isto não pode estar vazio.</string>\n    <string name=\"error_invalid_domain\">A instância inserida é inválida</string>\n    <string name=\"error_failed_app_registration\">Erro ao autenticar com esta instância. Se o erro persistir, tenta fazer login através do navegador pelo menu.</string>\n    <string name=\"error_no_web_browser_found\">Não foi possível encontrar um navegador.</string>\n    <string name=\"error_authorization_unknown\">Ocorreu um erro de autorização não identificado. Se o erro persistir, tenta fazer login através do navegador pelo menu.</string>\n    <string name=\"title_login\">Entrar</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_edit_profile\">Editar perfil</string>\n    <string name=\"action_edit_own_profile\">Editar</string>\n    <string name=\"action_undo\">Desfazer</string>\n    <string name=\"action_accept\">Aceitar</string>\n    <string name=\"action_reject\">Rejeitar</string>\n    <string name=\"error_could_not_load_login_page\">Não foi possível carregar a página de autenticação.</string>\n    <string name=\"error_loading_account_details\">Erro ao carregar os detalhes da conta</string>\n    <string name=\"account_date_joined\">Criada há %1$s</string>\n    <string name=\"status_count_one_plus\">+1</string>\n    <string name=\"action_edit_image\">Editar imagem</string>\n    <string name=\"error_image_edit_failed\">Não foi possível editar a imagem.</string>\n    <string name=\"saving_draft\">A guardar rascunho…</string>\n    <string name=\"action_dismiss\">Descartar</string>\n    <string name=\"action_details\">Detalhes</string>\n    <string name=\"delete_scheduled_post_warning\">Apagar esta publicação agendada?</string>\n    <string name=\"set_focus_description\">Toca ou arrasta o círculo para escolher o ponto de focagem que estará sempre visível nas pré-visualizações.</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"duration_no_change\">(Sem alteração)</string>\n    <string name=\"pref_show_self_username_always\">Sempre</string>\n    <string name=\"pref_show_self_username_disambiguate\">Quando autenticado em várias contas</string>\n    <string name=\"pref_show_self_username_never\">Nunca</string>\n    <string name=\"description_post_language\">Idioma da publicação</string>\n    <string name=\"pref_title_show_self_username\">Mostrar o nome de utilizador nas barras de ferramentas</string>\n    <string name=\"error_multimedia_size_limit\">Os ficheiros de áudio e vídeo não podem exceder os %1$s MB.</string>\n    <string name=\"action_set_focus\">Define o ponto de focagem</string>\n    <string name=\"error_following_hashtag_format\">Erro ao seguir #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Erro ao deixar de seguir #%1$s</string>\n    <string name=\"action_add_reaction\">adicionar reação</string>\n    <string name=\"dialog_follow_hashtag_title\">Seguir hashtag</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Desativada</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;indefinido&gt;</string>\n    <string name=\"title_edits\">Edições</string>\n    <string name=\"hint_media_description_missing\">Imagem/Vídeo deve ter uma descrição.</string>\n    <string name=\"pref_title_http_proxy_port_message\">A porta deve estar entre %1$d e %2$d</string>\n    <string name=\"action_post_failed\">Erro no upload</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Ocorreu um erro no envio da sua publicação e ela foi guardada nos rascunhos.\n\\n\n\\nO servidor não pode ser contactado ou rejeitou a publicação.</item>\n        <item quantity=\"many\">Ocorreu um erro no envio das suas publicações e elas foram guardadas nos rascunhos.\n\\n\n\\nO servidor não pode ser contactado ou rejeitou as publicações.</item>\n        <item quantity=\"other\">Ocorreu um erro no envio das suas publicações e elas foram guardadas nos rascunhos.\n\\n\n\\nO servidor não pode ser contactado ou rejeitou as publicações.</item>\n    </plurals>\n    <string name=\"action_post_failed_show_drafts\">Mostrar rascunhos</string>\n    <string name=\"action_post_failed_do_nothing\">Descartar</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"error_muting_hashtag_format\">Erro ao silenciar #%1$s</string>\n    <string name=\"action_browser_login\">Iniciar sessão com o navegador</string>\n    <string name=\"notification_header_report_format\">%1$s reportou %2$s</string>\n    <string name=\"action_discard\">Descartar alterações</string>\n    <string name=\"action_continue_edit\">Continuar a editar</string>\n    <string name=\"action_share_account_link\">Partilhar ligação para a conta</string>\n    <string name=\"action_share_account_username\">Partilhar nome de utilizador da conta</string>\n    <string name=\"send_account_link_to\">Partilhar ligação da conta para…</string>\n    <string name=\"send_account_username_to\">Partilhar nome de utilizador da conta para…</string>\n    <string name=\"account_username_copied\">Nome de utilizador copiado</string>\n    <string name=\"confirmation_hashtag_unfollowed\">Deixou de seguir #%1$s</string>\n    <string name=\"post_edited\">Editado a %1$s</string>\n    <string name=\"title_followed_hashtags\">Hashtags seguidas</string>\n    <string name=\"title_public_trending_hashtags\">Hashtags populares</string>\n    <string name=\"pref_reading_order_newest_first\">Mais recentes primeiro</string>\n    <string name=\"pref_reading_order_oldest_first\">Mais antigas primeiro</string>\n    <string name=\"action_refresh\">Atualizar</string>\n    <string name=\"report_category_other\">Outro</string>\n    <string name=\"report_category_spam\">Spam</string>\n    <string name=\"title_public_trending_statuses\">Publicações populares</string>\n    <string name=\"pref_ui_text_size\">Tamanho do texto do interface</string>\n    <string name=\"label_image\">Imagem</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;inválida&gt;</string>\n    <string name=\"notification_listenable_worker_description\">Notificações quando Tusky está ativo em segundo plano</string>\n    <string name=\"notification_notification_worker\">A carregar notificações…</string>\n    <string name=\"notification_listenable_worker_name\">Atividade em segundo plano</string>\n    <string name=\"notification_prune_cache\">Manutenção de cache…</string>\n    <string name=\"pref_default_post_language\">Linguagem da publicação (sincronizada com o servidor)</string>\n    <string name=\"notification_report_name\">Denúncias</string>\n    <string name=\"notification_report_description\">Notificações de denúncias</string>\n    <string name=\"about_device_info_title\">O seu dispositivo</string>\n    <string name=\"notification_unknown_name\">Desconhecido</string>\n    <string name=\"app_theme_system_black\">Usar tema do Sistema (preto)</string>\n    <string name=\"error_following_hashtags_unsupported\">Esta instância não suporta a funcionalidade que permite seguir hashtags.</string>\n    <string name=\"error_media_upload_sending_fmt\">O envio falhou: %1$s</string>\n    <string name=\"pref_title_show_self_boosts\">Mostrar boosts da própria conta</string>\n    <string name=\"pref_title_show_self_boosts_description\">Alguém a dar boost à sua própria publicação</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nVersão Android: %3$s\n\\nVersão SDK: %4$d</string>\n    <string name=\"failed_to_remove_from_list\">Erro ao remover a conta da lista</string>\n    <string name=\"action_add_or_remove_from_list\">Adicionar ou remover da lista</string>\n    <string name=\"failed_to_add_to_list\">Erro ao adicionar a conta à lista</string>\n    <string name=\"failed_to_pin\">Erro ao Afixar</string>\n    <string name=\"compose_save_draft_loses_media\">Guardar rascunho? (Os anexos serão carregados novamente quando restaurares o rascunho.)</string>\n    <string name=\"select_list_manage\">Gerir listas</string>\n    <string name=\"status_filter_placeholder_label_format\">Filtrado: %1$s</string>\n    <string name=\"status_filtered_show_anyway\">Mostrar à mesma</string>\n    <string name=\"description_post_edited\">Editado</string>\n    <string name=\"about_account_info_title\">A sua conta</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nVersão: %3$s</string>\n    <string name=\"status_created_at_now\">agora</string>\n    <string name=\"compose_unsaved_changes\">Tem alterações por guardar.</string>\n    <string name=\"pref_title_account_filter_keywords\">Perfis</string>\n    <string name=\"compose_delete_draft\">Apagar rascunho?</string>\n    <string name=\"post_media_image\">Imagem</string>\n    <string name=\"a11y_label_loading_thread\">A carregar conversa</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"instance_rule_info\">Ao autenticares-te, concordas com as regras de %1$s.</string>\n    <string name=\"instance_rule_title\">%1$s regras</string>\n    <string name=\"ui_error_unknown\">razão desconhecida</string>\n    <string name=\"mute_notifications_switch\">Silenciar notificações</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d pessoas estão a falar sobre a hashtag %2$s</string>\n    <string name=\"total_accounts\">Total de contas</string>\n    <string name=\"status_edit_info\">Editada: %1$s</string>\n    <string name=\"status_created_info\">Criada: %1$s</string>\n    <string name=\"pref_title_reading_order\">Ordem de leitura</string>\n    <string name=\"report_category_violation\">Violação de uma regra</string>\n    <string name=\"no_lists\">Não tem nenhuma lista.</string>\n    <string name=\"socket_timeout_exception\">A tentativa de contacto com o seu servidor demorou muito tempo</string>\n    <string name=\"action_unfollow_hashtag_format\">Deixar de seguir #%1$s?</string>\n    <string name=\"pref_title_show_stat_inline\">Mostrar estatísticas das publicações na timeline</string>\n    <string name=\"action_view_filter\">Ver filtro</string>\n    <string name=\"error_status_source_load\">Falha ao carregar a origem de estado do servidor.</string>\n    <string name=\"failed_to_unpin\">Erro ao remover dos afixados</string>\n    <string name=\"about_copy\">Copiar informação da versão e do equipamento</string>\n    <string name=\"about_copied\">Informação da versão e do equipamento copiada</string>\n    <string name=\"filter_edit_keyword_title\">Editar palavra-chave</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"list_exclusive_label\">Esconder da timeline inicial</string>\n    <string name=\"error_media_playback\">Reprodução falhou: %1$s</string>\n    <string name=\"dialog_delete_filter_positive_action\">Apagar</string>\n    <string name=\"ui_error_clear_notifications\">Erro ao limpar as notificações: %1$s</string>\n    <string name=\"ui_error_vote\">Erro ao votar no questionário: %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">Erro ao aceitar o pedido para te seguir: %1$s</string>\n    <string name=\"ui_error_favourite\">Erro ao adicionar a publicação aos favoritos: %1$s</string>\n    <string name=\"ui_error_reblog\">Erro ao dar boost à publicação: %1$s</string>\n    <string name=\"dialog_delete_filter_text\">Apagar filtro \\'%1$s\\'?</string>\n    <string name=\"error_unmuting_hashtag_format\">Erro ao remover silêncio de #%1$s</string>\n    <string name=\"description_login\">Funciona na maioria dos casos. Nenhuma informação é partilhada com outras aplicações.</string>\n    <string name=\"description_browser_login\">Poderá permitir métodos de autenticação adicionais, mas precisará de um navegador suportado.</string>\n    <string name=\"filter_description_hide\">Esconder completamente</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d publicações anexadas</string>\n    <string name=\"notification_report_format\">Nova denúncia de %1$s</string>\n    <string name=\"filter_keyword_addition_title\">Adicionar palavra-chave</string>\n    <string name=\"unfollowing_hashtag_success_format\">Já não segue a hashtag #%1$s</string>\n    <string name=\"dialog_save_profile_changes_message\">Quer guardar as alterações ao seu perfil?</string>\n    <string name=\"action_add\">Adcionar</string>\n    <string name=\"ui_error_bookmark\">Erro ao guardar a publicação: %1$s</string>\n    <string name=\"hint_filter_title\">O meu filtro</string>\n    <string name=\"label_filter_title\">Título</string>\n    <string name=\"filter_action_warn\">Avisar</string>\n    <string name=\"filter_action_hide\">Esconder</string>\n    <string name=\"filter_description_warn\">Esconder com um aviso</string>\n    <string name=\"error_blocking_domain\">Falha ao silenciar %1$s: %2$s</string>\n    <string name=\"error_unblocking_domain\">Falha ao remover o silêncio de %1$s: %2$s</string>\n    <string name=\"following_hashtag_success_format\">Agora segue a hashtag #%1$s</string>\n    <string name=\"load_newest_notifications\">Carregar as notificações mais recentes</string>\n    <string name=\"error_missing_edits\">O seu servidor sabe que esta publicação foi editada, mas não a consegue mostrar porque não tem uma cópia da edição. \n\\n \n\\nIsto é <a href=\"https://github.com/mastodon/mastodon/issues/25398\"> o problema #25398 do Mastodon </a>.</string>\n    <string name=\"list_reply_policy_none\">Ninguém</string>\n    <string name=\"list_reply_policy_list\">Membros da lista</string>\n    <string name=\"list_reply_policy_followed\">Qualquer utilizador que siga</string>\n    <string name=\"list_reply_policy_label\">Mostrar respostas a</string>\n    <string name=\"total_usage\">Uso total</string>\n    <string name=\"ui_error_reject_follow_request\">Rejeição de seguidor pendente falhou: %1$s</string>\n    <string name=\"label_filter_keywords\">Palavras-chave ou frases para filtrar</string>\n    <string name=\"filter_keyword_display_format\">%1$s (palavra completa)</string>\n    <string name=\"ui_success_accepted_follow_request\">Seguidor pendente aceite</string>\n    <string name=\"ui_success_rejected_follow_request\">Seguidor pendente bloqueado</string>\n    <string name=\"label_filter_action\">Ação de filtro</string>\n    <string name=\"help_empty_conversations\">As suas <b>mensagens privadas</b> estão aqui, também chamadas de conversas ou mensagens diretas (MD/DM). \\u0020\n\\n \\u0020\n\\nAs mensagens privadas são criadas definindo a visibilidade {{public}} de uma publicação como {{mail}} <i>Direta</i> e mencionando um ou mais utilizadores no texto. \\u0020\n\\n \\u0020\n\\nPor exemplo, pode entrar na vista de perfil de uma conta e pressionar o botão de criar publicação [iconics gmd_edit] e alterar a visibilidade.</string>\n    <string name=\"help_empty_lists\">Esta é a sua <b>vista de listas</b>. Pode criar várias listas privadas e adicionar contas nelas. \n\\n \n\\nAtenção: apenas pode adicionar contas que segue às suas listas. \n\\n \n\\nEstas listas podem ser usadas como um separador nos separadores das Configurações da Conta [iconics gmd_account_circle] [iconics gmd_navigate_next].</string>\n    <string name=\"help_empty_home\">Esta é a sua <b>timeline inicial</b>. Ela mostra as publicações mais recentes das contas que segue. \n\\n \n\\nPara explorar contas, pode descobri-las numa das outras timelines. Por exemplo, a timeline local da sua instância {{group}}. Ou pode pesquisá-las pelo nome {{search}}; por exemplo, pesquisando por Tusky para encontrar a nossa conta Mastodon.</string>\n    <string name=\"unmuting_hashtag_success_format\">Remover silêncio da hashtag #%1$s</string>\n    <string name=\"muting_hashtag_success_format\">Silenciar hashtag #%1$s como um aviso</string>\n    <string name=\"pref_title_per_timeline_preferences\">Configurações por timeline</string>\n    <string name=\"label_filter_context\">Contextos de filtro</string>\n    <string name=\"post_replied\">Respondida</string>\n    <string name=\"post_replied_format\">Em resposta a \\'%1$s\\'</string>\n    <string name=\"post_replied_self\">Continuação da conversa</string>\n    <string name=\"unknown_notification_type\">Tipo de notificação desconhecido</string>\n    <string name=\"notifications_from\">Notificações de %1$s</string>\n    <string name=\"action_accept_notification_request\">Aceitar</string>\n    <string name=\"action_dismiss_notification_request\">Dispensar</string>\n    <string name=\"pref_default_reply_privacy_explanation\">A privacidade pré-selecionada vai depender da publicação a que estás a responder.</string>\n    <string name=\"pref_match_default_post_privacy\">Igualar a privacidade da publicação padrão</string>\n    <string name=\"post_privacy_direct\">Direta</string>\n    <string name=\"action_follow_hashtag\">Segue uma nova hashtag</string>\n    <string name=\"dialog_follow_warning\">Seguir esta conta?</string>\n    <string name=\"label_translating\">A traduzir…</string>\n    <string name=\"label_translated\">Traduzido de %1$s para %2$s</string>\n    <string name=\"pref_title_show_notifications_filter\">Mostrar filtro das notificações</string>\n    <string name=\"label_expires_after\">Expira em</string>\n    <string name=\"pref_title_confirm_follows\">Mostrar confirmação antes de seguir</string>\n    <string name=\"report_category_legal\">Condições de utilização</string>\n    <string name=\"ui_error_translate\">Não foi possível traduzir: %1$s</string>\n    <string name=\"notification_policies_title\">Políticas de Notificação</string>\n    <string name=\"notification_policies_filter_out\">Gerir notificações de…</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">Pessoas que não segue</string>\n    <string name=\"notification_policies_filter_dont_follow_description\">Até as aprovares manualmente</string>\n    <string name=\"notification_policies_filter_not_following_title\">Pessoas que não te seguem</string>\n    <string name=\"notification_policies_filter_not_following_description\">Incluindo pessoas que te seguem há menos de 3 dias</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">Contas novas</string>\n    <string name=\"filtered_notifications_title\">Notificações Filtradas</string>\n    <string name=\"unknown_notification_filter_new_accounts_description\">Criadas nos últimos 30 dias</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_title\">Mensagens diretas não solicitadas</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_description\">Filtrado, a não ser que seja em resposta à sua menção ou se segue quem enviou</string>\n    <string name=\"unknown_notification_filter_moderated_accounts\">Contas moderadas</string>\n    <string name=\"unknown_notification_filter_moderated_accounts_description\">Com limites impostos pelos moderadores da instância</string>\n    <string name=\"notification_policies_not_supported\">Esta funcionalidade é apenas suportada em instâncias Mastodon que usem a versão 4.3.0 ou posterior.</string>\n    <string name=\"filtered_notifications\">Notificações filtradas</string>\n    <string name=\"notifications_from_people_you_may_know\">Notificações de %1$d pessoas que poderás conhecer</string>\n    <string name=\"notification_policy_accept\">Aceitar</string>\n    <string name=\"notification_policy_filter\">Filtro</string>\n    <string name=\"notification_policy_ignore\">Ignorar</string>\n    <string name=\"accept_notification_request\">Aceitar pedido de notificação</string>\n    <string name=\"dismiss_notification_request\">Dispensar pedido de notificação</string>\n    <string name=\"open_settings\">Abrir configurações</string>\n    <string name=\"error_deleting_filter\">Erro ao apagar o filtro \\'%1$s\\'</string>\n    <string name=\"error_saving_filter\">Erro ao guardar o filtro \\'%1$s\\'</string>\n    <string name=\"pref_default_reply_privacy\">Privacidade da resposta (não é sincronizada com o servidor)</string>\n    <string name=\"action_translate\">Traduzir</string>\n    <string name=\"action_show_original\">Mostrar original</string>\n    <string name=\"url_copied\">Endereço copiado</string>\n    <string name=\"confirmation_hashtag_copied\">\\'#%1$s\\' copiada</string>\n    <string name=\"reply_sending\">A enviar…</string>\n    <string name=\"reply_sending_long\">A sua resposta está a ser enviada.</string>\n    <string name=\"preview_card_by_author\">Por %1$s</string>\n    <string name=\"preview_card_more_by_author\">Mais por %1$s</string>\n    <string name=\"follow_hashtag_success\">Hashtags seguidas %1$s</string>\n    <string name=\"relationship_severance_event_user_domain_block\">Bloqueou %1$s, removendo %2$s dos seguidores e %3$s que segue.</string>\n    <plurals name=\"accounts\">\n        <item quantity=\"one\">%1$s conta</item>\n        <item quantity=\"many\">%1$s contas</item>\n        <item quantity=\"other\">%1$s contas</item>\n    </plurals>\n    <string name=\"action_reblog_private\">Partilha apenas para seguidores</string>\n    <string name=\"notification_unknown_description\">Tipo de notificação desconhecida</string>\n    <string name=\"relationship_severance_event_account_suspension\">Um(a) administrador(a) de %1$s suspendeu %2$s o que significa que deixará de receber atualizações e de poder interagir com essa conta.</string>\n    <string name=\"notification_severed_relationship_name\">Ligação perdida</string>\n    <string name=\"relationship_severance_event_domain_block\">Um(a) administrador(a) de %1$s bloqueou %2$s, incluindo %3$s dos seus seguidores e %4$s que segue.</string>\n    <string name=\"moderation_warning_action_suspend\">A sua conta foi suspensa.</string>\n    <string name=\"relationship_severance_event_title\">Ligação perdida</string>\n    <string name=\"unknown_notification_type_explanation\">O Tusky não reconhece este tipo de notificação e não a consegue mostrar. O interface web do seu servidor, no entanto, poderá conseguir. Por favor, informe a equipa do Tusky, para que possam adicionar suporte para este tipo de notificação!</string>\n    <string name=\"action_reblog_public\">Partilha pública</string>\n    <string name=\"action_reblog_unlisted\">Partilha não-listada</string>\n    <string name=\"notification_moderation_warning_name\">Alertas de moderação</string>\n    <string name=\"notification_channel_other\">Outro</string>\n    <string name=\"notification_channel_other_description\">Outras notificações, tais como ligação perdida e alertas de moderação</string>\n    <string name=\"notification_channel_admin_description\">Notificações de administração, tais como novas denúncias e novos utilizadores</string>\n    <string name=\"notification_channel_admin\">Administração</string>\n    <string name=\"moderation_warning\">Recebeu um aviso de moderação.</string>\n    <string name=\"moderation_warning_action_delete_statuses\">Algumas das suas publicações foram removidas.</string>\n    <string name=\"moderation_warning_action_disable\">A sua conta foi desativada.</string>\n    <string name=\"moderation_warning_action_mark_statuses_as_sensitive\">Algumas das suas publicações foram marcadas como sensíveis.</string>\n    <string name=\"moderation_warning_action_none\">A sua conta recebeu um aviso de moderação.</string>\n    <string name=\"moderation_warning_action_sensitive\">As suas publicações serão marcadas como sensíveis de agora em diante.</string>\n    <string name=\"moderation_warning_action_silence\">A sua conta foi limitada.</string>\n    <string name=\"poll\">Votação</string>\n    <plurals name=\"media_attachments\">\n        <item quantity=\"one\">%1$s conteúdo multimédia anexado</item>\n        <item quantity=\"many\">%1$s conteúdos multimédia anexados</item>\n        <item quantity=\"other\">%1$s conteúdos multimédia anexados</item>\n    </plurals>\n    <string name=\"notification_info_reply\">Responder</string>\n    <string name=\"notification_info_private_mention\">Menção privada</string>\n    <string name=\"notification_info_mention\">Mencionar</string>\n    <string name=\"notification_info_private_reply\">Resposta privada</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-ru/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\">\n    <string name=\"error_generic\">Возникла ошибка.</string>\n    <string name=\"error_network\">Произошла сетевая ошибка. Пожалуйста, проверьте подключение и повторите попытку.</string>\n    <string name=\"error_empty\">Не может быть пустым.</string>\n    <string name=\"error_invalid_domain\">Введен недопустимый домен</string>\n    <string name=\"error_failed_app_registration\">Не удалось пройти аутентификацию на этом сервере. Если ошибка повторяется каждый раз, попробуйте войти через браузер, выбрав соответствующий пункт в меню.</string>\n    <string name=\"error_no_web_browser_found\">Не удалось найти веб-браузер для использования.</string>\n    <string name=\"error_authorization_unknown\">Произошла неопознанная ошибка авторизации. Если ошибка не исчезла, попробуйте войти в систему через браузер из меню.</string>\n    <string name=\"error_authorization_denied\">В авторизации было отказано. Если вы уверены, что ввели правильные учетные данные, попробуйте войти из браузера в меню.</string>\n    <string name=\"error_retrieving_oauth_token\">Не удалось получить токен входа в систему. Если проблема сохраняется, попробуйте войти в систему через браузер из меню.</string>\n    <string name=\"error_compose_character_limit\">Пост слишком длинный!</string>\n    <string name=\"error_media_upload_type\">Этот тип файла не может быть загружен.</string>\n    <string name=\"error_media_upload_opening\">Этот файл не удалось открыть.</string>\n    <string name=\"error_media_upload_permission\">Требуется разрешение на чтение медиа.</string>\n    <string name=\"error_media_download_permission\">Необходимо разрешение на хранение медиа.</string>\n    <string name=\"error_media_upload_image_or_video\">Изображения и видео не могут быть прикреплены к одному и тому же посту.</string>\n    <string name=\"error_media_upload_sending\">Загрузка не удалась.</string>\n    <string name=\"error_sender_account_gone\">Ошибка при отправке сообщения.</string>\n    <string name=\"title_home\">Главная</string>\n    <string name=\"title_notifications\">Уведомления</string>\n    <string name=\"title_public_local\">Этот сервер</string>\n    <string name=\"title_public_federated\">Объединенная лента</string>\n    <string name=\"title_direct_messages\">Личные сообщения</string>\n    <string name=\"title_tab_preferences\">Вкладки</string>\n    <string name=\"title_view_thread\">Обсуждение</string>\n    <string name=\"title_posts\">Посты</string>\n    <string name=\"title_posts_with_replies\">С ответами</string>\n    <string name=\"title_posts_pinned\">Закрепленные</string>\n    <string name=\"title_follows\">Подписки</string>\n    <string name=\"title_followers\">Подписчики</string>\n    <string name=\"title_favourites\">Избранное</string>\n    <string name=\"title_mutes\">Игнорируемые пользователи</string>\n    <string name=\"title_blocks\">Заблокированные пользователи</string>\n    <string name=\"title_follow_requests\">Запросы на подписку</string>\n    <string name=\"title_edit_profile\">Редактировать профиль</string>\n    <string name=\"title_drafts\">Черновики</string>\n    <string name=\"title_licenses\">Лицензии</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s продвинул(а)</string>\n    <string name=\"post_sensitive_media_title\">Содержание, которое может быть неприятным или нежелательным</string>\n    <string name=\"post_media_hidden_title\">Медиа скрыто</string>\n    <string name=\"post_sensitive_media_directions\">Нажмите для просмотра</string>\n    <string name=\"post_content_warning_show_more\">Показать еще</string>\n    <string name=\"post_content_warning_show_less\">Свернуть</string>\n    <string name=\"post_content_show_more\">Еще</string>\n    <string name=\"post_content_show_less\">Свернуть</string>\n    <string name=\"message_empty\">Тут ничего нет.</string>\n    <string name=\"footer_empty\">Тут ничего нет. Потяните вниз, чтобы обновить!</string>\n    <string name=\"notification_reblog_format\">%1$s продвинул(а) ваш пост</string>\n    <string name=\"notification_favourite_format\">%1$s добавил(а) ваш пост в избранное</string>\n    <string name=\"notification_follow_format\">%1$s подписался(-лась) на вас</string>\n    <string name=\"report_username_format\">Пожаловаться на @%1$s</string>\n    <string name=\"report_comment_hint\">Дополнительные замечания?</string>\n    <string name=\"action_quick_reply\">Быстрый ответ</string>\n    <string name=\"action_reply\">Ответить</string>\n    <string name=\"action_reblog\">Продвинуть</string>\n    <string name=\"action_unreblog\">Отменить продвижение</string>\n    <string name=\"action_favourite\">Нравится</string>\n    <string name=\"action_unfavourite\">Убрать из избранного</string>\n    <string name=\"action_more\">Больше</string>\n    <string name=\"action_compose\">Написать</string>\n    <string name=\"action_login\">Вход с помощью Tusky</string>\n    <string name=\"action_logout\">Выйти</string>\n    <string name=\"action_logout_confirm\">Вы уверены, что хотите выйти из %1$s? Это приведет к удалению всех локальных данных учетной записи, включая черновики и настройки.</string>\n    <string name=\"action_follow\">Подписаться</string>\n    <string name=\"action_unfollow\">Отписаться</string>\n    <string name=\"action_block\">Заблокировать</string>\n    <string name=\"action_unblock\">Разблокировать</string>\n    <string name=\"action_hide_reblogs\">Скрывать продвижения</string>\n    <string name=\"action_show_reblogs\">Показывать продвижения</string>\n    <string name=\"action_report\">Пожаловаться</string>\n    <string name=\"action_delete\">Удалить</string>\n    <string name=\"action_delete_and_redraft\">Удалить и пересоздать</string>\n    <string name=\"action_send\">ОТПРАВИТЬ</string>\n    <string name=\"action_send_public\">ЗАПОСТИТЬ!</string>\n    <string name=\"action_retry\">Повторить</string>\n    <string name=\"action_close\">Закрыть</string>\n    <string name=\"action_view_profile\">Профиль</string>\n    <string name=\"action_view_preferences\">Настройки</string>\n    <string name=\"action_view_account_preferences\">Настройки учетной записи</string>\n    <string name=\"action_view_favourites\">Избранное</string>\n    <string name=\"action_view_mutes\">Игнорируемые пользователи</string>\n    <string name=\"action_view_blocks\">Заблокированные пользователи</string>\n    <string name=\"action_view_follow_requests\">Запросы на подписку</string>\n    <string name=\"action_view_media\">Медиа</string>\n    <string name=\"action_open_in_web\">Открыть в браузере</string>\n    <string name=\"action_add_media\">Добавить медиа</string>\n    <string name=\"action_photo_take\">Сделать снимок</string>\n    <string name=\"action_share\">Поделиться</string>\n    <string name=\"action_mute\">Игнорировать</string>\n    <string name=\"action_unmute\">Перестать игнорировать</string>\n    <string name=\"action_mention\">Упомянуть</string>\n    <string name=\"action_hide_media\">Скрыть медиа</string>\n    <string name=\"action_open_drawer\">Открыть всплывающее меню</string>\n    <string name=\"action_save\">Сохранить</string>\n    <string name=\"action_edit_profile\">Редактировать профиль</string>\n    <string name=\"action_edit_own_profile\">Редактировать</string>\n    <string name=\"action_undo\">Отменить</string>\n    <string name=\"action_accept\">Принять</string>\n    <string name=\"action_reject\">Отклонить</string>\n    <string name=\"action_search\">Поиск</string>\n    <string name=\"action_access_drafts\">Черновики</string>\n    <string name=\"action_toggle_visibility\">Видимость поста</string>\n    <string name=\"action_content_warning\">Предупреждение о содержании</string>\n    <string name=\"action_emoji_keyboard\">Эмодзи-клавиатура</string>\n    <string name=\"action_add_tab\">Добавить вкладку</string>\n    <string name=\"action_links\">Ссылки</string>\n    <string name=\"action_mentions\">Упоминания</string>\n    <string name=\"action_hashtags\">Хэштеги</string>\n    <string name=\"action_open_reblogger\">Перейти к продвинувшему пост</string>\n    <string name=\"action_open_reblogged_by\">Показать продвижения</string>\n    <string name=\"action_open_faved_by\">Показать избранное</string>\n    <string name=\"title_hashtags_dialog\">Хэштеги</string>\n    <string name=\"title_mentions_dialog\">Упоминания</string>\n    <string name=\"title_links_dialog\">Ссылки</string>\n    <string name=\"action_open_media_n\">Открыть медиа #%1$d</string>\n    <string name=\"download_image\">Загружаем %1$s</string>\n    <string name=\"action_copy_link\">Копировать ссылку</string>\n    <string name=\"action_open_as\">Открыть как %1$s</string>\n    <string name=\"action_share_as\">Поделиться как…</string>\n    <string name=\"download_media\">Скачать медиа</string>\n    <string name=\"downloading_media\">Скачивание медиа</string>\n    <string name=\"send_post_link_to\">Поделиться ссылкой на пост с…</string>\n    <string name=\"send_post_content_to\">Поделится постом с…</string>\n    <string name=\"send_media_to\">Поделится медиа в…</string>\n    <string name=\"confirmation_reported\">Отправлено!</string>\n    <string name=\"confirmation_unblocked\">Пользователь разблокирован</string>\n    <string name=\"confirmation_unmuted\">Игнорирование пользователя снято</string>\n    <string name=\"hint_domain\">Какой сервер?</string>\n    <string name=\"hint_compose\">Что случилось?</string>\n    <string name=\"hint_content_warning\">Предупреждение о содержании</string>\n    <string name=\"hint_display_name\">Отображаемое имя</string>\n    <string name=\"hint_note\">О себе</string>\n    <string name=\"hint_search\">Поиск…</string>\n    <string name=\"search_no_results\">Без результатов</string>\n    <string name=\"label_quick_reply\">Ответить…</string>\n    <string name=\"label_avatar\">Аватар</string>\n    <string name=\"label_header\">Заголовок</string>\n    <string name=\"link_whats_an_instance\">Что такое сервер?</string>\n    <string name=\"login_connection\">Подключаюсь…</string>\n    <string name=\"dialog_whats_an_instance\">Здесь можно указать адрес или домен любого сервера, например mastodon.social, icosahedron.website, social.tchncs.de или <a href=\"https://instances.social\">какого-нибудь ещё!</a> \\u0020\n\\n \\u0020\n\\nЕсли у вас еще нет учетной записи, вы можете ввести название сервера, к которому хотите присоединиться, и создать на нем новую учетную запись. \\u0020\n\\n \\u0020\n\\nСервер — это тот сайт, на котором располагается ваша учетная запись, но вы можете легко общаться с людьми на других серверах и подписываться на них, как будто вы находитесь на одном и том же сайте. \\u0020\n\\n \\u0020\n\\nБолее подробную информацию можно найти на сайте <a href=\"https://joinmastodon.org\">joinmastodon.org</a>.</string>\n    <string name=\"dialog_title_finishing_media_upload\">Завершение загрузки медиа</string>\n    <string name=\"dialog_message_uploading_media\">Загружаем…</string>\n    <string name=\"dialog_download_image\">Загрузить</string>\n    <string name=\"dialog_message_cancel_follow_request\">Отозвать запрос на подписку?</string>\n    <string name=\"dialog_unfollow_warning\">Отписаться от пользователя?</string>\n    <string name=\"dialog_delete_post_warning\">Удалить пост?</string>\n    <string name=\"dialog_redraft_post_warning\">Удалить и переписать этот пост?</string>\n    <string name=\"visibility_public\">Публичный: Видимый в публичных лентах</string>\n    <string name=\"visibility_unlisted\">Скрытый: Не отображается в публичных лентах</string>\n    <string name=\"visibility_private\">Только для подписчиков: Видим только вашим подписчикам</string>\n    <string name=\"visibility_direct\">Личное упоминание: Видим только для упомянутых пользователей</string>\n    <string name=\"pref_title_edit_notification_settings\">Уведомления</string>\n    <string name=\"pref_title_notifications_enabled\">Уведомления</string>\n    <string name=\"pref_title_notification_alerts\">Оповещения</string>\n    <string name=\"pref_title_notification_alert_sound\">Уведомить со звуком</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Уведомить с вибрацией</string>\n    <string name=\"pref_title_notification_alert_light\">Уведомить со светом</string>\n    <string name=\"pref_title_notification_filters\">Включенные виды уведомлений</string>\n    <string name=\"pref_title_appearance_settings\">Внешний вид</string>\n    <string name=\"pref_title_app_theme\">Тема приложения</string>\n    <string name=\"pref_title_timelines\">Ленты</string>\n    <string name=\"pref_title_timeline_filters\">Фильтры</string>\n    <string name=\"app_them_dark\">Тёмная</string>\n    <string name=\"app_theme_light\">Светлая</string>\n    <string name=\"app_theme_black\">Чёрная</string>\n    <string name=\"app_theme_auto\">Автоматически (по времени суток)</string>\n    <string name=\"app_theme_system\">Как в системе</string>\n    <string name=\"pref_title_browser_settings\">Браузер</string>\n    <string name=\"pref_title_custom_tabs\">Использовать пользовательские вкладки Chrome</string>\n    <string name=\"pref_title_language\">Язык</string>\n    <string name=\"pref_title_post_filter\">Фильтрование ленты</string>\n    <string name=\"pref_title_post_tabs\">Главная лента</string>\n    <string name=\"pref_title_show_boosts\">Показывать продвижения</string>\n    <string name=\"pref_title_show_replies\">Показать ответы</string>\n    <string name=\"pref_title_show_media_preview\">Загрузить предпросмотр медиа</string>\n    <string name=\"pref_title_proxy_settings\">Прокси</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP прокси</string>\n    <string name=\"pref_title_http_proxy_enable\">Включить HTTP прокси</string>\n    <string name=\"pref_title_http_proxy_server\">Адрес HTTP прокси сервера</string>\n    <string name=\"pref_title_http_proxy_port\">Порт</string>\n    <string name=\"pref_default_post_privacy\">Видимость постов (синхронизируется с сервером)</string>\n    <string name=\"pref_default_media_sensitivity\">Всегда помечать медиа как чувствительные (синхронизируется с сервером)</string>\n    <string name=\"pref_publishing\">Установки для новых публикаций по умолчанию</string>\n    <string name=\"pref_failed_to_sync\">Не удалось синхронизировать настройки</string>\n    <string name=\"post_privacy_public\">Публичный</string>\n    <string name=\"post_privacy_unlisted\">Скрытый</string>\n    <string name=\"post_privacy_followers_only\">Только для подписчиков</string>\n    <string name=\"pref_post_text_size\">Размер текста сообщения</string>\n    <string name=\"post_text_size_smallest\">Крохотный</string>\n    <string name=\"post_text_size_small\">Маленький</string>\n    <string name=\"post_text_size_medium\">Средний</string>\n    <string name=\"post_text_size_large\">Большой</string>\n    <string name=\"post_text_size_largest\">Огромный</string>\n    <string name=\"notification_mention_name\">Новые упоминания</string>\n    <string name=\"notification_mention_descriptions\">Уведомлять о новых упоминаниях</string>\n    <string name=\"notification_follow_name\">Новые подписчики</string>\n    <string name=\"notification_follow_description\">Уведомлять о новых подписчиках</string>\n    <string name=\"notification_boost_name\">Продвижения</string>\n    <string name=\"notification_boost_description\">Уведомлять, когда кто-то продвигает ваши посты</string>\n    <string name=\"notification_favourite_name\">Избранное</string>\n    <string name=\"notification_favourite_description\">Уведомлять, когда ваши сообщения добавляют в «избранное»</string>\n    <string name=\"notification_poll_name\">Результаты опросов</string>\n    <string name=\"notification_poll_description\">Уведомлять о завершившихся опросах</string>\n    <string name=\"notification_mention_format\">%1$s упомянул(а) вас</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s и %4$d других</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, и %3$s</string>\n    <string name=\"notification_summary_small\">%1$s и %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d новое взаимодействие</item>\n        <item quantity=\"few\">%1$d новых взаимодействия</item>\n        <item quantity=\"many\">%1$d новых взаимодействий</item>\n        <item quantity=\"other\">%1$d новых взаимодействий</item>\n    </plurals>\n    <string name=\"description_account_locked\">Закрытый аккаунт</string>\n    <string name=\"about_title_activity\">О приложении</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_tusky_license\">Tusky — это свободное программное обеспечение с открытым исходным кодом. Оно лицензировано в соответствии с GNU General Public License Version 3. Ознакомиться с лицензией можно здесь: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators: the url can be changed to link to the localized version of the license -->\n    <string name=\"about_project_site\">Веб-сайт проекта: https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Отчеты об ошибках и ваши пожелания:\n\\n https://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Профиль Tusky</string>\n    <string name=\"post_share_content\">Поделиться содержанием поста</string>\n    <string name=\"post_share_link\">Поделиться ссылкой на пост</string>\n    <string name=\"post_media_images\">Изображения</string>\n    <string name=\"post_media_video\">Видео</string>\n    <string name=\"state_follow_requested\">Запрос на подписку отправлено</string>\n    <!--Отметки времени у постов: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">через %1$dг</string>\n    <string name=\"abbreviated_in_days\">через %1$dд</string>\n    <string name=\"abbreviated_in_hours\">через %1$dч</string>\n    <string name=\"abbreviated_in_minutes\">через %1$dм</string>\n    <string name=\"abbreviated_in_seconds\">через %1$dс</string>\n    <string name=\"abbreviated_years_ago\">%1$dг</string>\n    <string name=\"abbreviated_days_ago\">%1$dд</string>\n    <string name=\"abbreviated_hours_ago\">%1$dч</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dм</string>\n    <string name=\"abbreviated_seconds_ago\">%1$dс</string>\n    <!--Оставшееся время в опросах -->\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">остался %1$d день</item>\n        <item quantity=\"few\">осталось %1$d дня</item>\n        <item quantity=\"many\">осталось %1$d дней</item>\n        <item quantity=\"other\">осталось %1$d дней</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">остался %1$d час</item>\n        <item quantity=\"few\">осталось %1$d часа</item>\n        <item quantity=\"many\">осталось %1$d часов</item>\n        <item quantity=\"other\">осталось %1$d часов</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">осталась %1$d минута</item>\n        <item quantity=\"few\">осталось %1$d минуты</item>\n        <item quantity=\"many\">осталось %1$d минут</item>\n        <item quantity=\"other\">осталось %1$d минут</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">осталась %1$d секунда</item>\n        <item quantity=\"few\">осталось %1$d секунды</item>\n        <item quantity=\"many\">осталось %1$d секунд</item>\n        <item quantity=\"other\">осталось %1$d секунд</item>\n    </plurals>\n    <string name=\"follows_you\">Подписан(а) на вас</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Всегда показывать контент деликатного характера</string>\n    <string name=\"title_media\">Медиа</string>\n    <string name=\"replying_to\">Ответ для @%1$s</string>\n    <string name=\"load_more_placeholder_text\">Загрузить ещё</string>\n    <string name=\"pref_title_public_filter_keywords\">Публичные ленты</string>\n    <string name=\"pref_title_thread_filter_keywords\">Разговоры</string>\n    <string name=\"filter_addition_title\">Добавить фильтр</string>\n    <string name=\"filter_edit_title\">Изм. фильтр</string>\n    <string name=\"filter_dialog_remove_button\">Удалить</string>\n    <string name=\"filter_dialog_update_button\">Обновить</string>\n    <string name=\"filter_add_description\">Фраза для фильтрации</string>\n    <string name=\"add_account_name\">Добавить аккаунт</string>\n    <string name=\"add_account_description\">Добавить новую учетную запись Mastodon</string>\n    <string name=\"action_lists\">Списки</string>\n    <string name=\"title_lists\">Списки</string>\n    <string name=\"error_create_list\">Не удалось создать список</string>\n    <string name=\"error_rename_list\">Не удалось обновить список</string>\n    <string name=\"error_delete_list\">Не удалось удалить список</string>\n    <string name=\"action_create_list\">Создать список</string>\n    <string name=\"action_rename_list\">Изменить список</string>\n    <string name=\"action_delete_list\">Удалить список</string>\n    <string name=\"hint_search_people_list\">Поиск среди людей на которых вы подписаны</string>\n    <string name=\"action_add_to_list\">Добавить аккаунт в список</string>\n    <string name=\"action_remove_from_list\">Удалить аккаунт из списка</string>\n    <string name=\"compose_active_account_description\">Отправить как %1$s</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Опишите материал для слабовидящих людей (ограничение в %1$d символ)</item>\n        <item quantity=\"few\">Опишите материал для слабовидящих людей (ограничение в %1$d символа)</item>\n        <item quantity=\"many\">Опишите материал для слабовидящих людей (ограничение в %1$d символов)</item>\n        <item quantity=\"other\">Опишите материал для слабовидящих людей (ограничение в %1$d символов)</item>\n    </plurals>\n    <string name=\"action_set_caption\">Добавить подпись</string>\n    <string name=\"action_remove\">Удалить</string>\n    <string name=\"lock_account_label\">Закрыть аккаунт</string>\n    <string name=\"lock_account_label_description\">Вам придётся вручную подтверждать подписчиков</string>\n    <string name=\"compose_save_draft\">Сохранить черновик?</string>\n    <string name=\"send_post_notification_title\">Отправляем пост…</string>\n    <string name=\"send_post_notification_error_title\">Ошибка при отправке поста</string>\n    <string name=\"send_post_notification_channel_name\">Отправка поста</string>\n    <string name=\"send_post_notification_cancel_title\">Отправка отменена</string>\n    <string name=\"send_post_notification_saved_content\">Копия этого сообщения сохранена в ваших черновиках</string>\n    <string name=\"action_compose_shortcut\">Написать</string>\n    <string name=\"error_no_custom_emojis\">На сервере %1$s нет собственных эмодзи</string>\n    <string name=\"emoji_style\">Стиль эмодзи</string>\n    <string name=\"system_default\">Как в системе</string>\n    <string name=\"download_fonts\">Эти наборы эмодзи сперва нужно загрузить</string>\n    <string name=\"performing_lookup_title\">Выполняем поиск…</string>\n    <string name=\"expand_collapse_all_posts\">Развернуть/свернуть все посты</string>\n    <string name=\"action_open_post\">Открыть пост</string>\n    <string name=\"restart_required\">Требуется перезапуск приложения</string>\n    <string name=\"restart_emoji\">Перезапустите Tusky, чтобы изменения вступили в силу</string>\n    <string name=\"later\">Позже</string>\n    <string name=\"restart\">Перезапустить</string>\n    <string name=\"caption_systememoji\">Набор эмодзи по умолчанию на этом устройстве</string>\n    <string name=\"caption_blobmoji\" tools:ignore=\"TypographyDashes\">Набор эмодзи Blob из Android 4.4-7.1</string>\n    <string name=\"caption_twemoji\">Стандартный набор эмодзи в Mastodon</string>\n    <string name=\"download_failed\">Загрузка не удалась</string>\n    <string name=\"profile_badge_bot_text\">Бот</string>\n    <string name=\"account_moved_description\">%1$s переехал(а) на:</string>\n    <string name=\"reblog_private\">Продвинуть для изначальной аудитории</string>\n    <string name=\"unreblog_private\">Отменить продвижение</string>\n    <string name=\"license_description\">Tusky использует код и материалы из следующих проектов с открытым исходным кодом:</string>\n    <string name=\"license_apache_2\">Используется лицензия Apache License (копия ниже)</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">Метаданные профиля</string>\n    <string name=\"profile_metadata_add\">добавить данные</string>\n    <string name=\"profile_metadata_label_label\">Метка</string>\n    <string name=\"profile_metadata_content_label\">Значение</string>\n    <string name=\"pref_title_absolute_time\">Показывать точное время</string>\n    <string name=\"label_remote_account\">Информация ниже может отображать профиль пользователя не полностью. Нажмите, чтобы открыть полный профиль в браузере.</string>\n    <string name=\"unpin_action\">Открепить</string>\n    <string name=\"pin_action\">Закрепить</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> оценил</item>\n        <item quantity=\"few\"><b>%1$s</b> оценили</item>\n        <item quantity=\"many\"><b>%1$s</b> оценили</item>\n        <item quantity=\"other\"><b>%1$s</b> оценили</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> продвижение</item>\n        <item quantity=\"few\"><b>%1$s</b> продвижения</item>\n        <item quantity=\"many\"><b>%1$s</b> продвижений</item>\n        <item quantity=\"other\"><b>%1$s</b> продвижений</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">Продвинули</string>\n    <string name=\"title_favourited_by\">Добавили в избранное</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s и %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s и ещё %3$d</string>\n    <string name=\"description_post_media\">Медиа: %1$s</string>\n    <string name=\"description_post_cw\">Предупреждение о содержании: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Без описания</string>\n    <string name=\"description_post_reblogged\">Перезалито</string>\n    <string name=\"description_post_favourited\">Понравилось</string>\n    <string name=\"description_visibility_public\">Публичный</string>\n    <string name=\"description_visibility_unlisted\">Скрытый</string>\n    <string name=\"description_visibility_private\">Подписчики</string>\n    <string name=\"description_visibility_direct\">Личное упоминание</string>\n    <string name=\"hint_list_name\">Название списка</string>\n    <string name=\"pick_hashtag_hint\">Хэштег без #</string>\n    <string name=\"notifications_clear\">Очистить</string>\n    <string name=\"notifications_apply_filter\">Фильтр</string>\n    <string name=\"filter_apply\">Применить</string>\n    <string name=\"compose_shortcut_long_label\">Создать пост</string>\n    <string name=\"compose_shortcut_short_label\">Написать</string>\n    <string name=\"pref_title_bot_overlay\">Показывать индикаторы для ботов</string>\n    <string name=\"notification_clear_text\">Вы уверены, что хотите навсегда очистить все уведомления?</string>\n    <string name=\"poll_info_format\"> \\u0020<!-- 15 голосов • 1 час остался--> \\u0020%1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s голос</item>\n        <item quantity=\"few\">%1$s голоса</item>\n        <item quantity=\"many\">%1$s голосов</item>\n        <item quantity=\"other\">%1$s голосов</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">завершится %1$s</string>\n    <string name=\"poll_info_closed\">закрыт</string>\n    <string name=\"poll_vote\">Голосовать</string>\n    <string name=\"poll_ended_voted\">Голосование в котором вы принимали участие завершилось</string>\n    <string name=\"poll_ended_created\">Созданный вами опрос завершился</string>\n    <string name=\"button_continue\">Продолжить</string>\n    <string name=\"button_back\">Назад</string>\n    <string name=\"button_done\">Готово</string>\n    <string name=\"hint_additional_info\">Дополнительные замечания</string>\n    <string name=\"title_domain_mutes\">Скрытые домены</string>\n    <string name=\"action_view_domain_mutes\">Скрытые домены</string>\n    <string name=\"action_mute_domain\">Игнорировать %1$s</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s больше не скрыт</string>\n    <string name=\"mute_domain_warning\">Вы уверены, что хотите заблокировать весь %1$s? Вы не увидите контент с этого домена ни в публичных лентах, ни в своих уведомлениях. Ваши подписчики с этого домена будут удалены.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Скрыть весь домен</string>\n    <string name=\"pref_title_animate_gif_avatars\">Анимировать GIF-аватары</string>\n    <string name=\"filter_dialog_whole_word\">Слово целиком</string>\n    <string name=\"filter_dialog_whole_word_description\">Если ключевое слово или фраза состоит только из букв или цифр, они будут учитываться только при полном совпадении</string>\n    <string name=\"caption_notoemoji\">Текущий набор эмодзи от Google</string>\n    <string name=\"description_poll\">Голосование с вариантами: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"compose_preview_image_description\">Действия для изображения %1$s</string>\n    <string name=\"report_sent_success\">Жалоба на @%1$s успешно отправлена</string>\n    <string name=\"report_remote_instance\">Переслать в %1$s</string>\n    <string name=\"failed_report\">Не удалось пожаловаться</string>\n    <string name=\"failed_fetch_posts\">Не удалось получить посты</string>\n    <string name=\"report_description_1\">Жалоба будет отправлена модераторам вашего сервера. Ниже вы можете дать объяснение почему вы жалуетесь на эту учетную запись:</string>\n    <string name=\"report_description_remote_instance\">Аккаунт находится на другом сервере. Отправить анонимную копию отчета также туда?</string>\n    <string name=\"action_add_poll\">Добавить опрос</string>\n    <string name=\"pref_title_alway_open_spoiler\">Всегда раскрывать посты с предупреждениями о содержании</string>\n    <string name=\"title_accounts\">Профили</string>\n    <string name=\"failed_search\">Поиск завершился ошибкой</string>\n    <string name=\"create_poll_title\">Опрос</string>\n    <string name=\"duration_5_min\">5 минут</string>\n    <string name=\"duration_30_min\">30 минут</string>\n    <string name=\"duration_1_hour\">1 час</string>\n    <string name=\"duration_6_hours\">6 часов</string>\n    <string name=\"duration_1_day\">1 день</string>\n    <string name=\"duration_3_days\">3 дня</string>\n    <string name=\"duration_7_days\">7 дней</string>\n    <string name=\"add_poll_choice\">Добавить вариант</string>\n    <string name=\"poll_allow_multiple_choices\">Несколько вариантов</string>\n    <string name=\"poll_new_choice_hint\">Вариант %1$d</string>\n    <string name=\"edit_poll\">Изменить</string>\n    <string name=\"title_scheduled_posts\">Запланированные посты</string>\n    <string name=\"action_edit\">Редактировать</string>\n    <string name=\"action_access_scheduled_posts\">Запланированные посты</string>\n    <string name=\"action_schedule_post\">Запланировать пост</string>\n    <string name=\"action_reset_schedule\">Сброс</string>\n    <string name=\"title_bookmarks\">Закладки</string>\n    <string name=\"action_bookmark\">Добавить в закладки</string>\n    <string name=\"action_view_bookmarks\">Закладки</string>\n    <string name=\"about_powered_by_tusky\">Работает на Tusky</string>\n    <string name=\"description_post_bookmarked\">Добавлено в закладки</string>\n    <string name=\"select_list_title\">Выбрать список</string>\n    <string name=\"list\">Список</string>\n    <string name=\"post_lookup_error_format\">Ошибка при поиске поста %1$s</string>\n    <string name=\"no_drafts\">У вас нет никаких черновиков.</string>\n    <string name=\"no_scheduled_posts\">У вас нет запланированных постов.</string>\n    <string name=\"warning_scheduling_interval\">Минимальный интервал планирования в Mastodon составляет 5 минут.</string>\n    <string name=\"pref_title_confirm_reblogs\">Запрашивать подтверждение перед продвижением</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Показывать предпросмотр ссылок в ленте</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Включить жест пролистывания для переключения между вкладками</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s человек</item>\n        <item quantity=\"few\">%1$s человека</item>\n        <item quantity=\"many\">%1$s человек</item>\n        <item quantity=\"other\">%1$s человек</item>\n    </plurals>\n    <string name=\"notification_follow_request_description\">Уведомления о запросах на подписку</string>\n    <string name=\"notification_follow_request_name\">Запросы на подписку</string>\n    <string name=\"dialog_mute_warning\">Игнорировать @%1$s?</string>\n    <string name=\"dialog_block_warning\">Заблокировать @%1$s?</string>\n    <string name=\"action_unmute_conversation\">Не игнорировать обсуждение</string>\n    <string name=\"action_mute_conversation\">Игнорировать обсуждение</string>\n    <string name=\"notification_follow_request_format\">%1$s отправил(а) вам запрос на подписку</string>\n    <string name=\"hashtags\">Хэштеги</string>\n    <string name=\"add_hashtag_title\">Добавить хэштэг</string>\n    <string name=\"pref_title_gradient_for_media\">Отображать цветные градиенты вместо скрытых медиа</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Снизу</string>\n    <string name=\"pref_main_nav_position_option_top\">Сверху</string>\n    <string name=\"pref_main_nav_position\">Расположение панели навигации</string>\n    <string name=\"action_unmute_domain\">Не игнорировать %1$s</string>\n    <string name=\"dialog_mute_hide_notifications\">Скрыть уведомления</string>\n    <string name=\"action_unmute_desc\">Перестать игнорировать %1$s</string>\n    <string name=\"account_note_saved\">Сохранено!</string>\n    <string name=\"account_note_hint\">Ваша личная заметка об этом пользователе</string>\n    <string name=\"pref_title_hide_top_toolbar\">Скрыть заголовок верхней панели инструментов</string>\n    <string name=\"no_announcements\">Объявлений нет.</string>\n    <string name=\"title_announcements\">Объявления</string>\n    <string name=\"wellbeing_mode_notice\">Некоторая информация, которая может повлиять на ваше самочувствие, будет скрыта. Она включает:\n\\n\n\\n- Уведомления о добавлении в избранное/продвижении/подписке\n\\n- Количество добавлений в избранное/количество продвижений\n\\n- Статистику подписчиков/постов в профилях\n\\n\n\\nНа push-уведомления это не повлияет, однако вы можете изменить настройки уведомлений вручную.</string>\n    <string name=\"pref_title_wellbeing_mode\">Самочувствие</string>\n    <string name=\"duration_indefinite\">Без ограничений</string>\n    <string name=\"label_duration\">Продолжительность</string>\n    <string name=\"post_media_attachments\">Вложения</string>\n    <string name=\"post_media_audio\">Аудио</string>\n    <string name=\"notification_subscription_format\">%1$s только что опубликовал(а)</string>\n    <string name=\"follow_requests_info\">Несмотря на то, что ваш аккаунт не закрыт, сотрудники %1$s решили, что вы захотите подтверждать запросы на подписку от этих аккаунтов вручную.</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Вы не можете загрузить более %1$d медиавложения.</item>\n        <item quantity=\"few\">Вы не можете загрузить более %1$d медиавложений.</item>\n        <item quantity=\"many\">Вы не можете загрузить более %1$d медиавложений.</item>\n        <item quantity=\"other\">Вы не можете загрузить более %1$d медиавложений.</item>\n    </plurals>\n    <string name=\"wellbeing_hide_stats_posts\">Скрыть статистику постов</string>\n    <string name=\"action_unsubscribe_account\">Отписаться</string>\n    <string name=\"action_subscribe_account\">Подписаться</string>\n    <string name=\"drafts_post_reply_removed\">Пост который Вы записали в черновик был удален</string>\n    <string name=\"drafts_failed_loading_reply\">Не удалось загрузить информацию об ответах</string>\n    <string name=\"draft_deleted\">Черновик удалён</string>\n    <string name=\"drafts_post_failed_to_send\">Этот пост не удалось отправить!</string>\n    <string name=\"dialog_delete_list_warning\">Вы действительно хотите удалить список %1$s?</string>\n    <string name=\"wellbeing_hide_stats_profile\">Скрыть статистику профилей</string>\n    <string name=\"limit_notifications\">Ограничить уведомления в ленте</string>\n    <string name=\"review_notifications\">Просмотр уведомлений</string>\n    <string name=\"notification_subscription_description\">Уведомлять о новых постах пользователей на которых Вы подписаны</string>\n    <string name=\"notification_subscription_name\">Новые посты</string>\n    <string name=\"pref_title_animate_custom_emojis\">Анимировать эмодзи</string>\n    <string name=\"dialog_delete_conversation_warning\">Удалить этот разговор?</string>\n    <string name=\"action_delete_conversation\">Удалить разговор</string>\n    <string name=\"pref_title_confirm_favourites\">Запрашивать подтверждение перед добавлением в избранное</string>\n    <string name=\"action_unbookmark\">Убрать из закладок</string>\n    <string name=\"a11y_label_loading_thread\">Загрузка обсуждения</string>\n    <string name=\"pref_reading_order_newest_first\">Сначала новые</string>\n    <string name=\"title_edits\">Правки</string>\n    <string name=\"status_edit_info\">Пост изменён: %1$s</string>\n    <string name=\"status_created_info\">Пост создан: %1$s</string>\n    <string name=\"title_login\">Войти</string>\n    <string name=\"action_browser_login\">Вход через Браузер</string>\n    <string name=\"error_image_edit_failed\">Изображение не удалось отредактировать.</string>\n    <string name=\"error_multimedia_size_limit\">Размер видео и аудио не может превышать %1$s МБ.</string>\n    <string name=\"error_muting_hashtag_format\">Не удалось игнорировать #%1$s</string>\n    <string name=\"error_following_hashtags_unsupported\">Этот сервер не поддерживает следующие хештеги.</string>\n    <string name=\"error_following_hashtag_format\">Не удалось подписаться на #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Не удалось отписаться от #%1$s</string>\n    <string name=\"error_media_upload_sending_fmt\">Загрузка не удалась: %1$s</string>\n    <string name=\"error_could_not_load_login_page\">Не удалось загрузить страницу входа.</string>\n    <string name=\"error_loading_account_details\">Не удалось загрузить данные учётной записи</string>\n    <string name=\"title_public_trending_statuses\">Популярные посты</string>\n    <string name=\"instance_rule_info\">Выполняя вход, вы соглашаетесь с правилами %1$s.</string>\n    <string name=\"instance_rule_title\">Правила %1$s</string>\n    <string name=\"pref_reading_order_oldest_first\">Сначала старые</string>\n    <string name=\"pref_title_reading_order\">Порядок чтения</string>\n    <string name=\"status_created_at_now\">сейчас</string>\n    <string name=\"pref_ui_text_size\">Размер текста пользовательского интерфейса</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"label_image\">Изображение</string>\n    <string name=\"duration_90_days\">90 дней</string>\n    <string name=\"no_lists\">У вас нет никаких списков.</string>\n    <string name=\"delete_scheduled_post_warning\">Удалить этот запланированный пост?</string>\n    <string name=\"action_unfollow_hashtag_format\">Отменить подписку на #%1$s?</string>\n    <string name=\"failed_to_pin\">Не удалось закрепить</string>\n    <string name=\"post_media_image\">Изображение</string>\n    <string name=\"status_filtered_show_anyway\">Показать в любом случае</string>\n    <string name=\"status_filter_placeholder_label_format\">Отфильтровано: %1$s</string>\n    <string name=\"mute_notifications_switch\">Скрыть из уведомлений</string>\n    <string name=\"dialog_follow_hashtag_title\">Подписаться на хэштег</string>\n    <string name=\"notification_update_format\">%1$s изменил(а) свой пост</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Отключено</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;не задано&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;недействителен&gt;</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"notification_listenable_worker_description\">Уведомлять когда Tusky работает в фоновом режиме</string>\n    <string name=\"notification_notification_worker\">Получаю уведомления…</string>\n    <string name=\"notification_listenable_worker_name\">Работа в фоне</string>\n    <string name=\"total_accounts\">пользователей</string>\n    <string name=\"description_post_language\">Язык Поста</string>\n    <string name=\"pref_default_post_language\">Язык постов (синхронизируется с сервером)</string>\n    <string name=\"notification_update_description\">Уведомлять о редактировании постов в которых вы участвовали</string>\n    <string name=\"notification_update_name\">Правки постов</string>\n    <string name=\"notification_report_name\">Жалобы</string>\n    <string name=\"about_account_info_title\">Ваш аккаунт</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nВерсия: %3$s</string>\n    <string name=\"about_device_info_title\">Ваше устройство</string>\n    <string name=\"set_focus_description\">Выберите точку или перетащите круг, чтобы выбрать область, которую всегда будет видно в миниатюрах.</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nВерсия Android: %3$s\n\\nВерсия SDK: %4$d</string>\n    <string name=\"pref_show_self_username_always\">Всегда</string>\n    <string name=\"pref_title_show_self_username\">Показывать имя пользователя на панели инструментов</string>\n    <string name=\"ui_error_reblog\">Не удалось продвинуть пост: %1$s</string>\n    <string name=\"hint_filter_title\">Мой фильтр</string>\n    <string name=\"label_filter_title\">Название</string>\n    <string name=\"filter_action_warn\">Предупреждение</string>\n    <string name=\"ui_success_rejected_follow_request\">Запрос на подписку блокирован</string>\n    <string name=\"action_add\">Добавить</string>\n    <string name=\"filter_keyword_display_format\">%1$s (слово целиком)</string>\n    <string name=\"label_filter_keywords\">Ключевые слова или фразы для фильтрации</string>\n    <string name=\"action_details\">Подробности</string>\n    <string name=\"action_dismiss\">Отклонить</string>\n    <string name=\"hint_media_description_missing\">У медиа должно быть описание.</string>\n    <string name=\"pref_show_self_username_disambiguate\">Когда в систему входит несколько учетных записей</string>\n    <string name=\"saving_draft\">Сохраняю черновик…</string>\n    <string name=\"pref_title_account_filter_keywords\">Профили</string>\n    <string name=\"failed_to_add_to_list\">Не удалось добавить учетную запись в список</string>\n    <string name=\"duration_365_days\">365 дней</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d людей говорят о хэштеге %2$s</string>\n    <string name=\"error_media_playback\">Не удалось воспроизвести: %1$s</string>\n    <string name=\"dialog_delete_filter_positive_action\">Удалить</string>\n    <string name=\"dialog_delete_filter_text\">Удалить фильтр \\'%1$s\\'?</string>\n    <string name=\"duration_60_days\">60 дней</string>\n    <string name=\"pref_title_http_proxy_port_message\">Порт должен находиться в диапазоне от %1$d до %2$d</string>\n    <string name=\"action_post_failed\">Загрузка не удалась</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Ваше сообщение не удалось загрузить, и оно было сохранено в черновиках.\n\\n\n\\nЛибо с сервером не удалось связаться, либо он отклонил сообщение.</item>\n        <item quantity=\"few\">Ваши сообщения не удалось загрузить, и они были сохранены в черновиках.\n\\n\n\\nЛибо с сервером не удалось связаться, либо он отклонил сообщение.</item>\n        <item quantity=\"many\">Ваши сообщения не удалось загрузить, и они были сохранены в черновиках.\n\\n\n\\nЛибо с сервером не удалось связаться, либо он отклонил сообщение.</item>\n        <item quantity=\"other\">Ваши сообщения не удалось загрузить, и они были сохранены в черновиках.\n\\n\n\\nЛибо с сервером не удалось связаться, либо он отклонил сообщение.</item>\n    </plurals>\n    <string name=\"action_post_failed_show_drafts\">Показать черновики</string>\n    <string name=\"action_post_failed_do_nothing\">Отклонить</string>\n    <string name=\"duration_30_days\">30 дней</string>\n    <string name=\"notification_unknown_name\">Неизвестно</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"duration_no_change\">(Без изменений)</string>\n    <string name=\"duration_180_days\">180 дней</string>\n    <string name=\"error_unmuting_hashtag_format\">Не удалось перестать игнорировать #%1$s</string>\n    <string name=\"ui_error_bookmark\">Не удалось добавить пост в закладки: %1$s</string>\n    <string name=\"ui_error_clear_notifications\">Не удалось очистить уведомления: %1$s</string>\n    <string name=\"ui_error_favourite\">Не удалось добавить пост в избранное: %1$s</string>\n    <string name=\"filter_action_hide\">Скрыть</string>\n    <string name=\"label_filter_action\">Действие фильтра</string>\n    <string name=\"label_filter_context\">Область применения фильтра</string>\n    <string name=\"filter_keyword_addition_title\">Добавить ключевое слово</string>\n    <string name=\"filter_edit_keyword_title\">Редактировать ключевое слово</string>\n    <string name=\"failed_to_remove_from_list\">Не удалось удалить учетную запись из списка</string>\n    <string name=\"description_login\">Работает в большинстве случаев. Данные не попадают в другие приложения.</string>\n    <string name=\"description_browser_login\">Может поддерживать дополнительные методы аутентификации, но требует наличия браузера с его поддержкой.</string>\n    <string name=\"app_theme_system_black\">Как в системе (черный)</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Создать пост</string>\n    <string name=\"account_date_joined\">Присоединился %1$s</string>\n    <string name=\"socket_timeout_exception\">Связь с вашим сервером заняла слишком много времени</string>\n    <string name=\"about_copy\">Копирование версии и информации об устройстве</string>\n    <string name=\"about_copied\">Версия и информация об устройстве скопировано</string>\n    <string name=\"action_add_reaction\">добавить реакцию</string>\n    <string name=\"select_list_manage\">Управлять списками</string>\n    <string name=\"ui_error_reject_follow_request\">Не удалось отклонить запрос на подписку: %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">Не удалось принять запрос на подписку: %1$s</string>\n    <string name=\"ui_error_vote\">Не удалось проголосовать в опросе: %1$s</string>\n    <string name=\"action_discard\">Отбросить изменения</string>\n    <string name=\"action_continue_edit\">Продолжить править</string>\n    <string name=\"notification_sign_up_name\">Регистрации</string>\n    <string name=\"notification_sign_up_description\">Уведомлять о новых пользователях</string>\n    <string name=\"action_share_account_link\">Поделиться ссылкой на профиль</string>\n    <string name=\"action_share_account_username\">Поделиться именем пользователя</string>\n    <string name=\"send_account_link_to\">Поделится ссылкой на профиль через…</string>\n    <string name=\"send_account_username_to\">Поделится именем пользователя в…</string>\n    <string name=\"account_username_copied\">Имя пользователя скопировано</string>\n    <string name=\"post_edited\">Отредактировано %1$s</string>\n    <string name=\"notification_header_report_format\">%1$s пожаловался(-лась) на %2$s</string>\n    <string name=\"notification_report_format\">Новая жалоба на %1$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d постов прикреплено</string>\n    <string name=\"confirmation_hashtag_unfollowed\">#%1$s больше не отслеживается</string>\n    <string name=\"description_post_edited\">Отредактировано</string>\n    <string name=\"title_followed_hashtags\">Отслеживаемые хэштэги</string>\n    <string name=\"error_status_source_load\">Не удалось загрузить источник состояния с сервера.</string>\n    <string name=\"action_add_or_remove_from_list\">Добавить или удалить из списка</string>\n    <string name=\"failed_to_unpin\">Не удалось открепить</string>\n    <string name=\"muting_hashtag_success_format\">Игнорировать хэштег #%1$s в качестве предупреждения</string>\n    <string name=\"unmuting_hashtag_success_format\">Хэштег #%1$s больше не игнорируется</string>\n    <string name=\"action_view_filter\">Посмотреть фильтр</string>\n    <string name=\"following_hashtag_success_format\">Теперь хэштег #%1$s отслеживается</string>\n    <string name=\"unfollowing_hashtag_success_format\">Хэштег #%1$s больше не отслеживается</string>\n    <string name=\"report_category_violation\">Нарушение правил</string>\n    <string name=\"action_set_focus\">Установить точку фокуса</string>\n    <string name=\"help_empty_home\">Это ваша <b>домашняя лента</b>. Здесь отображаются последние сообщения от пользователей, на которых вы подписаны. \\u0020\n\\n \\u0020\n\\nЧтобы найти людей, вы можете обнаружить профили в других лентах. Например, в местной ленте вашего сервера {{group}}. Либо вы можете поискать их по имени {{search}}; например, по имени Tusky вы найдете наш профиль Mastodon.</string>\n    <string name=\"help_empty_conversations\">Здесь находятся ваши <b>частные сообщения</b>; иногда их называют беседами или прямыми сообщениями (DM). \\u0020\n\\n \\u0020 \n\\nЛичные сообщения создаются путем установки видимости {{public}} поста на {{mail}} <i>Личное упоминание</i> и упоминания одного или нескольких пользователей в тексте. \\u0020 \n\\n \\u0020 \n\\nНапример, вы можете зайти в профиль пользователя, нажать кнопку создания поста [iconics gmd_edit] и изменить видимость.</string>\n    <string name=\"help_empty_lists\">Это ваш <b>раздел списков</b>. Вы можете создавать личные списки и добавлять в них пользователей. \\u0020\n\\n \\u0020\n\\nОбратите внимание, что в списки можно добавлять только тех пользователей, на которых вы подписаны. \\u0020\n\\n \\u0020\n\\nЭти списки можно использовать в качестве вкладки в меню Настройки учетной записи {{manage_accounts}} {{chevron_right}} Вкладки.</string>\n    <string name=\"compose_unsaved_changes\">У вас есть несохраненные изменения.</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"compose_save_draft_loses_media\">Сохранить черновик? (Вложения будут загружены снова при восстановлении черновика).</string>\n    <string name=\"title_public_trending_hashtags\">Популярные хэштеги</string>\n    <string name=\"notification_sign_up_format\">%1$s зарегистрировался(-лась)</string>\n    <string name=\"pref_title_show_stat_inline\">Показывать статистику постов в ленте</string>\n    <string name=\"filter_description_warn\">Скрыть с предупреждением</string>\n    <string name=\"ui_error_unknown\">неизвестная причина</string>\n    <string name=\"error_blocking_domain\">Не удалось скрыть %1$s: %2$s</string>\n    <string name=\"error_unblocking_domain\">Не удалось перестать игнорировать %1$s: %2$s</string>\n    <string name=\"notification_report_description\">Уведомлять о жалобах модерации</string>\n    <string name=\"load_newest_notifications\">Загрузка самых новых уведомлений</string>\n    <string name=\"compose_delete_draft\">Удалить черновик?</string>\n    <string name=\"error_missing_edits\">Ваш сервер знает, что это сообщение было отредактировано, но у него нет копии правок, поэтому они не могут быть вам показаны. \n\\n \\u0020\n\\nЭто <a href=\"https://github.com/mastodon/mastodon/issues/25398\">баг Mastodon №25398</a>.</string>\n    <string name=\"list_reply_policy_none\">Никому</string>\n    <string name=\"list_reply_policy_list\">Члены списка</string>\n    <string name=\"list_reply_policy_followed\">Любой пользователь на которого вы подписаны</string>\n    <string name=\"list_reply_policy_label\">Показать ответы</string>\n    <string name=\"pref_title_show_self_boosts\">Показывать самопродвижения</string>\n    <string name=\"pref_title_show_self_boosts_description\">Кто-то продвигает свой собственный пост</string>\n    <string name=\"pref_show_self_username_never\">Никогда</string>\n    <string name=\"notification_prune_cache\">Осматриваю кэш…</string>\n    <string name=\"list_exclusive_label\">Скрыть с главной ленты</string>\n    <string name=\"duration_14_days\">14 дней</string>\n    <string name=\"report_category_spam\">Спам</string>\n    <string name=\"report_category_other\">Другое</string>\n    <string name=\"action_refresh\">Обновить</string>\n    <string name=\"total_usage\">постов</string>\n    <string name=\"ui_success_accepted_follow_request\">Запрос на подписку принят</string>\n    <string name=\"filter_description_hide\">Скрыть полностью</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"dialog_save_profile_changes_message\">Хотите сохранить изменения профиля?</string>\n    <string name=\"action_edit_image\">Редактировать изображение</string>\n    <string name=\"pref_title_per_timeline_preferences\">Настройки лент</string>\n    <string name=\"post_privacy_direct\">Личное упоминание</string>\n    <string name=\"label_translating\">Перевод…</string>\n    <string name=\"label_translated\">Переведено с %1$s с помощью %2$s</string>\n    <string name=\"action_translate\">Перевести</string>\n    <string name=\"action_show_original\">Показать оригинал</string>\n    <string name=\"url_copied\">Ссылка скопирована</string>\n    <string name=\"reply_sending_long\">Ваш ответ отправляется.</string>\n    <string name=\"confirmation_hashtag_copied\">Хэштег «#%1$s» скопирован</string>\n    <string name=\"reply_sending\">Отправка…</string>\n    <string name=\"pref_default_reply_privacy\">Видимость ответов (не синхронизируется с сервером)</string>\n    <string name=\"unknown_notification_type\">Неизвестный тип уведомлений</string>\n    <string name=\"pref_title_show_notifications_filter\">Показать фильтр уведомлений</string>\n    <string name=\"dialog_follow_warning\">Подписаться на пользователя?</string>\n    <string name=\"pref_title_confirm_follows\">Запрашивать подтверждение перед подпиской на пользователя</string>\n    <string name=\"report_category_legal\">Нарушение закона</string>\n    <string name=\"ui_error_translate\">Ошибка перевода: %1$s</string>\n    <string name=\"pref_match_default_post_privacy\">Соответствует типичным параметрам приватности сообщений</string>\n    <string name=\"label_expires_after\">Истекает после</string>\n    <string name=\"action_follow_hashtag\">Подписаться на новый хэштег</string>\n    <string name=\"filtered_notifications_title\">Отфильтрованные уведомления</string>\n    <string name=\"accept_notification_request\">Принять запрос на показ уведомлений</string>\n    <string name=\"pref_default_reply_privacy_explanation\">Изначальный выбор видимости будет зависеть от поста, на который вы отвечаете.</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_description\">Фильтруются, если только это не ответ на ваше собственное упоминание или если вы подписаны на отправителя</string>\n    <string name=\"notification_policies_filter_not_following_description\">Включая людей, которые подписаны на вас меньше чем 3 дня</string>\n    <string name=\"notification_policies_not_supported\">Эта функция поддерживается только на серверах Mastodon версии 4.3.0 и выше.</string>\n    <string name=\"notification_policies_title\">Политика уведомлений</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">Люди, на которых вы не подписаны</string>\n    <string name=\"notification_policies_filter_dont_follow_description\">Пока вы не одобрите их вручную</string>\n    <string name=\"notification_policies_filter_not_following_title\">Люди, не подписанные на вас</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">Новые учётные записи</string>\n    <string name=\"unknown_notification_filter_new_accounts_description\">Созданные в течение последних 30 дней</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_title\">Нежелательные личные упоминания</string>\n    <string name=\"unknown_notification_filter_moderated_accounts\">Учётные записи под руководством модератора</string>\n    <string name=\"unknown_notification_filter_moderated_accounts_description\">Ограниченные модераторами сервера</string>\n    <string name=\"notification_policies_filter_out\">Управление уведомлениями от…</string>\n    <string name=\"open_settings\">Открыть настройки</string>\n    <string name=\"filtered_notifications\">Отфильтрованные уведомления</string>\n    <string name=\"notification_policy_accept\">Принимать</string>\n    <string name=\"notification_policy_filter\">Фильтровать</string>\n    <string name=\"notification_policy_ignore\">Игнорировать</string>\n    <string name=\"action_accept_notification_request\">Принять</string>\n    <string name=\"action_dismiss_notification_request\">Отклонить</string>\n    <string name=\"notifications_from\">Уведомления от пользователя %1$s</string>\n    <string name=\"dismiss_notification_request\">Отклонить запрос на показ уведомлений</string>\n    <string name=\"notifications_from_people_you_may_know\">Уведомления от %1$d людей, которых вы можете знать</string>\n    <string name=\"error_deleting_filter\">Не удалось удалить фильтр \\'%1$s\\'</string>\n    <string name=\"error_saving_filter\">Не удалось сохранить фильтр \\'%1$s\\'</string>\n    <string name=\"notification_channel_other_description\">Прочие уведомления, например насчёт утраченных контактов или предупреждений от модерации</string>\n    <string name=\"notification_channel_admin\">Администрирование</string>\n    <string name=\"relationship_severance_event_domain_block\">Администратор из %1$s заблокировал %2$s, включая %3$s ваших подписчиков и %4$s, на которых вы подписаны.</string>\n    <plurals name=\"accounts\">\n        <item quantity=\"one\">%1$s учетная запись</item>\n        <item quantity=\"few\">%1$s учетных записи</item>\n        <item quantity=\"many\">%1$s учетных записей</item>\n        <item quantity=\"other\">%1$s учетных записей</item>\n    </plurals>\n    <string name=\"moderation_warning\">Вы получили предупреждение от модерации.</string>\n    <string name=\"relationship_severance_event_user_domain_block\">Вы заблокировали %1$s, потеряв %2$s подписчиков и %3$s подписок.</string>\n    <string name=\"poll\">Опрос</string>\n    <plurals name=\"media_attachments\">\n        <item quantity=\"one\">%1$s медиафайл</item>\n        <item quantity=\"few\">%1$s медиафайла</item>\n        <item quantity=\"many\">%1$s медиафайлов</item>\n        <item quantity=\"other\">%1$s медиафайлов</item>\n    </plurals>\n    <string name=\"notification_channel_admin_description\">Административные уведомления, например насчёт новых жалоб и регистраций</string>\n    <string name=\"relationship_severance_event_account_suspension\">Администратор из %1$s приостановил действие %2$s, что означает, что вы больше не можете получать от него обновления или взаимодействовать с ним.</string>\n    <string name=\"moderation_warning_action_sensitive\">С этого момента ваши сообщения будут помечены как чувствительные.</string>\n    <string name=\"relationship_severance_event_title\">Связь потеряна</string>\n    <string name=\"moderation_warning_action_none\">Ваша учетная запись получила предупреждение от модерации.</string>\n    <string name=\"unknown_notification_type_explanation\">Tusky не распознает этот тип уведомления и не может показать его вам. Возможно, это может сделать веб-интерфейс вашего сервера. Пожалуйста, сообщите об этом разработчикам Tusky, чтобы они добавили поддержку этого типа!</string>\n    <string name=\"poll_show_results\">Показать результаты</string>\n    <string name=\"notification_info_private_reply\">Частный ответ</string>\n    <string name=\"notification_info_reply\">Ответ</string>\n    <string name=\"notification_info_private_mention\">Частное упоминание</string>\n    <string name=\"notification_info_mention\">Упоминание</string>\n    <string name=\"moderation_warning_action_suspend\">Ваша учетная запись была приостановлена.</string>\n    <string name=\"moderation_warning_action_disable\">Ваша учётная запись отключена.</string>\n    <string name=\"moderation_warning_action_silence\">Ваша учетная запись была ограничена.</string>\n    <string name=\"moderation_warning_action_delete_statuses\">Некоторые ваши посты были удалены.</string>\n    <string name=\"moderation_warning_action_mark_statuses_as_sensitive\">Некоторые из ваших сообщений были помечены как чувствительные.</string>\n    <string name=\"action_reblog_private\">Продвинуть для подписчиков</string>\n    <string name=\"action_reblog_public\">Продвинуть публично</string>\n    <string name=\"action_reblog_unlisted\">Скрытое продвижение</string>\n    <string name=\"notification_severed_relationship_name\">Утраченные связи</string>\n    <string name=\"notification_moderation_warning_name\">Предупреждения модерации</string>\n    <string name=\"notification_unknown_description\">Неизвестный тип уведомлений</string>\n    <string name=\"notification_channel_other\">Прочее</string>\n    <string name=\"preview_card_by_author\">От %1$s</string>\n    <string name=\"preview_card_more_by_author\">Больше от %1$s</string>\n    <string name=\"yes\">Да</string>\n    <string name=\"no\">Нет</string>\n    <string name=\"confirm_dismiss_caption\">Отбросить изменения надписи?</string>\n    <string name=\"follow_hashtag_success\">Вы подписались на хэштег %1$s</string>\n    <string name=\"post_replied_format\">Ответ для %1$s</string>\n    <string name=\"post_replied_self\">Продолжение обсуждения</string>\n    <string name=\"post_replied\">Ответил(а)</string>\n    <string name=\"unmute_success\">Игнорирование снято %1$s</string>\n    <string name=\"unmute_failure\">Возврат из игнорирования потерпел крах %1$s: %2$s</string>\n    <string name=\"unblock_success\">Разблокировано %1$s</string>\n    <string name=\"block_failure\">Не удалось заблокировать %1$s: %2$s</string>\n    <string name=\"unblock_failure\">Не удалось разблокировать %1$s: %2$s</string>\n    <string name=\"accept_follow_request_failure\">Не удалось принять запрос на подписку от %1$s: %2$s</string>\n    <string name=\"reject_follow_request_failure\">Не удалось отклонить запрос на подписку от %1$s: %2$s</string>\n    <string name=\"mute_failure\">Не удалось скрыть %1$s: %2$s</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-sa/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"title_public_local\">स्थानीयाः</string>\n    <string name=\"title_notifications\">ज्ञापनसूचनाः</string>\n    <string name=\"title_home\">गृहम्</string>\n    <string name=\"error_sender_account_gone\">दौत्यप्रेषणं विफलं जातम् ।</string>\n    <string name=\"error_media_upload_sending\">उपारोपणं विफलं जातम् ।</string>\n    <string name=\"error_media_upload_image_or_video\">चलचित्राणि चित्राणि चोभे एव नैकस्मिन्नेव प्रकटने संस्थापिते भवितुमर्हतः ।</string>\n    <string name=\"error_media_download_permission\">श्रव्यदृश्यसामग्र्यः रक्षयितुमनुमतिर्दातव्या ।</string>\n    <string name=\"error_compose_character_limit\">भृशं दीर्घतमा स्थितिरियम् !</string>\n    <string name=\"error_media_upload_permission\">श्रव्यदृश्यसामग्र्यः द्रष्टुमनुमतिर्दातव्या ।</string>\n    <string name=\"error_media_upload_opening\">सा सञ्चिका नोद्घाट्यते ।</string>\n    <string name=\"error_media_upload_type\">नैतादृशा सञ्चिका उपारोपणीया ।</string>\n    <string name=\"error_retrieving_oauth_token\">सम्प्रवेशस्तोकं न लब्धम् ।</string>\n    <string name=\"error_authorization_denied\">प्रमाणीकरणं निषिद्धम् ।</string>\n    <string name=\"error_authorization_unknown\">अज्ञातः प्रमाणीकरणदोषो जातः ।</string>\n    <string name=\"error_no_web_browser_found\">प्रयोजनार्थं जालसञ्चारकं न लब्धम् ।</string>\n    <string name=\"error_failed_app_registration\">तेन विशिष्टस्थलेन प्रमाणीकरणं विफलं जातम् ।</string>\n    <string name=\"error_invalid_domain\">अवैधानिकप्रदेशः प्रविष्टः</string>\n    <string name=\"error_empty\">नैतद्रिक्तं भवितुमर्हति ।</string>\n    <string name=\"error_network\">दोषो जातः । कृपया भवतोऽन्तर्जालीयसम्पर्कं परीक्ष्य पुनश्च यत्यताम् !</string>\n    <string name=\"error_generic\">दोषो जातः ।</string>\n    <string name=\"footer_empty\">न किमप्यत्र । नवीकरणार्थमाकृष्यतामधः !</string>\n    <string name=\"message_empty\">न किमप्यत्र ।</string>\n    <string name=\"post_content_show_less\">संनिपत्यताम्</string>\n    <string name=\"post_content_show_more\">विस्तार्यताम्</string>\n    <string name=\"post_content_warning_show_less\">स्वल्पं दृश्यताम्</string>\n    <string name=\"post_content_warning_show_more\">अधिकं दृश्यताम्</string>\n    <string name=\"post_sensitive_media_directions\">द्रष्टुमत्र नुद्यताम्</string>\n    <string name=\"post_media_hidden_title\">प्रच्छन्नसामग्र्यः</string>\n    <string name=\"post_sensitive_media_title\">संवेदनशीलो विषयः</string>\n    <string name=\"post_boosted_format\">%1$s अप्रकाशयत्</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"title_licenses\">अनुज्ञापत्राणि</string>\n    <string name=\"title_scheduled_posts\">कालबद्धदौत्यानि</string>\n    <string name=\"title_drafts\">लेखविकर्षाः</string>\n    <string name=\"title_edit_profile\">स्वीयव्यक्तिविवरणं सम्पाद्यताम्</string>\n    <string name=\"title_follow_requests\">अनुसरणार्थमनुरोधाः</string>\n    <string name=\"title_domain_mutes\">प्रच्छन्नप्रदेशाः</string>\n    <string name=\"title_blocks\">निषिद्धोपभोक्तारः</string>\n    <string name=\"title_mutes\">मूकोपभोक्तारः</string>\n    <string name=\"title_bookmarks\">पुटचिह्नानि</string>\n    <string name=\"title_favourites\">प्रियाः</string>\n    <string name=\"title_followers\">अनुसर्तारः</string>\n    <string name=\"title_follows\">अनुसरति</string>\n    <string name=\"title_posts_pinned\">कीलिताः</string>\n    <string name=\"title_posts_with_replies\">सप्रत्युत्तरम्</string>\n    <string name=\"title_posts\">दौत्यानि</string>\n    <string name=\"title_view_thread\">दौत्यमाला</string>\n    <string name=\"title_tab_preferences\">पीठिकाः</string>\n    <string name=\"title_direct_messages\">प्रत्यक्षसन्देशाः</string>\n    <string name=\"title_public_federated\">सङ्घीयाः</string>\n    <string name=\"notification_follow_format\">%1$s त्वामन्वसरत्</string>\n    <string name=\"notification_favourite_format\">%1$s भवदीयदौत्याय रुचिमददात्</string>\n    <string name=\"notification_reblog_format\">%1$s भवदीयं दौत्यं प्राकाशयत्</string>\n    <string name=\"action_send_public\">प्रेष्यताम् !</string>\n    <string name=\"action_send\">प्रेष्यताम्</string>\n    <string name=\"action_delete_and_redraft\">विनश्य पुनश्च लिख्यताम्</string>\n    <string name=\"action_delete\">नश्यताम्</string>\n    <string name=\"action_edit\">सम्पाद्यताम्</string>\n    <string name=\"action_report\">आवेद्यताम्</string>\n    <string name=\"action_show_reblogs\">प्रकाशनानि दृश्यन्ताम्</string>\n    <string name=\"action_hide_reblogs\">प्रकाशनानि छाद्यन्ताम्</string>\n    <string name=\"action_unblock\">अवरोधो नश्यताम्</string>\n    <string name=\"action_block\">अवरुध्यताम्</string>\n    <string name=\"action_unfollow\">अनुसरणं अपाकुरुताम्</string>\n    <string name=\"action_follow\">अनुस्रियताम्</string>\n    <string name=\"action_logout_confirm\">नूनमेव बहिर्गन्तुमीहते %1$s इति व्यक्तित्वलेखात् ?</string>\n    <string name=\"action_logout\">बहिर्गम्यताम्</string>\n    <string name=\"action_login\">मास्टुडोनमाध्यमेन सम्प्रविश्यताम्</string>\n    <string name=\"action_compose\">रच्यताम्</string>\n    <string name=\"action_more\">अधिकम्</string>\n    <string name=\"action_unfavourite\">प्रियता निष्क्रियताम्</string>\n    <string name=\"action_bookmark\">पुटचिह्नं क्रियताम्</string>\n    <string name=\"action_favourite\">प्रियम्</string>\n    <string name=\"action_unreblog\">प्रकाशनं निष्क्रियताम्</string>\n    <string name=\"action_reblog\">प्रकाश्यताम्</string>\n    <string name=\"action_reply\">प्रत्युत्तरं दीयताम्</string>\n    <string name=\"action_quick_reply\">त्वरितप्रत्युत्तरं दीयताम्</string>\n    <string name=\"report_comment_hint\">अन्यटिप्पण्यः ?</string>\n    <string name=\"report_username_format\">आवेद्यताम् @%1$s</string>\n    <string name=\"notification_follow_request_format\">%1$s तवाऽनुसरणार्थंं न्यवेदयत्</string>\n    <string name=\"action_add_media\">सामग्र्यः युज्यन्ताम्</string>\n    <string name=\"action_open_in_web\">जालसञ्चारके उद्घाट्यताम्</string>\n    <string name=\"action_view_media\">सामग्र्यः</string>\n    <string name=\"action_view_follow_requests\">अनुसरणार्थमनुरोधाः</string>\n    <string name=\"action_view_domain_mutes\">प्रच्छन्नप्रदेशाः</string>\n    <string name=\"action_view_blocks\">निषिद्धभोक्तारः</string>\n    <string name=\"action_view_mutes\">मूकभोक्तारः</string>\n    <string name=\"action_view_bookmarks\">पुटचिह्नानि</string>\n    <string name=\"action_view_favourites\">प्रियाः</string>\n    <string name=\"action_view_account_preferences\">लेखाविन्यासाः</string>\n    <string name=\"action_view_preferences\">विन्यासाः</string>\n    <string name=\"action_view_profile\">व्यक्तिविवरणम्</string>\n    <string name=\"action_close\">पिधीयताम्</string>\n    <string name=\"action_retry\">पुनः यत्यताम्</string>\n    <string name=\"action_unmute_desc\">%1$s सशब्दं क्रियताम्</string>\n    <string name=\"action_unmute\">सशब्दम्</string>\n    <string name=\"action_mute\">निःशब्दम्</string>\n    <string name=\"action_share\">विभाज्यताम्</string>\n    <string name=\"action_photo_take\">चित्रं गृह्यताम्</string>\n    <string name=\"action_add_poll\">मतदानं युज्यताम्</string>\n    <string name=\"send_media_to\">सामग्र्यस्मै विभाज्यताम् …</string>\n    <string name=\"send_post_content_to\">दौत्यमस्मै विभाज्यताम् …</string>\n    <string name=\"send_post_link_to\">दौत्यजालस्थलमस्मै विभाज्यताम् …</string>\n    <string name=\"downloading_media\">सामग्री अवारोप्यमाणा</string>\n    <string name=\"download_media\">सामग्री अवारोप्यताम्</string>\n    <string name=\"action_share_as\">एवं विभाज्यताम् …</string>\n    <string name=\"action_open_as\">%1$s एवमुद्घाट्यताम्</string>\n    <string name=\"action_copy_link\">जालस्थलं प्रतिलिख्यताम्</string>\n    <string name=\"download_image\">अवारोप्यमाणम् %1$s</string>\n    <string name=\"action_open_media_n\">उद्घाट्यताम् #%1$d</string>\n    <string name=\"title_links_dialog\">जालस्थलानि</string>\n    <string name=\"title_mentions_dialog\">उल्लेखाः</string>\n    <string name=\"title_hashtags_dialog\">निश्रेणिचिह्नशीर्षकाः</string>\n    <string name=\"action_open_faved_by\">प्रियाणि दृश्यन्ताम्</string>\n    <string name=\"action_open_reblogged_by\">प्रकाशनानि दृश्यन्ताम्</string>\n    <string name=\"action_open_reblogger\">प्रकाशनलेखकः उद्घाट्यताम्</string>\n    <string name=\"action_hashtags\">निश्रेणिचिह्नशीर्षकाः</string>\n    <string name=\"action_mentions\">उल्लेखाः</string>\n    <string name=\"action_links\">जालस्थलानि</string>\n    <string name=\"action_add_tab\">पीठिका युज्यताम्</string>\n    <string name=\"action_reset_schedule\">पुनरारम्भः</string>\n    <string name=\"action_schedule_post\">कालबद्धदौत्यं क्रियताम्</string>\n    <string name=\"action_emoji_keyboard\">भावचिह्नटङ्कणफलकम्</string>\n    <string name=\"action_content_warning\">विषयप्रत्यादेशः</string>\n    <string name=\"action_toggle_visibility\">दौत्यसुदर्शता</string>\n    <string name=\"action_access_scheduled_posts\">कालबद्धदौत्यानि</string>\n    <string name=\"action_access_drafts\">लेखविकर्षाः</string>\n    <string name=\"action_search\">अन्विष्यताम्</string>\n    <string name=\"action_reject\">अस्वीक्रियताम्</string>\n    <string name=\"action_accept\">स्वीक्रियताम्</string>\n    <string name=\"action_undo\">अपाक्रियताम्</string>\n    <string name=\"action_edit_own_profile\">सम्पाद्यताम्</string>\n    <string name=\"action_edit_profile\">व्यक्तिविवरणं सम्पाद्यताम्</string>\n    <string name=\"action_save\">रक्ष्यताम्</string>\n    <string name=\"action_open_drawer\">पेटिकोद्घट्यताम्</string>\n    <string name=\"action_hide_media\">सामग्र्यः वार्यन्ताम्</string>\n    <string name=\"action_mention\">उल्लिख्यताम्</string>\n    <string name=\"action_unmute_conversation\">सशब्द आलापः क्रियताम्</string>\n    <string name=\"action_mute_conversation\">तूष्णीमालापः क्रियताम्</string>\n    <string name=\"action_unmute_domain\">%1$s सशब्दं क्रियताम्</string>\n    <string name=\"action_mute_domain\">%1$s निःशब्दं क्रियताम्</string>\n    <string name=\"confirmation_unmuted\">भोक्ता सशब्दः कृतः</string>\n    <string name=\"confirmation_unblocked\">निरवरोधः कृतः</string>\n    <string name=\"confirmation_reported\">प्रेषितम्!</string>\n    <string name=\"login_connection\">सम्पर्कः क्रियते…</string>\n    <string name=\"link_whats_an_instance\">किं नाम विशिष्टस्थलम्?</string>\n    <string name=\"label_header\">शीर्षः</string>\n    <string name=\"label_avatar\">अवतारः</string>\n    <string name=\"label_quick_reply\">प्रत्युत्तरम् …</string>\n    <string name=\"search_no_results\">न परिणामाः</string>\n    <string name=\"hint_search\">अन्विष्यताम्…</string>\n    <string name=\"hint_note\">विवरणम्</string>\n    <string name=\"hint_display_name\">नाम</string>\n    <string name=\"hint_content_warning\">विषयप्रत्यादेशः</string>\n    <string name=\"hint_compose\">किं वर्तमानमस्ति ?</string>\n    <string name=\"hint_domain\">किं विशिष्टस्थलम् ?</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s अनावृतः</string>\n    <string name=\"pref_title_notification_filters\">अहं ज्ञप्यतां यदा</string>\n    <string name=\"pref_title_notification_alert_light\">ज्योत्या ज्ञप्यताम्</string>\n    <string name=\"pref_title_notification_alert_vibrate\">कम्पनेन ज्ञप्यताम्</string>\n    <string name=\"pref_title_notification_alert_sound\">ध्वनिना ज्ञप्यताम्</string>\n    <string name=\"pref_title_notification_alerts\">सतर्कत-ज्ञापनसूचनाः</string>\n    <string name=\"pref_title_notifications_enabled\">ज्ञापनसूचनाः</string>\n    <string name=\"pref_title_edit_notification_settings\">ज्ञापनसूचनाः</string>\n    <string name=\"visibility_direct\">प्रत्यक्षम् - केवलमुल्लिखितयोक्तृभ्यः प्रकट्यताम्</string>\n    <string name=\"visibility_private\">केवलमनुसर्तृृणाम् :- कृते प्रकट्यताम्</string>\n    <string name=\"visibility_unlisted\">अनिर्दिष्टः = सार्वजनिकसमयतालिकायां मा प्रकट्यताम्</string>\n    <string name=\"visibility_public\">सार्वजनिकः‍‍‍‍= प्रकट्यतां सार्वजनिकसमयतालिकासु</string>\n    <string name=\"dialog_mute_hide_notifications\">ज्ञापनसूचनाः छाद्यन्ताम्</string>\n    <string name=\"dialog_mute_warning\">निःशब्दं क्रियताम् @%1$s?</string>\n    <string name=\"dialog_block_warning\">किल अवरुध्यताम् @%1$s?</string>\n    <string name=\"mute_domain_warning_dialog_ok\">प्रदेशः छाद्यताम्</string>\n    <string name=\"mute_domain_warning\">निश्चियेन सर्वमेव निषिद्धं भवेदेतस्य जनस्य %1$s ? कोऽपि विषयो न द्रष्टुं शक्यते तत्प्रदेशात् कस्यामपि समयतालिकायामुत वा ते सूचनापेटिकायाम् । भवदनुसर्तारः तस्मात्प्रदेशान्निष्क्रियन्ते ।</string>\n    <string name=\"dialog_redraft_post_warning\">विनश्य पुनः लिख्यताम् ?</string>\n    <string name=\"dialog_delete_post_warning\">दौत्यमेतन्नश्यताम्?</string>\n    <string name=\"dialog_unfollow_warning\">व्यक्तित्वविवरणलेखायाः अनुसरणम् अपाकरणीयं किम् ?</string>\n    <string name=\"dialog_download_image\">अवारोप्यताम्</string>\n    <string name=\"dialog_message_uploading_media\">उपारोप्यमाणम्…</string>\n    <string name=\"dialog_title_finishing_media_upload\">सामग्रीणामुपारोपणसिद्धिः वर्तमाना</string>\n    <string name=\"dialog_whats_an_instance\">कस्याऽपि विशिष्टस्थलस्य सङ्केतसूत्रमत्र टङ्कयितुं शक्यते mastodon.social, icosahedron.website, social.tchncs.de, तथेैव<a href=\"https://instances.social\">अधिकम्</a> \\u0020\n\\n \\u0020\n\\nयदि युष्माकं व्यक्तिगतलेखाऽत्र न वर्तते तर्हि तस्य विशिष्टस्थलस्य नाम टङ्कयित्वा तत्र निर्मातुं शक्नुथ । \\u0020\n\\n \\u0020\n\\nविशिष्टस्थलमित्युक्ते स्थलमेकं यत्र युष्माकं लेखाः आश्रिताः, किन्तु साफल्येनैवाऽन्यविशिष्टस्थलीयैः सह सम्पर्कयितुं शक्यते । \\u0020\n\\n \\u0020\n\\nअधिकमत्र प्राप्यते <a href=\"https://joinmastodon.org\">joinmastodon.org</a>. </string>\n    <string name=\"hint_search_people_list\">येषामुसरणं करोषि तेष्वन्विष्यताम्</string>\n    <string name=\"action_delete_list\">सूचिर्नश्यताम्</string>\n    <string name=\"action_rename_list\">पुनः सूचिनामकरणं क्रियताम्</string>\n    <string name=\"action_create_list\">सूचिः निर्मीयताम्</string>\n    <string name=\"error_delete_list\">सूचिर्नष्टुमशक्या</string>\n    <string name=\"error_rename_list\">पुनः सूचिनामकरणं कर्तुमशक्यम्</string>\n    <string name=\"error_create_list\">सूचिनिर्माणं कर्तुमशक्यम्</string>\n    <string name=\"dialog_message_cancel_follow_request\">अनुसरणानुरोधो नश्यताम् ?</string>\n    <string name=\"title_lists\">सूचयः</string>\n    <string name=\"action_lists\">सूचयः</string>\n    <string name=\"add_account_description\">नवमास्टोडोनलेखा युज्यताम्</string>\n    <string name=\"add_account_name\">नवलेखा युज्यताम्</string>\n    <string name=\"filter_add_description\">शोधनार्थं वाक्यांशः</string>\n    <string name=\"filter_dialog_whole_word_description\">यदा शब्दो वा वाक्यांशश्चिह्नरहितो भवति, तर्हि विन्यासोऽयं स्थाप्यते केवलं यदा पूर्णत्वेन शब्दसमानता वर्तते</string>\n    <string name=\"filter_dialog_whole_word\">सर्वः शब्दः</string>\n    <string name=\"filter_dialog_update_button\">नवीक्रियताम्</string>\n    <string name=\"filter_dialog_remove_button\">नश्यताम्</string>\n    <string name=\"filter_edit_title\">शोधकं सम्पाद्यताम्</string>\n    <string name=\"filter_addition_title\">शोधकं युज्यताम्</string>\n    <string name=\"pref_title_thread_filter_keywords\">आलापाः</string>\n    <string name=\"pref_title_public_filter_keywords\">सार्वजनिकतालिकाः</string>\n    <string name=\"load_more_placeholder_text\">अधिकमारोप्यताम्</string>\n    <string name=\"replying_to\">\\@%1$s मित्रायोत्तरम्</string>\n    <string name=\"title_media\">सामग्र्यः</string>\n    <string name=\"pref_title_alway_open_spoiler\">सर्वदा विषयसतर्कतयाऽङ्कितं दौत्यं विस्तार्यताम्</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">सर्वदा संवेदनशीलविषयो दृश्यताम्</string>\n    <string name=\"follows_you\">त्वामनुसरति</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds क्ष</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm नि</string>\n    <string name=\"abbreviated_hours_ago\">%1$dh घ</string>\n    <string name=\"abbreviated_years_ago\">%1$dy वर्ष</string>\n    <string name=\"abbreviated_days_ago\">%1$dd दि</string>\n    <string name=\"abbreviated_in_seconds\">%1$ds क्ष</string>\n    <string name=\"abbreviated_in_minutes\">%1$dm नि</string>\n    <string name=\"abbreviated_in_hours\">%1$dh घ</string>\n    <string name=\"abbreviated_in_days\">%1$dd दि</string>\n    <string name=\"abbreviated_in_years\">%1$dy वर्ष</string>\n    <string name=\"state_follow_requested\">अनुसरणं निवेदितम्</string>\n    <string name=\"post_media_video\">चलचित्राणि</string>\n    <string name=\"post_media_images\">चित्राणि</string>\n    <string name=\"post_share_link\">दौत्याय जालस्थानं विभाज्यताम्</string>\n    <string name=\"post_share_content\">दौत्यविषयो विभाज्यताम्</string>\n    <string name=\"about_tusky_account\">टस्कीवर्यस्य व्यक्तिगतविवरणम्</string>\n    <string name=\"about_bug_feature_request_site\">अशुद्धीनामावेदनं वैशिष्ट्यनिवेदनञ्च\n\\n https://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_project_site\">प्रकल्पस्य जालसूत्रम् :\n\\n https://tusky.app</string>\n    <string name=\"about_tusky_license\">टस्कीत्यनावृतस्रोतो निःशुल्कतन्त्रांशः। GNU General Public License Version 3 इत्यनेनाऽनुज्ञापितः। अत्राऽनुज्ञापत्रं द्रष्टुं शक्यते:-https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <string name=\"about_powered_by_tusky\">टस्कीत्यनेनाऽऽश्रितः</string>\n    <string name=\"about_tusky_version\">टस्की %1$s</string>\n    <string name=\"about_title_activity\">विज्ञप्तिः</string>\n    <string name=\"description_account_locked\">कपाटितव्यक्तिविवरणलेखः</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d नवपरस्परक्रिया</item>\n        <item quantity=\"other\">%1$d नवपरस्परक्रिये</item>\n    </plurals>\n    <string name=\"notification_summary_small\">%1$s च %2$s च</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, तथैव %3$s</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s तथा च %4$d अन्येऽपि</string>\n    <string name=\"notification_mention_format\">%1$s मित्रेण भवन्नामोल्लिखितम्</string>\n    <string name=\"notification_poll_description\">मतदाने समाप्ते सति सूचनाः</string>\n    <string name=\"notification_poll_name\">मतदानानि</string>\n    <string name=\"notification_favourite_description\">प्रीतिः इत्यङ्किते सति ज्ञापनसूचनाः</string>\n    <string name=\"notification_favourite_name\">प्रियाः</string>\n    <string name=\"notification_boost_description\">दौत्यप्रकाशने सति ज्ञापनसूचनाः</string>\n    <string name=\"notification_boost_name\">प्रकाशनानि</string>\n    <string name=\"notification_follow_request_description\">अनुसरणानुरोधान्नधिकृत्य ज्ञापनसूचनाः</string>\n    <string name=\"notification_follow_request_name\">अनुसरणार्थमनुरोधाः</string>\n    <string name=\"notification_mention_descriptions\">नवोल्लेखान्नधिकृत्य ज्ञापनसूचनाः</string>\n    <string name=\"notification_follow_description\">नवानुसर्तृृन्नधिकृत्य ज्ञापनसूचनाः</string>\n    <string name=\"notification_follow_name\">नवानुसर्तारः</string>\n    <string name=\"notification_mention_name\">नवोल्लेखाः</string>\n    <string name=\"post_text_size_largest\">स्थूलतमः</string>\n    <string name=\"post_text_size_large\">स्थूलः</string>\n    <string name=\"post_text_size_medium\">मध्यमः</string>\n    <string name=\"post_text_size_small\">सूक्ष्मः</string>\n    <string name=\"post_text_size_smallest\">सूक्ष्मतमः</string>\n    <string name=\"pref_post_text_size\">दौत्यस्य / स्थितेरक्षराकारः</string>\n    <string name=\"post_privacy_followers_only\">केवलमनुसर्तृभ्यः</string>\n    <string name=\"post_privacy_unlisted\">अनिर्दिष्टम्</string>\n    <string name=\"post_privacy_public\">सार्वजनिकम्</string>\n    <string name=\"pref_main_nav_position_option_bottom\">नितलम्</string>\n    <string name=\"pref_main_nav_position_option_top\">शिखरम्</string>\n    <string name=\"pref_main_nav_position\">मुख्यमार्गणस्थितिः</string>\n    <string name=\"pref_failed_to_sync\">विन्यासं समसामयिकं कर्तुं विफलता</string>\n    <string name=\"pref_publishing\">प्रकाशनम् (जालवितरकेण सह सामयिकम्)</string>\n    <string name=\"pref_default_media_sensitivity\">श्रव्यदृश्यसामग्रीः सदा संवेदनशीलाः इत्यङ्क्यताम्</string>\n    <string name=\"pref_default_post_privacy\">पूर्वनिविष्टप्रकटनगुह्यता</string>\n    <string name=\"pref_title_http_proxy_port\">HTTPS प्रतिनिधिद्वारिका</string>\n    <string name=\"pref_title_http_proxy_server\">HTTPS प्रतिनिधिजालवितारकम्</string>\n    <string name=\"pref_title_http_proxy_enable\">HTTP प्रतिनिधिसंयुतनं क्रियताम्</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP प्रतिनिधिः</string>\n    <string name=\"pref_title_proxy_settings\">प्रतिनिधिः</string>\n    <string name=\"pref_title_show_media_preview\">सामग्रीणां पूर्वोद्घाटनमवारोप्यताम्</string>\n    <string name=\"pref_title_show_replies\">प्रत्युत्तराणि दृश्यन्ताम्</string>\n    <string name=\"pref_title_show_boosts\">प्रकाशनानि दृश्यन्ताम्</string>\n    <string name=\"pref_title_post_tabs\">पीठिकाः</string>\n    <string name=\"pref_title_post_filter\">समयतालिका-शोधनम्</string>\n    <string name=\"pref_title_gradient_for_media\">छादितसामग्रीभ्यो बहुवर्णयुतचित्रं दर्शयतु</string>\n    <string name=\"pref_title_animate_gif_avatars\">सञ्जीवितावतारः क्रियताम्</string>\n    <string name=\"pref_title_bot_overlay\">स्वचालितयन्त्रेभ्यः सूचको दृश्यताम्</string>\n    <string name=\"pref_title_language\">भाषा</string>\n    <string name=\"pref_title_custom_tabs\">क्रोमस्वीयानुकूलपीठिकाः प्रयुज्यन्ताम्</string>\n    <string name=\"pref_title_browser_settings\">जालसञ्चारकम्</string>\n    <string name=\"app_theme_system\">प्रणाल्याः परिकल्पना प्रयुज्यताम्</string>\n    <string name=\"app_theme_auto\">सूर्यास्तसमये स्वचालितम्</string>\n    <string name=\"app_theme_black\">कृष्णः</string>\n    <string name=\"app_theme_light\">ज्योतिपूर्णः</string>\n    <string name=\"app_them_dark\">अन्धकारः</string>\n    <string name=\"pref_title_timeline_filters\">शोधकम्</string>\n    <string name=\"pref_title_timelines\">समयतालिकाः</string>\n    <string name=\"pref_title_app_theme\">अनुप्रयोगप्रबन्धाः</string>\n    <string name=\"pref_title_appearance_settings\">स्वरूपम्</string>\n    <string name=\"download_fonts\">प्राक्तु भावचिह्नसमूहोऽयमवारोप्यः</string>\n    <string name=\"system_default\">प्रणाल्यां पूर्वनिविष्टम्</string>\n    <string name=\"emoji_style\">भावचिह्नशैली</string>\n    <string name=\"error_no_custom_emojis\">भवदीयं विशिष्टस्थलं %1$s स्वीयानुकूलभावचिह्नरहितं वर्तते</string>\n    <string name=\"action_compose_shortcut\">लिख्यताम्</string>\n    <string name=\"send_post_notification_saved_content\">दौत्यप्रतिलिपिस्तत्र विकर्षेसु रक्षिता</string>\n    <string name=\"send_post_notification_cancel_title\">प्रेषणं निराकृतम्</string>\n    <string name=\"send_post_notification_channel_name\">प्रेष्यमाणानि</string>\n    <string name=\"send_post_notification_error_title\">दौत्यप्रेषणे दोषः</string>\n    <string name=\"send_post_notification_title\">दौत्यं प्रेष्यमाणम्…</string>\n    <string name=\"compose_save_draft\">रक्षणीयम् ?</string>\n    <string name=\"lock_account_label_description\">स्वयमेवाऽनुसर्तॄणां कृतेऽनुमतिर्दातव्या</string>\n    <string name=\"lock_account_label\">लेखा अवरुध्यताम्</string>\n    <string name=\"action_remove\">नश्यताम्</string>\n    <string name=\"action_set_caption\">शीर्षकवाक्यं लिख्यताम्</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\"/>\n        <item quantity=\"other\">दृष्ट्यां येषां समस्याऽस्ति तेषांं कृते विवरणम्\n\\n(%1$d परिमिता न्यूनाक्षरसङ्ख्या)</item>\n    </plurals>\n    <string name=\"compose_active_account_description\">%1$s लेखया प्रकटनं क्रियते</string>\n    <string name=\"action_remove_from_list\">सूच्याः लेखा नश्यताम्</string>\n    <string name=\"action_add_to_list\">सूच्यां लेखा स्थाप्यताम्</string>\n    <string name=\"profile_badge_bot_text\">यन्त्रम्</string>\n    <string name=\"download_failed\">अवारोपणे दोषः</string>\n    <string name=\"caption_notoemoji\">गुगलस्य वर्तमानभावचिह्नसमूहः</string>\n    <string name=\"caption_twemoji\">मास्टोडोनस्य पूर्वनिविष्टभावचिह्नसमूहः</string>\n    <string name=\"caption_blobmoji\">ब्लाबभावचिह्नानि एन्ड्रोइड४.४तः ७.१पर्यन्तं प्रसिद्धानि</string>\n    <string name=\"caption_systememoji\">तव यन्त्रस्य पूर्वस्थापितभावचिह्नसमूहः</string>\n    <string name=\"restart\">पुनः प्रारभ्यताम्</string>\n    <string name=\"later\">पश्चात्</string>\n    <string name=\"restart_emoji\">पुनश्च टस्कीप्रारम्भोऽपेक्षितो वर्तते परिवर्तनानुसरेण चलितुम्</string>\n    <string name=\"restart_required\">अनुप्रयोगप्रारम्भः आवश्यकः</string>\n    <string name=\"action_open_post\">दौत्यमुद्घाट्यताम्</string>\n    <string name=\"expand_collapse_all_posts\">विस्तार्यन्तां नश्यन्तां वा स्थतयः</string>\n    <string name=\"performing_lookup_title\">अन्वेषणं भवद्वर्तते…</string>\n    <string name=\"pin_action\">कीलयतु</string>\n    <string name=\"unpin_action\">कीलनं नश्यताम्</string>\n    <string name=\"label_remote_account\">अधो लिखितवार्तोपभोक्तुः व्यक्तित्वविवरणमांशिकरूपेण प्रतिबिम्बयेत् । व्यक्तित्वविवरणमुद्घाट्यतां कश्मिंश्चिदपि जालसञ्चारके ।</string>\n    <string name=\"pref_title_absolute_time\">मूलसमयो युज्यताम्</string>\n    <string name=\"profile_metadata_content_label\">विषयः</string>\n    <string name=\"profile_metadata_label_label\">लक्षः</string>\n    <string name=\"profile_metadata_add\">दत्तं युज्यताम्</string>\n    <string name=\"profile_metadata_label\">व्यक्तिगतविवरणदत्तांशः</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA ४.०</string>\n    <string name=\"license_cc_by_4\">CC-BY ४.०</string>\n    <string name=\"license_apache_2\">Apache Licence (अनुलिख्यताम्) इत्यनुज्ञप्तिपत्रेणाऽनुज्ञापितः</string>\n    <string name=\"license_description\">टस्कीत्यस्मिन्निम्नलिखितेभ्योऽनावृतस्रोतःप्रकल्पेभ्यो विध्यादेशाः सन्ति:</string>\n    <string name=\"unreblog_private\">प्रकाशनंं नश्यताम्</string>\n    <string name=\"reblog_private\">मूलदर्शकेभ्यः प्रकाश्यताम्</string>\n    <string name=\"account_moved_description\">%1$s मित्रमत्र प्रस्थितम्:</string>\n    <string name=\"no_drafts\">न लेखविकर्षास्ते सन्ति ।</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"pref_title_hide_top_toolbar\">उच्चैःस्थितायाः साधनशालकायाः शीर्षकं छाद्यताम्</string>\n    <string name=\"pref_title_confirm_reblogs\">प्रकाशनात् प्राक् पुष्टिसंवादमञ्जूषा दर्शनीया</string>\n    <string name=\"pref_title_show_cards_in_timelines\">जालस्थानप्रदर्शनं समयतालिकायां दर्शयतु</string>\n    <string name=\"warning_scheduling_interval\">मास्टोडोने पञ्चनिमेषपरिमितो न्यूनतमः कालबद्धसमयः ।</string>\n    <string name=\"no_scheduled_posts\">न ते कालबद्धदौत्यानि सन्ति ।</string>\n    <string name=\"edit_poll\">सम्पाद्यताम्</string>\n    <string name=\"poll_new_choice_hint\">मतम् %1$d</string>\n    <string name=\"poll_allow_multiple_choices\">बहूनि मतानि</string>\n    <string name=\"add_poll_choice\">अपरं मतं युज्यताम्</string>\n    <string name=\"duration_7_days\">७ दिनानि</string>\n    <string name=\"duration_3_days\">३ दिनानि</string>\n    <string name=\"duration_1_day\">१ दिनम्</string>\n    <string name=\"duration_6_hours\">६ घण्टाः</string>\n    <string name=\"duration_1_hour\">१ घण्टा</string>\n    <string name=\"duration_30_min\">३० निमेषाः</string>\n    <string name=\"duration_5_min\">५ निमेषाः</string>\n    <string name=\"create_poll_title\">मतपेटिका</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">सारणहावभावस्य संयुतनं पीठिकापरिवर्तनार्थं कार्यम्</string>\n    <string name=\"failed_search\">अन्वेषणे विफलता जाता</string>\n    <string name=\"title_accounts\">व्यक्तित्वविवरणलेखाः</string>\n    <string name=\"report_description_remote_instance\">अन्यजालवितारकादियं व्यक्तित्वविवरणलेखा । आवेदनस्य रक्षितप्रतिलिपिरपि प्रेष्यतां वा ?</string>\n    <string name=\"report_description_1\">आवेदनमिदं जालवितारकाय प्रेष्यते । स्वीयविवरणमस्मिन् विषयेऽधो लेखितुं शक्नोषि-:</string>\n    <string name=\"failed_fetch_posts\">दौत्यानि गृहीतुं विफलता</string>\n    <string name=\"failed_report\">आवेदनप्रेषणे विफलता</string>\n    <string name=\"report_remote_instance\">अस्मै पुरस्क्रियताम् %1$s</string>\n    <string name=\"hint_additional_info\">अन्याः टिप्पण्यः</string>\n    <string name=\"report_sent_success\">साफल्येनाऽऽवेदनं दत्तमस्य @%1$s</string>\n    <string name=\"button_done\">कृतम्</string>\n    <string name=\"button_back\">पूर्वम्</string>\n    <string name=\"button_continue\">निरन्तरम्</string>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d क्षणम्</item>\n        <item quantity=\"other\">%1$d क्षणे</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d निमेषः शेषम्</item>\n        <item quantity=\"other\">%1$d निमेषौ शेषम्</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d घण्टा शेषम्</item>\n        <item quantity=\"other\">%1$d घण्टे शेषम्</item>\n    </plurals>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d दिनम् शेषम्</item>\n        <item quantity=\"other\">%1$d दिने शेषम्</item>\n    </plurals>\n    <string name=\"poll_ended_created\">त्वया रचितमेकं मतदानं समाप्तम्</string>\n    <string name=\"poll_ended_voted\">मतदानमेकं समाप्तं यस्मिन् त्वयाऽपि स्वीयमतं दत्तम्</string>\n    <string name=\"poll_vote\">मतम्</string>\n    <string name=\"poll_info_closed\">पिहितम्</string>\n    <string name=\"poll_info_time_absolute\">समापनं यावत् %1$s</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s जनः</item>\n        <item quantity=\"other\">%1$s जनौ</item>\n    </plurals>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s मतम्</item>\n        <item quantity=\"other\">%1$s मते</item>\n    </plurals>\n    <string name=\"poll_info_format\"> <!-- 15 मतानि • 1 शेषघटिकाः --> %1$s • %2$s</string>\n    <string name=\"compose_preview_image_description\">चित्राणां कृते प्रवृत्तिः %1$s</string>\n    <string name=\"notification_clear_text\">किं नूनमेव सर्वाः सूचनाः स्थायित्वेन मार्जनीयाः ?</string>\n    <string name=\"compose_shortcut_short_label\">लिख्यताम्</string>\n    <string name=\"compose_shortcut_long_label\">दौत्यं लिख्यताम्</string>\n    <string name=\"filter_apply\">स्थाप्यताम्</string>\n    <string name=\"notifications_apply_filter\">शुध्यताम्</string>\n    <string name=\"notifications_clear\">मार्ज्यन्ताम्</string>\n    <string name=\"list\">सूचिः</string>\n    <string name=\"select_list_title\">सूचिरवचीयताम्</string>\n    <string name=\"hashtags\">निश्रेणिचिह्नशीर्षकाः</string>\n    <string name=\"pick_hashtag_hint\"># चिह्नं विना प्रचलितम्</string>\n    <string name=\"add_hashtag_title\">प्रचलितं युज्यताम्</string>\n    <string name=\"hint_list_name\">सूचिनाम</string>\n    <string name=\"description_poll\">मतदाने मतानि- %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"description_visibility_direct\">प्रत्यक्षम्</string>\n    <string name=\"description_visibility_private\">अनुसर्तारः</string>\n    <string name=\"description_visibility_unlisted\">अनिर्दिष्टम्</string>\n    <string name=\"description_visibility_public\">सार्वजनिकम्</string>\n    <string name=\"description_post_bookmarked\">पुटचिह्नं कृतम्</string>\n    <string name=\"description_post_favourited\">प्रीतिर्दत्ता</string>\n    <string name=\"description_post_reblogged\">पुनर्लिखितम्</string>\n    <string name=\"description_post_media_no_description_placeholder\">विवरणं नास्ति</string>\n    <string name=\"description_post_cw\">विषयपूर्वसतर्कता: %1$s</string>\n    <string name=\"description_post_media\">सामग्र्यः %1$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s तथा %3$d अन्येऽपि</string>\n    <string name=\"conversation_2_recipients\">%1$s तथैव %2$s</string>\n    <string name=\"title_favourited_by\">निम्नमित्रस्य प्रीतिः</string>\n    <string name=\"title_reblogged_by\">निम्नमित्रेण प्रकाशितम्</string>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> प्रकाशनम्</item>\n        <item quantity=\"other\"><b>%1$s</b> प्रकाशने</item>\n    </plurals>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> प्रियम्</item>\n        <item quantity=\"other\"><b>%1$s</b> प्रिये</item>\n    </plurals>\n    <string name=\"total_usage\">समस्त-उपयोगः</string>\n    <string name=\"total_accounts\">सकललेखाः</string>\n    <string name=\"a11y_label_loading_thread\">दौत्यमाला दृश्यते</string>\n    <string name=\"instance_rule_title\">%1$s नियमाः</string>\n    <string name=\"pref_title_reading_order\">पाठनक्रमः</string>\n    <string name=\"pref_reading_order_oldest_first\">पुरातनं प्रथमम्</string>\n    <string name=\"pref_reading_order_newest_first\">नूतनं प्रथमम्</string>\n    <string name=\"duration_indefinite\">अपरिमितम्</string>\n    <string name=\"action_set_focus\">केन्द्रबिन्दुं स्थाप्यताम्</string>\n    <string name=\"mute_notifications_switch\">सूचनाः निशब्दाः करोतु</string>\n    <string name=\"failed_to_pin\">कीलनं विफलं जातम्</string>\n    <string name=\"failed_to_unpin\">कीलनस्य अपाकरणं विफलं जातम्</string>\n    <string name=\"pref_summary_http_proxy_disabled\">अशक्तं कृतम्</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;अप्रमाणम्&gt;</string>\n    <string name=\"action_edit_image\">चित्रं सम्पाद्यताम्</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;अनियुक्तम्&gt;</string>\n    <string name=\"duration_180_days\">१८० दिनानि</string>\n    <string name=\"duration_365_days\">३६५ दिनानि</string>\n    <string name=\"duration_no_change\">(परिवर्तनं नास्ति)</string>\n    <string name=\"review_notifications\">सूचनाः सम्दृश्यन्ताम्</string>\n    <string name=\"pref_show_self_username_never\">न कदापि</string>\n    <string name=\"pref_default_post_language\">पूर्वनिविष्टा प्रकाशका भाषा</string>\n    <string name=\"notification_report_name\">आवेदनानि</string>\n    <string name=\"notification_update_name\">सम्पादनानि निवेद्यन्ताम्</string>\n    <string name=\"pref_title_show_self_username\">साधनशलाकासु उपभोक्तृनाम दृश्यताम्</string>\n    <string name=\"title_edits\">सम्पादनानि</string>\n    <string name=\"notification_sign_up_description\">नूतनोपभोक्तॄन् प्रति सूचनाः</string>\n    <string name=\"post_media_audio\">ध्वनिः</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"duration_30_days\">३० दिनानि</string>\n    <string name=\"report_category_other\">अन्यम्</string>\n    <string name=\"title_login\">सम्प्रवेशः</string>\n    <string name=\"dialog_delete_conversation_warning\">इदं सम्भाषणं निष्कास्यताम् ?</string>\n    <string name=\"pref_show_self_username_always\">सर्वदा</string>\n    <string name=\"notification_subscription_name\">नूतन-प्रकटनानि</string>\n    <string name=\"notification_sign_up_name\">पञ्जीकरणानि</string>\n    <string name=\"no_announcements\">उद्घोषणाः न सन्ति।</string>\n    <string name=\"status_created_at_now\">अधुना</string>\n    <string name=\"duration_60_days\">६० दिनानि</string>\n    <string name=\"action_unsubscribe_account\">ग्राहकता-समापनम्</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"action_post_failed\">उपारोपनं विफलं जातम्</string>\n    <string name=\"action_post_failed_do_nothing\">उत्सृज्यताम्</string>\n    <string name=\"action_post_failed_show_drafts\">लेखविकर्षान् दर्शयतु</string>\n    <string name=\"description_post_edited\">सम्पादनं कृतम्</string>\n    <string name=\"status_created_info\">%1$s निर्मितम्</string>\n    <string name=\"status_edit_info\">%1$s सम्पादितम्</string>\n    <string name=\"action_subscribe_account\">ग्राहकता</string>\n    <string name=\"draft_deleted\">प्रारूपं निष्कासितम्</string>\n    <string name=\"report_category_violation\">नियम-उल्लङ्घनम्</string>\n    <string name=\"error_muting_hashtag_format\">#%1$s-निश्रेणिचिह्नशीर्षकस्य निशब्दीकरणे दोषः</string>\n    <string name=\"error_unmuting_hashtag_format\">#%1$s-निश्रेणिचिह्नशीर्षकस्य सशब्दीकरणे दोषः</string>\n    <string name=\"action_browser_login\">जालसञ्चारकेन सम्प्रविश्यताम्</string>\n    <string name=\"action_add_reaction\">प्रतिक्रियां योजयतु</string>\n    <string name=\"notification_header_report_format\">%1$s-व्यक्तिः %2$s-व्यक्तिं प्रति आवेदनमकरोत्</string>\n    <string name=\"action_discard\">परिवर्तनानि निष्कासयतु</string>\n    <string name=\"action_continue_edit\">सम्पादनम् अनुवर्तताम्</string>\n    <string name=\"post_edited\">%1$s सम्पादितम्</string>\n    <string name=\"notification_subscription_format\">%1$s सद्यः प्रसारितम्</string>\n    <string name=\"notification_sign_up_format\">%1$s पञ्जीकरणम् अकरोत्</string>\n    <string name=\"action_delete_conversation\">सम्भाषणं निष्कास्यताम्</string>\n    <string name=\"duration_90_days\">९० दिनानि</string>\n    <string name=\"action_unbookmark\">पुटचिह्नं निस्कास्यताम्</string>\n    <string name=\"notification_update_format\">%1$s स्वस्य दौत्यं समपादयत्</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">दौत्यं संस्कुरुताम्</string>\n    <string name=\"saving_draft\">लेखविकर्षं रक्षामि…</string>\n    <string name=\"account_date_joined\">%1$s सदस्यः अभवत्</string>\n    <string name=\"account_username_copied\">उपभोक्तृनाम्नः प्रतिकृतिः कृतः</string>\n    <string name=\"label_duration\">समयः</string>\n    <string name=\"report_category_spam\">अनिष्टसन्देशाः</string>\n    <string name=\"duration_14_days\">१४ दिनानि</string>\n    <string name=\"description_post_language\">दौत्यस्य भाषा</string>\n    <string name=\"error_following_hashtag_format\">#%1$s-अनुसरणे दोषो जातः</string>\n    <string name=\"error_unfollowing_hashtag_format\">#%1$s-अनुसरण-अपाकरणे दोषो जातः</string>\n    <string name=\"action_details\">विवरणानि</string>\n    <string name=\"action_dismiss\">उत्सृज्यताम्</string>\n    <string name=\"post_media_attachments\">सम्योजितानि</string>\n    <string name=\"status_count_one_plus\">१+</string>\n    <string name=\"account_note_saved\">रक्षितम् !</string>\n    <string name=\"title_announcements\">उद्घोषणाः</string>\n    <string name=\"error_image_edit_failed\">चित्रं सम्पादयितुं न शक्यते।</string>\n    <string name=\"error_loading_account_details\">व्यक्तित्वलेखस्य विवरणानि दर्शनं विफलं जातम्</string>\n    <string name=\"error_could_not_load_login_page\">सम्प्रवेशपुटं दर्शयितुं न शक्यते।</string>\n    <string name=\"dialog_follow_hashtag_title\">व्यक्तित्वविवरणलेखा अनुसरतु</string>\n    <string name=\"limit_notifications\">कालानुक्रमपङ्क्त्याः सूचनाः परिमिताः कुरुताम्</string>\n    <string name=\"notification_report_description\">परिमितावेदनानि प्रति ज्ञापनसूचनाः</string>\n    <string name=\"compose_unsaved_changes\">भवतः अरक्षितानि परिवर्तनानि सन्ति।</string>\n    <string name=\"pref_title_wellbeing_mode\">सुस्थितिः</string>\n    <string name=\"delete_scheduled_post_warning\">इदं कालबद्धदौत्यं विनश्येत् किम् ?</string>\n    <string name=\"drafts_failed_loading_reply\">प्रत्युत्तरसमाचारस्य आरोपनं विफलं जातम्</string>\n    <string name=\"post_media_alt\">आल्ट्</string>\n    <string name=\"pref_title_animate_custom_emojis\">स्वीयानुकूलानि भावचिह्नानि सञ्जीव्यताम्</string>\n    <string name=\"notification_report_format\">%1$s-विषये नूतनम् आवेदनम्</string>\n    <string name=\"action_share_account_username\">लेखायाः उपभोक्तृनाम्नः संविभागं कुरुताम्</string>\n    <string name=\"action_share_account_link\">लेखायै शृङ्खलायाः संविभागं कुरुताम्</string>\n    <string name=\"action_unfollow_hashtag_format\">#%1$s-चिह्नस्य अनुसरणम् अपाकरणीयं किम् ?</string>\n    <string name=\"title_followed_hashtags\">अनुसृताः निश्रेणिचिह्नशीर्षकाः</string>\n    <string name=\"title_public_trending_hashtags\">जनप्रियाः निश्रेणिचिह्नशीर्षकाः</string>\n    <string name=\"send_account_username_to\">लेखायाः उपभोक्तृनाम्नः संविभागं कुरुताम् अस्मै…</string>\n    <string name=\"confirmation_hashtag_unfollowed\">#%1$s अनुसरणम् अपाकृतम्</string>\n    <string name=\"send_account_link_to\">लेखायाः निरपेक्ष-सार्वत्रिक-वस्तुसङ्केतस्य संविभागं कुरुताम् अस्मै…</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-si/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"conversation_2_recipients\">%1$s සහ %2$s</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"notifications_apply_filter\">පෙරහන</string>\n    <string name=\"filter_apply\">යොදන්න</string>\n    <string name=\"button_back\">ආපසු</string>\n    <string name=\"title_accounts\">ගිණුම්</string>\n    <string name=\"duration_5_min\">විනාඩි 5</string>\n    <string name=\"duration_30_min\">විනාඩි 30</string>\n    <string name=\"duration_6_hours\">පැය 6</string>\n    <string name=\"duration_1_hour\">පැය 1</string>\n    <string name=\"duration_3_days\">දවස් 3</string>\n    <string name=\"duration_1_day\">දවස් 1</string>\n    <string name=\"duration_7_days\">දවස් 7</string>\n    <string name=\"edit_poll\">සංස්කරණය</string>\n    <string name=\"title_posts_with_replies\">පිළිතුරු සමඟ</string>\n    <string name=\"title_blocks\">අවහිර කළ පරිශීලකයින්</string>\n    <string name=\"title_drafts\">කටුපිටපත්</string>\n    <string name=\"footer_empty\">කිසිවක් නැත. නැවුම් කිරීමට පහළට අදින්න!</string>\n    <string name=\"action_quick_reply\">ඉක්මන් පිළිතුර</string>\n    <string name=\"action_unbookmark\">පොත්යොමුව ඉවත් කරන්න</string>\n    <string name=\"action_send\">ටූට්</string>\n    <string name=\"action_view_blocks\">අවහිර කළ පරිශීලකයින්</string>\n    <string name=\"action_open_in_web\">අතිරික්සුවෙන් විවෘත කරන්න</string>\n    <string name=\"action_report\">වාර්තා කරන්න</string>\n    <string name=\"search_no_results\">ප්‍රතිඵල නැත</string>\n    <string name=\"login_connection\">සම්බන්ධ වෙමින්…</string>\n    <string name=\"pref_title_notifications_enabled\">දැනුම්දීම්</string>\n    <string name=\"post_privacy_public\">ප්‍රසිද්ධ</string>\n    <string name=\"post_media_attachments\">ඇමුණුම්</string>\n    <string name=\"notification_mention_name\">නව සැඳහුම්</string>\n    <string name=\"action_compose_shortcut\">රචනා කරන්න</string>\n    <string name=\"post_content_warning_show_more\">තව පෙන්වන්න</string>\n    <string name=\"send_post_notification_saved_content\">ටූට් හි පිටපතක් ඔබගේ කටුපිටපත් තුළට සුරකින ලදි</string>\n    <string name=\"action_hide_media\">මාධ්‍ය සඟවන්න</string>\n    <string name=\"title_edit_profile\">පැතිකඩ සංස්කරණය</string>\n    <string name=\"confirmation_reported\">යැවිණි!</string>\n    <string name=\"action_reset_schedule\">යළි සකසන්න</string>\n    <string name=\"post_content_warning_show_less\">අඩුවෙන් පෙන්වන්න</string>\n    <string name=\"abbreviated_in_seconds\">තත්. %1$d කින්</string>\n    <string name=\"action_view_mutes\">නිහඬ කළ පරිශීලකයින්</string>\n    <string name=\"action_share\">බෙදාගන්න</string>\n    <string name=\"account_moved_description\">%1$s ගෙන ගොස් ඇත:</string>\n    <string name=\"post_share_link\">ටූට් වෙත සබැඳියක් බෙදාගන්න</string>\n    <string name=\"title_licenses\">බලපත්‍ර</string>\n    <string name=\"action_edit_profile\">පැතිකඩ සංස්කරණය</string>\n    <string name=\"hint_display_name\">දර්ශන නාමය</string>\n    <string name=\"post_text_size_medium\">මධ්‍යම</string>\n    <string name=\"post_media_audio\">ශ්‍රව්‍ය</string>\n    <string name=\"abbreviated_days_ago\">දව. %1$d</string>\n    <string name=\"action_logout\">නික්මෙන්න</string>\n    <string name=\"filter_edit_title\">පෙරහන සංස්කරණය</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, සහ %3$s</string>\n    <string name=\"caption_twemoji\">මාස්ටඩන් හි සම්මත ඉමෝජි කට්ටලය</string>\n    <string name=\"poll_info_format\"> <!-- 15 votes • 1 hour left --> %1$s • %2$s</string>\n    <string name=\"action_retry\">යළි උත්සාහය</string>\n    <string name=\"lock_account_label\">ගිණුම අගුළුලන්න</string>\n    <string name=\"post_media_hidden_title\">මාධ්‍ය සැඟවී ඇත</string>\n    <string name=\"title_public_federated\">ඒකාබද්ධ</string>\n    <string name=\"dialog_message_uploading_media\">උඩුගත වෙමින්…</string>\n    <string name=\"add_account_name\">ගිණුම එකතු කරන්න</string>\n    <string name=\"label_header\">ශීර්ෂය</string>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">පැය %1$d ක් ඉතිරිය</item>\n        <item quantity=\"other\">පැය %1$d ක් ඉතිරිය</item>\n    </plurals>\n    <string name=\"action_unfavourite\">ප්‍රියතමය ඉවත් කරන්න</string>\n    <string name=\"drafts_failed_loading_reply\">පිළිතුරෙහි තොරතුරු පූරණය වීමට අසමත් විය</string>\n    <string name=\"report_username_format\">\\@%1$s වාර්තා කරන්න</string>\n    <string name=\"report_comment_hint\">අතිරේක අදහස්?</string>\n    <string name=\"send_post_link_to\">වෙත ටූට් ඒ.ස.නි. බෙදාගන්න…</string>\n    <string name=\"app_theme_light\">දීප්ත</string>\n    <string name=\"compose_save_draft\">කටුපිටපත සුරකින්නද?</string>\n    <string name=\"post_sensitive_media_title\">සංවේදී අන්තර්ගතයකි</string>\n    <string name=\"profile_badge_bot_text\">ස්වයංක්‍රමලේඛය</string>\n    <string name=\"action_bookmark\">පොත්යොමුව</string>\n    <string name=\"caption_notoemoji\">ගූගල් හි වත්මන් ඉමෝජි කට්ටලය</string>\n    <string name=\"app_theme_auto\">ස්වයංක්‍රීව ඉර බැසීමේදී</string>\n    <string name=\"failed_report\">වාර්තා කිරීමට අසමත් විය</string>\n    <string name=\"abbreviated_years_ago\">අවු. %1$d</string>\n    <string name=\"action_open_as\">%1$s ලෙස විවෘත කරන්න</string>\n    <string name=\"action_open_faved_by\">ප්‍රියතමයන් පෙන්වන්න</string>\n    <string name=\"abbreviated_in_minutes\">වි. %1$d කින්</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">ජන්ද %1$s</item>\n        <item quantity=\"other\">ජන්ද %1$s</item>\n    </plurals>\n    <string name=\"action_more\">තව</string>\n    <string name=\"action_view_bookmarks\">පොත්යොමු</string>\n    <string name=\"notification_mention_format\">%1$s ඔබව සඳහන් කළා</string>\n    <string name=\"compose_active_account_description\">%1$s ගිණුම සමඟ පළකරන්න</string>\n    <string name=\"hint_additional_info\">අතිරේක අදහස්</string>\n    <string name=\"notification_favourite_name\">ප්‍රියතමයන්</string>\n    <string name=\"download_fonts\">ඔබ මේ ඉමෝජි කට්ටල පළමුව බාගත යුතුයි</string>\n    <string name=\"description_visibility_direct\">සෘජු</string>\n    <string name=\"hint_search\">සොයන්න…</string>\n    <string name=\"pref_title_app_theme\">යෙදුමේ තේමාව</string>\n    <string name=\"title_bookmarks\">පොත්යොමු</string>\n    <string name=\"dialog_mute_warning\">\\@%1$s නිහඬ?</string>\n    <string name=\"compose_shortcut_short_label\">රචනා කරන්න</string>\n    <string name=\"poll_ended_voted\">ඔබ ජන්දය දුන් මත විමසුව නිම වී ඇත</string>\n    <string name=\"about_title_activity\">පිළිබඳව</string>\n    <string name=\"mute_domain_warning_dialog_ok\">සමස්ථ වසම සඟවන්න</string>\n    <string name=\"profile_metadata_label\">පැතිකඩ පාරදත්ත</string>\n    <string name=\"action_copy_link\">සබැඳිය පිටපත්</string>\n    <string name=\"title_direct_messages\">සෘජු පණිවිඩ</string>\n    <string name=\"downloading_media\">මාධ්‍ය බාගත වෙමින්</string>\n    <string name=\"pref_title_show_media_preview\">මාධ්‍ය පෙරදසුන් බාගන්න</string>\n    <string name=\"load_more_placeholder_text\">තව පූරණය</string>\n    <string name=\"dialog_download_image\">බාගන්න</string>\n    <string name=\"title_mentions_dialog\">සඳැහුම්</string>\n    <string name=\"action_reply\">පිළිතුර</string>\n    <string name=\"pref_title_edit_notification_settings\">දැනුම්දීම්</string>\n    <string name=\"confirmation_unblocked\">පරිශීලක අනවහිර කෙරිණි</string>\n    <string name=\"profile_metadata_add\">දත්ත එක්කරන්න</string>\n    <string name=\"send_post_content_to\">වෙත ටූට් බෙදාගන්න…</string>\n    <string name=\"send_post_notification_cancel_title\">යැවීම අවලංගු කෙරිණි</string>\n    <string name=\"action_unblock\">අනවහිර</string>\n    <string name=\"action_send_public\">ටූට්!</string>\n    <string name=\"title_favourites\">ප්‍රියතමයන්</string>\n    <string name=\"download_image\">%1$s බාගත වෙමින්</string>\n    <string name=\"failed_fetch_posts\">තත්ව ගෙන ඒමට අසමත් විය</string>\n    <string name=\"description_post_media\">මාධ්‍ය: %1$s</string>\n    <string name=\"action_mute_conversation\">සංවාදය නිහඬ කරන්න</string>\n    <string name=\"send_post_notification_channel_name\">ටූට්ස් යැවෙමින්</string>\n    <string name=\"pref_title_thread_filter_keywords\">සංවාද</string>\n    <string name=\"post_text_size_large\">විශාල</string>\n    <string name=\"description_visibility_public\">ප්‍රසිද්ධ</string>\n    <string name=\"add_account_description\">නව මාස්ටඩන් ගිණුමක් එක්කරන්න</string>\n    <string name=\"dialog_title_finishing_media_upload\">මාධ්‍ය උඩුගත වීම අහවර වෙමින්</string>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">තත්. %1$d ක් ඉතිරිය</item>\n        <item quantity=\"other\">තත්. %1$d ක් ඉතිරිය</item>\n    </plurals>\n    <string name=\"action_logout_confirm\">ඔබට %1$s ගිණුමෙන් නික්මෙන්ට ඇවැසි බව විශ්වාසද?</string>\n    <string name=\"title_public_local\">ස්ථානීය</string>\n    <string name=\"action_view_favourites\">ප්‍රියතමයන්</string>\n    <string name=\"label_quick_reply\">පිළිතුරු…</string>\n    <string name=\"limit_notifications\">කාලරේඛා දැනුම්දීම් සීමාකරන්න</string>\n    <string name=\"send_post_notification_error_title\">ටූට් යැවීමේ දෝෂයකි</string>\n    <string name=\"filter_addition_title\">පෙරහන එකතු කරන්න</string>\n    <string name=\"pref_default_media_sensitivity\">සැමවිටම මාධ්‍ය සංවේදී ලෙස සලකුණු කරන්න</string>\n    <string name=\"restart_required\">යෙදුම යළි ඇරඹීම ඇවැසිය</string>\n    <string name=\"restart\">යළි අරඹන්න</string>\n    <string name=\"app_theme_black\">කළු</string>\n    <string name=\"abbreviated_in_years\">වර්. %1$d කින්</string>\n    <string name=\"restart_emoji\">මෙම වෙනස්කම් යෙදීමට ඔබ ටුස්කි නැවත ඇරඹිය යුතුය</string>\n    <string name=\"action_edit\">සංස්කරණය</string>\n    <string name=\"button_continue\">ඉදිරියට</string>\n    <string name=\"pref_title_post_filter\">කාලරේඛාව පෙරීම</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s සහ තවත් %3$d</string>\n    <string name=\"pref_title_timelines\">කාලරේඛා</string>\n    <string name=\"action_mute_domain\">%1$s නිහඬ කරන්න</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"replying_to\">\\@%1$s වෙත පිළිතුරු දෙමින්</string>\n    <string name=\"action_block\">අවහිර</string>\n    <string name=\"download_media\">මාධ්‍ය බාගන්න</string>\n    <string name=\"action_view_domain_mutes\">සැඟවුනු වසම්</string>\n    <string name=\"post_text_size_small\">කුඩා</string>\n    <string name=\"pref_title_alway_open_spoiler\">අන්තර්ගත අවවාද සමඟ ඇති ටූට්ස් සැමවිටම විහිදන්න</string>\n    <string name=\"action_undo\">පෙරසේ</string>\n    <string name=\"post_content_show_more\">විහිදන්න</string>\n    <string name=\"action_mute\">නිහඬ කරන්න</string>\n    <string name=\"about_tusky_version\">ටුස්කි %1$s</string>\n    <string name=\"about_project_site\">වියමන අඩවිය:\n\\n https://tusky.app</string>\n    <string name=\"action_accept\">පිළිගන්න</string>\n    <string name=\"abbreviated_in_hours\">පැ. %1$d කින්</string>\n    <string name=\"create_poll_title\">මතවිමසුම</string>\n    <string name=\"action_remove\">ඉවත් කරන්න</string>\n    <string name=\"action_add_media\">මාධ්‍ය එකතු කරන්න</string>\n    <string name=\"abbreviated_in_days\">ද. %1$d කින්</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s සහ වෙනත් %4$d</string>\n    <string name=\"action_open_post\">ටූට් විවෘත කරන්න</string>\n    <string name=\"title_domain_mutes\">සැඟවුනු වසම්</string>\n    <string name=\"abbreviated_hours_ago\">පැය %1$d</string>\n    <string name=\"pref_failed_to_sync\">සැකසුම් සමමුහූර්ත වීමට අසමත් විය</string>\n    <string name=\"pref_title_show_replies\">පිළිතුරු පෙන්වන්න</string>\n    <string name=\"action_view_profile\">පැතිකඩ</string>\n    <string name=\"caption_systememoji\">ඔබගේ උපාංගයේ පෙරනිමි ඉමෝජි කට්ටලය</string>\n    <string name=\"notification_mention_descriptions\">නව සැඳහුම් පිළිබඳව දැනුම්දීම්</string>\n    <string name=\"action_search\">සොයන්න</string>\n    <string name=\"action_share_as\">ලෙස බෙදාගන්න …</string>\n    <string name=\"title_home\">මුල</string>\n    <string name=\"abbreviated_minutes_ago\">වි. %1$d</string>\n    <string name=\"failed_search\">සෙවීමට අසමත් විය</string>\n    <string name=\"no_announcements\">නිවේදන නැත.</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"action_save\">සුරකින්න</string>\n    <string name=\"title_mutes\">නිහඬ කළ පරිශීලකයින්</string>\n    <string name=\"no_drafts\">ඔබ සතුව කටුපිටපත් නැත.</string>\n    <string name=\"title_view_thread\">ටූට්</string>\n    <string name=\"pref_title_timeline_filters\">පෙරහන්</string>\n    <string name=\"report_sent_success\">\\@%1$s වෙත සාර්ථකව වාර්තා කෙරිණි</string>\n    <string name=\"download_failed\">බාගැනීමට අසමත් විය</string>\n    <string name=\"pref_title_language\">භාෂාව</string>\n    <string name=\"account_note_saved\">සුරැකිණි!</string>\n    <string name=\"about_tusky_account\">ටුස්කි\\'හි පැතිකඩ</string>\n    <string name=\"post_share_content\">ටූට්හි අන්තර්ගතය බෙදාගන්න</string>\n    <string name=\"profile_metadata_content_label\">අන්තර්ගතය</string>\n    <string name=\"notification_subscription_name\">නව ටූට්ස්</string>\n    <string name=\"action_open_media_n\">#%1$d මාධ්‍ය විවෘත කරන්න</string>\n    <string name=\"action_view_media\">මාධ්‍ය</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">පුද්ගලයින් %1$s</item>\n        <item quantity=\"other\">මිනිසුන් %1$s</item>\n    </plurals>\n    <string name=\"send_media_to\">වෙත මාධ්‍ය බෙදාගන්න…</string>\n    <string name=\"pref_title_public_filter_keywords\">ප්‍රසිද්ධ කාලරේඛා</string>\n    <string name=\"post_text_size_smallest\">කුඩාම</string>\n    <string name=\"notification_poll_name\">මත විමසුම්</string>\n    <string name=\"post_sensitive_media_directions\">දැකීමට ඔබන්න</string>\n    <string name=\"poll_info_closed\">වසා ඇත</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">දවස් %1$d ක් ඉතිරිය</item>\n        <item quantity=\"other\">දවස් %1$d ක් ඉතිරිය</item>\n    </plurals>\n    <string name=\"pref_title_notification_alert_sound\">ශබ්දය සමඟ දන්වන්න</string>\n    <string name=\"about_powered_by_tusky\">ටුස්කි මගින් බලගන්වා ඇත</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">සැමවිටම සංවේදී අන්තර්ගත පෙන්වන්න</string>\n    <string name=\"title_announcements\">නිවේදන</string>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">විනාඩි %1$d ක් ඉතිරිය</item>\n        <item quantity=\"other\">විනාඩි %1$d ක් ඉතිරිය</item>\n    </plurals>\n    <string name=\"action_access_drafts\">කටුපිටපත්</string>\n    <string name=\"poll_ended_created\">ඔබ සෑදූ මත විමසුම නිම වී ඇත</string>\n    <string name=\"pref_title_bot_overlay\">ස්වයංක්‍රමලේඛ සඳහා දර්ශකය පෙන්වන්න</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\">ප්‍රියතමයන් <b>%1$s</b></item>\n        <item quantity=\"other\">ප්‍රියතමයන් <b>%1$s</b></item>\n    </plurals>\n    <string name=\"action_favourite\">ප්‍රියතම</string>\n    <string name=\"action_mentions\">සඳැහුම්</string>\n    <string name=\"filter_dialog_update_button\">යාවත්කාල</string>\n    <string name=\"notification_summary_small\">%1$s සහ %2$s</string>\n    <string name=\"about_tusky_license\">ටුස්කි යනු නොමිලේ සහ විවෘත-මූලාශ්‍ර මෘදුකාංගයකි. එය ජීඑන්යූ පොදු බලපත්‍ර අනුවාදය 3 යටතේ අවසර ලබා ඇත. ඔබට මෙතැනින් බලපත්‍රය දැකීමට හැකිය: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <string name=\"title_links_dialog\">සබැඳි</string>\n    <string name=\"title_media\">මාධ්‍ය</string>\n    <string name=\"dialog_block_warning\">\\@%1$s අවහිර?</string>\n    <string name=\"pref_title_notification_alert_light\">ආලෝකය සමඟ දන්වන්න</string>\n    <string name=\"account_note_hint\">මෙම ගිණුම පිළිබඳව ඔබගේ පෞද්ගලික සටහන</string>\n    <string name=\"action_close\">වසන්න</string>\n    <string name=\"title_notifications\">දැනුම්දීම්</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"action_login\">මාස්ටඩන් සමඟ පිවිසෙන්න</string>\n    <string name=\"poll_vote\">ජන්දය</string>\n    <string name=\"filter_dialog_whole_word\">මුළු වචනය</string>\n    <string name=\"drafts_post_failed_to_send\">මෙම ටූට් යැවීමට අසමත් විය!</string>\n    <string name=\"post_media_video\">දෘශ්‍යකය</string>\n    <string name=\"later\">පසුව</string>\n    <string name=\"action_edit_own_profile\">සංස්කරණය</string>\n    <string name=\"app_them_dark\">අඳුරු</string>\n    <string name=\"message_empty\">කිසිවක් නැත.</string>\n    <string name=\"send_post_notification_title\">ටූට් යැවෙමින්…</string>\n    <string name=\"system_default\">පද්ධති පෙරනිමිය</string>\n    <string name=\"action_mention\">සඳැහුම</string>\n    <string name=\"filter_dialog_remove_button\">ඉවත් කරන්න</string>\n    <string name=\"dialog_mute_hide_notifications\">දැනුම්දීම් සඟවන්න</string>\n    <string name=\"pref_post_text_size\">තත්ව පාඨයේ ප්‍රමාණය</string>\n    <string name=\"pref_title_show_cards_in_timelines\">කාලරේඛාවෙහි සබැඳි පෙරදසුන් පෙන්වන්න</string>\n    <string name=\"action_links\">සබැඳි</string>\n    <string name=\"pref_title_browser_settings\">අතිරික්සුව</string>\n    <string name=\"abbreviated_seconds_ago\">තත්. %1$d</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-sk/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"action_login\">Prihlásiť sa s Tusky</string>\n    <string name=\"title_drafts\">Koncepty</string>\n    <string name=\"action_logout\">Odhlásiť sa</string>\n    <string name=\"action_view_preferences\">Nastavenia</string>\n    <string name=\"action_view_account_preferences\">Nastavenia účtu</string>\n    <string name=\"action_edit_profile\">Upraviť profil</string>\n    <string name=\"action_search\">Hľadať</string>\n    <string name=\"action_lists\">Zoznamy</string>\n    <string name=\"title_lists\">Zoznamy</string>\n    <string name=\"error_generic\">Vyskytla sa chyba.</string>\n    <string name=\"title_notifications\">Oznámenia</string>\n    <string name=\"title_direct_messages\">Priame správy</string>\n    <string name=\"title_posts_with_replies\">S odpoveďmi</string>\n    <string name=\"title_posts_pinned\">Pripnuté</string>\n    <string name=\"title_followers\">Sledovatelia</string>\n    <string name=\"title_bookmarks\">Záložky</string>\n    <string name=\"title_licenses\">Licencie</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_sensitive_media_title\">Citlivý obsah</string>\n    <string name=\"post_sensitive_media_directions\">Kliknite pre zobrazenie</string>\n    <string name=\"post_content_warning_show_more\">Zobraziť viac</string>\n    <string name=\"post_content_warning_show_less\">Zobraziť menej</string>\n    <string name=\"post_content_show_more\">Rozbaliť</string>\n    <string name=\"post_content_show_less\">Zabaliť</string>\n    <string name=\"report_username_format\">Nahlásiť užívateľa @%1$s</string>\n    <string name=\"action_quick_reply\">Rýchla odpoveď</string>\n    <string name=\"action_reply\">Odpovedať</string>\n    <string name=\"link_whats_an_instance\">Čo je server?</string>\n    <string name=\"title_favourites\">Obľúbené</string>\n    <string name=\"about_title_activity\">O aplikácii</string>\n    <string name=\"error_network\">Vyskytla sa chyba v sieti. Prosím skontrolujte svoje pripojenie a skúste to znova.</string>\n    <string name=\"error_empty\">Toto nemôže byť prázdne.</string>\n    <string name=\"error_authorization_denied\">Autorizácia bola zamietnutá. Ak ste si istí že ste zadali správne prihlasovacie údaje, skúste sa prihlásiť z menu cez prehliadač.</string>\n    <string name=\"error_retrieving_oauth_token\">Nepodarilo sa získať prihlasovací token. Ak problém pretrváva, skúste sa prihlásiť z menu cez prehliadač.</string>\n    <string name=\"error_media_upload_opening\">Súbor sa nepodarilo otvoriť.</string>\n    <string name=\"title_home\">Domov</string>\n    <string name=\"title_tab_preferences\">Karty</string>\n    <string name=\"action_bookmark\">Vytvoriť záložku</string>\n    <string name=\"action_follow\">Sledovať</string>\n    <string name=\"action_unfollow\">Prestať sledovať</string>\n    <string name=\"action_block\">Blokovať</string>\n    <string name=\"action_unblock\">Odblokovať</string>\n    <string name=\"action_report\">Nahlásiť</string>\n    <string name=\"action_edit\">Upraviť</string>\n    <string name=\"action_delete\">Vymazať</string>\n    <string name=\"action_delete_and_redraft\">Vymazať a prepísať</string>\n    <string name=\"action_reset_schedule\">Obnoviť</string>\n    <string name=\"action_links\">Odkazy</string>\n    <string name=\"action_mentions\">Zmienky</string>\n    <string name=\"action_hashtags\">Hashtagy</string>\n    <string name=\"action_open_faved_by\">Zobraziť obľúbené</string>\n    <string name=\"title_hashtags_dialog\">Hashtagy</string>\n    <string name=\"title_mentions_dialog\">Zmienky</string>\n    <string name=\"title_links_dialog\">Odkazy</string>\n    <string name=\"action_open_media_n\">Otvoriť médium #%1$d</string>\n    <string name=\"download_image\">Sťahovanie %1$s</string>\n    <string name=\"action_copy_link\">Kopírovať odkaz</string>\n    <string name=\"action_open_as\">Otvoriť ako %1$s</string>\n    <string name=\"confirmation_reported\">Odoslané!</string>\n    <string name=\"confirmation_unblocked\">Užívateľ bol odblokovaný</string>\n    <string name=\"hint_domain\">Ktorý server?</string>\n    <string name=\"hint_display_name\">Zobrazované meno</string>\n    <string name=\"hint_note\">O vás</string>\n    <string name=\"hint_search\">Hľadať…</string>\n    <string name=\"search_no_results\">Žiadne výsledky</string>\n    <string name=\"label_quick_reply\">Odpovedať…</string>\n    <string name=\"dialog_message_uploading_media\">Nahrávanie…</string>\n    <string name=\"dialog_download_image\">Stiahnuť</string>\n    <string name=\"error_invalid_domain\">Neplatná doména</string>\n    <string name=\"error_failed_app_registration\">Autentifikácia s touto inštanciou nebola úspešná. Ak problém pretrváva, skúste sa prihlásiť z menu cez prehliadač.</string>\n    <string name=\"error_no_web_browser_found\">Nepodarilo sa nájsť použiteľný webový prehliadač.</string>\n    <string name=\"error_authorization_unknown\">Vyskytla sa neidentifikovaná chyba autorizácie. Ak problém pretrváva, skúste sa prihlásiť z menu cez prehliadač.</string>\n    <string name=\"error_compose_character_limit\">Príspevok je príliš dlhý!</string>\n    <string name=\"error_media_upload_type\">Tento typ súboru nemôže byť nahraný.</string>\n    <string name=\"error_sender_account_gone\">Chyba pri odosielaní príspevku.</string>\n    <string name=\"title_view_thread\">Vlákno</string>\n    <string name=\"notification_favourite_format\">%1$s si obľúbil/a váš toot</string>\n    <string name=\"action_send\">TOOT</string>\n    <string name=\"action_send_public\">TOOT!</string>\n    <string name=\"action_toggle_visibility\">Viditeľnosť príspevku</string>\n    <string name=\"action_schedule_post\">Naplánovať toot</string>\n    <string name=\"dialog_delete_post_warning\">Vymazať tento toot?</string>\n    <string name=\"dialog_redraft_post_warning\">Vymazať a prepísať tento toot?</string>\n    <string name=\"post_share_content\">Zdieľať obsah tootu</string>\n    <string name=\"post_share_link\">Zdieľať odkaz tootu</string>\n    <string name=\"send_post_notification_title\">Odosielanie tootu…</string>\n    <string name=\"send_post_notification_error_title\">Chyba pri odosielaní tootu</string>\n    <string name=\"send_post_notification_saved_content\">Kópia vášho tootu bola uložená do konceptov</string>\n    <string name=\"action_open_post\">Otvoriť toot</string>\n    <string name=\"compose_shortcut_long_label\">Napísať príspevok</string>\n    <string name=\"title_scheduled_posts\">Plánované tooty</string>\n    <string name=\"action_access_scheduled_posts\">Plánované tooty</string>\n    <string name=\"label_avatar\">Avatar</string>\n    <string name=\"action_remove\">Odstrániť</string>\n    <string name=\"lock_account_label\">Uzamknúť účet</string>\n    <string name=\"compose_save_draft\">Uložiť koncept?</string>\n    <string name=\"send_post_notification_channel_name\">Odosielanie tootov</string>\n    <string name=\"send_post_notification_cancel_title\">Odosielanie bolo zrušené</string>\n    <string name=\"performing_lookup_title\">Vyhľadávanie…</string>\n    <string name=\"later\">Neskôr</string>\n    <string name=\"restart\">Reštartovať</string>\n    <string name=\"profile_badge_bot_text\">Robot</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">Metadáta profilu</string>\n    <string name=\"profile_metadata_add\">pridať dáta</string>\n    <string name=\"profile_metadata_content_label\">Obsah</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s a %2$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Žiadny popis</string>\n    <string name=\"description_visibility_public\">Verejný</string>\n    <string name=\"action_reblog\">Podporiť</string>\n    <string name=\"action_unreblog\">Prestať podporovať</string>\n    <string name=\"description_visibility_private\">Sledovatelia</string>\n    <string name=\"post_privacy_public\">Verejný</string>\n    <string name=\"action_view_bookmarks\">Záložky</string>\n    <string name=\"notification_summary_small\">%1$s a %2$s</string>\n    <string name=\"edit_poll\">Upraviť</string>\n    <string name=\"hashtags\">Hashtagy</string>\n    <string name=\"action_access_drafts\">Koncepty</string>\n    <string name=\"action_edit_own_profile\">Upraviť</string>\n    <string name=\"pref_title_notifications_enabled\">Oznámenia</string>\n    <string name=\"pref_title_edit_notification_settings\">Oznámenia</string>\n    <string name=\"action_view_favourites\">Obľúbené</string>\n    <string name=\"filter_dialog_remove_button\">Odstrániť</string>\n    <string name=\"notification_favourite_name\">Obľúbené</string>\n    <string name=\"pref_title_post_tabs\">Domovská časová os</string>\n    <string name=\"action_logout_confirm\">Naozaj sa chcete odhlásiť z %1$s? Týmto sa odstránia všetky lokálne údaje tohto účtu vrátane konceptov a predvolieb.</string>\n    <string name=\"notification_reblog_format\">%1$s boostol/boostla váš príspevok</string>\n    <string name=\"notification_header_report_format\">%1$s nahlásené %2$s</string>\n    <string name=\"reply_sending\">Posielanie…</string>\n    <string name=\"send_account_link_to\">Zdieľať odkaz na účet s…</string>\n    <string name=\"hint_media_description_missing\">Médiá by mali mať popis.</string>\n    <string name=\"post_replied_self\">Pokračovanie vlákna</string>\n    <string name=\"post_edited\">Upravené %1$s</string>\n    <string name=\"message_empty\">Nič tu nie je.</string>\n    <string name=\"footer_empty\">Nič tu nie je. Obnovte potiahnutím dole!</string>\n    <string name=\"notification_follow_format\">%1$s vás teraz sleduje</string>\n    <string name=\"notification_follow_request_format\">%1$s požiadal/a aby vás mohl/a sledovať</string>\n    <string name=\"notification_sign_up_format\">%1$s sa zaregistroval/a</string>\n    <string name=\"notification_subscription_format\">%1$s práve zverejnil/a príspevok</string>\n    <string name=\"notification_update_format\">%1$s upravil/a svoj príspevok</string>\n    <string name=\"notification_report_format\">Nové hlásenie o %1$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d priložených príspevkov</string>\n    <string name=\"report_comment_hint\">Ďalšie komentáre?</string>\n    <string name=\"action_favourite\">Oblúbiť</string>\n    <string name=\"action_unfavourite\">Odstraniť obľúbenie</string>\n    <string name=\"action_unbookmark\">Odobrať záložku</string>\n    <string name=\"action_more\">Viac</string>\n    <string name=\"action_compose\">Napísať</string>\n    <string name=\"action_browser_login\">Prihlásiť sa cez prehliadač</string>\n    <string name=\"action_post_failed\">Nahrávanie zlyhalo</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Váš príspevok sa nepodarilo nahrať a bol uložený medzi koncepty.\n\\n\n\\nServer sa buď nepodarilo kontaktovať, alebo príspevok odmietol.</item>\n        <item quantity=\"few\"/>\n        <item quantity=\"other\">Váše príspevky sa nepodarilo nahrať a boli uložené medzi koncepty.\n\\n\n\\nServer sa buď nepodarilo kontaktovať, alebo príspevky odmietol.</item>\n    </plurals>\n    <string name=\"action_post_failed_show_drafts\">Zobraziť koncepty</string>\n    <string name=\"action_post_failed_do_nothing\">Zrušiť</string>\n    <string name=\"action_share_account_link\">Zdieľať odkaz na účet</string>\n    <string name=\"action_share_account_username\">Zdieľať užívateľské meno účtu</string>\n    <string name=\"action_hide_reblogs\">Skryť boosty</string>\n    <string name=\"action_show_reblogs\">Zobraziť boosty</string>\n    <string name=\"pref_title_show_self_boosts\">Zobraziť vlastné boosty</string>\n    <string name=\"pref_title_show_self_boosts_description\">Niekto boostuje svoj vlastný príspevok</string>\n    <string name=\"action_delete_conversation\">Zmazať konverzáciu</string>\n    <string name=\"action_continue_edit\">Pokračovať v úpravách</string>\n    <string name=\"action_retry\">Skúsiť znova</string>\n    <string name=\"action_close\">Zavrieť</string>\n    <string name=\"action_view_mutes\">Stlmení užívatelia</string>\n    <string name=\"action_view_blocks\">Blokovaní užívatelia</string>\n    <string name=\"action_open_drawer\">Otvoriť menu</string>\n    <string name=\"action_save\">Uložiť</string>\n    <string name=\"action_undo\">Vrátiť</string>\n    <string name=\"action_accept\">Prijať</string>\n    <string name=\"action_reject\">Odmietnuť</string>\n    <string name=\"action_content_warning\">Upozornenie na obsah</string>\n    <string name=\"action_emoji_keyboard\">Klávesnica s emoji</string>\n    <string name=\"action_add_tab\">Přidať kartu</string>\n    <string name=\"action_details\">Podrobnosti</string>\n    <string name=\"action_add_reaction\">pridať reakciu</string>\n    <string name=\"action_share_as\">Zdieľať ako…</string>\n    <string name=\"action_translate\">Preložiť</string>\n    <string name=\"action_show_original\">Zobraziť originál</string>\n    <string name=\"download_media\">Stiahnuť média</string>\n    <string name=\"downloading_media\">Sťahujem média</string>\n    <string name=\"send_post_link_to\">Zdieľať URL príspevku s…</string>\n    <string name=\"send_post_content_to\">Zdieľať príspevok s…</string>\n    <string name=\"send_account_username_to\">Zdieľať užívateľské meno účtu s.…</string>\n    <string name=\"send_media_to\">Zdieľať média s…</string>\n    <string name=\"account_username_copied\">Užívateľské meno skopírované</string>\n    <string name=\"url_copied\">Odkaz skopírovaný</string>\n    <string name=\"hint_content_warning\">Upozornenie na obsah</string>\n    <string name=\"label_image\">Obrázok</string>\n    <string name=\"dialog_delete_conversation_warning\">Zmazať túto konverzáciu?</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Skryť celú doménu</string>\n    <string name=\"error_multimedia_size_limit\">Video a audio súbory nesmú prekročit veľkosť %1$s MB.</string>\n    <string name=\"error_image_edit_failed\">Obrázok sa nepodarilo upraviť.</string>\n    <string name=\"action_follow_hashtag\">Sledovať nový hashtag</string>\n    <string name=\"action_open_reblogger\">Otvoriť autora boostu</string>\n    <string name=\"action_open_reblogged_by\">Zobraziť boosty</string>\n    <string name=\"confirmation_unmuted\">Stlmenie užívateľa zrušené</string>\n    <string name=\"confirmation_domain_unmuted\">Skrytie domény %1$s zrušené</string>\n    <string name=\"confirmation_hashtag_unfollowed\">Zrušenie sledovania #%1$s</string>\n    <string name=\"confirmation_hashtag_copied\">\\'#%1$s\\' skopírované</string>\n    <string name=\"reply_sending_long\">Vaša odpoveď sa posiela.</string>\n    <string name=\"hint_compose\">Čo sa práve deje?</string>\n    <string name=\"dialog_message_cancel_follow_request\">Zrušiť žiadosť o sledovanie?</string>\n    <string name=\"dialog_unfollow_warning\">Zrušiť sledovanie tohto účtu?</string>\n    <string name=\"dialog_follow_warning\">Sledovať tento účet?</string>\n    <string name=\"error_muting_hashtag_format\">Umlčanie zlyhalo #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Chyba pri rušení umlčania #%1$s</string>\n    <string name=\"action_discard\">Zrušiť zmeny</string>\n    <string name=\"error_status_source_load\">Nepodarilo sa načítať správu zo serveru.</string>\n    <string name=\"action_view_profile\">Profil</string>\n    <string name=\"error_following_hashtags_unsupported\">Táto inštancia nepodporuje sledovanie hashtagov.</string>\n    <string name=\"error_following_hashtag_format\">Chyba pri sledovaní #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Chyba pri zrušení sledovania #%1$s</string>\n    <string name=\"error_media_upload_sending_fmt\">Nahranie zlyhalo: %1$s</string>\n    <string name=\"error_blocking_domain\">Nepodarilo sa stlmiť %1$s: %2$s</string>\n    <string name=\"error_unblocking_domain\">Nepodarilo sa zrušiť stlmenie %1$s: %2$s</string>\n    <string name=\"error_media_upload_permission\">Vyžaduje sa oprávnenie na čítanie médii.</string>\n    <string name=\"error_media_upload_image_or_video\">K tomu istému príspevku nemožno pripojiť obrázky aj videá.</string>\n    <string name=\"error_media_upload_sending\">Nahranie zlyhalo.</string>\n    <string name=\"error_media_download_permission\">Vyžaduje sa povolenie na ukladanie médií.</string>\n    <string name=\"error_loading_account_details\">Nepodarilo sa načítať detaily účtu</string>\n    <string name=\"error_could_not_load_login_page\">Nepodarilo sa načítať prihlasovaciu stránku.</string>\n    <string name=\"error_deleting_filter\">Chyba pri odstraňovaní filtra \\'%1$s\\'</string>\n    <string name=\"error_saving_filter\">Chyba pri ukladaní filtra \\'%1$s\\'</string>\n    <string name=\"title_login\">Prihlásenie</string>\n    <string name=\"title_public_local\">Miestne</string>\n    <string name=\"title_public_trending_hashtags\">Populárne hashtagy</string>\n    <string name=\"title_public_trending_statuses\">Populárne príspevky</string>\n    <string name=\"title_public_federated\">Federované</string>\n    <string name=\"title_posts\">Príspevky</string>\n    <string name=\"title_follows\">Sledovaní</string>\n    <string name=\"title_blocks\">Blokovaní užívatelia</string>\n    <string name=\"title_follow_requests\">Žiadosti o sledovanie</string>\n    <string name=\"title_edit_profile\">Upraviť váš profil</string>\n    <string name=\"title_announcements\">Oznamy</string>\n    <string name=\"title_followed_hashtags\">Sledované hashtagy</string>\n    <string name=\"title_edits\">Úpravy</string>\n    <string name=\"dialog_follow_hashtag_title\">Sledovať hashtag</string>\n    <string name=\"post_boosted_format\">%1$s boostol/boostla</string>\n    <string name=\"post_media_hidden_title\">Skryté média</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"title_mutes\">Stlmení užívatelia</string>\n    <string name=\"title_domain_mutes\">Stlmené domény</string>\n    <string name=\"action_view_domain_mutes\">Skryté domény</string>\n    <string name=\"action_view_follow_requests\">Žiadosti o sledovanie</string>\n    <string name=\"action_view_media\">Média</string>\n    <string name=\"action_open_in_web\">Otvoriť v prehliadači</string>\n    <string name=\"action_add_media\">Pridať média</string>\n    <string name=\"action_add_poll\">Pridať anketu</string>\n    <string name=\"action_photo_take\">Vyfotografovať</string>\n    <string name=\"action_share\">Zdieľať</string>\n    <string name=\"action_mute\">Stlmiť</string>\n    <string name=\"action_unmute\">Zrušiť stlmenie</string>\n    <string name=\"action_unmute_desc\">Zrušiť stlmenie %1$s</string>\n    <string name=\"action_mute_domain\">Stlmiť doménu %1$s</string>\n    <string name=\"action_unmute_domain\">Zrušiť stlmenie domény %1$s</string>\n    <string name=\"action_mute_conversation\">Stlmiť konverzáciu</string>\n    <string name=\"action_unmute_conversation\">Zrušiť stlmenie konverzácie</string>\n    <string name=\"action_mention\">Spomenúť</string>\n    <string name=\"action_hide_media\">Skryť média</string>\n    <string name=\"lock_account_label_description\">Vyžaduje sa ručné schválenie sledovateľov</string>\n    <string name=\"pref_title_custom_tabs\">Použiť vlastné karty Chrome</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP proxy port</string>\n    <string name=\"pref_default_post_language\">Jazyk príspevku (synchronizované so serverom)</string>\n    <string name=\"post_replied_format\">V odpovedi na %1$s</string>\n    <string name=\"dialog_block_warning\">Blokovať @%1$s?</string>\n    <string name=\"dialog_mute_warning\">Stíšiť @%1$s?</string>\n    <string name=\"dialog_mute_hide_notifications\">Skryť notifikácie</string>\n    <string name=\"visibility_public\">Verejný: Uverejniť na verejných časových osách</string>\n    <string name=\"visibility_unlisted\">Neuvedené: Nezobrazovať na verejných časových osách</string>\n    <string name=\"visibility_private\">Len pre sledovateľov: Uverejniť len pre sledovateľov</string>\n    <string name=\"visibility_direct\">Priame: Uverejniť len spomenutým užívateľom</string>\n    <string name=\"pref_title_notification_filters\">Oznamovať, keď</string>\n    <string name=\"dialog_title_finishing_media_upload\">Dokončuje sa nahrávanie médií</string>\n    <string name=\"mute_domain_warning\">Naozaj chcete zablokovat všetko z domény %1$s? Obsah z tejto domény neuvidíte v žiadnej verejnej časovej osi ani vo svojich upozorneniach. Vaši sledovatelia z tejto domény budú odstránení.</string>\n    <string name=\"pref_title_appearance_settings\">Vzhľad</string>\n    <string name=\"pref_title_app_theme\">Motív aplikácie</string>\n    <string name=\"pref_title_timelines\">Časové osy</string>\n    <string name=\"pref_title_timeline_filters\">Filtre</string>\n    <string name=\"pref_title_per_timeline_preferences\">Predvoľby podľa časovej osi</string>\n    <string name=\"app_them_dark\">Tmavý</string>\n    <string name=\"app_theme_light\">Svetlý</string>\n    <string name=\"app_theme_black\">Čierny</string>\n    <string name=\"app_theme_auto\">Automaticky pri západe slnka</string>\n    <string name=\"app_theme_system\">Použiť systémový design</string>\n    <string name=\"app_theme_system_black\">Použiť systémový design (čierny)</string>\n    <string name=\"pref_title_browser_settings\">Prehliadač</string>\n    <string name=\"pref_title_animate_gif_avatars\">Animovať GIF avatary</string>\n    <string name=\"pref_title_gradient_for_media\">Zobraziť farebné prechody namiesto skrytých médii</string>\n    <string name=\"pref_title_animate_custom_emojis\">Animovať vlastné emotikony</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP proxy</string>\n    <string name=\"pref_title_http_proxy_enable\">Povoliť HTTP proxy</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP proxy server</string>\n    <string name=\"pref_title_http_proxy_port_message\">Port by mal byť medzi %1$d a %2$d</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;neplatné&gt;</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;nenastavené&gt;</string>\n    <string name=\"pref_default_post_privacy\">Súkromie príspevkov (synchronizované so serverom)</string>\n    <string name=\"post_text_size_medium\">Stredný</string>\n    <string name=\"post_text_size_large\">Veľký</string>\n    <string name=\"post_text_size_largest\">Najväčší</string>\n    <string name=\"pref_show_self_username_always\">Vždy</string>\n    <string name=\"pref_show_self_username_never\">Nikdy</string>\n    <string name=\"notification_mention_name\">Nové zmienky</string>\n    <string name=\"notification_boost_name\">Boosty</string>\n    <string name=\"notification_boost_description\">Oznámenie, keď sú vaše príspevky boostnuté</string>\n    <string name=\"notification_favourite_description\">Oznámenie, keď sú vaše príspevky označené ako obľúbené</string>\n    <string name=\"notification_poll_description\">Oznámenie o anketách, ktoré skončily</string>\n    <string name=\"notification_subscription_name\">Nové príspevky</string>\n    <string name=\"notification_subscription_description\">Upozornenie na nový príspevok niekoho, koho sledujete.</string>\n    <string name=\"notification_sign_up_name\">Registrácia</string>\n    <string name=\"notification_sign_up_description\">Upozornenie na nových užívateľoch</string>\n    <string name=\"notification_update_name\">Úpravy príspevkov</string>\n    <string name=\"notification_update_description\">Upozornenia na úpravu príspevkov, s ktorými ste interagovali</string>\n    <string name=\"notification_report_name\">Hlásenie</string>\n    <string name=\"notification_report_description\">Upozornenie na hlásenie moderátorov</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d nová interakcia</item>\n        <item quantity=\"few\">%1$d nové interakcie</item>\n        <item quantity=\"other\">%1$d nových interakcií</item>\n    </plurals>\n    <string name=\"notification_notification_worker\">Získavám upozornenia…</string>\n    <string name=\"description_account_locked\">Uzamknutý účet</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_device_info_title\">Vaše zariadenie</string>\n    <string name=\"post_media_images\">Obrázky</string>\n    <string name=\"post_media_audio\">Audio</string>\n    <string name=\"post_media_attachments\">Prílohy</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"status_created_at_now\">teraz</string>\n    <string name=\"action_create_list\">Vytvoriť zoznam</string>\n    <string name=\"action_rename_list\">Aktualizovať zoznam</string>\n    <string name=\"action_delete_list\">Zmazať zoznam</string>\n    <string name=\"hint_search_people_list\">Hľadať medzi ĺuďmi, ktorých sledujete</string>\n    <string name=\"action_add_to_list\">Pridať účet do zoznamu</string>\n    <string name=\"action_remove_from_list\">Odstrániť účet zo zoznamu</string>\n    <string name=\"action_accept_notification_request\">Prijať</string>\n    <string name=\"pref_title_notification_alerts\">Upozornenia</string>\n    <string name=\"pref_title_notification_alert_sound\">Oznamovať so zvukom</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Oznamovať s vibráciou</string>\n    <string name=\"pref_title_notification_alert_light\">Oznamovať so svetlom</string>\n    <string name=\"pref_title_post_filter\">Filtrovanie časovej osi</string>\n    <string name=\"pref_title_show_boosts\">Zobraziť boosty</string>\n    <string name=\"pref_title_show_replies\">Zobraziť odpovede</string>\n    <string name=\"pref_title_show_media_preview\">Sťahovať náhľady médií</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Popis pre zrakovo postihnutých\n\\n(limit %1$d znak)</item>\n        <item quantity=\"few\">Popis pre zrakovo postihnutých\n\\n(limit %1$d znaky)</item>\n        <item quantity=\"other\">Popis pre zrakovo postihnutých\n\\n(limit %1$d znakov)</item>\n    </plurals>\n    <string name=\"pref_failed_to_sync\">Nepodarilo sa synchronizovať nastavenie</string>\n    <string name=\"post_privacy_followers_only\">Len pre sledovateľov</string>\n    <string name=\"pref_main_nav_position_option_top\">Hore</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Dole</string>\n    <string name=\"pref_main_nav_position\">Umiestnenie hlavnej navigačnej lušty</string>\n    <string name=\"post_privacy_unlisted\">Neuvedené</string>\n    <string name=\"post_privacy_direct\">Priamo</string>\n    <string name=\"pref_ui_text_size\">Veľkosť textu UI</string>\n    <string name=\"pref_post_text_size\">Veľkosť textu príspevkov</string>\n    <string name=\"post_text_size_smallest\">Najmenší</string>\n    <string name=\"notification_follow_name\">Noví sledovatelia</string>\n    <string name=\"notification_follow_description\">Oznámenia o nových sledovateľoch</string>\n    <string name=\"notification_mention_descriptions\">Oznámenia o nových zmienkách</string>\n    <string name=\"notification_follow_request_name\">Žiadosti o sledovanie</string>\n    <string name=\"notification_follow_request_description\">Upozornenie na žiadosť o sledovanie</string>\n    <string name=\"notification_listenable_worker_name\">Aktivita na pozadí</string>\n    <string name=\"notification_listenable_worker_description\">Upozornenie, keď Tusky beží na pozadí</string>\n    <string name=\"notification_unknown_name\">Neznáme</string>\n    <string name=\"notification_mention_format\">%1$s vás spomenul/a</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s a ďalších %4$d</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s a %3$s</string>\n    <string name=\"notification_prune_cache\">Údržba cache…</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nVerzia: %3$s</string>\n    <string name=\"about_tusky_license\">Tusky je slobodný softvér s otvoreným zdrojovým kódom.\n\\nJe licencovaná pod GNU General Public License Version 3. Licenciu si môžete pozrieť tu: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nVerzia Androidu: %3$s\n\\nVerzia SDK: %4$d</string>\n    <string name=\"about_account_info_title\">Váš účet</string>\n    <string name=\"about_powered_by_tusky\">Beží na Tusky</string>\n    <string name=\"about_project_site\">Webová stránka projektu: https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Nahlasovanie chýb a návrhov na vylepšenie:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Profil aplikácie Tusky</string>\n    <string name=\"post_media_image\">Obrázok</string>\n    <string name=\"post_media_video\">Video</string>\n    <string name=\"status_filter_placeholder_label_format\">Filtrované: %1$s</string>\n    <string name=\"state_follow_requested\">Sledovanie vyžiadané</string>\n    <string name=\"abbreviated_in_years\">za %1$d rokov</string>\n    <string name=\"abbreviated_in_days\">za %1$d d</string>\n    <string name=\"abbreviated_in_seconds\">za %1$d s</string>\n    <string name=\"abbreviated_years_ago\">%1$d r</string>\n    <string name=\"abbreviated_days_ago\">%1$d d</string>\n    <string name=\"abbreviated_hours_ago\">%1$d h</string>\n    <string name=\"abbreviated_minutes_ago\">%1$d m</string>\n    <string name=\"abbreviated_in_hours\">za %1$d h</string>\n    <string name=\"abbreviated_in_minutes\">za %1$d m</string>\n    <string name=\"follows_you\">Sleduje vás</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Vždy zobrazovať citlivé média</string>\n    <string name=\"title_media\">Média</string>\n    <string name=\"abbreviated_seconds_ago\">%1$d s</string>\n    <string name=\"pref_title_alway_open_spoiler\">Vždy rozbaliť príspevky označené varovaním obsahu</string>\n    <string name=\"filter_dialog_update_button\">Aktualizovať</string>\n    <string name=\"filter_dialog_whole_word\">Celé slovo</string>\n    <string name=\"filter_dialog_whole_word_description\">Ak je kľúčové slovo alebo fráza iba alfanumerická, použije sa iba vtedy, ak sa zhoduje s celým slovom</string>\n    <string name=\"replying_to\">Odpoveď užívateľovi @%1$s</string>\n    <string name=\"load_more_placeholder_text\">Načítať viac</string>\n    <string name=\"pref_title_account_filter_keywords\">Profily</string>\n    <string name=\"filter_addition_title\">Pridať filter</string>\n    <string name=\"filter_edit_title\">Upraviť filter</string>\n    <string name=\"add_account_description\">Pridať nový účet Mastodon</string>\n    <string name=\"filter_add_description\">Filtrovať frázu</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"add_account_name\">Pridať účet</string>\n    <string name=\"error_create_list\">Nebolo možné vytvoriť zoznam</string>\n    <string name=\"error_rename_list\">Nebolo možné aktualizovať zoznam</string>\n    <string name=\"error_delete_list\">Nebolo možné zmazať zoznam</string>\n    <string name=\"action_add_or_remove_from_list\">Pridať alebo odstrániť zo zoznamu</string>\n    <string name=\"failed_to_add_to_list\">Zlyhalo pridanie účtu do zoznamu</string>\n    <string name=\"failed_to_remove_from_list\">Zlyhalo odstránenie účtu zo zoznamu</string>\n    <string name=\"set_focus_description\">Klepnutím alebo potiahnutím kruhu vyberte ohnisko, ktoré bude vždy viditeľné v miniatúrach.</string>\n    <string name=\"action_set_caption\">Zadať popis</string>\n    <string name=\"action_set_focus\">Nastaviť bod zaostrenia</string>\n    <string name=\"action_edit_image\">Upraviť obrázok</string>\n    <string name=\"compose_delete_draft\">Zmazať koncept?</string>\n    <string name=\"compose_save_draft_loses_media\">Uložiť koncept? (Prílohy sa znova nahrajú, keď obnovíte koncept.)</string>\n    <string name=\"compose_unsaved_changes\">Máte neuložené zmeny.</string>\n    <string name=\"error_no_custom_emojis\">Vaša inštancia %1$s nemá žiadne vlastné emotikony</string>\n    <string name=\"system_default\">Predvolené nastavenie systému</string>\n    <string name=\"download_fonts\">Najprv si budete musieť stiahnuť tieto sady emoji</string>\n    <string name=\"emoji_style\">Štýl emoji</string>\n    <string name=\"restart_required\">Vyžaduje sa reštart aplikácie</string>\n    <string name=\"restart_emoji\">Pre použitie týchto zmien reštartujte aplikáciu Tusky</string>\n    <string name=\"caption_systememoji\">Predvolená sada emoji vášho zariadenia</string>\n    <string name=\"caption_blobmoji\">Blob Emoji známa z Androidu 4.4–7.1</string>\n    <string name=\"caption_twemoji\">Štandardná sada emoji na Mastodone</string>\n    <string name=\"caption_notoemoji\">Aktuálna sada emoji od Google</string>\n    <string name=\"download_failed\">Sťahovanie zlyhalo</string>\n    <string name=\"account_moved_description\">%1$s sa presunul/a na:</string>\n    <string name=\"reblog_private\">Boostnuť pôvodnému publiku</string>\n    <string name=\"unreblog_private\">Zrušiť boost</string>\n    <string name=\"pref_title_language\">Jazyk</string>\n    <string name=\"pref_title_bot_overlay\">Ukázať indikátor botov</string>\n    <string name=\"post_text_size_small\">Malý</string>\n    <string name=\"notification_poll_name\">Ankety</string>\n    <string name=\"pref_title_public_filter_keywords\">Verejné časové osy</string>\n    <string name=\"pref_title_thread_filter_keywords\">Konverzácie</string>\n    <string name=\"pref_title_proxy_settings\">Proxy</string>\n    <string name=\"label_header\">Titulok</string>\n    <string name=\"login_connection\">Pripája sa…</string>\n    <string name=\"description_login\">Funguje vo väčšine prípadov. Do iných aplikácií neuniknú žiadne údaje.</string>\n    <string name=\"description_browser_login\">Môže podporovať dodatočné metódy overenia, ale vyžaduje podporovaný prehliadač.</string>\n    <string name=\"hint_list_name\">Názov zoznamu</string>\n    <string name=\"label_expires_after\">Vyprší za</string>\n    <string name=\"duration_365_days\">365 dní</string>\n    <string name=\"description_poll\">Anketa s voľbami: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"compose_shortcut_short_label\">Napísať</string>\n    <string name=\"notification_clear_text\">Naozaj chcete natrvalo vymazať všetky oznámenia?</string>\n    <string name=\"pref_default_reply_privacy_explanation\">Prednastavene súkromie bude závisieť od príspevku, na ktorý odpovedáte.</string>\n    <string name=\"pref_default_media_sensitivity\">Vždy označiť média ako citlivé (synchronizované so serverom)</string>\n    <string name=\"expand_collapse_all_posts\">Rozbaliť/Zbaliť všetky príspevky</string>\n    <string name=\"pref_title_absolute_time\">Použiť absolútny čas</string>\n    <string name=\"label_remote_account\">Nižšie uvedené informácie nemusia úplne odrážať profil užívateľa. Stlačením otvoríte úplný profil v prehliadači.</string>\n    <string name=\"license_apache_2\">Licencované na základe licencie Apache (kópia nižšie)</string>\n    <string name=\"profile_metadata_label_label\">Označenie</string>\n    <string name=\"unpin_action\">Odopnúť</string>\n    <string name=\"pin_action\">Pripnúť</string>\n    <string name=\"failed_to_unpin\">Odopnutie zlyhalo</string>\n    <string name=\"failed_to_pin\">Pripnutie zlyhalo</string>\n    <string name=\"title_reblogged_by\">Boostnuté užívateľom</string>\n    <string name=\"title_favourited_by\">Obľúbené užívateľom</string>\n    <string name=\"label_translated\">Preložené z %1$s s %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s a %3$d ďalší</string>\n    <string name=\"description_post_media\">Médiá %1$s</string>\n    <string name=\"description_post_cw\">Upozornenie na obsah: %1$s</string>\n    <string name=\"description_post_edited\">Upravené</string>\n    <string name=\"description_post_bookmarked\">Uložené do záložiek</string>\n    <string name=\"description_post_language\">Jazyk príspevku</string>\n    <string name=\"add_hashtag_title\">Pridať hashtag</string>\n    <string name=\"select_list_title\">Vybrať zoznam</string>\n    <string name=\"select_list_manage\">Spravovať zoznamy</string>\n    <string name=\"list\">Zoznam</string>\n    <string name=\"notifications_apply_filter\">Filtrovať</string>\n    <string name=\"filter_apply\">Použiť</string>\n    <string name=\"notifications_clear\">Vymazať</string>\n    <string name=\"unmuting_hashtag_success_format\">Zrušeníe stlmenia hashtagu #%1$s</string>\n    <string name=\"action_view_filter\">Zobraziť filter</string>\n    <string name=\"muting_hashtag_success_format\">Stlmenie hashtagu #%1$s ako varovanie</string>\n    <string name=\"following_hashtag_success_format\">Hashtag #%1$s je sledovaný</string>\n    <string name=\"poll_vote\">Hlasovať</string>\n    <string name=\"poll_ended_voted\">Anketa, v ktorej ste hlasovali, sa skončila</string>\n    <string name=\"poll_ended_created\">Anketa, ktorú ste vytvorili, sa skončila</string>\n    <string name=\"button_continue\">Pokračovať</string>\n    <string name=\"button_done\">Hotovo</string>\n    <string name=\"hint_additional_info\">Ďalšie komentáre</string>\n    <string name=\"report_remote_instance\">Preposlať na %1$s</string>\n    <string name=\"failed_report\">Nahlásenie zlyhalo</string>\n    <string name=\"report_sent_success\">\\@%1$s bol/a úspešne nahlásený/á</string>\n    <string name=\"title_accounts\">Účty</string>\n    <string name=\"create_poll_title\">Anketa</string>\n    <string name=\"label_duration\">Trvanie</string>\n    <string name=\"duration_indefinite\">Na neurčito</string>\n    <string name=\"duration_5_min\">5 minút</string>\n    <string name=\"duration_30_min\">30 minút</string>\n    <string name=\"duration_1_hour\">1 hodina</string>\n    <string name=\"duration_7_days\">7 dní</string>\n    <string name=\"duration_30_days\">30 dní</string>\n    <string name=\"duration_60_days\">60 dní</string>\n    <string name=\"duration_90_days\">90 dní</string>\n    <string name=\"duration_180_days\">180 dní</string>\n    <string name=\"duration_6_hours\">6 hodín</string>\n    <string name=\"duration_1_day\">1 deň</string>\n    <string name=\"duration_3_days\">3 dni</string>\n    <string name=\"duration_14_days\">14 dní</string>\n    <string name=\"action_dismiss\">Zavrieť</string>\n    <string name=\"status_filtered_show_anyway\">Aj tak ukázať</string>\n    <string name=\"label_translating\">Prekladá sa…</string>\n    <string name=\"failed_search\">Vyhľadávanie zlyhalo</string>\n    <string name=\"license_description\">Tusky obsahuje kód a zdroje z nasledujúcich open source projektov:</string>\n    <string name=\"compose_preview_image_description\">Akcie pre obrázok %1$s</string>\n    <string name=\"account_note_hint\">Váša súkromá poznámka o tomto účte</string>\n    <string name=\"pref_title_reading_order\">Poradie čítania</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">Ľudia, ktorých nesledujete</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">zostáva %1$d deň</item>\n        <item quantity=\"few\">zostávajú %1$d dni</item>\n        <item quantity=\"other\">zostáva %1$d dní</item>\n    </plurals>\n    <string name=\"action_subscribe_account\">Odoberať</string>\n    <string name=\"list_reply_policy_none\">Nikto</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Deaktivované</string>\n    <string name=\"drafts_failed_loading_reply\">Nepodarilo sa načítať informácie o odpovedi</string>\n    <string name=\"action_add\">Pridať</string>\n    <string name=\"action_compose_shortcut\">Napísať</string>\n    <string name=\"description_post_reblogged\">Boostnutý</string>\n    <string name=\"description_post_favourited\">Obľúbený</string>\n    <string name=\"description_visibility_unlisted\">Neuvedený</string>\n    <string name=\"pick_hashtag_hint\">Hashtag bez #</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s hlas</item>\n        <item quantity=\"few\">%1$s hlasy</item>\n        <item quantity=\"other\">%1$s hlasov</item>\n    </plurals>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s osoba</item>\n        <item quantity=\"few\">%1$s ľudia</item>\n        <item quantity=\"other\">%1$s ľudí</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">končí v %1$s</string>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">zostáva %1$d minúta</item>\n        <item quantity=\"few\">zostávajú %1$d minúty</item>\n        <item quantity=\"other\">zostáva %1$d minút</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">zostáva %1$d hodina</item>\n        <item quantity=\"few\">zostávajú %1$d hodiny</item>\n        <item quantity=\"other\">zostáva %1$d hodín</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">zostáva %1$d sekunda</item>\n        <item quantity=\"few\">zostávajú %1$d sekundy</item>\n        <item quantity=\"other\">zostáva %1$d sekúnd</item>\n    </plurals>\n    <string name=\"button_back\">Späť</string>\n    <string name=\"failed_fetch_posts\">Sťahovanie príspevkov zlyhalo</string>\n    <string name=\"pref_title_show_notifications_filter\">Ukázať filter upozornení</string>\n    <string name=\"duration_no_change\">(Žiadna zmena)</string>\n    <string name=\"add_poll_choice\">Pridať možnosť</string>\n    <string name=\"poll_allow_multiple_choices\">Výber viacerých možností</string>\n    <string name=\"poll_new_choice_hint\">Možnosť %1$d</string>\n    <string name=\"account_note_saved\">Uložené!</string>\n    <string name=\"drafts_post_failed_to_send\">Tento príspevok sa nepodarilo odoslať!</string>\n    <string name=\"draft_deleted\">Koncept bol zmazaný</string>\n    <string name=\"action_unsubscribe_account\">Zrušiť odber</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Vytvoriť príspevok</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"report_category_violation\">Porušenie pravidiel</string>\n    <string name=\"report_category_spam\">Spam</string>\n    <string name=\"report_category_legal\">Právne informácie</string>\n    <string name=\"report_category_other\">Ostatné</string>\n    <string name=\"action_refresh\">Obnoviť</string>\n    <string name=\"pref_reading_order_oldest_first\">Od najstarších</string>\n    <string name=\"pref_reading_order_newest_first\">Od najnovších</string>\n    <string name=\"status_edit_info\">Upravené: %1$s</string>\n    <string name=\"status_created_info\">Vytvořené: %1$s</string>\n    <string name=\"a11y_label_loading_thread\">Vlákno sa načítava</string>\n    <string name=\"ui_error_unknown\">neznámy dôvod</string>\n    <string name=\"hint_filter_title\">Môj filter</string>\n    <string name=\"label_filter_title\">Nadpis</string>\n    <string name=\"filter_action_warn\">Varovanie</string>\n    <string name=\"filter_action_hide\">Skryť</string>\n    <string name=\"filter_description_warn\">Skryť s varovaním</string>\n    <string name=\"filter_description_hide\">Úplne skryť</string>\n    <string name=\"label_filter_action\">Filtrovať akciu</string>\n    <string name=\"label_filter_context\">Filtrovať kontext</string>\n    <string name=\"filter_keyword_display_format\">%1$s (celé slovo)</string>\n    <string name=\"filter_keyword_addition_title\">Pridať kľúčové slovo</string>\n    <string name=\"filter_edit_keyword_title\">Upraviť kľúčové slovo</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"list_reply_policy_list\">Členovia zoznamu</string>\n    <string name=\"preview_card_by_author\">Od %1$s</string>\n    <string name=\"preview_card_more_by_author\">Viac od %1$s</string>\n    <string name=\"notification_policies_filter_not_following_title\">Ľudia, ktorí vás nesledujú</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">Nové účty</string>\n    <string name=\"unknown_notification_filter_moderated_accounts\">Moderovaný účet</string>\n    <string name=\"notification_policy_accept\">Prijať</string>\n    <string name=\"notification_policy_filter\">Filtrovať</string>\n    <string name=\"notification_policy_ignore\">Ignorovať</string>\n    <string name=\"open_settings\">Otvoriť predvoľby</string>\n    <string name=\"pref_default_reply_privacy\">Súkromie odpovedí (nesynchronizované so serverom)</string>\n    <string name=\"pref_show_self_username_disambiguate\">Keď je prihlásených viacero účtov</string>\n    <string name=\"compose_active_account_description\">Uverejňujete ako %1$s</string>\n    <string name=\"report_description_1\">Hlásenie bude odoslané moderátorom vášho servera. Nižšie môžete uviesť vysvetlenie, prečo nahlasujete tento účet:</string>\n    <string name=\"dialog_delete_filter_positive_action\">Zmazať</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Povoľte gesto potiahnutia na prepínanie medzi kartami</string>\n    <string name=\"action_dismiss_notification_request\">Zrušiť</string>\n    <string name=\"post_replied\">Odpovedané</string>\n    <string name=\"post_lookup_error_format\">Chyba pri hľadaní príspevku %1$s</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-sl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">Pojavila se je napaka.</string>\n    <string name=\"error_network\">Prišlo je do omrežne napake. Preverite povezavo in poskusite znova.</string>\n    <string name=\"error_empty\">To ne sme biti prazno.</string>\n    <string name=\"error_invalid_domain\">Vnesena je neveljavna domena</string>\n    <string name=\"error_no_web_browser_found\">Spletnega brskalnika ni bilo mogoče najti.</string>\n    <string name=\"error_authorization_denied\">Avtorizacija je bila zavrnjena. Če ste prepričani, da ste uporabili pravilne podatke, se poskusite prijaviti v brskalnik iz menija.</string>\n    <string name=\"error_retrieving_oauth_token\">Ni bilo mogoče pridobiti žetona za prijavo. Če se to nadaljuje, se poskusite prijaviti z brskalnikom iz menija.</string>\n    <string name=\"error_compose_character_limit\">Predolgo sporočilo!</string>\n    <string name=\"error_media_upload_type\">Te vrste datoteke ni mogoče poslati.</string>\n    <string name=\"error_media_upload_opening\">Te datoteke ni bilo mogoče odpreti.</string>\n    <string name=\"error_media_upload_permission\">Potrebno je dovoljenje za branje medijev.</string>\n    <string name=\"error_media_download_permission\">Potrebno je dovoljenje za shranjevanje medijev.</string>\n    <string name=\"error_media_upload_image_or_video\">Sporočilo ne more vsebovati slik in videoposnetkov hkrati.</string>\n    <string name=\"error_media_upload_sending\">Prenos ni uspel.</string>\n    <string name=\"error_sender_account_gone\">Napaka pri pošiljanju sporočila.</string>\n    <string name=\"title_home\">Domov</string>\n    <string name=\"title_notifications\">Obvestila</string>\n    <string name=\"title_public_local\">Lokalno</string>\n    <string name=\"title_public_federated\">Združeno</string>\n    <string name=\"title_direct_messages\">Neposredna Sporočila</string>\n    <string name=\"title_tab_preferences\">Zavihki</string>\n    <string name=\"title_view_thread\">Tut</string>\n    <string name=\"title_posts\">Objave</string>\n    <string name=\"title_posts_with_replies\">Z odgovori</string>\n    <string name=\"title_posts_pinned\">Pripeto</string>\n    <string name=\"title_follows\">Sledi</string>\n    <string name=\"title_followers\">Sledilci</string>\n    <string name=\"title_favourites\">Priljubljene</string>\n    <string name=\"title_mutes\">Utišani uporabniki</string>\n    <string name=\"title_blocks\">Blokirani uporabniki</string>\n    <string name=\"title_follow_requests\">Zahteve za Sledenje</string>\n    <string name=\"title_edit_profile\">Uredi svoj profil</string>\n    <string name=\"title_drafts\">Osnutki</string>\n    <string name=\"title_licenses\">Licence</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_sensitive_media_title\">Občutljiva vsebina</string>\n    <string name=\"post_media_hidden_title\">Medij je skrit</string>\n    <string name=\"post_sensitive_media_directions\">Kliknite za ogled</string>\n    <string name=\"post_content_warning_show_more\">Pokaži več</string>\n    <string name=\"post_content_warning_show_less\">Pokaži manj</string>\n    <string name=\"post_content_show_more\">Razširi</string>\n    <string name=\"post_content_show_less\">Strni</string>\n    <string name=\"message_empty\">Tukaj ni ničesar.</string>\n    <string name=\"footer_empty\">Tukaj ni ničesar. Potegnite navzdol za osvežitev!</string>\n    <string name=\"notification_reblog_format\">%1$s je spodbudil tvoj tut</string>\n    <string name=\"notification_favourite_format\">%1$s je vzljubil vaš tut</string>\n    <string name=\"notification_follow_format\">%1$s vam sledi</string>\n    <string name=\"report_username_format\">Prijavi @%1$s</string>\n    <string name=\"report_comment_hint\">Dodatni komentarji?</string>\n    <string name=\"action_quick_reply\">Hiter odgovor</string>\n    <string name=\"action_reply\">Odgovori</string>\n    <string name=\"action_reblog\">Spodbudi</string>\n    <string name=\"action_unreblog\">Odstrani spodbudo</string>\n    <string name=\"action_favourite\">Vzljubi</string>\n    <string name=\"action_more\">Več</string>\n    <string name=\"action_compose\">Sestavi</string>\n    <string name=\"action_login\">Prijavite se z Mastodonom</string>\n    <string name=\"action_logout\">Odjava</string>\n    <string name=\"action_logout_confirm\">Ali ste prepričani, da se želite odjaviti iz računa %1$s? To bo izbrisalo vse lokalne podatke o računu, vključno z osnutki in preferencami.</string>\n    <string name=\"action_follow\">Sledi</string>\n    <string name=\"action_unfollow\">Prenehaj slediti</string>\n    <string name=\"action_block\">Blokiraj</string>\n    <string name=\"action_unblock\">Odblokiraj</string>\n    <string name=\"action_hide_reblogs\">Skirj spodbude</string>\n    <string name=\"action_show_reblogs\">Prikaži spodbude</string>\n    <string name=\"action_report\">Prijavi</string>\n    <string name=\"action_delete\">Izbriši</string>\n    <string name=\"action_send\">TUTNI</string>\n    <string name=\"action_send_public\">TUTNI!</string>\n    <string name=\"action_retry\">Poskusi znova</string>\n    <string name=\"action_close\">Zapri</string>\n    <string name=\"action_view_profile\">Profil</string>\n    <string name=\"action_view_preferences\">Možnosti</string>\n    <string name=\"action_view_account_preferences\">Možnosti računa</string>\n    <string name=\"action_view_favourites\">Priljubljeni</string>\n    <string name=\"action_view_mutes\">Utišani uporabniki</string>\n    <string name=\"action_view_blocks\">Blokirani uporabniki</string>\n    <string name=\"action_view_follow_requests\">Prošnje za sledenje</string>\n    <string name=\"action_view_media\">Mediji</string>\n    <string name=\"action_open_in_web\">Odpri v brskalniku</string>\n    <string name=\"action_add_media\">Dodaj medij</string>\n    <string name=\"action_photo_take\">Posnemi fotografijo</string>\n    <string name=\"action_share\">Deli</string>\n    <string name=\"action_mute\">Utišaj</string>\n    <string name=\"action_mention\">Omeni</string>\n    <string name=\"action_hide_media\">Skrij medij</string>\n    <string name=\"action_open_drawer\">Odpri predal</string>\n    <string name=\"action_save\">Shrani</string>\n    <string name=\"action_edit_profile\">Uredi profil</string>\n    <string name=\"action_edit_own_profile\">Uredi</string>\n    <string name=\"action_undo\">Razveljavi</string>\n    <string name=\"action_accept\">Sprejmi</string>\n    <string name=\"action_reject\">Zavrni</string>\n    <string name=\"action_search\">Iskanje</string>\n    <string name=\"action_access_drafts\">Osnutki</string>\n    <string name=\"action_toggle_visibility\">Vidljivost tuta</string>\n    <string name=\"action_content_warning\">Opozorilo o vsebini</string>\n    <string name=\"action_emoji_keyboard\">Tipkovnica z emotikoni</string>\n    <string name=\"action_add_tab\">Dodaj zavihek</string>\n    <string name=\"action_links\">Povezave</string>\n    <string name=\"action_mentions\">Omembe</string>\n    <string name=\"action_open_reblogger\">Odpri spodbujenega avtorja</string>\n    <string name=\"action_open_reblogged_by\">Prikaži spodbude</string>\n    <string name=\"action_open_faved_by\">Prikaži priljubljene</string>\n    <string name=\"title_mentions_dialog\">Omembe</string>\n    <string name=\"title_links_dialog\">Povezave</string>\n    <string name=\"action_open_media_n\">Odpri medij #%1$d</string>\n    <string name=\"download_image\">Prejemanje %1$s</string>\n    <string name=\"action_copy_link\">Kopiraj povezavo</string>\n    <string name=\"action_open_as\">Odpri kot %1$s</string>\n    <string name=\"action_share_as\">Deli kot …</string>\n    <string name=\"download_media\">Prenos medija</string>\n    <string name=\"downloading_media\">Prejemanje medija</string>\n    <string name=\"send_post_link_to\">Deli URL tuta z…</string>\n    <string name=\"send_post_content_to\">Deli tut z…</string>\n    <string name=\"send_media_to\">Deli medij z…</string>\n    <string name=\"confirmation_reported\">Pošlji!</string>\n    <string name=\"hint_compose\">Kaj se dogaja?</string>\n    <string name=\"hint_content_warning\">Opozorilo o vsebini</string>\n    <string name=\"hint_display_name\">Prikazano ime</string>\n    <string name=\"hint_note\">Bio</string>\n    <string name=\"hint_search\">Iskanje…</string>\n    <string name=\"search_no_results\">Ni rezultatov</string>\n    <string name=\"label_quick_reply\">Odgovori…</string>\n    <string name=\"label_avatar\">Podoba</string>\n    <string name=\"label_header\">Glava</string>\n    <string name=\"login_connection\">Povezovanje…</string>\n    <string name=\"error_failed_app_registration\">Overitev s to instanco ni uspela. Če se to ponovi, se poskusite prijaviti v brskalnik iz menija.</string>\n    <string name=\"error_authorization_unknown\">Prišlo je do neznane napake pri pooblastitvi. Če se to ponovi, se poskusite prijaviti v brskalniku iz menija.</string>\n    <string name=\"action_unfavourite\">Odstrani priljubljene</string>\n    <string name=\"action_unmute\">Prekini utišanje</string>\n    <string name=\"action_hashtags\">Ključniki</string>\n    <string name=\"title_hashtags_dialog\">Ključniki</string>\n    <string name=\"confirmation_unblocked\">Odblokiran uporabnik</string>\n    <string name=\"confirmation_unmuted\">Prekinjeno utišanje uporabnika</string>\n    <string name=\"hint_domain\">Katero vozlišče?</string>\n    <string name=\"link_whats_an_instance\">Kaj je instanca?</string>\n    <string name=\"dialog_whats_an_instance\">Tu lahko vnesete naslov ali domeno katerega koli vozlišča, na primer mastodon.social, icosahedron.website, social.tchncs.de in <a href=\"https://instances.social\"> več! </a> \\u0020\n\\n \\u0020\n\\nČe še nimate računa, lahko vnesete ime vozlišča, kateremu bi se radi pridružili, in tam ustvarite račun. \\u0020\n\\n \\u0020\n\\nVozlišče je ena lokacija, kjer je gostovanje vašega računa, vendar lahko preprosto komunicirate in sledite ljudem na drugih vozliščih, kot da bi bili na isti lokaciji. \\u0020\n\\n \\u0020\n\\nVeč informacij najdete na naslovu <a href=\"https://joinmastodon.org\">joinmastodon.org</a>. </string>\n    <string name=\"dialog_title_finishing_media_upload\">Dokončanje pošiljanja medija</string>\n    <string name=\"dialog_message_uploading_media\">Pošiljanje…</string>\n    <string name=\"dialog_download_image\">Prejmi</string>\n    <string name=\"dialog_message_cancel_follow_request\">Želite preklicati to zahtevo?</string>\n    <string name=\"dialog_unfollow_warning\">Prenehajte slediti temu računu?</string>\n    <string name=\"dialog_delete_post_warning\">Želite izbrisati ta tut?</string>\n    <string name=\"visibility_public\">Javno: Objavi v javnih časovnicah</string>\n    <string name=\"visibility_unlisted\">Ni prikazano: Ne prikaže v javnih časovnicah</string>\n    <string name=\"visibility_private\">Samo sledilci: Objavi samo sledilcem</string>\n    <string name=\"visibility_direct\">Neposredno: Objavi samo pri omenjenih uporabnikih</string>\n    <string name=\"pref_title_edit_notification_settings\">Obvestila</string>\n    <string name=\"pref_title_notifications_enabled\">Obvestila</string>\n    <string name=\"pref_title_notification_alerts\">Opozorila</string>\n    <string name=\"pref_title_notification_alert_sound\">Obvesti z zvokom</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Obvesti z vibracijo</string>\n    <string name=\"pref_title_notification_alert_light\">Obvesti s svetlobo</string>\n    <string name=\"pref_title_notification_filters\">Obvesti me, ko</string>\n    <string name=\"pref_title_appearance_settings\">Videz</string>\n    <string name=\"pref_title_app_theme\">Tema aplikacije</string>\n    <string name=\"pref_title_timelines\">Časovnice</string>\n    <string name=\"pref_title_timeline_filters\">Filtri</string>\n    <string name=\"pref_title_browser_settings\">Brskalnik</string>\n    <string name=\"pref_title_custom_tabs\">Uporabi Chromove zavihke po meri</string>\n    <string name=\"pref_title_language\">Jezik</string>\n    <string name=\"pref_title_post_filter\">Filtriranje časovnice</string>\n    <string name=\"pref_title_post_tabs\">Zavihki</string>\n    <string name=\"pref_title_show_boosts\">Pokaži spodbude</string>\n    <string name=\"pref_title_show_replies\">Pokaži odgovore</string>\n    <string name=\"pref_title_show_media_preview\">Prenesi predoglede medijev</string>\n    <string name=\"pref_title_proxy_settings\">Posredniški strežnik</string>\n    <string name=\"pref_title_http_proxy_settings\">Pos. strž. HTTP</string>\n    <string name=\"pref_title_http_proxy_enable\">Omogoči pos. strž. HTTP</string>\n    <string name=\"pref_title_http_proxy_server\">Pos. strž HTTP</string>\n    <string name=\"pref_title_http_proxy_port\">Vrata pos. strž. HTTP</string>\n    <string name=\"pref_default_post_privacy\">Privzeta zasebnost objave</string>\n    <string name=\"pref_default_media_sensitivity\">Vedno označite medije kot občutljive</string>\n    <string name=\"pref_publishing\">Objavljanje (sinhronizirano s strežnikom)</string>\n    <string name=\"pref_failed_to_sync\">Nastavitev ni bilo mogoče sinhronizirati</string>\n    <string name=\"pref_post_text_size\">Velikost besedila statusa</string>\n    <string name=\"notification_mention_name\">Nove omembe</string>\n    <string name=\"notification_mention_descriptions\">Obvestila o novih omembah</string>\n    <string name=\"notification_follow_name\">Novi sledilci</string>\n    <string name=\"notification_follow_description\">Obvestila o novih sledilcih</string>\n    <string name=\"notification_boost_name\">Spodbude</string>\n    <string name=\"notification_boost_description\">Obvestila, ko so vaši tuti spodbujeni</string>\n    <string name=\"notification_favourite_name\">Priljubljene</string>\n    <string name=\"notification_favourite_description\">Obvestila, ko so vaši tuti vzljubljeni</string>\n    <string name=\"notification_mention_format\">%1$s vas je omenil-a</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s in %4$d ostali</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s in %3$s</string>\n    <string name=\"notification_summary_small\">%1$s in %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\"/>\n        <item quantity=\"two\"/>\n        <item quantity=\"few\"/>\n        <item quantity=\"other\">%1$d novih interakcij</item>\n    </plurals>\n    <string name=\"description_account_locked\">Zaklenjen račun</string>\n    <string name=\"about_title_activity\">O aplikaciji</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_tusky_license\">Tusky je prosta in odprtokodna programska oprema. Licencirana je pod licenco GNU General Public License različice 3. Licenco si lahko ogledate tukaj: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <string name=\"about_project_site\">Spletna stran projekta:\n\\nhttps://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Poročila o napakah in želje za nove funkcije:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Profil Tusky</string>\n    <string name=\"post_share_content\">Deli vsebino tuta</string>\n    <string name=\"post_share_link\">Deli povezavo do tuta</string>\n    <string name=\"post_media_images\">Slike</string>\n    <string name=\"post_media_video\">Video</string>\n    <string name=\"state_follow_requested\">Prošnja za sledenje</string>\n    <string name=\"abbreviated_in_years\">v %1$dy</string>\n    <string name=\"abbreviated_in_days\">v %1$dd</string>\n    <string name=\"abbreviated_in_hours\">v %1$dh</string>\n    <string name=\"abbreviated_in_minutes\">in %1$dm</string>\n    <string name=\"abbreviated_in_seconds\">v %1$ds</string>\n    <string name=\"abbreviated_years_ago\">%1$dy</string>\n    <string name=\"abbreviated_days_ago\">%1$dd</string>\n    <string name=\"abbreviated_hours_ago\">%1$dh</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"follows_you\">Vam sledi</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Vedno prikaži občutljivo vsebino</string>\n    <string name=\"title_media\">Mediji</string>\n    <string name=\"replying_to\">Odgovori @%1$s</string>\n    <string name=\"load_more_placeholder_text\">naloži več</string>\n    <string name=\"pref_title_public_filter_keywords\">Javne časovnice</string>\n    <string name=\"pref_title_thread_filter_keywords\">Pogovori</string>\n    <string name=\"filter_addition_title\">Dodaj filter</string>\n    <string name=\"filter_edit_title\">Uredi filter</string>\n    <string name=\"filter_dialog_remove_button\">Odstrani</string>\n    <string name=\"filter_dialog_update_button\">Posodobi</string>\n    <string name=\"filter_add_description\">Filtriraj frazo</string>\n    <string name=\"add_account_name\">Dodaj račun</string>\n    <string name=\"add_account_description\">Dodaj nov Mastodon račun</string>\n    <string name=\"action_lists\">Seznami</string>\n    <string name=\"title_lists\">Seznami</string>\n    <string name=\"error_create_list\">Seznama ni bilo mogoče ustvariti</string>\n    <string name=\"error_rename_list\">Seznama ni bilo mogoče preimenovati</string>\n    <string name=\"error_delete_list\">Seznama ni bilo mogoče izbrisati</string>\n    <string name=\"action_create_list\">Ustvari seznam</string>\n    <string name=\"action_rename_list\">Preimenuj seznam</string>\n    <string name=\"action_delete_list\">Izbriši seznam</string>\n    <string name=\"hint_search_people_list\">Poiščite osebe, katerim sledite</string>\n    <string name=\"action_add_to_list\">Dodaj račun na seznam</string>\n    <string name=\"action_remove_from_list\">Odstrani račun iz seznama</string>\n    <string name=\"compose_active_account_description\">Objavljanje z računom %1$s</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\"/>\n        <item quantity=\"two\"/>\n        <item quantity=\"few\"/>\n        <item quantity=\"other\">Opišite za slabovidne\n\\n(omejitev znakov - %1$d)</item>\n    </plurals>\n    <string name=\"action_set_caption\">Nastavi opis</string>\n    <string name=\"action_remove\">Odstrani</string>\n    <string name=\"lock_account_label\">Zakleni račun</string>\n    <string name=\"lock_account_label_description\">Zahtevana je ročna potrditev sledilcev</string>\n    <string name=\"compose_save_draft\">Shrani osnutek?</string>\n    <string name=\"send_post_notification_title\">Pošiljanje tuta…</string>\n    <string name=\"send_post_notification_error_title\">napaka pri pošiljanju tuta</string>\n    <string name=\"send_post_notification_channel_name\">Pošiljanje tutov</string>\n    <string name=\"send_post_notification_cancel_title\">Pošiljanje je preklicano</string>\n    <string name=\"send_post_notification_saved_content\">Kopija tuta je bila shranjena v osnutke</string>\n    <string name=\"action_compose_shortcut\">Sestavi</string>\n    <string name=\"error_no_custom_emojis\">Vaše vozlišče %1$s nima emotikonov po meri</string>\n    <string name=\"emoji_style\">Slog emotikonov</string>\n    <string name=\"system_default\">Privzete nastavitve sistema</string>\n    <string name=\"download_fonts\">Najprej boste morali prenesti te emotikone</string>\n    <string name=\"performing_lookup_title\">Izvajanje iskanja…</string>\n    <string name=\"expand_collapse_all_posts\">Razširi/Strni vse statuse</string>\n    <string name=\"action_open_post\">Odpri tut</string>\n    <string name=\"restart_required\">Potreben je ponovni zagon aplikacije</string>\n    <string name=\"restart_emoji\">Če želite uveljaviti te spremembe, morate znova zagnati Tusky</string>\n    <string name=\"later\">Kasneje</string>\n    <string name=\"restart\">Znova zaženi</string>\n    <string name=\"caption_systememoji\">Privzeti komplet emotikonov vaše naprave</string>\n    <string name=\"caption_blobmoji\">Blob emotikoni so znani od Android 4.4-7.1</string>\n    <string name=\"caption_twemoji\">Mastodonov privzeti komplet emotikonov</string>\n    <string name=\"download_failed\">Prenos ni uspel</string>\n    <string name=\"profile_badge_bot_text\">Robot</string>\n    <string name=\"account_moved_description\">%1$s se je prestavil/a na:</string>\n    <string name=\"reblog_private\">Spodbudi izvirnemu občinstvu</string>\n    <string name=\"unreblog_private\">Prekini spodbudo</string>\n    <string name=\"license_description\">Tusky vsebuje kodo in sredstva iz naslednjih odprtokodnih projektov:</string>\n    <string name=\"license_apache_2\">Licencirano pod licenco Apache (spodaj)</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">Metapodatki profila</string>\n    <string name=\"profile_metadata_add\">dodaj podatke</string>\n    <string name=\"profile_metadata_label_label\">Oznaka</string>\n    <string name=\"profile_metadata_content_label\">Vsebina</string>\n    <string name=\"pref_title_absolute_time\">Uporabite absolutni čas</string>\n    <string name=\"label_remote_account\">Spodnje informacije lahko nepopolno odražajo profil uporabnika. Pritisnite, da odprete polni profil v brskalniku.</string>\n    <string name=\"unpin_action\">Odpni</string>\n    <string name=\"pin_action\">Pripni</string>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> Spodbuda</item>\n        <item quantity=\"two\"><b>%1$s</b> Spodbudi</item>\n        <item quantity=\"few\"><b>%1$s</b> Spodbude</item>\n        <item quantity=\"other\"><b>%1$s</b> Spodbud</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">Spodbudil/a</string>\n    <string name=\"title_favourited_by\">Vzljubil/a</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s in %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s in %3$d več</string>\n    <string name=\"description_post_media\">Mediji: %1$s</string>\n    <string name=\"description_post_cw\">Opozorila o vsebini: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Brez opisa</string>\n    <string name=\"description_post_reblogged\">Ponovno objavljen</string>\n    <string name=\"description_post_favourited\">Priljubljene</string>\n    <string name=\"description_visibility_public\">Javno</string>\n    <string name=\"description_visibility_unlisted\">Ni prikazano</string>\n    <string name=\"description_visibility_private\">Sledilci</string>\n    <string name=\"description_visibility_direct\">Neposredno</string>\n    <string name=\"hint_list_name\">Ime seznama</string>\n    <string name=\"pick_hashtag_hint\">Ključnik brez #</string>\n    <string name=\"notifications_clear\">Počisti</string>\n    <string name=\"notifications_apply_filter\">Filter</string>\n    <string name=\"filter_apply\">Uporabi</string>\n    <string name=\"compose_shortcut_long_label\">Sestavi tut</string>\n    <string name=\"compose_shortcut_short_label\">Sestavi</string>\n    <string name=\"pref_title_bot_overlay\">Prikaži kazalnik za robote</string>\n    <string name=\"notification_clear_text\">Ali ste prepričani, da želite trajno izbrisati vsa obvestila?</string>\n    <string name=\"action_delete_and_redraft\">Izbriši in preoblikuj</string>\n    <string name=\"dialog_redraft_post_warning\">Izbriši in preoblikuj tut?</string>\n    <string name=\"poll_info_format\"> <!-- 15 votes • 1 hour left --> %1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s glas</item>\n        <item quantity=\"two\">%1$s glasova</item>\n        <item quantity=\"few\">%1$s glasovi</item>\n        <item quantity=\"other\">%1$s glasov</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">se konča ob %1$s</string>\n    <string name=\"poll_info_closed\">zaprto</string>\n    <string name=\"poll_vote\">Glasovanje</string>\n    <string name=\"app_them_dark\">Temna</string>\n    <string name=\"app_theme_light\">Svetla</string>\n    <string name=\"app_theme_black\">Črna</string>\n    <string name=\"app_theme_auto\">Samodejno ob sončnem zahodu</string>\n    <string name=\"app_theme_system\">Uporabi sistemsko temo</string>\n    <string name=\"post_privacy_public\">Javno</string>\n    <string name=\"post_privacy_unlisted\">Ni prikazano</string>\n    <string name=\"post_privacy_followers_only\">Samo za sledilce</string>\n    <string name=\"post_text_size_smallest\">Najmanjša</string>\n    <string name=\"post_text_size_small\">Majhna</string>\n    <string name=\"post_text_size_medium\">Srednja</string>\n    <string name=\"post_text_size_large\">Velika</string>\n    <string name=\"post_text_size_largest\">Največja</string>\n    <string name=\"notification_poll_name\">Ankete</string>\n    <string name=\"notification_poll_description\">Obvestilo o anketah, ki so se končale</string>\n    <string name=\"compose_preview_image_description\">Dejanje za sliko %1$s</string>\n    <string name=\"poll_ended_voted\">Anketa, na kateri ste glasovali, se je končala</string>\n    <string name=\"poll_ended_created\">Anketa, ki ste jo ustvarili, se je končala</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">še %1$d dan</item>\n        <item quantity=\"two\">še %1$d dni</item>\n        <item quantity=\"few\">še %1$d dni</item>\n        <item quantity=\"other\">še %1$d dni</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">še %1$d ura</item>\n        <item quantity=\"two\">še %1$d uri</item>\n        <item quantity=\"few\">še %1$d ure</item>\n        <item quantity=\"other\">še %1$d ur</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">še %1$d minuta</item>\n        <item quantity=\"two\">še %1$d minuti</item>\n        <item quantity=\"few\">še %1$d minute</item>\n        <item quantity=\"other\">še %1$d minut</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d sekunda</item>\n        <item quantity=\"two\">%1$d sekundi</item>\n        <item quantity=\"few\">%1$d sekunde</item>\n        <item quantity=\"other\">%1$d sekund</item>\n    </plurals>\n    <string name=\"pref_title_animate_gif_avatars\">Animirane podobe GIF</string>\n    <string name=\"description_poll\">Anketa z izbiro: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"caption_notoemoji\">Googlovi trenutni emotikoni</string>\n    <string name=\"button_continue\">Nadaljuj</string>\n    <string name=\"button_back\">Nazaj</string>\n    <string name=\"button_done\">Končano</string>\n    <string name=\"report_sent_success\">\\@%1$s je uspešno prijavljen</string>\n    <string name=\"hint_additional_info\">Dodatni komentarji</string>\n    <string name=\"report_remote_instance\">Posreduj %1$s</string>\n    <string name=\"failed_report\">Prijava je bila neuspešna</string>\n    <string name=\"failed_fetch_posts\">Statusov ni bilo mogoče pridobiti</string>\n    <string name=\"report_description_1\">Poročilo bo poslano moderatorju strežnika. Spodaj lahko navedete, zakaj prijavljate ta račun:</string>\n    <string name=\"report_description_remote_instance\">Račun je iz drugega strežnika. Pošljem anonimno kopijo poročila tudi na drugi strežnik?</string>\n    <string name=\"title_domain_mutes\">Skrite domene</string>\n    <string name=\"action_view_domain_mutes\">Skrite domene</string>\n    <string name=\"action_mute_domain\">Utišaj %1$s</string>\n    <string name=\"confirmation_domain_unmuted\">Domena %1$s odrita</string>\n    <string name=\"mute_domain_warning\">Ali ste prepričani, da želite blokirati vse iz domene %1$s? Vsebine iz te domene ne boste videli v nobeni javni časovnici ali v obvestilih. Vaši sledilci iz te domene bodo odstranjeni.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Skrij celotno domeno</string>\n    <string name=\"filter_dialog_whole_word\">Cela beseda</string>\n    <string name=\"filter_dialog_whole_word_description\">Če je ključna beseda ali fraza samo alfanumerična, bo uporabljena le, če se ujema s celotno besedo</string>\n    <string name=\"title_accounts\">Računi</string>\n    <string name=\"failed_search\">Iskanje je bilo neuspešno</string>\n    <string name=\"pref_title_alway_open_spoiler\">Vedno razširite tute, označene z opozorilom o vsebini</string>\n    <string name=\"action_add_poll\">Dodaj anketo</string>\n    <string name=\"create_poll_title\">Anketa</string>\n    <string name=\"duration_5_min\">5 minut</string>\n    <string name=\"duration_30_min\">30 minut</string>\n    <string name=\"duration_1_hour\">1 ura</string>\n    <string name=\"duration_6_hours\">6 ur</string>\n    <string name=\"duration_1_day\">1 dan</string>\n    <string name=\"duration_3_days\">3 dni</string>\n    <string name=\"duration_7_days\">7 dni</string>\n    <string name=\"add_poll_choice\">Dodaj izbiro</string>\n    <string name=\"poll_allow_multiple_choices\">Več izbir</string>\n    <string name=\"poll_new_choice_hint\">Izbira %1$d</string>\n    <string name=\"edit_poll\">Uredi</string>\n    <string name=\"title_scheduled_posts\">Napovedani tuti</string>\n    <string name=\"action_edit\">Uredi</string>\n    <string name=\"action_access_scheduled_posts\">Napovedani tuti</string>\n    <string name=\"action_reset_schedule\">Ponastavi</string>\n    <string name=\"action_schedule_post\">Napovej tut</string>\n    <string name=\"post_lookup_error_format\">Napaka pri iskanju objave %1$s</string>\n    <string name=\"about_powered_by_tusky\">Poganja ga Tusky</string>\n    <string name=\"post_boosted_format\">%1$s spodbudil</string>\n    <string name=\"hashtags\">Ključniki</string>\n    <string name=\"notification_follow_request_name\">Zahteve za Sledenje</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> Priljubljena</item>\n        <item quantity=\"two\"><b>%1$s</b> Priljubljeni</item>\n        <item quantity=\"few\"><b>%1$s</b> Priljubljene</item>\n        <item quantity=\"other\"><b>%1$s</b> Priljubljenih</item>\n    </plurals>\n    <string name=\"error_multimedia_size_limit\">Video in zvočne datoteke ne smejo presegati velikosti %1$s MB.</string>\n    <string name=\"error_muting_hashtag_format\">Težava pri blokiranju #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Neuspešno odkrivanje #%1$s</string>\n    <string name=\"error_following_hashtag_format\">Težava pri sledenju #%1$s</string>\n    <string name=\"error_media_upload_sending_fmt\">Nalaganje ni bilo uspešno: %1$s</string>\n    <string name=\"error_following_hashtags_unsupported\">Ta instanca ne podpira možnosti ključnikov.</string>\n    <string name=\"error_blocking_domain\">Neuspešno blokiranje %1$s: %2$s</string>\n    <string name=\"error_loading_account_details\">Nalaganje podatkov o računu ni bilo uspešno</string>\n    <string name=\"error_could_not_load_login_page\">Prijavne strani ni bilo mogoče naložiti.</string>\n    <string name=\"error_image_edit_failed\">Datoteke ni bilo možno urediti.</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-small/integer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <integer name=\"profile_media_column_count\">2</integer>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-sv/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">Ett fel har uppstått.</string>\n    <string name=\"error_network\">Ett nätverksfel uppstod. Kontrollera din anslutning och försök igen.</string>\n    <string name=\"error_empty\">Detta kan inte vara tomt.</string>\n    <string name=\"error_invalid_domain\">Ogiltig domän angiven</string>\n    <string name=\"error_failed_app_registration\">Misslyckades att autentisera med den instansen. Om detta kvarstår, försök Logga in i webbläsaren från menyn.</string>\n    <string name=\"error_no_web_browser_found\">Det gick inte att hitta en webbläsare.</string>\n    <string name=\"error_authorization_unknown\">Ett oidentifierat auktoriseringsfel inträffade. Om detta kvarstår, försök Logga in i webbläsaren från menyn.</string>\n    <string name=\"error_authorization_denied\">Auktorisering nekades. Om du är säker på att du har angett rätt referenser, prova Logga in i webbläsaren från menyn.</string>\n    <string name=\"error_retrieving_oauth_token\">Misslyckades med att hämta en inloggningstoken. Om detta kvarstår, försök Logga in i webbläsaren från menyn.</string>\n    <string name=\"error_compose_character_limit\">Inlägget är för långt!</string>\n    <string name=\"error_media_upload_type\">Den typen av fil kan inte laddas upp.</string>\n    <string name=\"error_media_upload_opening\">Den filen kunde inte öppnas.</string>\n    <string name=\"error_media_upload_permission\">Behörighet att läsa media krävs.</string>\n    <string name=\"error_media_download_permission\">Behörighet att spara media krävs.</string>\n    <string name=\"error_media_upload_image_or_video\">Bilder och videoklipp kan inte båda bifogas i samma inlägg.</string>\n    <string name=\"error_media_upload_sending\">Uppladdningen misslyckades.</string>\n    <string name=\"error_sender_account_gone\">Kunde inte posta inlägg.</string>\n    <string name=\"title_home\">Hem</string>\n    <string name=\"title_notifications\">Aviseringar</string>\n    <string name=\"title_public_local\">Lokalt</string>\n    <string name=\"title_public_federated\">Federerat</string>\n    <string name=\"title_direct_messages\">Direktmeddelanden</string>\n    <string name=\"title_tab_preferences\">Flikar</string>\n    <string name=\"title_view_thread\">Tråd</string>\n    <string name=\"title_posts\">Inlägg</string>\n    <string name=\"title_posts_with_replies\">Med svar</string>\n    <string name=\"title_posts_pinned\">Fastnålade</string>\n    <string name=\"title_follows\">Följer</string>\n    <string name=\"title_followers\">Följare</string>\n    <string name=\"title_favourites\">Favoriter</string>\n    <string name=\"title_mutes\">Tystade användare</string>\n    <string name=\"title_blocks\">Blockerade användare</string>\n    <string name=\"title_follow_requests\">Följarförfrågningar</string>\n    <string name=\"title_edit_profile\">Redigera din profil</string>\n    <string name=\"title_drafts\">Utkast</string>\n    <string name=\"title_licenses\">Licenser</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s knuffade</string>\n    <string name=\"post_sensitive_media_title\">Känsligt innehåll</string>\n    <string name=\"post_media_hidden_title\">Dold media</string>\n    <string name=\"post_sensitive_media_directions\">Tryck för att visa</string>\n    <string name=\"post_content_warning_show_more\">Visa mer</string>\n    <string name=\"post_content_warning_show_less\">Visa mindre</string>\n    <string name=\"post_content_show_more\">Expandera</string>\n    <string name=\"post_content_show_less\">Dölj</string>\n    <string name=\"message_empty\">Ingenting här.</string>\n    <string name=\"footer_empty\">Inget här. Dra ner för att uppdatera!</string>\n    <string name=\"notification_reblog_format\">%1$s puffade ditt inlägg</string>\n    <string name=\"notification_favourite_format\">%1$s favoritmarkerade ditt inlägg</string>\n    <string name=\"notification_follow_format\">%1$s följer dig</string>\n    <string name=\"report_username_format\">Rapportera @%1$s</string>\n    <string name=\"report_comment_hint\">Ytterligare kommentarer?</string>\n    <string name=\"action_quick_reply\">Snabbsvar</string>\n    <string name=\"action_reply\">Svara</string>\n    <string name=\"action_reblog\">Knuffa</string>\n    <string name=\"action_unreblog\">Ta bort knuff</string>\n    <string name=\"action_favourite\">Favorit</string>\n    <string name=\"action_unfavourite\">Ta bort favorit</string>\n    <string name=\"action_more\">Mer</string>\n    <string name=\"action_compose\">Skriv</string>\n    <string name=\"action_login\">Logga in med Tusky</string>\n    <string name=\"action_logout\">Logga ut</string>\n    <string name=\"action_logout_confirm\">Är du säker på att du vill logga ut från %1$s? Alla lokala data om kontot kommer att raderas, inklusive utkast och inställningar.</string>\n    <string name=\"action_follow\">Följ</string>\n    <string name=\"action_unfollow\">Avfölj</string>\n    <string name=\"action_block\">Blockera</string>\n    <string name=\"action_unblock\">Avblockera</string>\n    <string name=\"action_hide_reblogs\">Dölj knuffar</string>\n    <string name=\"action_show_reblogs\">Visa knuffar</string>\n    <string name=\"action_report\">Rapportera</string>\n    <string name=\"action_delete\">Radera</string>\n    <string name=\"action_send\">TOOT</string>\n    <string name=\"action_send_public\">TOOT!</string>\n    <string name=\"action_retry\">Försök igen</string>\n    <string name=\"action_close\">Stäng</string>\n    <string name=\"action_view_profile\">Profil</string>\n    <string name=\"action_view_preferences\">Inställningar</string>\n    <string name=\"action_view_account_preferences\">Kontospecifika inställningar</string>\n    <string name=\"action_view_favourites\">Favoriter</string>\n    <string name=\"action_view_mutes\">Tystade användare</string>\n    <string name=\"action_view_blocks\">Blockerade användare</string>\n    <string name=\"action_view_follow_requests\">Följarförfrågningar</string>\n    <string name=\"action_view_media\">Media</string>\n    <string name=\"action_open_in_web\">Öppna i webbläsare</string>\n    <string name=\"action_add_media\">Lägg till media</string>\n    <string name=\"action_photo_take\">Ta foto</string>\n    <string name=\"action_share\">Dela</string>\n    <string name=\"action_mute\">Tysta</string>\n    <string name=\"action_unmute\">Ta bort tystade användare</string>\n    <string name=\"action_mention\">Omnämn</string>\n    <string name=\"action_hide_media\">Dölj media</string>\n    <string name=\"action_open_drawer\">Öppna låda</string>\n    <string name=\"action_save\">Spara</string>\n    <string name=\"action_edit_profile\">Redigera profil</string>\n    <string name=\"action_edit_own_profile\">Redigera</string>\n    <string name=\"action_undo\">Ångra</string>\n    <string name=\"action_accept\">Acceptera</string>\n    <string name=\"action_reject\">Avvisa</string>\n    <string name=\"action_search\">Sök</string>\n    <string name=\"action_access_drafts\">Utkast</string>\n    <string name=\"action_toggle_visibility\">Inläggssynlighet</string>\n    <string name=\"action_content_warning\">Innehållsvarning</string>\n    <string name=\"action_emoji_keyboard\">Emoji-tangentbord</string>\n    <string name=\"action_add_tab\">Lägg till flik</string>\n    <string name=\"action_links\">Länkar</string>\n    <string name=\"action_mentions\">Omnämnanden</string>\n    <string name=\"action_hashtags\">Hashtaggar</string>\n    <string name=\"action_open_reblogger\">Öppna knuff författare</string>\n    <string name=\"action_open_reblogged_by\">Visa knuffar</string>\n    <string name=\"action_open_faved_by\">Visa favoriter</string>\n    <string name=\"title_hashtags_dialog\">Hashtaggar</string>\n    <string name=\"title_mentions_dialog\">Omnämnanden</string>\n    <string name=\"title_links_dialog\">Länkar</string>\n    <string name=\"action_open_media_n\">Öppna media #%1$d</string>\n    <string name=\"download_image\">Laddar ned %1$s</string>\n    <string name=\"action_copy_link\">Kopiera länk</string>\n    <string name=\"action_open_as\">Öppna med %1$s</string>\n    <string name=\"action_share_as\">Dela som …</string>\n    <string name=\"send_post_link_to\">Dela toot-URL till…</string>\n    <string name=\"send_post_content_to\">Dela toot till…</string>\n    <string name=\"send_media_to\">Dela media till…</string>\n    <string name=\"confirmation_reported\">Skickat!</string>\n    <string name=\"confirmation_unblocked\">Användare avblockerad</string>\n    <string name=\"confirmation_unmuted\">Användaren är inte tystad längre</string>\n    <string name=\"hint_domain\">Vilken instans?</string>\n    <string name=\"hint_compose\">Vad händer?</string>\n    <string name=\"hint_content_warning\">Innehållsvarning</string>\n    <string name=\"hint_display_name\">Visningsnamn</string>\n    <string name=\"hint_note\">Biografi</string>\n    <string name=\"hint_search\">Sök…</string>\n    <string name=\"search_no_results\">Inga resultat</string>\n    <string name=\"label_quick_reply\">Svara…</string>\n    <string name=\"label_avatar\">Profilbild</string>\n    <string name=\"label_header\">Bakgrundsbild</string>\n    <string name=\"link_whats_an_instance\">Vad är en instans?</string>\n    <string name=\"login_connection\">Ansluter…</string>\n    <string name=\"dialog_whats_an_instance\">Adressen eller domänen för varje instans kan anges här, till exempel mastodon.social, icosahedron.website, social.tchncs.de och <a href=\"https://instances.social\"> mer! </a> \n\\n \n\\nOm du inte har något konto kan du ange namnet på instansen du vill ansluta till och skapa ett konto där. \n\\n \n\\nEn instans är den plats där ditt konto finns, men du kan enkelt kommunicera med och följa andra personer på andra instanser, som om du var på samma sajt. \n\\n \n\\nMer information finns på <a href=\"https://joinmastodon.org\">joinmastodon.org</a>.</string>\n    <string name=\"dialog_title_finishing_media_upload\">Uppladdning av media</string>\n    <string name=\"dialog_message_uploading_media\">Laddar upp…</string>\n    <string name=\"dialog_download_image\">Ladda ned</string>\n    <string name=\"dialog_message_cancel_follow_request\">Återkalla följningsförfrågan?</string>\n    <string name=\"dialog_unfollow_warning\">Sluta följ detta konto?</string>\n    <string name=\"dialog_delete_post_warning\">Radera denna toot?</string>\n    <string name=\"visibility_public\">Offentlig: Skicka till offentliga tidslinjer</string>\n    <string name=\"visibility_unlisted\">Olistad: Visa inte i offentliga tidslinjer</string>\n    <string name=\"visibility_private\">Enbart-följare: Ses enbart av följare</string>\n    <string name=\"visibility_direct\">Direkt: Skicka endast till nämnda användare</string>\n    <string name=\"pref_title_edit_notification_settings\">Aviseringar</string>\n    <string name=\"pref_title_notifications_enabled\">Aviseringar</string>\n    <string name=\"pref_title_notification_alerts\">Alarm</string>\n    <string name=\"pref_title_notification_alert_sound\">Meddela med ljud</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Meddela med vibration</string>\n    <string name=\"pref_title_notification_alert_light\">Notifieringar med LED</string>\n    <string name=\"pref_title_notification_filters\">Meddela mig när</string>\n    <string name=\"pref_title_appearance_settings\">Utseende</string>\n    <string name=\"pref_title_app_theme\">Apptema</string>\n    <string name=\"pref_title_timelines\">Tidslinjer</string>\n    <string name=\"pref_title_timeline_filters\">Filter</string>\n    <string name=\"app_them_dark\">Mörkt</string>\n    <string name=\"app_theme_light\">Ljust</string>\n    <string name=\"app_theme_black\">Svart</string>\n    <string name=\"app_theme_auto\">Automatiskt vid solnedgång</string>\n    <string name=\"app_theme_system\">Använd system-tema</string>\n    <string name=\"pref_title_browser_settings\">Webbläsare</string>\n    <string name=\"pref_title_custom_tabs\">Använd Chrome-anpassade flikar</string>\n    <string name=\"pref_title_language\">Språk</string>\n    <string name=\"pref_title_post_filter\">Filtrering av tidslinje</string>\n    <string name=\"pref_title_post_tabs\">Hem tidslinje</string>\n    <string name=\"pref_title_show_boosts\">Visa knuffar</string>\n    <string name=\"pref_title_show_replies\">Visa svar</string>\n    <string name=\"pref_title_show_media_preview\">Visa en förhandsgranskning</string>\n    <string name=\"pref_title_proxy_settings\">Proxyserver</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP-proxy</string>\n    <string name=\"pref_title_http_proxy_enable\">Aktivera HTTP-proxy</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP-proxyserver</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP-proxyport</string>\n    <string name=\"pref_default_post_privacy\">Standardinställning för inlägg</string>\n    <string name=\"pref_default_media_sensitivity\">Markera alltid media som känsligt</string>\n    <string name=\"pref_publishing\">Publicering (synkroniserad med server)</string>\n    <string name=\"pref_failed_to_sync\">Misslyckades med att synkronisera inställningarna</string>\n    <string name=\"post_privacy_public\">Offentlig</string>\n    <string name=\"post_privacy_unlisted\">Olistad</string>\n    <string name=\"post_privacy_followers_only\">Endast följare</string>\n    <string name=\"pref_post_text_size\">Textstorlek på status</string>\n    <string name=\"post_text_size_smallest\">Minsta</string>\n    <string name=\"post_text_size_small\">Liten</string>\n    <string name=\"post_text_size_medium\">Mellan</string>\n    <string name=\"post_text_size_large\">Stor</string>\n    <string name=\"post_text_size_largest\">Största</string>\n    <string name=\"notification_mention_name\">Nya omnämningar</string>\n    <string name=\"notification_mention_descriptions\">Aviseringar om nya omnämnanden</string>\n    <string name=\"notification_follow_name\">Nya följare</string>\n    <string name=\"notification_follow_description\">Aviseringar på nya följare</string>\n    <string name=\"notification_boost_name\">Knuffar</string>\n    <string name=\"notification_boost_description\">Aviseringar när dina inlägg blir puffade</string>\n    <string name=\"notification_favourite_name\">Favoriter</string>\n    <string name=\"notification_favourite_description\">Aviseringar när dina inlägg blir favoritmarkerade</string>\n    <string name=\"notification_mention_format\">%1$s omnämnde dig</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s och %4$d andra</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, och %3$s</string>\n    <string name=\"notification_summary_small\">%1$s och %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d ny interaktion</item>\n        <item quantity=\"other\">%1$d nya interaktioner</item>\n    </plurals>\n    <string name=\"description_account_locked\">Låst konto</string>\n    <string name=\"about_title_activity\">Om</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_tusky_license\">Tusky är fri programvara med öppen källkod. Det är licensierat under GNU General Public License version 3. Du kan läsa mer om licensen här: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">Tuskys webbsida: https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Buggrapporter &amp; funktionsförslag:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Tuskys Profil</string>\n    <string name=\"post_share_content\">Dela innehåll av toot</string>\n    <string name=\"post_share_link\">Dela länk till toot</string>\n    <string name=\"post_media_images\">Bilder</string>\n    <string name=\"post_media_video\">Video</string>\n    <string name=\"state_follow_requested\">Följarförfrågan</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">om %1$dy</string>\n    <string name=\"abbreviated_in_days\">om %1$dd</string>\n    <string name=\"abbreviated_in_hours\">om %1$dh</string>\n    <string name=\"abbreviated_in_minutes\">om %1$dm</string>\n    <string name=\"abbreviated_in_seconds\">om %1$ds</string>\n    <string name=\"abbreviated_years_ago\">%1$dy</string>\n    <string name=\"abbreviated_days_ago\">%1$dd</string>\n    <string name=\"abbreviated_hours_ago\">%1$dh</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"follows_you\">Följer dig</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Visa alltid allt innehåll (inkl. känsligt)</string>\n    <string name=\"title_media\">Media</string>\n    <string name=\"replying_to\">Svarar till @%1$s</string>\n    <string name=\"load_more_placeholder_text\">ladda mer</string>\n    <string name=\"pref_title_public_filter_keywords\">Offentliga tidslinjer</string>\n    <string name=\"pref_title_thread_filter_keywords\">Konversationer</string>\n    <string name=\"filter_addition_title\">Lägg till filter</string>\n    <string name=\"filter_edit_title\">Redigera filter</string>\n    <string name=\"filter_dialog_remove_button\">Ta bort</string>\n    <string name=\"filter_dialog_update_button\">Uppdatera</string>\n    <string name=\"filter_add_description\">Filtrera fras</string>\n    <string name=\"add_account_name\">Lägg till konto</string>\n    <string name=\"add_account_description\">Lägg till ett nytt Mastodon-konto</string>\n    <string name=\"action_lists\">Listor</string>\n    <string name=\"title_lists\">Listor</string>\n    <string name=\"error_create_list\">Kunde inte skapa lista</string>\n    <string name=\"error_rename_list\">Kunde inte uppdatera listan</string>\n    <string name=\"error_delete_list\">Kunde inte radera lista</string>\n    <string name=\"action_create_list\">Skapa en lista</string>\n    <string name=\"action_rename_list\">Uppdatera listan</string>\n    <string name=\"action_delete_list\">Ta bort listan</string>\n    <string name=\"hint_search_people_list\">Sök efter personer du följer</string>\n    <string name=\"action_add_to_list\">Lägg till konto i listan</string>\n    <string name=\"action_remove_from_list\">Ta bort kontot från listan</string>\n    <string name=\"compose_active_account_description\">Publicerar som %1$s</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Beskriv innehåll för synskadade (max %1$d tecken)</item>\n        <item quantity=\"other\">Beskriv innehåll för synskadade (max %1$d tecken)</item>\n    </plurals>\n    <string name=\"action_set_caption\">Ange bildtext</string>\n    <string name=\"action_remove\">Ta bort</string>\n    <string name=\"lock_account_label\">Lås konto</string>\n    <string name=\"lock_account_label_description\">Kräver att du manuellt godkänner följare</string>\n    <string name=\"compose_save_draft\">Spara utkast?</string>\n    <string name=\"send_post_notification_title\">Skickar toot…</string>\n    <string name=\"send_post_notification_error_title\">Kunde inte skicka toot</string>\n    <string name=\"send_post_notification_channel_name\">Skickar toot</string>\n    <string name=\"send_post_notification_cancel_title\">Sändning avbruten</string>\n    <string name=\"send_post_notification_saved_content\">En kopia av tooten har sparats i dina utkast</string>\n    <string name=\"action_compose_shortcut\">Skriv</string>\n    <string name=\"error_no_custom_emojis\">Din instans %1$s har inga anpassade emojis</string>\n    <string name=\"emoji_style\">Emojis</string>\n    <string name=\"system_default\">Systemstandard</string>\n    <string name=\"download_fonts\">Du behöver ladda ned dessa emojis först</string>\n    <string name=\"performing_lookup_title\">Utför sökning…</string>\n    <string name=\"expand_collapse_all_posts\">Expandera/Dölj alla statusar</string>\n    <string name=\"action_open_post\">Öppna toot</string>\n    <string name=\"restart_required\">Omstart av appen krävs</string>\n    <string name=\"restart_emoji\">Du måste starta om Tusky för att tillämpa ändringarna</string>\n    <string name=\"later\">Senare</string>\n    <string name=\"restart\">Starta om</string>\n    <string name=\"caption_systememoji\">Standard-emojis för din enhet</string>\n    <string name=\"caption_blobmoji\">Emojis baserade på The Blob emojis från Android 4.4–7.1</string>\n    <string name=\"caption_twemoji\">Mastodon\\'s standard emojis</string>\n    <string name=\"download_failed\">Nedladdning misslyckad</string>\n    <string name=\"profile_badge_bot_text\">Robot</string>\n    <string name=\"account_moved_description\">%1$s har flyttat till:</string>\n    <string name=\"reblog_private\">Knuffa till ursprunglig målgrupp</string>\n    <string name=\"unreblog_private\">Ta bort knuff</string>\n    <string name=\"license_description\">Tusky innehåller kod och tillgångar från följande öppen källkodsprojekt:</string>\n    <string name=\"license_apache_2\">Licensierad under the Apache License (kopia nedanför)</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">Profil-metadata</string>\n    <string name=\"profile_metadata_add\">Spara ändringar</string>\n    <string name=\"profile_metadata_label_label\">Etikett</string>\n    <string name=\"profile_metadata_content_label\">Innehåll</string>\n    <string name=\"pref_title_absolute_time\">Använd absolut tid</string>\n    <string name=\"label_remote_account\">Information nedan kan visa en inkomplett profil. Tryck för att öppna profilen i webbläsaren.</string>\n    <string name=\"unpin_action\">Ta bort nål</string>\n    <string name=\"pin_action\">Nåla fast</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> Favorit</item>\n        <item quantity=\"other\"><b>%1$s</b> Favoriter</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> Knuff</item>\n        <item quantity=\"other\"><b>%1$s</b> Knuffar</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">Knuffad av</string>\n    <string name=\"title_favourited_by\">Favoritmarkerad av</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s och %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s och %3$d mer</string>\n    <string name=\"description_post_media\">Media: %1$s</string>\n    <string name=\"description_post_cw\">Innehållsvarning: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Ingen beskrivning</string>\n    <string name=\"description_post_reblogged\">Knuffad</string>\n    <string name=\"description_post_favourited\">Favoritmarkerat</string>\n    <string name=\"description_visibility_public\">Publik</string>\n    <string name=\"description_visibility_unlisted\">Olistad</string>\n    <string name=\"description_visibility_private\">Följare</string>\n    <string name=\"description_visibility_direct\">Direkt</string>\n    <string name=\"hint_list_name\">Listnamn</string>\n    <string name=\"download_media\">Ladda ned media</string>\n    <string name=\"downloading_media\">Laddar ned media</string>\n    <string name=\"pick_hashtag_hint\">Hashtag utan #</string>\n    <string name=\"compose_shortcut_long_label\">Skriv inlägg</string>\n    <string name=\"compose_shortcut_short_label\">Skriv</string>\n    <string name=\"notifications_clear\">Radera</string>\n    <string name=\"notifications_apply_filter\">Filtrera</string>\n    <string name=\"filter_apply\">Utför</string>\n    <string name=\"pref_title_bot_overlay\">Visa robotindikator</string>\n    <string name=\"notification_clear_text\">Är du säker på att du vill rensa dina aviseringar permanent?</string>\n    <string name=\"action_delete_and_redraft\">Radera och skriv på nytt</string>\n    <string name=\"dialog_redraft_post_warning\">Radera och skriv ny toot?</string>\n    <string name=\"poll_info_format\"> <!-- 15 röster • 1 timme kvar --> %1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s röst</item>\n        <item quantity=\"other\">%1$s röster</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">avslutas vid %1$s</string>\n    <string name=\"poll_info_closed\">stängd</string>\n    <string name=\"poll_vote\">Rösta</string>\n    <string name=\"notification_poll_name\">Omröstningar</string>\n    <string name=\"notification_poll_description\">Aviseringar när omröstningar har avslutats</string>\n    <string name=\"poll_ended_voted\">En omröstning där du har röstat är avslutad</string>\n    <string name=\"poll_ended_created\">En omröstning som du har skapat har avslutats</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d dag kvar</item>\n        <item quantity=\"other\">%1$d dagar kvar</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d timme kvar</item>\n        <item quantity=\"other\">%1$d timmar kvar</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d minut kvar</item>\n        <item quantity=\"other\">%1$d minuter kvar</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d sekund kvar</item>\n        <item quantity=\"other\">%1$d sekunder kvar</item>\n    </plurals>\n    <string name=\"compose_preview_image_description\">Åtgärder för bild %1$s</string>\n    <string name=\"pref_title_animate_gif_avatars\">Animera profil gifar</string>\n    <string name=\"description_poll\">Omröstning med valen: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"title_domain_mutes\">Dolda domäner</string>\n    <string name=\"action_view_domain_mutes\">Dolda domäner</string>\n    <string name=\"action_mute_domain\">Tysta %1$s</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s inte tystad längre</string>\n    <string name=\"mute_domain_warning\">Är du säker på att du vill blockera allt från %1$s? Du kommer inte kunna se något innehåll från denna domän i publika tidslinjer eller i dina notifieringar. Dina följare på domänen kommer inte att bli borttagna.</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Dölj hela domänen</string>\n    <string name=\"caption_notoemoji\">Google\\'s nuvarande emojis</string>\n    <string name=\"button_continue\">Fortsätt</string>\n    <string name=\"button_back\">Tillbaka</string>\n    <string name=\"button_done\">Klar</string>\n    <string name=\"report_sent_success\">Anmälan av @%1$s har lyckats</string>\n    <string name=\"hint_additional_info\">Ytterligare kommentarer</string>\n    <string name=\"report_remote_instance\">Vidarebefordra till %1$s</string>\n    <string name=\"failed_report\">Misslyckades att anmäla</string>\n    <string name=\"failed_fetch_posts\">Misslyckades att hämta status</string>\n    <string name=\"report_description_1\">Anmälan kommer att skickas till din servermoderator. Du kan beskriva varför du anmäler kontot nedan:</string>\n    <string name=\"report_description_remote_instance\">Kontot är från en annan server. Skicka en anonym kopia av anmälan dit också?</string>\n    <string name=\"filter_dialog_whole_word\">Helt ord</string>\n    <string name=\"filter_dialog_whole_word_description\">När nyckelordet eller frasen enbart är alfanumerisk, appliceras den om den matchar hela ordet</string>\n    <string name=\"pref_title_alway_open_spoiler\">Expandera alltid inlägg med innehållsvarningar</string>\n    <string name=\"title_accounts\">Konton</string>\n    <string name=\"failed_search\">Sökning misslyckades</string>\n    <string name=\"action_add_poll\">Skapa en omröstning</string>\n    <string name=\"create_poll_title\">Omröstning</string>\n    <string name=\"duration_5_min\">5 minuter</string>\n    <string name=\"duration_30_min\">30 minuter</string>\n    <string name=\"duration_1_hour\">1 timme</string>\n    <string name=\"duration_6_hours\">6 timmar</string>\n    <string name=\"duration_1_day\">1 dag</string>\n    <string name=\"duration_3_days\">3 dagar</string>\n    <string name=\"duration_7_days\">7 dagar</string>\n    <string name=\"add_poll_choice\">Lägg till alternativ</string>\n    <string name=\"poll_allow_multiple_choices\">Flerval</string>\n    <string name=\"poll_new_choice_hint\">Val %1$d</string>\n    <string name=\"edit_poll\">Redigera</string>\n    <string name=\"title_scheduled_posts\">Schemalagda toots</string>\n    <string name=\"action_edit\">Redigera</string>\n    <string name=\"action_access_scheduled_posts\">Schemalagda toots</string>\n    <string name=\"action_schedule_post\">Schemalägg toot</string>\n    <string name=\"action_reset_schedule\">Återställ</string>\n    <string name=\"post_lookup_error_format\">Fel vid uppslagning av status %1$s</string>\n    <string name=\"title_bookmarks\">Bokmärken</string>\n    <string name=\"action_bookmark\">Bokmärk</string>\n    <string name=\"action_view_bookmarks\">Bokmärken</string>\n    <string name=\"about_powered_by_tusky\">Drivs av Tusky</string>\n    <string name=\"description_post_bookmarked\">Bokmärkt</string>\n    <string name=\"select_list_title\">Välj lista</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"no_scheduled_posts\">Du har inga schemalagda statusar.</string>\n    <string name=\"no_drafts\">Du har inga utkast.</string>\n    <string name=\"warning_scheduling_interval\">Mastodon har ett minimalt schemaläggningsintervall på 5 minuter.</string>\n    <string name=\"action_mute_conversation\">Tysta konversation</string>\n    <string name=\"pref_title_confirm_reblogs\">Visa bekräftelse innan knuff</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Visa förhandsvisning av länkar i tidslinjen</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Aktivera sveprörelser för att växla mellan flikar</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s person</item>\n        <item quantity=\"other\">%1$s personer</item>\n    </plurals>\n    <string name=\"notification_follow_request_description\">Aviseringar om följarförfrågningar</string>\n    <string name=\"notification_follow_request_name\">Följförfrågningar</string>\n    <string name=\"dialog_mute_warning\">Tysta @%1$s?</string>\n    <string name=\"dialog_block_warning\">Blockera @%1$s?</string>\n    <string name=\"action_unmute_conversation\">Aktivera ljud på konversation</string>\n    <string name=\"notification_follow_request_format\">%1$s vill följa dig</string>\n    <string name=\"add_hashtag_title\">Lägg till hashtag</string>\n    <string name=\"hashtags\">Hashtaggar</string>\n    <string name=\"pref_main_nav_position_option_top\">Topp</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Botten</string>\n    <string name=\"pref_main_nav_position\">Standard navigationsposition</string>\n    <string name=\"pref_title_gradient_for_media\">Visa färgglada gradienter för gömd media</string>\n    <string name=\"action_unmute_domain\">Ta bort tystad %1$s</string>\n    <string name=\"action_unmute_desc\">Ta bort tystad %1$s</string>\n    <string name=\"pref_title_hide_top_toolbar\">Dölj titeln i övre verktygsfältet</string>\n    <string name=\"dialog_mute_hide_notifications\">Dölj aviseringar</string>\n    <string name=\"account_note_saved\">Sparat!</string>\n    <string name=\"account_note_hint\">Din privata notering om detta kontot</string>\n    <string name=\"no_announcements\">Det finns inga meddelanden.</string>\n    <string name=\"title_announcements\">Meddelanden</string>\n    <string name=\"notification_subscription_description\">Aviseringar när någon du följer skrivit ett nytt inlägg</string>\n    <string name=\"notification_subscription_name\">Nya inlägg</string>\n    <string name=\"notification_subscription_format\">%1$s skrev precis</string>\n    <string name=\"wellbeing_hide_stats_profile\">Dölj kvantitativ information på profiler</string>\n    <string name=\"wellbeing_hide_stats_posts\">Dölj kvantitativ information på inlägg</string>\n    <string name=\"limit_notifications\">Begränsa tidslinje aviseringar</string>\n    <string name=\"review_notifications\">Revidera aviseringar</string>\n    <string name=\"wellbeing_mode_notice\">Information som kan påverka ditt välmående kommer att döljas. Detta inkluderar:\n\\n\n\\n- Favoritmarkering-/Knuff-/Följaraviseringar\n\\n- Favoritmarkering/Antal knuffar på inlägg\n\\n- Följare/Inläggsstatistik på profiler\n\\n\n\\nPush-aviseringar påverkas inte, men du ändra dina aviseringinställningar manuellt.</string>\n    <string name=\"pref_title_wellbeing_mode\">Välmående</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Du kan inte ladda upp fler än %1$d mediebilaga.</item>\n        <item quantity=\"other\">Du kan inte ladda upp fler än %1$d mediebilagor.</item>\n    </plurals>\n    <string name=\"delete_scheduled_post_warning\">Radera detta schemalagda inlägg?</string>\n    <string name=\"instance_rule_info\">Genom att logga in accepterar du reglerna på %1$s.</string>\n    <string name=\"instance_rule_title\">%1$s regler</string>\n    <string name=\"error_unfollowing_hashtag_format\">Kunde inte avfölja #%1$s</string>\n    <string name=\"dialog_delete_conversation_warning\">Radera denna konversation?</string>\n    <string name=\"pref_show_self_username_always\">Alltid</string>\n    <string name=\"set_focus_description\">Tryck eller dra cirkeln för att välja fokuspunkten som alltid kommer synas i miniatyrbilder.</string>\n    <string name=\"label_duration\">Varaktighet</string>\n    <string name=\"duration_indefinite\">Oändligt</string>\n    <string name=\"action_unsubscribe_account\">Sluta prenumerera</string>\n    <string name=\"description_post_language\">Inläggsspråk</string>\n    <string name=\"pref_show_self_username_disambiguate\">När flera konton är inloggade</string>\n    <string name=\"pref_show_self_username_never\">Aldrig</string>\n    <string name=\"notification_sign_up_name\">Registreringar</string>\n    <string name=\"notification_sign_up_description\">Notiser om nya användare</string>\n    <string name=\"notification_update_name\">Inläggsredigeringar</string>\n    <string name=\"notification_update_description\">Notiser när inlägg du interagerat med redigerats</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"action_edit_image\">Redigera bild</string>\n    <string name=\"duration_14_days\">14 dagar</string>\n    <string name=\"duration_30_days\">30 dagar</string>\n    <string name=\"duration_60_days\">60 dagar</string>\n    <string name=\"duration_90_days\">90 dagar</string>\n    <string name=\"duration_no_change\">(Ingen ändring)</string>\n    <string name=\"pref_title_show_self_username\">Visa användarnamn i verktygsrader</string>\n    <string name=\"pref_title_confirm_favourites\">Visa bekräftelse före favoritmarkering</string>\n    <string name=\"dialog_delete_list_warning\">Vill du verkligen radera listan %1$s?</string>\n    <string name=\"drafts_post_failed_to_send\">Det här inlägget kunde inte skickas!</string>\n    <string name=\"drafts_failed_loading_reply\">Kunde inte ladda information om svar</string>\n    <string name=\"draft_deleted\">Utkast raderat</string>\n    <string name=\"drafts_post_reply_removed\">Inlägget du skrev ett utkast till svar på har raderats</string>\n    <string name=\"follow_requests_info\">Även om ditt konto inte är låst så tänker administratörerna på %1$s att du kanske ändå vill granska följförfrågan från dessa konton manuellt.</string>\n    <string name=\"action_subscribe_account\">Prenumerera</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Skriv inlägg</string>\n    <string name=\"account_date_joined\">Gick med i %1$s</string>\n    <string name=\"saving_draft\">Sparar utkast…</string>\n    <string name=\"error_multimedia_size_limit\">Video- och ljudfiler kan inte överskrida %1$s MB i storlek.</string>\n    <string name=\"error_image_edit_failed\">Bilden kunde inte redigeras.</string>\n    <string name=\"duration_365_days\">365 dagar</string>\n    <string name=\"duration_180_days\">180 dagar</string>\n    <string name=\"action_set_focus\">Sätt fokuspunkt</string>\n    <string name=\"error_following_hashtag_format\">Kunde inte följa #%1$s</string>\n    <string name=\"notification_sign_up_format\">%1$s registrerade sig</string>\n    <string name=\"notification_update_format\">%1$s redigerade sitt inlägg</string>\n    <string name=\"action_unbookmark\">Ta bort bokmärke</string>\n    <string name=\"action_delete_conversation\">Radera konversation</string>\n    <string name=\"pref_title_animate_custom_emojis\">Animera skräddarsydda emojis</string>\n    <string name=\"post_media_audio\">Ljud</string>\n    <string name=\"post_media_attachments\">Bilagor</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"action_dismiss\">Avvisa</string>\n    <string name=\"action_details\">Detaljer</string>\n    <string name=\"error_loading_account_details\">Kunde inte ladda kontodetaljer</string>\n    <string name=\"title_login\">Logga in</string>\n    <string name=\"error_could_not_load_login_page\">Kunde inte ladda inloggningssidan.</string>\n    <string name=\"compose_save_draft_loses_media\">Spara utkast? (Bilagor kommer att laddas upp igen när du återställer utkastet.)</string>\n    <string name=\"failed_to_pin\">Kunde inte fästa</string>\n    <string name=\"failed_to_unpin\">Kunde inte lossa</string>\n    <string name=\"action_add_reaction\">lägg till reaktion</string>\n    <string name=\"report_category_violation\">Regelbrott</string>\n    <string name=\"action_add_or_remove_from_list\">Lägg till eller ta bort från lista</string>\n    <string name=\"failed_to_add_to_list\">Kunde inte lägga till kontot till listan</string>\n    <string name=\"failed_to_remove_from_list\">Kunde inte ta bort kontot från listan</string>\n    <string name=\"no_lists\">Du har inga listor.</string>\n    <string name=\"action_unfollow_hashtag_format\">Sluta följa #%1$s?</string>\n    <string name=\"status_created_at_now\">nu</string>\n    <string name=\"notification_report_format\">Ny rapport för %1$s</string>\n    <string name=\"notification_header_report_format\">%1$s rapporterade %2$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d inlägg bifogade</string>\n    <string name=\"confirmation_hashtag_unfollowed\">#%1$s avföljd</string>\n    <string name=\"notification_report_name\">Rapporter</string>\n    <string name=\"notification_report_description\">Aviseringar om modereringsrapporter</string>\n    <string name=\"report_category_spam\">Skräppost</string>\n    <string name=\"report_category_other\">Annat</string>\n    <string name=\"error_following_hashtags_unsupported\">Den här servern har inte stöd för att följa hashtaggar.</string>\n    <string name=\"title_followed_hashtags\">Följda hashtaggar</string>\n    <string name=\"pref_default_post_language\">Standardspråk för inlägg</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"description_post_edited\">Redigerade</string>\n    <string name=\"post_edited\">Redigerade %1$s</string>\n    <string name=\"error_muting_hashtag_format\">Kunde inte tysta #%1$s, fel uppstod</string>\n    <string name=\"error_unmuting_hashtag_format\">Kunde inte avtysta #%1$s, fel uppstod</string>\n    <string name=\"hint_media_description_missing\">Media bör ha en beskrivning.</string>\n    <string name=\"pref_title_http_proxy_port_message\">Portnummer bör vara mellan %1$d och %2$d</string>\n    <string name=\"error_status_source_load\">Kunde inte ladda status från servern.</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"a11y_label_loading_thread\">Laddar tråd</string>\n    <string name=\"mute_notifications_switch\">Tysta notiser</string>\n    <string name=\"title_edits\">Redigeringar</string>\n    <string name=\"status_edit_info\">%1$s redigerade</string>\n    <string name=\"action_share_account_link\">Dela länk med konto</string>\n    <string name=\"action_share_account_username\">Dela användarnamn för konto</string>\n    <string name=\"send_account_link_to\">Dela konto-URL med…</string>\n    <string name=\"send_account_username_to\">Dela kontots användarnamn med…</string>\n    <string name=\"account_username_copied\">Kopierade användarnamn</string>\n    <string name=\"status_created_info\">%1$s skapade</string>\n    <string name=\"action_discard\">Förkasta ändringar</string>\n    <string name=\"action_continue_edit\">Fortsätt redigera</string>\n    <string name=\"compose_unsaved_changes\">Du har ändringar som inte sparats.</string>\n    <string name=\"action_post_failed\">Uppladdning misslyckades</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Ett fel inträffade när inlägget skulle laddas upp och har sparats till utkast.\n\\n\n\\nAntingen kunde servern inte kontaktas, eller så nekades uppladdningen.</item>\n        <item quantity=\"other\">Uppladdning av dina inlägg misslyckades och de har sparats i utkast.\n\\n\n\\nAntingen kunde inte servern nås eller så har uppladdningen nekats.</item>\n    </plurals>\n    <string name=\"action_post_failed_show_drafts\">Visa utkast</string>\n    <string name=\"action_browser_login\">Inloggning via webbläsaren</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Inaktiverad</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;ej angiven&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;felaktig&gt;</string>\n    <string name=\"action_post_failed_do_nothing\">Avbryt</string>\n    <string name=\"description_login\">Fungerar i de flesta fallen. Ingen information läcker till andra applikationer.</string>\n    <string name=\"pref_reading_order_oldest_first\">Äldsta först</string>\n    <string name=\"pref_reading_order_newest_first\">Nyaste först</string>\n    <string name=\"dialog_follow_hashtag_title\">Följ hashtagg</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d personer pratar om hashtagg %2$s</string>\n    <string name=\"total_usage\">Total användning</string>\n    <string name=\"total_accounts\">Totala konton</string>\n    <string name=\"post_media_image\">Bild</string>\n    <string name=\"description_browser_login\">Kan stödja ytterligare autentiseringsmetoder, men kräver en webbläsare som stöds.</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"filter_keyword_addition_title\">Lägg till nyckelord</string>\n    <string name=\"filter_edit_keyword_title\">Redigera nyckelord</string>\n    <string name=\"notification_unknown_name\">Okänd</string>\n    <string name=\"socket_timeout_exception\">Att kontakta din server tog för lång tid</string>\n    <string name=\"ui_error_unknown\">okänd anledning</string>\n    <string name=\"ui_success_accepted_follow_request\">Följ begäran accepterad</string>\n    <string name=\"ui_success_rejected_follow_request\">Följ begäran blockerad</string>\n    <string name=\"select_list_manage\">Hantera listor</string>\n    <string name=\"status_filtered_show_anyway\">Visa allafall</string>\n    <string name=\"status_filter_placeholder_label_format\">Filtrerad: %1$s</string>\n    <string name=\"pref_title_account_filter_keywords\">Profiler</string>\n    <string name=\"label_filter_action\">Filteråtgärd</string>\n    <string name=\"label_filter_keywords\">Nyckelord eller fraser att filtrera</string>\n    <string name=\"pref_title_show_stat_inline\">Visa post statistik i tidslinje</string>\n    <string name=\"hint_filter_title\">Mitt filter</string>\n    <string name=\"label_filter_title\">Titel</string>\n    <string name=\"filter_action_warn\">Varna</string>\n    <string name=\"filter_action_hide\">Dölj</string>\n    <string name=\"filter_description_warn\">Dölj med en varning</string>\n    <string name=\"filter_description_hide\">Dölj helt</string>\n    <string name=\"action_add\">Lägg till</string>\n    <string name=\"filter_keyword_display_format\">%1$s (helt ord)</string>\n    <string name=\"help_empty_home\">Detta är din <b>hemtidslinje</b>. Den visar de senaste inläggen för konton du följer. \n\\n \n\\nFör att utforska konton kan du antingen upptäcka dem i någon av de andra tidslinjerna. Till exempel den lokala tidslinjen för din instans {{group}}. Eller så kan du söka efter dem efter namn [ikonics gmd_search]; sök till exempel efter Tusky för att hitta vårt Mastodon-konto.</string>\n    <string name=\"pref_ui_text_size\">UI textstorlek</string>\n    <string name=\"notification_listenable_worker_name\">Bakgrundsaktivitet</string>\n    <string name=\"notification_listenable_worker_description\">Aviseringar när Tusky arbetar i bakgrunden</string>\n    <string name=\"notification_notification_worker\">Hämtar aviseringar…</string>\n    <string name=\"notification_prune_cache\">Cacheunderhåll…</string>\n    <string name=\"action_refresh\">Uppdatera</string>\n    <string name=\"ui_error_reblog\">Att knuffa inlägg misslyckades: %1$s</string>\n    <string name=\"ui_error_vote\">Rösta i omröstning misslyckades: %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">Acceptera följarförfrågan misslyckades: %1$s</string>\n    <string name=\"pref_title_reading_order\">Läsordning</string>\n    <string name=\"ui_error_bookmark\">Att bokmärka inlägg misslyckades: %1$s</string>\n    <string name=\"ui_error_clear_notifications\">Rensing av aviseringar misslyckades: %1$s</string>\n    <string name=\"ui_error_favourite\">Att favoritmarkera inlägg misslyckades: %1$s</string>\n    <string name=\"ui_error_reject_follow_request\">Avacceptera följarförgrågan misslyckades: %1$s</string>\n    <string name=\"label_filter_context\">Filtrera sammanhang</string>\n    <string name=\"title_public_trending_hashtags\">Populära hashtaggar</string>\n    <string name=\"load_newest_notifications\">Ladda de nyaste aviseringarna</string>\n    <string name=\"compose_delete_draft\">Ta bort utkast?</string>\n    <string name=\"error_missing_edits\">Din server vet att det här inlägget har redigerats, men har ingen kopia av ändringarna, så de kan inte visas för dig. \n\\n \n\\nDet är <a href=\"https://github.com/mastodon/mastodon/issues/25398\">Mastodon problem #25398</a>.</string>\n    <string name=\"about_device_info_title\">Din enhet</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nAndroidversion: %3$s\n\\nSDK-version: %4$d</string>\n    <string name=\"about_account_info_title\">Ditt konto</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nVersion: %3$s</string>\n    <string name=\"about_copied\">Version- och enhetsinformation har kopierats</string>\n    <string name=\"about_copy\">Kopiera versions- och enhetsinformation</string>\n    <string name=\"list_exclusive_label\">Dölj på hem-tidslinjen</string>\n    <string name=\"dialog_delete_filter_positive_action\">Radera</string>\n    <string name=\"dialog_delete_filter_text\">Radera filter \\'%1$s\\'?</string>\n    <string name=\"help_empty_lists\">Här finns dina <b>listor</b>. Du kan skapa flera privata listor, och lägga till konton på dem. \n\\n \n\\n OBS att du bara kan lägga till konton på dina listor som du följer. \n\\n \n\\n De här listorna kan användas som en flik i Kontospecifika inställningar [iconics gmd_account_circle] [iconics gmd_navigate_next] Flikar. </string>\n    <string name=\"muting_hashtag_success_format\">Tystar hasttaggen #%1$s som en varning</string>\n    <string name=\"unmuting_hashtag_success_format\">Slutar tysta hashtaggen #%1$s</string>\n    <string name=\"following_hashtag_success_format\">Följer hashtaggen #%1$s</string>\n    <string name=\"unfollowing_hashtag_success_format\">Följer inte längre hashtaggen #%1$s</string>\n    <string name=\"error_media_playback\">Kunde inte spela upp: %1$s</string>\n    <string name=\"dialog_save_profile_changes_message\">Vill du spara ändringarna i din profil?</string>\n    <string name=\"help_empty_conversations\">Här finns dina <b>privata meddelanden</b>, som också kan kallas konversationer eller direktmeddelanden (DM). \\u0020\n\\n \\u0020\n\\nMeddelanden blir privata när ett inläggs synlighet {{public}} ändras till {{mail}} <i>Direkt</i>, och en eller flera användare nämns i texten. \\u0020\n\\n \\u0020\n\\nTill exempel kan du starta på ett kontos profil och trycka på skapa-knappen [iconics gmd_edit], och ändra synligheten. </string>\n    <string name=\"error_media_upload_sending_fmt\">Uppladdningen misslyckades: %1$s</string>\n    <string name=\"title_public_trending_statuses\">Populära inlägg</string>\n    <string name=\"label_image\">Bild</string>\n    <string name=\"app_theme_system_black\">Använd systemdesign (svart)</string>\n    <string name=\"action_view_filter\">Visa filtrering</string>\n    <string name=\"error_blocking_domain\">Misslyckades att tysta %1$s: %2$s</string>\n    <string name=\"error_unblocking_domain\">Misslyckades att avtysta %1$s: %2$s</string>\n    <string name=\"list_reply_policy_none\">Ingen</string>\n    <string name=\"list_reply_policy_list\">Medlemmar av listan</string>\n    <string name=\"list_reply_policy_followed\">Alla följda användare</string>\n    <string name=\"list_reply_policy_label\">Visa svar till</string>\n    <string name=\"pref_title_show_self_boosts\">Visa egna-knuffar</string>\n    <string name=\"pref_title_show_self_boosts_description\">Någon knuffar sitt egna inlägg</string>\n    <string name=\"reply_sending_long\">Ditt svar skickas.</string>\n    <string name=\"reply_sending\">Skickar…</string>\n    <string name=\"pref_title_show_notifications_filter\">Visa aviseringsfiltret</string>\n    <string name=\"pref_title_per_timeline_preferences\">Inställningar per tidslinje</string>\n    <string name=\"action_translate\">Översätt</string>\n    <string name=\"action_show_original\">Visa original</string>\n    <string name=\"label_translating\">Översätter…</string>\n    <string name=\"label_translated\">Översatt från %1$s med %2$s</string>\n    <string name=\"ui_error_translate\">Kunde inte översätta: %1$s</string>\n    <string name=\"label_expires_after\">Förfaller efter</string>\n    <string name=\"action_follow_hashtag\">Följ en ny hashtagg</string>\n    <string name=\"confirmation_hashtag_copied\">\\'#%1$s\\' kopierad</string>\n    <string name=\"url_copied\">Url kopierad</string>\n    <string name=\"dialog_follow_warning\">Följ detta konto?</string>\n    <string name=\"pref_default_reply_privacy\">Standardinställning för svar (synkas ej med server)</string>\n    <string name=\"report_category_legal\">Juridiskt</string>\n    <string name=\"notification_policies_title\">Notifikationspolicy</string>\n    <string name=\"notification_policies_filter_out\">Hantera notifikationer från…</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">Personer du inte följer</string>\n    <string name=\"notification_policies_filter_dont_follow_description\">Tills du manuellt godkänner dem</string>\n    <string name=\"notification_policies_filter_not_following_title\">Personer som inte följer dig</string>\n    <string name=\"notification_policies_filter_not_following_description\">Inklusive personer du följt i mindre än 3 dagar</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">Nya konton</string>\n    <string name=\"unknown_notification_filter_new_accounts_description\">Skapade inom de senaste 30 dagarna</string>\n    <string name=\"pref_default_reply_privacy_explanation\">Den förvalda delningsnivån beror på inlägget du besvarar.</string>\n    <string name=\"pref_match_default_post_privacy\">Matcha förvald delningsnivå för inlägg</string>\n    <string name=\"pref_title_confirm_follows\">Visa bekräftelse innan konto följs</string>\n    <string name=\"unknown_notification_type\">Okänd notifikationstyp</string>\n    <string name=\"post_privacy_direct\">Direkt</string>\n    <string name=\"error_deleting_filter\">Kunde inte radera filtret \\'%1$s\\'</string>\n    <string name=\"error_saving_filter\">Kunde inte spara filtret \\'%1$s\\'</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-sw380dp/toot_button.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <bool name=\"show_small_toot_button\">false</bool>\n    <dimen name=\"toot_button_width\">@dimen/wrap_content</dimen>\n    <dimen name=\"toot_button_horizontal_padding\">8dp</dimen>\n\n</resources>"
  },
  {
    "path": "app/src/main/res/values-ta/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">பிழை ஏற்பட்டது.</string>\n    <string name=\"error_empty\">இது காலியாக இருக்க கூடாது.</string>\n    <string name=\"error_invalid_domain\">தவறான டொமைன் உள்ளிடப்பட்டுள்ளது</string>\n    <string name=\"error_failed_app_registration\">அந்த instance(களத்தினை)-யை அங்கீகரிப்பதில் தோல்வி.</string>\n    <string name=\"error_no_web_browser_found\">வலை உலாவிகள் ஏதுமில்லை</string>\n    <string name=\"error_authorization_unknown\">அடையாளம் தெரியாத அங்கீகார பிழை ஏற்பட்டுள்ளது.</string>\n    <string name=\"error_authorization_denied\">அங்கீகாரம் மறுக்கப்பட்டுள்ளது</string>\n    <string name=\"error_retrieving_oauth_token\">உள்நுழைவு டோக்கனைப் பெறுவதில் தோல்வி.</string>\n    <string name=\"error_compose_character_limit\">நிலை மிக நீளமாக உள்ளது!</string>\n    <string name=\"error_media_upload_type\">இந்த வகை கோப்பை பதிவேற்ற முடியாது.</string>\n    <string name=\"error_media_upload_opening\">அந்த கோப்பை திறக்க முடியவில்லை.</string>\n    <string name=\"error_media_upload_permission\">ஊடகத்தை படிக்க அனுமதி தேவை.</string>\n    <string name=\"error_media_download_permission\">ஊடகத்தை சேமிக்க அனுமதி தேவை.</string>\n    <string name=\"error_media_upload_image_or_video\">படங்களும், வீடியோக்களும் ஒரே நிலைக்கு இணைக்க இயலாது.</string>\n    <string name=\"error_media_upload_sending\">பதிவேற்றம் தோல்வியுற்றது.</string>\n    <string name=\"title_home\">முகப்பு</string>\n    <string name=\"title_notifications\">அறிவிப்புகள்</string>\n    <string name=\"title_public_local\">அருகாமயில்</string>\n    <string name=\"title_public_federated\">ஒருங்கிணைந்த</string>\n    <string name=\"title_posts\">பதிவுகள்</string>\n    <string name=\"title_posts_with_replies\">பதிலளிக்கபட்டவை</string>\n    <string name=\"title_follows\">பின்பற்றுகிறீர்</string>\n    <string name=\"title_followers\">பின்பற்றுபவர்கள்</string>\n    <string name=\"title_favourites\">விரும்பியவை</string>\n    <string name=\"title_mutes\">ஒதுக்கப்பட்ட பயனர்கள்</string>\n    <string name=\"title_blocks\">தடைசெய்யபட்ட பயனர்கள்</string>\n    <string name=\"title_follow_requests\">பின்பற்ற கோரிக்கை</string>\n    <string name=\"title_edit_profile\">சுயவிவரத்தை திருத்த</string>\n    <string name=\"title_drafts\">வரைவுகள்</string>\n    <string name=\"post_boosted_format\">%1$s மேலேற்றப்பட்டது</string>\n    <string name=\"post_sensitive_media_title\">உணர்ச்சிகரமான உள்ளடக்கம்</string>\n    <string name=\"post_media_hidden_title\">ஊடகம் மறைக்கப்பட்டது</string>\n    <string name=\"post_sensitive_media_directions\">பார்வையிட சொடுக்கவும்</string>\n    <string name=\"post_content_warning_show_more\">அதிகமாக்கு</string>\n    <string name=\"post_content_warning_show_less\">கம்மியாக்கு</string>\n    <string name=\"footer_empty\">இங்கு எதுவுமில்லை. புதுப்பிக்க கீழே இழுக்கவும்!</string>\n    <string name=\"notification_reblog_format\">%1$s தங்களின் toot உயர்த்தப்பட்டுள்ளது</string>\n    <string name=\"notification_favourite_format\">%1$s தங்களின் toot பிடித்தவையானது</string>\n    <string name=\"notification_follow_format\">%1$s தங்களை பின்பற்றுகிறார்</string>\n    <string name=\"report_username_format\">புகார் @%1$s</string>\n    <string name=\"report_comment_hint\">கூடுதல் கருத்துரைகள்?</string>\n    <string name=\"action_quick_reply\">உடனடி பதிலளி</string>\n    <string name=\"action_reply\">பதிலளி</string>\n    <string name=\"action_reblog\">மேலேற்று</string>\n    <string name=\"action_favourite\">பிடித்தவை</string>\n    <string name=\"action_more\">மேலும்</string>\n    <string name=\"action_compose\">எழுது</string>\n    <string name=\"action_login\">Mastodon மூலம் உள்நுழைய</string>\n    <string name=\"action_logout\">வெளியேறு</string>\n    <string name=\"action_logout_confirm\">நீங்கள் %1$s கணக்கிலிருந்து வெளியேற விரும்புகிறீர்களா?</string>\n    <string name=\"action_follow\">பின்பற்று</string>\n    <string name=\"action_unfollow\">பின்பற்றாதே</string>\n    <string name=\"action_block\">தடை</string>\n    <string name=\"action_unblock\">தடை நீக்கு</string>\n    <string name=\"action_hide_reblogs\">மேலேற்றத்தை மறை</string>\n    <string name=\"action_show_reblogs\">மேலேற்றத்தை காட்டு</string>\n    <string name=\"action_report\">புகார்</string>\n    <string name=\"action_delete\">நீக்கு</string>\n    <string name=\"action_retry\">மீண்டும் முயற்சி</string>\n    <string name=\"action_close\">மூடு</string>\n    <string name=\"action_view_profile\">சுயவிவரம்</string>\n    <string name=\"action_view_preferences\">முன்னுரிமைகள்</string>\n    <string name=\"action_view_favourites\">விரும்பியவை</string>\n    <string name=\"action_view_mutes\">ஒலி நீக்கபட்ட பயனர்கள்</string>\n    <string name=\"action_view_blocks\">தடைசெய்யபட்ட பயனர்கள்</string>\n    <string name=\"action_view_follow_requests\">பின்பற்ற கோரிக்கை</string>\n    <string name=\"action_view_media\">ஊடகம்</string>\n    <string name=\"action_open_in_web\">உலாவியில் திற</string>\n    <string name=\"action_add_media\">Mediaவை இணை</string>\n    <string name=\"action_photo_take\">புகைப்படம் எடு</string>\n    <string name=\"action_share\">பகிர்</string>\n    <string name=\"action_mute\">ஒலி நீக்கு</string>\n    <string name=\"action_unmute\">ஒலிக்க செய்</string>\n    <string name=\"action_mention\">குறிப்பிடு</string>\n    <string name=\"action_hide_media\">மீடியாவை மறை</string>\n    <string name=\"action_open_drawer\">டிராயரைத் திற</string>\n    <string name=\"action_save\">சேமி</string>\n    <string name=\"action_edit_profile\">சுயவிவரத்தை திருத்த</string>\n    <string name=\"action_edit_own_profile\">திருத்த</string>\n    <string name=\"action_undo\">மீளமை</string>\n    <string name=\"action_accept\">ஏற்கவும்</string>\n    <string name=\"action_reject\">நிராகரி</string>\n    <string name=\"action_search\">தேடு</string>\n    <string name=\"action_access_drafts\">வரைவுகள்</string>\n    <string name=\"action_toggle_visibility\">Toot புலப்படும் தன்மை</string>\n    <string name=\"action_content_warning\">உள்ளடக்க எச்சரிக்கை</string>\n    <string name=\"action_emoji_keyboard\">Emoji விசைபலகை</string>\n    <string name=\"download_image\">பதிவிறக்கப்படுகிறது %1$s</string>\n    <string name=\"action_copy_link\">இணைப்பை நகலெடுக்கவும்</string>\n    <string name=\"send_post_link_to\">Toot URL-யை பகிர…</string>\n    <string name=\"send_post_content_to\">Toot உள்ளடக்கத்தை பகிர…</string>\n    <string name=\"send_media_to\">Mediaவை பகிர…</string>\n    <string name=\"confirmation_reported\">அனுப்பு!</string>\n    <string name=\"confirmation_unblocked\">பயனர் முடக்கம் நீக்கப்பட்டது</string>\n    <string name=\"confirmation_unmuted\">பயனர் ஒலிக்க செய்யபட்டது</string>\n    <string name=\"hint_domain\">எந்த instance(களம்)?</string>\n    <string name=\"hint_compose\">என்ன நடக்கிறது?</string>\n    <string name=\"hint_content_warning\">உள்ளடக்க எச்சரிக்கை</string>\n    <string name=\"hint_display_name\">காட்சி பெயர்</string>\n    <string name=\"hint_note\">சுயவிவரம்</string>\n    <string name=\"hint_search\">தேடல்…</string>\n    <string name=\"search_no_results\">முடிவுகள் ஏதுமில்லை</string>\n    <string name=\"label_quick_reply\">பதிலளி…</string>\n    <string name=\"label_avatar\">தோற்றம்</string>\n    <string name=\"label_header\">தலைப்பு</string>\n    <string name=\"link_whats_an_instance\">Instance(களம்) என்றால் என்ன?</string>\n    <string name=\"login_connection\">இணைக்கபடுகிறது…</string>\n    <string name=\"dialog_whats_an_instance\">ஏதேனும் instance-ன் முகவரியையோ அல்லது களத்தின் முகவரியையோ இங்கு உள்ளிடவும், உதாரணமாக mastodon.social, icosahedron.website, social.tchncs.de, மற்றும் \\u0020<a href=\"https://instances.social\">மேலும்!</a> \\u0020\n\\n \n\\nபயனர் கணக்கு இல்லையெனில் புதிய கணக்கிற்கான instance(களம்)-னை பதிவிடவும். நீங்கள் குறிப்பிடப்படும் களத்தில் உங்கள் கணக்கு பதிவாகும். \n\\n \n\\nமேலும் இங்கு குறிப்பிடப்பட்ட ஏதேனும் ஒரு களத்தில் மட்டுமே உங்களால் கணக்கு ஆரம்பித்துக்கொள்ள இயலும் இருப்பினும் நம்மால் மற்ற களங்களில் உள்ள நண்பர்களையும் தொடர்பு கொள்ள இயலும் . \\u0020\n\\n \n\\nமேலும் தகவல்கள் அறிய <a href=\"https://joinmastodon.org\">joinmastodon.org</a>. \\u0020</string>\n    <string name=\"dialog_title_finishing_media_upload\">மீடியா பதிவேற்றம் முடிகிறது</string>\n    <string name=\"dialog_message_uploading_media\">ஏற்றுகிறது …</string>\n    <string name=\"dialog_download_image\">பதிவிறக்க</string>\n    <string name=\"dialog_unfollow_warning\">இந்த கணக்கை பின்பற்ற வேண்டாமா?</string>\n    <string name=\"visibility_public\">அனைவருக்கும் காண்பி</string>\n    <string name=\"visibility_unlisted\">அனைவருக்கும் காட்டாதே</string>\n    <string name=\"visibility_private\">பின்பற்றுபவர்களுக்கு மட்டும் காண்பி</string>\n    <string name=\"visibility_direct\">குறிபிடபட்டுள்ள பயனர்களுக்கு மட்டும் காண்பி</string>\n    <string name=\"pref_title_edit_notification_settings\">அறிவிப்புகள்</string>\n    <string name=\"pref_title_notifications_enabled\">அறிவிப்புகள்</string>\n    <string name=\"pref_title_notification_alerts\">எச்சரிக்கைகள்</string>\n    <string name=\"pref_title_notification_alert_sound\">ஒலி மூலம் தெரிவிக்கவும்</string>\n    <string name=\"pref_title_notification_alert_vibrate\">அதிர்வுடன் தெரிவிக்கவும்</string>\n    <string name=\"pref_title_notification_alert_light\">ஒளியுடன் தெரிவிக்கவும்</string>\n    <string name=\"pref_title_notification_filters\">எனக்கு தெரிவி எப்போதெனில்</string>\n    <string name=\"pref_title_appearance_settings\">தோற்றம்</string>\n    <string name=\"pref_title_app_theme\">செயலியின் தீம்</string>\n    <string name=\"app_them_dark\">கருமை</string>\n    <string name=\"app_theme_light\">வெளிச்சம்</string>\n    <string name=\"app_theme_black\">பிளாக்</string>\n    <string name=\"app_theme_auto\">தானியங்கி</string>\n    <string name=\"pref_title_browser_settings\">உலாவி</string>\n    <string name=\"pref_title_custom_tabs\">Chrome தனிப்பயன் கீற்றை பயன்படுத்து</string>\n    <string name=\"pref_title_post_filter\">காலவரிசை வடிகட்டல்</string>\n    <string name=\"pref_title_post_tabs\">கீற்றுகள்</string>\n    <string name=\"pref_title_show_boosts\">மேலேற்றத்தை காண்பி</string>\n    <string name=\"pref_title_show_replies\">பதில்களைக் காண்பி</string>\n    <string name=\"pref_title_show_media_preview\">ஊடக மாதிரிக்காட்சிகளைக் காண்பி</string>\n    <string name=\"pref_title_proxy_settings\">ப்ராக்ஸி</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP ப்ராக்ஸி</string>\n    <string name=\"pref_title_http_proxy_enable\">HTTP ப்ராக்ஸியை இயக்கு</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP ப்ராக்ஸி சேவையகம்</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP ப்ராக்ஸி போர்ட்</string>\n    <string name=\"pref_default_post_privacy\">தனியுரிமையில் பதிவிடுவதை முன்னிருப்பாக்கு</string>\n    <string name=\"pref_publishing\">வெளியீடு</string>\n    <string name=\"post_privacy_public\">அனைவருக்கும்</string>\n    <string name=\"post_privacy_unlisted\">பட்டியலிடப்படாதவர்களுக்கு</string>\n    <string name=\"post_privacy_followers_only\">பின்பற்றுபவர்களுக்கு மட்டும்</string>\n    <string name=\"pref_post_text_size\">நிலை உரை அளவு</string>\n    <string name=\"notification_mention_name\">புதிய குறிப்புகள்</string>\n    <string name=\"notification_mention_descriptions\">புதிய குறிப்புகள் பற்றிய அறிவிப்புகள்</string>\n    <string name=\"notification_follow_name\">புதிய பின்பற்றுபவர்கள்</string>\n    <string name=\"notification_follow_description\">புதிய பின்தொடர்பவர்களைப் பற்றிய அறிவிப்புகள்</string>\n    <string name=\"notification_boost_name\">ஊக்கியாக</string>\n    <string name=\"notification_boost_description\">எமது toot மேலேற்றும் போது தெரிவி.</string>\n    <string name=\"notification_favourite_name\">பிடித்தவைகள்</string>\n    <string name=\"notification_favourite_description\">எமது toot பிடித்தவையானால் தெரிவி.</string>\n    <string name=\"notification_mention_format\">%1$s தங்களை குறிபிட்டுள்ளார்</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s மற்றும் %4$d மற்றவர்கள்</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, மற்றும் %3$s</string>\n    <string name=\"notification_summary_small\">%1$s மற்றும் %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\"/>\n        <item quantity=\"other\">%1$d புதிய ஊடாடுதல்</item>\n    </plurals>\n    <string name=\"description_account_locked\">கணக்கு மூடப்பட்டது</string>\n    <string name=\"about_title_activity\">பற்றி</string>\n    <string name=\"about_tusky_version\">Tusky(டஸ்கி) %1$s</string>\n    <string name=\"about_tusky_license\">Tusky ஒரு கட்டற்ற மற்றும் திறந்த மூல மென்பொருள். இதன் உரிமம் GNU General Public License(பொது உரிமம்) பதிப்பு 3 -ன் கீழ் உள்ளது. நீங்கள் உரிமம் பற்றி காண: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">திட்டத்தின் வலைத்தளம்:\n\\n https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">பிழை அறிக்கைகள் &amp; அம்ச கோரிக்கைகள்:\n\\n https://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Tusky-ன் கணக்கு</string>\n    <string name=\"post_share_content\">Toot உள்ளடக்கத்தைப் பகிர்</string>\n    <string name=\"post_share_link\">Toot இணைப்பைப் பகிர்</string>\n    <string name=\"post_media_images\">படங்கள்</string>\n    <string name=\"post_media_video\">காணொளி</string>\n    <string name=\"state_follow_requested\">கோரிக்கையைப் பின்பற்றவும்</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">%1$dஆ-முன்</string>\n    <string name=\"abbreviated_in_days\">%1$dநா-முன்</string>\n    <string name=\"abbreviated_in_hours\">%1$dம.நே-முன்</string>\n    <string name=\"abbreviated_in_minutes\">%1$dநி-முன்</string>\n    <string name=\"abbreviated_in_seconds\">%1$dவி-முன்</string>\n    <string name=\"abbreviated_years_ago\">%1$dஆ</string>\n    <string name=\"abbreviated_days_ago\">%1$dநா</string>\n    <string name=\"abbreviated_hours_ago\">%1$dம.நே</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dநி</string>\n    <string name=\"abbreviated_seconds_ago\">%1$dவி</string>\n    <string name=\"follows_you\">நீங்கள் பின் தொடரபடுகிறீர்கள்</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">எல்லா nsfw(உணர்ச்சிகரமான) உள்ளடக்கத்தையும் எப்போதும் காண்பி</string>\n    <string name=\"title_media\">ஊடகம்</string>\n    <string name=\"replying_to\">\\@%1$s -க்கு பதிலளி</string>\n    <string name=\"load_more_placeholder_text\">மேலும் காட்டு…</string>\n    <string name=\"add_account_name\">கணக்கை சேர்க்க</string>\n    <string name=\"add_account_description\">புதிய Mastodon கணக்கைச் சேர்க்க</string>\n    <string name=\"action_lists\">பட்டியல்கள்</string>\n    <string name=\"title_lists\">பட்டியல்கள்</string>\n    <string name=\"compose_active_account_description\">%1$s கணக்குடன் பதிவிட</string>\n    <string name=\"action_set_caption\">தலைப்பை அமை</string>\n    <string name=\"action_remove\">நீக்கு</string>\n    <string name=\"lock_account_label\">கணக்கை முடக்கு</string>\n    <string name=\"lock_account_label_description\">நீங்களாக பின்பற்றுபவர்களை அங்கீகரிக்க</string>\n    <string name=\"compose_save_draft\">வரைவை சேமிக்கவா?</string>\n    <string name=\"send_post_notification_title\">Toot அனுப்பபடுகிறது…</string>\n    <string name=\"send_post_notification_error_title\">Toot அனுப்புவதில் பிழை</string>\n    <string name=\"send_post_notification_channel_name\">Toots அனுப்பபடுகிறது</string>\n    <string name=\"send_post_notification_cancel_title\">Toot அனுப்பபல் நீக்கபட்டது</string>\n    <string name=\"send_post_notification_saved_content\">நகலெடுக்கபட்ட toot வரைவில் சேமிக்கபட்டது</string>\n    <string name=\"action_compose_shortcut\">எழுது</string>\n    <string name=\"error_no_custom_emojis\">தங்கள் %1$s instance(களம்)-ல் எந்தவொரு custom emojis-ம் இல்லை</string>\n    <string name=\"emoji_style\">Emoji பாணி</string>\n    <string name=\"system_default\">அமைப்பின் இயல்புநிலை</string>\n    <string name=\"download_fonts\">தாங்கள் முதலில் இந்த Emoji sets-னை பதிவிறக்கவேண்டும்</string>\n    <string name=\"performing_lookup_title\">சேயல்பாட்டு தேடல்…</string>\n    <string name=\"expand_collapse_all_posts\">அதிகமாக்கு/கம்மியாக்கு பற்றிய நிலைகள்</string>\n    <string name=\"action_open_post\">Tootயை திற</string>\n    <string name=\"restart_required\">செயலி மறுதொடக்கம் தேவைபடுகிறது</string>\n    <string name=\"restart_emoji\">இந்த மாறுதல்கள் செயற்படுத்த செயலியை மறுதொடக்கம் செய்ய வேண்டும்</string>\n    <string name=\"later\">பிறகு</string>\n    <string name=\"restart\">மறுதொடக்க</string>\n    <string name=\"caption_systememoji\">தங்களின் வழக்கமான emoji பொருத்தப்பட்டது</string>\n    <string name=\"caption_blobmoji\">Android 4.4–7.1-லிருந்தே Blob emojis பயன்படுத்தபடுகிறது</string>\n    <string name=\"caption_twemoji\">Mastodon-னின் வழக்கமான emoji set</string>\n    <string name=\"download_failed\">பதிவிறக்கம் தோல்வியுற்றது</string>\n    <string name=\"profile_badge_bot_text\">இயலி</string>\n    <string name=\"account_moved_description\">%1$s கணக்கு நகர்த்தபட்டது இதற்க்கு:</string>\n    <string name=\"reblog_private\">அசலான பார்வையாளர்களுக்கு மட்டும் மேலேற்று</string>\n    <string name=\"unreblog_private\">மேலேற்றத்தை தவிர்</string>\n    <string name=\"license_description\">Tusky கொண்டுள்ள நிரல் மற்றும் துணுக்குகள் பின்வரும் திறந்த மூல திட்டங்கள்:</string>\n    <string name=\"license_apache_2\">Apache License (copy below)-ன் கீழ் உரிமமளிக்கப்பட்டுள்ளது</string>\n    <string name=\"profile_metadata_label\">சுயவிவர மேனிலை தரவு</string>\n    <string name=\"profile_metadata_add\">தகவலை இணைக்க</string>\n    <string name=\"profile_metadata_label_label\">விவரத்துணுக்கு</string>\n    <string name=\"profile_metadata_content_label\">உள்ளடக்கம்</string>\n    <string name=\"pref_title_absolute_time\">Absolute நேரத்தை பயன்படுத்து</string>\n    <string name=\"label_remote_account\">கீழுள்ள தகவல் பயனரின் சுயவிவரத்தின் பிரதிபலிப்பு முழுமையடையாது. முழு சுயவிவரத்தை உலாவில் திறக்க அழுத்தவும்.</string>\n    <string name=\"unpin_action\">விடுவி</string>\n    <string name=\"pin_action\">பொருத்து</string>\n    <string name=\"action_view_account_preferences\">கணக்கரின் முன்னுரிமைகள்</string>\n    <string name=\"error_network\">பிணைய பிழை ஏற்பட்டது! உங்கள் இணைப்பைச் சரிபார்த்து மீண்டும் முயற்சிக்கவும்!</string>\n    <string name=\"error_sender_account_gone\">டூத் அனுப்புவதில் பிழை ஏற்பட்டுள்ளது</string>\n    <string name=\"title_direct_messages\">நேரடி தகவல்</string>\n    <string name=\"title_tab_preferences\">பட்டைகள்</string>\n    <string name=\"title_posts_pinned\">பொருத்தப்பட்டது</string>\n    <string name=\"duration_1_day\">1 நாள்</string>\n    <string name=\"duration_3_days\">3 நாட்கள்</string>\n    <string name=\"duration_7_days\">7 நாட்கள்</string>\n    <string name=\"add_poll_choice\">விருப்பத்தைச் சேர்</string>\n    <string name=\"notification_follow_request_name\">பின்பற்ற கோரிக்கை</string>\n    <string name=\"filter_dialog_remove_button\">நீக்கு</string>\n    <string name=\"action_open_reblogged_by\">மேலேற்றத்தை காண்பி</string>\n    <string name=\"edit_poll\">திருத்த</string>\n    <string name=\"action_edit\">திருத்த</string>\n    <string name=\"conversation_2_recipients\">%1$s மற்றும் %2$s</string>\n    <string name=\"description_visibility_private\">பின்பற்றுபவர்கள்</string>\n    <string name=\"description_visibility_unlisted\">பட்டியலிடப்படாதவர்களுக்கு</string>\n    <string name=\"description_visibility_public\">அனைவருக்கும்</string>\n    <string name=\"compose_shortcut_short_label\">எழுது</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-te/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    </resources>"
  },
  {
    "path": "app/src/main/res/values-th/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"add_poll_choice\">เพิ่มตัวเลือก</string>\n    <string name=\"duration_7_days\">7 วัน</string>\n    <string name=\"duration_3_days\">3 วัน</string>\n    <string name=\"duration_1_day\">1 วัน</string>\n    <string name=\"duration_6_hours\">6 ชั่วโมง</string>\n    <string name=\"duration_1_hour\">1 ชั่วโมง</string>\n    <string name=\"duration_30_min\">30 นาที</string>\n    <string name=\"duration_5_min\">5 นาที</string>\n    <string name=\"create_poll_title\">โพล</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">เปิดใช้งานการเลื่อนนิ้วเพื่อสลับระหว่างแท็บ</string>\n    <string name=\"failed_search\">ค้นหาล้มเหลว</string>\n    <string name=\"title_accounts\">บัญชี</string>\n    <string name=\"report_description_remote_instance\">บัญชีนี้มาจากเซิร์ฟเวอร์อื่น ส่งสำเนารายงานที่ไม่ระบุชื่อไปที่นั่นด้วยหรือไม่?</string>\n    <string name=\"report_description_1\">รายงานจะถูกส่งไปยังผู้ดูแลเซิร์ฟเวอร์ของคุณ สามารถให้คำอธิบายว่าทำไมจึงรายงานบัญชีนี้ด้านล่าง:</string>\n    <string name=\"failed_fetch_posts\">ดึงข้อมูลสถานะล้มเหลว</string>\n    <string name=\"failed_report\">รายงานล้มเหลว</string>\n    <string name=\"report_remote_instance\">ส่งต่อไปยัง %1$s</string>\n    <string name=\"hint_additional_info\">ความคิดเห็นเพิ่มเติม</string>\n    <string name=\"report_sent_success\">รายงาน @%1$s เรียบร้อยแล้ว</string>\n    <string name=\"button_done\">ทำ</string>\n    <string name=\"button_back\">ย้อนกลับ</string>\n    <string name=\"button_continue\">ต่อไป</string>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"other\">เหลืออีก %1$d วินาที</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"other\">เหลืออีก %1$d นาที</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"other\">เหลืออีก %1$d ชั่วโมง</item>\n    </plurals>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"other\">เหลืออีก %1$d วัน</item>\n    </plurals>\n    <string name=\"poll_ended_created\">โพลที่คุณสร้างสิ้นสุดลงแล้ว</string>\n    <string name=\"poll_ended_voted\">โพลที่คุณโหวตสิ้นสุดลงแล้ว</string>\n    <string name=\"poll_vote\">โหวต</string>\n    <string name=\"poll_info_closed\">สิ้นสุดแล้ว</string>\n    <string name=\"poll_info_time_absolute\">จบที่ %1$s</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"other\">%1$s คน</item>\n    </plurals>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"other\">%1$s โหวต</item>\n    </plurals>\n    <string name=\"poll_info_format\"> <!-- 15 votes • 1 hour left --> %1$s • %2$s</string>\n    <string name=\"compose_preview_image_description\">การกระทำสำหรับภาพ %1$s</string>\n    <string name=\"notification_clear_text\">ต้องการลบการแจ้งเตือนทั้งหมดอย่างสมบูรณ์?</string>\n    <string name=\"compose_shortcut_short_label\">เขียน</string>\n    <string name=\"compose_shortcut_long_label\">เขียน Toot</string>\n    <string name=\"filter_apply\">ใช้งาน</string>\n    <string name=\"notifications_apply_filter\">คัดกรอง</string>\n    <string name=\"notifications_clear\">ล้างการแจ้งเตือน</string>\n    <string name=\"list\">รายการ</string>\n    <string name=\"select_list_title\">เลือกรายการ</string>\n    <string name=\"hashtags\">แฮชแท็ก</string>\n    <string name=\"pick_hashtag_hint\">แฮชแท็กโดยไม่มี #</string>\n    <string name=\"add_hashtag_title\">เพิ่มแฮชแท็ก</string>\n    <string name=\"hint_list_name\">ชื่อรายการ</string>\n    <string name=\"description_poll\">โพลกับตัวเลือก: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"description_visibility_direct\">ไดเร็กต์</string>\n    <string name=\"description_visibility_private\">ผู้ติดตาม</string>\n    <string name=\"description_visibility_unlisted\">ไม่อยู่ในรายการ</string>\n    <string name=\"description_visibility_public\">สาธารณะ</string>\n    <string name=\"description_post_bookmarked\">คั่นหน้า</string>\n    <string name=\"description_post_favourited\">ชื่นชอบ</string>\n    <string name=\"description_post_reblogged\">ได้ถูกเขียนใหม่</string>\n    <string name=\"description_post_media_no_description_placeholder\">ไม่มีคำอธิบาย</string>\n    <string name=\"description_post_cw\">เตือนเนื้อหา : %1$s</string>\n    <string name=\"description_post_media\">สื่อ: %1$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s และอีก %3$d</string>\n    <string name=\"conversation_2_recipients\">%1$s และ %2$s</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"title_favourited_by\">ชื่นชอบโดย</string>\n    <string name=\"title_reblogged_by\">บูสต์โดย</string>\n    <plurals name=\"reblogs\">\n        <item quantity=\"other\"><b>%1$s</b> บูสต์</item>\n    </plurals>\n    <plurals name=\"favs\">\n        <item quantity=\"other\"><b>%1$s</b> ชื่นชอบ</item>\n    </plurals>\n    <string name=\"pin_action\">ปักหมุด</string>\n    <string name=\"unpin_action\">เลิกปักหมุด</string>\n    <string name=\"label_remote_account\">ข้อมูลต่อไปนี้อาจไม่ถูกต้อง แตะเพื่อเปิดโปรไฟล์ในเบราว์เซอร์</string>\n    <string name=\"pref_title_absolute_time\">แสดงเวลาแบบเที่ยงตรง</string>\n    <string name=\"profile_metadata_content_label\">เนื้อหา</string>\n    <string name=\"profile_metadata_label_label\">ป้าย</string>\n    <string name=\"profile_metadata_add\">เพิ่มข้อมูล</string>\n    <string name=\"profile_metadata_label\">ข้อมูลอภิพันธุ์</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_apache_2\">ภายใต้สัญญาอนุญาต Apache License (คัดลอกด้านล่าง)</string>\n    <string name=\"license_description\">Tusky มีโค้ดและสินทรัพย์จากโครงการโอเพนซอร์สต่อไปนี้:</string>\n    <string name=\"unreblog_private\">ยกเลิกบูสต์</string>\n    <string name=\"reblog_private\">บูสต์โพสต์ต้นฉบับ</string>\n    <string name=\"account_moved_description\">%1$s ได้ย้ายไปที่ :</string>\n    <string name=\"profile_badge_bot_text\">บอต</string>\n    <string name=\"download_failed\">ดาวน์โหลดล้มเหลว</string>\n    <string name=\"caption_notoemoji\">ชุดเอโมจิปัจจุบันจากกูเกิล</string>\n    <string name=\"caption_twemoji\">ชุดเอโมจิจาก Mastodon</string>\n    <string name=\"caption_blobmoji\">ที่รู้จักจาก Android 4.4 ถึง 7.1 ชุดเอโมจิ Blob</string>\n    <string name=\"caption_systememoji\">ชุดเริ่มต้นในอุปกรณ์คุณ</string>\n    <string name=\"restart\">เริ่มใหม่</string>\n    <string name=\"later\">ภายหลัง</string>\n    <string name=\"restart_emoji\">จำเป็นต้องเริ่ม Tusky ใหม่ เพื่อใช้การเปลี่ยนแปลงเหล่านี้</string>\n    <string name=\"restart_required\">จำเป็นต้องเริ่มแอปใหม่</string>\n    <string name=\"action_open_post\">เปิด Toot</string>\n    <string name=\"expand_collapse_all_posts\">ขยาย/ย่อทั้งหมด</string>\n    <string name=\"performing_lookup_title\">กำลังค้นหา…</string>\n    <string name=\"download_fonts\">ต้องดาวน์โหลดชุดเอโมจิเหล่านี้ก่อน</string>\n    <string name=\"system_default\">ค่าปริยายของระบบ</string>\n    <string name=\"emoji_style\">รูปแบบเอโมจิ</string>\n    <string name=\"error_no_custom_emojis\">Instance %1$s ไม่มีเอโมจิแบบกำหนดเอง</string>\n    <string name=\"action_compose_shortcut\">เขียน</string>\n    <string name=\"send_post_notification_saved_content\">สำเนา Toot บันทึกเป็นฉบับร่างแล้ว</string>\n    <string name=\"send_post_notification_cancel_title\">การส่งถูกยกเลิก</string>\n    <string name=\"send_post_notification_channel_name\">ส่ง Toot</string>\n    <string name=\"send_post_notification_error_title\">การส่ง Toot เกิดข้อผิดผลาด</string>\n    <string name=\"send_post_notification_title\">กำลังส่ง Toot…</string>\n    <string name=\"compose_save_draft\">บันทึกฉบับร่าง?</string>\n    <string name=\"lock_account_label_description\">ต้องอนุมัติผู้ติดตามด้วยตัวเอง</string>\n    <string name=\"lock_account_label\">ล็อกบัญชี</string>\n    <string name=\"action_remove\">ลบ</string>\n    <string name=\"action_set_caption\">ตั้งคำอธิบาย</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"other\">อธิบายเพื่อผู้บกพร่องทางสายตา\n\\n(จำกัด %1$d ตัวอักขระ)</item>\n    </plurals>\n    <string name=\"compose_active_account_description\">โพสต์ด้วยบัญชี %1$s</string>\n    <string name=\"action_remove_from_list\">ลบบัญชีออกจากรายการ</string>\n    <string name=\"action_add_to_list\">เพิ่มบัญชีไปใส่รายการ</string>\n    <string name=\"hint_search_people_list\">ค้นหาผู้ติดตาม</string>\n    <string name=\"action_delete_list\">ลบรายการ</string>\n    <string name=\"action_rename_list\">เปลี่ยนชื่อรายการ</string>\n    <string name=\"action_create_list\">สร้างรายการ</string>\n    <string name=\"error_delete_list\">ไม่สามารถลบรายการได้</string>\n    <string name=\"error_rename_list\">ไม่สามารถเปลี่ยนชื่อรายการได้</string>\n    <string name=\"error_create_list\">ไม่สามารถสร้างรายการได้</string>\n    <string name=\"add_account_description\">เพิ่มบัญชี Mastodon ใหม่</string>\n    <string name=\"add_account_name\">เพิ่มบัญชี</string>\n    <string name=\"filter_add_description\">วลีที่ต้องการกรอง</string>\n    <string name=\"filter_dialog_whole_word_description\">ถ้าคำหลักหรือวลีเป็นอักษรผสมตัวเลข จะใช้ได้ผลเมื่อตรงทั้งคำเท่านั้น</string>\n    <string name=\"filter_dialog_whole_word\">ทั้งคำ</string>\n    <string name=\"filter_dialog_update_button\">อัปเดต</string>\n    <string name=\"filter_dialog_remove_button\">ลบ</string>\n    <string name=\"filter_edit_title\">แก้ไขตัวคัดกรอง</string>\n    <string name=\"filter_addition_title\">เพิ่มตัวคัดกรอง</string>\n    <string name=\"pref_title_thread_filter_keywords\">การสนทนา</string>\n    <string name=\"pref_title_public_filter_keywords\">ไทม์ไลน์สาธารณะ</string>\n    <string name=\"load_more_placeholder_text\">โหลดเพิ่ม</string>\n    <string name=\"replying_to\">ตอบกลับไป @%1$s</string>\n    <string name=\"title_media\">สื่อ</string>\n    <string name=\"pref_title_alway_open_spoiler\">ขยาย Toot ที่มีเครื่องหมายเนื้อหาอ่อนไหวเสมอ</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">แสดงเนื้อหาอ่อนไหวเสมอ</string>\n    <string name=\"follows_you\">กำลังติดตามคุณ</string>\n    <string name=\"abbreviated_seconds_ago\">%1$d วินาทีที่แล้ว</string>\n    <string name=\"abbreviated_minutes_ago\">%1$d นาทีที่แล้ว</string>\n    <string name=\"abbreviated_hours_ago\">%1$d ชั่วโมงที่แล้ว</string>\n    <string name=\"abbreviated_days_ago\">%1$d วันที่แล้ว</string>\n    <string name=\"abbreviated_years_ago\">%1$d ปีที่แล้ว</string>\n    <string name=\"abbreviated_in_seconds\">ใน %1$d วินาที</string>\n    <string name=\"abbreviated_in_minutes\">ใน %1$d นาที</string>\n    <string name=\"abbreviated_in_hours\">ใน %1$d ชั่วโมง</string>\n    <string name=\"abbreviated_in_days\">ใน %1$d วัน</string>\n    <string name=\"abbreviated_in_years\">ใน %1$d ปี</string>\n    <string name=\"state_follow_requested\">กำลังขอติดตาม</string>\n    <string name=\"post_media_video\">วิดีทัศน์</string>\n    <string name=\"post_media_images\">ภาพ</string>\n    <string name=\"post_share_link\">แบ่งปันลิงก์ Toot</string>\n    <string name=\"post_share_content\">แบ่งปันเนื้อหา Toot</string>\n    <string name=\"about_tusky_account\">บัญชีทางการของ Tusky</string>\n    <string name=\"about_bug_feature_request_site\">รายงานช่องโหว่ และ ขอฟีเจอร์ (ภาษาอังกฤษ):\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_project_site\">เว็บไซต์โปรเจกต์:\n\\nhttps://tusky.app</string>\n    <string name=\"about_tusky_license\">Tusky คือซอฟต์แวร์เสรีและโอเพนซอร์ส ภายใต้สัญญาอนุญาต GNU General Public License Version 3 ดูสัญญาที่ : https://www.gnu.org/licenses/gpl-3.0.ja.html</string>\n    <string name=\"about_powered_by_tusky\">ขับเคลื่อนด้วย Tusky</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"description_account_locked\">บัญชีไม่สาธารณะ</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"other\">การโต้ตอบใหม่จำนวน %1$d</item>\n    </plurals>\n    <string name=\"notification_summary_small\">%1$s และ %2$s</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, และ %3$s</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s และอีก %4$d คน</string>\n    <string name=\"notification_mention_format\">%1$s ตอบกลับคุณ</string>\n    <string name=\"notification_poll_description\">การแจ้งเตือนเมื่อโพลได้สิ้นสุดลงแล้ว</string>\n    <string name=\"notification_poll_name\">โพล</string>\n    <string name=\"notification_favourite_description\">การแจ้งเตือนเมื่อ Toot คุณถูกชื่นชอบ</string>\n    <string name=\"notification_favourite_name\">ชื่นชอบ</string>\n    <string name=\"notification_boost_description\">การแจ้งเตือนเมื่อ Toot คุณถูกบูสต์</string>\n    <string name=\"notification_boost_name\">บูสต์</string>\n    <string name=\"notification_follow_request_description\">การแจ้งเตือนคำขอติดตามใหม่</string>\n    <string name=\"notification_follow_request_name\">คำขอติดตาม</string>\n    <string name=\"notification_follow_description\">การแจ้งเตือนเกี่ยวกับผู้ติดตามใหม่</string>\n    <string name=\"notification_follow_name\">ผู้ติดตามใหม่</string>\n    <string name=\"notification_mention_name\">การกล่าวถึงใหม่</string>\n    <string name=\"notification_mention_descriptions\">การแจ้งเตือนเกี่ยวกับการกล่าวถึงใหม่</string>\n    <string name=\"post_text_size_largest\">ใหญ่มาก</string>\n    <string name=\"post_text_size_large\">ใหญ่</string>\n    <string name=\"post_text_size_medium\">กลาง</string>\n    <string name=\"post_text_size_small\">เล็ก</string>\n    <string name=\"post_text_size_smallest\">เล็กมาก</string>\n    <string name=\"pref_post_text_size\">ขนาดอักษร Toot</string>\n    <string name=\"post_privacy_followers_only\">เฉพาะผู้ติดตาม</string>\n    <string name=\"post_privacy_unlisted\">ไม่อยู่ในรายการ</string>\n    <string name=\"post_privacy_public\">สาธารณะ</string>\n    <string name=\"pref_failed_to_sync\">ซิงค์การตั้งค่าล้มเหลว</string>\n    <string name=\"pref_publishing\">กำลังเผยแพร่ (synced with server)</string>\n    <string name=\"pref_default_media_sensitivity\">ใส่เครื่องหมายว่าเป็นสื่ออ่อนไหวเสมอ</string>\n    <string name=\"pref_default_post_privacy\">ค่าปริยายความเป็นส่วนตัวของโพสต์</string>\n    <string name=\"pref_title_http_proxy_port\">พอร์ตพร็อกซี่ HTTP</string>\n    <string name=\"pref_title_http_proxy_server\">เซิร์ฟเวอร์พร็อกซี่ HTTP</string>\n    <string name=\"pref_title_http_proxy_enable\">เปิดใช้งานพร็อกซี่ HTTP</string>\n    <string name=\"pref_title_http_proxy_settings\">พร็อกซี่ HTTP</string>\n    <string name=\"pref_title_proxy_settings\">พร็อกซี่</string>\n    <string name=\"pref_title_show_media_preview\">ดาวน์โหลดตัวอย่างสื่อ</string>\n    <string name=\"pref_title_show_replies\">แสดงการตอบกลับ</string>\n    <string name=\"pref_title_show_boosts\">แสดงบูสต์</string>\n    <string name=\"pref_title_post_tabs\">แท็บ</string>\n    <string name=\"pref_title_post_filter\">คัดกรองไทม์ไลน์</string>\n    <string name=\"pref_title_animate_gif_avatars\">อวตาร GIF เคลื่อนไหวได้</string>\n    <string name=\"pref_title_bot_overlay\">แสดงสัญลักษณ์ว่าเป็นบอต</string>\n    <string name=\"pref_title_language\">ภาษา</string>\n    <string name=\"pref_title_custom_tabs\">ใช้ Chrome Custom Tabs</string>\n    <string name=\"pref_title_browser_settings\">เบราว์เซอร์</string>\n    <string name=\"app_theme_system\">ใช้ตามแบบระบบ</string>\n    <string name=\"app_theme_auto\">ปรับตามเวลา</string>\n    <string name=\"app_theme_black\">ดำ</string>\n    <string name=\"app_theme_light\">สว่าง</string>\n    <string name=\"app_them_dark\">มืด</string>\n    <string name=\"pref_title_timeline_filters\">คัดกรอง</string>\n    <string name=\"pref_title_timelines\">ไทม์ไลน์</string>\n    <string name=\"pref_title_app_theme\">ธีมแอป</string>\n    <string name=\"pref_title_appearance_settings\">ลักษณะ</string>\n    <string name=\"pref_title_notification_filters\">แจ้งฉันเมื่อ</string>\n    <string name=\"pref_title_notification_alert_sound\">แจ้งด้วยเสียง</string>\n    <string name=\"pref_title_notification_alert_vibrate\">แจ้งด้วยการสั่น</string>\n    <string name=\"pref_title_notification_alert_light\">แจ้งด้วยแสง</string>\n    <string name=\"pref_title_notification_alerts\">เตือน</string>\n    <string name=\"pref_title_notifications_enabled\">การแจ้งเตือนแบบ Push</string>\n    <string name=\"pref_title_edit_notification_settings\">ตั้งค่าการแจ้งเตือน</string>\n    <string name=\"visibility_direct\">ไดเร็กต์:โพสต์ให้เฉพาะผู้ที่ถูกกล่าวถึงเห็น</string>\n    <string name=\"visibility_private\">เฉพาะผู้ติดตาม:โพสต์ให้เฉพาะผู้ติดตามเห็น</string>\n    <string name=\"visibility_unlisted\">ไม่อยู่ในรายการ:ไม่แสดงในไทม์ไลน์สาธารณะ</string>\n    <string name=\"visibility_public\">สาธารณะ:โพสต์ในไทม์ไลน์สาธารณะ</string>\n    <string name=\"dialog_mute_warning\">ปิดเสียง @%1$s?</string>\n    <string name=\"dialog_block_warning\">บล็อก @%1$s?</string>\n    <string name=\"mute_domain_warning_dialog_ok\">ซ่อนทั้งโดเมน</string>\n    <string name=\"mute_domain_warning\">ต้องการบล็อกทุกอย่างจาก %1$s ? คุณจะไม่เห็นเนื้อหาจากโดเมนนั้นในไทม์ไลน์สาธารณะหรือในการแจ้งเตือน ผู้ติดตามของคุณจากโดเมนนั้นจะถูกลบออก</string>\n    <string name=\"dialog_redraft_post_warning\">ลบ แล้ว ร่าง Toot นี้ใหม่?</string>\n    <string name=\"dialog_delete_post_warning\">ลบ Toot นี้?</string>\n    <string name=\"dialog_unfollow_warning\">เลิกติดตามผู้ใช้นี้?</string>\n    <string name=\"dialog_message_cancel_follow_request\">ยกเลิกคำขอติดตาม?</string>\n    <string name=\"dialog_download_image\">ดาวน์โหลด</string>\n    <string name=\"dialog_message_uploading_media\">กำลังอัปโหลด…</string>\n    <string name=\"dialog_title_finishing_media_upload\">กำลังอัปโหลดสื่อใกล้เสร็จ</string>\n    <string name=\"dialog_whats_an_instance\">ใส่ที่อยู่หรือโดเมนของ Instance ได้ที่นี่ เช่น mastodon.social icosahedron.website social.tchncs.de และ <a href=\"https://instances.social\">อีกมากมาย!</a> \\u0020\n\\n \\u0020\n\\nถ้ายังไม่มีบัญชี สามารถใส่ชื่อ Instance ที่ต้องการจะร่วมแล้วสร้างบัญชีที่นั่น \\u0020\n\\n \\u0020\n\\nInstance คือที่ที่หนึ่งไว้โฮสต์บัญชีคุณ แต่คุณยังสามารถสื่อสาร ติดตามบุคคลบน Instance อื่นได้เหมือนอยู่บนไซต์เดียวกัน \\u0020\n\\n \\u0020\n\\nพบข้อมูลเพิ่มเติมได้ที่ <a href=\"https://joinmastodon.org\">joinmastodon.org</a> </string>\n    <string name=\"label_header\">ภาพหัวบน</string>\n    <string name=\"login_connection\">กำลังเชื่อมต่อ…</string>\n    <string name=\"label_avatar\">อวตาร</string>\n    <string name=\"label_quick_reply\">ตอบกลับ…</string>\n    <string name=\"search_no_results\">ไม่มีผลลัพธ์</string>\n    <string name=\"hint_search\">ค้นหา…</string>\n    <string name=\"hint_note\">ข้อมูลส่วนตัว</string>\n    <string name=\"hint_display_name\">ชื่อที่ใช้แสดง</string>\n    <string name=\"hint_content_warning\">คำเตือนเนื้อหา</string>\n    <string name=\"hint_compose\">เกิดอะไรขึ้นเอย?</string>\n    <string name=\"hint_domain\">Instance ไหน?</string>\n    <string name=\"confirmation_domain_unmuted\">เลิกซ่อน %1$s แล้ว</string>\n    <string name=\"confirmation_unblocked\">เลิกบล็อกผู้ใช้แล้ว</string>\n    <string name=\"confirmation_unmuted\">เลิกปิดเสียงผู้ใช้นี้แล้ว</string>\n    <string name=\"confirmation_reported\">ส่งแล้ว!</string>\n    <string name=\"send_media_to\">แบ่งปันสื่อไป…</string>\n    <string name=\"send_post_content_to\">แบ่งปัน Toot ไป…</string>\n    <string name=\"send_post_link_to\">แชร์ URL Toot ไป…</string>\n    <string name=\"downloading_media\">กำลังดาวน์โหลดสื่อ</string>\n    <string name=\"download_media\">ดาวน์โหลดสื่อ</string>\n    <string name=\"action_share_as\">แบ่งปันโดย…</string>\n    <string name=\"action_open_as\">เปิดเป็น %1$s</string>\n    <string name=\"action_copy_link\">คัดลอกลิงก์</string>\n    <string name=\"download_image\">กำลังดาวน์โหลด %1$s</string>\n    <string name=\"action_open_media_n\">เปิดสื่อ #%1$d</string>\n    <string name=\"title_links_dialog\">ลิงก์</string>\n    <string name=\"title_mentions_dialog\">โต้ตอบ</string>\n    <string name=\"title_hashtags_dialog\">แฮชแท็ก</string>\n    <string name=\"action_open_faved_by\">ดูชื่นชอบ</string>\n    <string name=\"action_open_reblogged_by\">ดูบสต์</string>\n    <string name=\"action_open_reblogger\">ดูต้นตอบูสต์</string>\n    <string name=\"action_hashtags\">แฮชแท็ก</string>\n    <string name=\"action_mentions\">โต้ตอบ</string>\n    <string name=\"action_links\">ลิงก์</string>\n    <string name=\"action_add_tab\">เพิ่มแท็บ</string>\n    <string name=\"action_schedule_post\">Toot แบบตั้งเวลา</string>\n    <string name=\"action_emoji_keyboard\">คีย์บอร์ดเอโมจิ</string>\n    <string name=\"action_content_warning\">เตือนเนื้อหา</string>\n    <string name=\"action_toggle_visibility\">การมองเห็น Toot</string>\n    <string name=\"action_access_scheduled_posts\">Toot แบบตั้งเวลา</string>\n    <string name=\"action_access_drafts\">ฉบับร่าง</string>\n    <string name=\"action_reject\">ปฏิเสธ</string>\n    <string name=\"action_accept\">ยอมรับ</string>\n    <string name=\"action_undo\">ยกเลิก</string>\n    <string name=\"action_edit_own_profile\">แก้ไข</string>\n    <string name=\"action_save\">บันทึก</string>\n    <string name=\"action_open_drawer\">เปิดเมนู</string>\n    <string name=\"action_hide_media\">ซ่อนสื่อ</string>\n    <string name=\"action_mention\">กล่าวถึง</string>\n    <string name=\"action_unmute_conversation\">เลิกปิดเสียงการสนทนา</string>\n    <string name=\"action_mute_conversation\">ปิดเสียงการสนทนานี้</string>\n    <string name=\"action_mute_domain\">ปิดเสียง %1$s</string>\n    <string name=\"action_unmute\">เลิกปิดเสียง</string>\n    <string name=\"action_mute\">ปิดเสียง</string>\n    <string name=\"action_share\">แบ่งปัน</string>\n    <string name=\"action_photo_take\">ถ่ายภาพ</string>\n    <string name=\"action_add_poll\">เพิ่มโพล</string>\n    <string name=\"action_add_media\">เพิ่มสื่อ</string>\n    <string name=\"action_open_in_web\">เปิดในเบราว์เซอร์</string>\n    <string name=\"action_view_media\">สื่อ</string>\n    <string name=\"action_view_follow_requests\">คำขอติดตาม</string>\n    <string name=\"action_view_domain_mutes\">โดเมนที่ซ่อนไว้</string>\n    <string name=\"action_view_blocks\">ผู้ใช้ที่ถูกบล็อกไว้</string>\n    <string name=\"action_view_mutes\">ผู้ใช้ที่ปิดเสียงไว้</string>\n    <string name=\"action_view_bookmarks\">ที่คั่นหน้า</string>\n    <string name=\"action_view_favourites\">ชื่นชอบ</string>\n    <string name=\"action_view_profile\">โปรไฟล์</string>\n    <string name=\"action_close\">ปิด</string>\n    <string name=\"action_retry\">ลองอีกครั้ง</string>\n    <string name=\"action_send_public\">โพสต์!</string>\n    <string name=\"action_send\">โพสต์</string>\n    <string name=\"action_delete_and_redraft\">ลบแล้วร่างใหม่</string>\n    <string name=\"action_delete\">ลบ</string>\n    <string name=\"action_edit\">แก้ไข</string>\n    <string name=\"action_report\">รายงาน</string>\n    <string name=\"action_show_reblogs\">แสดงการดัน</string>\n    <string name=\"action_hide_reblogs\">ซ่อนการดัน</string>\n    <string name=\"action_unblock\">เลิกบล็อก</string>\n    <string name=\"action_block\">บล็อก</string>\n    <string name=\"action_unfollow\">เลิกติดตาม</string>\n    <string name=\"action_follow\">ติดตาม</string>\n    <string name=\"action_logout_confirm\">คุณต้องการออกจากระบบของบัญชี %1$s หรือไม่?</string>\n    <string name=\"action_compose\">เขียนโพสต์ใหม่</string>\n    <string name=\"action_more\">อื่น ๆ</string>\n    <string name=\"action_unfavourite\">เลิกชื่นชอบ</string>\n    <string name=\"action_bookmark\">คั่นหน้า</string>\n    <string name=\"action_favourite\">ชื่นชอบ</string>\n    <string name=\"action_unreblog\">ลบการดัน</string>\n    <string name=\"action_reblog\">ดัน</string>\n    <string name=\"action_reply\">ตอบกลับ</string>\n    <string name=\"action_quick_reply\">ตอบกลับด่วน</string>\n    <string name=\"report_comment_hint\">ความคิดเห็นเพิ่มเติม</string>\n    <string name=\"report_username_format\">รายงาน @%1$s</string>\n    <string name=\"notification_follow_request_format\">%1$s ต้องการติดตามคุณ</string>\n    <string name=\"notification_follow_format\">%1$s ได้ติดตามคุณ</string>\n    <string name=\"notification_favourite_format\">%1$s ได้ชื่นชอบโพสต์ของคุณ</string>\n    <string name=\"notification_reblog_format\">%1$s ได้ดันโพสต์ของคุณ</string>\n    <string name=\"footer_empty\">ไม่มีอะไรที่นี่ ลากลงเพื่อรีเฟรช!</string>\n    <string name=\"message_empty\">ไม่มีอะไรที่นี่</string>\n    <string name=\"post_content_show_less\">ย่อ</string>\n    <string name=\"post_content_show_more\">ขยาย</string>\n    <string name=\"post_content_warning_show_less\">แสดงน้อยลง</string>\n    <string name=\"post_content_warning_show_more\">แสดงเพิ่มเติม</string>\n    <string name=\"post_sensitive_media_directions\">แตะเพื่อดู</string>\n    <string name=\"post_media_hidden_title\">ซ่อนสื่ออยู่</string>\n    <string name=\"post_sensitive_media_title\">เนื้อหาอ่อนไหว</string>\n    <string name=\"post_boosted_format\">%1$s ได้ดัน</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"title_licenses\">สัญญาอนุญาต</string>\n    <string name=\"title_scheduled_posts\">โพสต์แบบกำหนดเวลา</string>\n    <string name=\"title_edit_profile\">แก้ไขโปรไฟล์</string>\n    <string name=\"title_follow_requests\">คำขอติดตาม</string>\n    <string name=\"title_domain_mutes\">โดเมนที่ซ่อนไว้</string>\n    <string name=\"title_blocks\">ผู้ใช้ที่ถูกบล็อก</string>\n    <string name=\"title_mutes\">ผู้ใช้ที่ปิดเสียงไว้</string>\n    <string name=\"title_bookmarks\">ที่คั่นหน้า</string>\n    <string name=\"title_followers\">ผู้ติดตาม</string>\n    <string name=\"title_follows\">ติดตาม</string>\n    <string name=\"title_posts_pinned\">ปักหมุด</string>\n    <string name=\"title_posts_with_replies\">โพสต์และตอบกลับ</string>\n    <string name=\"title_posts\">โพสต์</string>\n    <string name=\"title_view_thread\">โพสต์</string>\n    <string name=\"title_tab_preferences\">แท็บ</string>\n    <string name=\"title_direct_messages\">ข้อความโดยตรง</string>\n    <string name=\"title_public_federated\">ที่ติดต่อกับภายนอก</string>\n    <string name=\"title_public_local\">ในเซิร์ฟเวอร์</string>\n    <string name=\"title_notifications\">การแจ้งเตือน</string>\n    <string name=\"title_home\">หน้าหลัก</string>\n    <string name=\"error_sender_account_gone\">การส่งโพสต์เกิดความผิดพลาด</string>\n    <string name=\"error_media_upload_sending\">อัปโหลดล้มเหลว</string>\n    <string name=\"error_media_upload_image_or_video\">ไม่สามารถแนบรูปภาพและวิดีโอในโพสต์เดียวกันได้</string>\n    <string name=\"error_media_download_permission\">ต้องมีสิทธิ์จัดเก็บสื่อ</string>\n    <string name=\"error_media_upload_permission\">ต้องมีสิทธิ์อ่านสื่อ</string>\n    <string name=\"error_media_upload_opening\">ไม่สามารถเปิดไฟล์ได้</string>\n    <string name=\"error_media_upload_type\">ไม่สามารถอัปโหลดไฟล์ประเภทนี้ได้</string>\n    <string name=\"error_compose_character_limit\">ข้อความสถานะยาวเกินไป!</string>\n    <string name=\"error_retrieving_oauth_token\">ไม่สามารถรับโทเค็นการเข้าสู่ระบบ</string>\n    <string name=\"error_authorization_denied\">การขออนุญาตสิทธิถูกปฏิเสธ</string>\n    <string name=\"error_authorization_unknown\">เกิดข้อผิดพลาดในการขออนุญาตสิทธิโดยไม่ทราบสาเหตุ</string>\n    <string name=\"error_no_web_browser_found\">ไม่พบเว็บเบราว์เซอร์ที่จะใช้งาน</string>\n    <string name=\"error_invalid_domain\">โดเมนที่ป้อนไม่ถูกต้อง</string>\n    <string name=\"error_empty\">ต้องใส่ข้อความ</string>\n    <string name=\"error_network\">เกิดข้อผิดพลาดเครือข่าย! กรุณาตรวจสอบการเชื่อมต่อและลองอีกครั้ง!</string>\n    <string name=\"error_generic\">เกิดข้อผิดพลาด</string>\n    <string name=\"title_lists\">รายการ</string>\n    <string name=\"action_lists\">รายการ</string>\n    <string name=\"about_title_activity\">เกี่ยวกับแอปนี้</string>\n    <string name=\"action_reset_schedule\">ล้างค่า</string>\n    <string name=\"action_search\">ค้นหา</string>\n    <string name=\"action_edit_profile\">แก้ไขโปรไฟล์</string>\n    <string name=\"action_view_account_preferences\">การกำหนดลักษณะบัญชี</string>\n    <string name=\"action_view_preferences\">การกำหนดลักษณะ</string>\n    <string name=\"action_logout\">ออกจากระบบ</string>\n    <string name=\"title_drafts\">ฉบับร่าง</string>\n    <string name=\"title_favourites\">ชื่นชอบ</string>\n    <string name=\"error_failed_app_registration\">การยืนยันตัวตนกับเซิร์ฟเวอร์นั้นล้มเหลว</string>\n    <string name=\"link_whats_an_instance\">Instance คือ?</string>\n    <string name=\"action_login\">เข้าสู่ระบบด้วย Mastodon</string>\n    <string name=\"poll_allow_multiple_choices\">เลือกได้หลายตัวเลือก</string>\n    <string name=\"pref_title_confirm_reblogs\">แสดงข้อความยืนยันก่อนที่จะบูสต์</string>\n    <string name=\"pref_title_show_cards_in_timelines\">แสดงตัวอย่างลิงก์ในไทม์ไลน์</string>\n    <string name=\"warning_scheduling_interval\">Mastodon กำหนดเวลาขั้นต่ำ 5 นาที</string>\n    <string name=\"no_scheduled_posts\">ไม่มีสถานะแบบตั้งเวลาใด ๆ</string>\n    <string name=\"no_drafts\">ไม่มีฉบับร่างใด ๆ</string>\n    <string name=\"post_lookup_error_format\">การค้นหาโพสต์ %1$s เกิดข้อผิดผลาด</string>\n    <string name=\"edit_poll\">แก้ไข</string>\n    <string name=\"poll_new_choice_hint\">ตัวเลือกที่ %1$d</string>\n    <string name=\"pref_main_nav_position_option_bottom\">ล่าง</string>\n    <string name=\"pref_main_nav_position_option_top\">บน</string>\n    <string name=\"pref_main_nav_position\">ตำแหน่งการนำทางหลัก</string>\n    <string name=\"pref_title_gradient_for_media\">แสดงการไล่ระดับสีสันสำหรับสื่อที่ถูกซ่อนไว้</string>\n    <string name=\"action_unmute_domain\">เลิกปิดเสียง %1$s</string>\n    <string name=\"action_unmute_desc\">เลิกปิดเสียง %1$s</string>\n    <string name=\"dialog_mute_hide_notifications\">ซ่อนการแจ้งเตือน</string>\n    <string name=\"pref_title_hide_top_toolbar\">ซ่อนหัวข้อของแถบเครื่องมือด้านบน</string>\n    <string name=\"drafts_post_failed_to_send\">ล้มเหลวในการส่งโพสต์นี้!</string>\n    <string name=\"wellbeing_mode_notice\">ข้อมูลบางอย่างที่อาจส่งผลต่อสุขภาพจิตของคุณจะถูกซ่อนไว้ซึ่งรวมถึง:\n\\n\n\\n- การแจ้งเตือน ชื่นชอบ/ดัน/ติดตาม\n\\n- จำนวนการ ชื่นชอบ/ดัน บนโพสต์\n\\n- สถิติ ผู้ติดตาม/โพสต์ ในโปรไฟล์\n\\n\n\\n การแจ้งเตือนแบบพุชจะไม่ได้รับผลกระทบ แต่คุณสามารถตรวจสอบการตั้งค่าการแจ้งเตือนได้ด้วยตนเอง</string>\n    <string name=\"limit_notifications\">แจ้งเตือน Limit timeline</string>\n    <string name=\"review_notifications\">แจ้งเตือน Review</string>\n    <string name=\"wellbeing_hide_stats_profile\">ซ่อนสถิติเชิงปริมาณในโปรไฟล์</string>\n    <string name=\"wellbeing_hide_stats_posts\">ซ่อนสถิติเชิงปริมาณของโพสต์</string>\n    <string name=\"pref_title_wellbeing_mode\">สุขภาวะ</string>\n    <string name=\"account_note_hint\">บันทึกส่วนตัวของคุณเกี่ยวกับบัญชีนี้</string>\n    <string name=\"notification_subscription_description\">แจ้งเตือน เมื่อคนที่คุณติดตาม ได้เผยแพร่โพสต์ใหม่</string>\n    <string name=\"drafts_post_reply_removed\">โพสต์ที่คุณได้ร่างตอบไว้ ถูกลบแลัว</string>\n    <string name=\"draft_deleted\">ลบฉบับร่างแล้ว</string>\n    <string name=\"drafts_failed_loading_reply\">ล้มเหลวในการโหลดข้อมูลตอบกลับ</string>\n    <string name=\"dialog_delete_list_warning\">คุณต้องการลบลิสต์ %1$s ใช่ไหม?</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"other\">คุณไม่สามารถอัปโหลดไฟล์แนบมากกว่า %1$d ได้</item>\n    </plurals>\n    <string name=\"account_note_saved\">บันทึกแล้ว!</string>\n    <string name=\"no_announcements\">ไม่มีประกาศ</string>\n    <string name=\"duration_indefinite\">ไม่มีกำหนด</string>\n    <string name=\"label_duration\">ระยะเวลา</string>\n    <string name=\"post_media_attachments\">ไฟล์แนบ</string>\n    <string name=\"post_media_audio\">เสียง</string>\n    <string name=\"notification_subscription_name\">โพสต์ใหม่</string>\n    <string name=\"notification_subscription_format\">%1$s เพิ่งโพสต์</string>\n    <string name=\"title_announcements\">ประกาศ</string>\n    <string name=\"action_delete_conversation\">ลบการสนทนา</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-tr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">Bir hata oluştu.</string>\n    <string name=\"error_network\">Bir ağ hatası oluştu. Lütfen bağlantını kontrol et ve tekrar dene.</string>\n    <string name=\"error_empty\">Bu alan boş bırakılamaz.</string>\n    <string name=\"error_invalid_domain\">Girilen alan adı geçersiz</string>\n    <string name=\"error_failed_app_registration\">Bu sunucu da kimlik doğrulama başarısız oldu. Sorun devam ederse menüdeki Tarayıcıyla Giriş Yap seçeneğini deneyiniz.</string>\n    <string name=\"error_no_web_browser_found\">Kullanılabilir web tarayıcısı bulunamadı.</string>\n    <string name=\"error_authorization_unknown\">Tanımlanamayan bir yetkilendirme hatası oluştu. Sorun devam ederse menüdeki Tarayıcı ile Giriş Yap seçeneğini deneyiniz.</string>\n    <string name=\"error_authorization_denied\">Yetkilendirme reddedildi. Doğru hesap bilgilerini girdiğinizden eminseniz menüdeki Tarayıcı ile Giriş Yap seçeneğini deneyiniz.</string>\n    <string name=\"error_retrieving_oauth_token\">Giriş belirteci alınırken hata oluştu. Sorun devam ederse menüdeki Tarayıcı ile Giriş Yap seçeneğini deneyiniz.</string>\n    <string name=\"error_compose_character_limit\">Gönderi çok uzun!</string>\n    <string name=\"error_media_upload_type\">Bu tür bir dosya yüklenemez.</string>\n    <string name=\"error_media_upload_opening\">Dosya açılamadı.</string>\n    <string name=\"error_media_upload_permission\">Medya okuma izni gerekli.</string>\n    <string name=\"error_media_download_permission\">Medya kaydetme izni gerekli.</string>\n    <string name=\"error_media_upload_image_or_video\">Görüntüler ve videolar aynı gönderi de yayınlanamaz.</string>\n    <string name=\"error_media_upload_sending\">Yükleme başarısız oldu.</string>\n    <string name=\"error_sender_account_gone\">Gönderi yayınlanırken hata.</string>\n    <string name=\"title_home\">Anasayfa</string>\n    <string name=\"title_notifications\">Bildirimler</string>\n    <string name=\"title_public_local\">Yerel</string>\n    <string name=\"title_public_federated\">Federasyon</string>\n    <string name=\"title_direct_messages\">Doğrudan iletiler</string>\n    <string name=\"title_tab_preferences\">Sekmeler</string>\n    <string name=\"title_view_thread\">Konu</string>\n    <string name=\"title_posts\">Gönderiler</string>\n    <string name=\"title_posts_with_replies\">Yanıtlar</string>\n    <string name=\"title_posts_pinned\">Sabitlenen</string>\n    <string name=\"title_follows\">Takip edilenler</string>\n    <string name=\"title_followers\">Takipçiler</string>\n    <string name=\"title_favourites\">Gözdeler</string>\n    <string name=\"title_mutes\">Sessize alınmış kullanıcılar</string>\n    <string name=\"title_blocks\">Engellenmiş kullanıcılar</string>\n    <string name=\"title_follow_requests\">Takip istekleri</string>\n    <string name=\"title_edit_profile\">Profili düzenle</string>\n    <string name=\"title_drafts\">Taslaklar</string>\n    <string name=\"title_licenses\">Lisanslar</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s yeniden paylaştı</string>\n    <string name=\"post_sensitive_media_title\">Hassas medya</string>\n    <string name=\"post_media_hidden_title\">Gizlenmiş medya</string>\n    <string name=\"post_sensitive_media_directions\">Görüntülemek için dokunun</string>\n    <string name=\"post_content_warning_show_more\">Daha fazla göster</string>\n    <string name=\"post_content_warning_show_less\">Daha az göster</string>\n    <string name=\"post_content_show_more\">Genişlet</string>\n    <string name=\"post_content_show_less\">Daralt</string>\n    <string name=\"message_empty\">Burada hiçbir şey yok.</string>\n    <string name=\"footer_empty\">Burada henüz hiç birşey yok. Yenilemek için aşağıya çekin!</string>\n    <string name=\"notification_reblog_format\">%1$s gönderinizi paylaştı</string>\n    <string name=\"notification_favourite_format\">%1$s gönderinizi gözdelerilerine ekledi</string>\n    <string name=\"notification_follow_format\">%1$s seni takip etti</string>\n    <string name=\"report_username_format\">Bildir @%1$s</string>\n    <string name=\"report_comment_hint\">Daha fazla yorum?</string>\n    <string name=\"action_quick_reply\">Hızlı yanıt</string>\n    <string name=\"action_reply\">Yanıtla</string>\n    <string name=\"action_reblog\">Yeniden Paylaş</string>\n    <string name=\"action_favourite\">Gözdele</string>\n    <string name=\"action_more\">Devamı</string>\n    <string name=\"action_compose\">Oluştur</string>\n    <string name=\"action_login\">Tusky ile giriş yap</string>\n    <string name=\"action_logout\">Oturumu kapat</string>\n    <string name=\"action_logout_confirm\">Bu oturumu sonlandırmak istediğinizden emin misiniz%1$s? Bu, taslaklar ve tercihler dahil olmak üzere hesabın tüm yerel verilerini silecektir.</string>\n    <string name=\"action_follow\">Takip et</string>\n    <string name=\"action_unfollow\">Takibi bırak</string>\n    <string name=\"action_block\">Engelle</string>\n    <string name=\"action_unblock\">Engeli kaldır</string>\n    <string name=\"action_hide_reblogs\">Yeniden gönderiyi gizle</string>\n    <string name=\"action_show_reblogs\">Yeniden gönderileri göster</string>\n    <string name=\"action_report\">Bildir</string>\n    <string name=\"action_delete\">Sil</string>\n    <string name=\"action_send\">GÖNDER</string>\n    <string name=\"action_send_public\">GÖNDER!</string>\n    <string name=\"action_retry\">Tekrar dene</string>\n    <string name=\"action_close\">Kapat</string>\n    <string name=\"action_view_profile\">Profil</string>\n    <string name=\"action_view_preferences\">Tercihler</string>\n    <string name=\"action_view_account_preferences\">Hesap tercihleri</string>\n    <string name=\"action_view_favourites\">Gözdeler</string>\n    <string name=\"action_view_mutes\">Sessize alınmış kullanıcılar</string>\n    <string name=\"action_view_blocks\">Engellenmiş kullanıcılar</string>\n    <string name=\"action_view_follow_requests\">Takip istekleri</string>\n    <string name=\"action_view_media\">Medya</string>\n    <string name=\"action_open_in_web\">Tarayıcıda aç</string>\n    <string name=\"action_add_media\">Medya ekle</string>\n    <string name=\"action_photo_take\">Fotoğraf çek</string>\n    <string name=\"action_share\">Paylaş</string>\n    <string name=\"action_mute\">Sessize al</string>\n    <string name=\"action_unmute\">Sessizden çıkar</string>\n    <string name=\"action_mention\">Bahset</string>\n    <string name=\"action_hide_media\">Medyayı gizle</string>\n    <string name=\"action_open_drawer\">Çekmece aç</string>\n    <string name=\"action_save\">Kaydet</string>\n    <string name=\"action_edit_profile\">Profili düzenle</string>\n    <string name=\"action_edit_own_profile\">Düzenle</string>\n    <string name=\"action_undo\">Geri al</string>\n    <string name=\"action_accept\">Kabul et</string>\n    <string name=\"action_reject\">Reddet</string>\n    <string name=\"action_search\">Ara</string>\n    <string name=\"action_access_drafts\">Taslaklar</string>\n    <string name=\"action_toggle_visibility\">Gönderi görünürlüğü</string>\n    <string name=\"action_content_warning\">İçerik uyarısı</string>\n    <string name=\"action_emoji_keyboard\">İfade klavyesi</string>\n    <string name=\"action_add_tab\">Sekme ekle</string>\n    <string name=\"download_image\">%1$s İndiriliyor</string>\n    <string name=\"action_copy_link\">Bağlantıyı kopyala</string>\n    <string name=\"action_open_as\">Farklı aç %1$s</string>\n    <string name=\"action_share_as\">Olarak paylaş …</string>\n    <string name=\"send_post_link_to\">Gönderi bağlantısını paylaş…</string>\n    <string name=\"send_post_content_to\">Gönderiyi paylaş…</string>\n    <string name=\"send_media_to\">Medyayı paylaş…</string>\n    <string name=\"confirmation_reported\">Gönderildi!</string>\n    <string name=\"confirmation_unblocked\">Kullanıcının engeli kaldırıldı</string>\n    <string name=\"confirmation_unmuted\">Kullanıcının sesi açıldı</string>\n    <string name=\"hint_domain\">Hangi sunucu?</string>\n    <string name=\"hint_compose\">Neler oluyor?</string>\n    <string name=\"hint_content_warning\">İçerik uyarısı</string>\n    <string name=\"hint_display_name\">Görünen ad</string>\n    <string name=\"hint_note\">Biyografi</string>\n    <string name=\"hint_search\">Ara…</string>\n    <string name=\"search_no_results\">Sonuç bulunamadı</string>\n    <string name=\"label_quick_reply\">Yanıt…</string>\n    <string name=\"label_avatar\">Profil Görseli</string>\n    <string name=\"label_header\">Başlık</string>\n    <string name=\"link_whats_an_instance\">Sunucu nedir?</string>\n    <string name=\"login_connection\">Bağlantı kuruluyor…</string>\n    <string name=\"dialog_whats_an_instance\">Mastodon gibi herhangi bir adresi veya etki alanını buraya girilebilirsiniz. örneğin: https://mastodon.social, https://mastodon.online, https://qoto.org vb. <a href=\"https://instances.social\">daha fazlası!</a> \\u0020 \n\\n \\u0020 \n\\nHenüz hesabınız yoksa, katılmak istediğiniz sunucunun adını girebilir ve orada bir hesap oluşturabilirsiniz. \\u0020 \n\\n \\u0020 \n\\nSunucu, hesabınızın barındırıldığı tek yerdir, ancak aynı sitedeymişsiniz gibi diğer sunuculardaki kişilerle kolayca iletişim kurabilir ve onları takip edebilirsiniz. \\u0020 \n\\n \\u0020 \n\\n Daha fazla bilgiyi <a href=\"https://joinmastodon.org\">joinmastodon.org</a> adresinde bulabilirsiniz. \\u0020</string>\n    <string name=\"dialog_title_finishing_media_upload\">Medya yüklemesi tamamlanıyor</string>\n    <string name=\"dialog_message_uploading_media\">Yükleniyor…</string>\n    <string name=\"dialog_download_image\">İndir</string>\n    <string name=\"dialog_message_cancel_follow_request\">Takip isteğini iptal et?</string>\n    <string name=\"dialog_unfollow_warning\">Takibi bırakmak istiyor musunuz?</string>\n    <string name=\"dialog_delete_post_warning\">Bu durumu silmek istiyor musunuz?</string>\n    <string name=\"visibility_public\">Herkese Açık: Herkese açık ağ akışında göster</string>\n    <string name=\"visibility_unlisted\">Listelenmemiş: Herkese açık ağ akışında gösterme</string>\n    <string name=\"visibility_private\">Özel: Sadece takipçiler ve bahsedilenlere açık</string>\n    <string name=\"visibility_direct\">Doğrudan: Sadece bahsedilen kullanıcılara açık</string>\n    <string name=\"pref_title_edit_notification_settings\">Bildirimler</string>\n    <string name=\"pref_title_notifications_enabled\">Anlık bildirimler</string>\n    <string name=\"pref_title_notification_alerts\">Uyarılar</string>\n    <string name=\"pref_title_notification_alert_sound\">Sesli bildirim</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Titreşimli bildirim</string>\n    <string name=\"pref_title_notification_alert_light\">Işıklı bildirim</string>\n    <string name=\"pref_title_notification_filters\">Etkin bildirim türleri</string>\n    <string name=\"pref_title_appearance_settings\">Görünüş</string>\n    <string name=\"pref_title_app_theme\">Uygulama teması</string>\n    <string name=\"pref_title_timelines\">Ağ akışı</string>\n    <string name=\"app_them_dark\">Koyu</string>\n    <string name=\"app_theme_light\">Açık</string>\n    <string name=\"app_theme_black\">Siyah</string>\n    <string name=\"app_theme_auto\">Gün batımında otomatik</string>\n    <string name=\"pref_title_browser_settings\">Tarayıcı</string>\n    <string name=\"pref_title_custom_tabs\">Chrome Özel Sekmelerini Kullan</string>\n    <string name=\"pref_title_post_filter\">Ağ akışı süzgeçleme</string>\n    <string name=\"pref_title_post_tabs\">Anasayfa zaman akışı</string>\n    <string name=\"pref_title_show_boosts\">Yeniden paylaşımları göster</string>\n    <string name=\"pref_title_show_replies\">Yanıtları göster</string>\n    <string name=\"pref_title_show_media_preview\">Medya önizlemelerini indir</string>\n    <string name=\"pref_title_proxy_settings\">Vekil</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP vekil sunucu</string>\n    <string name=\"pref_title_http_proxy_enable\">HTTP vekil sunucu etkinleştir</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP vekil sunucusu</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP vekil sunucu portu</string>\n    <string name=\"pref_default_post_privacy\">Gönderi gizliliği (sunucu ile eşleşir)</string>\n    <string name=\"pref_default_media_sensitivity\">Medyayı her zaman hassas olarak işaretle (sunucu ile eşleşir)</string>\n    <string name=\"pref_publishing\">Varsayılan gönderiler</string>\n    <string name=\"pref_failed_to_sync\">Ayarlar eşitlendirilemedi</string>\n    <string name=\"post_privacy_public\">Herkese açık</string>\n    <string name=\"post_privacy_unlisted\">Liste dışı</string>\n    <string name=\"post_privacy_followers_only\">Sadece takipçiler</string>\n    <string name=\"pref_post_text_size\">Yayın metin boyutu</string>\n    <string name=\"post_text_size_smallest\">Çok küçük</string>\n    <string name=\"post_text_size_small\">Küçük</string>\n    <string name=\"post_text_size_medium\">Orta</string>\n    <string name=\"post_text_size_large\">Büyük</string>\n    <string name=\"post_text_size_largest\">En büyük</string>\n    <string name=\"notification_mention_name\">Yeni bahsetmeler</string>\n    <string name=\"notification_mention_descriptions\">Yeni bahsetmeler hakkında bildirim</string>\n    <string name=\"notification_follow_name\">Yeni takipçiler</string>\n    <string name=\"notification_follow_description\">Yeni takipçiler hakkında bildirim</string>\n    <string name=\"notification_boost_name\">Yeniden Paylaşımlar</string>\n    <string name=\"notification_boost_description\">Yayınların paylaşıldığında bildirimler</string>\n    <string name=\"notification_favourite_name\">Gözdeler</string>\n    <string name=\"notification_favourite_description\">Yayınların gözde olarak işaretlendiğinde</string>\n    <string name=\"notification_mention_format\">%1$s senden bahsetti</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s ve %4$d diğer</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s ve %3$s</string>\n    <string name=\"notification_summary_small\">%1$s ve %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d yeni etkileşim</item>\n        <item quantity=\"other\">%1$d yeni etkileşimler</item>\n    </plurals>\n    <string name=\"description_account_locked\">Kilitli Hesap</string>\n    <string name=\"about_title_activity\">Hakkında</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_tusky_license\">Tusky özgür ve açık kaynak bir yazılımdır. GNU Genel Kamu Lisansı sürüm 3 altında lisanslanmıştır. Lisansı buradan görüntüleyebilirsiniz: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">Proje web sayfası: https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">Hata raporları ve özellik istekleri:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Tusky\\'nin Profili</string>\n    <string name=\"post_share_content\">Gönderinin içeriğini paylaş</string>\n    <string name=\"post_share_link\">Gönderinin bağlantısını paylaş</string>\n    <string name=\"post_media_images\">Görseller</string>\n    <string name=\"post_media_video\">Video</string>\n    <string name=\"state_follow_requested\">Takip istenen</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">%1$dy içinde</string>\n    <string name=\"abbreviated_in_days\">%1$dd içinde</string>\n    <string name=\"abbreviated_in_hours\">%1$dh içinde</string>\n    <string name=\"abbreviated_in_minutes\">%1$dm içinde</string>\n    <string name=\"abbreviated_in_seconds\">%1$ds içinde</string>\n    <string name=\"abbreviated_years_ago\">%1$dy</string>\n    <string name=\"abbreviated_days_ago\">%1$dd</string>\n    <string name=\"abbreviated_hours_ago\">%1$dh</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dm</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"follows_you\">Seni takip ediyor</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Her zaman hassas ortamları göster</string>\n    <string name=\"title_media\">Medya</string>\n    <string name=\"load_more_placeholder_text\">Daha fazlası</string>\n    <string name=\"add_account_name\">Hesap Ekle</string>\n    <string name=\"add_account_description\">Yeni Mastodon hesabı ekle</string>\n    <string name=\"action_lists\">Listeler</string>\n    <string name=\"title_lists\">Listeler</string>\n    <string name=\"compose_active_account_description\">%1$s hesabıyla gönderiliyor</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">İçeriği görme engelliler için açıkla (%1$d karakter limiti)</item>\n        <item quantity=\"other\">İçerikleri görme engelliler için açıklamalar (%1$d karakter limitleri)</item>\n    </plurals>\n    <string name=\"action_set_caption\">Başlık belirle</string>\n    <string name=\"action_remove\">Kaldır</string>\n    <string name=\"lock_account_label\">Hesabı Kilitle</string>\n    <string name=\"lock_account_label_description\">Takipçileri elle onaylamanız gerekir</string>\n    <string name=\"compose_save_draft\">Taslaklara kaydedilsin mi?</string>\n    <string name=\"send_post_notification_title\">Gönderi gönderiliyor…</string>\n    <string name=\"send_post_notification_error_title\">Gönderi yayınlanırken hata oluştu</string>\n    <string name=\"send_post_notification_channel_name\">Gönderiler Yayınlanıyor</string>\n    <string name=\"send_post_notification_cancel_title\">Gönderme iptal edildi</string>\n    <string name=\"send_post_notification_saved_content\">Gönderinin bir kopyası taslaklara kaydedildi</string>\n    <string name=\"action_compose_shortcut\">Oluştur</string>\n    <string name=\"error_no_custom_emojis\">%1$s örneğinizin herhangi bir özel ifadesi yok</string>\n    <string name=\"emoji_style\">İfade stili</string>\n    <string name=\"system_default\">Sistem varsayılanı</string>\n    <string name=\"download_fonts\">Önce bu ifade paketini indirmeniz gerekecek</string>\n    <string name=\"performing_lookup_title\">Araştırılıyor…</string>\n    <string name=\"expand_collapse_all_posts\">Tüm durumları Genişlet/Küçült</string>\n    <string name=\"action_open_post\">Gönderiyi aç</string>\n    <string name=\"restart_required\">Uygulamayı yeniden başlatmanız gerekmekte</string>\n    <string name=\"restart_emoji\">Bu değişiklikleri uygulamak için Tusky\\'yi yeniden başlatmanız gerekecek</string>\n    <string name=\"later\">Sonra</string>\n    <string name=\"restart\">Yeniden başlat</string>\n    <string name=\"caption_systememoji\">Cihazınızın varsayılan ifade paketi</string>\n    <string name=\"caption_blobmoji\">Android 4.4–7.1\\'den bilinen Blob ifadeleri</string>\n    <string name=\"caption_twemoji\">Mastodon\\'un standart ifade paketi</string>\n    <string name=\"download_failed\">İndirme başarısız</string>\n    <string name=\"account_moved_description\">%1$s buraya taşındı:</string>\n    <string name=\"unreblog_private\">Yeniden paylaşımı iptal et</string>\n    <string name=\"license_description\">Tusky aşağıdakı açık kaynaklı projelerden kod ve materyal içeriyor:</string>\n    <string name=\"license_apache_2\">Apache Lisansı altında lisanslanmıştır (kopya aşağıda)</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">Profil meta verileri</string>\n    <string name=\"profile_metadata_add\">veri ekle</string>\n    <string name=\"profile_metadata_label_label\">Etiket</string>\n    <string name=\"profile_metadata_content_label\">İçerik</string>\n    <string name=\"pref_title_absolute_time\">Kesin tarih kullan</string>\n    <string name=\"label_remote_account\">Aşağıdaki bilgiler değişken olabilir. Tüm profili tarayıcıda görmek için tuşlayın.</string>\n    <string name=\"unpin_action\">Sabitlemeyi kaldır</string>\n    <string name=\"pin_action\">Sabitle</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\"><b>%1$s</b> Gözde</item>\n        <item quantity=\"other\"><b>%1$s</b> Gözdeler</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\"><b>%1$s</b> Paylaşan</item>\n        <item quantity=\"other\"><b>%1$s</b> Paylaşanlar</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">tarafından paylaşıldı</string>\n    <string name=\"title_favourited_by\">Tarafından gözdelendi</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s ve %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s ve %3$d dahası</string>\n    <string name=\"title_domain_mutes\">Gizli alan adları</string>\n    <string name=\"action_unreblog\">Yeniden paylaşmaktan vazgeç</string>\n    <string name=\"action_unfavourite\">Gözdeyi kaldır</string>\n    <string name=\"action_view_domain_mutes\">Gizli alan adları</string>\n    <string name=\"action_mute_domain\">%1$s alan adını sessize al</string>\n    <string name=\"action_links\">Bağlantılar</string>\n    <string name=\"action_hashtags\">Etiketler</string>\n    <string name=\"action_open_faved_by\">Gözdeleri göster</string>\n    <string name=\"title_hashtags_dialog\">Etiketler</string>\n    <string name=\"title_links_dialog\">Bağlantılar</string>\n    <string name=\"download_media\">Medya indir</string>\n    <string name=\"downloading_media\">Medya indiriliyor</string>\n    <string name=\"mute_domain_warning\">%1$s? alan adından gelen her şeyi engellemek istediğinden emin misin? Bu alan adından gelen içeriği herhangi bir genel zaman tünelinde veya bildirimlerinde göremezsiniz. Bu alan adındaki takipçilerin de kaldırılacak.</string>\n    <string name=\"pref_title_timeline_filters\">Süzgeçler</string>\n    <string name=\"app_theme_system\">Sistem tasarımını kullan</string>\n    <string name=\"pref_title_language\">Dil</string>\n    <string name=\"pref_title_animate_gif_avatars\">Hareketli GIF görsellerini oynat</string>\n    <string name=\"notification_poll_name\">Anket sonuçları</string>\n    <string name=\"notification_poll_description\">Sona eren anketlerle ilgili bildirimler</string>\n    <string name=\"pref_title_public_filter_keywords\">Genel ağ akışı</string>\n    <string name=\"pref_title_thread_filter_keywords\">Konuşmalar</string>\n    <string name=\"filter_addition_title\">Süzgeç ekle</string>\n    <string name=\"filter_edit_title\">Süzgeci düzenle</string>\n    <string name=\"filter_dialog_remove_button\">Kaldır</string>\n    <string name=\"filter_dialog_update_button\">Güncelle</string>\n    <string name=\"filter_dialog_whole_word\">Tüm dünya</string>\n    <string name=\"filter_dialog_whole_word_description\">Bir anahtar kelime veya kelime öbeği sadece alfanümerik olduğunda, yalnızca tüm kelimeyle eşleşirse uygulanır</string>\n    <string name=\"filter_add_description\">Süzgeçlenecek ifade</string>\n    <string name=\"error_create_list\">Liste oluşturulamadı</string>\n    <string name=\"error_rename_list\">Liste oluşturulamadı</string>\n    <string name=\"error_delete_list\">Liste silinemedi</string>\n    <string name=\"action_create_list\">Liste oluştur</string>\n    <string name=\"action_rename_list\">Listeyi güncelle</string>\n    <string name=\"action_delete_list\">Listeyi sil</string>\n    <string name=\"hint_search_people_list\">Takip ettiğim kişilerde ara</string>\n    <string name=\"action_add_to_list\">Listeye hesap ekle</string>\n    <string name=\"action_remove_from_list\">Hesabı listeden kaldır</string>\n    <string name=\"caption_notoemoji\">Google\\'ın mevcut ifade paketi</string>\n    <string name=\"description_post_media\">Ortam: %1$s</string>\n    <string name=\"description_post_cw\">İçerik uyarısı: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Açıklama yok</string>\n    <string name=\"description_post_reblogged\">Yeniden blogladı</string>\n    <string name=\"description_post_favourited\">Gözdelendi</string>\n    <string name=\"description_visibility_public\">Herkese açık</string>\n    <string name=\"description_visibility_unlisted\">Liste dışı</string>\n    <string name=\"description_visibility_private\">Takipçiler</string>\n    <string name=\"description_visibility_direct\">Doğrudan</string>\n    <string name=\"description_poll\">Seçenekli anket: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"hint_list_name\">Liste adı</string>\n    <string name=\"pick_hashtag_hint\"># Etiket olmadan</string>\n    <string name=\"notifications_clear\">Sil</string>\n    <string name=\"notifications_apply_filter\">Süzgeçle</string>\n    <string name=\"filter_apply\">Uygula</string>\n    <string name=\"compose_shortcut_long_label\">Yayın Oluştur</string>\n    <string name=\"compose_shortcut_short_label\">Oluştur</string>\n    <string name=\"notification_clear_text\">Tüm bildirimleri kalıcı olarak silmek istediğinizden emin misiniz?</string>\n    <string name=\"compose_preview_image_description\">%1$s görüntüsü için eylemler</string>\n    <string name=\"poll_info_format\"> \\u0020<!-- 15 oy • 1 saat kaldı --> \\u0020%1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s oy</item>\n        <item quantity=\"other\">%1$s oylar</item>\n    </plurals>\n    <string name=\"poll_info_closed\">kapandı</string>\n    <string name=\"poll_vote\">Oy</string>\n    <string name=\"poll_ended_voted\">Oy verdiğin bir anket sona erdi</string>\n    <string name=\"poll_ended_created\">Oluşturduğun bir anket sona erdi</string>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">%1$d gün kaldı</item>\n        <item quantity=\"other\">%1$d günler kaldı</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">%1$d saat kaldı</item>\n        <item quantity=\"other\">%1$d saatler kaldı</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">%1$d dakika kaldı</item>\n        <item quantity=\"other\">%1$d dakikalar kaldı</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">%1$d saniye kaldı</item>\n        <item quantity=\"other\">%1$d saniyeler kaldı</item>\n    </plurals>\n    <string name=\"button_continue\">Devam</string>\n    <string name=\"button_back\">Geri</string>\n    <string name=\"button_done\">Tamam</string>\n    <string name=\"report_sent_success\">\\@%1$s başarıyla bildirildi</string>\n    <string name=\"hint_additional_info\">Ek Yorumlar</string>\n    <string name=\"report_remote_instance\">%1$s adresine ilet</string>\n    <string name=\"failed_fetch_posts\">Yayınlar getirilemedi</string>\n    <string name=\"report_description_1\">Rapor, sunucunuzun moderatörlerine gönderilecektir. Bu hesabı neden raporladığınızı aşağıya açıklayabilirsiniz:</string>\n    <string name=\"report_description_remote_instance\">Hesap başka bir sunucudan. Raporun anonim bir kopyasını da oraya gönderilsin mi?</string>\n    <string name=\"action_mentions\">Bahsedenler</string>\n    <string name=\"action_open_reblogger\">Gönderi yazanını aç</string>\n    <string name=\"action_open_reblogged_by\">Yeniden paylaşımları göster</string>\n    <string name=\"title_mentions_dialog\">Bahsedenler</string>\n    <string name=\"action_open_media_n\">#%1$d medyayı aç</string>\n    <string name=\"title_bookmarks\">Yerimleri</string>\n    <string name=\"title_scheduled_posts\">Zamanlanmış yayınlar</string>\n    <string name=\"action_bookmark\">Yerimi</string>\n    <string name=\"action_edit\">Düzenle</string>\n    <string name=\"action_delete_and_redraft\">Sil ve düzenle</string>\n    <string name=\"action_view_bookmarks\">Yerimleri</string>\n    <string name=\"action_add_poll\">Anket ekle</string>\n    <string name=\"action_access_scheduled_posts\">Zamanlanmış yayınlar</string>\n    <string name=\"action_schedule_post\">Gönderi tarihini ayarla</string>\n    <string name=\"action_reset_schedule\">Sıfırla</string>\n    <string name=\"dialog_redraft_post_warning\">Bu durumu silip yeniden düzenlemek istiyor musunuz?</string>\n    <string name=\"pref_title_bot_overlay\">Botlar için işaret göster</string>\n    <string name=\"about_powered_by_tusky\">Tusky tarafından desteklenmektedir</string>\n    <string name=\"description_post_bookmarked\">Yerimine eklendi</string>\n    <string name=\"select_list_title\">Liste seç</string>\n    <string name=\"list\">Liste</string>\n    <string name=\"title_accounts\">Hesaplar</string>\n    <string name=\"failed_search\">Arama başarısız</string>\n    <string name=\"create_poll_title\">Anket</string>\n    <string name=\"duration_5_min\">5 dakika</string>\n    <string name=\"duration_30_min\">30 dakika</string>\n    <string name=\"duration_1_hour\">1 saat</string>\n    <string name=\"duration_6_hours\">6 saat</string>\n    <string name=\"duration_1_day\">1 gün</string>\n    <string name=\"duration_3_days\">3 gün</string>\n    <string name=\"duration_7_days\">7 gün</string>\n    <string name=\"add_poll_choice\">Seçenek ekle</string>\n    <string name=\"poll_allow_multiple_choices\">Çoklu seçim</string>\n    <string name=\"edit_poll\">Düzenle</string>\n    <string name=\"replying_to\">Yanıtlanıyor: %1$s</string>\n    <string name=\"profile_badge_bot_text\">Alt Metin</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s alan adını gizleme</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Alan adından her şeyi gizle</string>\n    <string name=\"pref_title_alway_open_spoiler\">Her zaman içerik uyarılarıyla işaretlenmiş alanları genişlet</string>\n    <string name=\"poll_info_time_absolute\">%1$s içinde sona erecek</string>\n    <string name=\"failed_report\">Raporlanamadı</string>\n    <string name=\"poll_new_choice_hint\">Seçenek %1$d</string>\n    <string name=\"post_lookup_error_format\">%1$s gönderisi aranırken hata oluştu</string>\n    <string name=\"no_drafts\">Hiç taslağın yok.</string>\n    <string name=\"no_scheduled_posts\">Zamanlanmış yayınınız yok.</string>\n    <string name=\"reblog_private\">Kendi kitlenizle yeniden paylaşın</string>\n    <string name=\"hashtags\">Etiketler</string>\n    <string name=\"pref_title_confirm_reblogs\">Yeniden paylaşmadan önce onay kutusunu göster</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Bağlantı önizlemelerini zaman tünelinde göster</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Sekmeler arasında geçiş yapmak için kaydırma hareketini etkinleştir</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s kişi</item>\n        <item quantity=\"other\">%1$s kişiler</item>\n    </plurals>\n    <string name=\"add_hashtag_title\">Etiket ekle</string>\n    <string name=\"notification_follow_request_description\">Takip istekleri ile ilgili bildirimler</string>\n    <string name=\"notification_follow_request_name\">Takip istekleri</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Alt</string>\n    <string name=\"pref_main_nav_position_option_top\">Üst</string>\n    <string name=\"dialog_mute_hide_notifications\">Bildirimleri gizle</string>\n    <string name=\"dialog_mute_warning\">\\@%1$s sessize al?</string>\n    <string name=\"dialog_block_warning\">\\@%1$s engellensin mi?</string>\n    <string name=\"action_unmute_domain\">%1$s alan adının sesini aç</string>\n    <string name=\"action_unmute_desc\">%1$s sesini aç</string>\n    <string name=\"notification_follow_request_format\">%1$s seni takip etmek istiyor</string>\n    <string name=\"action_unmute_conversation\">Sohbetin sesini aç</string>\n    <string name=\"action_mute_conversation\">Sohbeti sessize al</string>\n    <string name=\"pref_main_nav_position\">Ana gezinti konumu</string>\n    <string name=\"pref_title_gradient_for_media\">Gizli medya için renkli gradyanlar göster</string>\n    <string name=\"warning_scheduling_interval\">Mastodon\\'un minimum 5 dakikalık zamanlama aralığı vardır.</string>\n    <string name=\"pref_title_hide_top_toolbar\">Üst araç çubuğunun başlığını gizle</string>\n    <string name=\"action_delete_conversation\">Konuşmayı sil</string>\n    <string name=\"title_announcements\">Duyurular</string>\n    <string name=\"error_multimedia_size_limit\">Video ve ses dosyaları %1$s MB boyutunu aşamaz.</string>\n    <string name=\"error_image_edit_failed\">Görsel düzenlenemedi.</string>\n    <string name=\"error_following_hashtag_format\">#%1$s\\'i izleyen hata</string>\n    <string name=\"title_login\">Giriş</string>\n    <string name=\"error_loading_account_details\">Hesap detayları alınırken hata</string>\n    <string name=\"error_could_not_load_login_page\">Giriş ekranı yüklenemedi.</string>\n    <string name=\"error_muting_hashtag_format\">Sessize alma hatası #%1$s</string>\n    <string name=\"action_unfollow_hashtag_format\">Takibi bırak #%1$s?</string>\n    <string name=\"pref_title_wellbeing_mode\">Nicelikselrefah</string>\n    <string name=\"account_note_saved\">Kaydedildi!</string>\n    <string name=\"report_category_spam\">İstenmeyen</string>\n    <string name=\"report_category_other\">Diğer</string>\n    <string name=\"pref_show_self_username_always\">Daima</string>\n    <string name=\"pref_show_self_username_disambiguate\">Birden fazla oturum açıldığında</string>\n    <string name=\"pref_show_self_username_never\">Asla</string>\n    <string name=\"pref_title_confirm_favourites\">Gözdelere eklemeden önce onay kutusunu göster</string>\n    <string name=\"error_unmuting_hashtag_format\">Susturmayı kaldırma hatası #%1$s</string>\n    <string name=\"pref_title_animate_custom_emojis\">Özel ayarlanmış emojileri oynat</string>\n    <string name=\"notification_header_report_format\">%1$s rapor edilmiş %2$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d ekli gönderiler</string>\n    <string name=\"post_edited\">Düzenleme %1$s</string>\n    <string name=\"account_note_hint\">Bu hesap hakkındaki özel notun</string>\n    <string name=\"title_followed_hashtags\">Takip edilen etiketler</string>\n    <string name=\"notification_sign_up_format\">%1$s kaydol</string>\n    <string name=\"action_unbookmark\">Yerimini kaldır</string>\n    <string name=\"drafts_failed_loading_reply\">Yanıt bilgisi yüklenemedi</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">adetten fazla %1$d medya eki yükleyemezsiniz.</item>\n        <item quantity=\"other\">adetten fazla %1$d medya ekleri yükleyemezsiniz.</item>\n    </plurals>\n    <string name=\"delete_scheduled_post_warning\">Bu zamanlanmış yayını sil?</string>\n    <string name=\"instance_rule_info\">Giriş yaparak aşağıdaki kuralları kabul etmiş sayılırsınız %1$s.</string>\n    <string name=\"instance_rule_title\">%1$s kural</string>\n    <string name=\"set_focus_description\">Küçük görsellerde her zaman görülebilecek odak noktasını seçmek için daireye dokunun veya sürükleyin.</string>\n    <string name=\"action_add_or_remove_from_list\">Listeden ekle veya kaldır</string>\n    <string name=\"failed_to_add_to_list\">Hesap listeye eklenemedi</string>\n    <string name=\"failed_to_remove_from_list\">Hesap listeden kaldırılamadı</string>\n    <string name=\"no_announcements\">Hiç duyuru yok.</string>\n    <string name=\"no_lists\">Listen yok.</string>\n    <string name=\"duration_30_days\">30 gün</string>\n    <string name=\"compose_save_draft_loses_media\">Taslağı kurtarmak mı? (Taslağı geri yüklediğinizde ekler yeniden yüklenir.)</string>\n    <string name=\"pref_title_show_self_username\">Kullanıcı adını araç çubuklarında göster</string>\n    <string name=\"duration_180_days\">180 gün</string>\n    <string name=\"duration_60_days\">60 gün</string>\n    <string name=\"duration_90_days\">90 gün</string>\n    <string name=\"pref_default_post_language\">Gönderi dili (sunucu ile eşleşir)</string>\n    <string name=\"notification_report_name\">Raporlar</string>\n    <string name=\"notification_report_description\">Denetleme raporlarıyla ilgili bildirimler</string>\n    <string name=\"duration_no_change\">(değişiklik yok)</string>\n    <string name=\"duration_14_days\">14 gün</string>\n    <string name=\"duration_365_days\">365 gün</string>\n    <string name=\"review_notifications\">Bildirimleri Gözden Geçir</string>\n    <string name=\"wellbeing_mode_notice\">Ruhsal sağlığınızı etkileyebilecek bazı bilgiler gizlenecektir. Buna şunlar dahildir:\n\\n\n\\n- Favori/Başarı/Takip bildirimleri\n\\n- Gönderilerdeki Favori/Başarı sayısı\n\\n- Profillerdeki Takipçi/Gönderi istatistikleri\n\\n\n\\nAnlık bildirimler etkilenmeyecektir, ancak bildirim tercihlerinizi manuel olarak gözden geçirebilirsiniz.</string>\n    <string name=\"dialog_delete_list_warning\">%1$s listesini gerçekten silmek istiyor musunuz?</string>\n    <string name=\"wellbeing_hide_stats_profile\">Profillerdeki niceliksel istatistikleri gizle</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Gönderi Oluştur</string>\n    <string name=\"saving_draft\">Taslağı kaydediyor…</string>\n    <string name=\"action_set_focus\">Odak noktasını ayarla</string>\n    <string name=\"action_edit_image\">Görseli düzenle</string>\n    <string name=\"account_date_joined\">%1$s katıldı</string>\n    <string name=\"hint_media_description_missing\">Medyanın bir açıklaması olmalı.</string>\n    <string name=\"dialog_delete_conversation_warning\">Bu görüşmeyi sil?</string>\n    <string name=\"post_media_audio\">Ses</string>\n    <string name=\"post_media_attachments\">Ekler</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"failed_to_pin\">Sabitleme Başarısız</string>\n    <string name=\"failed_to_unpin\">Açılamadı</string>\n    <string name=\"drafts_post_failed_to_send\">Bu yayın gönderilemedi!</string>\n    <string name=\"limit_notifications\">Ağ akışı bildirimlerini sınırla</string>\n    <string name=\"wellbeing_hide_stats_posts\">Yayınların niceliksel istatistikleri gizle</string>\n    <string name=\"status_created_at_now\">şimdi</string>\n    <string name=\"drafts_post_reply_removed\">Hazırladığınız yanıtınız yayından kaldırıldı</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"report_category_violation\">Kural ihlali</string>\n    <string name=\"description_post_language\">Gönderi dili</string>\n    <string name=\"confirmation_hashtag_unfollowed\">#%1$s takip edilmeyenler</string>\n    <string name=\"action_subscribe_account\">Abone Ol</string>\n    <string name=\"follow_requests_info\">Hesabınız kilitli olmasa da, %1$s kadro bu hesaplardan gelen takip isteklerini elle gözden geçirmek isteyebileceğinizi düşündü.</string>\n    <string name=\"notification_report_format\">Hakkında yeni rapor %1$s</string>\n    <string name=\"action_add_reaction\">tepki ekle</string>\n    <string name=\"action_dismiss\">Yoksay</string>\n    <string name=\"action_details\">Ayrıntılar</string>\n    <string name=\"notification_subscription_name\">Yeni yayınlar</string>\n    <string name=\"notification_subscription_description\">abone olduğunuz birisi yeni gönderi yayınladığında gelen bildirimler</string>\n    <string name=\"notification_sign_up_name\">Kayıt Ol</string>\n    <string name=\"notification_sign_up_description\">Yeni kullanıcılar hakkında bildirimler</string>\n    <string name=\"notification_update_name\">Düzenlemeleri yayınla</string>\n    <string name=\"notification_update_description\">Etkileşimde bulunduğunuz gönderiler düzenlendiğinde bildirimler</string>\n    <string name=\"duration_indefinite\">Tanımsız</string>\n    <string name=\"description_post_edited\">Düzenlendi</string>\n    <string name=\"action_unsubscribe_account\">Abonelikten Çık</string>\n    <string name=\"error_following_hashtags_unsupported\">Bu sunucu aşağıdaki etiketleri desteklemez.</string>\n    <string name=\"notification_subscription_format\">%1$s az önce paylaşım yaptı</string>\n    <string name=\"notification_update_format\">%1$s gönderilerini düzenledi</string>\n    <string name=\"draft_deleted\">Taslak Silindi</string>\n    <string name=\"error_unfollowing_hashtag_format\">Takip etmeyi bırakırken hata #%1$s</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"label_duration\">Süre</string>\n    <string name=\"error_status_source_load\">Sunucudan kaynak durumu yüklenemedi.</string>\n    <string name=\"pref_title_http_proxy_port_message\">Bağlantı noktası %1$d ile %2$d arasında olmalıdır</string>\n    <string name=\"post_media_alt\">Alternatif metin</string>\n    <string name=\"a11y_label_loading_thread\">Konu yükleniyor</string>\n    <string name=\"help_empty_home\">Bu senin <b>ana ağ akışın</b>. Takip ettiğin hesapların son gönderileri burada yer alacak. \n\\n \n\\nTakip edebileceğin hesapları diğer ağ akışlarından keşfedebilirsin, örneğin kendi sunucunun yerel zaman tünelinden {{group}}. Veya hesapları adlarıyla arayabilirsin {{search}}, örneğin Mastodon hesabımızı bulmak için Tusky adıyla araman yeterli.</string>\n    <string name=\"pref_title_reading_order\">Okuma sırası</string>\n    <string name=\"pref_reading_order_oldest_first\">Önce en eski</string>\n    <string name=\"pref_reading_order_newest_first\">Önce en yeni</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;ayarlanmadı&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;geçersiz&gt;</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Etkisizleştirildi</string>\n    <string name=\"status_created_info\">%1$s oluşturdu</string>\n    <string name=\"dialog_follow_hashtag_title\">Etiketi takip et</string>\n    <string name=\"compose_unsaved_changes\">Kaydedilmemiş değişikliklerin var.</string>\n    <string name=\"status_edit_info\">%1$s düzenledi</string>\n    <string name=\"action_refresh\">Yenile</string>\n    <string name=\"title_edits\">Düzenlemeler</string>\n    <string name=\"post_media_image\">Görsel</string>\n    <string name=\"label_filter_action\">Süzgeçleme eylemi</string>\n    <string name=\"action_add\">Ekle</string>\n    <string name=\"label_filter_context\">Süzgeçleme bağlamları</string>\n    <string name=\"filter_keyword_addition_title\">Anahtar kelime ekle</string>\n    <string name=\"label_filter_keywords\">Süzgeçlenecek anahtar kelimeler veya kelime öbekleri</string>\n    <string name=\"filter_keyword_display_format\">%1$s (tüm dünya)</string>\n    <string name=\"action_post_failed\">Yükleme başarısız</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Gönderin yüklenemedi ve taslaklara kaydedildi.\n\\n\n\\nSunucuya bağlanılamamış veya sunucu gönderiyi reddetmiş olabilir.</item>\n        <item quantity=\"other\">Gönderilerin yüklenemedi ve taslaklara kaydedildi.\n\\n\n\\nSunucuya bağlanılamamış veya sunucu gönderiyi reddetmiş olabilir.</item>\n    </plurals>\n    <string name=\"action_post_failed_show_drafts\">Taslakları göster</string>\n    <string name=\"action_post_failed_do_nothing\">Yoksay</string>\n    <string name=\"notification_unknown_name\">Bilinmeyen</string>\n    <string name=\"socket_timeout_exception\">Sunucuyla bağlantı kurmak çok uzun sürdü</string>\n    <string name=\"ui_error_unknown\">bilinmeyen sebep</string>\n    <string name=\"ui_error_bookmark\">Yerimi gönderisi başarısız oldu: %1$s</string>\n    <string name=\"ui_error_vote\">Ankete oy gönderilemedi: %1$s</string>\n    <string name=\"ui_error_clear_notifications\">Bildirimler temizlenemedi: %1$s</string>\n    <string name=\"ui_error_favourite\">Gönderi gözdelere eklenemedi: %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">Takip isteği kabul edilemedi: %1$s</string>\n    <string name=\"ui_error_reject_follow_request\">Takip isteği reddedilemedi: %1$s</string>\n    <string name=\"ui_error_reblog\">Gönderi yeniden paylaşılamadı: %1$s</string>\n    <string name=\"ui_success_accepted_follow_request\">Takip isteği kabul edildi</string>\n    <string name=\"ui_success_rejected_follow_request\">Takip isteği engellendi</string>\n    <string name=\"action_browser_login\">Tarayıcı ile Giriş Yap</string>\n    <string name=\"description_login\">Çoğu durumda çalışır. Diğer uygulamalara veri sızmaz.</string>\n    <string name=\"description_browser_login\">Ek kimlik doğrulama yöntemlerini destekleyebilir ancak desteklenen bir tarayıcı gerektirir.</string>\n    <string name=\"select_list_manage\">Listeleri yönet</string>\n    <string name=\"action_share_account_link\">Hesap bağlantısını paylaş</string>\n    <string name=\"action_share_account_username\">Hesap adını paylaş</string>\n    <string name=\"account_username_copied\">Kullanıcı adı kopyalandı</string>\n    <string name=\"send_account_username_to\">Hesabın kullanıcı adını şununla paylaş…</string>\n    <string name=\"send_account_link_to\">Hesabın bağlantısını şununla paylaş…</string>\n    <string name=\"mute_notifications_switch\">Bildirimleri sessize al</string>\n    <string name=\"action_discard\">Değişiklikleri yoksay</string>\n    <string name=\"action_continue_edit\">Düzenlemeye devam et</string>\n    <string name=\"pref_title_account_filter_keywords\">Profiller</string>\n    <string name=\"filter_description_hide\">Tamamen gizle</string>\n    <string name=\"hint_filter_title\">Süzgecim</string>\n    <string name=\"label_filter_title\">Başlık</string>\n    <string name=\"filter_action_warn\">Uyarı</string>\n    <string name=\"filter_action_hide\">Gizle</string>\n    <string name=\"filter_description_warn\">Bir uyarı ile gizle</string>\n    <string name=\"status_filtered_show_anyway\">Yine de göster</string>\n    <string name=\"status_filter_placeholder_label_format\">Süzgeçlendi: %1$s</string>\n    <string name=\"filter_edit_keyword_title\">Anahtar kelimeyi düzenle</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"pref_title_show_stat_inline\">Yayın istatistiklerini sağ akışında göster</string>\n    <string name=\"title_public_trending_hashtags\">Öne çıkan etiketler</string>\n    <string name=\"total_usage\">Toplam kullanım</string>\n    <string name=\"total_accounts\">Toplam hesap</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d kişi %2$s etiketi hakkında konuşuyor</string>\n    <string name=\"pref_ui_text_size\">UI yazı boyutu</string>\n    <string name=\"notification_listenable_worker_name\">Arkaplan etkinliği</string>\n    <string name=\"notification_listenable_worker_description\">Tusky arka planda çalışırken gelen bildirimler</string>\n    <string name=\"notification_notification_worker\">Bildirimler getiriliyor…</string>\n    <string name=\"notification_prune_cache\">Önbellek bakımı…</string>\n    <string name=\"load_newest_notifications\">En yeni bildirimleri yükle</string>\n    <string name=\"compose_delete_draft\">Taslağı sil?</string>\n    <string name=\"error_missing_edits\">Sunucunuz bu gönderinin düzenlendiğini bilir, ancak düzenlemelerin bir kopyası yoktur, bu nedenle bunlar size gösterilemez. \n\\n \n\\nBu <a href=\"https://github.com/mastodon/mastodon/issues/25398\">Mastodon sorununu #25398</a>.</string>\n    <string name=\"error_media_upload_sending_fmt\">Yükleme başarısız oldu: %1$s</string>\n    <string name=\"about_device_info_title\">Cihazınız</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nAndroid sürüm: %3$s\n\\nSDK sürüm: %4$d</string>\n    <string name=\"about_account_info_title\">Hesabınız</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nSürüm: %3$s</string>\n    <string name=\"about_copy\">Sürüm ve cihaz bilgilerini kopyala</string>\n    <string name=\"about_copied\">Kopyalanan sürüm ve cihaz bilgileri</string>\n    <string name=\"list_exclusive_label\">Anasayfa ağ akışından gizle</string>\n    <string name=\"error_media_playback\">Oynatma başarısız oldu: %1$s</string>\n    <string name=\"error_blocking_domain\">Sessize alınamadı %1$s: %2$s</string>\n    <string name=\"dialog_delete_filter_text\">Süzgeci sil \\'%1$s\\'?</string>\n    <string name=\"dialog_delete_filter_positive_action\">Sil</string>\n    <string name=\"dialog_save_profile_changes_message\">Profil değişikliklerinizi kaydetmek istiyor musunuz?</string>\n    <string name=\"help_empty_conversations\">İşte <b>özel iletileriniz</b>; bazen konuşmalar veya doğrudan iletiler (Dİ) olarak da adlandırılır. \\u0020\n\\n \\u0020\n\\nÖzel iletiler, bir gönderinin {{public}} görünürlüğünü {{mail}} <i>Doğrudan</i> olarak ayarlayarak ve metinde bir veya daha fazla kullanıcıdan bahsederek oluşturulur. \\u0020\n\\n \\u0020\n\\nÖrneğin, bir hesabın profil görünümünde başlayabilir ve oluştur düğmesine [iconics gmd_edit] dokunabilir ve görünürlüğü değiştirebilirsiniz. </string>\n    <string name=\"help_empty_lists\">Bu sizin <b>liste görünümünüzdür</b>. Bir dizi özel liste tanımlayabilir ve bunlara hesaplar ekleyebilirsiniz. \n\\n \n\\n Yalnızca takip ettiğiniz hesapları listelerinize ekleyebileceğinizi unutmayın. \n\\n \n\\n \\u0020Bu listeler Hesap tercihleri [iconics gmd_account_circle] [iconics gmd_navigate_next] Sekmelerinde sekme olarak kullanılabilir. </string>\n    <string name=\"muting_hashtag_success_format\">Uyarı olarak #%1$s etiketini susturma</string>\n    <string name=\"unmuting_hashtag_success_format\">Etiket sesi kapatılıyor #%1$s</string>\n    <string name=\"action_view_filter\">Süzgeci görüntüle</string>\n    <string name=\"following_hashtag_success_format\">Şimdi etiketi takip edin #%1$s</string>\n    <string name=\"unfollowing_hashtag_success_format\">Artık etiketi takip etmiyorum #%1$s</string>\n    <string name=\"error_unblocking_domain\">Sesi açılamadı %1$s: %2$s</string>\n    <string name=\"title_public_trending_statuses\">Gündemdekiler</string>\n    <string name=\"label_image\">Görsel</string>\n    <string name=\"app_theme_system_black\">Sistem Tasarımını Kullanın (siyah)</string>\n    <string name=\"list_reply_policy_list\">Liste üyeleri</string>\n    <string name=\"list_reply_policy_followed\">Takip edilen herhangi bir kullanıcı</string>\n    <string name=\"list_reply_policy_label\">Yanıtları göster</string>\n    <string name=\"list_reply_policy_none\">Hiç kimse</string>\n    <string name=\"pref_title_show_self_boosts\">Kendi beğenmeleri göster</string>\n    <string name=\"pref_title_show_self_boosts_description\">Birisi kendi gönderisini yükseltiyor</string>\n    <string name=\"pref_title_per_timeline_preferences\">Zaman akışı başına tercihler</string>\n    <string name=\"pref_title_show_notifications_filter\">Bildirim süzgecini göster</string>\n    <string name=\"reply_sending\">Gönderiliyor…</string>\n    <string name=\"reply_sending_long\">Cevabınız gönderiliyor.</string>\n    <string name=\"action_show_original\">Özgünü göster</string>\n    <string name=\"label_translated\">%1$s dilinden %2$s ile çevrildi</string>\n    <string name=\"ui_error_translate\">Çeviri yapılamadı: %1$s</string>\n    <string name=\"action_translate\">Çevir</string>\n    <string name=\"label_translating\">Çeviri…</string>\n    <string name=\"report_category_legal\">Yasal</string>\n    <string name=\"unknown_notification_type\">Bilinmeyen bildirim türü</string>\n    <string name=\"dialog_follow_warning\">Bu hesabı mı takip ediyorsun?</string>\n    <string name=\"pref_title_confirm_follows\">Takip etmeden önce onayı göster</string>\n    <string name=\"url_copied\">Url kopyalandı</string>\n    <string name=\"confirmation_hashtag_copied\">\\'#%1$s\\' kopyalandı</string>\n    <string name=\"pref_default_reply_privacy\">Yanıt gizliliği (sunucu ile eşleştirilmedi)</string>\n    <string name=\"action_follow_hashtag\">Yeni bir etiket takip ediniz</string>\n    <string name=\"error_deleting_filter\">Süzgeç silinirken hata oluştu \\'%1$s\\'</string>\n    <string name=\"error_saving_filter\">Hata kaydetme süzgeci \\'%1$s\\'</string>\n    <string name=\"pref_default_reply_privacy_explanation\">Önceden seçilen gizlilik, yanıtladığınız gönderiye bağlı olacak.</string>\n    <string name=\"pref_match_default_post_privacy\">Varsayılan gönderi gizliliğini eşleştiriniz</string>\n    <string name=\"post_privacy_direct\">Doğrudan</string>\n    <string name=\"label_expires_after\">Son kullanma tarihi</string>\n    <string name=\"preview_card_more_by_author\">Daha fazlası %1$s</string>\n    <string name=\"unknown_notification_filter_moderated_accounts_description\">Sunucu moderatörleri tarafından sınırlandırılmıştır</string>\n    <string name=\"notifications_from\">%1$s\\'den gelen Bildirimler</string>\n    <string name=\"relationship_severance_event_user_domain_block\">%1$s kişisini engellediniz, %2$s takipçiniz ve takip ettiğiniz %3$s kişi kaldırıldı.</string>\n    <string name=\"preview_card_by_author\">Yazan %1$s</string>\n    <string name=\"notification_policies_not_supported\">Bu özellik yalnızca v4.3.0 veya sonraki sürümleri çalıştıran Mastodon sunucularında desteklenir.</string>\n    <string name=\"notification_policy_ignore\">Yoksay</string>\n    <string name=\"dismiss_notification_request\">Bildirim talebini reddetme</string>\n    <string name=\"notification_policies_title\">Bildirim Politikaları</string>\n    <string name=\"notification_policies_filter_out\">Gelen bildirimleri yönetin…</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">Yeni hesaplar</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_description\">Kendi sözünüze yanıt değilse veya göndereni takip etmiyorsanız süzgeçlenir</string>\n    <string name=\"accept_notification_request\">Bildirim talebini kabul et</string>\n    <string name=\"relationship_severance_event_account_suspension\">%1$s \\'den bir yönetici %2$s\\'i askıya aldı, bu da artık onlardan güncelleme alamayacağınız veya onlarla etkileşime geçemeyeceğiniz anlamına geliyor.</string>\n    <string name=\"moderation_warning_action_suspend\">Hesabınız askıya alındı.</string>\n    <string name=\"unknown_notification_filter_new_accounts_description\">Son 30 gün içinde oluşturuldu</string>\n    <string name=\"filtered_notifications\">Süzgeçlenmiş bildirimler</string>\n    <string name=\"action_reblog_private\">Yalnızca Takipçi Artışı</string>\n    <string name=\"action_reblog_public\">Kamu Desteği</string>\n    <string name=\"action_reblog_unlisted\">Listelenmemiş Destek</string>\n    <string name=\"notification_severed_relationship_name\">Kayıp bağlantılar</string>\n    <string name=\"notification_moderation_warning_name\">Moderasyon uyarıları</string>\n    <string name=\"notification_unknown_description\">Bilinmeyen bildirim türü</string>\n    <string name=\"notification_channel_other\">Diğer</string>\n    <string name=\"notification_channel_other_description\">Kayıp bağlantılar ve moderasyon uyarıları gibi diğer bildirimler</string>\n    <string name=\"notification_channel_admin\">Yönetici</string>\n    <string name=\"notification_channel_admin_description\">Yeni raporlar veya kayıtlar gibi yönetici bildirimleri</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">Takip etmediğiniz kişiler</string>\n    <string name=\"notification_policies_filter_dont_follow_description\">Siz manuel olarak onaylayana kadar</string>\n    <string name=\"notification_policies_filter_not_following_title\">İnsanlar sizi takip etmiyor</string>\n    <string name=\"notification_policies_filter_not_following_description\">Sizi 3 günden daha az süredir takip eden kişiler dahil</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_title\">İstenmeyen özel bahsedenler</string>\n    <string name=\"unknown_notification_filter_moderated_accounts\">Denetlenen hesaplar</string>\n    <string name=\"notifications_from_people_you_may_know\">Tanıyor olabileceğiniz %1$d kişiden gelen bildirimler</string>\n    <string name=\"notification_policy_accept\">Kabul</string>\n    <string name=\"notification_policy_filter\">Süzgeç</string>\n    <string name=\"filtered_notifications_title\">Süzgeçlenmiş Bildirimler</string>\n    <string name=\"open_settings\">Açık tercihler</string>\n    <string name=\"action_accept_notification_request\">Kabul</string>\n    <string name=\"action_dismiss_notification_request\">Reddet</string>\n    <string name=\"relationship_severance_event_title\">Bağlantı kesildi</string>\n    <string name=\"relationship_severance_event_domain_block\">%1$s \\'den bir yönetici, takipçilerinizin %2$s\\'i ve takip ettiğiniz %3$s dahil olmak üzere %4$s \\'i engelledi.</string>\n    <plurals name=\"accounts\">\n        <item quantity=\"one\">%1$s hesap</item>\n        <item quantity=\"other\">%1$s hesaplar</item>\n    </plurals>\n    <string name=\"moderation_warning\">Bir moderasyon uyarısı aldınız.</string>\n    <string name=\"moderation_warning_action_delete_statuses\">Bazı gönderileriniz kaldırıldı.</string>\n    <string name=\"moderation_warning_action_disable\">Hesabınız devre dışı bırakıldı.</string>\n    <string name=\"moderation_warning_action_mark_statuses_as_sensitive\">Bazı gönderileriniz hassas olarak işaretlendi.</string>\n    <string name=\"moderation_warning_action_none\">Hesabınız bir moderasyon uyarısı aldı.</string>\n    <string name=\"moderation_warning_action_sensitive\">Gönderileriniz bundan sonra hassas olarak işaretlenecektir.</string>\n    <string name=\"moderation_warning_action_silence\">Hesabınız sınırlandırıldı.</string>\n    <string name=\"unknown_notification_type_explanation\">Tusky bu bildirim türünü tanımıyor ve size gösteremiyor. Sunucunuzun web arayüzü bunu gösterebilir. Lütfen Tusky geliştiricilerine de haber verin, böylece bu tür için destek ekleyebilsinler!</string>\n    <string name=\"poll\">Anket</string>\n    <plurals name=\"media_attachments\">\n        <item quantity=\"one\">%1$s medya eki</item>\n        <item quantity=\"other\">%1$s medya ekleri</item>\n    </plurals>\n    <string name=\"notification_info_reply\">Yanıt</string>\n    <string name=\"notification_info_private_reply\">Özel yanıt</string>\n    <string name=\"notification_info_mention\">Değinme</string>\n    <string name=\"notification_info_private_mention\">Özel değinme</string>\n    <string name=\"follow_hashtag_success\">Takip edilen etiket %1$s</string>\n    <string name=\"post_replied\">Yanıtladı</string>\n    <string name=\"post_replied_format\">Yanıt olarak %1$s</string>\n    <string name=\"post_replied_self\">Devam eden konu</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-uk/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">Сталася помилка.</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"title_licenses\">Ліцензії</string>\n    <string name=\"title_edit_profile\">Редагувати профіль</string>\n    <string name=\"title_follow_requests\">Запити на підписку</string>\n    <string name=\"title_bookmarks\">Закладки</string>\n    <string name=\"title_followers\">Підписники</string>\n    <string name=\"title_follows\">Підписки</string>\n    <string name=\"title_posts_pinned\">Прикріплені</string>\n    <string name=\"title_posts_with_replies\">З відповідями</string>\n    <string name=\"title_public_federated\">Загальні</string>\n    <string name=\"title_public_local\">Цей сервер</string>\n    <string name=\"title_direct_messages\">Приватні повідомлення</string>\n    <string name=\"title_notifications\">Сповіщення</string>\n    <string name=\"title_home\">Головна</string>\n    <string name=\"error_sender_account_gone\">Помилка надсилання допису.</string>\n    <string name=\"error_media_upload_image_or_video\">Зображення та відео не можуть бути прикріплені до допису одночасно.</string>\n    <string name=\"error_media_download_permission\">Потрібен дозвіл на зберігання медіа.</string>\n    <string name=\"error_media_upload_permission\">Потрібен дозвіл на читання медіа.</string>\n    <string name=\"error_media_upload_opening\">Не вдається відкрити цей файл.</string>\n    <string name=\"error_media_upload_type\">Неможливо відвантажити файл цього типу.</string>\n    <string name=\"error_compose_character_limit\">Допис задовгий!</string>\n    <string name=\"error_no_web_browser_found\">Не вдалося знайти браузер, який можна використати.</string>\n    <string name=\"error_empty\">Не може бути порожнім.</string>\n    <string name=\"error_network\">Сталася помилка мережі. Перевірте інтернет-з\\'єднання та спробуйте знову.</string>\n    <string name=\"title_lists\">Списки</string>\n    <string name=\"action_lists\">Списки</string>\n    <string name=\"about_title_activity\">Про застосунок</string>\n    <string name=\"action_reset_schedule\">Скинути</string>\n    <string name=\"action_search\">Пошук</string>\n    <string name=\"action_edit_profile\">Редагувати профіль</string>\n    <string name=\"action_view_account_preferences\">Налаштування облікового запису</string>\n    <string name=\"action_view_preferences\">Налаштування</string>\n    <string name=\"action_logout\">Вийти</string>\n    <string name=\"title_drafts\">Чернетки</string>\n    <string name=\"title_favourites\">Вподобане</string>\n    <string name=\"action_login\">Увійти з Tusky</string>\n    <string name=\"login_connection\">Зʼєднання…</string>\n    <string name=\"search_no_results\">Немає результатів</string>\n    <string name=\"hint_search\">Пошук…</string>\n    <string name=\"hint_note\">Про себе</string>\n    <string name=\"hint_compose\">Що відбувається?</string>\n    <string name=\"confirmation_reported\">Надіслано!</string>\n    <string name=\"action_share_as\">Поділитися як …</string>\n    <string name=\"action_open_as\">Відкрити як %1$s</string>\n    <string name=\"action_copy_link\">Копіювати посилання</string>\n    <string name=\"download_image\">Завантаження %1$s</string>\n    <string name=\"title_links_dialog\">Посилання</string>\n    <string name=\"title_mentions_dialog\">Згадки</string>\n    <string name=\"action_open_faved_by\">Показати, хто вподобав</string>\n    <string name=\"action_mentions\">Згадки</string>\n    <string name=\"action_links\">Посилання</string>\n    <string name=\"action_content_warning\">Попередження про вміст</string>\n    <string name=\"action_access_scheduled_posts\">Заплановані дописи</string>\n    <string name=\"action_access_drafts\">Чернетки</string>\n    <string name=\"action_reject\">Відхилити</string>\n    <string name=\"action_accept\">Прийняти</string>\n    <string name=\"action_undo\">Скасувати</string>\n    <string name=\"action_edit_own_profile\">Змінити</string>\n    <string name=\"action_save\">Зберегти</string>\n    <string name=\"action_mention\">Згадати</string>\n    <string name=\"action_mute_domain\">Ігнорувати %1$s</string>\n    <string name=\"action_mute\">Ігнорувати</string>\n    <string name=\"action_share\">Поділитися</string>\n    <string name=\"action_photo_take\">Сфотографувати</string>\n    <string name=\"action_add_poll\">Додати опитування</string>\n    <string name=\"action_add_media\">Додати медіа</string>\n    <string name=\"action_open_in_web\">Відкрити в браузері</string>\n    <string name=\"action_view_media\">Медіа</string>\n    <string name=\"action_view_follow_requests\">Запити на підписку</string>\n    <string name=\"action_view_blocks\">Заблоковані користувачі</string>\n    <string name=\"action_view_bookmarks\">Закладки</string>\n    <string name=\"action_view_favourites\">Вподобане</string>\n    <string name=\"action_view_profile\">Профіль</string>\n    <string name=\"action_close\">Закрити</string>\n    <string name=\"action_retry\">Повторити</string>\n    <string name=\"action_delete_and_redraft\">Видалити та переробити</string>\n    <string name=\"action_delete\">Видалити</string>\n    <string name=\"action_edit\">Змінити</string>\n    <string name=\"action_report\">Поскаржитися</string>\n    <string name=\"action_unblock\">Розблокувати</string>\n    <string name=\"action_block\">Заблокувати</string>\n    <string name=\"action_unfollow\">Не стежити</string>\n    <string name=\"action_follow\">Підписатися</string>\n    <string name=\"action_logout_confirm\">Ви впевнені, що хочете вийти %1$s? Це призведе до видалення всіх локальних даних облікового запису, включно з чернетками та вподобаннями.</string>\n    <string name=\"action_compose\">Написати</string>\n    <string name=\"action_unfavourite\">Прибрати з обраного</string>\n    <string name=\"action_bookmark\">Додати в закладки</string>\n    <string name=\"action_favourite\">Вподобати</string>\n    <string name=\"action_reply\">Відповісти</string>\n    <string name=\"action_quick_reply\">Швидка відповідь</string>\n    <string name=\"report_comment_hint\">Додаткові коментарі?</string>\n    <string name=\"report_username_format\">Поскаржитися на @%1$s</string>\n    <string name=\"notification_follow_request_format\">%1$s надсилає запит на підписку</string>\n    <string name=\"notification_follow_format\">%1$s підписується на вас</string>\n    <string name=\"footer_empty\">Тут нічого немає. Потягніть вниз, щоб оновити!</string>\n    <string name=\"message_empty\">Нічого немає.</string>\n    <string name=\"post_content_warning_show_less\">Згорнути</string>\n    <string name=\"post_content_warning_show_more\">Показати більше</string>\n    <string name=\"post_sensitive_media_directions\">Натисніть для перегляду</string>\n    <string name=\"post_media_hidden_title\">Медіа приховано</string>\n    <string name=\"hint_content_warning\">Попередження про вміст</string>\n    <string name=\"edit_poll\">Змінити</string>\n    <string name=\"compose_shortcut_short_label\">Написати</string>\n    <string name=\"action_unmute_conversation\">Не ігнорувати розмову</string>\n    <string name=\"action_mute_conversation\">Ігнорувати розмову</string>\n    <string name=\"title_scheduled_posts\">Заплановані дописи</string>\n    <string name=\"description_visibility_private\">Підписники</string>\n    <string name=\"action_compose_shortcut\">Написати</string>\n    <string name=\"title_media\">Медіа</string>\n    <string name=\"pref_title_notifications_enabled\">Сповіщення</string>\n    <string name=\"pref_title_edit_notification_settings\">Сповіщення</string>\n    <string name=\"title_blocks\">Заблоковані користувачі</string>\n    <string name=\"notification_favourite_name\">Вподобане</string>\n    <string name=\"notification_follow_request_name\">Запити на підписку</string>\n    <string name=\"action_unmute_desc\">Не ігнорувати %1$s</string>\n    <string name=\"action_unmute\">Не ігнорувати</string>\n    <string name=\"action_view_domain_mutes\">Приховані домени</string>\n    <string name=\"action_view_mutes\">Ігноровані користувачі</string>\n    <string name=\"action_send_public\">ПОШИРИТИ!</string>\n    <string name=\"action_send\">ПОШИРИТИ</string>\n    <string name=\"action_show_reblogs\">Показати поширення</string>\n    <string name=\"action_hide_reblogs\">Сховати поширення</string>\n    <string name=\"action_more\">Розгорнути</string>\n    <string name=\"action_unreblog\">Скасувати поширення</string>\n    <string name=\"action_reblog\">Поширити</string>\n    <string name=\"notification_favourite_format\">%1$s вподобує ваш допис</string>\n    <string name=\"notification_reblog_format\">%1$s поширює ваш допис</string>\n    <string name=\"post_content_show_less\">Згорнути</string>\n    <string name=\"post_content_show_more\">Ще</string>\n    <string name=\"post_sensitive_media_title\">Делікатний вміст</string>\n    <string name=\"post_boosted_format\">%1$s поширює</string>\n    <string name=\"title_domain_mutes\">Приховані домени</string>\n    <string name=\"title_mutes\">Ігноровані користувачі</string>\n    <string name=\"title_posts\">Дописи</string>\n    <string name=\"title_view_thread\">Обговорення</string>\n    <string name=\"title_tab_preferences\">Вкладки</string>\n    <string name=\"error_media_upload_sending\">Не вдалося відвантажити.</string>\n    <string name=\"error_retrieving_oauth_token\">Не вдалося отримати токен входу. Якщо проблема не зникає, спробуйте увійти через браузер з меню.</string>\n    <string name=\"error_authorization_denied\">Авторизацію відхилено. Якщо ви впевнені, що вказали правильні облікові дані, спробуйте увійти через браузер з меню.</string>\n    <string name=\"error_authorization_unknown\">Виникла невизначена помилка авторизації. Якщо вона не зникає, спробуйте увійти через браузер з меню.</string>\n    <string name=\"error_failed_app_registration\">Помилка автентифікації цього сервера. Якщо проблема не зникає, спробуйте увійти через браузер з меню.</string>\n    <string name=\"error_invalid_domain\">Введено недійсний домен</string>\n    <string name=\"action_open_reblogged_by\">Показати поширення</string>\n    <string name=\"pref_title_show_boosts\">Показати поширення</string>\n    <string name=\"pref_title_post_tabs\">Головна стрічка</string>\n    <string name=\"action_unmute_domain\">Не ігнорувати %1$s</string>\n    <string name=\"action_toggle_visibility\">Видимість дописів</string>\n    <string name=\"wellbeing_mode_notice\">Деякі відомості, які можуть вплинути на ваше психічний стан, буде приховано. Це включає:\n\\n\n\\n- Уподобання/Поширення/Сповіщення про підписки\n\\n- Уподобання/Кількість поширень дописів\n\\n- Статистика підписників/поширень у профілях\n\\n\n\\nНа push-сповіщення це не вплине, але ви можете переглянути налаштування сповіщень вручну.</string>\n    <string name=\"description_post_favourited\">Уподобано</string>\n    <string name=\"title_favourited_by\">Вподобали</string>\n    <plurals name=\"favs\">\n        <item quantity=\"one\">%1$s вподобання</item>\n        <item quantity=\"few\">%1$s вподобання</item>\n        <item quantity=\"many\">%1$s вподобань</item>\n        <item quantity=\"other\">%1$s вподобань</item>\n    </plurals>\n    <string name=\"notification_favourite_description\">Сповіщати про вподобання кимось дописів</string>\n    <string name=\"action_hide_media\">Сховати медіа</string>\n    <string name=\"notification_subscription_format\">%1$s щойно опубліковано</string>\n    <string name=\"title_announcements\">Оголошення</string>\n    <string name=\"action_open_drawer\">Відкрити меню</string>\n    <string name=\"caption_blobmoji\">Емодзі Blob з Android 4.4–7.1</string>\n    <string name=\"caption_systememoji\">Типовий набір емодзі пристрою</string>\n    <string name=\"performing_lookup_title\">Виконання пошуку…</string>\n    <string name=\"download_fonts\">Спочатку потрібно буде завантажити ці набори емодзі</string>\n    <string name=\"system_default\">Типовий системний</string>\n    <string name=\"emoji_style\">Стиль емодзі</string>\n    <string name=\"error_no_custom_emojis\">Ваш сервер %1$s не має власних емодзі</string>\n    <string name=\"compose_save_draft\">Зберегти чернетку?</string>\n    <string name=\"lock_account_label_description\">Доведеться затверджувати підписників власноруч</string>\n    <string name=\"action_set_caption\">Додати підпис</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"one\">Опис матеріалів для людей з вадами зору (обмеження %1$d символ)</item>\n        <item quantity=\"few\">Опис матеріалів для людей з вадами зору (обмеження %1$d символи)</item>\n        <item quantity=\"many\">Опис матеріалів для людей з вадами зору (обмеження %1$d символів)</item>\n        <item quantity=\"other\">Опис матеріалів для людей з вадами зору (обмеження %1$d символів)</item>\n    </plurals>\n    <string name=\"action_unsubscribe_account\">Відписатися</string>\n    <string name=\"action_subscribe_account\">Підписатися</string>\n    <string name=\"account_note_saved\">Збережено!</string>\n    <string name=\"poll_new_choice_hint\">Вибір %1$d</string>\n    <string name=\"poll_allow_multiple_choices\">Кілька виборів</string>\n    <string name=\"add_poll_choice\">Додати вибір</string>\n    <string name=\"duration_7_days\">7 днів</string>\n    <string name=\"duration_3_days\">3 дні</string>\n    <string name=\"duration_1_day\">1 день</string>\n    <string name=\"duration_6_hours\">6 годин</string>\n    <string name=\"duration_1_hour\">1 година</string>\n    <string name=\"duration_30_min\">30 хвилин</string>\n    <string name=\"duration_5_min\">5 хвилин</string>\n    <string name=\"duration_indefinite\">Безкінечно</string>\n    <string name=\"label_duration\">Тривалість</string>\n    <string name=\"create_poll_title\">Опитування</string>\n    <string name=\"title_accounts\">Облікові записи</string>\n    <string name=\"failed_report\">Не вдалося звітувати</string>\n    <string name=\"hint_additional_info\">Додаткові коментарі</string>\n    <string name=\"report_sent_success\">Звіт @%1$s надіслано</string>\n    <string name=\"button_done\">Готово</string>\n    <string name=\"button_back\">Назад</string>\n    <string name=\"button_continue\">Продовжити</string>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"one\">Залишилася %1$d секунда</item>\n        <item quantity=\"few\">Залишилося %1$d секунди</item>\n        <item quantity=\"many\">Залишилося %1$d секунд</item>\n        <item quantity=\"other\">Залишилося %1$d секунд</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"one\">Залишилася %1$d хвилина</item>\n        <item quantity=\"few\">Залишилося %1$d хвилини</item>\n        <item quantity=\"many\">Залишилося %1$d хвилин</item>\n        <item quantity=\"other\">Залишилося %1$d хвилин</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"one\">Залишилася %1$d година</item>\n        <item quantity=\"few\">Залишилося %1$d години</item>\n        <item quantity=\"many\">Залишилося %1$d годин</item>\n        <item quantity=\"other\">Залишилося %1$d годин</item>\n    </plurals>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"one\">Залишився %1$d день</item>\n        <item quantity=\"few\">Залишилося %1$d дні</item>\n        <item quantity=\"many\">Залишилося %1$d днів</item>\n        <item quantity=\"other\">Залишилося %1$d днів</item>\n    </plurals>\n    <string name=\"poll_ended_created\">Створене вами опитування завершилося</string>\n    <string name=\"poll_ended_voted\">Опитування, в якому ви проголосували</string>\n    <string name=\"poll_vote\">Голосувати</string>\n    <string name=\"poll_info_closed\">закрито</string>\n    <string name=\"poll_info_time_absolute\">завершується о %1$s</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"one\">%1$s особа</item>\n        <item quantity=\"few\">%1$s людини</item>\n        <item quantity=\"many\">%1$s людей</item>\n        <item quantity=\"other\">%1$s людей</item>\n    </plurals>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"one\">%1$s голос</item>\n        <item quantity=\"few\">%1$s голоси</item>\n        <item quantity=\"many\">%1$s голосів</item>\n        <item quantity=\"other\">%1$s голосів</item>\n    </plurals>\n    <string name=\"poll_info_format\">%1$s • %2$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">Без опису</string>\n    <string name=\"description_post_cw\">Попередження про матеріали: %1$s</string>\n    <string name=\"description_post_media\">Медіа: %1$s</string>\n    <string name=\"title_reblogged_by\">Поширює</string>\n    <string name=\"profile_metadata_content_label\">Вміст</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"profile_badge_bot_text\">Бот</string>\n    <string name=\"restart\">Перезапустити</string>\n    <string name=\"later\">Пізніше</string>\n    <string name=\"restart_emoji\">Вам потрібно буде перезапустити Tusky, щоб застосувати ці зміни</string>\n    <string name=\"restart_required\">Необхідно перезапустити застосунок</string>\n    <string name=\"action_open_post\">Відкрити допис</string>\n    <string name=\"expand_collapse_all_posts\">Розгорнути/згорнути всі дописи</string>\n    <string name=\"send_post_notification_saved_content\">Копію допису збережено до ваших чернеток</string>\n    <string name=\"send_post_notification_cancel_title\">Надсилання скасовано</string>\n    <string name=\"send_post_notification_channel_name\">Надсилання дописів</string>\n    <string name=\"send_post_notification_error_title\">Помилка надсилання допису</string>\n    <string name=\"send_post_notification_title\">Надсилання допису…</string>\n    <string name=\"compose_active_account_description\">Поширити як %1$s</string>\n    <string name=\"action_remove_from_list\">Вилучити обліковий запис зі списку</string>\n    <string name=\"action_add_to_list\">Додати обліковий запис до списку</string>\n    <string name=\"hint_search_people_list\">Пошук серед людей на яких ви підписані</string>\n    <string name=\"action_delete_list\">Видалити список</string>\n    <string name=\"action_rename_list\">Оновити список</string>\n    <string name=\"action_create_list\">Створити список</string>\n    <string name=\"error_delete_list\">Не вдалося видалити список</string>\n    <string name=\"error_rename_list\">Не вдалося оновити список</string>\n    <string name=\"error_create_list\">Не вдалося створити список</string>\n    <string name=\"add_account_description\">Додати новий обліковий запис Mastodon</string>\n    <string name=\"add_account_name\">Додати обліковий запис</string>\n    <string name=\"filter_add_description\">Фільтрувати фразу</string>\n    <string name=\"filter_dialog_whole_word_description\">Коли ключове слово або фраза є лише буквено-цифровими, вони застосовуватимуться лише, якщо вони збігатимуться з цілим словом</string>\n    <string name=\"filter_dialog_whole_word\">Цілим словом</string>\n    <string name=\"filter_dialog_update_button\">Оновити</string>\n    <string name=\"lock_account_label\">Заблокувати обліковий запис</string>\n    <string name=\"action_remove\">Вилучити</string>\n    <string name=\"filter_dialog_remove_button\">Вилучити</string>\n    <string name=\"filter_edit_title\">Редагувати фільтр</string>\n    <string name=\"filter_addition_title\">Додати фільтр</string>\n    <string name=\"pref_title_thread_filter_keywords\">Розмови</string>\n    <string name=\"pref_title_public_filter_keywords\">Публічні стрічки</string>\n    <string name=\"load_more_placeholder_text\">Завантажити ще</string>\n    <string name=\"replying_to\">Відповідь для @%1$s</string>\n    <string name=\"pref_title_alway_open_spoiler\">Завжди розгортати допис, з попередженнями про вміст</string>\n    <string name=\"follows_you\">Підписники</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Завжди показувати делікатні медіа</string>\n    <string name=\"abbreviated_seconds_ago\">%1$dс</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dхв</string>\n    <string name=\"abbreviated_hours_ago\">%1$dгод</string>\n    <string name=\"abbreviated_days_ago\">%1$dдн</string>\n    <string name=\"abbreviated_years_ago\">%1$dр.</string>\n    <string name=\"abbreviated_in_seconds\">за %1$dс</string>\n    <string name=\"abbreviated_in_minutes\">за %1$dхв</string>\n    <string name=\"abbreviated_in_hours\">за %1$dгод</string>\n    <string name=\"abbreviated_in_days\">за %1$dдн</string>\n    <string name=\"abbreviated_in_years\">за %1$dр.</string>\n    <string name=\"state_follow_requested\">Запит на підписку надіслано</string>\n    <string name=\"post_media_attachments\">Вкладення</string>\n    <string name=\"post_media_audio\">Звуки</string>\n    <string name=\"post_media_video\">Відео</string>\n    <string name=\"post_media_images\">Зображення</string>\n    <string name=\"post_share_link\">Поділитися посиланням на допис</string>\n    <string name=\"post_share_content\">Поділитися вмістом допису</string>\n    <string name=\"about_tusky_account\">Профіль Tusky</string>\n    <string name=\"about_bug_feature_request_site\">Звіти про вади та запити функцій:\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_project_site\">Вебсайт проєкту: https://tusky.app</string>\n    <string name=\"about_tusky_license\">Tusky — вільне та відкрите програмне забезпечення. Ліцензовано загальною громадською ліцензією GNU версії 3, ви можете переглянути ліцензію тут: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <string name=\"about_powered_by_tusky\">Створено Tusky</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"description_account_locked\">Заблокований обліковий запис</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"one\">%1$d нова взаємодія</item>\n        <item quantity=\"few\">%1$d нові взаємодії</item>\n        <item quantity=\"many\">%1$d нових взаємодій</item>\n        <item quantity=\"other\">%1$d нових взаємодій</item>\n    </plurals>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s та ще %3$d</string>\n    <string name=\"conversation_2_recipients\">%1$s та %2$s</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"notification_summary_small\">%1$s та %2$s</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, та %3$s</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s та %4$d інших</string>\n    <string name=\"notification_mention_format\">%1$s згадує вас</string>\n    <string name=\"notification_subscription_description\">Сповіщати про нові дописи осіб, на яких ви підписалися</string>\n    <string name=\"notification_subscription_name\">Нові дописи</string>\n    <string name=\"notification_poll_description\">Сповіщати про завершення опитувань</string>\n    <string name=\"notification_poll_name\">Результати опитування</string>\n    <string name=\"notification_boost_description\">Сповіщати про поширення ваших дописів</string>\n    <string name=\"notification_boost_name\">Поширення</string>\n    <string name=\"notification_follow_request_description\">Сповіщати про нові запити на підписки</string>\n    <string name=\"notification_follow_description\">Сповіщати про нових підписників</string>\n    <string name=\"notification_follow_name\">Нові підписники</string>\n    <string name=\"notification_mention_descriptions\">Сповіщати про нові згадки</string>\n    <string name=\"notification_mention_name\">Нові згадки</string>\n    <string name=\"post_text_size_largest\">Найбільший</string>\n    <string name=\"post_text_size_large\">Великий</string>\n    <string name=\"post_text_size_medium\">Середній</string>\n    <string name=\"post_text_size_small\">Маленький</string>\n    <string name=\"post_text_size_smallest\">Крихітний</string>\n    <string name=\"pref_post_text_size\">Розмір шрифту допису</string>\n    <string name=\"post_privacy_followers_only\">Лише для підписників</string>\n    <string name=\"description_visibility_unlisted\">Приховано</string>\n    <string name=\"post_privacy_unlisted\">Приховано</string>\n    <string name=\"description_visibility_public\">Публічно</string>\n    <string name=\"post_privacy_public\">Публічно</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Внизу</string>\n    <string name=\"pref_main_nav_position_option_top\">Вгорі</string>\n    <string name=\"pref_main_nav_position\">Розташування головної панелі переходів</string>\n    <string name=\"pref_failed_to_sync\">Не вдалося синхронізувати налаштування</string>\n    <string name=\"pref_publishing\">Усталені налаштування дописів</string>\n    <string name=\"pref_default_media_sensitivity\">Завжди позначати медіа як чутливі (синхронізовано з сервером)</string>\n    <string name=\"pref_default_post_privacy\">Приватність дописів (синхронізовано з сервером)</string>\n    <string name=\"pref_title_http_proxy_port\">Порт HTTP-проксі</string>\n    <string name=\"pref_title_http_proxy_server\">Сервер HTTP-проксі</string>\n    <string name=\"pref_title_http_proxy_enable\">Увімкнути HTTP-проксі</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP-проксі</string>\n    <string name=\"pref_title_proxy_settings\">Проксі</string>\n    <string name=\"pref_title_show_media_preview\">Завантаження попереднього перегляду медіа</string>\n    <string name=\"pref_title_show_replies\">Показати відповіді</string>\n    <string name=\"pref_title_post_filter\">Фільтрування стрічки</string>\n    <string name=\"pref_title_animate_custom_emojis\">Анімувати власні емодзі</string>\n    <string name=\"pref_title_gradient_for_media\">Показувати барвисті градієнти замість прихованих медіа</string>\n    <string name=\"pref_title_animate_gif_avatars\">Анімовані GIF-аватарки</string>\n    <string name=\"pref_title_bot_overlay\">Показувати позначки для ботів</string>\n    <string name=\"pref_title_language\">Мова</string>\n    <string name=\"pref_title_custom_tabs\">Вкладки вбудованого браузера Chrome</string>\n    <string name=\"pref_title_browser_settings\">Браузер</string>\n    <string name=\"app_theme_system\">Тема системи</string>\n    <string name=\"app_theme_auto\">Автоматична від заходу сонця</string>\n    <string name=\"app_theme_black\">Чорна</string>\n    <string name=\"app_theme_light\">Світла</string>\n    <string name=\"app_them_dark\">Темна</string>\n    <string name=\"pref_title_timeline_filters\">Фільтри</string>\n    <string name=\"pref_title_timelines\">Стрічки</string>\n    <string name=\"pref_title_app_theme\">Тема застосунку</string>\n    <string name=\"pref_title_appearance_settings\">Вигляд</string>\n    <string name=\"pref_title_notification_filters\">Увімкнені типи сповіщень</string>\n    <string name=\"pref_title_notification_alert_light\">Світлосповіщення</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Вібросповіщення</string>\n    <string name=\"pref_title_notification_alert_sound\">Звукові сповіщення</string>\n    <string name=\"pref_title_notification_alerts\">Попередження</string>\n    <string name=\"visibility_direct\">Особисте згадування: Поширити лише для згаданих користувачів</string>\n    <string name=\"visibility_private\">Лише підписники: Допис лише для підписників</string>\n    <string name=\"visibility_unlisted\">Приховано: Не показувати у загальних стрічках</string>\n    <string name=\"visibility_public\">Публічно: Опублікувати у загальних стрічках</string>\n    <string name=\"dialog_mute_hide_notifications\">Сховати сповіщення</string>\n    <string name=\"dialog_mute_warning\">Ігнорувати @%1$s?</string>\n    <string name=\"dialog_block_warning\">Заблокувати @%1$s?</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Сховати весь домен</string>\n    <string name=\"mute_domain_warning\">Ви впевнені, що хочете заблокувати все з %1$s? Ви не побачите матеріали з цього домену в загальнодоступних стрічках або у своїх сповіщеннях. Ваших підписників з цього домену буде вилучено.</string>\n    <string name=\"dialog_redraft_post_warning\">Видалити й переписати цей допис?</string>\n    <string name=\"dialog_delete_post_warning\">Видалити цей допис?</string>\n    <string name=\"dialog_unfollow_warning\">Не стежити за цим обліковим записом?</string>\n    <string name=\"dialog_message_cancel_follow_request\">Відкликати запит на підписку?</string>\n    <string name=\"dialog_download_image\">Завантаження</string>\n    <string name=\"dialog_message_uploading_media\">Відвантаження…</string>\n    <string name=\"dialog_title_finishing_media_upload\">Завершення відвантаження медіа</string>\n    <string name=\"dialog_whats_an_instance\">Сюди можна ввести адресу або домен будь-якого сервера, наприклад mastodon.social, icosahedron.website, social.tchncs.de та <a href=\"https://instances.social\">інші!</a> \n\\n \n\\nЯкщо у вас ще немає облікового запису, ви можете ввести назву сервера, до якого ви хочете приєднатися та створити там обліковий запис. \n\\n \n\\nСервер — єдине місце, де розміщено ваш обліковий запис, але ви можете легко спілкуватися з людьми та стежити за ними на інших серверах, ніби ви перебуваєте на тому ж сайті. \n\\n \n\\nДокладніше на <a href=\"https://joinmastodon.org\">joinmastodon.org</a>.</string>\n    <string name=\"link_whats_an_instance\">Що таке сервер?</string>\n    <string name=\"hint_domain\">Котрий сервер?</string>\n    <string name=\"label_header\">Заголовок</string>\n    <string name=\"label_avatar\">Аватар</string>\n    <string name=\"label_quick_reply\">Відповісти…</string>\n    <string name=\"hint_display_name\">Показуване ім\\'я</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s більше не приховується</string>\n    <string name=\"confirmation_unmuted\">Ігнорування користувача скасовано</string>\n    <string name=\"confirmation_unblocked\">Користувача розблоковано</string>\n    <string name=\"send_media_to\">Поділитися медіа з…</string>\n    <string name=\"send_post_content_to\">Поділитися дописом з…</string>\n    <string name=\"send_post_link_to\">Поділитися URL-адресою допису з…</string>\n    <string name=\"downloading_media\">Завантаження медіа</string>\n    <string name=\"download_media\">Завантажити медіа</string>\n    <string name=\"action_open_media_n\">Відкрити медіа #%1$d</string>\n    <string name=\"hashtags\">Гештеги</string>\n    <string name=\"action_hashtags\">Гештеги</string>\n    <string name=\"title_hashtags_dialog\">Гештеги</string>\n    <string name=\"action_open_reblogger\">Відкрити автора поширення</string>\n    <string name=\"action_add_tab\">Додати вкладку</string>\n    <string name=\"action_schedule_post\">Запланувати допис</string>\n    <string name=\"action_emoji_keyboard\">Клавіатура емодзі</string>\n    <string name=\"drafts_post_reply_removed\">Допис, для якого ви створили чернетку відповіді, вилучено</string>\n    <string name=\"draft_deleted\">Чернетку видалено</string>\n    <string name=\"drafts_failed_loading_reply\">Не вдалося завантажити дані відповіді</string>\n    <string name=\"drafts_post_failed_to_send\">Не вдалося надіслати цей допис!</string>\n    <string name=\"dialog_delete_list_warning\">Ви дійсно хочете видалити список %1$s?</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"one\">Ви не можете завантажити більше ніж %1$d медіавкладення.</item>\n        <item quantity=\"few\">Ви не можете завантажити більше ніж %1$d медіавкладення.</item>\n        <item quantity=\"many\">Ви не можете завантажити більше ніж %1$d медіавкладень.</item>\n        <item quantity=\"other\">Ви не можете завантажити більше ніж %1$d медіавкладень.</item>\n    </plurals>\n    <string name=\"wellbeing_hide_stats_profile\">Приховати кількісну статистику профілів</string>\n    <string name=\"wellbeing_hide_stats_posts\">Приховати кількісну статистику дописів</string>\n    <string name=\"limit_notifications\">Обмеження сповіщень стрічки</string>\n    <string name=\"review_notifications\">Переглянути сповіщення</string>\n    <string name=\"account_note_hint\">Ваша особиста примітка про цей обліковий запис</string>\n    <string name=\"pref_title_wellbeing_mode\">Добробут</string>\n    <string name=\"pref_title_hide_top_toolbar\">Сховати заголовок верхньої панелі інструментів</string>\n    <string name=\"pref_title_confirm_reblogs\">Запитувати підтвердження перед поширенням</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Показувати попередній перегляд посилань у стрічках</string>\n    <string name=\"warning_scheduling_interval\">Найкоротший час планування Mastodon становить 5 хвилин.</string>\n    <string name=\"no_announcements\">Оголошень немає.</string>\n    <string name=\"no_scheduled_posts\">Немає запланованих дописів.</string>\n    <string name=\"no_drafts\">У вас немає чернеток.</string>\n    <string name=\"post_lookup_error_format\">Помилка пошуку допису %1$s</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Увімкнути перемикання між вкладками жестом проведення пальцем</string>\n    <string name=\"failed_search\">Не вдалося здійснити пошук</string>\n    <string name=\"report_description_remote_instance\">Обліковий запис з іншого сервера. Надіслати туди анонімізовану копію звіту також?</string>\n    <string name=\"report_description_1\">Скаргу буде надіслано модераторам вашого сервера. Нижче ви можете описати причину скарги на цей обліковий запис:</string>\n    <string name=\"failed_fetch_posts\">Не вдалося отримати дописи</string>\n    <string name=\"report_remote_instance\">Переслати до %1$s</string>\n    <string name=\"compose_preview_image_description\">Дії для зображення %1$s</string>\n    <string name=\"notification_clear_text\">Ви впевнені, що хочете остаточно очистити всі сповіщення?</string>\n    <string name=\"compose_shortcut_long_label\">Створити допис</string>\n    <string name=\"filter_apply\">Застосувати</string>\n    <string name=\"notifications_apply_filter\">Фільтр</string>\n    <string name=\"notifications_clear\">Видалити</string>\n    <string name=\"list\">Список</string>\n    <string name=\"select_list_title\">Вибрати список</string>\n    <string name=\"pick_hashtag_hint\">Гештег без #</string>\n    <string name=\"add_hashtag_title\">Додати гештег</string>\n    <string name=\"hint_list_name\">Назва списку</string>\n    <string name=\"description_poll\">Опитування з варіантами: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"description_visibility_direct\">Особисто</string>\n    <string name=\"description_post_bookmarked\">Додано до закладок</string>\n    <string name=\"description_post_reblogged\">Поширено</string>\n    <plurals name=\"reblogs\">\n        <item quantity=\"one\">%1$s поширення</item>\n        <item quantity=\"few\">%1$s поширення</item>\n        <item quantity=\"many\">%1$s поширень</item>\n        <item quantity=\"other\">%1$s поширень</item>\n    </plurals>\n    <string name=\"pin_action\">Прикріпити</string>\n    <string name=\"unpin_action\">Відкріпити</string>\n    <string name=\"label_remote_account\">Наведена нижче інформація може відображати профіль користувача не повністю. Натисніть, щоб відкрити повний профіль у браузері.</string>\n    <string name=\"pref_title_absolute_time\">Використовуйте точний час</string>\n    <string name=\"profile_metadata_label_label\">Мітка</string>\n    <string name=\"profile_metadata_add\">додати дані</string>\n    <string name=\"profile_metadata_label\">Метадані профілю</string>\n    <string name=\"license_apache_2\">Ліцензовано за ліцензією Apache (копія знизу)</string>\n    <string name=\"license_description\">Tusky містить код та засоби з таких проєктів з відкритим кодом:</string>\n    <string name=\"unreblog_private\">Скасувати поширення</string>\n    <string name=\"reblog_private\">Поширити початковій аудиторії</string>\n    <string name=\"account_moved_description\">%1$s переїхав до:</string>\n    <string name=\"download_failed\">Не вдалося завантажити</string>\n    <string name=\"caption_notoemoji\">Поточний набір емодзі Google</string>\n    <string name=\"caption_twemoji\">Стандартний набір емодзі Mastodon</string>\n    <string name=\"follow_requests_info\">Попри те, що ваш обліковий запис не заблоковано, співробітники %1$s вважають, що ви, можливо, захочете розглянути запити на підписку від цих облікових записів власноруч.</string>\n    <string name=\"dialog_delete_conversation_warning\">Видалити цю бесіду?</string>\n    <string name=\"action_delete_conversation\">Видалити бесіду</string>\n    <string name=\"action_unbookmark\">Вилучити закладку</string>\n    <string name=\"pref_title_confirm_favourites\">Запитувати підтвердження перед додаванням до вподобаних</string>\n    <string name=\"duration_14_days\">14 днів</string>\n    <string name=\"duration_30_days\">30 днів</string>\n    <string name=\"duration_60_days\">60 днів</string>\n    <string name=\"duration_90_days\">90 днів</string>\n    <string name=\"duration_180_days\">180 днів</string>\n    <string name=\"duration_365_days\">365 днів</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Створити допис</string>\n    <string name=\"notification_sign_up_format\">%1$s реєструється</string>\n    <string name=\"notification_sign_up_name\">Реєстрації</string>\n    <string name=\"notification_sign_up_description\">Сповіщення про нових користувачів</string>\n    <string name=\"notification_update_format\">%1$s редагує свій допис</string>\n    <string name=\"notification_update_description\">Сповіщення, коли редагується повідомлення, з яким ви взаємодіяли</string>\n    <string name=\"notification_update_name\">Редакції допису</string>\n    <string name=\"title_login\">Вхід</string>\n    <string name=\"error_could_not_load_login_page\">Не вдалося завантажити сторінку входу.</string>\n    <string name=\"saving_draft\">Збереження чернетки…</string>\n    <string name=\"action_dismiss\">Відхилити</string>\n    <string name=\"action_details\">Подробиці</string>\n    <string name=\"account_date_joined\">Приєднується %1$s</string>\n    <string name=\"action_edit_image\">Редагувати зображення</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"error_image_edit_failed\">Неможливо редагувати зображення.</string>\n    <string name=\"error_loading_account_details\">Не вдалося завантажити подробиці облікового запису</string>\n    <string name=\"error_following_hashtag_format\">Помилка підписки на #%1$s</string>\n    <string name=\"error_multimedia_size_limit\">Розмір відео та аудіофайлів не може перевищувати %1$s Мб.</string>\n    <string name=\"error_unfollowing_hashtag_format\">Помилка скасування підписки на #%1$s</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"description_post_language\">Мова допису</string>\n    <string name=\"duration_no_change\">(Не змінено)</string>\n    <string name=\"action_set_focus\">Налаштувати точку фокусування</string>\n    <string name=\"pref_show_self_username_always\">Завжди</string>\n    <string name=\"set_focus_description\">Торкніться або перетягніть коло, щоб вибрати точку фокусування, яку завжди буде видно на мініатюрах.</string>\n    <string name=\"pref_show_self_username_disambiguate\">Коли ви ввійшли у кілька облікових записів</string>\n    <string name=\"pref_show_self_username_never\">Ніколи</string>\n    <string name=\"pref_title_show_self_username\">Показувати ім\\'я користувача на панелях інструментів</string>\n    <string name=\"delete_scheduled_post_warning\">Видалити цей запланований допис?</string>\n    <string name=\"instance_rule_info\">Увійшовши, ви погоджуєтесь з правилами %1$s.</string>\n    <string name=\"instance_rule_title\">Правила %1$s</string>\n    <string name=\"failed_to_pin\">Не вдалося прикріпити</string>\n    <string name=\"failed_to_unpin\">Не вдалося відкріпити</string>\n    <string name=\"compose_save_draft_loses_media\">Зберегти чернетку? (Вкладення будуть завантажені знову, коли ви відновите чернетку.)</string>\n    <string name=\"action_add_reaction\">додати реакцію</string>\n    <string name=\"notification_report_format\">Нова скарга %1$s</string>\n    <string name=\"report_category_violation\">Порушення правил</string>\n    <string name=\"action_add_or_remove_from_list\">Додати або вилучити зі списку</string>\n    <string name=\"failed_to_add_to_list\">Не вдалося додати обліковий запис до списку</string>\n    <string name=\"failed_to_remove_from_list\">Не вдалося вилучити обліковий запис зі списку</string>\n    <string name=\"action_unfollow_hashtag_format\">Не слідкувати за #%1$s?</string>\n    <string name=\"status_created_at_now\">зараз</string>\n    <string name=\"notification_header_report_format\">%1$s скаржиться %2$s</string>\n    <string name=\"notification_summary_report_format\">%1$s · %2$d прикріплених дописів</string>\n    <string name=\"confirmation_hashtag_unfollowed\">#%1$s не відстежується</string>\n    <string name=\"notification_report_name\">Скарги</string>\n    <string name=\"notification_report_description\">Сповіщення про звіти про модерацію</string>\n    <string name=\"no_lists\">У вас немає списків.</string>\n    <string name=\"report_category_spam\">Спам</string>\n    <string name=\"report_category_other\">Інше</string>\n    <string name=\"error_following_hashtags_unsupported\">Цей сервер не підтримує наступні гештеги.</string>\n    <string name=\"title_followed_hashtags\">Відстежувані гештеги</string>\n    <string name=\"pref_default_post_language\">Мова дописів (синхронізовано з сервером)</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"post_edited\">Змінено %1$s</string>\n    <string name=\"description_post_edited\">Змінено</string>\n    <string name=\"error_muting_hashtag_format\">Не вдалось ігнорувати #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Помилка припинення ігнорування #%1$s</string>\n    <string name=\"hint_media_description_missing\">Медіа повинні мати опис.</string>\n    <string name=\"pref_title_http_proxy_port_message\">Порт повинен бути між %1$d і %2$d</string>\n    <string name=\"error_status_source_load\">Не вдалося завантажити джерело стану з сервера.</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"action_discard\">Відкинути зміни</string>\n    <string name=\"compose_unsaved_changes\">У вас є незбережені зміни.</string>\n    <string name=\"action_continue_edit\">Продовжити редагування</string>\n    <string name=\"mute_notifications_switch\">Беззвучні сповіщення</string>\n    <string name=\"title_edits\">Редагування</string>\n    <string name=\"status_edit_info\">%1$s редагує</string>\n    <string name=\"status_created_info\">%1$s створює</string>\n    <string name=\"a11y_label_loading_thread\">Обговорення завантажується</string>\n    <string name=\"action_share_account_link\">Поділитися посиланням на обліковий запис</string>\n    <string name=\"action_share_account_username\">Поділитися іменем користувача облікового запису</string>\n    <string name=\"send_account_link_to\">Поділитися URL облікового запису через…</string>\n    <string name=\"send_account_username_to\">Поділитися іменем користувача облікового запису через…</string>\n    <string name=\"account_username_copied\">Ім\\'я користувача скопійовано</string>\n    <string name=\"pref_reading_order_newest_first\">Спочатку новіші</string>\n    <string name=\"pref_title_reading_order\">Порядок читання</string>\n    <string name=\"pref_reading_order_oldest_first\">Спочатку давніші</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Вимкнено</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;не налаштовано&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;недійсний&gt;</string>\n    <string name=\"action_browser_login\">Увійти через браузер</string>\n    <string name=\"description_login\">Працює в більшості випадків. Дані не витікають в інші застосунки.</string>\n    <string name=\"description_browser_login\">Може підтримувати додаткові методи автентифікації, але для цього потрібен підтримуваний браузер.</string>\n    <string name=\"action_post_failed\">Не вдалося вивантажити</string>\n    <string name=\"action_post_failed_show_drafts\">Показати чернетки</string>\n    <string name=\"action_post_failed_do_nothing\">Відхилити</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"one\">Не вдалося вивантажити ваш допис. Він збережений в чернетках.\n\\n\n\\nАбо не вдалося зв\\'язатися з сервером, або він відхилив допис.</item>\n        <item quantity=\"few\">Не вдалося вивантажити ваші дописи. Їх збережено в чернетках.\n\\n\n\\nАбо не вдалося зв\\'язатися з сервером, або він відхилив дописи.</item>\n        <item quantity=\"many\">Не вдалося вивантажити ваші дописи. Їх збережено в чернетках.\n\\n\n\\nАбо не вдалося зв\\'язатися з сервером, або він відхилив дописи.</item>\n        <item quantity=\"other\">Не вдалося вивантажити ваші дописи. Їх збережено в чернетках.\n\\n\n\\nАбо не вдалося зв\\'язатися з сервером, або він відхилив дописи.</item>\n    </plurals>\n    <string name=\"accessibility_talking_about_tag\">%1$d людей обговорюють гештеґ %2$s</string>\n    <string name=\"title_public_trending_hashtags\">Популярні гештеги</string>\n    <string name=\"total_usage\">Усього використано</string>\n    <string name=\"total_accounts\">Усього облікових записів</string>\n    <string name=\"dialog_follow_hashtag_title\">Стежити за гештегом</string>\n    <string name=\"action_refresh\">Оновити</string>\n    <string name=\"notification_unknown_name\">Невідомо</string>\n    <string name=\"socket_timeout_exception\">Надто тривала спроба з\\'єднання з вашим сервером</string>\n    <string name=\"ui_error_unknown\">невідома причина</string>\n    <string name=\"ui_error_bookmark\">Не вдалося додати допис до закладок: %1$s</string>\n    <string name=\"ui_error_clear_notifications\">Не вдалося очистити сповіщення: %1$s</string>\n    <string name=\"ui_error_favourite\">Не вдалося вподобати допис: %1$s</string>\n    <string name=\"ui_error_reblog\">Не вдалося поширити допис: %1$s</string>\n    <string name=\"ui_error_vote\">Не вдалося проголосувати: %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">Не вдалося погодити запит на підписку: %1$s</string>\n    <string name=\"ui_error_reject_follow_request\">Не вдалося відхилити запит на підписку: %1$s</string>\n    <string name=\"ui_success_accepted_follow_request\">Запит на підписку погоджено</string>\n    <string name=\"ui_success_rejected_follow_request\">Запит на підписку заблоковано</string>\n    <string name=\"status_filtered_show_anyway\">Усе одно показати</string>\n    <string name=\"status_filter_placeholder_label_format\">Відфільтровано: %1$s</string>\n    <string name=\"pref_title_account_filter_keywords\">Профілі</string>\n    <string name=\"label_filter_title\">Заголовок</string>\n    <string name=\"filter_action_warn\">Попередження</string>\n    <string name=\"filter_action_hide\">Сховати</string>\n    <string name=\"filter_description_warn\">Сховати весь допис із попередженням</string>\n    <string name=\"filter_description_hide\">Сховати повністю</string>\n    <string name=\"label_filter_action\">Фільтрувати дію</string>\n    <string name=\"label_filter_context\">Фільтрувати контексти</string>\n    <string name=\"label_filter_keywords\">Ключові слова або фрази для фільтрування</string>\n    <string name=\"action_add\">Додати</string>\n    <string name=\"filter_keyword_display_format\">%1$s (ціле слово)</string>\n    <string name=\"filter_keyword_addition_title\">Додати ключове слово</string>\n    <string name=\"filter_edit_keyword_title\">Змінити ключове слово</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"hint_filter_title\">Мій фільтр</string>\n    <string name=\"pref_title_show_stat_inline\">Показувати статистику допису у стрічці</string>\n    <string name=\"help_empty_home\">Це ваша <b>головна стрічка</b>. Вона показує останні дописи облікових записів, за якими ви стежите. \n\\n \n\\nЩоб переглянути облікові записи, ви можете знайти їх в одній з інших стрічок. Наприклад, на локальній стрічці вашого сервера {{group}}. Або ви можете шукати їх за іменами {{search}}; наприклад, шукайте Tusky, щоб знайти наш обліковий запис Mastodon.</string>\n    <string name=\"post_media_image\">Зображення</string>\n    <string name=\"select_list_manage\">Керувати списками</string>\n    <string name=\"pref_ui_text_size\">Розмір шрифту інтерфейсу</string>\n    <string name=\"notification_listenable_worker_name\">Фонова діяльність</string>\n    <string name=\"notification_listenable_worker_description\">Сповіщення, коли Tusky працює у фоновому режимі</string>\n    <string name=\"notification_notification_worker\">Отримання сповіщень…</string>\n    <string name=\"notification_prune_cache\">Обслуговування кешу…</string>\n    <string name=\"load_newest_notifications\">Завантажити найновіші сповіщення</string>\n    <string name=\"compose_delete_draft\">Видалити чернетку?</string>\n    <string name=\"error_missing_edits\">Ваш сервер знає, що цей допис було змінено, але не має копії редагувань, тому їх неможливо показати вам. \n\\n \n\\nЦе <a href=\"https://github.com/mastodon/mastodon/issues/25398\">помилка #25398 у Mastodon</a>.</string>\n    <string name=\"error_media_upload_sending_fmt\">Не вдалося вивантажити: %1$s</string>\n    <string name=\"about_device_info_title\">Ваш пристрій</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nВерсія Android: %3$s\n\\nВерсія SDK: %4$d</string>\n    <string name=\"about_account_info_title\">Ваш обліковий запис</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nВерсія: %3$s</string>\n    <string name=\"about_copy\">Скопіювати версію та відомості про пристрій</string>\n    <string name=\"about_copied\">Версію та відомості про пристрій скопійовано</string>\n    <string name=\"list_exclusive_label\">Сховати з домашньої стрічки</string>\n    <string name=\"help_empty_conversations\">Тут розміщено ваші <b>приватні повідомлення</b>; іноді їх називають розмовами або прямими повідомленнями (DM).\n\\n\n\\nОсобисті повідомлення створюються шляхом налаштування видимості {{public}} допису на {{mail}} <i>Особистий</i> і згадування в тексті одного або кількох користувачів.\n\\n\n\\nНаприклад, ви можете почати з перегляду профілю облікового запису, натиснути кнопку {{edit}} і змінити видимість.\n\\n\n\\nЗауважте, що повідомлення у Fediverse не захищені наскрізним шифруванням. Не діліться конфіденційною інформацією.</string>\n    <string name=\"error_media_playback\">Не вдалося відтворити: %1$s</string>\n    <string name=\"dialog_delete_filter_text\">Видалити фільтр \\'%1$s\\'?</string>\n    <string name=\"dialog_delete_filter_positive_action\">Видалити</string>\n    <string name=\"dialog_save_profile_changes_message\">Хочете зберегти зміни у своєму профілі?</string>\n    <string name=\"help_empty_lists\">Це ваше <b>подання списків</b>. Ви можете створити кілька приватних списків і додати до них облікові записи. \n\\n \n\\nЗАУВАЖТЕ, що ви можете додавати до своїх списків лише ті облікові записи, за якими слідкуєте. \n\\n \n\\nЦі списки можна використовувати як вкладку у налаштуваннях Вкладок облікового запису [iconics gmd_account_circle] [iconics gmd_navigate_next].</string>\n    <string name=\"muting_hashtag_success_format\">Сховати гештег #%1$s як попередження</string>\n    <string name=\"unmuting_hashtag_success_format\">Показувати гештег #%1$s</string>\n    <string name=\"action_view_filter\">Переглянути фільтр</string>\n    <string name=\"following_hashtag_success_format\">Гештег #%1$s відстежується</string>\n    <string name=\"unfollowing_hashtag_success_format\">Гештег #%1$s більше не відстежується</string>\n    <string name=\"error_blocking_domain\">Не вдається ігнорувати %1$s: %2$s</string>\n    <string name=\"error_unblocking_domain\">Не вдалося припинити ігнорування %1$s: %2$s</string>\n    <string name=\"label_image\">Зображення</string>\n    <string name=\"app_theme_system_black\">Тема системи (чорна)</string>\n    <string name=\"title_public_trending_statuses\">Популярні дописи</string>\n    <string name=\"pref_title_show_self_boosts\">Показати самопоширення</string>\n    <string name=\"pref_title_show_self_boosts_description\">Хтось поширив власний допис</string>\n    <string name=\"list_reply_policy_none\">Ніхто</string>\n    <string name=\"list_reply_policy_list\">Учасники списку</string>\n    <string name=\"list_reply_policy_followed\">Будь-який користувач, за яким ви стежите</string>\n    <string name=\"list_reply_policy_label\">Показати відповіді на</string>\n    <string name=\"pref_title_per_timeline_preferences\">Налаштування окремих стрічок</string>\n    <string name=\"pref_title_show_notifications_filter\">Показати фільтр сповіщень</string>\n    <string name=\"reply_sending\">Надсилання…</string>\n    <string name=\"reply_sending_long\">Вашу відповідь надіслано.</string>\n    <string name=\"action_translate\">Перекласти</string>\n    <string name=\"action_show_original\">Показати оригінал</string>\n    <string name=\"label_translating\">Перекладається…</string>\n    <string name=\"label_translated\">Перекладено з %1$s на %2$s</string>\n    <string name=\"ui_error_translate\">Неможливо перекласти: %1$s</string>\n    <string name=\"report_category_legal\">Юридичні порушення</string>\n    <string name=\"unknown_notification_type\">Невідомий тип сповіщення</string>\n    <string name=\"url_copied\">Url скопійовано</string>\n    <string name=\"confirmation_hashtag_copied\">\\'#%1$s\\' скопійовано</string>\n    <string name=\"dialog_follow_warning\">Стежити за обліковим записом?</string>\n    <string name=\"pref_title_confirm_follows\">Запитувати підтвердження перед підпискою на користувача</string>\n    <string name=\"action_follow_hashtag\">Стежити за новим гештегом</string>\n    <string name=\"pref_default_reply_privacy\">Приватність відповіді (не синхронізовано з сервером)</string>\n    <string name=\"error_deleting_filter\">Помилка видалення фільтра \\'%1$s\\'</string>\n    <string name=\"error_saving_filter\">Помилка збереження фільтра \\'%1$s\\'</string>\n    <string name=\"pref_match_default_post_privacy\">Відповідає типовим параметрам приватності дописів</string>\n    <string name=\"pref_default_reply_privacy_explanation\">Попередньо вибрана приватність буде залежати від допису, на який ви відповідаєте.</string>\n    <string name=\"post_privacy_direct\">Особисті</string>\n    <string name=\"label_expires_after\">Завершується після</string>\n    <string name=\"follow_hashtag_success\">Відстежуваний гештег %1$s</string>\n    <string name=\"preview_card_more_by_author\">Більше від %1$s</string>\n    <string name=\"filtered_notifications\">Фільтровані сповіщення</string>\n    <string name=\"notifications_from_people_you_may_know\">Сповіщення від %1$d людей, яких ви можете знати</string>\n    <string name=\"notification_policy_accept\">Прийняти</string>\n    <string name=\"notification_policy_filter\">Фільтрувати</string>\n    <string name=\"notification_policy_ignore\">Ігнорувати</string>\n    <string name=\"filtered_notifications_title\">Фільтровані сповіщення</string>\n    <string name=\"accept_notification_request\">Прийняти запит на сповіщення</string>\n    <string name=\"dismiss_notification_request\">Відхилити запит на сповіщення</string>\n    <string name=\"open_settings\">Відкрити налаштування</string>\n    <string name=\"notifications_from\">Сповіщення від %1$s</string>\n    <string name=\"action_accept_notification_request\">Прийняти</string>\n    <string name=\"action_dismiss_notification_request\">Відхилити</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_description\">Відфільтровано, якщо це не відповідь на вашу власну згадку або якщо ви підписані на відправника</string>\n    <string name=\"preview_card_by_author\">Від %1$s</string>\n    <string name=\"post_replied\">Відповідь</string>\n    <string name=\"post_replied_format\">У відповідь до %1$s</string>\n    <string name=\"post_replied_self\">Продовження стрічки</string>\n    <string name=\"notification_policies_title\">Правила сповіщень</string>\n    <string name=\"notification_policies_filter_out\">Керувати сповіщеннями від…</string>\n    <string name=\"unknown_notification_filter_new_accounts_description\">Створені за попередні 30 днів</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_title\">Небажані приватні згадки</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">Люди, за якими ви не слідкуєте</string>\n    <string name=\"notification_policies_filter_dont_follow_description\">Доки ви не затвердите їх власноруч</string>\n    <string name=\"notification_policies_filter_not_following_title\">Люди, що не підписані на вас</string>\n    <string name=\"notification_policies_filter_not_following_description\">Включно з людьми, що підписані на вас менше ніж 3 дні</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">Нові облікові записи</string>\n    <string name=\"unknown_notification_filter_moderated_accounts\">Облікові записи під керівництвом модератора</string>\n    <string name=\"unknown_notification_filter_moderated_accounts_description\">Обмежено модераторами сервера</string>\n    <string name=\"notification_policies_not_supported\">Ця функція підтримується лише на серверах Mastodon версії 4.3.0 або новіших.</string>\n    <string name=\"action_reblog_public\">Поширення для всіх</string>\n    <string name=\"notification_severed_relationship_name\">Розірвані з\\'єднання</string>\n    <string name=\"notification_unknown_description\">Невідомий тип сповіщення</string>\n    <string name=\"notification_channel_admin_description\">Адміністративні сповіщення, наприклад, скарги або реєстрації</string>\n    <string name=\"relationship_severance_event_title\">З\\'єднання розірвано</string>\n    <string name=\"poll\">Опитування</string>\n    <string name=\"notification_info_mention\">Згадка</string>\n    <string name=\"action_reblog_private\">Поширення лише для підписників</string>\n    <string name=\"notification_moderation_warning_name\">Попередження модерації</string>\n    <string name=\"notification_channel_other\">Інше</string>\n    <string name=\"notification_channel_other_description\">Інші сповіщення, наприклад, розірвані з\\'єднання і попередження модерації</string>\n    <string name=\"notification_channel_admin\">Адміністративні</string>\n    <string name=\"moderation_warning_action_silence\">Ваш обліковий запис обмежено.</string>\n    <string name=\"moderation_warning_action_suspend\">Ваш обліковий запис призупинено.</string>\n    <string name=\"notification_info_reply\">Відповідь</string>\n    <string name=\"notification_info_private_mention\">Приватна згадка</string>\n    <string name=\"notification_info_private_reply\">Приватна відповідь</string>\n    <string name=\"action_reblog_unlisted\">Поширити без сповіщення інших</string>\n    <string name=\"poll_show_results\">Показати результати</string>\n    <string name=\"relationship_severance_event_account_suspension\">Адміністратор з %1$s обмежив %2$s, що означає, що ви більше не можете отримувати від них оновлення або взаємодіяти з ними.</string>\n    <string name=\"unmute_success\">Не ігнорується %1$s</string>\n    <string name=\"mute_failure\">Не вдалося почати ігнорувати %1$s: %2$s</string>\n    <string name=\"unblock_failure\">Не вдалося розблокувати %1$s: %2$s</string>\n    <string name=\"unmute_failure\">Не вдалося припини ігнорування %1$s: %2$s</string>\n    <string name=\"reject_follow_request_failure\">Не вдалося відхилити запит підписки від %1$s: %2$s</string>\n    <string name=\"block_failure\">Не вдалося заблокувати %1$s: %2$s</string>\n    <string name=\"accept_follow_request_failure\">Не вдалося прийняти запит підписки від %1$s: %2$s</string>\n    <string name=\"relationship_severance_event_user_domain_block\">Ви заблокували %1$s, видаливши %2$s своїх підписників і%3$s , на яких ви підписані.</string>\n    <string name=\"moderation_warning_action_delete_statuses\">Деякі з ваших дописів були видалені.</string>\n    <string name=\"moderation_warning_action_sensitive\">Відтепер ваші дописи будуть позначені делікатними.</string>\n    <string name=\"unknown_notification_type_explanation\">Tusky не розпізнає цей тип сповіщень і не може показати його вам. Можливо, вебінтерфейс вашого сервера зможе це зробити. Будь ласка, також повідомте про це розробників Tusky, щоб вони могли додати підтримку цього типу!</string>\n    <string name=\"unblock_success\">Розблоковано %1$s</string>\n    <string name=\"moderation_warning\">Ви отримали попередження від модераторів.</string>\n    <plurals name=\"accounts\">\n        <item quantity=\"one\">%1$s обліковий запис</item>\n        <item quantity=\"few\">%1$s облікових записа</item>\n        <item quantity=\"many\">%1$s облікових записів</item>\n        <item quantity=\"other\">%1$s облікових записів</item>\n    </plurals>\n    <string name=\"moderation_warning_action_disable\">Ваш обліковий запис вимкнено.</string>\n    <string name=\"moderation_warning_action_mark_statuses_as_sensitive\">Деякі з ваших дописів були позначені делікатними.</string>\n    <string name=\"moderation_warning_action_none\">Ваш обліковий запис отримав попередження від модераторів.</string>\n    <string name=\"relationship_severance_event_domain_block\">Адміністратор із %1$s заблокував %2$s, включно з %3$s ваших підписників і %4$s , за якими ви стежите.</string>\n    <plurals name=\"media_attachments\">\n        <item quantity=\"one\">%1$s медіавкладення</item>\n        <item quantity=\"few\">%1$s медіавкладення</item>\n        <item quantity=\"many\">%1$s медіавкладень</item>\n        <item quantity=\"other\">%1$s медіавкладень</item>\n    </plurals>\n    <string name=\"yes\">Так</string>\n    <string name=\"no\">Ні</string>\n    <string name=\"confirm_dismiss_caption\">Відкинути зміну підписання?</string>\n    <string name=\"reblog_privacy_unlisted_description\">Те саме, що й публічні, але вони ніколи не будуть показані в публічних стрічках</string>\n    <string name=\"filter_action_blur\">Розмити</string>\n    <string name=\"filter_description_blur\">Сховати медіа за попередженням</string>\n    <string name=\"reblog_privacy_public_description\">Усі можуть бачити що ви поширили</string>\n    <string name=\"reblog_privacy_followers_only_description\">Лише ваші підписники бачитимуть що ви поширили</string>\n    <string name=\"reblog_confirm\">Поширити цей допис?</string>\n    <string name=\"favourite_confirm\">Додати допис до вподобань?</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-v27/styles.xml",
    "content": "<resources>\n\n    <style name=\"TuskyTheme\" parent=\"TuskyBaseTheme\">\n        <item name=\"android:windowLightStatusBar\">@bool/lightNavigationBar</item>\n        <item name=\"android:windowLightNavigationBar\">@bool/lightNavigationBar</item>\n        <item name=\"android:navigationBarColor\">@color/colorBackground</item>\n        <item name=\"android:navigationBarDividerColor\">?attr/dividerColor</item>\n    </style>\n\n    <!--Black Application Theme Styles-->\n    <style name=\"TuskyBlackTheme\" parent=\"TuskyBlackThemeBase\">\n        <item name=\"android:windowLightStatusBar\">false</item>\n        <item name=\"android:windowLightNavigationBar\">false</item>\n        <item name=\"android:navigationBarColor\">@color/black</item>\n        <item name=\"android:navigationBarDividerColor\">?attr/dividerColor</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-v35/values.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <bool name=\"is_edge_to_edge\">true</bool>\n    <bool name=\"is_not_edge_to_edge\">false</bool>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-vi/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"notification_clear_text\">Bạn có muốn xóa toàn bộ thông báo?</string>\n    <string name=\"send_post_notification_saved_content\">Đã lưu tút vào nháp</string>\n    <string name=\"send_post_notification_cancel_title\">Hủy đăng</string>\n    <string name=\"send_post_notification_channel_name\">Đăng Tút</string>\n    <string name=\"send_post_notification_title\">Đang đăng…</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"other\">%1$d thông báo mới</item>\n    </plurals>\n    <string name=\"notification_summary_small\">%1$s và %2$s</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, và %3$s</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s và %4$d người</string>\n    <string name=\"notification_mention_format\">%1$s nhắc tới bạn</string>\n    <string name=\"notification_mention_name\">Nhắc đến tôi</string>\n    <string name=\"notification_follow_request_format\">%1$s yêu cầu theo dõi bạn</string>\n    <string name=\"notification_follow_format\">%1$s đang theo dõi bạn</string>\n    <string name=\"notification_favourite_format\">%1$s thích tút của bạn</string>\n    <string name=\"notification_reblog_format\">%1$s đăng lại tút của bạn</string>\n    <string name=\"post_lookup_error_format\">Lỗi khi tìm tút %1$s</string>\n    <string name=\"error_no_custom_emojis\">Máy chủ %1$s không có emoji tùy chỉnh</string>\n    <string name=\"send_post_notification_error_title\">Lỗi đăng tút</string>\n    <string name=\"error_delete_list\">Không thể xóa danh sách</string>\n    <string name=\"error_rename_list\">Không thể cập nhật danh sách</string>\n    <string name=\"error_create_list\">Không thể tạo danh sách</string>\n    <string name=\"error_sender_account_gone\">Xảy ra lỗi khi đăng tút.</string>\n    <string name=\"error_media_upload_sending\">Tải lên không thành công.</string>\n    <string name=\"error_media_upload_image_or_video\">Không thể đính kèm ảnh và video cùng một lúc.</string>\n    <string name=\"error_media_download_permission\">Cần có quyền truy cập bộ sưu tập.</string>\n    <string name=\"error_media_upload_permission\">Cần có quyền đọc tập tin.</string>\n    <string name=\"error_media_upload_opening\">Không thể mở tập tin.</string>\n    <string name=\"error_media_upload_type\">Không hỗ trợ định dạng này.</string>\n    <string name=\"error_compose_character_limit\">Vượt quá số ký tự cho phép!</string>\n    <string name=\"error_retrieving_oauth_token\">Lấy token đăng nhập thất bại.</string>\n    <string name=\"error_authorization_denied\">Truy cập bị từ chối.</string>\n    <string name=\"error_authorization_unknown\">Xảy ra lỗi khi cố gắng truy cập.</string>\n    <string name=\"error_no_web_browser_found\">Không tìm thấy trình duyệt web.</string>\n    <string name=\"error_invalid_domain\">Tên miền không hợp lệ</string>\n    <string name=\"error_empty\">Không được để trống.</string>\n    <string name=\"error_network\">Rớt mạng! Xin kiểm tra kết nối và thử lại!</string>\n    <string name=\"error_generic\">Đã có lỗi xảy ra.</string>\n    <string name=\"error_failed_app_registration\">Máy chủ này không cấp quyền truy cập.</string>\n    <string name=\"title_lists\">Danh sách</string>\n    <string name=\"action_lists\">Danh sách</string>\n    <string name=\"about_title_activity\">Thông tin</string>\n    <string name=\"action_reset_schedule\">Làm tươi</string>\n    <string name=\"action_search\">Tìm kiếm</string>\n    <string name=\"action_edit_profile\">Hồ sơ</string>\n    <string name=\"action_view_account_preferences\">Cá nhân</string>\n    <string name=\"action_view_preferences\">Cài đặt</string>\n    <string name=\"action_logout\">Đăng xuất</string>\n    <string name=\"button_done\">Xong</string>\n    <string name=\"action_send_public\">ĐĂNG</string>\n    <string name=\"button_back\">Quay lại</string>\n    <string name=\"button_continue\">TIẾP TỤC</string>\n    <string name=\"filter_dialog_update_button\">Cập nhật</string>\n    <string name=\"filter_dialog_remove_button\">Xóa</string>\n    <string name=\"action_send\">ĐĂNG</string>\n    <string name=\"action_login\">ĐĂNG NHẬP MASTODON</string>\n    <string name=\"dialog_redraft_post_warning\">Xóa và viết lại tút này?</string>\n    <string name=\"dialog_delete_post_warning\">Xóa tút này?</string>\n    <string name=\"dialog_unfollow_warning\">Bỏ theo dõi người này?</string>\n    <string name=\"dialog_message_cancel_follow_request\">Hủy yêu cầu theo dõi?</string>\n    <string name=\"dialog_download_image\">Tải về</string>\n    <string name=\"dialog_message_uploading_media\">Đang tải…</string>\n    <string name=\"dialog_title_finishing_media_upload\">Đã tải xong tập tin</string>\n    <string name=\"dialog_whats_an_instance\">Bạn phải nhập một tên miền. Ví dụ mastodon.social, icosahedron.website, social.tchncs.de và <a href=\"https://instances.social\">vô số khác!</a> \n\\n \n\\nNếu chưa có tài khoản, bạn phải tạo tài khoản ở đó trước. \n\\n \n\\nMáy chủ, nói cách khác là một cộng đồng nơi mà bạn đăng ký tài khoản trên đó, nhưng bạn vẫn có thể dễ dàng giao tiếp và theo dõi mọi người trên các máy chủ khác. \n\\n \n\\nTham khảo <a href=\"https://joinmastodon.org\">joinmastodon.org</a> \\u0020</string>\n    <string name=\"login_connection\">Đang kết nối…</string>\n    <string name=\"label_header\">Ảnh bìa</string>\n    <string name=\"label_avatar\">Ảnh đại diện</string>\n    <string name=\"label_quick_reply\">Trả lời…</string>\n    <string name=\"search_no_results\">Không tìm thấy</string>\n    <string name=\"hint_search\">Tìm kiếm…</string>\n    <string name=\"hint_note\">Giới thiệu</string>\n    <string name=\"hint_display_name\">Biệt danh</string>\n    <string name=\"hint_content_warning\">Nội dung bạn muốn ẩn</string>\n    <string name=\"hint_compose\">Bạn đang nghĩ về điều gì?</string>\n    <string name=\"hint_domain\">Bạn ở máy chủ nào?</string>\n    <string name=\"confirmation_domain_unmuted\">Đã bỏ ẩn %1$s</string>\n    <string name=\"confirmation_unmuted\">Đã bỏ ẩn người này</string>\n    <string name=\"confirmation_unblocked\">Đã bỏ chặn người này</string>\n    <string name=\"confirmation_reported\">Đã gửi!</string>\n    <string name=\"send_media_to\">Chia sẻ tập tin với…</string>\n    <string name=\"send_post_link_to\">Đăng lại URL tút với…</string>\n    <string name=\"send_post_content_to\">Đăng lại tút với…</string>\n    <string name=\"downloading_media\">Đang lưu vào thiết bị</string>\n    <string name=\"download_media\">Lưu media</string>\n    <string name=\"action_share_as\">Đăng lại với tư cách …</string>\n    <string name=\"action_open_as\">Mở với tư cách %1$s</string>\n    <string name=\"action_copy_link\">Chép URL</string>\n    <string name=\"download_image\">Đang tải %1$s</string>\n    <string name=\"action_open_media_n\">Mở tập tin #%1$d</string>\n    <string name=\"title_links_dialog\">Links</string>\n    <string name=\"title_mentions_dialog\">Lượt nhắc tới</string>\n    <string name=\"title_hashtags_dialog\">Hashtag</string>\n    <string name=\"action_open_faved_by\">Xem lượt thích</string>\n    <string name=\"action_open_reblogged_by\">Xem lượt đăng lại</string>\n    <string name=\"action_open_reblogger\">Xem lượt đăng lại</string>\n    <string name=\"action_hashtags\">Hashtag</string>\n    <string name=\"action_mentions\">Lượt nhắc tới</string>\n    <string name=\"action_links\">Links</string>\n    <string name=\"action_add_tab\">Thêm Tab</string>\n    <string name=\"action_schedule_post\">Lên lịch</string>\n    <string name=\"action_emoji_keyboard\">Emoji</string>\n    <string name=\"action_content_warning\">Nội dung ẩn</string>\n    <string name=\"action_toggle_visibility\">Công khai</string>\n    <string name=\"action_access_scheduled_posts\">Đăng tự động</string>\n    <string name=\"action_access_drafts\">Nháp</string>\n    <string name=\"action_reject\">Từ chối</string>\n    <string name=\"action_accept\">Đồng ý</string>\n    <string name=\"action_undo\">Trở về</string>\n    <string name=\"action_edit_own_profile\">Sửa</string>\n    <string name=\"action_save\">Lưu</string>\n    <string name=\"action_open_drawer\">Mở ngăn kéo</string>\n    <string name=\"action_hide_media\">Làm mờ hình ảnh</string>\n    <string name=\"action_mention\">Nhắc tới</string>\n    <string name=\"action_unmute_conversation\">Mở lại thông báo</string>\n    <string name=\"action_mute_conversation\">Tắt thông báo</string>\n    <string name=\"action_mute_domain\">Ẩn %1$s</string>\n    <string name=\"action_unmute\">Bỏ ẩn</string>\n    <string name=\"action_mute\">Ẩn</string>\n    <string name=\"action_share\">Chia sẻ</string>\n    <string name=\"action_photo_take\">Chụp hình</string>\n    <string name=\"action_add_poll\">Tạo bình chọn</string>\n    <string name=\"action_add_media\">Thêm tệp</string>\n    <string name=\"action_open_in_web\">Mở trong trình duyệt</string>\n    <string name=\"action_view_media\">Media</string>\n    <string name=\"action_view_follow_requests\">Yêu cầu theo dõi</string>\n    <string name=\"action_view_domain_mutes\">Những máy chủ đã ẩn</string>\n    <string name=\"action_view_blocks\">Những người đã chặn</string>\n    <string name=\"action_view_mutes\">Những người đã ẩn</string>\n    <string name=\"action_view_bookmarks\">Lưu</string>\n    <string name=\"action_view_favourites\">Thích</string>\n    <string name=\"action_view_profile\">Trang hồ sơ</string>\n    <string name=\"action_close\">Đóng</string>\n    <string name=\"action_retry\">THỬ LẠI</string>\n    <string name=\"action_delete_and_redraft\">Xóa &amp; viết lại</string>\n    <string name=\"action_delete\">Xóa</string>\n    <string name=\"action_edit\">Sửa</string>\n    <string name=\"action_report\">Báo cáo</string>\n    <string name=\"action_show_reblogs\">Hiện lượt đăng lại</string>\n    <string name=\"action_hide_reblogs\">Ẩn lượt đăng lại</string>\n    <string name=\"action_unblock\">Bỏ chặn</string>\n    <string name=\"action_block\">Chặn</string>\n    <string name=\"action_unfollow\">BỎ THEO DÕI</string>\n    <string name=\"action_follow\">THEO DÕI</string>\n    <string name=\"action_logout_confirm\">Bạn có muốn đăng xuất tài khoản %1$s? Dữ liệu của tài khoản sẽ bị xóa, bao gồm những bản nháp và thiết lập.</string>\n    <string name=\"action_compose\">Soạn tút</string>\n    <string name=\"action_more\">Thêm</string>\n    <string name=\"action_unfavourite\">Bỏ lưu</string>\n    <string name=\"action_bookmark\">Lưu</string>\n    <string name=\"action_favourite\">Thích</string>\n    <string name=\"action_unreblog\">Hủy đăng lại</string>\n    <string name=\"action_reblog\">Đăng lại</string>\n    <string name=\"action_reply\">Trả lời</string>\n    <string name=\"action_quick_reply\">Trả lời nhanh</string>\n    <string name=\"report_comment_hint\">Ghi chú?</string>\n    <string name=\"report_username_format\">Báo cáo @%1$s</string>\n    <string name=\"footer_empty\">Trượt xuống để tải nội dung!</string>\n    <string name=\"message_empty\">Trống.</string>\n    <string name=\"post_content_show_less\">Thu gọn</string>\n    <string name=\"post_content_show_more\">Tiếp tục đọc</string>\n    <string name=\"post_content_warning_show_less\">Thu gọn</string>\n    <string name=\"post_content_warning_show_more\">Mở rộng</string>\n    <string name=\"post_sensitive_media_directions\">Vẫn xem</string>\n    <string name=\"post_media_hidden_title\">Media bị ẩn</string>\n    <string name=\"post_sensitive_media_title\">Nhạy cảm</string>\n    <string name=\"post_boosted_format\">%1$s đăng lại</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"title_licenses\">Giấy phép</string>\n    <string name=\"title_scheduled_posts\">Những tút đã lên lịch</string>\n    <string name=\"title_edit_profile\">Chỉnh sửa hồ sơ</string>\n    <string name=\"title_follow_requests\">Yêu cầu theo dõi</string>\n    <string name=\"title_domain_mutes\">Những máy chủ đã ẩn</string>\n    <string name=\"title_blocks\">Những người đã chặn</string>\n    <string name=\"title_mutes\">Những người đã ẩn</string>\n    <string name=\"title_bookmarks\">Những tút đã lưu</string>\n    <string name=\"title_followers\">Người theo dõi</string>\n    <string name=\"title_follows\">Theo dõi</string>\n    <string name=\"title_posts_pinned\">Ghim</string>\n    <string name=\"title_posts_with_replies\">Lượt trả lời</string>\n    <string name=\"title_posts\">Tút</string>\n    <string name=\"title_view_thread\">Tút</string>\n    <string name=\"title_tab_preferences\">Xếp tab</string>\n    <string name=\"title_direct_messages\">Nhắn riêng</string>\n    <string name=\"title_public_federated\">Liên hợp</string>\n    <string name=\"title_public_local\">Máy chủ</string>\n    <string name=\"title_notifications\">Thông báo</string>\n    <string name=\"title_home\">Trang chủ</string>\n    <string name=\"title_drafts\">Những tút nháp</string>\n    <string name=\"title_favourites\">Những tút đã thích</string>\n    <string name=\"link_whats_an_instance\">Máy chủ là gì?</string>\n    <string name=\"pref_title_show_media_preview\">Hiện xem trước hình ảnh</string>\n    <string name=\"pref_title_show_replies\">Hiện những tút dạng trả lời</string>\n    <string name=\"pref_title_show_boosts\">Hiện những lượt đăng lại</string>\n    <string name=\"pref_title_post_tabs\">Trang chủ</string>\n    <string name=\"pref_title_post_filter\">Lọc bảng tin</string>\n    <string name=\"pref_title_gradient_for_media\">Làm mờ media nhạy cảm</string>\n    <string name=\"pref_title_animate_gif_avatars\">Ảnh đại diện GIF</string>\n    <string name=\"pref_title_bot_overlay\">Icon cho tài khoản Bot</string>\n    <string name=\"pref_title_language\">Ngôn ngữ</string>\n    <string name=\"pref_title_custom_tabs\">Mở luôn trong app</string>\n    <string name=\"pref_title_browser_settings\">Trình duyệt</string>\n    <string name=\"app_theme_system\">Giống thiết bị</string>\n    <string name=\"app_theme_auto\">Tự động khi trời tối</string>\n    <string name=\"app_theme_black\">Đen</string>\n    <string name=\"app_theme_light\">Sáng</string>\n    <string name=\"app_them_dark\">Tối</string>\n    <string name=\"pref_title_timeline_filters\">Những từ khóa đã lọc</string>\n    <string name=\"pref_title_timelines\">Bảng tin</string>\n    <string name=\"pref_title_app_theme\">Chủ đề</string>\n    <string name=\"pref_title_appearance_settings\">Giao diện</string>\n    <string name=\"pref_title_notification_filters\">Các loại thông báo đã bật</string>\n    <string name=\"pref_title_notification_alert_light\">Kèm đèn sáng</string>\n    <string name=\"pref_title_notification_alert_vibrate\">Kèm rung</string>\n    <string name=\"pref_title_notification_alert_sound\">Kèm theo tiếng bíp</string>\n    <string name=\"pref_title_notification_alerts\">Báo động</string>\n    <string name=\"pref_title_notifications_enabled\">Thông báo</string>\n    <string name=\"pref_title_edit_notification_settings\">Thông báo</string>\n    <string name=\"visibility_direct\">Nhắn riêng: Chỉ người được nhắc đến</string>\n    <string name=\"visibility_private\">Chỉ người theo dõi</string>\n    <string name=\"visibility_unlisted\">Hạn chế: Ẩn trên bảng tin</string>\n    <string name=\"visibility_public\">Công khai: Mọi người đều thấy</string>\n    <string name=\"dialog_mute_warning\">Ẩn @%1$s?</string>\n    <string name=\"dialog_block_warning\">Chặn @%1$s?</string>\n    <string name=\"mute_domain_warning_dialog_ok\">Ẩn máy chủ này</string>\n    <string name=\"mute_domain_warning\">Bạn có muốn ẩn %1$s? Bạn sẽ không thấy bất kỳ nội dung nào từ máy chủ này nữa. Người theo dõi bạn ở máy chủ này cũng sẽ bị xóa.</string>\n    <string name=\"notification_follow_request_name\">Yêu cầu theo dõi</string>\n    <string name=\"notification_follow_description\">Thông báo về người theo dõi mới</string>\n    <string name=\"notification_follow_name\">Người theo dõi mới</string>\n    <string name=\"notification_mention_descriptions\">Thông báo về lượt nhắc tới</string>\n    <string name=\"post_text_size_largest\">To nhất</string>\n    <string name=\"post_text_size_large\">To</string>\n    <string name=\"post_text_size_medium\">Trung bình</string>\n    <string name=\"post_text_size_small\">Nhỏ vừa</string>\n    <string name=\"post_text_size_smallest\">Nhỏ</string>\n    <string name=\"pref_post_text_size\">Cỡ chữ tút</string>\n    <string name=\"post_privacy_followers_only\">Chỉ người theo dõi</string>\n    <string name=\"post_privacy_unlisted\">Hạn chế</string>\n    <string name=\"post_privacy_public\">Công khai</string>\n    <string name=\"pref_main_nav_position_option_bottom\">Dưới màn hình</string>\n    <string name=\"pref_main_nav_position_option_top\">Trên màn hình</string>\n    <string name=\"pref_main_nav_position\">Vị trí menu</string>\n    <string name=\"pref_failed_to_sync\">Không thể lưu thiết lập</string>\n    <string name=\"pref_publishing\">Mặc định khi đăng</string>\n    <string name=\"pref_default_media_sensitivity\">Media nhạy cảm (đ.bộ máy chủ)</string>\n    <string name=\"pref_default_post_privacy\">Kiểu tút (đ.bộ máy chủ)</string>\n    <string name=\"pref_title_http_proxy_server\">Máy chủ proxy</string>\n    <string name=\"pref_title_http_proxy_port\">Cổng</string>\n    <string name=\"pref_title_http_proxy_enable\">Bật proxy</string>\n    <string name=\"pref_title_http_proxy_settings\">Dùng proxy</string>\n    <string name=\"pref_title_proxy_settings\">Vượt tường lửa</string>\n    <string name=\"notification_boost_description\">Thông báo khi tút của bạn được đăng lại</string>\n    <string name=\"notification_boost_name\">Đăng lại</string>\n    <string name=\"notification_follow_request_description\">Thông báo về lượt yêu cầu theo dõi</string>\n    <string name=\"about_bug_feature_request_site\">Báo lỗi và đề xuất tính năng\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_project_site\">Website dự án: https://tusky.app</string>\n    <string name=\"about_tusky_license\">Tusky là phần mềm mã nguồn mở, được phân phối với giấy phép GNU General Public License Version 3. Tham khảo thêm tại: https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <string name=\"about_powered_by_tusky\">Powered by Tusky</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"description_account_locked\">Tài khoản bị khóa</string>\n    <string name=\"notification_poll_description\">Thông báo khi một cuộc bình chọn kết thúc</string>\n    <string name=\"notification_poll_name\">Bình chọn</string>\n    <string name=\"notification_favourite_description\">Thông báo khi ai đó thích tút của bạn</string>\n    <string name=\"notification_favourite_name\">Lượt thích</string>\n    <string name=\"filter_dialog_whole_word\">Toàn bộ chữ có chứa cụm từ này</string>\n    <string name=\"filter_edit_title\">Sửa bộ lọc</string>\n    <string name=\"filter_addition_title\">Thêm bộ lọc</string>\n    <string name=\"pref_title_thread_filter_keywords\">Thảo luận</string>\n    <string name=\"pref_title_public_filter_keywords\">Liên hợp</string>\n    <string name=\"load_more_placeholder_text\">Hiện những tút chưa đọc</string>\n    <string name=\"replying_to\">Trả lời đến @%1$s</string>\n    <string name=\"title_media\">Media</string>\n    <string name=\"pref_title_alway_open_spoiler\">Hiện nội dung ẩn</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">Hiện media nhạy cảm</string>\n    <string name=\"follows_you\">Đang theo dõi bạn</string>\n    <string name=\"abbreviated_seconds_ago\">%1$ds</string>\n    <string name=\"abbreviated_minutes_ago\">%1$dp</string>\n    <string name=\"abbreviated_hours_ago\">%1$dh</string>\n    <string name=\"abbreviated_days_ago\">%1$d ngày</string>\n    <string name=\"abbreviated_years_ago\">%1$d năm</string>\n    <string name=\"abbreviated_in_seconds\">%1$ds</string>\n    <string name=\"abbreviated_in_minutes\">%1$d phút</string>\n    <string name=\"abbreviated_in_hours\">%1$d giờ</string>\n    <string name=\"abbreviated_in_days\">%1$d ngày</string>\n    <string name=\"abbreviated_in_years\">%1$d năm</string>\n    <string name=\"state_follow_requested\">Yêu cầu theo dõi</string>\n    <string name=\"post_media_video\">Video</string>\n    <string name=\"post_media_images\">Hình ảnh</string>\n    <string name=\"post_share_link\">URL tút</string>\n    <string name=\"post_share_content\">Nội dung tút</string>\n    <string name=\"about_tusky_account\">Trang Tusky</string>\n    <string name=\"pref_title_confirm_reblogs\">Hỏi trước khi đăng lại tút</string>\n    <string name=\"pref_title_show_cards_in_timelines\">Hiện xem trước link</string>\n    <string name=\"warning_scheduling_interval\">Mastodon giới hạn tối thiểu 5 phút.</string>\n    <string name=\"no_scheduled_posts\">Bạn không có tút đã lên lịch.</string>\n    <string name=\"no_drafts\">Bạn không có tút nháp.</string>\n    <string name=\"edit_poll\">Sửa</string>\n    <string name=\"poll_new_choice_hint\">Lựa chọn %1$d</string>\n    <string name=\"poll_allow_multiple_choices\">Cho phép chọn nhiều lựa chọn</string>\n    <string name=\"add_poll_choice\">Thêm</string>\n    <string name=\"duration_7_days\">7 ngày</string>\n    <string name=\"duration_3_days\">3 ngày</string>\n    <string name=\"duration_1_day\">1 ngày</string>\n    <string name=\"duration_6_hours\">6 giờ</string>\n    <string name=\"duration_1_hour\">1 giờ</string>\n    <string name=\"duration_30_min\">30 phút</string>\n    <string name=\"duration_5_min\">5 phút</string>\n    <string name=\"create_poll_title\">Bình chọn</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">Vuốt qua lại giữa các tab</string>\n    <string name=\"failed_search\">Không thể tìm thấy</string>\n    <string name=\"title_accounts\">Người</string>\n    <string name=\"report_description_remote_instance\">Người này thuộc máy chủ khác. Gửi luôn cho máy chủ đó?</string>\n    <string name=\"report_description_1\">Báo cáo sẽ được gửi tới kiểm duyệt viên. Hãy cho biết lý do bạn báo cáo người này bên dưới:</string>\n    <string name=\"failed_fetch_posts\">Chưa tải được tút</string>\n    <string name=\"failed_report\">Báo cáo thất bại</string>\n    <string name=\"report_remote_instance\">Gửi cho %1$s</string>\n    <string name=\"hint_additional_info\">Thêm ghi chú</string>\n    <string name=\"report_sent_success\">Đã gửi báo cáo @%1$s</string>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"other\">%1$d giây</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"other\">%1$d phút</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"other\">%1$d giờ</item>\n    </plurals>\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"other\">%1$d ngày</item>\n    </plurals>\n    <string name=\"poll_ended_created\">Cuộc bình chọn của bạn đã kết thúc</string>\n    <string name=\"poll_ended_voted\">Cuộc bình chọn đã kết thúc</string>\n    <string name=\"poll_vote\">Bình chọn</string>\n    <string name=\"poll_info_closed\">xong</string>\n    <string name=\"poll_info_time_absolute\">kết thúc lúc %1$s</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"other\">%1$s người bình chọn</item>\n    </plurals>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"other\">%1$s người bình chọn</item>\n    </plurals>\n    <string name=\"poll_info_format\">%1$s • %2$s</string>\n    <string name=\"compose_preview_image_description\">Mô tả cho hình %1$s</string>\n    <string name=\"compose_shortcut_short_label\">Soạn</string>\n    <string name=\"compose_shortcut_long_label\">Soạn tút</string>\n    <string name=\"filter_apply\">Áp dụng</string>\n    <string name=\"notifications_apply_filter\">Lọc theo loại</string>\n    <string name=\"notifications_clear\">Xóa hết</string>\n    <string name=\"list\">Danh sách</string>\n    <string name=\"select_list_title\">Chọn danh sách</string>\n    <string name=\"hashtags\">Hashtag</string>\n    <string name=\"pick_hashtag_hint\">Không cần dấu #</string>\n    <string name=\"add_hashtag_title\">Thêm hashtag</string>\n    <string name=\"hint_list_name\">Tên danh sách</string>\n    <string name=\"description_poll\">Lượt bình chọn: %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"description_visibility_direct\">Nhắn riêng</string>\n    <string name=\"description_visibility_private\">Người theo dõi</string>\n    <string name=\"description_visibility_unlisted\">Hạn chế</string>\n    <string name=\"description_visibility_public\">Công khai</string>\n    <string name=\"description_post_bookmarked\">Đã lưu</string>\n    <string name=\"description_post_favourited\">Đã thích</string>\n    <string name=\"description_post_reblogged\">Đã đăng lại</string>\n    <string name=\"description_post_media_no_description_placeholder\">Không có mô tả</string>\n    <string name=\"description_post_cw\">Nội dung ẩn: %1$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s và %3$d người nữa</string>\n    <string name=\"conversation_2_recipients\">%1$s và %2$s</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"title_favourited_by\">Thích bởi</string>\n    <string name=\"title_reblogged_by\">Đăng lại bởi</string>\n    <plurals name=\"reblogs\">\n        <item quantity=\"other\"><b>%1$s</b> đăng lại</item>\n    </plurals>\n    <plurals name=\"favs\">\n        <item quantity=\"other\"><b>%1$s</b> thích</item>\n    </plurals>\n    <string name=\"pin_action\">Ghim</string>\n    <string name=\"unpin_action\">Gỡ ghim</string>\n    <string name=\"label_remote_account\">Nội dung có thể hiển thị không đầy đủ. Nhấn để mở xem chi tiết trên trình duyệt.</string>\n    <string name=\"pref_title_absolute_time\">Sử dụng thời gian thiết bị</string>\n    <string name=\"profile_metadata_content_label\">Nội dung</string>\n    <string name=\"profile_metadata_label_label\">Nhãn</string>\n    <string name=\"profile_metadata_add\">THÊM NỘI DUNG</string>\n    <string name=\"profile_metadata_label\">Metadata</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_apache_2\">Giấy phép Apache (xem bên dưới)</string>\n    <string name=\"license_description\">Tusky có sử dụng những dự án mã nguồn mở sau:</string>\n    <string name=\"unreblog_private\">Hủy đăng lại</string>\n    <string name=\"reblog_private\">Đăng lại công khai</string>\n    <string name=\"account_moved_description\">%1$s đã chuyển sang:</string>\n    <string name=\"profile_badge_bot_text\">Tài khoản Bot</string>\n    <string name=\"download_failed\">Tải về thất bại</string>\n    <string name=\"caption_notoemoji\">Emoji của Google</string>\n    <string name=\"caption_twemoji\">Emoji chính thức của Mastodon</string>\n    <string name=\"caption_blobmoji\">Emoji của Android phiên bản từ 4.4 đến 7.1</string>\n    <string name=\"caption_systememoji\">Sử dụng emoji mặc định của thiết bị</string>\n    <string name=\"restart\">Khởi động lại</string>\n    <string name=\"later\">Để sau</string>\n    <string name=\"restart_emoji\">Bạn cần khởi động lại Tusky để áp dụng các thiết lập</string>\n    <string name=\"restart_required\">Yêu cầu khởi động lại ứng dụng</string>\n    <string name=\"action_open_post\">Xem tút</string>\n    <string name=\"expand_collapse_all_posts\">Mở rộng/Thu gọn toàn bộ tút</string>\n    <string name=\"performing_lookup_title\">Đang tra cứu…</string>\n    <string name=\"download_fonts\">Bạn cần tải về bộ emoji này trước</string>\n    <string name=\"system_default\">Giống thiết bị</string>\n    <string name=\"emoji_style\">Emoji</string>\n    <string name=\"action_compose_shortcut\">Soạn</string>\n    <string name=\"compose_save_draft\">Lưu nháp?</string>\n    <string name=\"lock_account_label_description\">Tự bạn sẽ phê duyệt người theo dõi</string>\n    <string name=\"lock_account_label\">Tài khoản riêng tư</string>\n    <string name=\"action_remove\">Hủy bỏ</string>\n    <string name=\"action_set_caption\">Mô tả</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"other\">Mô tả dành cho người khiếm thị\n\\n(Tối đa %1$d ký tự)</item>\n    </plurals>\n    <string name=\"compose_active_account_description\">Đăng với tư cách %1$s</string>\n    <string name=\"action_add_to_list\">Thêm người này vào danh sách</string>\n    <string name=\"action_remove_from_list\">Xóa người này khỏi danh sách</string>\n    <string name=\"hint_search_people_list\">Tìm người bạn đã theo dõi</string>\n    <string name=\"action_delete_list\">Xóa danh sách</string>\n    <string name=\"action_rename_list\">Đổi tên danh sách</string>\n    <string name=\"action_create_list\">Tạo danh sách</string>\n    <string name=\"add_account_description\">Thêm tài khoản Mastodon</string>\n    <string name=\"add_account_name\">Thêm tài khoản</string>\n    <string name=\"filter_add_description\">Cụm từ muốn lọc</string>\n    <string name=\"filter_dialog_whole_word_description\">Chỉ có tác dụng nếu cụm từ là chữ-số trùng khớp, viết liền không dấu cách</string>\n    <string name=\"description_post_media\">Media: %1$s</string>\n    <string name=\"dialog_mute_hide_notifications\">Ẩn thông báo</string>\n    <string name=\"action_unmute_desc\">Bỏ ẩn %1$s</string>\n    <string name=\"action_unmute_domain\">Bỏ ẩn %1$s</string>\n    <string name=\"pref_title_hide_top_toolbar\">Ẩn tên tab</string>\n    <string name=\"account_note_saved\">Đã lưu!</string>\n    <string name=\"account_note_hint\">Ghi chú về người này</string>\n    <string name=\"no_announcements\">Chưa có thông báo.</string>\n    <string name=\"title_announcements\">Có gì mới?</string>\n    <string name=\"wellbeing_hide_stats_profile\">Ẩn số liệu trên trang hồ sơ</string>\n    <string name=\"wellbeing_hide_stats_posts\">Ẩn số liệu trên tút</string>\n    <string name=\"limit_notifications\">Giảm bớt thông báo</string>\n    <string name=\"review_notifications\">Chọn loại thông báo</string>\n    <string name=\"wellbeing_mode_notice\">Các thông tin ảnh hưởng tới tâm lý hành vi của bạn sẽ bị ẩn. Bao gồm:\n\\n\n\\n- Thông báo Thích/Đăng lại/Theo dõi\n\\n- Số lượt Thích/Đăng lại tút\n\\n- Số Người theo dõi/Tút trên trang hồ sơ\n\\n\n\\nThông báo đẩy sẽ không ảnh hưởng, bạn có thể tự thiết lập trong phần cài đặt điện thoại của bạn.</string>\n    <string name=\"pref_title_wellbeing_mode\">Chống nghiện</string>\n    <string name=\"notification_subscription_description\">Thông báo khi người bạn theo dõi đăng tút mới</string>\n    <string name=\"notification_subscription_name\">Tút mới</string>\n    <string name=\"notification_subscription_format\">%1$s đăng tút mới</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"other\">Bạn không thể đính kèm quá %1$d tệp.</item>\n    </plurals>\n    <string name=\"duration_indefinite\">Vĩnh viễn</string>\n    <string name=\"label_duration\">Thời hạn</string>\n    <string name=\"dialog_delete_list_warning\">Bạn thật sự muốn xóa danh sách %1$s?</string>\n    <string name=\"post_media_attachments\">Đính kèm</string>\n    <string name=\"post_media_audio\">Âm thanh</string>\n    <string name=\"drafts_post_reply_removed\">Đã xóa tút trả lời nháp</string>\n    <string name=\"draft_deleted\">Đã xóa tút lên lịch</string>\n    <string name=\"drafts_failed_loading_reply\">Chưa tải được bình luận</string>\n    <string name=\"drafts_post_failed_to_send\">Đăng tút không thành công!</string>\n    <string name=\"pref_title_animate_custom_emojis\">Emoji GIF</string>\n    <string name=\"action_unsubscribe_account\">Dừng nhận thông báo</string>\n    <string name=\"action_subscribe_account\">Nhận thông báo</string>\n    <string name=\"follow_requests_info\">Dù biết tài khoản của bạn công khai, quản trị viên %1$s vẫn nghĩ bạn hãy nên duyệt thủ công yêu cầu theo dõi từ những người lạ.</string>\n    <string name=\"dialog_delete_conversation_warning\">Xóa cuộc thảo luận này?</string>\n    <string name=\"action_delete_conversation\">Xóa thảo luận</string>\n    <string name=\"pref_title_confirm_favourites\">Hỏi trước khi thích tút</string>\n    <string name=\"action_unbookmark\">Bỏ lưu</string>\n    <string name=\"duration_14_days\">14 ngày</string>\n    <string name=\"duration_30_days\">30 ngày</string>\n    <string name=\"duration_60_days\">60 ngày</string>\n    <string name=\"duration_90_days\">90 ngày</string>\n    <string name=\"duration_180_days\">180 ngày</string>\n    <string name=\"duration_365_days\">365 ngày</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">Soạn tút</string>\n    <string name=\"notification_sign_up_format\">%1$s tham gia máy chủ</string>\n    <string name=\"notification_sign_up_name\">Thành viên mới</string>\n    <string name=\"notification_sign_up_description\">Thông báo về người mới tham gia máy chủ</string>\n    <string name=\"notification_update_format\">%1$s đã sửa tút của họ</string>\n    <string name=\"notification_update_name\">Sửa tút</string>\n    <string name=\"notification_update_description\">Thông báo khi tút mà tôi tương tác bị sửa</string>\n    <string name=\"title_login\">Đăng nhập</string>\n    <string name=\"error_could_not_load_login_page\">Không thể tải trang đăng nhập.</string>\n    <string name=\"saving_draft\">Đang lưu nháp…</string>\n    <string name=\"action_dismiss\">Bỏ qua</string>\n    <string name=\"action_details\">Chi tiết</string>\n    <string name=\"account_date_joined\">Đã tham gia %1$s</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"action_edit_image\">Sửa ảnh</string>\n    <string name=\"error_image_edit_failed\">Hình ảnh này không thể sửa.</string>\n    <string name=\"error_loading_account_details\">Không thể tải thông tin tài khoản</string>\n    <string name=\"error_multimedia_size_limit\">Video và audio không thể quá %1$s MB.</string>\n    <string name=\"error_following_hashtag_format\">Lỗi khi theo dõi #%1$s</string>\n    <string name=\"error_unfollowing_hashtag_format\">Lỗi khi bỏ theo dõi #%1$s</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"duration_no_change\">(Không đổi)</string>\n    <string name=\"description_post_language\">Ngôn ngữ đăng</string>\n    <string name=\"action_set_focus\">Chọn tâm điểm</string>\n    <string name=\"set_focus_description\">Nhấn hoặc kéo vòng tròn để chọn tiêu điểm sẽ hiển thị trong hình thu nhỏ.</string>\n    <string name=\"pref_title_show_self_username\">Hiện URL của tôi trên tab</string>\n    <string name=\"pref_show_self_username_always\">Luôn luôn</string>\n    <string name=\"pref_show_self_username_disambiguate\">Khi đăng nhập nhiều tài khoản</string>\n    <string name=\"pref_show_self_username_never\">Không hiện</string>\n    <string name=\"delete_scheduled_post_warning\">Bạn có chắc muốn xóa tút đã lên lịch?</string>\n    <string name=\"instance_rule_info\">Đăng nhập nghĩa là bạn đồng ý với nội quy của %1$s.</string>\n    <string name=\"instance_rule_title\">Nội quy của %1$s</string>\n    <string name=\"compose_save_draft_loses_media\">Lưu bản nháp? (Bạn sẽ cần tải lên lại file đính kèm)</string>\n    <string name=\"failed_to_unpin\">Không thể bỏ ghim</string>\n    <string name=\"failed_to_pin\">Không thể ghim</string>\n    <string name=\"action_add_reaction\">biểu cảm</string>\n    <string name=\"notification_report_description\">Thông báo báo cáo kiểm duyệt</string>\n    <string name=\"action_add_or_remove_from_list\">Sửa danh sách</string>\n    <string name=\"failed_to_add_to_list\">Không thể thêm người vào danh sách</string>\n    <string name=\"failed_to_remove_from_list\">Không thể xoá người khỏi danh sách</string>\n    <string name=\"action_unfollow_hashtag_format\">Bỏ theo dõi #%1$s?</string>\n    <string name=\"status_created_at_now\">vừa xong</string>\n    <string name=\"notification_report_format\">Báo cáo mới trên %1$s</string>\n    <string name=\"notification_header_report_format\">%1$s báo cáo %2$s</string>\n    <string name=\"notification_summary_report_format\">%1$s trước · %2$d tút</string>\n    <string name=\"confirmation_hashtag_unfollowed\">Đã bỏ theo dõi #%1$s</string>\n    <string name=\"notification_report_name\">Báo cáo</string>\n    <string name=\"no_lists\">Chưa có danh sách nào.</string>\n    <string name=\"report_category_violation\">Vi phạm nội quy máy chủ</string>\n    <string name=\"report_category_spam\">Spam</string>\n    <string name=\"report_category_other\">Lý do khác</string>\n    <string name=\"error_following_hashtags_unsupported\">Máy chủ này không hỗ trợ theo dõi hashtag.</string>\n    <string name=\"title_followed_hashtags\">Những hashtag theo dõi</string>\n    <string name=\"post_edited\">Sửa %1$s</string>\n    <string name=\"description_post_edited\">Đã sửa</string>\n    <string name=\"pref_default_post_language\">Ngôn ngữ đăng (đ.bộ máy chủ)</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"error_muting_hashtag_format\">Lỗi khi ẩn #%1$s</string>\n    <string name=\"error_unmuting_hashtag_format\">Lỗi khi bỏ ẩn #%1$s</string>\n    <string name=\"hint_media_description_missing\">Hình ảnh phải có mô tả.</string>\n    <string name=\"error_status_source_load\">Không xác định được trạng thái máy chủ.</string>\n    <string name=\"pref_title_http_proxy_port_message\">Cổng nên là khoảng giữa %1$d đến %2$d</string>\n    <string name=\"post_media_alt\">✦</string>\n    <string name=\"action_discard\">Hủy bỏ thay đổi</string>\n    <string name=\"action_continue_edit\">Tiếp tục sửa</string>\n    <string name=\"compose_unsaved_changes\">Thay đổi chưa được lưu.</string>\n    <string name=\"mute_notifications_switch\">Ẩn thông báo</string>\n    <string name=\"status_edit_info\">Sửa %1$s</string>\n    <string name=\"status_created_info\">Đăng %1$s</string>\n    <string name=\"title_edits\">Lịch sử sửa tút</string>\n    <string name=\"a11y_label_loading_thread\">Đang tải thảo luận</string>\n    <string name=\"action_share_account_link\">Liên kết trang hồ sơ</string>\n    <string name=\"send_account_link_to\">Chia sẻ URL người dùng…</string>\n    <string name=\"action_share_account_username\">Địa chỉ Mastodon</string>\n    <string name=\"send_account_username_to\">Chia sẻ tên người này…</string>\n    <string name=\"account_username_copied\">Đã sao chép tên người này</string>\n    <string name=\"pref_title_reading_order\">Thứ tự đọc</string>\n    <string name=\"pref_reading_order_oldest_first\">Cũ nhất trước</string>\n    <string name=\"pref_reading_order_newest_first\">Mới nhất trước</string>\n    <string name=\"pref_summary_http_proxy_disabled\">Tắt</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;không đặt&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;không hợp lệ&gt;</string>\n    <string name=\"description_browser_login\">Có thể hỗ trợ các phương thức xác thực bổ sung nhưng yêu cầu trình duyệt được hỗ trợ.</string>\n    <string name=\"action_browser_login\">Đăng nhập bằng trình duyệt</string>\n    <string name=\"description_login\">Đăng nhập ổn định. Dữ liệu sẽ không bị lộ.</string>\n    <string name=\"action_post_failed\">Tải lên thất bại</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"other\">Tút của bạn không tải lên được và đã được lưu nháp.\n\\n\n\\nKhông thể kết nối tới máy chủ hoặc nó đã từ chối tút.</item>\n    </plurals>\n    <string name=\"action_post_failed_show_drafts\">Xem bản nháp</string>\n    <string name=\"action_post_failed_do_nothing\">Bỏ qua</string>\n    <string name=\"title_public_trending_hashtags\">Hashtag xu hướng</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d người đang thảo luận về %2$s</string>\n    <string name=\"total_usage\">lượt dùng</string>\n    <string name=\"total_accounts\">người dùng</string>\n    <string name=\"dialog_follow_hashtag_title\">Theo dõi hashtag</string>\n    <string name=\"action_refresh\">Làm mới</string>\n    <string name=\"notification_unknown_name\">Chưa biết</string>\n    <string name=\"socket_timeout_exception\">Mất thời gian kết nối quá lâu</string>\n    <string name=\"ui_error_unknown\">chưa rõ lý do</string>\n    <string name=\"ui_error_bookmark\">Lưu tút không thành công: %1$s</string>\n    <string name=\"ui_error_clear_notifications\">Xóa thông báo không thành công: %1$s</string>\n    <string name=\"ui_error_favourite\">Thích tút không thành công: %1$s</string>\n    <string name=\"ui_error_reblog\">Đăng lại tút không thành công: %1$s</string>\n    <string name=\"ui_error_vote\">Bình chọn không thành công: %1$s</string>\n    <string name=\"ui_error_accept_follow_request\">Chấp nhận theo dõi không thành công: %1$s</string>\n    <string name=\"ui_error_reject_follow_request\">Từ chối theo dõi không thành công: %1$s</string>\n    <string name=\"ui_success_accepted_follow_request\">Đã chấp nhận yêu cầu theo dõi</string>\n    <string name=\"ui_success_rejected_follow_request\">Đã từ chối yêu cầu theo dõi</string>\n    <string name=\"status_filtered_show_anyway\">Vẫn hiện</string>\n    <string name=\"status_filter_placeholder_label_format\">Đã lọc: %1$s</string>\n    <string name=\"pref_title_account_filter_keywords\">Trang hồ sơ</string>\n    <string name=\"hint_filter_title\">Bộ lọc của tôi</string>\n    <string name=\"label_filter_title\">Tên bộ lọc</string>\n    <string name=\"filter_action_warn\">Cảnh báo ở</string>\n    <string name=\"filter_action_hide\">Lọc ở</string>\n    <string name=\"filter_description_warn\">Ẩn cả tút kèm cảnh báo</string>\n    <string name=\"filter_description_hide\">Ẩn hoàn toàn</string>\n    <string name=\"label_filter_action\">Hành động</string>\n    <string name=\"label_filter_context\">Nơi áp dụng</string>\n    <string name=\"label_filter_keywords\">Từ hoặc cụm từ muốn lọc</string>\n    <string name=\"action_add\">Thêm</string>\n    <string name=\"filter_keyword_display_format\">%1$s (cả từ)</string>\n    <string name=\"filter_keyword_addition_title\">Thêm từ</string>\n    <string name=\"filter_edit_keyword_title\">Sửa từ</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"pref_title_show_stat_inline\">Hiện số tương tác tút</string>\n    <string name=\"help_empty_home\">Đây là <b>bảng tin của bạn</b>. Nó sẽ hiện tút gần đây từ những người bạn theo dõi. \n\\n \n\\nĐể khám phá mọi người, bạn có thể xem qua ở các bảng tin khác. Ví dụ: {{group}} Bảng tin máy chủ của bạn. Hoặc bạn cũng có thể {{search}} tìm theo tên người dùng; ví dụ như Tusky.</string>\n    <string name=\"post_media_image\">Hình ảnh</string>\n    <string name=\"select_list_manage\">Quản lý danh sách</string>\n    <string name=\"load_newest_notifications\">Tải những thông báo mới nhất</string>\n    <string name=\"compose_delete_draft\">Xóa bản nháp?</string>\n    <string name=\"error_missing_edits\">Máy chủ của bạn biết tút đã được sửa, nhưng không có bản sao của lần sửa, nên nó không thể hiện. \n\\n \n\\nĐây là <a href=\"https://github.com/mastodon/mastodon/issues/25398\">Lỗi Mastodon #25398</a>.</string>\n    <string name=\"pref_ui_text_size\">Cỡ chữ giao diện</string>\n    <string name=\"notification_listenable_worker_name\">Hoạt động chạy nền</string>\n    <string name=\"notification_listenable_worker_description\">Thông báo khi Tusky hoạt động ngầm</string>\n    <string name=\"notification_notification_worker\">Đang nạp thông báo…</string>\n    <string name=\"notification_prune_cache\">Bảo trì bộ nhớ đệm…</string>\n    <string name=\"error_media_upload_sending_fmt\">Không thể tải lên: %1$s</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nAndroid %3$s\n\\nSDK %4$d</string>\n    <string name=\"about_account_info_title\">Tài khoản của bạn</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\nPhiên bản máy chủ: %3$s</string>\n    <string name=\"about_copy\">Sao chép phiên bản và thông tin thiết bị</string>\n    <string name=\"about_copied\">Đã sao chép phiên bản và thông tin thiết bị</string>\n    <string name=\"about_device_info_title\">Thiết bị của bạn</string>\n    <string name=\"list_exclusive_label\">Ẩn khỏi bảng tin</string>\n    <string name=\"error_media_playback\">Không thể phát: %1$s</string>\n    <string name=\"dialog_delete_filter_text\">Xóa bộ lọc \\'%1$s\\'?</string>\n    <string name=\"dialog_delete_filter_positive_action\">Xóa</string>\n    <string name=\"dialog_save_profile_changes_message\">Bạn có chắc muốn lưu thay đổi?</string>\n    <string name=\"help_empty_conversations\">Đây là <b>tin nhắn riêng</b>; đôi khi gọi là thảo luận hoặc nhắn riêng (DM). \\u0020\n\\n \\u0020\n\\nTin nhắn riêng được tạo bằng cách chọn tùy chọn kiểu tút {{public}} thành {{mail}} <i>Nhắn riêng</i> và có nhắc đến một người nào đó. \\u0020\n\\n \\u0020\n\\nVí dụ: bạn có thể xem hồ sơ của một người và nhấn vào nút {{edit}} và đổi kiểu tút. \\u0020\n\\n\n\\nLưu ý rằng tin nhắn trên Fediverse không được mã hóa đầu cuối. Không chia sẻ bất kỳ thông tin nhạy cảm nào.</string>\n    <string name=\"help_empty_lists\">Đây là <b>danh sách</b>. Bạn có thể tạo nhiều danh sách riêng tư và thêm người dùng vào đó. \\u0020 \n\\n \\u0020 \\u0020\n\\nChỉ những người BẠN ĐANG THEO DÕI mới có thể thêm vào danh sách. \\u0020 \\u0020\n\\n \\u0020 \\u0020\n\\nDanh sách có thể được sử dụng như một tab trong thiết lập {{manage_accounts}} Cá nhân {{chevron_right}} Xếp tab.</string>\n    <string name=\"muting_hashtag_success_format\">Đang ẩn hashtag #%1$s như một cảnh báo</string>\n    <string name=\"unmuting_hashtag_success_format\">Đang bỏ ẩn hashtag #%1$s</string>\n    <string name=\"action_view_filter\">Xem bộ lọc</string>\n    <string name=\"following_hashtag_success_format\">Đã theo dõi hashtag #%1$s</string>\n    <string name=\"unfollowing_hashtag_success_format\">Đã bỏ theo dõi hashtag #%1$s</string>\n    <string name=\"error_blocking_domain\">Không thể ẩn %1$s: %2$s</string>\n    <string name=\"error_unblocking_domain\">Không thể bỏ ẩn %1$s: %2$s</string>\n    <string name=\"label_image\">Hình ảnh</string>\n    <string name=\"app_theme_system_black\">Giống thiết bị (Đen)</string>\n    <string name=\"title_public_trending_statuses\">Tút xu hướng</string>\n    <string name=\"list_reply_policy_none\">Không ai</string>\n    <string name=\"list_reply_policy_list\">Người trong danh sách</string>\n    <string name=\"list_reply_policy_followed\">Người đã theo dõi</string>\n    <string name=\"list_reply_policy_label\">Hiện lượt trả lời</string>\n    <string name=\"pref_title_show_self_boosts\">Hiện những lượt tự đăng lại</string>\n    <string name=\"pref_title_show_self_boosts_description\">Ai đó đăng lại tút của chính họ</string>\n    <string name=\"pref_title_per_timeline_preferences\">Lọc bảng tin</string>\n    <string name=\"pref_title_show_notifications_filter\">Hiện bộ lọc thông báo</string>\n    <string name=\"reply_sending\">Đang gửi…</string>\n    <string name=\"reply_sending_long\">Câu trả lời của bạn đã được gửi đi.</string>\n    <string name=\"action_translate\">Dịch</string>\n    <string name=\"action_show_original\">Xem bản chưa dịch</string>\n    <string name=\"label_translating\">Đang dịch…</string>\n    <string name=\"label_translated\">Dịch %1$s bằng %2$s</string>\n    <string name=\"ui_error_translate\">Không thể dịch: %1$s</string>\n    <string name=\"unknown_notification_type\">Kiểu thông báo chưa rõ</string>\n    <string name=\"report_category_legal\">Vi phạm pháp luật</string>\n    <string name=\"dialog_follow_warning\">Theo dõi người này?</string>\n    <string name=\"pref_title_confirm_follows\">Hỏi trước khi theo dõi</string>\n    <string name=\"url_copied\">Đã sao chép liên kết</string>\n    <string name=\"confirmation_hashtag_copied\">Đã sao chép \\'#%1$s\\'</string>\n    <string name=\"pref_default_reply_privacy\">Kiểu trả lời (không đ.bộ máy chủ)</string>\n    <string name=\"error_deleting_filter\">Xóa bộ lọc \\'%1$s\\' không được</string>\n    <string name=\"error_saving_filter\">Chưa thể lưu bộ lọc \\'%1$s\\'</string>\n    <string name=\"action_follow_hashtag\">Theo dõi một hashtag mới</string>\n    <string name=\"pref_default_reply_privacy_explanation\">Tự động giống tút bạn đang trả lời</string>\n    <string name=\"pref_match_default_post_privacy\">Giống mặc định tút</string>\n    <string name=\"post_privacy_direct\">Nhắn riêng</string>\n    <string name=\"label_expires_after\">Hết hạn sau</string>\n    <string name=\"notification_policies_title\">Chính sách thông báo</string>\n    <string name=\"notification_policies_filter_out\">Quản lý thông báo từ…</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">Người bạn không theo dõi</string>\n    <string name=\"notification_policies_filter_dont_follow_description\">Cho tới khi bạn duyệt họ</string>\n    <string name=\"notification_policies_filter_not_following_title\">Người không theo dõi bạn</string>\n    <string name=\"notification_policies_filter_not_following_description\">Gồm những ai theo dõi bạn ít hơn 3 ngày</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">Người mới tạo tài khoản</string>\n    <string name=\"unknown_notification_filter_new_accounts_description\">Đã tạo trong vòng 30 ngày</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_description\">Trừ khi đó là trả lời lượt nhắc từ bạn hoặc nếu bạn có theo dõi người gửi</string>\n    <string name=\"unknown_notification_filter_moderated_accounts\">Kiểm duyệt máy chủ</string>\n    <string name=\"unknown_notification_filter_moderated_accounts_description\">Chỉ dành cho kiểm duyệt viên</string>\n    <string name=\"filtered_notifications\">Những thông báo đã lọc</string>\n    <string name=\"notifications_from_people_you_may_know\">Thông báo từ %1$d người bạn có thể biết</string>\n    <string name=\"notification_policy_accept\">Cho phép</string>\n    <string name=\"notification_policy_filter\">Lọc</string>\n    <string name=\"notification_policy_ignore\">Bỏ qua</string>\n    <string name=\"filtered_notifications_title\">Những thông báo đã lọc</string>\n    <string name=\"accept_notification_request\">Chấp nhận yêu cầu thông báo</string>\n    <string name=\"dismiss_notification_request\">Bỏ qua yêu cầu thông báo</string>\n    <string name=\"open_settings\">Mở cài đặt</string>\n    <string name=\"notifications_from\">Thông báo từ %1$s</string>\n    <string name=\"action_accept_notification_request\">Chấp nhận</string>\n    <string name=\"action_dismiss_notification_request\">Bỏ qua</string>\n    <string name=\"notification_policies_not_supported\">Tính năng này chỉ được hỗ trợ trên máy chủ Mastodon chạy phiên bản 4.3.0 trở lên.</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_title\">Lượt nhắn riêng không mong muốn</string>\n    <string name=\"post_replied_format\">Trả lời đến %1$s</string>\n    <string name=\"post_replied_self\">Tiếp tục chủ đề</string>\n    <string name=\"post_replied\">Trả lời</string>\n    <string name=\"preview_card_by_author\">Bởi %1$s</string>\n    <string name=\"preview_card_more_by_author\">Viết bởi %1$s</string>\n    <string name=\"follow_hashtag_success\">Đã theo dõi hashtag %1$s</string>\n    <string name=\"notification_severed_relationship_name\">Mất kết nối</string>\n    <string name=\"notification_unknown_description\">Loại thông báo chưa biết</string>\n    <string name=\"notification_channel_admin\">Quản trị</string>\n    <string name=\"notification_channel_admin_description\">Thông báo của quản trị viên, như báo cáo mới hoặc đăng ký</string>\n    <string name=\"notification_moderation_warning_name\">Cảnh cáo kiểm duyệt</string>\n    <string name=\"notification_channel_other_description\">Các thông báo khác, như mất kết nối và cảnh cáo kiểm duyệt</string>\n    <string name=\"notification_channel_other\">Khác</string>\n    <string name=\"relationship_severance_event_domain_block\">Quản trị viên %1$s đã chặn %2$s, nơi có %3$s người theo dõi của bạn và %4$s người mà bạn theo dõi.</string>\n    <plurals name=\"accounts\">\n        <item quantity=\"other\">%1$s người</item>\n    </plurals>\n    <string name=\"moderation_warning_action_delete_statuses\">Vài tút của bạn đã bị xóa.</string>\n    <string name=\"moderation_warning_action_disable\">Tài khoản của bạn đã bị khóa.</string>\n    <string name=\"moderation_warning_action_none\">Tài khoản của bạn nhận một cảnh cáo kiểm duyệt.</string>\n    <string name=\"moderation_warning_action_silence\">Tài khoản của bạn đã bị hạn chế.</string>\n    <string name=\"moderation_warning_action_suspend\">Tài khoản của bạn đã bị vô hiệu hóa.</string>\n    <string name=\"poll\">Bình chọn</string>\n    <plurals name=\"media_attachments\">\n        <item quantity=\"other\">%1$s media đính kèm</item>\n    </plurals>\n    <string name=\"notification_info_reply\">Trả lời</string>\n    <string name=\"moderation_warning_action_sensitive\">Tút của bạn sẽ bị đánh dấu nhạy cảm kể từ bây giờ.</string>\n    <string name=\"relationship_severance_event_user_domain_block\">Bạn đã chặn %1$s, xóa đi %2$s người theo dõi của bạn và %3$s người mà bạn theo dõi.</string>\n    <string name=\"notification_info_private_reply\">Trả lời riêng</string>\n    <string name=\"notification_info_mention\">Nhắc tới tôi</string>\n    <string name=\"relationship_severance_event_account_suspension\">Quản trị viên %1$s đã vô hiệu hóa %2$s, bạn không còn có thể tương tác hoặc nhận được thông tin cập nhật từ họ nữa.</string>\n    <string name=\"moderation_warning_action_mark_statuses_as_sensitive\">Vài tút của bạn được đánh dấu là nhạy cảm.</string>\n    <string name=\"relationship_severance_event_title\">Mất kết nối</string>\n    <string name=\"unknown_notification_type_explanation\">Tusky không nhận dạng được loại thông báo này và không thể hiển thị cho bạn. Giao diện web của máy chủ của bạn có thể thực hiện được. Vui lòng thông báo cho các nhà phát triển Tusky để họ có thể thêm hỗ trợ cho loại này!</string>\n    <string name=\"notification_info_private_mention\">Nhắn riêng</string>\n    <string name=\"moderation_warning\">Bạn nhận một cảnh cáo kiểm duyệt</string>\n    <string name=\"action_reblog_unlisted\">Đăng lại hạn chế</string>\n    <string name=\"action_reblog_private\">Đăng lại với người theo dõi</string>\n    <string name=\"action_reblog_public\">Đăng lại công khai</string>\n    <string name=\"poll_show_results\">Xem kết quả</string>\n    <string name=\"confirm_dismiss_caption\">Bỏ thay đổi chú thích?</string>\n    <string name=\"yes\">Có</string>\n    <string name=\"no\">Không</string>\n    <string name=\"unmute_success\">Đã bỏ ẩn %1$s</string>\n    <string name=\"block_failure\">Chưa thể chặn %1$s: %2$s</string>\n    <string name=\"mute_failure\">Chưa thể ẩn %1$s: %2$s</string>\n    <string name=\"unblock_failure\">Chưa thể bỏ chặn %1$s: %2$s</string>\n    <string name=\"unmute_failure\">Chưa thể bỏ ẩn %1$s: %2$s</string>\n    <string name=\"accept_follow_request_failure\">Chấp nhận yêu cầu theo dõi thất bại từ %1$s: %2$s</string>\n    <string name=\"reject_follow_request_failure\">Từ chối yêu cầu theo dõi thất bại từ %1$s: %2$s</string>\n    <string name=\"unblock_success\">Đã bỏ chặn %1$s</string>\n    <string name=\"filter_action_blur\">Làm mờ</string>\n    <string name=\"filter_description_blur\">Ẩn media kèm cảnh báo</string>\n    <string name=\"reblog_confirm\">Đăng lại tút này?</string>\n    <string name=\"favourite_confirm\">Thích tút này?</string>\n    <string name=\"reblog_privacy_followers_only_description\">Chỉ người theo dõi thấy lượt đăng lại</string>\n    <string name=\"reblog_privacy_public_description\">Ai cũng có thể thấy lượt đăng lại</string>\n    <string name=\"reblog_privacy_unlisted_description\">Ai cũng thấy, nhưng không hiện trên bảng tin</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-w640dp/dimens.xml",
    "content": "<resources>\n    <dimen name=\"timeline_width\">640dp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-w640dp/integers.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <integer name=\"trending_column_count\">3</integer>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-zh-rCN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">出错了。</string>\n    <string name=\"error_network\">网络请求出错，请检查互联网连接并重试。</string>\n    <string name=\"error_empty\">内容不能为空。</string>\n    <string name=\"error_invalid_domain\">该域名无效</string>\n    <string name=\"error_failed_app_registration\">未能通过该实例的身份验证。如果这个问题持续，请从菜单处尝试“在浏览器中登录”。</string>\n    <string name=\"error_no_web_browser_found\">找不到可用的浏览器。</string>\n    <string name=\"error_authorization_unknown\">发生不明授权错误。如果这个问题持续，请从菜单处尝试 “在浏览器中登录”。</string>\n    <string name=\"error_authorization_denied\">授权被拒绝。如果你确定提供了正确的凭据，请从菜单处尝试“在浏览器中登录”。</string>\n    <string name=\"error_retrieving_oauth_token\">未能获取登录令牌。如果这个问题持续，请从菜单处尝试 “在浏览器中登录”。</string>\n    <string name=\"error_compose_character_limit\">嘟文太长了！</string>\n    <string name=\"error_media_upload_type\">无法上传此类型的文件。</string>\n    <string name=\"error_media_upload_opening\">此文件无法打开。</string>\n    <string name=\"error_media_upload_permission\">需要授予 Tusky 读取媒体文件的权限。</string>\n    <string name=\"error_media_download_permission\">需要授予 Tusky 存储媒体的权限。</string>\n    <string name=\"error_media_upload_image_or_video\">无法在一篇嘟文中同时插入视频和图片。</string>\n    <string name=\"error_media_upload_sending\">上传失败。</string>\n    <string name=\"error_sender_account_gone\">嘟文发送时出错。</string>\n    <string name=\"title_home\">主页</string>\n    <string name=\"title_notifications\">通知</string>\n    <string name=\"title_public_local\">本站时间轴</string>\n    <string name=\"title_public_federated\">跨站时间轴</string>\n    <string name=\"title_direct_messages\">私信</string>\n    <string name=\"title_tab_preferences\">标签页</string>\n    <string name=\"title_view_thread\">长嘟文</string>\n    <string name=\"title_posts\">嘟文</string>\n    <string name=\"title_posts_with_replies\">嘟文和回复</string>\n    <string name=\"title_posts_pinned\">已置顶</string>\n    <string name=\"title_follows\">正在关注</string>\n    <string name=\"title_followers\">关注者</string>\n    <string name=\"title_favourites\">收藏</string>\n    <string name=\"title_mutes\">被隐藏的用户</string>\n    <string name=\"title_blocks\">被屏蔽的用户</string>\n    <string name=\"title_follow_requests\">关注请求</string>\n    <string name=\"title_edit_profile\">编辑个人资料</string>\n    <string name=\"title_drafts\">草稿</string>\n    <string name=\"title_licenses\">开源协议</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s 转嘟了</string>\n    <string name=\"post_sensitive_media_title\">敏感内容</string>\n    <string name=\"post_media_hidden_title\">已隐藏的照片或视频</string>\n    <string name=\"post_sensitive_media_directions\">点击查看</string>\n    <string name=\"post_content_warning_show_more\">显示更多</string>\n    <string name=\"post_content_warning_show_less\">折叠内容</string>\n    <string name=\"post_content_show_more\">展开</string>\n    <string name=\"post_content_show_less\">折叠</string>\n    <string name=\"message_empty\">还没有内容。</string>\n    <string name=\"footer_empty\">还没有内容，向下拉动即可刷新！</string>\n    <string name=\"notification_reblog_format\">%1$s 转嘟了你的嘟文</string>\n    <string name=\"notification_favourite_format\">%1$s 喜欢了你的嘟文</string>\n    <string name=\"notification_follow_format\">%1$s 关注了你</string>\n    <string name=\"report_username_format\">举报 @%1$s</string>\n    <string name=\"report_comment_hint\">报告更多信息？</string>\n    <string name=\"action_quick_reply\">快速回复</string>\n    <string name=\"action_reply\">回复</string>\n    <string name=\"action_reblog\">转嘟</string>\n    <string name=\"action_unreblog\">取消转嘟</string>\n    <string name=\"action_favourite\">喜欢</string>\n    <string name=\"action_unfavourite\">取消喜欢</string>\n    <string name=\"action_more\">更多</string>\n    <string name=\"action_compose\">发表嘟文</string>\n    <string name=\"action_login\">用 Tusky 登录</string>\n    <string name=\"action_logout\">注销</string>\n    <string name=\"action_logout_confirm\">你确定要退出登录 %1$s 吗？这会删除账户的所有本地数据，包括草稿和选项。</string>\n    <string name=\"action_follow\">关注</string>\n    <string name=\"action_unfollow\">取消关注</string>\n    <string name=\"action_block\">屏蔽</string>\n    <string name=\"action_unblock\">取消屏蔽</string>\n    <string name=\"action_hide_reblogs\">隐藏转嘟</string>\n    <string name=\"action_show_reblogs\">显示转嘟</string>\n    <string name=\"action_report\">举报</string>\n    <string name=\"action_delete\">删除</string>\n    <string name=\"action_delete_and_redraft\">删除并重新编辑</string>\n    <string name=\"action_send\">嘟嘟</string>\n    <string name=\"action_send_public\">嘟嘟！</string>\n    <string name=\"action_retry\">重试</string>\n    <string name=\"action_close\">关闭</string>\n    <string name=\"action_view_profile\">个人资料</string>\n    <string name=\"action_view_preferences\">设置</string>\n    <string name=\"action_view_account_preferences\">账户设置</string>\n    <string name=\"action_view_favourites\">喜欢</string>\n    <string name=\"action_view_mutes\">被隐藏的用户</string>\n    <string name=\"action_view_blocks\">被屏蔽的用户</string>\n    <string name=\"action_view_follow_requests\">关注请求</string>\n    <string name=\"action_view_media\">媒体</string>\n    <string name=\"action_open_in_web\">在浏览器中打开</string>\n    <string name=\"action_add_media\">添加媒体</string>\n    <string name=\"action_photo_take\">拍照</string>\n    <string name=\"action_share\">分享</string>\n    <string name=\"action_mute\">隐藏</string>\n    <string name=\"action_unmute\">取消隐藏</string>\n    <string name=\"action_mention\">提及</string>\n    <string name=\"action_hide_media\">隐藏媒体文件</string>\n    <string name=\"action_open_drawer\">打开菜单</string>\n    <string name=\"action_save\">保存</string>\n    <string name=\"action_edit_profile\">编辑个人资料</string>\n    <string name=\"action_edit_own_profile\">编辑</string>\n    <string name=\"action_undo\">撤销</string>\n    <string name=\"action_accept\">接受</string>\n    <string name=\"action_reject\">拒绝</string>\n    <string name=\"action_search\">搜索</string>\n    <string name=\"action_access_drafts\">草稿</string>\n    <string name=\"action_toggle_visibility\">设置嘟文可见范围</string>\n    <string name=\"action_content_warning\">设置内容提醒</string>\n    <string name=\"action_emoji_keyboard\">插入表情符号</string>\n    <string name=\"action_add_tab\">添加标签页</string>\n    <string name=\"action_links\">链接</string>\n    <string name=\"action_mentions\">提及</string>\n    <string name=\"action_hashtags\">话题</string>\n    <string name=\"action_open_reblogger\">打开转嘟用户主页</string>\n    <string name=\"action_open_reblogged_by\">显示转嘟</string>\n    <string name=\"action_open_faved_by\">显示喜欢</string>\n    <string name=\"title_hashtags_dialog\">话题</string>\n    <string name=\"title_mentions_dialog\">提及</string>\n    <string name=\"title_links_dialog\">链接</string>\n    <string name=\"action_open_media_n\">打开媒体文件 #%1$d</string>\n    <string name=\"download_image\">下载中 %1$s</string>\n    <string name=\"action_copy_link\">复制链接</string>\n    <string name=\"action_open_as\">打开为 %1$s</string>\n    <string name=\"action_share_as\">分享为 …</string>\n    <string name=\"download_media\">下载媒体文件</string>\n    <string name=\"downloading_media\">正在下载媒体文件</string>\n    <string name=\"send_post_link_to\">分享嘟文链接到…</string>\n    <string name=\"send_post_content_to\">分享嘟文到…</string>\n    <string name=\"send_media_to\">分享媒体到…</string>\n    <string name=\"confirmation_reported\">已发送！</string>\n    <string name=\"confirmation_unblocked\">已解除屏蔽</string>\n    <string name=\"confirmation_unmuted\">已取消隐藏</string>\n    <string name=\"hint_domain\">哪个实例？</string>\n    <string name=\"hint_compose\">有什么新鲜事？</string>\n    <string name=\"hint_content_warning\">内容提醒</string>\n    <string name=\"hint_display_name\">昵称</string>\n    <string name=\"hint_note\">简介</string>\n    <string name=\"hint_search\">搜索…</string>\n    <string name=\"search_no_results\">没找到结果</string>\n    <string name=\"label_quick_reply\">回复…</string>\n    <string name=\"label_avatar\">头像</string>\n    <string name=\"label_header\">标题</string>\n    <string name=\"link_whats_an_instance\">什么是实例？</string>\n    <string name=\"login_connection\">正在连接…</string>\n    <string name=\"dialog_whats_an_instance\">请输入你账号所在的 Mastodon 站点的域名，比如 mastodon.social，icosahedron.website，social.tchncs.de，<a href=\"https://instances.social\">等等</a> 。\n\\n\n\\n还没有 Mastodon 账号？你也可以输入想注册的 Mastodon 站点的域名，然后在该服务器创建新的账号并授权 Tusky 登入。\n\\n\n\\n在 Mastodon 里，你的账号信息储存在某一特定实例当中，但 Mastodon 可使跨站互动和站内互动一样简单。\n\\n\n\\n可以前往 <a href=\"https://joinmastodon.org\">https://joinmastodon.org</a> 了解更多信息。</string>\n    <string name=\"dialog_title_finishing_media_upload\">正在结束上传</string>\n    <string name=\"dialog_message_uploading_media\">正在上传…</string>\n    <string name=\"dialog_download_image\">下载</string>\n    <string name=\"dialog_message_cancel_follow_request\">移除关注请求？</string>\n    <string name=\"dialog_unfollow_warning\">不再关注此用户？</string>\n    <string name=\"dialog_delete_post_warning\">删除这条嘟文？</string>\n    <string name=\"dialog_redraft_post_warning\">删除并重新起草这条嘟文？</string>\n    <string name=\"visibility_public\">公开：所有人可见，并会出现在公共时间轴上</string>\n    <string name=\"visibility_unlisted\">不公开：所有人可见，但不会出现在公共时间轴上</string>\n    <string name=\"visibility_private\">仅关注者：只有经过你确认后关注你的用户可见</string>\n    <string name=\"visibility_direct\">私信：只有被提及的用户可见</string>\n    <string name=\"pref_title_edit_notification_settings\">通知</string>\n    <string name=\"pref_title_notifications_enabled\">通知</string>\n    <string name=\"pref_title_notification_alerts\">提醒</string>\n    <string name=\"pref_title_notification_alert_sound\">铃声</string>\n    <string name=\"pref_title_notification_alert_vibrate\">振动</string>\n    <string name=\"pref_title_notification_alert_light\">呼吸灯</string>\n    <string name=\"pref_title_notification_filters\">已启用的通知类型</string>\n    <string name=\"pref_title_appearance_settings\">外观</string>\n    <string name=\"pref_title_app_theme\">应用主题</string>\n    <string name=\"pref_title_timelines\">时间轴</string>\n    <string name=\"pref_title_timeline_filters\">过滤器</string>\n    <string name=\"app_them_dark\">暗色</string>\n    <string name=\"app_theme_light\">亮色</string>\n    <string name=\"app_theme_black\">黑色</string>\n    <string name=\"app_theme_auto\">自动切换</string>\n    <string name=\"app_theme_system\">跟随系统设定</string>\n    <string name=\"pref_title_browser_settings\">浏览器</string>\n    <string name=\"pref_title_custom_tabs\">使用 Chrome Custom Tabs</string>\n    <string name=\"pref_title_language\">界面语言</string>\n    <string name=\"pref_title_post_filter\">时间轴过滤</string>\n    <string name=\"pref_title_post_tabs\">首页时间线</string>\n    <string name=\"pref_title_show_boosts\">显示转嘟</string>\n    <string name=\"pref_title_show_replies\">显示回复</string>\n    <string name=\"pref_title_show_media_preview\">显示预览图</string>\n    <string name=\"pref_title_proxy_settings\">代理</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP 代理</string>\n    <string name=\"pref_title_http_proxy_enable\">启用 HTTP 代理</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP 代理服务器</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP 代理端口</string>\n    <string name=\"pref_default_post_privacy\">嘟文隐私级别（与服务器同步）</string>\n    <string name=\"pref_default_media_sensitivity\">始终标记媒体为敏感内容（与服务器同步）</string>\n    <string name=\"pref_publishing\">嘟文发布默认设置</string>\n    <string name=\"pref_failed_to_sync\">同步选项失败</string>\n    <string name=\"post_privacy_public\">公开</string>\n    <string name=\"post_privacy_unlisted\">不公开</string>\n    <string name=\"post_privacy_followers_only\">仅关注者</string>\n    <string name=\"pref_post_text_size\">嘟文字体大小</string>\n    <string name=\"post_text_size_smallest\">最小</string>\n    <string name=\"post_text_size_small\">小</string>\n    <string name=\"post_text_size_medium\">中等</string>\n    <string name=\"post_text_size_large\">大</string>\n    <string name=\"post_text_size_largest\">最大</string>\n    <string name=\"notification_mention_name\">新提及</string>\n    <string name=\"notification_mention_descriptions\">当有用户在嘟文中提及我时</string>\n    <string name=\"notification_follow_name\">新关注者</string>\n    <string name=\"notification_follow_description\">当有用户关注我时</string>\n    <string name=\"notification_boost_name\">转嘟</string>\n    <string name=\"notification_boost_description\">当我的嘟文被转发时通知</string>\n    <string name=\"notification_favourite_name\">喜欢</string>\n    <string name=\"notification_favourite_description\">当有用户喜欢了我的嘟文时</string>\n    <string name=\"notification_poll_name\">投票结果</string>\n    <string name=\"notification_poll_description\">当我参与的投票结束时</string>\n    <string name=\"notification_mention_format\">%1$s 提及了你</string>\n    <string name=\"notification_summary_large\">%1$s，%2$s，%3$s 和 %4$d 等人</string>\n    <string name=\"notification_summary_medium\">%1$s，%2$s 和 %3$s</string>\n    <string name=\"notification_summary_small\">%1$s 和 %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"other\">%1$d 个新互动</item>\n    </plurals>\n    <string name=\"description_account_locked\">锁嘟用户</string>\n    <string name=\"about_title_activity\">关于 Tusky</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_tusky_license\">Tusky 是基于 GNU General Public License Version 3 许可证开源的自由软件。完整的许可证协议：https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">项目地址：https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">问题反馈及功能请求：\n\\nhttps://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Tusky 官方账号</string>\n    <string name=\"post_share_content\">分享嘟文内容</string>\n    <string name=\"post_share_link\">分享嘟文链接</string>\n    <string name=\"post_media_images\">图片</string>\n    <string name=\"post_media_video\">视频</string>\n    <string name=\"state_follow_requested\">已发送关注请求</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">%1$d 年内</string>\n    <string name=\"abbreviated_in_days\">%1$d 天内</string>\n    <string name=\"abbreviated_in_hours\">%1$d 小时内</string>\n    <string name=\"abbreviated_in_minutes\">%1$d 分钟内</string>\n    <string name=\"abbreviated_in_seconds\">%1$d 秒内</string>\n    <string name=\"abbreviated_years_ago\">%1$d 年前</string>\n    <string name=\"abbreviated_days_ago\">%1$d 天前</string>\n    <string name=\"abbreviated_hours_ago\">%1$d 小时前</string>\n    <string name=\"abbreviated_minutes_ago\">%1$d 分钟前</string>\n    <string name=\"abbreviated_seconds_ago\">%1$d 秒前</string>\n    <string name=\"follows_you\">关注了你</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">总是显示敏感媒体内容</string>\n    <string name=\"title_media\">媒体</string>\n    <string name=\"replying_to\">回复 @%1$s</string>\n    <string name=\"load_more_placeholder_text\">加载更多</string>\n    <string name=\"pref_title_public_filter_keywords\">公共时间轴</string>\n    <string name=\"pref_title_thread_filter_keywords\">对话</string>\n    <string name=\"filter_addition_title\">添加新的过滤器</string>\n    <string name=\"filter_edit_title\">编辑过滤器</string>\n    <string name=\"filter_dialog_remove_button\">移除</string>\n    <string name=\"filter_dialog_update_button\">更新</string>\n    <string name=\"filter_add_description\">需要过滤的文字</string>\n    <string name=\"add_account_name\">添加账号</string>\n    <string name=\"add_account_description\">添加新的 Mastodon 账号</string>\n    <string name=\"action_lists\">列表</string>\n    <string name=\"title_lists\">列表</string>\n    <string name=\"error_create_list\">无法新建列表</string>\n    <string name=\"error_rename_list\">无法更新列表</string>\n    <string name=\"error_delete_list\">无法删除列表</string>\n    <string name=\"action_create_list\">新建列表</string>\n    <string name=\"action_rename_list\">更新列表</string>\n    <string name=\"action_delete_list\">删除列表</string>\n    <string name=\"hint_search_people_list\">搜索已关注的用户</string>\n    <string name=\"action_add_to_list\">添加用户到列表</string>\n    <string name=\"action_remove_from_list\">从列表中移除用户</string>\n    <string name=\"compose_active_account_description\">以 %1$s 身份发布嘟文</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"other\">为视觉障碍用户描述内容（最多 %1$d 个字符）</item>\n    </plurals>\n    <string name=\"action_set_caption\">设置图片标题</string>\n    <string name=\"action_remove\">移除</string>\n    <string name=\"lock_account_label\">保护你的账户（锁嘟）</string>\n    <string name=\"lock_account_label_description\">你需要手动审核所有关注请求</string>\n    <string name=\"compose_save_draft\">保存为草稿？</string>\n    <string name=\"send_post_notification_title\">正在发送嘟文…</string>\n    <string name=\"send_post_notification_error_title\">嘟文发送出错</string>\n    <string name=\"send_post_notification_channel_name\">嘟文发送中</string>\n    <string name=\"send_post_notification_cancel_title\">已取消发送</string>\n    <string name=\"send_post_notification_saved_content\">嘟文副本已保存为草稿</string>\n    <string name=\"action_compose_shortcut\">发表嘟文</string>\n    <string name=\"error_no_custom_emojis\">当前实例 %1$s 没有自定义表情符号</string>\n    <string name=\"emoji_style\">表情符号风格</string>\n    <string name=\"system_default\">系统默认</string>\n    <string name=\"download_fonts\">需要下载表情符号数据</string>\n    <string name=\"performing_lookup_title\">正在查询…</string>\n    <string name=\"expand_collapse_all_posts\">展开/折叠所有嘟文</string>\n    <string name=\"action_open_post\">打开嘟文</string>\n    <string name=\"restart_required\">需要重启应用</string>\n    <string name=\"restart_emoji\">你需要重启 Tusky 才能生效</string>\n    <string name=\"later\">稍后</string>\n    <string name=\"restart\">立即重启</string>\n    <string name=\"caption_systememoji\">系统内置的表情符号</string>\n    <string name=\"caption_blobmoji\">Android 4.4–7.1 的黄馒头表情符号</string>\n    <string name=\"caption_twemoji\">Mastodon 使用的表情符号</string>\n    <!-- string name=\"emoji_shortcode_format\" translatable=\"false\">:%1$s:</string -->\n    <string name=\"download_failed\">下载失败</string>\n    <string name=\"profile_badge_bot_text\">机器人</string>\n    <string name=\"account_moved_description\">%1$s 已迁移到：</string>\n    <string name=\"reblog_private\">转嘟（可见者不变）</string>\n    <string name=\"unreblog_private\">取消转嘟</string>\n    <string name=\"license_description\">Tusky 使用了以下开源项目的源码：</string>\n    <string name=\"license_apache_2\">以 Apache License 授权（详见下方）</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">个人资料附加信息</string>\n    <string name=\"profile_metadata_add\">添加信息</string>\n    <string name=\"profile_metadata_label_label\">标签</string>\n    <string name=\"profile_metadata_content_label\">内容</string>\n    <string name=\"pref_title_absolute_time\">嘟文显示精确时间</string>\n    <string name=\"label_remote_account\">以下信息可能并不完整，要查看完整资料请使用浏览器打开。</string>\n    <string name=\"unpin_action\">取消置顶</string>\n    <string name=\"pin_action\">置顶</string>\n    <plurals name=\"favs\">\n        <item quantity=\"other\">%1$s 次收藏</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"other\">%1$s 次转嘟</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">转嘟</string>\n    <string name=\"title_favourited_by\">喜欢</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s 和 %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s，%2$s 和 %3$d 等人</string>\n    <string name=\"description_post_media\">媒体：%1$s</string>\n    <string name=\"description_post_cw\">内容警告：%1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">没有描述信息</string>\n    <string name=\"description_post_reblogged\">被转嘟</string>\n    <string name=\"description_post_favourited\">被喜欢</string>\n    <string name=\"description_visibility_public\">公开</string>\n    <string name=\"description_visibility_unlisted\">不公开</string>\n    <string name=\"description_visibility_private\">仅关注者</string>\n    <string name=\"description_visibility_direct\">私信</string>\n    <string name=\"hint_list_name\">列表名</string>\n    <string name=\"pick_hashtag_hint\">话题名（不含前面的 # 号）</string>\n    <string name=\"notifications_clear\">删除</string>\n    <string name=\"notifications_apply_filter\">筛选</string>\n    <string name=\"filter_apply\">应用</string>\n    <string name=\"compose_shortcut_long_label\">撰写嘟文</string>\n    <string name=\"compose_shortcut_short_label\">发表嘟文</string>\n    <string name=\"pref_title_bot_overlay\">显示机器人标志</string>\n    <string name=\"notification_clear_text\">你确定要永久清空通知列表吗？</string>\n    <string name=\"poll_info_format\">%1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"other\">%1$s 次投票</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">%1$s 结束</string>\n    <string name=\"poll_info_closed\">已结束</string>\n    <string name=\"poll_vote\">投票</string>\n    <string name=\"poll_ended_voted\">你参与的投票已结束</string>\n    <string name=\"poll_ended_created\">你创建的投票已结束</string>\n    <!--These are for timestamps on polls -->\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"other\">剩余 %1$d 天</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"other\">剩余 %1$d 小时</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"other\">剩余 %1$d 分钟</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"other\">剩余 %1$d 秒</item>\n    </plurals>\n    <string name=\"action_reset_schedule\">重置</string>\n    <string name=\"title_bookmarks\">书签</string>\n    <string name=\"title_domain_mutes\">被隐藏的域名</string>\n    <string name=\"title_scheduled_posts\">定时嘟文</string>\n    <string name=\"action_bookmark\">书签</string>\n    <string name=\"action_edit\">编辑</string>\n    <string name=\"action_view_bookmarks\">书签</string>\n    <string name=\"action_view_domain_mutes\">隐藏的域名</string>\n    <string name=\"action_add_poll\">新增投票</string>\n    <string name=\"action_access_scheduled_posts\">定时嘟文</string>\n    <string name=\"action_schedule_post\">定时嘟文</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s 已取消隐藏</string>\n    <string name=\"mute_domain_warning_dialog_ok\">隐藏来自该域名的所有嘟文</string>\n    <string name=\"pref_title_animate_gif_avatars\">动画GIF头像</string>\n    <string name=\"about_powered_by_tusky\">由Tusky提供支持</string>\n    <string name=\"pref_title_alway_open_spoiler\">始终展开有内容警告的嘟文</string>\n    <string name=\"filter_dialog_whole_word\">整个单词</string>\n    <string name=\"filter_dialog_whole_word_description\">如果关键字或缩写只有字母或数字，则只有在匹配整个单词时才会应用</string>\n    <string name=\"caption_notoemoji\">Google正在使用的表情符号</string>\n    <string name=\"description_post_bookmarked\">被加入书签</string>\n    <string name=\"description_poll\">使用以下选项创建投票：%1$s，%2$s，%3$s，%4$s；%5$s</string>\n    <string name=\"select_list_title\">选择列表</string>\n    <string name=\"list\">列表</string>\n    <string name=\"button_continue\">继续</string>\n    <string name=\"button_back\">返回</string>\n    <string name=\"button_done\">完成</string>\n    <string name=\"report_sent_success\">成功举报 @%1$s</string>\n    <string name=\"hint_additional_info\">附加留言</string>\n    <string name=\"report_remote_instance\">转发到 %1$s</string>\n    <string name=\"failed_report\">举报失败</string>\n    <string name=\"failed_fetch_posts\">无法获取嘟文</string>\n    <string name=\"report_description_1\">举报将发送给你所在服务器的管理员。你可以在下面提供举报此账户的相关说明：</string>\n    <string name=\"report_description_remote_instance\">该账户来自其他服务器。向那里发送一份匿名的报告副本？</string>\n    <string name=\"title_accounts\">账户</string>\n    <string name=\"failed_search\">搜索失败</string>\n    <string name=\"create_poll_title\">投票</string>\n    <string name=\"duration_5_min\">5 分钟</string>\n    <string name=\"duration_30_min\">30 分钟</string>\n    <string name=\"duration_1_hour\">1 小时</string>\n    <string name=\"duration_6_hours\">6 小时</string>\n    <string name=\"duration_1_day\">1 天</string>\n    <string name=\"duration_3_days\">3 天</string>\n    <string name=\"duration_7_days\">7 天</string>\n    <string name=\"add_poll_choice\">添加选择</string>\n    <string name=\"poll_allow_multiple_choices\">多项选择</string>\n    <string name=\"poll_new_choice_hint\">选择 %1$d</string>\n    <string name=\"edit_poll\">编辑</string>\n    <string name=\"post_lookup_error_format\">查找嘟文时出错 %1$s</string>\n    <string name=\"no_drafts\">你没有草稿。</string>\n    <string name=\"no_scheduled_posts\">您没有任何定时嘟文。</string>\n    <string name=\"warning_scheduling_interval\">Mastodon的最小预订时间为5分钟。</string>\n    <string name=\"notification_follow_request_name\">关注请求</string>\n    <string name=\"hashtags\">话题</string>\n    <string name=\"pref_title_confirm_reblogs\">转嘟前提示确认</string>\n    <string name=\"pref_title_show_cards_in_timelines\">在时间轴上显示链接预览</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">滑动切换标签页</string>\n    <string name=\"compose_preview_image_description\">处理图片 %1$s</string>\n    <string name=\"add_hashtag_title\">添加话题名</string>\n    <string name=\"notification_follow_request_description\">关注请求的通知</string>\n    <string name=\"pref_main_nav_position_option_bottom\">底部</string>\n    <string name=\"pref_main_nav_position_option_top\">顶部</string>\n    <string name=\"pref_title_gradient_for_media\">为隐藏的媒体文件显示彩色模糊预览</string>\n    <string name=\"dialog_mute_hide_notifications\">隐藏通知</string>\n    <string name=\"dialog_mute_warning\">确定隐藏 @%1$s？</string>\n    <string name=\"dialog_block_warning\">确定屏蔽 @%1$s？</string>\n    <string name=\"mute_domain_warning\">确定要完全屏蔽 %1$s 吗？您将不能在公共时间轴和通知内看见来自此域名的内容，且您在此域名上的关注者将会被移除。</string>\n    <string name=\"action_unmute_conversation\">取消隐藏会话</string>\n    <string name=\"action_mute_conversation\">隐藏会话</string>\n    <string name=\"action_unmute_domain\">取消隐藏 %1$s</string>\n    <string name=\"action_mute_domain\">隐藏 %1$s</string>\n    <string name=\"action_unmute_desc\">取消隐藏 %1$s</string>\n    <string name=\"notification_follow_request_format\">%1$s 请求关注你</string>\n    <string name=\"pref_main_nav_position\">导航栏位置</string>\n    <string name=\"pref_title_hide_top_toolbar\">隐藏顶部工具栏标题</string>\n    <string name=\"no_announcements\">本站暂无公告。</string>\n    <string name=\"title_announcements\">公告</string>\n    <string name=\"account_note_saved\">已保存！</string>\n    <string name=\"account_note_hint\">此账号的备注</string>\n    <string name=\"action_unsubscribe_account\">取消关注</string>\n    <string name=\"action_subscribe_account\">关注</string>\n    <string name=\"drafts_post_reply_removed\">你起草回复的原嘟文已被删除</string>\n    <string name=\"draft_deleted\">草稿已删除</string>\n    <string name=\"drafts_failed_loading_reply\">加载回复信息失败</string>\n    <string name=\"drafts_post_failed_to_send\">嘟文发送失败！</string>\n    <string name=\"dialog_delete_list_warning\">确认删除列表 %1$s？</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"other\">最多只可上传 %1$d 个媒体附件。</item>\n    </plurals>\n    <string name=\"wellbeing_hide_stats_profile\">隐藏账号的统计信息</string>\n    <string name=\"review_notifications\">反馈通知</string>\n    <string name=\"wellbeing_hide_stats_posts\">隐藏嘟文的统计信息</string>\n    <string name=\"limit_notifications\">限制时间线通知</string>\n    <string name=\"wellbeing_mode_notice\">一些可能影响你精神状态的信息将被隐藏，包括：\n\\n\n\\n - 喜欢、转发、关注通知\n\\n - 嘟文的喜欢、转发数\n\\n - 账号的已关注数量、嘟文数量\n\\n\n\\n 推送通知不会被影响，但可以在通知设置中手动禁用。</string>\n    <string name=\"pref_title_wellbeing_mode\">健康模式</string>\n    <string name=\"duration_indefinite\">永久</string>\n    <string name=\"label_duration\">持续时间</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"other\">%1$s 人</item>\n    </plurals>\n    <string name=\"post_media_attachments\">附件</string>\n    <string name=\"post_media_audio\">音频</string>\n    <string name=\"notification_subscription_description\">当我关注的用户发布了新嘟文时通知</string>\n    <string name=\"notification_subscription_name\">新嘟文</string>\n    <string name=\"pref_title_animate_custom_emojis\">显示动态自定义Emoji</string>\n    <string name=\"notification_subscription_format\">%1$s 刚刚发送了新嘟文</string>\n    <string name=\"follow_requests_info\">即使你的账号未上锁，但 %1$s 的管理员认为你可能需要手动处理这些账号的关注请求。</string>\n    <string name=\"dialog_delete_conversation_warning\">删除此对话吗？</string>\n    <string name=\"action_delete_conversation\">删除对话</string>\n    <string name=\"pref_title_confirm_favourites\">收藏前提示确认</string>\n    <string name=\"action_unbookmark\">删除书签</string>\n    <string name=\"duration_30_days\">30 天</string>\n    <string name=\"duration_60_days\">60 天</string>\n    <string name=\"duration_90_days\">90 天</string>\n    <string name=\"duration_180_days\">180 天</string>\n    <string name=\"duration_14_days\">14 天</string>\n    <string name=\"duration_365_days\">365 天</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">撰写嘟文</string>\n    <string name=\"notification_sign_up_format\">%1$s 已注册</string>\n    <string name=\"notification_sign_up_description\">新用户通知</string>\n    <string name=\"notification_sign_up_name\">注册</string>\n    <string name=\"title_login\">登录</string>\n    <string name=\"notification_update_format\">%1$s 编辑了他们的嘟文</string>\n    <string name=\"notification_update_name\">嘟文编辑</string>\n    <string name=\"notification_update_description\">当你进行过互动的嘟文被编辑时发出通知</string>\n    <string name=\"error_could_not_load_login_page\">无法加载登录页。</string>\n    <string name=\"saving_draft\">正在保存草稿…</string>\n    <string name=\"action_dismiss\">不理会</string>\n    <string name=\"action_details\">详情</string>\n    <string name=\"account_date_joined\">加入于%1$s</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"action_edit_image\">编辑图片</string>\n    <string name=\"error_image_edit_failed\">无法编辑图片。</string>\n    <string name=\"error_loading_account_details\">加载账户详情失败</string>\n    <string name=\"error_multimedia_size_limit\">音视频文件大小不能超出 %1$s MB。</string>\n    <string name=\"error_following_hashtag_format\">关注 #%1$s 出错</string>\n    <string name=\"error_unfollowing_hashtag_format\">取关 #%1$s 出错</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"duration_no_change\">(无更改)</string>\n    <string name=\"description_post_language\">嘟文语言</string>\n    <string name=\"action_set_focus\">设置焦点</string>\n    <string name=\"set_focus_description\">轻按或拖动圆圈选择始终在缩略图中可见的焦点。</string>\n    <string name=\"pref_show_self_username_disambiguate\">登录多个账户时</string>\n    <string name=\"pref_title_show_self_username\">在工具栏中显示用户名</string>\n    <string name=\"pref_show_self_username_always\">始终</string>\n    <string name=\"pref_show_self_username_never\">从不</string>\n    <string name=\"delete_scheduled_post_warning\">删除这条定时嘟文吗？</string>\n    <string name=\"instance_rule_info\">登录即表示您同意 %1$s 的规定。</string>\n    <string name=\"instance_rule_title\">%1$s 的规定</string>\n    <string name=\"compose_save_draft_loses_media\">保存草稿？（恢复草稿时附件将被再次上传）</string>\n    <string name=\"failed_to_pin\">固定失败</string>\n    <string name=\"failed_to_unpin\">取消固定失败</string>\n    <string name=\"action_add_reaction\">添加回应</string>\n    <string name=\"notification_report_format\">%1$s 的新报告</string>\n    <string name=\"notification_header_report_format\">%1$s 报告了 %2$s</string>\n    <string name=\"notification_report_name\">报告</string>\n    <string name=\"action_add_or_remove_from_list\">从列表中添加或删除</string>\n    <string name=\"failed_to_add_to_list\">未能将账户添加到列表</string>\n    <string name=\"failed_to_remove_from_list\">未能从列表中删除账户</string>\n    <string name=\"no_lists\">你没有任何列表。</string>\n    <string name=\"action_unfollow_hashtag_format\">取关 #%1$s 吗？</string>\n    <string name=\"status_created_at_now\">立即</string>\n    <string name=\"notification_summary_report_format\">附上了 %1$s · %2$d 个嘟文</string>\n    <string name=\"confirmation_hashtag_unfollowed\">取关了 #%1$s</string>\n    <string name=\"notification_report_description\">审核报告的通知</string>\n    <string name=\"report_category_violation\">违反规则</string>\n    <string name=\"report_category_spam\">垃圾信息</string>\n    <string name=\"report_category_other\">其他</string>\n    <string name=\"error_following_hashtags_unsupported\">此实例不支持下列话题标签。</string>\n    <string name=\"title_followed_hashtags\">关注的话题标签</string>\n    <string name=\"language_display_name_format\">%1$s (%2$s)</string>\n    <string name=\"pref_default_post_language\">发嘟文所用语言（与服务器同步）</string>\n    <string name=\"description_post_edited\">已编辑</string>\n    <string name=\"post_edited\">编辑了 %1$s</string>\n    <string name=\"error_muting_hashtag_format\">对 #%1$s 静音时出错</string>\n    <string name=\"error_unmuting_hashtag_format\">对 #%1$s 取消静音时出错</string>\n    <string name=\"hint_media_description_missing\">媒体文件应该有描述。</string>\n    <string name=\"pref_title_http_proxy_port_message\">端口应在 %1$d 和 %2$d 之间</string>\n    <string name=\"error_status_source_load\">从服务器加载状态源失败。</string>\n    <string name=\"post_media_alt\">ALT</string>\n    <string name=\"action_discard\">放弃更改</string>\n    <string name=\"action_continue_edit\">继续编辑</string>\n    <string name=\"compose_unsaved_changes\">你有未保存的更改。</string>\n    <string name=\"status_created_info\">%1$s 创建了</string>\n    <string name=\"mute_notifications_switch\">将通知静音</string>\n    <string name=\"title_edits\">编辑</string>\n    <string name=\"status_edit_info\">%1$s 编辑了</string>\n    <string name=\"a11y_label_loading_thread\">加载系列嘟文</string>\n    <string name=\"action_share_account_link\">分享账户链接</string>\n    <string name=\"action_share_account_username\">分享账户用户名</string>\n    <string name=\"send_account_link_to\">分享账户链接到…</string>\n    <string name=\"send_account_username_to\">分享账户用户名到…</string>\n    <string name=\"account_username_copied\">已复制用户名</string>\n    <string name=\"pref_title_reading_order\">阅读顺序</string>\n    <string name=\"pref_summary_http_proxy_disabled\">已禁用</string>\n    <string name=\"pref_summary_http_proxy_missing\">&lt;未设置&gt;</string>\n    <string name=\"pref_summary_http_proxy_invalid\">&lt;无效&gt;</string>\n    <string name=\"pref_reading_order_newest_first\">从新到旧</string>\n    <string name=\"pref_reading_order_oldest_first\">从旧到新</string>\n    <string name=\"action_browser_login\">用浏览器登录</string>\n    <string name=\"description_login\">多数情况下有效。没有数据泄露给其他应用。</string>\n    <string name=\"description_browser_login\">可能支持额外的验证方法但需要受支持的浏览器。</string>\n    <plurals name=\"action_post_failed_detail\">\n        <item quantity=\"other\">你的嘟文上传失败，已被保存到草稿。\n\\n\n\\n要么是无法联系服务器，要么是服务器拒绝了它们。</item>\n    </plurals>\n    <string name=\"action_post_failed_show_drafts\">显示草稿</string>\n    <string name=\"action_post_failed_do_nothing\">取消</string>\n    <string name=\"action_post_failed\">上传失败了</string>\n    <string name=\"accessibility_talking_about_tag\">%1$d 人正谈论话题标签 %2$s</string>\n    <string name=\"title_public_trending_hashtags\">热门话题标签</string>\n    <string name=\"total_usage\">总使用</string>\n    <string name=\"total_accounts\">总账户</string>\n    <string name=\"dialog_follow_hashtag_title\">关注话题标签</string>\n    <string name=\"action_refresh\">刷新</string>\n    <string name=\"notification_unknown_name\">未知</string>\n    <string name=\"socket_timeout_exception\">联系你的服务器花了太长时间</string>\n    <string name=\"ui_error_unknown\">未知原因</string>\n    <string name=\"ui_error_clear_notifications\">未能清除通知：%1$s</string>\n    <string name=\"ui_error_bookmark\">未能将嘟文将入书签：%1$s</string>\n    <string name=\"ui_error_favourite\">收藏嘟文失败：%1$s</string>\n    <string name=\"ui_error_reblog\">转发嘟文失败：%1$s</string>\n    <string name=\"ui_error_vote\">投票失败：%1$s</string>\n    <string name=\"ui_error_accept_follow_request\">未能接受关注请求：%1$s</string>\n    <string name=\"ui_error_reject_follow_request\">未能拒绝关注请求：%1$s</string>\n    <string name=\"ui_success_accepted_follow_request\">关注请求被接受</string>\n    <string name=\"ui_success_rejected_follow_request\">关注请求被拦截</string>\n    <string name=\"status_filtered_show_anyway\">仍要显示</string>\n    <string name=\"status_filter_placeholder_label_format\">已过滤：%1$s</string>\n    <string name=\"pref_title_account_filter_keywords\">个人资料</string>\n    <string name=\"hint_filter_title\">我的筛选器</string>\n    <string name=\"label_filter_title\">标题</string>\n    <string name=\"filter_action_warn\">警告</string>\n    <string name=\"filter_action_hide\">隐藏</string>\n    <string name=\"filter_description_warn\">隐藏整条嘟文但显示警告信息</string>\n    <string name=\"label_filter_action\">过滤操作</string>\n    <string name=\"label_filter_context\">筛选器上下文</string>\n    <string name=\"action_add\">添加</string>\n    <string name=\"filter_keyword_display_format\">%1$s (整词)</string>\n    <string name=\"filter_keyword_addition_title\">添加关键词</string>\n    <string name=\"filter_edit_keyword_title\">编辑关键词</string>\n    <string name=\"filter_description_format\">%1$s: %2$s</string>\n    <string name=\"filter_description_hide\">完全隐藏</string>\n    <string name=\"label_filter_keywords\">关键词或短语过滤</string>\n    <string name=\"pref_title_show_stat_inline\">在时间线中显示嘟文统计数字</string>\n    <string name=\"help_empty_home\">这是你的 <b>主时间线</b>。它展示你所关注账户最近发表的嘟文。\n\\n\n\\n要探索账户， 你可以浏览其他时间线。比如，你的账户所在实例服务器的本地时间线 {{group}}。你也可以按名称 {{search}}进行搜索；比如，搜索Tusky 来寻找我们的 Mastodon 账户。</string>\n    <string name=\"post_media_image\">图片</string>\n    <string name=\"select_list_manage\">管理列表</string>\n    <string name=\"load_newest_notifications\">加载最新通知</string>\n    <string name=\"compose_delete_draft\">删除草稿？</string>\n    <string name=\"error_missing_edits\">你的服务器知晓此嘟文被编辑，但没有编辑的副本，所以无法呈现给你。\n\\n\n\\n这是一个 <a href=\"https://github.com/mastodon/mastodon/issues/25398\">Mastodon issue #25398</a>。</string>\n    <string name=\"pref_ui_text_size\">用户界面文本大小</string>\n    <string name=\"notification_listenable_worker_description\">Tusky 在后台工作时进行提示</string>\n    <string name=\"notification_notification_worker\">获取通知中…</string>\n    <string name=\"notification_prune_cache\">缓存维护…</string>\n    <string name=\"notification_listenable_worker_name\">后台活动</string>\n    <string name=\"error_media_upload_sending_fmt\">上传失败了：%1$s</string>\n    <string name=\"about_account_info_title\">你的账户</string>\n    <string name=\"about_account_info\">\\@%1$s@%2$s\n\\n版本: %3$s</string>\n    <string name=\"about_copied\">已复制版本和设备信息</string>\n    <string name=\"about_device_info_title\">你的设备</string>\n    <string name=\"about_device_info\">%1$s %2$s\n\\nAndroid 系统版本: %3$s\n\\nSDK 版本: %4$d</string>\n    <string name=\"about_copy\">复制版本及设备信息</string>\n    <string name=\"list_exclusive_label\">不出现在首页时间线中</string>\n    <string name=\"error_media_playback\">播放失败了：%1$s</string>\n    <string name=\"dialog_delete_filter_text\">删除筛选器\\'%1$s\\'吗？</string>\n    <string name=\"dialog_delete_filter_positive_action\">删除</string>\n    <string name=\"dialog_save_profile_changes_message\">你要保存你的个人资料更改吗？</string>\n    <string name=\"help_empty_conversations\">这是你的 <b>私信</b>；有时也称为对话或直接信息 (DM)。\n\\n\n\\n私信需要将嘟文的可见性 {{public}} 设为 {{mail}} <i>Direct</i> 并在文本中提及一名或多名用户。\n\\n\n\\n你可以在账户的个人资料视图中，轻按“创建”按钮 {{edit}} 并更改可见性。\n\\n\n\\n请注意 Fediverse 上的消息不是端到端加密的。不要分享任何敏感信息。</string>\n    <string name=\"muting_hashtag_success_format\">以警告形式对话题标签 #%1$s 静音</string>\n    <string name=\"unmuting_hashtag_success_format\">取消对话题标签 #%1$s 的静音</string>\n    <string name=\"action_view_filter\">查看筛选器</string>\n    <string name=\"following_hashtag_success_format\">正在关注话题标签 #%1$s</string>\n    <string name=\"unfollowing_hashtag_success_format\">已不再关注话题标签 #%1$s</string>\n    <string name=\"help_empty_lists\">这是你的 <b>列表视图</b>。你可以定义私人列表并添加联系人到列表中。\n\\n\n\\n请注意，你只能将你已关注的账户添加到列表中。\n\\n\n\\n这些列表可被用作“账户选项{管理账户}} {{chevron_right}}”选项卡中的标签页。</string>\n    <string name=\"error_blocking_domain\">未能静音 %1$s: %2$s</string>\n    <string name=\"error_unblocking_domain\">未能取消对 %1$s: %2$s的静音</string>\n    <string name=\"label_image\">图片</string>\n    <string name=\"app_theme_system_black\">使用系统设计（黑色）</string>\n    <string name=\"title_public_trending_statuses\">走红嘟文</string>\n    <string name=\"list_reply_policy_none\">一个也没有</string>\n    <string name=\"list_reply_policy_list\">列表成员</string>\n    <string name=\"list_reply_policy_followed\">任何已关注的用户</string>\n    <string name=\"list_reply_policy_label\">显示哪些回复</string>\n    <string name=\"pref_title_show_self_boosts_description\">某人转发自己的嘟文</string>\n    <string name=\"pref_title_show_self_boosts\">显示自转发嘟文</string>\n    <string name=\"reply_sending\">发送中…</string>\n    <string name=\"pref_default_reply_privacy\">回复隐私级别（不与服务器同步）</string>\n    <string name=\"label_translated\">使用 %2$s 翻译自 %1$s</string>\n    <string name=\"pref_title_show_notifications_filter\">显示通知筛选器</string>\n    <string name=\"pref_title_confirm_follows\">关注前需确认</string>\n    <string name=\"report_category_legal\">法律</string>\n    <string name=\"ui_error_translate\">无法翻译：%1$s</string>\n    <string name=\"unknown_notification_type\">未知通知类型</string>\n    <string name=\"action_translate\">翻译</string>\n    <string name=\"action_show_original\">显示原始内容</string>\n    <string name=\"confirmation_hashtag_copied\">\\'#%1$s\\' 已复制</string>\n    <string name=\"label_translating\">翻译中…</string>\n    <string name=\"reply_sending_long\">正在发送你的回复。</string>\n    <string name=\"dialog_follow_warning\">关注此账户？</string>\n    <string name=\"action_follow_hashtag\">关注新的话题标签</string>\n    <string name=\"url_copied\">Url 已复制</string>\n    <string name=\"pref_title_per_timeline_preferences\">不同时间线采用不同首选项</string>\n    <string name=\"error_deleting_filter\">删除筛选器“%1$s”出错</string>\n    <string name=\"error_saving_filter\">保存筛选器“%1$s”出错</string>\n    <string name=\"pref_default_reply_privacy_explanation\">预选隐私将取决于你回复的嘟文。</string>\n    <string name=\"pref_match_default_post_privacy\">匹配默认嘟文发布隐私</string>\n    <string name=\"post_privacy_direct\">私信</string>\n    <string name=\"label_expires_after\">多久过期</string>\n    <string name=\"notification_policies_title\">通知策略</string>\n    <string name=\"notification_policies_filter_dont_follow_title\">你不关注的人</string>\n    <string name=\"notification_policies_filter_dont_follow_description\">直到你手动批准这些人</string>\n    <string name=\"notification_policies_filter_not_following_title\">未关注你的人</string>\n    <string name=\"notification_policies_filter_not_following_description\">包括关注时间不到3天的人</string>\n    <string name=\"unknown_notification_filter_new_accounts_title\">新账户</string>\n    <string name=\"unknown_notification_filter_new_accounts_description\">过去30天内创建</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_description\">除非是回复你的提及或者你关注了发送人，否则将被过滤</string>\n    <string name=\"unknown_notification_filter_moderated_accounts\">被采取管理措施的账户</string>\n    <string name=\"unknown_notification_filter_moderated_accounts_description\">被服务器管理员限制</string>\n    <string name=\"filtered_notifications\">被过滤的通知</string>\n    <string name=\"notifications_from_people_you_may_know\">来自你可能认识的 %1$d 个人的通知</string>\n    <string name=\"notification_policy_accept\">接受</string>\n    <string name=\"notification_policy_filter\">过滤</string>\n    <string name=\"notification_policy_ignore\">忽略</string>\n    <string name=\"filtered_notifications_title\">过滤了通知</string>\n    <string name=\"accept_notification_request\">接受通知请求</string>\n    <string name=\"open_settings\">打开首选项</string>\n    <string name=\"notifications_from\">来自 %1$s 的通知</string>\n    <string name=\"action_accept_notification_request\">接受</string>\n    <string name=\"action_dismiss_notification_request\">拒绝</string>\n    <string name=\"dismiss_notification_request\">拒绝通知请求</string>\n    <string name=\"notification_policies_filter_out\">管理来自哪些渠道的通知…</string>\n    <string name=\"unknown_notification_filter_unsolicited_private_mentions_title\">不请自来的私下提及</string>\n    <string name=\"notification_policies_not_supported\">仅运行 4.3.0 及之后版本的 Mastodon 服务器支持这个功能。</string>\n    <string name=\"post_replied_self\">嘟文串</string>\n    <string name=\"post_replied\">已回复</string>\n    <string name=\"post_replied_format\">回复%1$s</string>\n    <string name=\"preview_card_by_author\">%1$s 的</string>\n    <string name=\"preview_card_more_by_author\">更多来自 %1$s 的</string>\n    <string name=\"follow_hashtag_success\">关注了 %1$s 话题标签</string>\n    <string name=\"notification_severed_relationship_name\">失去连接</string>\n    <string name=\"notification_moderation_warning_name\">管理警告</string>\n    <string name=\"notification_unknown_description\">未知通知类型</string>\n    <string name=\"notification_channel_other\">其他</string>\n    <string name=\"notification_channel_admin\">管理</string>\n    <string name=\"notification_channel_admin_description\">管理性质的通知，比如新举报或注册</string>\n    <string name=\"relationship_severance_event_domain_block\">%1$s 管理员已经封禁了 %2$s，包括你关注者中的 %3$s 以及你关注的 %4$s。</string>\n    <string name=\"relationship_severance_event_user_domain_block\">你已经封禁了 %1$s，删除了你关注者中的 %2$s 以及你关注的 %3$s。</string>\n    <plurals name=\"accounts\">\n        <item quantity=\"other\">%1$s 个账户</item>\n    </plurals>\n    <string name=\"moderation_warning\">你已经收到了一则管理警告。</string>\n    <string name=\"moderation_warning_action_delete_statuses\">你的一些嘟文已经被删除。</string>\n    <string name=\"moderation_warning_action_disable\">你的账户已被停用。</string>\n    <string name=\"moderation_warning_action_none\">你的账户已收到了一则管理警告。</string>\n    <string name=\"moderation_warning_action_sensitive\">你的多条嘟文从现在起将被标记为敏感。</string>\n    <string name=\"moderation_warning_action_silence\">你的账户已经被限制。</string>\n    <string name=\"moderation_warning_action_suspend\">你的账户已被暂停。</string>\n    <string name=\"poll\">投票</string>\n    <plurals name=\"media_attachments\">\n        <item quantity=\"other\">%1$s 个媒体附件</item>\n    </plurals>\n    <string name=\"notification_info_reply\">回复</string>\n    <string name=\"notification_info_private_mention\">私密提及</string>\n    <string name=\"notification_info_mention\">提及</string>\n    <string name=\"notification_info_private_reply\">私密回复</string>\n    <string name=\"relationship_severance_event_title\">连接丢失</string>\n    <string name=\"relationship_severance_event_account_suspension\">%1$s 管理员已经暂停了%2$s，这意味着你无法再接收来自它们的更新或与它们互动。</string>\n    <string name=\"moderation_warning_action_mark_statuses_as_sensitive\">你的一些嘟文已经被标记为敏感。</string>\n    <string name=\"notification_channel_other_description\">其他通知，比如丢失连接和管理警告</string>\n    <string name=\"unknown_notification_type_explanation\">Tusky 未识别出此通知类型，无法将它显示给你。你服务器的 web 界面也许能够做得到。同时请将此问题告知 Tusky 开发者以添加对此类通知的通知！</string>\n    <string name=\"action_reblog_unlisted\">向所有人转嘟（但嘟文不会出现在公开时间线或探索部分，以及搜索结果中）</string>\n    <string name=\"action_reblog_private\">向关注者转嘟</string>\n    <string name=\"action_reblog_public\">向所有人转嘟</string>\n    <string name=\"poll_show_results\">显示结果</string>\n    <string name=\"no\">否</string>\n    <string name=\"yes\">是</string>\n    <string name=\"confirm_dismiss_caption\">放弃字幕更改？</string>\n    <string name=\"block_failure\">封禁 %1$s 失败：%2$s</string>\n    <string name=\"mute_failure\">静音 %1$s 失败：%2$s</string>\n    <string name=\"unblock_failure\">解封 %1$s 失败：%2$s</string>\n    <string name=\"unmute_failure\">未能解除对 %1$s 的静音：%2$s</string>\n    <string name=\"reject_follow_request_failure\">拒绝 %1$s 的关注请求失败了：%2$s</string>\n    <string name=\"unblock_success\">已解封 %1$s</string>\n    <string name=\"unmute_success\">已解除对 %1$s 的静音操作</string>\n    <string name=\"accept_follow_request_failure\">接受 %1$s 的关注请求失败了：%2$s</string>\n    <string name=\"filter_description_blur\">隐藏媒体但显示警告</string>\n    <string name=\"filter_action_blur\">模糊</string>\n    <string name=\"reblog_privacy_public_description\">所有人都可看到你的转嘟</string>\n    <string name=\"reblog_privacy_unlisted_description\">和“公开”一样，区别是永远不会显示在公共时间线中</string>\n    <string name=\"reblog_privacy_followers_only_description\">只有你的关注者可以看到你的转嘟</string>\n    <string name=\"reblog_confirm\">转发此嘟文？</string>\n    <string name=\"favourite_confirm\">收藏此嘟文？</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-zh-rHK/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">應用程式出現異常。</string>\n    <string name=\"error_network\">網絡請求出錯，請檢查互聯網連接並重試！</string>\n    <string name=\"error_empty\">內容不能為空。</string>\n    <string name=\"error_invalid_domain\">該域名無效</string>\n    <string name=\"error_failed_app_registration\">無法連接此伺服器。</string>\n    <string name=\"error_no_web_browser_found\">沒有可用的瀏覽器。</string>\n    <string name=\"error_authorization_unknown\">認證過程出現未知錯誤。</string>\n    <string name=\"error_authorization_denied\">授權被拒絕。</string>\n    <string name=\"error_retrieving_oauth_token\">無法獲取登入資訊。</string>\n    <string name=\"error_compose_character_limit\">嘟文太長了！</string>\n    <string name=\"error_media_upload_type\">無法上傳此類型的檔案。</string>\n    <string name=\"error_media_upload_opening\">此檔案無法開啟。</string>\n    <string name=\"error_media_upload_permission\">需要授予 Tusky 讀取媒體檔案的權限。</string>\n    <string name=\"error_media_download_permission\">需要授予 Tusky 寫入儲存空間的權限。</string>\n    <string name=\"error_media_upload_image_or_video\">無法在嘟文中同時插入影片和圖片。</string>\n    <string name=\"error_media_upload_sending\">媒體檔案上傳失敗。</string>\n    <string name=\"error_sender_account_gone\">嘟文發送時出錯。</string>\n    <string name=\"title_home\">主頁</string>\n    <string name=\"title_notifications\">通知設定</string>\n    <string name=\"title_public_local\">本站時間軸</string>\n    <string name=\"title_public_federated\">跨站公開時間軸</string>\n    <string name=\"title_direct_messages\">私信</string>\n    <string name=\"title_tab_preferences\">標籤頁</string>\n    <string name=\"title_view_thread\">嘟文</string>\n    <string name=\"title_posts\">嘟文</string>\n    <string name=\"title_posts_with_replies\">嘟文和回覆</string>\n    <string name=\"title_posts_pinned\">已置頂</string>\n    <string name=\"title_follows\">正在關注</string>\n    <string name=\"title_followers\">關注者</string>\n    <string name=\"title_favourites\">我的收藏</string>\n    <string name=\"title_mutes\">被靜音的使用者</string>\n    <string name=\"title_blocks\">被封鎖的使用者</string>\n    <string name=\"title_follow_requests\">關注請求</string>\n    <string name=\"title_edit_profile\">編輯個人資料</string>\n    <string name=\"title_drafts\">草稿</string>\n    <string name=\"title_licenses\">開源授權</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s 轉嘟了</string>\n    <string name=\"post_sensitive_media_title\">敏感內容</string>\n    <string name=\"post_media_hidden_title\">已隱藏的照片或影片</string>\n    <string name=\"post_sensitive_media_directions\">點一下顯示</string>\n    <string name=\"post_content_warning_show_more\">顯示更多</string>\n    <string name=\"post_content_warning_show_less\">摺疊內容</string>\n    <string name=\"post_content_show_more\">展開</string>\n    <string name=\"post_content_show_less\">摺疊</string>\n    <string name=\"message_empty\">沒有內容。</string>\n    <string name=\"footer_empty\">還沒有內容，向下拉動即可重新整理！</string>\n    <string name=\"notification_reblog_format\">%1$s 轉嘟了你的嘟文</string>\n    <string name=\"notification_favourite_format\">%1$s 把你的嘟文加入了最愛</string>\n    <string name=\"notification_follow_format\">%1$s 關注了你</string>\n    <string name=\"report_username_format\">檢舉使用者 @%1$s 的濫用行為</string>\n    <string name=\"report_comment_hint\">更多評論？</string>\n    <string name=\"action_quick_reply\">快速回覆</string>\n    <string name=\"action_reply\">回覆</string>\n    <string name=\"action_reblog\">轉嘟</string>\n    <string name=\"action_unreblog\">取消轉嘟</string>\n    <string name=\"action_favourite\">收藏</string>\n    <string name=\"action_unfavourite\">取消收藏</string>\n    <string name=\"action_more\">更多</string>\n    <string name=\"action_compose\">撰寫嘟文</string>\n    <string name=\"action_login\">登入 Mastodon 帳號</string>\n    <string name=\"action_logout\">登出</string>\n    <string name=\"action_logout_confirm\">確定要登出 %1$s 嗎？</string>\n    <string name=\"action_follow\">關注</string>\n    <string name=\"action_unfollow\">取消關注</string>\n    <string name=\"action_block\">封鎖</string>\n    <string name=\"action_unblock\">取消封鎖</string>\n    <string name=\"action_hide_reblogs\">隱藏轉嘟</string>\n    <string name=\"action_show_reblogs\">顯示轉嘟</string>\n    <string name=\"action_report\">檢舉</string>\n    <string name=\"action_delete\">刪除</string>\n    <string name=\"action_delete_and_redraft\">刪除並重新編輯</string>\n    <string name=\"action_send\">嘟嘟</string>\n    <string name=\"action_send_public\">嘟嘟！</string>\n    <string name=\"action_retry\">重試</string>\n    <string name=\"action_close\">關閉</string>\n    <string name=\"action_view_profile\">個人資料</string>\n    <string name=\"action_view_preferences\">設定</string>\n    <string name=\"action_view_account_preferences\">帳戶設定</string>\n    <string name=\"action_view_favourites\">我的收藏</string>\n    <string name=\"action_view_mutes\">被靜音的使用者</string>\n    <string name=\"action_view_blocks\">被封鎖的使用者</string>\n    <string name=\"action_view_follow_requests\">關注請求</string>\n    <string name=\"action_view_media\">媒體</string>\n    <string name=\"action_open_in_web\">在瀏覽器中開啟</string>\n    <string name=\"action_add_media\">從相簿中選擇</string>\n    <string name=\"action_photo_take\">拍照</string>\n    <string name=\"action_share\">分享</string>\n    <string name=\"action_mute\">靜音</string>\n    <string name=\"action_unmute\">取消靜音</string>\n    <string name=\"action_mention\">提及</string>\n    <string name=\"action_hide_media\">隱藏媒體檔案</string>\n    <string name=\"action_open_drawer\">打開應用抽屜</string>\n    <string name=\"action_save\">儲存</string>\n    <string name=\"action_edit_profile\">編輯個人資料</string>\n    <string name=\"action_edit_own_profile\">編輯</string>\n    <string name=\"action_undo\">復原</string>\n    <string name=\"action_accept\">接受</string>\n    <string name=\"action_reject\">拒絕</string>\n    <string name=\"action_search\">搜尋</string>\n    <string name=\"action_access_drafts\">草稿</string>\n    <string name=\"action_toggle_visibility\">設定嘟文可見範圍</string>\n    <string name=\"action_content_warning\">設定敏感內容警告</string>\n    <string name=\"action_emoji_keyboard\">插入表情符號</string>\n    <string name=\"action_add_tab\">新增標籤頁</string>\n    <string name=\"action_links\">連結</string>\n    <string name=\"action_mentions\">提及</string>\n    <string name=\"action_hashtags\">話題</string>\n    <string name=\"action_open_reblogger\">打開轉嘟用戶主頁</string>\n    <string name=\"action_open_reblogged_by\">顯示轉嘟</string>\n    <string name=\"action_open_faved_by\">顯示最愛</string>\n    <string name=\"title_hashtags_dialog\">話題</string>\n    <string name=\"title_mentions_dialog\">提及</string>\n    <string name=\"title_links_dialog\">連結</string>\n    <string name=\"action_open_media_n\">打開媒體 #%1$d</string>\n    <string name=\"download_image\">正在下載 %1$s</string>\n    <string name=\"action_copy_link\">複製連結</string>\n    <string name=\"action_open_as\">打開為 %1$s</string>\n    <string name=\"action_share_as\">分享為 …</string>\n    <string name=\"download_media\">下載媒體</string>\n    <string name=\"downloading_media\">正在下載媒體</string>\n    <string name=\"send_post_link_to\">分享連結到…</string>\n    <string name=\"send_post_content_to\">分享嘟文到…</string>\n    <string name=\"send_media_to\">分享媒體到…</string>\n    <string name=\"confirmation_reported\">已檢舉！</string>\n    <string name=\"confirmation_unblocked\">已解除封鎖</string>\n    <string name=\"confirmation_unmuted\">已解除靜音</string>\n    <string name=\"hint_domain\">哪一個域名？</string>\n    <string name=\"hint_compose\">有什麼新鮮事？</string>\n    <string name=\"hint_content_warning\">敏感內容警告</string>\n    <string name=\"hint_display_name\">暱稱</string>\n    <string name=\"hint_note\">簡介</string>\n    <string name=\"hint_search\">搜尋…</string>\n    <string name=\"search_no_results\">沒找到結果</string>\n    <string name=\"label_quick_reply\">回覆…</string>\n    <string name=\"label_avatar\">頭像</string>\n    <string name=\"label_header\">標題</string>\n    <string name=\"link_whats_an_instance\">什麼是站點？</string>\n    <string name=\"login_connection\">正在連線…</string>\n    <string name=\"dialog_whats_an_instance\">輸入你帳號所在的 Mastodon 站點的域名或地址，譬如 mastodon.social、icosahedron.website、social.tchncs.de 和 <a href=\"https://instances.social\">更多</a> \\u0020\n\\n \\u0020\n\\n如果你還沒有帳號，你可以輸入你想要加入的域名並在此建立新帳號。 \\u0020\n\\n \\u0020\n\\n一個站點是一個託管你的帳號的地方，但是你可以很容易的跟不同站台的人們交流，就像是在同一個站台一樣。 \\u0020\n\\n \\u0020\n\\n更多資訊可以在 <a href=\"https://joinmastodon.org\">joinmastodon.org</a> 查看。 </string>\n    <string name=\"dialog_title_finishing_media_upload\">正在完成上傳</string>\n    <string name=\"dialog_message_uploading_media\">正在上傳…</string>\n    <string name=\"dialog_download_image\">下載</string>\n    <string name=\"dialog_message_cancel_follow_request\">移除關注請求？</string>\n    <string name=\"dialog_unfollow_warning\">停止關注此使用者？</string>\n    <string name=\"dialog_delete_post_warning\">刪除這條嘟文？</string>\n    <string name=\"dialog_redraft_post_warning\">刪除並重新編輯這條嘟文？</string>\n    <string name=\"visibility_public\">公開：所有人可見，並會出現在公開時間軸上</string>\n    <string name=\"visibility_unlisted\">不公開：所有人可見，但不會出現在公開時間軸上</string>\n    <string name=\"visibility_private\">僅關注者：只有經過你確認後關注你的使用者可見</string>\n    <string name=\"visibility_direct\">私信：只有被提及的使用者可見</string>\n    <string name=\"pref_title_edit_notification_settings\">通知</string>\n    <string name=\"pref_title_notifications_enabled\">通知</string>\n    <string name=\"pref_title_notification_alerts\">提醒</string>\n    <string name=\"pref_title_notification_alert_sound\">通知鈴聲</string>\n    <string name=\"pref_title_notification_alert_vibrate\">振動</string>\n    <string name=\"pref_title_notification_alert_light\">呼吸燈</string>\n    <string name=\"pref_title_notification_filters\">事件</string>\n    <string name=\"pref_title_appearance_settings\">外觀</string>\n    <string name=\"pref_title_app_theme\">佈景主題</string>\n    <string name=\"pref_title_timelines\">時間軸</string>\n    <string name=\"pref_title_timeline_filters\">過濾器</string>\n    <string name=\"app_them_dark\">黑夜</string>\n    <string name=\"app_theme_light\">白天</string>\n    <string name=\"app_theme_black\">暗色</string>\n    <string name=\"app_theme_auto\">自動切換</string>\n    <string name=\"app_theme_system\">跟隨系統</string>\n    <string name=\"pref_title_browser_settings\">瀏覽器</string>\n    <string name=\"pref_title_custom_tabs\">使用 Chrome Custom Tabs</string>\n    <string name=\"pref_title_language\">語言</string>\n    <string name=\"pref_title_post_filter\">時間軸過濾</string>\n    <string name=\"pref_title_post_tabs\">標籤頁</string>\n    <string name=\"pref_title_show_boosts\">顯示轉嘟</string>\n    <string name=\"pref_title_show_replies\">顯示回覆</string>\n    <string name=\"pref_title_show_media_preview\">顯示預覽圖</string>\n    <string name=\"pref_title_proxy_settings\">代理伺服器</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP 代理伺服器</string>\n    <string name=\"pref_title_http_proxy_enable\">啟用 HTTP 代理伺服器</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP 代理伺服器</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP 代理伺服器埠</string>\n    <string name=\"pref_default_post_privacy\">嘟文預設可見範圍</string>\n    <string name=\"pref_default_media_sensitivity\">總是將媒體標示為敏感</string>\n    <string name=\"pref_publishing\">發佈（與伺服器同步）</string>\n    <string name=\"pref_failed_to_sync\">同步設定失敗</string>\n    <string name=\"post_privacy_public\">公開</string>\n    <string name=\"post_privacy_unlisted\">不公開</string>\n    <string name=\"post_privacy_followers_only\">僅關注者</string>\n    <string name=\"pref_post_text_size\">字體大小</string>\n    <string name=\"post_text_size_smallest\">最小</string>\n    <string name=\"post_text_size_small\">小</string>\n    <string name=\"post_text_size_medium\">標準</string>\n    <string name=\"post_text_size_large\">大</string>\n    <string name=\"post_text_size_largest\">最大</string>\n    <string name=\"notification_mention_name\">提及</string>\n    <string name=\"notification_mention_descriptions\">當有使用者在嘟文中提及我時</string>\n    <string name=\"notification_follow_name\">關注</string>\n    <string name=\"notification_follow_description\">當有使用者關注我時</string>\n    <string name=\"notification_boost_name\">轉嘟</string>\n    <string name=\"notification_boost_description\">當有使用者轉嘟了我的嘟文時</string>\n    <string name=\"notification_favourite_name\">收藏</string>\n    <string name=\"notification_favourite_description\">當有使用者把我的嘟文加入收藏時</string>\n    <string name=\"notification_poll_name\">投票</string>\n    <string name=\"notification_poll_description\">當我參與的投票結束時</string>\n    <string name=\"notification_mention_format\">%1$s 提及了你</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s 和 %4$d 人</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, 和 %3$s</string>\n    <string name=\"notification_summary_small\">%1$s 和 %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"other\">%1$d 個新互動</item>\n    </plurals>\n    <string name=\"description_account_locked\">鎖嘟用戶</string>\n    <string name=\"about_title_activity\">關於 Tusky</string>\n    <string name=\"about_tusky_license\">Tusky 是基於 GNU General Public License Version 3 許可證開源的自由軟體完整的許可證協議：https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">專案網站：\n\\n https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">問題回報：\n\\n https://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Tusky 官方帳號</string>\n    <string name=\"post_share_content\">分享嘟文內容</string>\n    <string name=\"post_share_link\">分享嘟文連結</string>\n    <string name=\"post_media_images\">照片</string>\n    <string name=\"post_media_video\">影片</string>\n    <string name=\"state_follow_requested\">已請求關注</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">%1$d 年內</string>\n    <string name=\"abbreviated_in_days\">%1$d 天內</string>\n    <string name=\"abbreviated_in_hours\">%1$d 小時內</string>\n    <string name=\"abbreviated_in_minutes\">%1$d 分鐘內</string>\n    <string name=\"abbreviated_in_seconds\">%1$d 秒內</string>\n    <string name=\"abbreviated_years_ago\">%1$d 年前</string>\n    <string name=\"abbreviated_days_ago\">%1$d 天前</string>\n    <string name=\"abbreviated_hours_ago\">%1$d 小時前</string>\n    <string name=\"abbreviated_minutes_ago\">%1$d 分鐘前</string>\n    <string name=\"abbreviated_seconds_ago\">%1$d 秒前</string>\n    <string name=\"follows_you\">關注了你</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">總是顯示所有敏感媒體內容</string>\n    <string name=\"title_media\">媒體</string>\n    <string name=\"replying_to\">回覆 @%1$s</string>\n    <string name=\"load_more_placeholder_text\">載入更多</string>\n    <string name=\"pref_title_public_filter_keywords\">公共時間軸</string>\n    <string name=\"pref_title_thread_filter_keywords\">對話</string>\n    <string name=\"filter_addition_title\">添加新的過濾器</string>\n    <string name=\"filter_edit_title\">編輯過濾器</string>\n    <string name=\"filter_dialog_remove_button\">移除</string>\n    <string name=\"filter_dialog_update_button\">更新</string>\n    <string name=\"filter_add_description\">需要過濾的文字</string>\n    <string name=\"add_account_name\">加入帳號</string>\n    <string name=\"add_account_description\">加入新的 Mastodon 帳號</string>\n    <string name=\"action_lists\">列表</string>\n    <string name=\"title_lists\">列表</string>\n    <string name=\"error_create_list\">無法新建列表</string>\n    <string name=\"error_rename_list\">無法重命名列表</string>\n    <string name=\"error_delete_list\">無法刪除列表</string>\n    <string name=\"action_create_list\">新建列表</string>\n    <string name=\"action_rename_list\">重命名列表</string>\n    <string name=\"action_delete_list\">刪除列表</string>\n    <string name=\"hint_search_people_list\">搜索已關注的用戶</string>\n    <string name=\"action_add_to_list\">添加用戶到列表</string>\n    <string name=\"action_remove_from_list\">從列表中移除用戶</string>\n    <string name=\"compose_active_account_description\">以 %1$s 發嘟文</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"other\">為視覺障礙用戶提供的描述\n\\n(限制 %1$d 字)</item>\n    </plurals>\n    <string name=\"action_set_caption\">設定圖片標題</string>\n    <string name=\"action_remove\">移除</string>\n    <string name=\"lock_account_label\">保護你的帳戶（鎖嘟）</string>\n    <string name=\"lock_account_label_description\">你需要手動審核所有關注請求</string>\n    <string name=\"compose_save_draft\">儲存為草稿？</string>\n    <string name=\"send_post_notification_title\">正在發送…</string>\n    <string name=\"send_post_notification_error_title\">發送失敗</string>\n    <string name=\"send_post_notification_channel_name\">嘟文發送中</string>\n    <string name=\"send_post_notification_cancel_title\">發送已被取消</string>\n    <string name=\"send_post_notification_saved_content\">嘟文已儲存為草稿</string>\n    <string name=\"action_compose_shortcut\">新嘟文</string>\n    <string name=\"error_no_custom_emojis\">當前站點 %1$s 沒有自訂表情符號</string>\n    <string name=\"emoji_style\">表情符號風格</string>\n    <string name=\"system_default\">系統預設</string>\n    <string name=\"download_fonts\">你需要先下載這些表情符號包</string>\n    <string name=\"performing_lookup_title\">正在查詢…</string>\n    <string name=\"expand_collapse_all_posts\">展開/摺疊所有嘟文</string>\n    <string name=\"action_open_post\">開啟嘟文</string>\n    <string name=\"restart_required\">需要重啟應用程式</string>\n    <string name=\"restart_emoji\">你需要重啟 Tusky 才能生效</string>\n    <string name=\"later\">稍後</string>\n    <string name=\"restart\">立即重啟</string>\n    <string name=\"caption_systememoji\">系統預設的表情符號包</string>\n    <string name=\"caption_blobmoji\">Android 4.4–7.1 的黃饅頭表情符號</string>\n    <string name=\"caption_twemoji\">Mastodon 使用的表情符號</string>\n    <!-- string name=\"emoji_shortcode_format\" translatable=\"false\">:%1$s:</string -->\n    <string name=\"download_failed\">下載失敗</string>\n    <string name=\"profile_badge_bot_text\">機器人</string>\n    <string name=\"account_moved_description\">%1$s 已遷移到：</string>\n    <string name=\"reblog_private\">轉嘟（可見者不變）</string>\n    <string name=\"unreblog_private\">取消轉嘟</string>\n    <string name=\"license_description\">Tusky 使用了以下開源專案的原始碼：</string>\n    <string name=\"license_apache_2\">以 Apache License 授權（詳見下方）</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">個人資料附加資訊</string>\n    <string name=\"profile_metadata_add\">新增資訊</string>\n    <string name=\"profile_metadata_label_label\">標籤</string>\n    <string name=\"profile_metadata_content_label\">內容</string>\n    <string name=\"pref_title_absolute_time\">嘟文顯示精確時間</string>\n    <string name=\"label_remote_account\">以下資訊可能並不完整，要檢視完整資料請使用瀏覽器開啟。</string>\n    <string name=\"unpin_action\">取消置頂</string>\n    <string name=\"pin_action\">置頂</string>\n    <plurals name=\"favs\">\n        <item quantity=\"other\"><b>%1$s</b> 次收藏</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"other\"><b>%1$s</b> 次轉嘟</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">轉嘟由</string>\n    <string name=\"title_favourited_by\">收藏由</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s 和 %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s 和 %3$d 等人</string>\n    <string name=\"description_post_media\">媒體: %1$s</string>\n    <string name=\"description_post_cw\">內容提醒: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">沒有媒體描述信息</string>\n    <string name=\"description_post_reblogged\">被轉嘟</string>\n    <string name=\"description_post_favourited\">被收藏</string>\n    <string name=\"description_visibility_public\">公開</string>\n    <string name=\"description_visibility_unlisted\">不公開</string>\n    <string name=\"description_visibility_private\">僅關注者</string>\n    <string name=\"description_visibility_direct\">私信</string>\n    <string name=\"hint_list_name\">列表名</string>\n    <string name=\"pick_hashtag_hint\">話題名（不含前面的 # 號）</string>\n    <string name=\"notifications_clear\">清空</string>\n    <string name=\"notifications_apply_filter\">分類</string>\n    <string name=\"filter_apply\">應用</string>\n    <string name=\"compose_shortcut_long_label\">發表新嘟文</string>\n    <string name=\"compose_shortcut_short_label\">新嘟文</string>\n    <string name=\"pref_title_bot_overlay\">顯示機器人標誌</string>\n    <string name=\"notification_clear_text\">你確定要永久清空通知列表嗎？</string>\n    <string name=\"poll_info_format\"> \\u0020<!-- 15 votes • 1 hour left --> \\u0020%1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"other\">%1$s 次投票</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">%1$s 結束</string>\n    <string name=\"poll_info_closed\">已結束</string>\n    <string name=\"poll_vote\">投票</string>\n    <string name=\"poll_ended_voted\">你參與的投票已結束</string>\n    <string name=\"poll_ended_created\">你創建的投票已結束</string>\n    <!--These are for timestamps on polls -->\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"other\">剩餘 %1$d 天</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"other\">剩餘 %1$d 小時</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"other\">剩餘 %1$d 分鐘</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"other\">剩餘 %1$d 秒</item>\n    </plurals>\n    <string name=\"edit_poll\">編輯</string>\n    <string name=\"hashtags\">話題</string>\n    <string name=\"notification_follow_request_name\">關注請求</string>\n    <string name=\"action_edit\">編輯</string>\n    <string name=\"pref_title_animate_custom_emojis\">動態自訂表情符號</string>\n    <string name=\"pref_title_gradient_for_media\">在隱藏的媒體上使用漸變色彩</string>\n    <string name=\"pref_title_animate_gif_avatars\">動態 GIF 頭像</string>\n    <string name=\"dialog_mute_hide_notifications\">隱藏通知</string>\n    <string name=\"dialog_mute_warning\">靜音 @%1$s？</string>\n    <string name=\"dialog_block_warning\">封鎖 @%1$s？</string>\n    <string name=\"mute_domain_warning_dialog_ok\">隱藏整個網域</string>\n    <string name=\"mute_domain_warning\">確定要封鎖 %1$s 所有內容？你將不會在任何公開時間軸或是通知中看到來自這個網域的內容。你的關注者若來自這個網域則將會被移除。</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s 已解除隱藏</string>\n    <string name=\"action_reset_schedule\">重設</string>\n    <string name=\"action_schedule_post\">排程嘟文</string>\n    <string name=\"action_access_scheduled_posts\">排程的嘟文</string>\n    <string name=\"action_unmute_conversation\">取消靜音對話</string>\n    <string name=\"action_mute_conversation\">靜音對話</string>\n    <string name=\"action_unmute_domain\">取消靜音 %1$s</string>\n    <string name=\"action_mute_domain\">靜音 %1$s</string>\n    <string name=\"action_unmute_desc\">取消靜音 %1$s</string>\n    <string name=\"action_add_poll\">新增投票</string>\n    <string name=\"action_view_domain_mutes\">被隱藏的網域</string>\n    <string name=\"description_post_bookmarked\">被加入書籤</string>\n    <string name=\"action_view_bookmarks\">我的書籤</string>\n    <string name=\"action_bookmark\">書籤</string>\n    <string name=\"title_bookmarks\">我的書籤</string>\n    <string name=\"notification_subscription_format\">%1$s 剛剛發了新嘟文</string>\n    <string name=\"notification_follow_request_format\">%1$s 希望可以關注你</string>\n    <string name=\"title_announcements\">公告</string>\n    <string name=\"title_scheduled_posts\">已排程的嘟文</string>\n    <string name=\"title_domain_mutes\">被隱藏的網域</string>\n    <string name=\"filter_dialog_whole_word\">完整字詞</string>\n    <string name=\"drafts_post_reply_removed\">你的草稿欲回覆的原嘟文已被刪除</string>\n    <string name=\"draft_deleted\">草稿已刪除</string>\n    <string name=\"drafts_failed_loading_reply\">載入回覆資訊失敗</string>\n    <string name=\"drafts_post_failed_to_send\">這條嘟文發送失敗！</string>\n    <string name=\"dialog_delete_list_warning\">你確定要刪除列表 %1$s？</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"other\">你無法上傳超過 %1$d 媒體附件。</item>\n    </plurals>\n    <string name=\"account_note_saved\">已儲存！</string>\n    <string name=\"account_note_hint\">你對此帳號的個人註記</string>\n    <string name=\"pref_title_hide_top_toolbar\">隱藏頂端工具列的標題</string>\n    <string name=\"pref_title_confirm_reblogs\">在轉嘟時提示確認</string>\n    <string name=\"pref_title_show_cards_in_timelines\">在時間軸中顯示連結預覽</string>\n    <string name=\"warning_scheduling_interval\">Mastodon 的最短發文間隔限制為 5 分鐘。</string>\n    <string name=\"no_announcements\">沒有公告。</string>\n    <string name=\"no_scheduled_posts\">你沒有任何已排程的嘟文。</string>\n    <string name=\"no_drafts\">你沒有任何草稿。</string>\n    <string name=\"post_lookup_error_format\">尋找嘟文時發生錯誤 %1$s</string>\n    <string name=\"poll_new_choice_hint\">選項 %1$d</string>\n    <string name=\"poll_allow_multiple_choices\">多個選項</string>\n    <string name=\"add_poll_choice\">新增選項</string>\n    <string name=\"duration_7_days\">7 天</string>\n    <string name=\"duration_3_days\">3 天</string>\n    <string name=\"duration_1_day\">1 天</string>\n    <string name=\"duration_6_hours\">6 小時</string>\n    <string name=\"duration_1_hour\">1 小時</string>\n    <string name=\"duration_30_min\">30 分鐘</string>\n    <string name=\"duration_5_min\">5 分鐘</string>\n    <string name=\"duration_indefinite\">無限期</string>\n    <string name=\"label_duration\">期間</string>\n    <string name=\"create_poll_title\">投票</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">啟用在分頁間切換的滑動手勢</string>\n    <string name=\"failed_search\">搜尋失敗</string>\n    <string name=\"title_accounts\">帳號</string>\n    <string name=\"failed_fetch_posts\">擷取狀態失敗</string>\n    <string name=\"failed_report\">回報失敗</string>\n    <string name=\"report_remote_instance\">轉送至 %1$s</string>\n    <string name=\"hint_additional_info\">額外的評論</string>\n    <string name=\"report_sent_success\">成功回報 @%1$s</string>\n    <string name=\"button_done\">完成</string>\n    <string name=\"button_back\">返回</string>\n    <string name=\"button_continue\">繼續</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"other\">%1$s 人</item>\n    </plurals>\n    <string name=\"list\">列表</string>\n    <string name=\"select_list_title\">選擇列表</string>\n    <string name=\"add_hashtag_title\">加上話題標籤</string>\n    <string name=\"description_poll\">投票選項： %1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"caption_notoemoji\">Google 目前的表情符號包</string>\n    <string name=\"pref_title_alway_open_spoiler\">總是顯示被標注為內容警告的嘟文</string>\n    <string name=\"post_media_attachments\">附件</string>\n    <string name=\"post_media_audio\">錄音</string>\n    <string name=\"about_powered_by_tusky\">由 Tusky 提供</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"notification_subscription_description\">當你關注的人發布新嘟文時通知</string>\n    <string name=\"notification_subscription_name\">新嘟文</string>\n    <string name=\"notification_follow_request_description\">關注請求的通知</string>\n    <string name=\"pref_main_nav_position_option_bottom\">底端</string>\n    <string name=\"pref_main_nav_position_option_top\">頂端</string>\n    <string name=\"pref_main_nav_position\">主要導覽列的位置</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-zh-rMO/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">應用程式出現異常</string>\n    <string name=\"error_network\">網絡請求出錯，請檢查互聯網連接並重試</string>\n    <string name=\"error_empty\">內容不能為空</string>\n    <string name=\"error_invalid_domain\">該域名無效</string>\n    <string name=\"error_failed_app_registration\">無法連接此伺服器</string>\n    <string name=\"error_no_web_browser_found\">沒有可用的瀏覽器</string>\n    <string name=\"error_authorization_unknown\">認證過程出現未知錯誤</string>\n    <string name=\"error_authorization_denied\">授權被拒絕</string>\n    <string name=\"error_retrieving_oauth_token\">無法獲取登入資訊</string>\n    <string name=\"error_compose_character_limit\">嘟文太長了！</string>\n    <string name=\"error_media_upload_type\">無法上傳此類型的檔案</string>\n    <string name=\"error_media_upload_opening\">此檔案無法開啟</string>\n    <string name=\"error_media_upload_permission\">需要授予 Tusky 讀取媒體檔案的權限</string>\n    <string name=\"error_media_download_permission\">需要授予 Tusky 寫入儲存空間的權限</string>\n    <string name=\"error_media_upload_image_or_video\">無法在嘟文中同時插入影片和圖片</string>\n    <string name=\"error_media_upload_sending\">媒體檔案上傳失敗</string>\n    <string name=\"error_sender_account_gone\">嘟文發送時出錯</string>\n    <string name=\"title_home\">主頁</string>\n    <string name=\"title_notifications\">通知</string>\n    <string name=\"title_public_local\">本站時間軸</string>\n    <string name=\"title_public_federated\">跨站公開時間軸</string>\n    <string name=\"title_direct_messages\">私信</string>\n    <string name=\"title_tab_preferences\">標籤頁</string>\n    <string name=\"title_view_thread\">嘟文</string>\n    <string name=\"title_posts\">嘟文</string>\n    <string name=\"title_posts_with_replies\">嘟文和回覆</string>\n    <string name=\"title_posts_pinned\">已置頂</string>\n    <string name=\"title_follows\">正在關注</string>\n    <string name=\"title_followers\">關注者</string>\n    <string name=\"title_favourites\">我的收藏</string>\n    <string name=\"title_mutes\">被靜音的使用者</string>\n    <string name=\"title_blocks\">被封鎖的使用者</string>\n    <string name=\"title_follow_requests\">關注請求</string>\n    <string name=\"title_edit_profile\">編輯個人資料</string>\n    <string name=\"title_drafts\">草稿</string>\n    <string name=\"title_licenses\">開源授權</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s 轉嘟了</string>\n    <string name=\"post_sensitive_media_title\">敏感內容</string>\n    <string name=\"post_media_hidden_title\">已隱藏的照片或影片</string>\n    <string name=\"post_sensitive_media_directions\">點一下顯示</string>\n    <string name=\"post_content_warning_show_more\">顯示更多</string>\n    <string name=\"post_content_warning_show_less\">摺疊內容</string>\n    <string name=\"post_content_show_more\">展開</string>\n    <string name=\"post_content_show_less\">摺疊</string>\n    <string name=\"message_empty\">沒有內容</string>\n    <string name=\"footer_empty\">還沒有內容，向下拉動即可重新整理</string>\n    <string name=\"notification_reblog_format\">%1$s 轉嘟了你的嘟文</string>\n    <string name=\"notification_favourite_format\">%1$s 收藏了你的嘟文</string>\n    <string name=\"notification_follow_format\">%1$s 關注了你</string>\n    <string name=\"report_username_format\">檢舉使用者 @%1$s 的濫用行為</string>\n    <string name=\"report_comment_hint\">更多評論？</string>\n    <string name=\"action_quick_reply\">快速回覆</string>\n    <string name=\"action_reply\">回覆</string>\n    <string name=\"action_reblog\">轉嘟</string>\n    <string name=\"action_unreblog\">取消轉嘟</string>\n    <string name=\"action_favourite\">收藏</string>\n    <string name=\"action_unfavourite\">取消收藏</string>\n    <string name=\"action_more\">更多</string>\n    <string name=\"action_compose\">新嘟文</string>\n    <string name=\"action_login\">登入 Mastodon 帳號</string>\n    <string name=\"action_logout\">登出</string>\n    <string name=\"action_logout_confirm\">確定要登出 %1$s 嗎？</string>\n    <string name=\"action_follow\">關注</string>\n    <string name=\"action_unfollow\">取消關注</string>\n    <string name=\"action_block\">封鎖</string>\n    <string name=\"action_unblock\">取消封鎖</string>\n    <string name=\"action_hide_reblogs\">隱藏轉嘟</string>\n    <string name=\"action_show_reblogs\">顯示轉嘟</string>\n    <string name=\"action_report\">檢舉</string>\n    <string name=\"action_delete\">刪除</string>\n    <string name=\"action_delete_and_redraft\">刪除並重新編輯</string>\n    <string name=\"action_send\">嘟嘟</string>\n    <string name=\"action_send_public\">嘟嘟！</string>\n    <string name=\"action_retry\">重試</string>\n    <string name=\"action_close\">關閉</string>\n    <string name=\"action_view_profile\">個人資料</string>\n    <string name=\"action_view_preferences\">設定</string>\n    <string name=\"action_view_account_preferences\">帳戶設定</string>\n    <string name=\"action_view_favourites\">我的收藏</string>\n    <string name=\"action_view_mutes\">被靜音的使用者</string>\n    <string name=\"action_view_blocks\">被封鎖的使用者</string>\n    <string name=\"action_view_follow_requests\">關注請求</string>\n    <string name=\"action_view_media\">媒體</string>\n    <string name=\"action_open_in_web\">在瀏覽器中開啟</string>\n    <string name=\"action_add_media\">從相簿中選擇</string>\n    <string name=\"action_photo_take\">拍照</string>\n    <string name=\"action_share\">分享</string>\n    <string name=\"action_mute\">靜音</string>\n    <string name=\"action_unmute\">取消靜音</string>\n    <string name=\"action_mention\">提及</string>\n    <string name=\"action_hide_media\">隱藏媒體檔案</string>\n    <string name=\"action_open_drawer\">打開應用抽屜</string>\n    <string name=\"action_save\">儲存</string>\n    <string name=\"action_edit_profile\">編輯個人資料</string>\n    <string name=\"action_edit_own_profile\">編輯</string>\n    <string name=\"action_undo\">復原</string>\n    <string name=\"action_accept\">接受</string>\n    <string name=\"action_reject\">拒絕</string>\n    <string name=\"action_search\">搜尋</string>\n    <string name=\"action_access_drafts\">草稿</string>\n    <string name=\"action_toggle_visibility\">設定嘟文可見範圍</string>\n    <string name=\"action_content_warning\">敏感內容警告</string>\n    <string name=\"action_emoji_keyboard\">插入表情符號</string>\n    <string name=\"action_add_tab\">新增標籤頁</string>\n    <string name=\"action_links\">連結</string>\n    <string name=\"action_mentions\">提及</string>\n    <string name=\"action_hashtags\">話題</string>\n    <string name=\"action_open_reblogger\">打開轉嘟用戶主頁</string>\n    <string name=\"action_open_reblogged_by\">顯示轉嘟</string>\n    <string name=\"action_open_faved_by\">顯示收藏</string>\n    <string name=\"title_hashtags_dialog\">話題</string>\n    <string name=\"title_mentions_dialog\">提及</string>\n    <string name=\"title_links_dialog\">連結</string>\n    <string name=\"action_open_media_n\">打開媒體 #%1$d</string>\n    <string name=\"download_image\">正在下載 %1$s…</string>\n    <string name=\"action_copy_link\">複製連結</string>\n    <string name=\"action_open_as\">打開為 %1$s</string>\n    <string name=\"action_share_as\">分享為 …</string>\n    <string name=\"download_media\">下載媒體</string>\n    <string name=\"downloading_media\">正在下載媒體</string>\n    <string name=\"send_post_link_to\">分享連結到…</string>\n    <string name=\"send_post_content_to\">分享嘟文到…</string>\n    <string name=\"send_media_to\">分享媒體到…</string>\n    <string name=\"confirmation_reported\">已發送！</string>\n    <string name=\"confirmation_unblocked\">已解除封鎖</string>\n    <string name=\"confirmation_unmuted\">已解除靜音</string>\n    <string name=\"hint_domain\">域名</string>\n    <string name=\"hint_compose\">有什麼新鮮事？</string>\n    <string name=\"hint_content_warning\">敏感內容警告</string>\n    <string name=\"hint_display_name\">暱稱</string>\n    <string name=\"hint_note\">簡介</string>\n    <string name=\"hint_search\">搜尋…</string>\n    <string name=\"search_no_results\">沒找到結果</string>\n    <string name=\"label_quick_reply\">回覆…</string>\n    <string name=\"label_avatar\">頭像</string>\n    <string name=\"label_header\">標題</string>\n    <string name=\"link_whats_an_instance\">什麼是站點？</string>\n    <string name=\"login_connection\">正在連線…</string>\n    <string name=\"dialog_whats_an_instance\">請輸入你帳號所在的 Mastodon 站點的域名或地址</string>\n    <string name=\"dialog_title_finishing_media_upload\">正在完成上傳…</string>\n    <string name=\"dialog_message_uploading_media\">正在上傳…</string>\n    <string name=\"dialog_download_image\">下載</string>\n    <string name=\"dialog_message_cancel_follow_request\">移除關注請求？</string>\n    <string name=\"dialog_unfollow_warning\">停止關注此使用者？</string>\n    <string name=\"dialog_delete_post_warning\">刪除這條嘟文？</string>\n    <string name=\"dialog_redraft_post_warning\">刪除並重新編輯這條嘟文？</string>\n    <string name=\"visibility_public\">公開：所有人可見，並會出現在公開時間軸上</string>\n    <string name=\"visibility_unlisted\">不公開：所有人可見，但不會出現在公開時間軸上</string>\n    <string name=\"visibility_private\">僅關注者：只有經過你確認後關注你的使用者可見</string>\n    <string name=\"visibility_direct\">私信：只有被提及的使用者可見</string>\n    <string name=\"pref_title_edit_notification_settings\">通知</string>\n    <string name=\"pref_title_notifications_enabled\">通知</string>\n    <string name=\"pref_title_notification_alerts\">提醒</string>\n    <string name=\"pref_title_notification_alert_sound\">通知鈴聲</string>\n    <string name=\"pref_title_notification_alert_vibrate\">振動</string>\n    <string name=\"pref_title_notification_alert_light\">呼吸燈</string>\n    <string name=\"pref_title_notification_filters\">事件</string>\n    <string name=\"pref_title_appearance_settings\">外觀</string>\n    <string name=\"pref_title_app_theme\">佈景主題</string>\n    <string name=\"pref_title_timelines\">時間軸</string>\n    <string name=\"pref_title_timeline_filters\">過濾器</string>\n    <string name=\"app_them_dark\">黑夜</string>\n    <string name=\"app_theme_light\">白天</string>\n    <string name=\"app_theme_black\">暗色</string>\n    <string name=\"app_theme_auto\">自動切換</string>\n    <string name=\"app_theme_system\">跟隨系統</string>\n    <string name=\"pref_title_browser_settings\">瀏覽器</string>\n    <string name=\"pref_title_custom_tabs\">使用 Chrome Custom Tabs</string>\n    <string name=\"pref_title_language\">語言</string>\n    <string name=\"pref_title_post_filter\">時間軸過濾</string>\n    <string name=\"pref_title_post_tabs\">標籤頁</string>\n    <string name=\"pref_title_show_boosts\">顯示轉嘟</string>\n    <string name=\"pref_title_show_replies\">顯示回覆</string>\n    <string name=\"pref_title_show_media_preview\">顯示預覽圖</string>\n    <string name=\"pref_title_proxy_settings\">代理伺服器</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP 代理伺服器</string>\n    <string name=\"pref_title_http_proxy_enable\">啟用 HTTP 代理伺服器</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP 代理伺服器</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP 代理伺服器埠</string>\n    <string name=\"pref_default_post_privacy\">嘟文預設可見範圍</string>\n    <string name=\"pref_default_media_sensitivity\">總是將媒體標示為敏感</string>\n    <string name=\"pref_publishing\">發佈（與伺服器同步）</string>\n    <string name=\"pref_failed_to_sync\">同步設定失敗</string>\n    <string name=\"post_privacy_public\">公開</string>\n    <string name=\"post_privacy_unlisted\">不公開</string>\n    <string name=\"post_privacy_followers_only\">僅關注者</string>\n    <string name=\"pref_post_text_size\">字體大小</string>\n    <string name=\"post_text_size_smallest\">最小</string>\n    <string name=\"post_text_size_small\">小</string>\n    <string name=\"post_text_size_medium\">標準</string>\n    <string name=\"post_text_size_large\">大</string>\n    <string name=\"post_text_size_largest\">最大</string>\n    <string name=\"notification_mention_name\">提及</string>\n    <string name=\"notification_mention_descriptions\">當有使用者在嘟文中提及我時</string>\n    <string name=\"notification_follow_name\">關注</string>\n    <string name=\"notification_follow_description\">當有使用者關注我時</string>\n    <string name=\"notification_boost_name\">轉嘟</string>\n    <string name=\"notification_boost_description\">當有使用者轉嘟了我的嘟文時</string>\n    <string name=\"notification_favourite_name\">收藏</string>\n    <string name=\"notification_favourite_description\">當有使用者收藏了我的嘟文時</string>\n    <string name=\"notification_poll_name\">投票</string>\n    <string name=\"notification_poll_description\">當我參與的投票結束時</string>\n    <string name=\"notification_mention_format\">%1$s 提及了你</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s 和 %4$d 人</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, 和 %3$s</string>\n    <string name=\"notification_summary_small\">%1$s 和 %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"other\">%1$d 個新互動</item>\n    </plurals>\n    <string name=\"description_account_locked\">鎖嘟用戶</string>\n    <string name=\"about_title_activity\">關於 Tusky</string>\n    <string name=\"about_tusky_license\">Tusky 是基於 GNU General Public License Version 3 許可證開源的自由軟體完整的許可證協議：https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">專案網站：\n\\n https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">問題回報：\n\\n https://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Tusky 官方帳號</string>\n    <string name=\"post_share_content\">分享嘟文內容</string>\n    <string name=\"post_share_link\">分享嘟文連結</string>\n    <string name=\"post_media_images\">照片</string>\n    <string name=\"post_media_video\">影片</string>\n    <string name=\"state_follow_requested\">已請求關注</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">%1$d 年內</string>\n    <string name=\"abbreviated_in_days\">%1$d 天內</string>\n    <string name=\"abbreviated_in_hours\">%1$d 小時內</string>\n    <string name=\"abbreviated_in_minutes\">%1$d 分鐘內</string>\n    <string name=\"abbreviated_in_seconds\">%1$d 秒內</string>\n    <string name=\"abbreviated_years_ago\">%1$d 年前</string>\n    <string name=\"abbreviated_days_ago\">%1$d 天前</string>\n    <string name=\"abbreviated_hours_ago\">%1$d 小時前</string>\n    <string name=\"abbreviated_minutes_ago\">%1$d 分鐘前</string>\n    <string name=\"abbreviated_seconds_ago\">%1$d 秒前</string>\n    <string name=\"follows_you\">關注了你</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">總是顯示所有敏感媒體內容</string>\n    <string name=\"title_media\">媒體</string>\n    <string name=\"replying_to\">回覆 @%1$s</string>\n    <string name=\"load_more_placeholder_text\">載入更多</string>\n    <string name=\"pref_title_public_filter_keywords\">公共時間軸</string>\n    <string name=\"pref_title_thread_filter_keywords\">對話</string>\n    <string name=\"filter_addition_title\">添加新的過濾器</string>\n    <string name=\"filter_edit_title\">編輯過濾器</string>\n    <string name=\"filter_dialog_remove_button\">移除</string>\n    <string name=\"filter_dialog_update_button\">更新</string>\n    <string name=\"filter_add_description\">需要過濾的文字</string>\n    <string name=\"add_account_name\">加入帳號</string>\n    <string name=\"add_account_description\">加入新的 Mastodon 帳號</string>\n    <string name=\"action_lists\">列表</string>\n    <string name=\"title_lists\">列表</string>\n    <string name=\"error_create_list\">無法新建列表</string>\n    <string name=\"error_rename_list\">無法重命名列表</string>\n    <string name=\"error_delete_list\">無法刪除列表</string>\n    <string name=\"action_create_list\">新建列表</string>\n    <string name=\"action_rename_list\">重命名列表</string>\n    <string name=\"action_delete_list\">刪除列表</string>\n    <string name=\"hint_search_people_list\">搜索已關注的用戶</string>\n    <string name=\"action_add_to_list\">添加用戶到列表</string>\n    <string name=\"action_remove_from_list\">從列表中移除用戶</string>\n    <string name=\"compose_active_account_description\">以 %1$s 發嘟文</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"other\">為視覺障礙用戶提供的描述\n\\n(限制 %1$d 字)</item>\n    </plurals>\n    <string name=\"action_set_caption\">設定圖片標題</string>\n    <string name=\"action_remove\">移除</string>\n    <string name=\"lock_account_label\">保護你的帳戶（鎖嘟）</string>\n    <string name=\"lock_account_label_description\">你需要手動審核所有關注請求</string>\n    <string name=\"compose_save_draft\">儲存為草稿？</string>\n    <string name=\"send_post_notification_title\">正在發送…</string>\n    <string name=\"send_post_notification_error_title\">發送失敗</string>\n    <string name=\"send_post_notification_channel_name\">嘟文發送中</string>\n    <string name=\"send_post_notification_cancel_title\">發送已被取消</string>\n    <string name=\"send_post_notification_saved_content\">嘟文已儲存為草稿</string>\n    <string name=\"action_compose_shortcut\">發表新嘟文</string>\n    <string name=\"error_no_custom_emojis\">當前站點 %1$s 沒有自訂表情符號</string>\n    <string name=\"emoji_style\">表情符號風格</string>\n    <string name=\"system_default\">系統預設</string>\n    <string name=\"download_fonts\">你需要先下載這些表情符號包</string>\n    <string name=\"performing_lookup_title\">正在查詢…</string>\n    <string name=\"expand_collapse_all_posts\">展開/摺疊所有嘟文</string>\n    <string name=\"action_open_post\">開啟嘟文</string>\n    <string name=\"restart_required\">需要重啟應用程式</string>\n    <string name=\"restart_emoji\">你需要重啟 Tusky 才能生效</string>\n    <string name=\"later\">稍後</string>\n    <string name=\"restart\">立即重啟</string>\n    <string name=\"caption_systememoji\">系統預設的表情符號包</string>\n    <string name=\"caption_blobmoji\">Android 4.4–7.1 的黃饅頭表情符號</string>\n    <string name=\"caption_twemoji\">Mastodon 使用的表情符號</string>\n    <!-- string name=\"emoji_shortcode_format\" translatable=\"false\">:%1$s:</string -->\n    <string name=\"download_failed\">下載失敗</string>\n    <string name=\"profile_badge_bot_text\">機器人</string>\n    <string name=\"account_moved_description\">%1$s 已遷移到：</string>\n    <string name=\"reblog_private\">轉嘟（可見者不變）</string>\n    <string name=\"unreblog_private\">取消轉嘟</string>\n    <string name=\"license_description\">Tusky 使用了以下開源專案的原始碼：</string>\n    <string name=\"license_apache_2\">以 Apache License 授權（詳見下方）</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">個人資料附加資訊</string>\n    <string name=\"profile_metadata_add\">新增資訊</string>\n    <string name=\"profile_metadata_label_label\">標籤</string>\n    <string name=\"profile_metadata_content_label\">內容</string>\n    <string name=\"pref_title_absolute_time\">嘟文顯示精確時間</string>\n    <string name=\"label_remote_account\">以下資訊可能並不完整，要檢視完整資料請使用瀏覽器開啟</string>\n    <string name=\"unpin_action\">取消置頂</string>\n    <string name=\"pin_action\">置頂</string>\n    <plurals name=\"favs\">\n        <item quantity=\"other\"><b>%1$s</b> 次收藏</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"other\"><b>%1$s</b> 次轉嘟</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">轉嘟</string>\n    <string name=\"title_favourited_by\">收藏</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s 和 %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s 和 %3$d 等人</string>\n    <string name=\"description_post_media\">媒體: %1$s</string>\n    <string name=\"description_post_cw\">內容提醒: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">沒有媒體描述信息</string>\n    <string name=\"description_post_reblogged\">被轉嘟</string>\n    <string name=\"description_post_favourited\">被收藏</string>\n    <string name=\"description_visibility_public\">公開</string>\n    <string name=\"description_visibility_unlisted\">不公開</string>\n    <string name=\"description_visibility_private\">關注者</string>\n    <string name=\"description_visibility_direct\">私信</string>\n    <string name=\"hint_list_name\">列表名</string>\n    <string name=\"pick_hashtag_hint\">話題名（不含前面的 # 號）</string>\n    <string name=\"notifications_clear\">清空</string>\n    <string name=\"notifications_apply_filter\">分類</string>\n    <string name=\"filter_apply\">應用</string>\n    <string name=\"compose_shortcut_long_label\">發表新嘟文</string>\n    <string name=\"compose_shortcut_short_label\">發表新嘟文</string>\n    <string name=\"pref_title_bot_overlay\">顯示機器人標誌</string>\n    <string name=\"notification_clear_text\">你確定要永久清空通知列表嗎？</string>\n    <string name=\"poll_info_format\"> \\u0020<!-- 15 votes • 1 hour left --> \\u0020%1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"other\">%1$s 次投票</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">%1$s 結束</string>\n    <string name=\"poll_info_closed\">已結束</string>\n    <string name=\"poll_vote\">投票</string>\n    <string name=\"poll_ended_voted\">你參與的投票已結束</string>\n    <string name=\"poll_ended_created\">你創建的投票已結束</string>\n    <!--These are for timestamps on polls -->\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"other\">剩餘 %1$d 天</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"other\">剩餘 %1$d 小時</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"other\">剩餘 %1$d 分鐘</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"other\">剩餘 %1$d 秒</item>\n    </plurals>\n    <string name=\"notification_follow_request_name\">關注請求</string>\n    <string name=\"hashtags\">話題</string>\n    <string name=\"edit_poll\">編輯</string>\n    <string name=\"action_edit\">編輯</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-zh-rSG/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">应用程序出现异常</string>\n    <string name=\"error_network\">网络请求出错，请检查互联网连接并重试</string>\n    <string name=\"error_empty\">内容不能为空</string>\n    <string name=\"error_invalid_domain\">该域名无效</string>\n    <string name=\"error_failed_app_registration\">无法连接此服务器</string>\n    <string name=\"error_no_web_browser_found\">没有可用的浏览器</string>\n    <string name=\"error_authorization_unknown\">认证过程出现未知错误</string>\n    <string name=\"error_authorization_denied\">授权被拒绝</string>\n    <string name=\"error_retrieving_oauth_token\">无法获取登录信息</string>\n    <string name=\"error_compose_character_limit\">嘟文太长了！</string>\n    <string name=\"error_media_upload_type\">无法上传此类型的文件</string>\n    <string name=\"error_media_upload_opening\">此文件无法打开</string>\n    <string name=\"error_media_upload_permission\">需要授予 Tusky 读取媒体文件的权限</string>\n    <string name=\"error_media_download_permission\">需要授予 Tusky 写入存储空间的权限</string>\n    <string name=\"error_media_upload_image_or_video\">无法在嘟文中同时插入视频和图片</string>\n    <string name=\"error_media_upload_sending\">媒体文件上传失败</string>\n    <string name=\"error_sender_account_gone\">嘟文发送时出错</string>\n    <string name=\"title_home\">主页</string>\n    <string name=\"title_notifications\">通知</string>\n    <string name=\"title_public_local\">本站时间轴</string>\n    <string name=\"title_public_federated\">跨站公共时间轴</string>\n    <string name=\"title_direct_messages\">私信</string>\n    <string name=\"title_tab_preferences\">标签页</string>\n    <string name=\"title_view_thread\">嘟文</string>\n    <string name=\"title_posts\">嘟文</string>\n    <string name=\"title_posts_with_replies\">嘟文和回复</string>\n    <string name=\"title_posts_pinned\">已置顶</string>\n    <string name=\"title_follows\">正在关注</string>\n    <string name=\"title_followers\">关注者</string>\n    <string name=\"title_favourites\">喜欢</string>\n    <string name=\"title_mutes\">被隐藏的用户</string>\n    <string name=\"title_blocks\">被屏蔽的用户</string>\n    <string name=\"title_follow_requests\">关注请求</string>\n    <string name=\"title_edit_profile\">编辑个人资料</string>\n    <string name=\"title_drafts\">草稿</string>\n    <string name=\"title_licenses\">开源协议</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s 转嘟了</string>\n    <string name=\"post_sensitive_media_title\">敏感内容</string>\n    <string name=\"post_media_hidden_title\">已隐藏的照片或视频</string>\n    <string name=\"post_sensitive_media_directions\">点击显示</string>\n    <string name=\"post_content_warning_show_more\">显示更多</string>\n    <string name=\"post_content_warning_show_less\">折叠内容</string>\n    <string name=\"post_content_show_more\">展开</string>\n    <string name=\"post_content_show_less\">折叠</string>\n    <string name=\"message_empty\">还没有内容</string>\n    <string name=\"footer_empty\">还没有内容，向下拉动即可刷新</string>\n    <string name=\"notification_reblog_format\">%1$s 转嘟了你的嘟文</string>\n    <string name=\"notification_favourite_format\">%1$s 喜欢了你的嘟文</string>\n    <string name=\"notification_follow_format\">%1$s 关注了你</string>\n    <string name=\"report_username_format\">报告用户 @%1$s 的滥用行为</string>\n    <string name=\"report_comment_hint\">报告更多信息</string>\n    <string name=\"action_quick_reply\">快速回复</string>\n    <string name=\"action_reply\">回复</string>\n    <string name=\"action_reblog\">转嘟</string>\n    <string name=\"action_unreblog\">取消转嘟</string>\n    <string name=\"action_favourite\">喜欢</string>\n    <string name=\"action_unfavourite\">取消喜欢</string>\n    <string name=\"action_more\">更多</string>\n    <string name=\"action_compose\">新嘟文</string>\n    <string name=\"action_login\">登录 Mastodon 账号</string>\n    <string name=\"action_logout\">退出登录</string>\n    <string name=\"action_logout_confirm\">确定要退出账号 %1$s 吗？</string>\n    <string name=\"action_follow\">关注</string>\n    <string name=\"action_unfollow\">取消关注</string>\n    <string name=\"action_block\">屏蔽</string>\n    <string name=\"action_unblock\">取消屏蔽</string>\n    <string name=\"action_hide_reblogs\">隐藏转嘟</string>\n    <string name=\"action_show_reblogs\">显示转嘟</string>\n    <string name=\"action_report\">报告</string>\n    <string name=\"action_delete\">删除</string>\n    <string name=\"action_delete_and_redraft\">删除并重新编辑</string>\n    <string name=\"action_send\">嘟嘟</string>\n    <string name=\"action_send_public\">嘟嘟！</string>\n    <string name=\"action_retry\">重试</string>\n    <string name=\"action_close\">关闭</string>\n    <string name=\"action_view_profile\">个人资料</string>\n    <string name=\"action_view_preferences\">设置</string>\n    <string name=\"action_view_account_preferences\">账户设置</string>\n    <string name=\"action_view_favourites\">喜欢</string>\n    <string name=\"action_view_mutes\">被隐藏的用户</string>\n    <string name=\"action_view_blocks\">被屏蔽的用户</string>\n    <string name=\"action_view_follow_requests\">关注请求</string>\n    <string name=\"action_view_media\">媒体</string>\n    <string name=\"action_open_in_web\">在浏览器中打开</string>\n    <string name=\"action_add_media\">从相册中选择</string>\n    <string name=\"action_photo_take\">拍照</string>\n    <string name=\"action_share\">分享</string>\n    <string name=\"action_mute\">隐藏</string>\n    <string name=\"action_unmute\">取消隐藏</string>\n    <string name=\"action_mention\">提及</string>\n    <string name=\"action_hide_media\">隐藏媒体文件</string>\n    <string name=\"action_open_drawer\">打开应用抽屉</string>\n    <string name=\"action_save\">保存</string>\n    <string name=\"action_edit_profile\">编辑个人资料</string>\n    <string name=\"action_edit_own_profile\">编辑</string>\n    <string name=\"action_undo\">撤销</string>\n    <string name=\"action_accept\">接受</string>\n    <string name=\"action_reject\">拒绝</string>\n    <string name=\"action_search\">搜索</string>\n    <string name=\"action_access_drafts\">草稿</string>\n    <string name=\"action_toggle_visibility\">设置嘟文可见范围</string>\n    <string name=\"action_content_warning\">设置内容提醒信息</string>\n    <string name=\"action_emoji_keyboard\">插入表情符号</string>\n    <string name=\"action_add_tab\">添加标签页</string>\n    <string name=\"action_links\">链接</string>\n    <string name=\"action_mentions\">提及</string>\n    <string name=\"action_hashtags\">话题</string>\n    <string name=\"action_open_reblogger\">打开转嘟用户主页</string>\n    <string name=\"action_open_reblogged_by\">显示转嘟</string>\n    <string name=\"action_open_faved_by\">显示喜欢</string>\n    <string name=\"title_hashtags_dialog\">话题</string>\n    <string name=\"title_mentions_dialog\">提及</string>\n    <string name=\"title_links_dialog\">链接</string>\n    <string name=\"action_open_media_n\">打开媒体文件 #%1$d</string>\n    <string name=\"download_image\">正在下载 %1$s…</string>\n    <string name=\"action_copy_link\">复制链接</string>\n    <string name=\"action_open_as\">打开为 %1$s</string>\n    <string name=\"action_share_as\">分享为 …</string>\n    <string name=\"download_media\">下载媒体文件</string>\n    <string name=\"downloading_media\">正在下载媒体文件</string>\n    <string name=\"send_post_link_to\">分享链接到…</string>\n    <string name=\"send_post_content_to\">分享嘟文到…</string>\n    <string name=\"send_media_to\">分享媒体到…</string>\n    <string name=\"confirmation_reported\">报告已发送！</string>\n    <string name=\"confirmation_unblocked\">已解除屏蔽</string>\n    <string name=\"confirmation_unmuted\">已取消隐藏</string>\n    <string name=\"hint_domain\">域名</string>\n    <string name=\"hint_compose\">有什么新鲜事？</string>\n    <string name=\"hint_content_warning\">设置内容提醒信息</string>\n    <string name=\"hint_display_name\">昵称</string>\n    <string name=\"hint_note\">简介</string>\n    <string name=\"hint_search\">搜索…</string>\n    <string name=\"search_no_results\">没找到结果</string>\n    <string name=\"label_quick_reply\">回复…</string>\n    <string name=\"label_avatar\">头像</string>\n    <string name=\"label_header\">标题</string>\n    <string name=\"link_whats_an_instance\">需要帮助？</string>\n    <string name=\"login_connection\">正在连接…</string>\n    <string name=\"dialog_whats_an_instance\">请输入你账号所在的 Mastodon 站点的域名，比如 pawoo.net，acg.mn，wxw.moe，<a href=\"https://instances.social\">等等</a> 。 \\u0020\n\\n \\u0020\n\\n还没有 Mastodon 账号？你也可以输入想注册的 Mastodon 站点的域名，然后在该服务器创建新的账号并授权 Tusky 登入。 \\u0020\n\\n \\u0020\n\\n在 Mastodon 里，跨站互动和站内互动一样简单。可以前往 <a href=\"https://joinmastodon.org\">https://joinmastodon.org</a> 了解更多信息。 </string>\n    <string name=\"dialog_title_finishing_media_upload\">正在结束上传…</string>\n    <string name=\"dialog_message_uploading_media\">正在上传…</string>\n    <string name=\"dialog_download_image\">下载</string>\n    <string name=\"dialog_message_cancel_follow_request\">移除关注请求？</string>\n    <string name=\"dialog_unfollow_warning\">不再关注此用户？</string>\n    <string name=\"dialog_delete_post_warning\">删除这条嘟文？</string>\n    <string name=\"dialog_redraft_post_warning\">删除并重新编辑这条嘟文？</string>\n    <string name=\"visibility_public\">公开：所有人可见，并会出现在公共时间轴上</string>\n    <string name=\"visibility_unlisted\">不公开：所有人可见，但不会出现在公共时间轴上</string>\n    <string name=\"visibility_private\">仅关注者：只有经过你确认后关注你的用户可见</string>\n    <string name=\"visibility_direct\">私信：只有被提及的用户可见</string>\n    <string name=\"pref_title_edit_notification_settings\">通知设置</string>\n    <string name=\"pref_title_notifications_enabled\">通知</string>\n    <string name=\"pref_title_notification_alerts\">提醒</string>\n    <string name=\"pref_title_notification_alert_sound\">通知铃声</string>\n    <string name=\"pref_title_notification_alert_vibrate\">振动</string>\n    <string name=\"pref_title_notification_alert_light\">呼吸灯</string>\n    <string name=\"pref_title_notification_filters\">事件</string>\n    <string name=\"pref_title_appearance_settings\">外观</string>\n    <string name=\"pref_title_app_theme\">应用主题</string>\n    <string name=\"pref_title_timelines\">时间轴</string>\n    <string name=\"pref_title_timeline_filters\">过滤器</string>\n    <string name=\"app_them_dark\">黑夜</string>\n    <string name=\"app_theme_light\">白天</string>\n    <string name=\"app_theme_black\">暗色</string>\n    <string name=\"app_theme_auto\">自动切换</string>\n    <string name=\"app_theme_system\">跟随系统设定</string>\n    <string name=\"pref_title_browser_settings\">浏览器</string>\n    <string name=\"pref_title_custom_tabs\">使用 Chrome Custom Tabs</string>\n    <string name=\"pref_title_language\">界面语言</string>\n    <string name=\"pref_title_post_filter\">时间轴过滤</string>\n    <string name=\"pref_title_post_tabs\">标签页</string>\n    <string name=\"pref_title_show_boosts\">显示转嘟</string>\n    <string name=\"pref_title_show_replies\">显示回复</string>\n    <string name=\"pref_title_show_media_preview\">显示预览图</string>\n    <string name=\"pref_title_proxy_settings\">代理</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP 代理</string>\n    <string name=\"pref_title_http_proxy_enable\">启用 HTTP 代理</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP 代理服务器</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP 代理端口</string>\n    <string name=\"pref_default_post_privacy\">嘟文默认可见范围</string>\n    <string name=\"pref_default_media_sensitivity\">自动标记媒体为敏感内容</string>\n    <string name=\"pref_publishing\">发布（与服务器同步）</string>\n    <string name=\"pref_failed_to_sync\">同步设置失败</string>\n    <string name=\"post_privacy_public\">公开</string>\n    <string name=\"post_privacy_unlisted\">不公开</string>\n    <string name=\"post_privacy_followers_only\">仅关注者</string>\n    <string name=\"pref_post_text_size\">字体大小</string>\n    <string name=\"post_text_size_smallest\">最小</string>\n    <string name=\"post_text_size_small\">小</string>\n    <string name=\"post_text_size_medium\">标准</string>\n    <string name=\"post_text_size_large\">大</string>\n    <string name=\"post_text_size_largest\">最大</string>\n    <string name=\"notification_mention_name\">提及</string>\n    <string name=\"notification_mention_descriptions\">当有用户在嘟文中提及我时</string>\n    <string name=\"notification_follow_name\">关注</string>\n    <string name=\"notification_follow_description\">当有用户关注我时</string>\n    <string name=\"notification_boost_name\">转嘟</string>\n    <string name=\"notification_boost_description\">当有用户转嘟了我的嘟文时</string>\n    <string name=\"notification_favourite_name\">喜欢</string>\n    <string name=\"notification_favourite_description\">当有用户喜欢了我的嘟文时</string>\n    <string name=\"notification_poll_name\">投票</string>\n    <string name=\"notification_poll_description\">当我参与的投票结束时</string>\n    <string name=\"notification_mention_format\">%1$s 提及了你</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s 和 %4$d 人</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, 和 %3$s</string>\n    <string name=\"notification_summary_small\">%1$s 和 %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"other\">%1$d 个新互动</item>\n    </plurals>\n    <string name=\"description_account_locked\">锁嘟用户</string>\n    <string name=\"about_title_activity\">关于 Tusky</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"about_tusky_license\">Tusky 是基于 GNU General Public License Version 3 许可证开源的自由软件。完整的许可证协议：https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">项目地址：\n\\n https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">问题反馈：\n\\n https://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Tusky 官方账号</string>\n    <string name=\"post_share_content\">分享嘟文内容</string>\n    <string name=\"post_share_link\">分享嘟文链接</string>\n    <string name=\"post_media_images\">照片</string>\n    <string name=\"post_media_video\">视频</string>\n    <string name=\"state_follow_requested\">已发送关注请求</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">%1$d 年内</string>\n    <string name=\"abbreviated_in_days\">%1$d 天内</string>\n    <string name=\"abbreviated_in_hours\">%1$d 小时内</string>\n    <string name=\"abbreviated_in_minutes\">%1$d 分钟内</string>\n    <string name=\"abbreviated_in_seconds\">%1$d 秒内</string>\n    <string name=\"abbreviated_years_ago\">%1$d 年前</string>\n    <string name=\"abbreviated_days_ago\">%1$d 天前</string>\n    <string name=\"abbreviated_hours_ago\">%1$d 小时前</string>\n    <string name=\"abbreviated_minutes_ago\">%1$d 分钟前</string>\n    <string name=\"abbreviated_seconds_ago\">%1$d 秒前</string>\n    <string name=\"follows_you\">关注了你</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">总是显示所有敏感媒体内容</string>\n    <string name=\"title_media\">媒体</string>\n    <string name=\"replying_to\">回复 @%1$s</string>\n    <string name=\"load_more_placeholder_text\">加载更多</string>\n    <string name=\"pref_title_public_filter_keywords\">公共时间轴</string>\n    <string name=\"pref_title_thread_filter_keywords\">对话</string>\n    <string name=\"filter_addition_title\">添加新的过滤器</string>\n    <string name=\"filter_edit_title\">编辑过滤器</string>\n    <string name=\"filter_dialog_remove_button\">移除</string>\n    <string name=\"filter_dialog_update_button\">更新</string>\n    <string name=\"filter_add_description\">需要过滤的文字</string>\n    <string name=\"add_account_name\">添加账号</string>\n    <string name=\"add_account_description\">添加新的 Mastodon 账号</string>\n    <string name=\"action_lists\">列表</string>\n    <string name=\"title_lists\">列表</string>\n    <string name=\"error_create_list\">无法新建列表</string>\n    <string name=\"error_rename_list\">无法重命名列表</string>\n    <string name=\"error_delete_list\">无法删除列表</string>\n    <string name=\"action_create_list\">新建列表</string>\n    <string name=\"action_rename_list\">重命名列表</string>\n    <string name=\"action_delete_list\">删除列表</string>\n    <string name=\"hint_search_people_list\">搜索已关注的用户</string>\n    <string name=\"action_add_to_list\">添加用户到列表</string>\n    <string name=\"action_remove_from_list\">从列表中移除用户</string>\n    <string name=\"compose_active_account_description\">以 %1$s 发布嘟文</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"other\">为视觉障碍用户提供的描述\n\\n(限制 %1$d 字)</item>\n    </plurals>\n    <string name=\"action_set_caption\">设置图片标题</string>\n    <string name=\"action_remove\">移除</string>\n    <string name=\"lock_account_label\">保护你的账户（锁嘟）</string>\n    <string name=\"lock_account_label_description\">你需要手动审核所有关注请求</string>\n    <string name=\"compose_save_draft\">保存为草稿？</string>\n    <string name=\"send_post_notification_title\">正在发送…</string>\n    <string name=\"send_post_notification_error_title\">发送失败</string>\n    <string name=\"send_post_notification_channel_name\">嘟文发送中</string>\n    <string name=\"send_post_notification_cancel_title\">发送已被取消</string>\n    <string name=\"send_post_notification_saved_content\">嘟文已保存为草稿</string>\n    <string name=\"action_compose_shortcut\">新嘟文</string>\n    <string name=\"error_no_custom_emojis\">当前实例 %1$s 没有自定义表情符号</string>\n    <string name=\"emoji_style\">表情符号风格</string>\n    <string name=\"system_default\">系统默认</string>\n    <string name=\"download_fonts\">需要下载表情符号数据</string>\n    <string name=\"performing_lookup_title\">正在查询…</string>\n    <string name=\"expand_collapse_all_posts\">展开/折叠所有嘟文</string>\n    <string name=\"action_open_post\">打开嘟文</string>\n    <string name=\"restart_required\">需要重启应用</string>\n    <string name=\"restart_emoji\">你需要重启 Tusky 才能生效</string>\n    <string name=\"later\">稍后</string>\n    <string name=\"restart\">立即重启</string>\n    <string name=\"caption_systememoji\">系统内置的表情符号</string>\n    <string name=\"caption_blobmoji\">Android 4.4–7.1 的黄馒头表情符号</string>\n    <string name=\"caption_twemoji\">Mastodon 使用的表情符号</string>\n    <!-- string name=\"emoji_shortcode_format\" translatable=\"false\">:%1$s:</string -->\n    <string name=\"download_failed\">下载失败</string>\n    <string name=\"profile_badge_bot_text\">机器人</string>\n    <string name=\"account_moved_description\">%1$s 已迁移到：</string>\n    <string name=\"reblog_private\">转嘟（可见者不变）</string>\n    <string name=\"unreblog_private\">取消转嘟</string>\n    <string name=\"license_description\">Tusky 使用了以下开源项目的源码：</string>\n    <string name=\"license_apache_2\">以 Apache License 授权（详见下方）</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">个人资料附加信息</string>\n    <string name=\"profile_metadata_add\">添加信息</string>\n    <string name=\"profile_metadata_label_label\">标签</string>\n    <string name=\"profile_metadata_content_label\">内容</string>\n    <string name=\"pref_title_absolute_time\">嘟文显示精确时间</string>\n    <string name=\"label_remote_account\">以下信息可能并不完整，要查看完整资料请使用浏览器打开</string>\n    <string name=\"unpin_action\">取消置顶</string>\n    <string name=\"pin_action\">置顶</string>\n    <plurals name=\"favs\">\n        <item quantity=\"other\"><b>%1$s</b> 次喜欢</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"other\"><b>%1$s</b> 次转嘟</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">转嘟</string>\n    <string name=\"title_favourited_by\">喜欢</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s 和 %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s 和 %3$d 等人</string>\n    <string name=\"description_post_media\">媒体: %1$s</string>\n    <string name=\"description_post_cw\">内容提醒: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">没有媒体描述信息</string>\n    <string name=\"description_post_reblogged\">被转嘟</string>\n    <string name=\"description_post_favourited\">被喜欢</string>\n    <string name=\"description_visibility_public\">公开</string>\n    <string name=\"description_visibility_unlisted\">不公开</string>\n    <string name=\"description_visibility_private\">关注者</string>\n    <string name=\"description_visibility_direct\">私信</string>\n    <string name=\"hint_list_name\">列表名</string>\n    <string name=\"pick_hashtag_hint\">话题名（不含前面的 # 号）</string>\n    <string name=\"notifications_clear\">清空</string>\n    <string name=\"notifications_apply_filter\">分类</string>\n    <string name=\"filter_apply\">应用</string>\n    <string name=\"compose_shortcut_long_label\">发表新嘟文</string>\n    <string name=\"compose_shortcut_short_label\">新嘟文</string>\n    <string name=\"pref_title_bot_overlay\">显示机器人标志</string>\n    <string name=\"notification_clear_text\">你确定要永久清空通知列表吗？</string>\n    <string name=\"poll_info_format\"> \\u0020<!-- 15 votes • 1 hour left --> \\u0020%1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"other\">%1$s 次投票</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">%1$s 结束</string>\n    <string name=\"poll_info_closed\">已结束</string>\n    <string name=\"poll_vote\">投票</string>\n    <string name=\"poll_ended_voted\">你参与的投票已结束</string>\n    <string name=\"poll_ended_created\">你创建的投票已结束</string>\n    <!--These are for timestamps on polls -->\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"other\">剩余 %1$d 天</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"other\">剩余 %1$d 小时</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"other\">剩余 %1$d 分钟</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"other\">剩余 %1$d 秒</item>\n    </plurals>\n    <string name=\"hashtags\">话题</string>\n    <string name=\"action_edit\">编辑</string>\n    <string name=\"edit_poll\">编辑</string>\n    <string name=\"notification_follow_request_name\">关注请求</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-zh-rTW/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_generic\">應用程式出現異常。</string>\n    <string name=\"error_network\">網絡請求出錯，請檢查互聯網連接並重試！</string>\n    <string name=\"error_empty\">內容不能為空。</string>\n    <string name=\"error_invalid_domain\">該域名無效</string>\n    <string name=\"error_failed_app_registration\">無法通過該伺服器的身份驗證。如果此問題持續發生，請嘗試選單中的“在瀏覽器中登錄”。</string>\n    <string name=\"error_no_web_browser_found\">沒有可用的瀏覽器。</string>\n    <string name=\"error_authorization_unknown\">認證過程出現未知錯誤。如果此問題持續發生，請嘗試選單中的“在瀏覽器中登錄”。</string>\n    <string name=\"error_authorization_denied\">授權被拒絕。</string>\n    <string name=\"error_retrieving_oauth_token\">無法獲取登入資訊。</string>\n    <string name=\"error_compose_character_limit\">嘟文太長了！</string>\n    <string name=\"error_media_upload_type\">無法上傳此類型的檔案。</string>\n    <string name=\"error_media_upload_opening\">此檔案無法開啟。</string>\n    <string name=\"error_media_upload_permission\">需要授予 Tusky 讀取媒體檔案的權限。</string>\n    <string name=\"error_media_download_permission\">需要授予 Tusky 寫入儲存空間的權限。</string>\n    <string name=\"error_media_upload_image_or_video\">無法在嘟文中同時插入影片和圖片。</string>\n    <string name=\"error_media_upload_sending\">媒體檔案上傳失敗。</string>\n    <string name=\"error_sender_account_gone\">嘟文發送時出錯。</string>\n    <string name=\"title_home\">主頁</string>\n    <string name=\"title_notifications\">通知</string>\n    <string name=\"title_public_local\">本站時間軸</string>\n    <string name=\"title_public_federated\">跨站公開時間軸</string>\n    <string name=\"title_direct_messages\">私信</string>\n    <string name=\"title_tab_preferences\">標籤頁</string>\n    <string name=\"title_view_thread\">嘟文</string>\n    <string name=\"title_posts\">嘟文</string>\n    <string name=\"title_posts_with_replies\">嘟文和回覆</string>\n    <string name=\"title_posts_pinned\">已置頂</string>\n    <string name=\"title_follows\">正在關注</string>\n    <string name=\"title_followers\">關注者</string>\n    <string name=\"title_favourites\">我的最愛</string>\n    <string name=\"title_mutes\">被靜音的使用者</string>\n    <string name=\"title_blocks\">被封鎖的使用者</string>\n    <string name=\"title_follow_requests\">關注請求</string>\n    <string name=\"title_edit_profile\">編輯個人資料</string>\n    <string name=\"title_drafts\">草稿</string>\n    <string name=\"title_licenses\">開源授權</string>\n    <string name=\"post_username_format\">\\@%1$s</string>\n    <string name=\"post_boosted_format\">%1$s 轉嘟了</string>\n    <string name=\"post_sensitive_media_title\">敏感內容</string>\n    <string name=\"post_media_hidden_title\">已隱藏的照片或影片</string>\n    <string name=\"post_sensitive_media_directions\">點一下顯示</string>\n    <string name=\"post_content_warning_show_more\">顯示更多</string>\n    <string name=\"post_content_warning_show_less\">摺疊內容</string>\n    <string name=\"post_content_show_more\">展開</string>\n    <string name=\"post_content_show_less\">摺疊</string>\n    <string name=\"message_empty\">沒有內容。</string>\n    <string name=\"footer_empty\">還沒有內容，向下拉動即可重新整理！</string>\n    <string name=\"notification_reblog_format\">%1$s 轉嘟了你的嘟文</string>\n    <string name=\"notification_favourite_format\">%1$s 最愛了你的嘟文</string>\n    <string name=\"notification_follow_format\">%1$s 關注了你</string>\n    <string name=\"report_username_format\">檢舉使用者 @%1$s 的濫用行為</string>\n    <string name=\"report_comment_hint\">更多評論？</string>\n    <string name=\"action_quick_reply\">快速回覆</string>\n    <string name=\"action_reply\">回覆</string>\n    <string name=\"action_reblog\">轉嘟</string>\n    <string name=\"action_unreblog\">取消轉嘟</string>\n    <string name=\"action_favourite\">最愛</string>\n    <string name=\"action_unfavourite\">取消最愛</string>\n    <string name=\"action_more\">更多</string>\n    <string name=\"action_compose\">撰寫嘟文</string>\n    <string name=\"action_login\">登入 Mastodon 帳號</string>\n    <string name=\"action_logout\">登出</string>\n    <string name=\"action_logout_confirm\">確定要登出 %1$s 嗎？</string>\n    <string name=\"action_follow\">關注</string>\n    <string name=\"action_unfollow\">取消關注</string>\n    <string name=\"action_block\">封鎖</string>\n    <string name=\"action_unblock\">取消封鎖</string>\n    <string name=\"action_hide_reblogs\">隱藏轉嘟</string>\n    <string name=\"action_show_reblogs\">顯示轉嘟</string>\n    <string name=\"action_report\">檢舉</string>\n    <string name=\"action_delete\">刪除</string>\n    <string name=\"action_delete_and_redraft\">刪除並重新編輯</string>\n    <string name=\"action_send\">嘟嘟</string>\n    <string name=\"action_send_public\">嘟嘟！</string>\n    <string name=\"action_retry\">重試</string>\n    <string name=\"action_close\">關閉</string>\n    <string name=\"action_view_profile\">個人資料</string>\n    <string name=\"action_view_preferences\">設定</string>\n    <string name=\"action_view_account_preferences\">帳戶設定</string>\n    <string name=\"action_view_favourites\">我的最愛</string>\n    <string name=\"action_view_mutes\">被靜音的使用者</string>\n    <string name=\"action_view_blocks\">被封鎖的使用者</string>\n    <string name=\"action_view_follow_requests\">關注請求</string>\n    <string name=\"action_view_media\">媒體</string>\n    <string name=\"action_open_in_web\">在瀏覽器中開啟</string>\n    <string name=\"action_add_media\">從相簿中選擇</string>\n    <string name=\"action_photo_take\">拍照</string>\n    <string name=\"action_share\">分享</string>\n    <string name=\"action_mute\">靜音</string>\n    <string name=\"action_unmute\">取消靜音</string>\n    <string name=\"action_mention\">提及</string>\n    <string name=\"action_hide_media\">隱藏媒體檔案</string>\n    <string name=\"action_open_drawer\">打開應用抽屜</string>\n    <string name=\"action_save\">儲存</string>\n    <string name=\"action_edit_profile\">編輯個人資料</string>\n    <string name=\"action_edit_own_profile\">編輯</string>\n    <string name=\"action_undo\">復原</string>\n    <string name=\"action_accept\">接受</string>\n    <string name=\"action_reject\">拒絕</string>\n    <string name=\"action_search\">搜尋</string>\n    <string name=\"action_access_drafts\">草稿</string>\n    <string name=\"action_toggle_visibility\">設定嘟文可見範圍</string>\n    <string name=\"action_content_warning\">敏感內容警告</string>\n    <string name=\"action_emoji_keyboard\">插入表情符號</string>\n    <string name=\"action_add_tab\">新增標籤頁</string>\n    <string name=\"action_links\">連結</string>\n    <string name=\"action_mentions\">提及</string>\n    <string name=\"action_hashtags\">話題</string>\n    <string name=\"action_open_reblogger\">打開轉嘟用戶主頁</string>\n    <string name=\"action_open_reblogged_by\">顯示轉嘟</string>\n    <string name=\"action_open_faved_by\">顯示最愛</string>\n    <string name=\"title_hashtags_dialog\">話題</string>\n    <string name=\"title_mentions_dialog\">提及</string>\n    <string name=\"title_links_dialog\">連結</string>\n    <string name=\"action_open_media_n\">打開媒體 #%1$d</string>\n    <string name=\"download_image\">正在下載 %1$s</string>\n    <string name=\"action_copy_link\">複製連結</string>\n    <string name=\"action_open_as\">打開為 %1$s</string>\n    <string name=\"action_share_as\">分享為 …</string>\n    <string name=\"download_media\">下載媒體</string>\n    <string name=\"downloading_media\">正在下載媒體</string>\n    <string name=\"send_post_link_to\">分享連結到…</string>\n    <string name=\"send_post_content_to\">分享嘟文到…</string>\n    <string name=\"send_media_to\">分享媒體到…</string>\n    <string name=\"confirmation_reported\">已發送！</string>\n    <string name=\"confirmation_unblocked\">已解除封鎖</string>\n    <string name=\"confirmation_unmuted\">已解除靜音</string>\n    <string name=\"hint_domain\">哪一個域名？</string>\n    <string name=\"hint_compose\">有什麼新鮮事？</string>\n    <string name=\"hint_content_warning\">敏感內容警告</string>\n    <string name=\"hint_display_name\">暱稱</string>\n    <string name=\"hint_note\">簡介</string>\n    <string name=\"hint_search\">搜尋…</string>\n    <string name=\"search_no_results\">沒找到結果</string>\n    <string name=\"label_quick_reply\">回覆…</string>\n    <string name=\"label_avatar\">頭像</string>\n    <string name=\"label_header\">標題</string>\n    <string name=\"link_whats_an_instance\">什麼是站點？</string>\n    <string name=\"login_connection\">正在連線…</string>\n    <string name=\"dialog_whats_an_instance\">輸入你帳號所在的 Mastodon 站點的域名或地址，譬如 mastodon.social、icosahedron.website、social.tchncs.de 和 <a href=\"https://instances.social\">更多</a> \\u0020\n\\n \\u0020\n\\n如果你還沒有帳號，你可以輸入你想要加入的域名並在此建立新帳號。 \\u0020\n\\n \\u0020\n\\n一個站點是一個託管你的帳號的地方，但是你可以很容易的跟不同站台的人們交流，就像是在同一個站台一樣。 \\u0020\n\\n \\u0020\n\\n更多資訊可以在 <a href=\"https://joinmastodon.org\">joinmastodon.org</a> 查看。 </string>\n    <string name=\"dialog_title_finishing_media_upload\">正在完成上傳</string>\n    <string name=\"dialog_message_uploading_media\">正在上傳…</string>\n    <string name=\"dialog_download_image\">下載</string>\n    <string name=\"dialog_message_cancel_follow_request\">移除關注請求？</string>\n    <string name=\"dialog_unfollow_warning\">停止關注此使用者？</string>\n    <string name=\"dialog_delete_post_warning\">刪除這條嘟文？</string>\n    <string name=\"dialog_redraft_post_warning\">刪除並重新編輯這條嘟文？</string>\n    <string name=\"visibility_public\">公開：所有人可見，並會出現在公開時間軸上</string>\n    <string name=\"visibility_unlisted\">不公開：所有人可見，但不會出現在公開時間軸上</string>\n    <string name=\"visibility_private\">僅關注者：只有經過你確認後關注你的使用者可見</string>\n    <string name=\"visibility_direct\">私信：只有被提及的使用者可見</string>\n    <string name=\"pref_title_edit_notification_settings\">通知設定</string>\n    <string name=\"pref_title_notifications_enabled\">通知</string>\n    <string name=\"pref_title_notification_alerts\">提醒</string>\n    <string name=\"pref_title_notification_alert_sound\">通知鈴聲</string>\n    <string name=\"pref_title_notification_alert_vibrate\">振動</string>\n    <string name=\"pref_title_notification_alert_light\">呼吸燈</string>\n    <string name=\"pref_title_notification_filters\">事件</string>\n    <string name=\"pref_title_appearance_settings\">外觀</string>\n    <string name=\"pref_title_app_theme\">佈景主題</string>\n    <string name=\"pref_title_timelines\">時間軸</string>\n    <string name=\"pref_title_timeline_filters\">過濾器</string>\n    <string name=\"app_them_dark\">黑夜</string>\n    <string name=\"app_theme_light\">白天</string>\n    <string name=\"app_theme_black\">暗色</string>\n    <string name=\"app_theme_auto\">自動切換</string>\n    <string name=\"app_theme_system\">跟隨系統</string>\n    <string name=\"pref_title_browser_settings\">瀏覽器</string>\n    <string name=\"pref_title_custom_tabs\">使用 Chrome Custom Tabs</string>\n    <string name=\"pref_title_language\">語言</string>\n    <string name=\"pref_title_post_filter\">時間軸過濾</string>\n    <string name=\"pref_title_post_tabs\">標籤頁</string>\n    <string name=\"pref_title_show_boosts\">顯示轉嘟</string>\n    <string name=\"pref_title_show_replies\">顯示回覆</string>\n    <string name=\"pref_title_show_media_preview\">顯示預覽圖</string>\n    <string name=\"pref_title_proxy_settings\">代理伺服器</string>\n    <string name=\"pref_title_http_proxy_settings\">HTTP 代理伺服器</string>\n    <string name=\"pref_title_http_proxy_enable\">啟用 HTTP 代理伺服器</string>\n    <string name=\"pref_title_http_proxy_server\">HTTP 代理伺服器</string>\n    <string name=\"pref_title_http_proxy_port\">HTTP 代理伺服器埠</string>\n    <string name=\"pref_default_post_privacy\">嘟文預設可見範圍</string>\n    <string name=\"pref_default_media_sensitivity\">總是將媒體標示為敏感</string>\n    <string name=\"pref_publishing\">發佈（與伺服器同步）</string>\n    <string name=\"pref_failed_to_sync\">同步設定失敗</string>\n    <string name=\"post_privacy_public\">公開</string>\n    <string name=\"post_privacy_unlisted\">不公開</string>\n    <string name=\"post_privacy_followers_only\">僅關注者</string>\n    <string name=\"pref_post_text_size\">字體大小</string>\n    <string name=\"post_text_size_smallest\">最小</string>\n    <string name=\"post_text_size_small\">小</string>\n    <string name=\"post_text_size_medium\">標準</string>\n    <string name=\"post_text_size_large\">大</string>\n    <string name=\"post_text_size_largest\">最大</string>\n    <string name=\"notification_mention_name\">提及</string>\n    <string name=\"notification_mention_descriptions\">當有使用者在嘟文中提及我時</string>\n    <string name=\"notification_follow_name\">關注</string>\n    <string name=\"notification_follow_description\">當有使用者關注我時</string>\n    <string name=\"notification_boost_name\">轉嘟</string>\n    <string name=\"notification_boost_description\">當有使用者轉嘟了我的嘟文時</string>\n    <string name=\"notification_favourite_name\">最愛</string>\n    <string name=\"notification_favourite_description\">當有使用者把我的嘟文加入最愛時</string>\n    <string name=\"notification_poll_name\">投票</string>\n    <string name=\"notification_poll_description\">當我參與的投票結束時</string>\n    <string name=\"notification_mention_format\">%1$s 提及了你</string>\n    <string name=\"notification_summary_large\">%1$s, %2$s, %3$s 和 %4$d 人</string>\n    <string name=\"notification_summary_medium\">%1$s, %2$s, 和 %3$s</string>\n    <string name=\"notification_summary_small\">%1$s 和 %2$s</string>\n    <plurals name=\"notification_title_summary\">\n        <item quantity=\"other\">%1$d 個新互動</item>\n    </plurals>\n    <string name=\"description_account_locked\">鎖嘟用戶</string>\n    <string name=\"about_title_activity\">關於 Tusky</string>\n    <string name=\"about_tusky_license\">Tusky 是基於 GNU General Public License Version 3 許可證開源的自由軟體完整的許可證協議：https://www.gnu.org/licenses/gpl-3.0.en.html</string>\n    <!-- note to translators:\n         * you should think of “free” as in “free speech,” not as in “free beer”.\n           We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,\n           to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html\n         * the url can be changed to link to the localized version of the license.\n    -->\n    <string name=\"about_project_site\">專案網站：\n\\n https://tusky.app</string>\n    <string name=\"about_bug_feature_request_site\">問題回報：\n\\n https://github.com/tuskyapp/Tusky/issues</string>\n    <string name=\"about_tusky_account\">Tusky 官方帳號</string>\n    <string name=\"post_share_content\">分享嘟文內容</string>\n    <string name=\"post_share_link\">分享嘟文連結</string>\n    <string name=\"post_media_images\">照片</string>\n    <string name=\"post_media_video\">影片</string>\n    <string name=\"state_follow_requested\">已請求關注</string>\n    <!--These are for timestamps on statuses. For example: \"16s\" or \"2d\"-->\n    <string name=\"abbreviated_in_years\">%1$d 年內</string>\n    <string name=\"abbreviated_in_days\">%1$d 天內</string>\n    <string name=\"abbreviated_in_hours\">%1$d 小時內</string>\n    <string name=\"abbreviated_in_minutes\">%1$d 分鐘內</string>\n    <string name=\"abbreviated_in_seconds\">%1$d 秒內</string>\n    <string name=\"abbreviated_years_ago\">%1$d 年前</string>\n    <string name=\"abbreviated_days_ago\">%1$d 天前</string>\n    <string name=\"abbreviated_hours_ago\">%1$d 小時前</string>\n    <string name=\"abbreviated_minutes_ago\">%1$d 分鐘前</string>\n    <string name=\"abbreviated_seconds_ago\">%1$d 秒前</string>\n    <string name=\"follows_you\">關注了你</string>\n    <string name=\"pref_title_alway_show_sensitive_media\">總是顯示所有敏感媒體內容</string>\n    <string name=\"title_media\">媒體</string>\n    <string name=\"replying_to\">回覆 @%1$s</string>\n    <string name=\"load_more_placeholder_text\">載入更多</string>\n    <string name=\"pref_title_public_filter_keywords\">公共時間軸</string>\n    <string name=\"pref_title_thread_filter_keywords\">對話</string>\n    <string name=\"filter_addition_title\">添加新的過濾器</string>\n    <string name=\"filter_edit_title\">編輯過濾器</string>\n    <string name=\"filter_dialog_remove_button\">移除</string>\n    <string name=\"filter_dialog_update_button\">更新</string>\n    <string name=\"filter_add_description\">需要過濾的文字</string>\n    <string name=\"add_account_name\">加入帳號</string>\n    <string name=\"add_account_description\">加入新的 Mastodon 帳號</string>\n    <string name=\"action_lists\">列表</string>\n    <string name=\"title_lists\">列表</string>\n    <string name=\"error_create_list\">無法新建列表</string>\n    <string name=\"error_rename_list\">無法重命名列表</string>\n    <string name=\"error_delete_list\">無法刪除列表</string>\n    <string name=\"action_create_list\">新建列表</string>\n    <string name=\"action_rename_list\">重命名列表</string>\n    <string name=\"action_delete_list\">刪除列表</string>\n    <string name=\"hint_search_people_list\">搜索已關注的用戶</string>\n    <string name=\"action_add_to_list\">添加用戶到列表</string>\n    <string name=\"action_remove_from_list\">從列表中移除用戶</string>\n    <string name=\"compose_active_account_description\">以 %1$s 發嘟文</string>\n    <plurals name=\"hint_describe_for_visually_impaired\">\n        <item quantity=\"other\">為視覺障礙用戶提供的描述\n\\n(限制 %1$d 字)</item>\n    </plurals>\n    <string name=\"action_set_caption\">設定圖片標題</string>\n    <string name=\"action_remove\">移除</string>\n    <string name=\"lock_account_label\">保護你的帳戶（鎖嘟）</string>\n    <string name=\"lock_account_label_description\">你需要手動審核所有關注請求</string>\n    <string name=\"compose_save_draft\">儲存為草稿？</string>\n    <string name=\"send_post_notification_title\">正在發送…</string>\n    <string name=\"send_post_notification_error_title\">發送失敗</string>\n    <string name=\"send_post_notification_channel_name\">嘟文發送中</string>\n    <string name=\"send_post_notification_cancel_title\">發送已被取消</string>\n    <string name=\"send_post_notification_saved_content\">嘟文已儲存為草稿</string>\n    <string name=\"action_compose_shortcut\">發表新嘟文</string>\n    <string name=\"error_no_custom_emojis\">當前站點 %1$s 沒有自訂表情符號</string>\n    <string name=\"emoji_style\">表情符號風格</string>\n    <string name=\"system_default\">系統預設</string>\n    <string name=\"download_fonts\">你需要先下載這些表情符號包</string>\n    <string name=\"performing_lookup_title\">正在查詢…</string>\n    <string name=\"expand_collapse_all_posts\">展開/摺疊所有嘟文</string>\n    <string name=\"action_open_post\">開啟嘟文</string>\n    <string name=\"restart_required\">需要重啟應用程式</string>\n    <string name=\"restart_emoji\">你需要重啟 Tusky 才能生效</string>\n    <string name=\"later\">稍後</string>\n    <string name=\"restart\">立即重啟</string>\n    <string name=\"caption_systememoji\">系統預設的表情符號包</string>\n    <string name=\"caption_blobmoji\">Android 4.4–7.1 的黃饅頭表情符號</string>\n    <string name=\"caption_twemoji\">Mastodon 使用的表情符號</string>\n    <!-- string name=\"emoji_shortcode_format\" translatable=\"false\">:%1$s:</string -->\n    <string name=\"download_failed\">下載失敗</string>\n    <string name=\"profile_badge_bot_text\">機器人</string>\n    <string name=\"account_moved_description\">%1$s 已遷移到：</string>\n    <string name=\"reblog_private\">轉嘟（可見者不變）</string>\n    <string name=\"unreblog_private\">取消轉嘟</string>\n    <string name=\"license_description\">Tusky 使用了以下開源專案的原始碼：</string>\n    <string name=\"license_apache_2\">以 Apache License 授權（詳見下方）</string>\n    <string name=\"license_cc_by_4\">CC-BY 4.0</string>\n    <string name=\"license_cc_by_sa_4\">CC-BY-SA 4.0</string>\n    <string name=\"profile_metadata_label\">個人資料附加資訊</string>\n    <string name=\"profile_metadata_add\">新增資訊</string>\n    <string name=\"profile_metadata_label_label\">標籤</string>\n    <string name=\"profile_metadata_content_label\">內容</string>\n    <string name=\"pref_title_absolute_time\">嘟文顯示精確時間</string>\n    <string name=\"label_remote_account\">以下資訊可能並不完整，要檢視完整資料請使用瀏覽器開啟。</string>\n    <string name=\"unpin_action\">取消置頂</string>\n    <string name=\"pin_action\">置頂</string>\n    <plurals name=\"favs\">\n        <item quantity=\"other\"><b>%1$s</b> 次最愛</item>\n    </plurals>\n    <plurals name=\"reblogs\">\n        <item quantity=\"other\"><b>%1$s</b> 次轉嘟</item>\n    </plurals>\n    <string name=\"title_reblogged_by\">轉嘟</string>\n    <string name=\"title_favourited_by\">最愛由</string>\n    <string name=\"conversation_1_recipients\">%1$s</string>\n    <string name=\"conversation_2_recipients\">%1$s 和 %2$s</string>\n    <string name=\"conversation_more_recipients\">%1$s, %2$s 和 %3$d 等人</string>\n    <string name=\"description_post_media\">媒體: %1$s</string>\n    <string name=\"description_post_cw\">內容提醒: %1$s</string>\n    <string name=\"description_post_media_no_description_placeholder\">沒有媒體描述信息</string>\n    <string name=\"description_post_reblogged\">被轉嘟</string>\n    <string name=\"description_post_favourited\">被最愛</string>\n    <string name=\"description_visibility_public\">公開</string>\n    <string name=\"description_visibility_unlisted\">不公開</string>\n    <string name=\"description_visibility_private\">僅關注者</string>\n    <string name=\"description_visibility_direct\">私信</string>\n    <string name=\"hint_list_name\">列表名</string>\n    <string name=\"pick_hashtag_hint\">話題名（不含前面的 # 號）</string>\n    <string name=\"notifications_clear\">清空</string>\n    <string name=\"notifications_apply_filter\">分類</string>\n    <string name=\"filter_apply\">應用</string>\n    <string name=\"compose_shortcut_long_label\">發表新嘟文</string>\n    <string name=\"compose_shortcut_short_label\">新嘟文</string>\n    <string name=\"pref_title_bot_overlay\">顯示機器人標誌</string>\n    <string name=\"notification_clear_text\">你確定要永久清空通知列表嗎？</string>\n    <string name=\"poll_info_format\"> \\u0020<!-- 15 votes • 1 hour left --> \\u0020%1$s • %2$s</string>\n    <plurals name=\"poll_info_votes\">\n        <item quantity=\"other\">%1$s 次投票</item>\n    </plurals>\n    <string name=\"poll_info_time_absolute\">%1$s 結束</string>\n    <string name=\"poll_info_closed\">已結束</string>\n    <string name=\"poll_vote\">投票</string>\n    <string name=\"poll_ended_voted\">你參與的投票已結束</string>\n    <string name=\"poll_ended_created\">你創建的投票已結束</string>\n    <!--These are for timestamps on polls -->\n    <plurals name=\"poll_timespan_days\">\n        <item quantity=\"other\">剩餘 %1$d 天</item>\n    </plurals>\n    <plurals name=\"poll_timespan_hours\">\n        <item quantity=\"other\">剩餘 %1$d 小時</item>\n    </plurals>\n    <plurals name=\"poll_timespan_minutes\">\n        <item quantity=\"other\">剩餘 %1$d 分鐘</item>\n    </plurals>\n    <plurals name=\"poll_timespan_seconds\">\n        <item quantity=\"other\">剩餘 %1$d 秒</item>\n    </plurals>\n    <string name=\"title_domain_mutes\">隱藏域名</string>\n    <string name=\"action_view_domain_mutes\">隱藏域名</string>\n    <string name=\"action_mute_domain\">靜音 %1$s</string>\n    <string name=\"confirmation_domain_unmuted\">%1$s 已解除靜音</string>\n    <string name=\"mute_domain_warning\">你確定要封鎖 %1$s 域名嗎？您將不會在任何聯邦時間軸或通知中看到該域名中的內容，且來自該域名的關注者將被移除。</string>\n    <string name=\"mute_domain_warning_dialog_ok\">隱藏整個域名</string>\n    <string name=\"pref_title_animate_gif_avatars\">GIF 動畫大頭貼</string>\n    <string name=\"about_tusky_version\">Tusky %1$s</string>\n    <string name=\"filter_dialog_whole_word\">整個單詞</string>\n    <string name=\"filter_dialog_whole_word_description\">如果關鍵字或短語僅為字母或數字，則只有在匹配整個單詞時才會應用</string>\n    <string name=\"caption_notoemoji\">Google 正在使用的 Emoji 符號集</string>\n    <string name=\"description_poll\">使用以下選項創建投票：%1$s, %2$s, %3$s, %4$s; %5$s</string>\n    <string name=\"compose_preview_image_description\">圖片 %1$s 的動作</string>\n    <string name=\"button_continue\">繼續</string>\n    <string name=\"button_back\">返回</string>\n    <string name=\"button_done\">完成</string>\n    <string name=\"report_sent_success\">成功回報 @%1$s</string>\n    <string name=\"hint_additional_info\">附加留言</string>\n    <string name=\"report_remote_instance\">轉發到 %1$s</string>\n    <string name=\"failed_report\">回報失敗</string>\n    <string name=\"failed_fetch_posts\">無法獲取狀態</string>\n    <string name=\"report_description_1\">該報告將發送給您的伺服器管理員。 您可以在下面提供有關回報此帳戶的原因的說明：</string>\n    <string name=\"report_description_remote_instance\">該帳戶來自其他伺服器。向那裡發送一份匿名的報告副本？</string>\n    <string name=\"hashtags\">話題</string>\n    <string name=\"notification_follow_request_name\">關注請求</string>\n    <string name=\"edit_poll\">編輯</string>\n    <string name=\"action_edit\">編輯</string>\n    <string name=\"title_bookmarks\">書籤</string>\n    <string name=\"wellbeing_hide_stats_profile\">隱藏個人頁面中的狀態數量資訊</string>\n    <string name=\"wellbeing_hide_stats_posts\">隱藏貼文上的狀態數量資訊</string>\n    <string name=\"limit_notifications\">限制時間軸通知</string>\n    <string name=\"review_notifications\">檢查通知設定</string>\n    <string name=\"wellbeing_mode_notice\">有些資訊可能會影響你的心理健康將會被隱藏。包括：\n\\n\n\\n- 最愛/轉嘟/關注 通知\n\\n- 最愛/轉嘟 數量\n\\n- 關注/貼文 在個人頁面的狀態\n\\n\n\\n推播通知不會受到影響，但你可以手動檢查你的通知設定。</string>\n    <string name=\"pref_title_wellbeing_mode\">數位健康</string>\n    <plurals name=\"poll_info_people\">\n        <item quantity=\"other\">%1$s 人</item>\n    </plurals>\n    <string name=\"notification_subscription_format\">%1$s 剛剛發了新嘟文</string>\n    <string name=\"notification_follow_request_format\">%1$s 請求關注你</string>\n    <string name=\"pref_title_animate_custom_emojis\">動態自訂表情符號</string>\n    <string name=\"drafts_post_reply_removed\">你的草稿欲回覆的原嘟文已被刪除</string>\n    <string name=\"draft_deleted\">草稿已刪除</string>\n    <string name=\"drafts_failed_loading_reply\">載入回覆資訊失敗</string>\n    <string name=\"drafts_post_failed_to_send\">這條嘟文發送失敗！</string>\n    <string name=\"post_media_attachments\">附件</string>\n    <string name=\"post_media_audio\">錄音</string>\n    <string name=\"dialog_delete_list_warning\">你確定要刪除列表 %1$s？</string>\n    <string name=\"duration_7_days\">7 天</string>\n    <string name=\"duration_3_days\">3 天</string>\n    <string name=\"duration_1_day\">1 天</string>\n    <string name=\"duration_6_hours\">6 小時</string>\n    <string name=\"duration_1_hour\">1 小時</string>\n    <string name=\"duration_30_min\">30 分鐘</string>\n    <string name=\"duration_5_min\">5 分鐘</string>\n    <string name=\"duration_indefinite\">無限期</string>\n    <string name=\"label_duration\">期間</string>\n    <plurals name=\"error_upload_max_media_reached\">\n        <item quantity=\"other\">你無法上傳超過 %1$d 媒體附件。</item>\n    </plurals>\n    <string name=\"notification_subscription_description\">當你關注的人發布新嘟文時通知</string>\n    <string name=\"notification_subscription_name\">新嘟文</string>\n    <string name=\"no_announcements\">沒有公告。</string>\n    <string name=\"title_announcements\">公告</string>\n    <string name=\"account_note_saved\">已儲存！</string>\n    <string name=\"account_note_hint\">你對此帳號的個人註記</string>\n    <string name=\"pref_title_hide_top_toolbar\">隱藏頂端工具列的標題</string>\n    <string name=\"dialog_mute_hide_notifications\">隱藏通知</string>\n    <string name=\"action_unmute_desc\">取消靜音 %1$s</string>\n    <string name=\"action_unmute_domain\">取消靜音 %1$s</string>\n    <string name=\"pref_main_nav_position_option_bottom\">底端</string>\n    <string name=\"pref_main_nav_position_option_top\">頂端</string>\n    <string name=\"pref_main_nav_position\">主要導覽列的位置</string>\n    <string name=\"pref_title_gradient_for_media\">在隱藏的媒體上使用漸變色彩</string>\n    <string name=\"add_hashtag_title\">加上話題標籤</string>\n    <string name=\"pref_title_confirm_reblogs\">在轉嘟時提示確認</string>\n    <string name=\"pref_title_show_cards_in_timelines\">在時間軸中顯示連結預覽</string>\n    <string name=\"pref_title_enable_swipe_for_tabs\">啟用在分頁間切換的滑動手勢</string>\n    <string name=\"notification_follow_request_description\">關注請求的通知</string>\n    <string name=\"dialog_mute_warning\">靜音 @%1$s？</string>\n    <string name=\"dialog_block_warning\">封鎖 @%1$s？</string>\n    <string name=\"action_unmute_conversation\">取消靜音對話</string>\n    <string name=\"action_mute_conversation\">靜音對話</string>\n    <string name=\"warning_scheduling_interval\">Mastodon 的最短發文間隔限制為 5 分鐘。</string>\n    <string name=\"no_drafts\">你沒有任何草稿。</string>\n    <string name=\"no_scheduled_posts\">你沒有任何已排程的嘟文。</string>\n    <string name=\"list\">列表</string>\n    <string name=\"select_list_title\">選擇列表</string>\n    <string name=\"description_post_bookmarked\">被加入書籤</string>\n    <string name=\"action_view_bookmarks\">我的書籤</string>\n    <string name=\"action_bookmark\">書籤</string>\n    <string name=\"about_powered_by_tusky\">由 Tusky 提供</string>\n    <string name=\"post_lookup_error_format\">尋找嘟文時發生錯誤 %1$s</string>\n    <string name=\"action_reset_schedule\">重設</string>\n    <string name=\"action_schedule_post\">排程嘟文</string>\n    <string name=\"action_access_scheduled_posts\">排程的嘟文</string>\n    <string name=\"title_scheduled_posts\">已排程的嘟文</string>\n    <string name=\"poll_new_choice_hint\">選項 %1$d</string>\n    <string name=\"poll_allow_multiple_choices\">多個選項</string>\n    <string name=\"add_poll_choice\">新增選項</string>\n    <string name=\"create_poll_title\">投票</string>\n    <string name=\"action_add_poll\">新增投票</string>\n    <string name=\"pref_title_alway_open_spoiler\">總是顯示被標注為內容警告的嘟文</string>\n    <string name=\"failed_search\">搜尋失敗</string>\n    <string name=\"title_accounts\">帳號</string>\n    <string name=\"title_login\">登入</string>\n    <string name=\"error_could_not_load_login_page\">無法載入登入頁面。</string>\n    <string name=\"delete_scheduled_post_warning\">確定要刪除這則排程嘟文嗎？</string>\n    <string name=\"instance_rule_info\">登入既代表您已同意 %1$s 的規定。</string>\n    <string name=\"instance_rule_title\">%1$s 的規定</string>\n    <string name=\"dialog_delete_conversation_warning\">確認要刪除此對話嗎？</string>\n    <string name=\"filter_expiration_format\">%1$s (%2$s)</string>\n    <string name=\"set_focus_description\">輕按或拖動圓圈來選擇總是在縮圖中可視的關注點。</string>\n    <string name=\"description_post_language\">嘟文語言</string>\n    <string name=\"compose_save_draft_loses_media\">是否要儲存草稿？（當你重開草稿時附檔將會被再次上傳。）</string>\n    <string name=\"tusky_compose_post_quicksetting_label\">編寫嘟文</string>\n    <string name=\"failed_to_pin\">釘選失敗</string>\n    <string name=\"failed_to_unpin\">取消釘選失敗</string>\n    <string name=\"pref_title_show_self_username\">在工具列顯示使用者名稱</string>\n    <string name=\"pref_title_confirm_favourites\">標註為喜歡前顯示確認對話框</string>\n    <string name=\"account_date_joined\">加入自 %1$s</string>\n    <string name=\"pref_show_self_username_always\">總是</string>\n    <string name=\"pref_show_self_username_disambiguate\">登入多個帳號時</string>\n    <string name=\"pref_show_self_username_never\">從不</string>\n    <string name=\"notification_sign_up_name\">註冊</string>\n    <string name=\"notification_sign_up_description\">新使用者通知</string>\n    <string name=\"notification_update_name\">嘟文編輯</string>\n    <string name=\"notification_update_description\">當你互動過的嘟文被編輯時發出通知</string>\n    <string name=\"follow_requests_info\">雖然您的帳號未上鎖，管理者 %1$s 認為您或許需要手動處理來自這些帳號的追蹤請求。</string>\n    <string name=\"action_subscribe_account\">訂閱</string>\n    <string name=\"action_unsubscribe_account\">取消訂閱</string>\n    <string name=\"saving_draft\">正在儲存草稿…</string>\n    <string name=\"action_set_focus\">設置關注點</string>\n    <string name=\"error_multimedia_size_limit\">影片和音訊檔案大小不能超過 %1$s MB。</string>\n    <string name=\"status_count_one_plus\">1+</string>\n    <string name=\"action_add_reaction\">添加反應</string>\n    <string name=\"action_edit_image\">編輯圖片</string>\n    <string name=\"duration_30_days\">30 天</string>\n    <string name=\"duration_60_days\">60 天</string>\n    <string name=\"duration_90_days\">90 天</string>\n    <string name=\"duration_180_days\">180 天</string>\n    <string name=\"duration_365_days\">365 天</string>\n    <string name=\"duration_no_change\">(無更改)</string>\n    <string name=\"error_following_hashtag_format\">追蹤 #%1$s 時發生錯誤</string>\n    <string name=\"error_unfollowing_hashtag_format\">取消追蹤 #%1$s 時發生錯誤</string>\n    <string name=\"action_unbookmark\">移除書籤</string>\n    <string name=\"action_delete_conversation\">刪除對話</string>\n    <string name=\"action_dismiss\">撤銷</string>\n    <string name=\"action_details\">詳情</string>\n    <string name=\"duration_14_days\">14 天</string>\n    <string name=\"error_loading_account_details\">加載賬戶詳情失敗</string>\n    <string name=\"notification_sign_up_format\">%1$s 已註冊</string>\n    <string name=\"notification_update_format\">%1$s 編輯了他們的嘟文</string>\n    <string name=\"error_image_edit_failed\">這張圖片不能編輯。</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/xml/file_paths.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<paths>\n    <external-path name=\"my_images\" path=\".\" />\n    <cache-path name=\"*\" path=\".\" />\n</paths>"
  },
  {
    "path": "app/src/main/res/xml/locales_config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<locale-config xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <locale android:name=\"en\"/>\n    <locale android:name=\"ca\"/>\n    <locale android:name=\"cs\"/>\n    <locale android:name=\"cy\"/>\n    <locale android:name=\"de\"/>\n    <locale android:name=\"en-GB\"/>\n    <locale android:name=\"en\"/>\n    <locale android:name=\"eo\"/>\n    <locale android:name=\"es\"/>\n    <locale android:name=\"eu\"/>\n    <locale android:name=\"fr\"/>\n    <locale android:name=\"ga\"/>\n    <locale android:name=\"gd\"/>\n    <locale android:name=\"gl\"/>\n    <locale android:name=\"is\"/>\n    <locale android:name=\"it\"/>\n    <locale android:name=\"hu\"/>\n    <locale android:name=\"nl\"/>\n    <locale android:name=\"nb-NO\"/>\n    <locale android:name=\"oc\"/>\n    <locale android:name=\"or\"/>\n    <locale android:name=\"pl\"/>\n    <locale android:name=\"pt-BR\"/>\n    <locale android:name=\"pt-PT\"/>\n    <locale android:name=\"sl\"/>\n    <locale android:name=\"sv\"/>\n    <locale android:name=\"kab\"/>\n    <locale android:name=\"vi\"/>\n    <locale android:name=\"tr\"/>\n    <locale android:name=\"be\"/>\n    <locale android:name=\"bg\"/>\n    <locale android:name=\"ru\"/>\n    <locale android:name=\"uk\"/>\n    <locale android:name=\"ar\"/>\n    <locale android:name=\"ckb\"/>\n    <locale android:name=\"bn-BD\"/>\n    <locale android:name=\"bn-IN\"/>\n    <locale android:name=\"fa\"/>\n    <locale android:name=\"hi\"/>\n    <locale android:name=\"sa\"/>\n    <locale android:name=\"ta\"/>\n    <locale android:name=\"th\"/>\n    <locale android:name=\"ko\"/>\n    <locale android:name=\"zh-TW\"/>\n    <locale android:name=\"zh-SG\"/>\n    <locale android:name=\"zh-MO\"/>\n    <locale android:name=\"zh-CN\"/>\n    <locale android:name=\"zh-HK\"/>\n    <locale android:name=\"ja\"/>\n    <locale android:name=\"ber\"/>\n    <locale android:name=\"el\"/>\n    <locale android:name=\"fi\"/>\n    <locale android:name=\"fy\"/>\n    <locale android:name=\"in\"/>\n    <locale android:name=\"lb\"/>\n    <locale android:name=\"lv\"/>\n    <locale android:name=\"ml\"/>\n    <locale android:name=\"si\"/>\n    <locale android:name=\"sk\"/>\n</locale-config>\n"
  },
  {
    "path": "app/src/main/res/xml/network_security_config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<network-security-config>\n    <base-config cleartextTrafficPermitted=\"false\">\n        <trust-anchors>\n            <certificates src=\"system\" />\n            <certificates src=\"@raw/isrg_root_x1\" />\n            <certificates src=\"@raw/isrg_root_x2\" />\n        </trust-anchors>\n    </base-config>\n</network-security-config>\n"
  },
  {
    "path": "app/src/main/res/xml/searchable.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<searchable xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:label=\"@string/app_name\"\n    android:hint=\"@string/hint_search\">\n</searchable>"
  },
  {
    "path": "app/src/main/res/xml/share_shortcuts.xml",
    "content": "<shortcuts xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <share-target android:targetClass=\"com.keylesspalace.tusky.MainActivity\">\n        <data android:mimeType=\"text/plain\" />\n        <category android:name=\"com.keylesspalace.tusky.Share\" />\n    </share-target>\n\n</shortcuts>"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/BottomSheetActivityTest.kt",
    "content": "/* Copyright 2018 Levi Bard\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport com.keylesspalace.tusky.entity.SearchResult\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.entity.TimelineAccount\nimport com.keylesspalace.tusky.network.MastodonApi\nimport java.util.Date\nimport kotlin.time.Duration.Companion.milliseconds\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.test.StandardTestDispatcher\nimport kotlinx.coroutines.test.resetMain\nimport kotlinx.coroutines.test.runTest\nimport kotlinx.coroutines.test.setMain\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\nimport org.mockito.ArgumentMatchers.anyBoolean\nimport org.mockito.Mockito.eq\nimport org.mockito.kotlin.doReturn\nimport org.mockito.kotlin.mock\n\n@OptIn(ExperimentalCoroutinesApi::class)\nclass BottomSheetActivityTest {\n\n    @get:Rule\n    val instantTaskExecutorRule: InstantTaskExecutorRule = InstantTaskExecutorRule()\n\n    private lateinit var activity: FakeBottomSheetActivity\n    private lateinit var apiMock: MastodonApi\n    private val accountQuery = \"http://mastodon.foo.bar/@User\"\n    private val statusQuery = \"http://mastodon.foo.bar/@User/345678\"\n    private val nonexistentStatusQuery = \"http://mastodon.foo.bar/@User/345678000\"\n    private val nonMastodonQuery = \"http://medium.com/@correspondent/345678\"\n    private val emptyResult = NetworkResult.success(SearchResult(emptyList(), emptyList(), emptyList()))\n\n    private val account = TimelineAccount(\n        id = \"1\",\n        localUsername = \"admin\",\n        username = \"admin\",\n        displayName = \"Ad Min\",\n        note = \"This is their bio\",\n        url = \"http://mastodon.foo.bar/@User\",\n        avatar = \"\"\n    )\n    private val accountResult = NetworkResult.success(SearchResult(listOf(account), emptyList(), emptyList()))\n\n    private val status = Status(\n        id = \"1\",\n        url = statusQuery,\n        account = account,\n        inReplyToId = null,\n        inReplyToAccountId = null,\n        reblog = null,\n        content = \"omgwat\",\n        createdAt = Date(),\n        editedAt = null,\n        emojis = emptyList(),\n        reblogsCount = 0,\n        favouritesCount = 0,\n        repliesCount = 0,\n        reblogged = false,\n        favourited = false,\n        bookmarked = false,\n        sensitive = false,\n        spoilerText = \"\",\n        visibility = Status.Visibility.PUBLIC,\n        attachments = ArrayList(),\n        mentions = emptyList(),\n        tags = emptyList(),\n        application = null,\n        pinned = false,\n        muted = false,\n        poll = null,\n        card = null,\n        language = null,\n        filtered = emptyList()\n    )\n    private val statusResult = NetworkResult.success(SearchResult(emptyList(), listOf(status), emptyList()))\n\n    @Before\n    fun setup() {\n        apiMock = mock {\n            onBlocking { search(eq(accountQuery), eq(null), anyBoolean(), eq(null), eq(null), eq(null)) } doReturn accountResult\n            onBlocking { search(eq(statusQuery), eq(null), anyBoolean(), eq(null), eq(null), eq(null)) } doReturn statusResult\n            onBlocking { search(eq(nonexistentStatusQuery), eq(null), anyBoolean(), eq(null), eq(null), eq(null)) } doReturn accountResult\n            onBlocking { search(eq(nonMastodonQuery), eq(null), anyBoolean(), eq(null), eq(null), eq(null)) } doReturn emptyResult\n        }\n\n        activity = FakeBottomSheetActivity(apiMock)\n    }\n\n    @Test\n    fun beginEndSearch_setIsSearching_isSearchingAfterBegin() {\n        activity.onBeginSearch(\"https://mastodon.foo.bar/@User\")\n        assertTrue(activity.isSearching())\n    }\n\n    @Test\n    fun beginEndSearch_setIsSearching_isNotSearchingAfterEnd() {\n        val validUrl = \"https://mastodon.foo.bar/@User\"\n        activity.onBeginSearch(validUrl)\n        activity.onEndSearch(validUrl)\n        assertFalse(activity.isSearching())\n    }\n\n    @Test\n    fun beginEndSearch_setIsSearching_doesNotCancelSearchWhenResponseFromPreviousSearchIsReceived() {\n        val validUrl = \"https://mastodon.foo.bar/@User\"\n        val invalidUrl = \"\"\n\n        activity.onBeginSearch(validUrl)\n        activity.onEndSearch(invalidUrl)\n        assertTrue(activity.isSearching())\n    }\n\n    @Test\n    fun cancelActiveSearch() {\n        val url = \"https://mastodon.foo.bar/@User\"\n\n        activity.onBeginSearch(url)\n        activity.cancelActiveSearch()\n        assertFalse(activity.isSearching())\n    }\n\n    @Test\n    fun getCancelSearchRequested_detectsURL() {\n        val firstUrl = \"https://mastodon.foo.bar/@User\"\n        val secondUrl = \"https://mastodon.foo.bar/@meh\"\n\n        activity.onBeginSearch(firstUrl)\n        activity.cancelActiveSearch()\n\n        activity.onBeginSearch(secondUrl)\n        assertTrue(activity.getCancelSearchRequested(firstUrl))\n        assertFalse(activity.getCancelSearchRequested(secondUrl))\n    }\n\n    @Test\n    fun search_inIdealConditions_returnsRequestedResults_forAccount() = runTest {\n        Dispatchers.setMain(StandardTestDispatcher(testScheduler))\n        try {\n            activity.viewUrl(accountQuery)\n            testScheduler.advanceTimeBy(100.milliseconds)\n            assertEquals(account.id, activity.accountId)\n        } finally {\n            Dispatchers.resetMain()\n        }\n    }\n\n    @Test\n    fun search_inIdealConditions_returnsRequestedResults_forStatus() = runTest {\n        Dispatchers.setMain(StandardTestDispatcher(testScheduler))\n        try {\n            activity.viewUrl(statusQuery)\n            testScheduler.advanceTimeBy(100.milliseconds)\n            assertEquals(status.id, activity.statusId)\n        } finally {\n            Dispatchers.resetMain()\n        }\n    }\n\n    @Test\n    fun search_inIdealConditions_returnsRequestedResults_forNonMastodonURL() = runTest {\n        Dispatchers.setMain(StandardTestDispatcher(testScheduler))\n        try {\n            activity.viewUrl(nonMastodonQuery)\n            testScheduler.advanceTimeBy(100.milliseconds)\n            assertEquals(nonMastodonQuery, activity.link)\n        } finally {\n            Dispatchers.resetMain()\n        }\n    }\n\n    @Test\n    fun search_withNoResults_appliesRequestedFallbackBehavior() = runTest {\n        Dispatchers.setMain(StandardTestDispatcher(testScheduler))\n        try {\n            for (fallbackBehavior in listOf(\n                PostLookupFallbackBehavior.OPEN_IN_BROWSER,\n                PostLookupFallbackBehavior.DISPLAY_ERROR\n            )) {\n                activity.viewUrl(nonMastodonQuery, fallbackBehavior)\n                testScheduler.advanceTimeBy(100.milliseconds)\n                assertEquals(nonMastodonQuery, activity.link)\n                assertEquals(fallbackBehavior, activity.fallbackBehavior)\n            }\n        } finally {\n            Dispatchers.resetMain()\n        }\n    }\n\n    @Test\n    fun search_doesNotRespectUnrelatedResult() = runTest {\n        Dispatchers.setMain(StandardTestDispatcher(testScheduler))\n        try {\n            activity.viewUrl(nonexistentStatusQuery)\n            testScheduler.advanceTimeBy(100.milliseconds)\n            assertEquals(nonexistentStatusQuery, activity.link)\n            assertEquals(null, activity.accountId)\n        } finally {\n            Dispatchers.resetMain()\n        }\n    }\n\n    @Test\n    fun search_withCancellation_doesNotLoadUrl_forAccount() = runTest {\n        Dispatchers.setMain(StandardTestDispatcher(testScheduler))\n        try {\n            activity.viewUrl(accountQuery)\n            assertTrue(activity.isSearching())\n            activity.cancelActiveSearch()\n            assertFalse(activity.isSearching())\n            assertEquals(null, activity.accountId)\n        } finally {\n            Dispatchers.resetMain()\n        }\n    }\n\n    @Test\n    fun search_withCancellation_doesNotLoadUrl_forStatus() = runTest {\n        Dispatchers.setMain(StandardTestDispatcher(testScheduler))\n        try {\n            activity.viewUrl(accountQuery)\n            activity.cancelActiveSearch()\n            assertEquals(null, activity.accountId)\n        } finally {\n            Dispatchers.resetMain()\n        }\n    }\n\n    @Test\n    fun search_withCancellation_doesNotLoadUrl_forNonMastodonURL() = runTest {\n        Dispatchers.setMain(StandardTestDispatcher(testScheduler))\n        try {\n            activity.viewUrl(nonMastodonQuery)\n            activity.cancelActiveSearch()\n            assertEquals(null, activity.searchUrl)\n        } finally {\n            Dispatchers.resetMain()\n        }\n    }\n\n    @Test\n    fun search_withPreviousCancellation_completes() = runTest {\n        Dispatchers.setMain(StandardTestDispatcher(testScheduler))\n        try {\n            // begin/cancel account search\n            activity.viewUrl(accountQuery)\n            activity.cancelActiveSearch()\n\n            // begin status search\n            activity.viewUrl(statusQuery)\n\n            // ensure that search is still ongoing\n            assertTrue(activity.isSearching())\n\n            // return searchResults\n            testScheduler.advanceTimeBy(100.milliseconds)\n\n            // ensure that the result of the status search was recorded\n            // and the account search wasn't\n            assertEquals(status.id, activity.statusId)\n            assertEquals(null, activity.accountId)\n        } finally {\n            Dispatchers.resetMain()\n        }\n    }\n\n    class FakeBottomSheetActivity(api: MastodonApi) : BottomSheetActivity() {\n\n        var statusId: String? = null\n        var accountId: String? = null\n        var link: String? = null\n        var fallbackBehavior: PostLookupFallbackBehavior? = null\n\n        init {\n            mastodonApi = api\n            bottomSheet = mock()\n        }\n\n        override fun openLink(url: String) {\n            this.link = url\n        }\n\n        override fun viewAccount(id: String) {\n            this.accountId = id\n        }\n\n        override fun viewThread(statusId: String, url: String?) {\n            this.statusId = statusId\n        }\n\n        override fun performUrlFallbackAction(url: String, fallbackBehavior: PostLookupFallbackBehavior) {\n            this.link = url\n            this.fallbackBehavior = fallbackBehavior\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/FilterV1Test.kt",
    "content": "/*\n * Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport com.keylesspalace.tusky.components.instanceinfo.InstanceInfoRepository\nimport com.keylesspalace.tusky.entity.Attachment\nimport com.keylesspalace.tusky.entity.Filter\nimport com.keylesspalace.tusky.entity.FilterV1\nimport com.keylesspalace.tusky.entity.Poll\nimport com.keylesspalace.tusky.entity.PollOption\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.network.FilterModel\nimport com.keylesspalace.tusky.network.MastodonApi\nimport java.time.Instant\nimport java.util.Date\nimport kotlinx.coroutines.runBlocking\nimport okhttp3.ResponseBody.Companion.toResponseBody\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNull\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.kotlin.doReturn\nimport org.mockito.kotlin.mock\nimport org.robolectric.annotation.Config\nimport retrofit2.HttpException\nimport retrofit2.Response\n\n@Config(sdk = [34])\n@RunWith(AndroidJUnit4::class)\nclass FilterV1Test {\n\n    private lateinit var filterModel: FilterModel\n\n    @Before\n    fun setup() {\n        val filters = listOf(\n            FilterV1(\n                id = \"123\",\n                phrase = \"badWord\",\n                context = listOf(Filter.Kind.HOME.kind),\n                expiresAt = null,\n                irreversible = false,\n                wholeWord = false\n            ),\n            FilterV1(\n                id = \"123\",\n                phrase = \"badWholeWord\",\n                context = listOf(Filter.Kind.HOME.kind, Filter.Kind.PUBLIC.kind),\n                expiresAt = null,\n                irreversible = false,\n                wholeWord = true\n            ),\n            FilterV1(\n                id = \"123\",\n                phrase = \"@twitter.com\",\n                context = listOf(Filter.Kind.HOME.kind),\n                expiresAt = null,\n                irreversible = false,\n                wholeWord = true\n            ),\n            FilterV1(\n                id = \"123\",\n                phrase = \"#hashtag\",\n                context = listOf(Filter.Kind.HOME.kind),\n                expiresAt = null,\n                irreversible = false,\n                wholeWord = true\n            ),\n            FilterV1(\n                id = \"123\",\n                phrase = \"expired\",\n                context = listOf(Filter.Kind.HOME.kind),\n                expiresAt = Date.from(Instant.now().minusSeconds(10)),\n                irreversible = false,\n                wholeWord = true\n            ),\n            FilterV1(\n                id = \"123\",\n                phrase = \"unexpired\",\n                context = listOf(Filter.Kind.HOME.kind),\n                expiresAt = Date.from(Instant.now().plusSeconds(3600)),\n                irreversible = false,\n                wholeWord = true\n            ),\n            FilterV1(\n                id = \"123\",\n                phrase = \"href\",\n                context = listOf(Filter.Kind.HOME.kind),\n                expiresAt = null,\n                irreversible = false,\n                wholeWord = false\n            )\n        )\n\n        val api: MastodonApi = mock {\n            onBlocking { getFiltersV1() } doReturn NetworkResult.success(filters)\n            onBlocking { getFilters() } doReturn NetworkResult.failure(\n                HttpException(Response.error<Any>(404, \"\".toResponseBody()))\n            )\n        }\n        val instanceInfoRepo: InstanceInfoRepository = mock {\n            onBlocking { isFilterV2Supported() } doReturn false\n        }\n\n        filterModel = FilterModel(instanceInfoRepo, api)\n        runBlocking {\n            filterModel.init(Filter.Kind.HOME)\n        }\n    }\n\n    @Test\n    fun shouldNotFilter() {\n        assertNull(\n            filterModel.shouldFilterStatus(\n                mockStatus(content = \"should not be filtered\")\n            )\n        )\n    }\n\n    @Test\n    fun shouldFilter_whenContentMatchesBadWord() {\n        assertEquals(\n            Filter.Action.HIDE,\n            filterModel.shouldFilterStatus(\n                mockStatus(content = \"one two badWord three\")\n            )?.action\n        )\n    }\n\n    @Test\n    fun shouldFilter_whenContentMatchesBadWordPart() {\n        assertEquals(\n            Filter.Action.HIDE,\n            filterModel.shouldFilterStatus(\n                mockStatus(content = \"one two badWordPart three\")\n            )?.action\n        )\n    }\n\n    @Test\n    fun shouldFilter_whenContentMatchesBadWholeWord() {\n        assertEquals(\n            Filter.Action.HIDE,\n            filterModel.shouldFilterStatus(\n                mockStatus(content = \"one two badWholeWord three\")\n            )?.action\n        )\n    }\n\n    @Test\n    fun shouldNotFilter_whenContentDoesNotMatchWholeWord() {\n        assertNull(\n            filterModel.shouldFilterStatus(\n                mockStatus(content = \"one two badWholeWordTest three\")\n            )\n        )\n    }\n\n    @Test\n    fun shouldFilter_whenSpoilerTextDoesMatch() {\n        assertEquals(\n            Filter.Action.HIDE,\n            filterModel.shouldFilterStatus(\n                mockStatus(\n                    content = \"should not be filtered\",\n                    spoilerText = \"badWord should be filtered\"\n                )\n            )?.action\n        )\n    }\n\n    @Test\n    fun shouldFilter_whenPollTextDoesMatch() {\n        assertEquals(\n            Filter.Action.HIDE,\n            filterModel.shouldFilterStatus(\n                mockStatus(\n                    content = \"should not be filtered\",\n                    spoilerText = \"should not be filtered\",\n                    pollOptions = listOf(\"should not be filtered\", \"badWord\")\n                )\n            )?.action\n        )\n    }\n\n    @Test\n    fun shouldFilter_whenMediaDescriptionDoesMatch() {\n        assertEquals(\n            Filter.Action.HIDE,\n            filterModel.shouldFilterStatus(\n                mockStatus(\n                    content = \"should not be filtered\",\n                    spoilerText = \"should not be filtered\",\n                    attachmentsDescriptions = listOf(\"should not be filtered\", \"badWord\")\n                )\n            )?.action\n        )\n    }\n\n    @Test\n    fun shouldFilterPartialWord_whenWholeWordFilterContainsNonAlphanumericCharacters() {\n        assertEquals(\n            Filter.Action.HIDE,\n            filterModel.shouldFilterStatus(\n                mockStatus(content = \"one two someone@twitter.com three\")\n            )?.action\n        )\n    }\n\n    @Test\n    fun shouldFilterHashtags() {\n        assertEquals(\n            Filter.Action.HIDE,\n            filterModel.shouldFilterStatus(\n                mockStatus(content = \"#hashtag one two three\")\n            )?.action\n        )\n    }\n\n    @Test\n    fun shouldFilterHashtags_whenContentIsMarkedUp() {\n        assertEquals(\n            Filter.Action.HIDE,\n            filterModel.shouldFilterStatus(\n                mockStatus(content = \"<p><a href=\\\"https://foo.bar/tags/hashtag\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>hashtag</span></a>one two three</p>\")\n            )?.action\n        )\n    }\n\n    @Test\n    fun shouldNotFilterHtmlAttributes() {\n        assertNull(\n            filterModel.shouldFilterStatus(\n                mockStatus(content = \"<p><a href=\\\"https://foo.bar/\\\">https://foo.bar/</a> one two three</p>\")\n            )\n        )\n    }\n\n    @Test\n    fun shouldNotFilter_whenFilterIsExpired() {\n        assertNull(\n            filterModel.shouldFilterStatus(\n                mockStatus(content = \"content matching expired filter should not be filtered\")\n            )\n        )\n    }\n\n    @Test\n    fun shouldFilter_whenFilterIsUnexpired() {\n        assertEquals(\n            Filter.Action.HIDE,\n            filterModel.shouldFilterStatus(\n                mockStatus(content = \"content matching unexpired filter should be filtered\")\n            )?.action\n        )\n    }\n\n    companion object {\n        fun mockStatus(\n            content: String = \"\",\n            spoilerText: String = \"\",\n            pollOptions: List<String>? = null,\n            attachmentsDescriptions: List<String>? = null\n        ): Status {\n            return Status(\n                id = \"123\",\n                url = \"https://mastodon.social/@Tusky/100571663297225812\",\n                account = mock(),\n                inReplyToId = null,\n                inReplyToAccountId = null,\n                reblog = null,\n                content = content,\n                createdAt = Date(),\n                editedAt = null,\n                emojis = emptyList(),\n                reblogsCount = 0,\n                favouritesCount = 0,\n                repliesCount = 0,\n                reblogged = false,\n                favourited = false,\n                bookmarked = false,\n                sensitive = false,\n                spoilerText = spoilerText,\n                visibility = Status.Visibility.PUBLIC,\n                attachments = if (attachmentsDescriptions != null) {\n                    ArrayList(\n                        attachmentsDescriptions.map {\n                            Attachment(\n                                id = \"1234\",\n                                url = \"\",\n                                previewUrl = null,\n                                meta = null,\n                                type = Attachment.Type.IMAGE,\n                                description = it,\n                                blurhash = null\n                            )\n                        }\n                    )\n                } else {\n                    arrayListOf()\n                },\n                mentions = listOf(),\n                tags = listOf(),\n                application = null,\n                pinned = false,\n                muted = false,\n                poll = if (pollOptions != null) {\n                    Poll(\n                        id = \"1234\",\n                        expiresAt = null,\n                        expired = false,\n                        multiple = false,\n                        votesCount = 0,\n                        votersCount = 0,\n                        options = pollOptions.map {\n                            PollOption(it, 0)\n                        },\n                        voted = false,\n                        ownVotes = emptyList()\n                    )\n                } else {\n                    null\n                },\n                card = null,\n                language = null,\n                filtered = emptyList()\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/FocalPointUtilTest.kt",
    "content": "/* Copyright 2018 Jochem Raat <jchmrt@riseup.net>\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky\n\nimport com.keylesspalace.tusky.util.FocalPointUtil\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Test\n\nclass FocalPointUtilTest {\n    private val eps = 0.01f\n\n    // focal[X|Y]ToCoordinate tests\n    @Test\n    fun positiveFocalXToCoordinateTest() {\n        assertEquals(FocalPointUtil.focalXToCoordinate(0.4f), 0.7f, eps)\n    }\n\n    @Test\n    fun negativeFocalXToCoordinateTest() {\n        assertEquals(FocalPointUtil.focalXToCoordinate(-0.8f), 0.1f, eps)\n    }\n\n    @Test\n    fun positiveFocalYToCoordinateTest() {\n        assertEquals(FocalPointUtil.focalYToCoordinate(-0.2f), 0.6f, eps)\n    }\n\n    @Test\n    fun negativeFocalYToCoordinateTest() {\n        assertEquals(FocalPointUtil.focalYToCoordinate(0.0f), 0.5f, eps)\n    }\n\n    // isVerticalCrop tests\n    @Test\n    fun isVerticalCropTest() {\n        assertTrue(\n            FocalPointUtil.isVerticalCrop(\n                2f,\n                1f,\n                1f,\n                2f\n            )\n        )\n    }\n\n    @Test\n    fun isHorizontalCropTest() {\n        assertFalse(\n            FocalPointUtil.isVerticalCrop(\n                1f,\n                2f,\n                2f,\n                1f\n            )\n        )\n    }\n\n    @Test\n    fun isPerfectFitTest() { // Doesn't matter what it returns, just check it doesn't crash\n        FocalPointUtil.isVerticalCrop(\n            3f,\n            1f,\n            6f,\n            2f\n        )\n    }\n\n    // calculateScaling tests\n    @Test\n    fun perfectFitScaleDownTest() {\n        assertEquals(\n            FocalPointUtil.calculateScaling(\n                2f,\n                5f,\n                5f,\n                12.5f\n            ),\n            0.4f,\n            eps\n        )\n    }\n\n    @Test\n    fun perfectFitScaleUpTest() {\n        assertEquals(\n            FocalPointUtil.calculateScaling(\n                2f,\n                5f,\n                1f,\n                2.5f\n            ),\n            2f,\n            eps\n        )\n    }\n\n    @Test\n    fun verticalCropScaleUpTest() {\n        assertEquals(\n            FocalPointUtil.calculateScaling(\n                2f,\n                1f,\n                1f,\n                2f\n            ),\n            2f,\n            eps\n        )\n    }\n\n    @Test\n    fun verticalCropScaleDownTest() {\n        assertEquals(\n            FocalPointUtil.calculateScaling(\n                4f,\n                3f,\n                8f,\n                24f\n            ),\n            0.5f,\n            eps\n        )\n    }\n\n    @Test\n    fun horizontalCropScaleUpTest() {\n        assertEquals(\n            FocalPointUtil.calculateScaling(\n                1f,\n                2f,\n                2f,\n                1f\n            ),\n            2f,\n            eps\n        )\n    }\n\n    @Test\n    fun horizontalCropScaleDownTest() {\n        assertEquals(\n            FocalPointUtil.calculateScaling(\n                3f,\n                4f,\n                24f,\n                8f\n            ),\n            0.5f,\n            eps\n        )\n    }\n\n    // focalOffset tests\n    @Test\n    fun toLowFocalOffsetTest() {\n        assertEquals(\n            FocalPointUtil.focalOffset(2f, 8f, 1f, 0.05f),\n            0f,\n            eps\n        )\n    }\n\n    @Test\n    fun toHighFocalOffsetTest() {\n        assertEquals(\n            FocalPointUtil.focalOffset(2f, 4f, 2f, 0.95f),\n            -6f,\n            eps\n        )\n    }\n\n    @Test\n    fun possibleFocalOffsetTest() {\n        assertEquals(\n            FocalPointUtil.focalOffset(2f, 4f, 2f, 0.7f),\n            -4.6f,\n            eps\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/MainActivityTest.kt",
    "content": "package com.keylesspalace.tusky\n\nimport android.app.Activity\nimport android.app.NotificationManager\nimport android.content.ComponentName\nimport android.content.Intent\nimport androidx.lifecycle.viewmodel.initializer\nimport androidx.lifecycle.viewmodel.viewModelFactory\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.platform.app.InstrumentationRegistry\nimport androidx.viewpager2.widget.ViewPager2\nimport androidx.work.testing.WorkManagerTestInitHelper\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.components.accountlist.AccountListActivity\nimport com.keylesspalace.tusky.components.systemnotifications.NotificationService\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.entity.Account\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.entity.TimelineAccount\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.util.getSerializableExtraCompat\nimport java.util.Date\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.kotlin.doReturn\nimport org.mockito.kotlin.mock\nimport org.robolectric.Robolectric\nimport org.robolectric.Shadows.shadowOf\nimport org.robolectric.android.util.concurrent.BackgroundExecutor.runInBackground\nimport org.robolectric.annotation.Config\n\n@Config(sdk = [28])\n@RunWith(AndroidJUnit4::class)\nclass MainActivityTest {\n\n    private val context = InstrumentationRegistry.getInstrumentation().targetContext\n    private val account = Account(\n        id = \"1\",\n        localUsername = \"\",\n        username = \"\",\n        displayName = \"\",\n        createdAt = Date(),\n        note = \"\",\n        url = \"\",\n        avatar = \"\",\n        header = \"\"\n    )\n    private val accountEntity = AccountEntity(\n        id = 1,\n        domain = \"test.domain\",\n        accessToken = \"fakeToken\",\n        clientId = \"fakeId\",\n        clientSecret = \"fakeSecret\",\n        isActive = true\n    )\n\n    @Before\n    fun setup() {\n        WorkManagerTestInitHelper.initializeTestWorkManager(context)\n    }\n\n    @After\n    fun teardown() {\n        WorkManagerTestInitHelper.closeWorkDatabase()\n    }\n\n    @Test\n    fun `clicking notification of type FOLLOW shows notification tab`() {\n        val intent = showNotification(Notification.Type.Follow)\n\n        val activity = startMainActivity(intent)\n        val currentTab = activity.findViewById<ViewPager2>(R.id.viewPager).currentItem\n\n        val notificationTab = defaultTabs().indexOfFirst { it.id == NOTIFICATIONS }\n\n        assertEquals(currentTab, notificationTab)\n    }\n\n    @Test\n    fun `clicking notification of type FOLLOW_REQUEST shows follow requests`() {\n        val intent = showNotification(Notification.Type.FollowRequest)\n\n        val activity = startMainActivity(intent)\n        val nextActivity = shadowOf(activity).peekNextStartedActivity()\n\n        assertNotNull(nextActivity)\n        assertEquals(ComponentName(context, AccountListActivity::class.java.name), nextActivity.component)\n        assertEquals(AccountListActivity.Type.FOLLOW_REQUESTS, nextActivity.getSerializableExtraCompat(\"type\"))\n    }\n\n    private fun showNotification(type: Notification.Type): Intent {\n        val notificationManager = context.getSystemService(NotificationManager::class.java)\n        val shadowNotificationManager = shadowOf(notificationManager)\n\n        val notificationService = NotificationService(\n            notificationManager,\n            mock {\n                on { areNotificationsEnabled() } doReturn true\n            },\n            mock(),\n            mock(),\n            context,\n            mock(),\n        )\n\n        notificationService.createNotificationChannelsForAccount(accountEntity)\n\n        runInBackground {\n            val notification = notificationService.createBaseNotification(\n                Notification(\n                    type = type,\n                    id = \"id\",\n                    account = TimelineAccount(\n                        id = \"1\",\n                        localUsername = \"connyduck\",\n                        username = \"connyduck@mastodon.example\",\n                        displayName = \"Conny Duck\",\n                        note = \"This is their bio\",\n                        url = \"https://mastodon.example/@ConnyDuck\",\n                        avatar = \"https://mastodon.example/system/accounts/avatars/000/150/486/original/ab27d7ddd18a10ea.jpg\"\n                    ),\n                    status = null,\n                    report = null\n                ),\n                accountEntity\n            )\n            notificationManager.notify(\"id\", 1, notification)\n        }\n\n        val notification = shadowNotificationManager.allNotifications.first()\n        return shadowOf(notification.contentIntent).savedIntent\n    }\n\n    private fun startMainActivity(intent: Intent): Activity {\n        val controller = Robolectric.buildActivity(MainActivity::class.java, intent)\n        val activity = controller.get()\n        val eventHub = EventHub()\n        activity.eventHub = eventHub\n        val accountManager: AccountManager = mock {\n            on { accounts } doReturn listOf(accountEntity)\n            on { accountsFlow } doReturn MutableStateFlow(listOf(accountEntity))\n            on { activeAccount } doReturn accountEntity\n        }\n        activity.accountManager = accountManager\n        activity.draftsAlert = mock { }\n        val api: MastodonApi = mock {\n            onBlocking { accountVerifyCredentials() } doReturn NetworkResult.success(account)\n            onBlocking { announcements() } doReturn NetworkResult.success(emptyList())\n        }\n        activity.mastodonApi = api\n        activity.preferences = mock(defaultAnswer = {\n            when (it.method.returnType) {\n                String::class.java -> \"test\"\n                Boolean::class.java -> false\n                else -> null\n            }\n        })\n        val viewModel = MainViewModel(\n            api = api,\n            eventHub = eventHub,\n            accountManager = accountManager,\n            shareShortcutHelper = mock(),\n            notificationService = mock(),\n        )\n        val testViewModelFactory = viewModelFactory {\n            initializer { viewModel }\n        }\n        activity.viewModelProviderFactory = testViewModelFactory\n\n        controller.create().start()\n        return activity\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/SpanUtilsTest.kt",
    "content": "package com.keylesspalace.tusky\n\nimport android.text.Spannable\nimport com.keylesspalace.tusky.util.FoundMatchType\nimport com.keylesspalace.tusky.util.MENTION_PATTERN_STRING\nimport com.keylesspalace.tusky.util.PatternFinder\nimport com.keylesspalace.tusky.util.TAG_PATTERN_STRING\nimport com.keylesspalace.tusky.util.highlightSpans\nimport com.keylesspalace.tusky.util.twittertext.Regex\nimport java.util.regex.Pattern\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\n\n/** The [Pattern.UNICODE_CHARACTER_CLASS] flag is not supported on Android, on Android it is just always on.\n * Since thesse tests run on a regular Jvm, we need a to set this flag or they would behave differently.\n * */\nprivate val urlPattern = Regex.VALID_URL_PATTERN_STRING.toPattern(Pattern.CASE_INSENSITIVE or Pattern.UNICODE_CHARACTER_CLASS)\nprivate val tagPattern = TAG_PATTERN_STRING.toPattern(Pattern.CASE_INSENSITIVE or Pattern.UNICODE_CHARACTER_CLASS)\nprivate val mentionPattern = MENTION_PATTERN_STRING.toPattern(Pattern.CASE_INSENSITIVE or Pattern.UNICODE_CHARACTER_CLASS)\n\nval finders = listOf(\n    PatternFinder(\"http\", FoundMatchType.HTTPS_URL, urlPattern),\n    PatternFinder(\"#\", FoundMatchType.TAG, tagPattern),\n    PatternFinder(\"@\", FoundMatchType.MENTION, mentionPattern)\n)\n\n@RunWith(Parameterized::class)\nclass SpanUtilsTest(\n    private val stringToHighlight: String,\n    private val highlights: List<Pair<Int, Int>>\n) {\n\n    companion object {\n        @Parameterized.Parameters(name = \"{0}\")\n        @JvmStatic\n        fun data() = listOf(\n            arrayOf(\"@mention\", listOf(0 to 8)),\n            arrayOf(\"@mention@server.com\", listOf(0 to 19)),\n            arrayOf(\"#tag\", listOf(0 to 4)),\n            arrayOf(\"#tåg\", listOf(0 to 4)),\n            arrayOf(\"https://thr.ee/meh?foo=bar&wat=@at#hmm\", listOf(0 to 38)),\n            arrayOf(\"http://thr.ee/meh?foo=bar&wat=@at#hmm\", listOf(0 to 37)),\n            arrayOf(\n                \"one #one two: @two three : https://thr.ee/meh?foo=bar&wat=@at#hmm four #four five @five 6 #six\",\n                listOf(4 to 8, 14 to 18, 27 to 65, 71 to 76, 82 to 87, 90 to 94)\n            ),\n            arrayOf(\"http://first.link https://second.link\", listOf(0 to 17, 18 to 37)),\n            arrayOf(\"#test\", listOf(0 to 5)),\n            arrayOf(\" #AfterSpace\", listOf(1 to 12)),\n            arrayOf(\"#BeforeSpace \", listOf(0 to 12)),\n            arrayOf(\"@#after_at\", listOf(1 to 10)),\n            arrayOf(\"あいうえお#after_hiragana\", listOf<Pair<Int, Int>>()),\n            arrayOf(\"##DoubleHash\", listOf(1 to 12)),\n            arrayOf(\"###TripleHash\", listOf(2 to 13)),\n            arrayOf(\"something#notAHashtag\", listOf<Pair<Int, Int>>()),\n            arrayOf(\"test##maybeAHashtag\", listOf(5 to 19)),\n            arrayOf(\"testhttp://not.a.url.com\", listOf<Pair<Int, Int>>()),\n            arrayOf(\"test@notAMention\", listOf<Pair<Int, Int>>()),\n            arrayOf(\"test@notAMention#notAHashtag\", listOf<Pair<Int, Int>>()),\n            arrayOf(\"test@notAMention@server.com\", listOf<Pair<Int, Int>>()),\n            // Mastodon will not highlight this mention, although it would be valid according to their regex\n            // arrayOf(\"@test@notAMention@server.com\", listOf<Pair<Int, Int>>()),\n            arrayOf(\"testhttps://not.a.url.com\", listOf<Pair<Int, Int>>()),\n            arrayOf(\"#hashtag1\", listOf(0 to 9)),\n            arrayOf(\"#1hashtag\", listOf(0 to 9)),\n            arrayOf(\"#サイクリング\", listOf(0 to 7)),\n            arrayOf(\"#自転車に乗る\", listOf(0 to 7)),\n            arrayOf(\"(#test)\", listOf(1 to 6)),\n            arrayOf(\")#test(\", listOf<Pair<Int, Int>>()),\n            arrayOf(\"{#test}\", listOf(1 to 6)),\n            arrayOf(\"[#test]\", listOf(1 to 6)),\n            arrayOf(\"}#test{\", listOf(1 to 6)),\n            arrayOf(\"]#test[\", listOf(1 to 6)),\n            arrayOf(\"<#test>\", listOf(1 to 6)),\n            arrayOf(\">#test<\", listOf(1 to 6)),\n            arrayOf(\"((#Test))\", listOf(2 to 7)),\n            arrayOf(\"((##Te)st)\", listOf(3 to 6)),\n            arrayOf(\"[@ConnyDuck]\", listOf(1 to 11)),\n            arrayOf(\"(@ConnyDuck)\", listOf(1 to 11)),\n            arrayOf(\"(@ConnyDuck@chaos.social)\", listOf(1 to 24)),\n            arrayOf(\"Test(https://test.xyz/blubb(test)))))))))))\", listOf(5 to 33)),\n            arrayOf(\"Test https://test.xyz/blubb(test)))))))))))\", listOf(5 to 33)),\n            arrayOf(\"Test https://test.xyz/blubbtest)))))))))))\", listOf(5 to 31)),\n            arrayOf(\"#https://test.com\", listOf(0 to 6)),\n            arrayOf(\"#https://t\", listOf(0 to 6)),\n            arrayOf(\"(https://blubb.com\", listOf(1 to 18)),\n            arrayOf(\"https://example.com/path#anchor\", listOf(0 to 31)),\n            arrayOf(\"test httpx2345://wrong.protocol.com\", listOf<Pair<Int, Int>>()),\n            arrayOf(\"test https://nonexistent.topleveldomain.testtest\", listOf<Pair<Int, Int>>()),\n            arrayOf(\"test https://example.com:1234 domain with port\", listOf(5 to 29)),\n            arrayOf(\"http://1.1.1.1\", listOf<Pair<Int, Int>>()),\n            arrayOf(\"http://foo.bar/?q=Test%20URL-encoded%20stuff\", listOf(0 to 44)),\n            arrayOf(\"http://userid:password@example.com\", listOf<Pair<Int, Int>>()),\n            arrayOf(\"http://userid@example.com\", listOf<Pair<Int, Int>>()),\n            arrayOf(\"http://foo.com/blah_blah_(brackets)_(again)\", listOf(0 to 43)),\n            arrayOf(\"test example.com/no/protocol\", listOf<Pair<Int, Int>>()),\n            arrayOf(\"protocol only https://\", listOf<Pair<Int, Int>>()),\n            arrayOf(\"no tld https://test\", listOf<Pair<Int, Int>>()),\n            arrayOf(\"mention in url https://test.com/@test@domain.cat\", listOf(15 to 48)),\n            arrayOf(\"#hash_tag\", listOf(0 to 9)),\n            arrayOf(\"#hashtag_\", listOf(0 to 9)),\n            arrayOf(\"#hashtag_#tag\", listOf(0 to 9, 9 to 13)),\n            arrayOf(\"#hash_tag#tag\", listOf(0 to 9)),\n            arrayOf(\"_#hashtag\", listOf(1 to 9)),\n            arrayOf(\"@@ConnyDuck@chaos.social\", listOf(1 to 24)),\n            arrayOf(\"http://https://connyduck.at\", listOf(7 to 27)),\n            arrayOf(\"https://https://connyduck.at\", listOf(8 to 28)),\n            arrayOf(\"http:// http://connyduck.at\", listOf(8 to 27)),\n            arrayOf(\"https:// https://connyduck.at\", listOf(9 to 29)),\n            arrayOf(\"https:// #test https://connyduck.at\", listOf(9 to 14, 15 to 35)),\n            arrayOf(\"http:// @connyduck http://connyduck.at\", listOf(8 to 18, 19 to 38)),\n            // emojis count as multiple characters\n            arrayOf(\"😜https://connyduck.at\", listOf(2 to 22)),\n            arrayOf(\"😜#tag\", listOf(2 to 6)),\n            arrayOf(\"😜@user@mastodon.example\", listOf(2 to 24)),\n            // case should be ignored on protocols https://github.com/tuskyapp/Tusky/issues/4641\n            arrayOf(\"HTTPS://example.com\", listOf(0 to 19)),\n            arrayOf(\"Http://example.com/test\", listOf(0 to 23)),\n            arrayOf(\"test Https://example.com/test\", listOf(5 to 29)),\n        )\n    }\n\n    @Test\n    fun testHighlighting() {\n        val inputSpannable = FakeSpannable(stringToHighlight)\n        inputSpannable.highlightSpans(0xffffff, finders)\n\n        assertEquals(highlights.size, inputSpannable.spans.size)\n\n        inputSpannable.spans\n            .sortedBy { span -> span.start }\n            .forEachIndexed { index, span ->\n                assertEquals(highlights[index].first, span.start)\n                assertEquals(highlights[index].second, span.end)\n            }\n    }\n}\n\nclass FakeSpannable(private val text: String) : Spannable {\n    val spans = mutableListOf<BoundedSpan>()\n\n    override fun setSpan(what: Any?, start: Int, end: Int, flags: Int) {\n        spans.add(BoundedSpan(what, start, end))\n    }\n\n    @Suppress(\"UNCHECKED_CAST\")\n    override fun <T : Any> getSpans(start: Int, end: Int, type: Class<T>): Array<T> {\n        return spans.filter { it.start >= start && it.end <= end && type.isInstance(it.span) }\n            .map { it.span }\n            .toTypedArray() as Array<T>\n    }\n\n    override fun removeSpan(what: Any?) {\n        spans.removeIf { span -> span.span == what }\n    }\n\n    override fun toString(): String {\n        return text\n    }\n\n    override val length: Int\n        get() = text.length\n\n    class BoundedSpan(val span: Any?, val start: Int, val end: Int)\n\n    override fun nextSpanTransition(start: Int, limit: Int, type: Class<*>?): Int {\n        throw NotImplementedError()\n    }\n\n    override fun getSpanEnd(tag: Any?): Int {\n        throw NotImplementedError()\n    }\n\n    override fun getSpanFlags(tag: Any?): Int {\n        throw NotImplementedError()\n    }\n\n    override fun get(index: Int): Char {\n        return text[index]\n    }\n\n    override fun subSequence(startIndex: Int, endIndex: Int): CharSequence {\n        return text.subSequence(startIndex, endIndex)\n    }\n\n    override fun getSpanStart(tag: Any?): Int {\n        throw NotImplementedError()\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/StatusComparisonTest.kt",
    "content": "package com.keylesspalace.tusky\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.keylesspalace.tusky.di.NetworkModule\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport com.squareup.moshi.adapter\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.annotation.Config\n\n@Config(sdk = [34])\n@RunWith(AndroidJUnit4::class)\nclass StatusComparisonTest {\n\n    @Test\n    fun `two equal statuses - should be equal`() {\n        assertEquals(createStatus(), createStatus())\n    }\n\n    @Test\n    fun `status with different id - should not be equal`() {\n        assertNotEquals(createStatus(), createStatus(id = \"987654321\"))\n    }\n\n    @Test\n    fun `status with different content - should not be equal`() {\n        val content: String = \"\"\"\n            \\u003cp\\u003e\\u003cspan class=\\\"h-card\\\"\\u003e\\u003ca href=\\\"https://mastodon.social/@ConnyDuck\\\" class=\\\"u-url mention\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"\\u003e@\\u003cspan\\u003eConnyDuck@mastodon.social\\u003c/span\\u003e\\u003c/a\\u003e\\u003c/span\\u003e 123\\u003c/p\\u003e\n        \"\"\".trimIndent()\n        assertNotEquals(createStatus(), createStatus(content = content))\n    }\n\n    @Test\n    fun `accounts with different notes in json - should not be equal`() {\n        assertNotEquals(createStatus(note = \"Test\"), createStatus(note = \"Test 123456\"))\n    }\n\n    private val moshi = NetworkModule.providesMoshi()\n\n    @Test\n    fun `two equal status view data - should be equal`() {\n        val viewdata1 = StatusViewData.Concrete(\n            status = createStatus(),\n            isExpanded = false,\n            isShowingContent = false,\n            isCollapsed = false\n        )\n        val viewdata2 = StatusViewData.Concrete(\n            status = createStatus(),\n            isExpanded = false,\n            isShowingContent = false,\n            isCollapsed = false\n        )\n        assertEquals(viewdata1, viewdata2)\n    }\n\n    @Test\n    fun `status view data with different isExpanded - should not be equal`() {\n        val viewdata1 = StatusViewData.Concrete(\n            status = createStatus(),\n            isExpanded = true,\n            isShowingContent = false,\n            isCollapsed = false\n        )\n        val viewdata2 = StatusViewData.Concrete(\n            status = createStatus(),\n            isExpanded = false,\n            isShowingContent = false,\n            isCollapsed = false\n        )\n        assertNotEquals(viewdata1, viewdata2)\n    }\n\n    @Test\n    fun `status view data with different statuses- should not be equal`() {\n        val viewdata1 = StatusViewData.Concrete(\n            status = createStatus(content = \"whatever\"),\n            isExpanded = true,\n            isShowingContent = false,\n            isCollapsed = false\n        )\n        val viewdata2 = StatusViewData.Concrete(\n            status = createStatus(),\n            isExpanded = false,\n            isShowingContent = false,\n            isCollapsed = false\n        )\n        assertNotEquals(viewdata1, viewdata2)\n    }\n\n    @OptIn(ExperimentalStdlibApi::class)\n    private fun createStatus(\n        id: String = \"123456\",\n        content: String = \"\"\"\n            \\u003cp\\u003e\\u003cspan class=\\\"h-card\\\"\\u003e\\u003ca href=\\\"https://mastodon.social/@ConnyDuck\\\" class=\\\"u-url mention\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"\\u003e@\\u003cspan\\u003eConnyDuck@mastodon.social\\u003c/span\\u003e\\u003c/a\\u003e\\u003c/span\\u003e Hi\\u003c/p\\u003e\n        \"\"\".trimIndent(),\n        note: String = \"\"\n    ): Status {\n        val statusJson = \"\"\"\n            {\n                \"id\": \"$id\",\n                \"created_at\": \"2022-02-26T09:54:45.000Z\",\n                \"in_reply_to_id\": null,\n                \"in_reply_to_account_id\": null,\n                \"sensitive\": false,\n                \"spoiler_text\": \"\",\n                \"visibility\": \"public\",\n                \"language\": null,\n                \"uri\": \"https://pixelfed.social/p/connyduck/403124983655733325\",\n                \"url\": \"https://pixelfed.social/p/connyduck/403124983655733325\",\n                \"replies_count\": 3,\n                \"reblogs_count\": 28,\n                \"favourites_count\": 6,\n                \"edited_at\": null,\n                \"favourited\": true,\n                \"reblogged\": false,\n                \"muted\": false,\n                \"bookmarked\": false,\n                \"content\": \"$content\",\n                \"reblog\": null,\n                \"account\": {\n                    \"id\": \"419352\",\n                    \"username\": \"connyduck\",\n                    \"acct\": \"connyduck@pixelfed.social\",\n                    \"display_name\": \"Conny Duck\",\n                    \"locked\": false,\n                    \"bot\": false,\n                    \"discoverable\": false,\n                    \"group\": false,\n                    \"created_at\": \"2018-08-14T00:00:00.000Z\",\n                    \"note\": \"$note\",\n                    \"url\": \"https://pixelfed.social/connyduck\",\n                    \"avatar\": \"https://files.mastodon.social/cache/accounts/avatars/000/419/352/original/31ce660c53962e0c.jpeg\",\n                    \"avatar_static\": \"https://files.mastodon.social/cache/accounts/avatars/000/419/352/original/31ce660c53962e0c.jpeg\",\n                    \"header\": \"https://mastodon.social/headers/original/missing.png\",\n                    \"header_static\": \"https://mastodon.social/headers/original/missing.png\",\n                    \"followers_count\": 2,\n                    \"following_count\": 0,\n                    \"statuses_count\": 70,\n                    \"last_status_at\": \"2022-03-07\",\n                    \"emojis\": [],\n                    \"fields\": []\n                },\n                \"media_attachments\": [\n                    {\n                        \"id\": \"107863694400783337\",\n                        \"type\": \"image\",\n                        \"url\": \"https://files.mastodon.social/cache/media_attachments/files/107/863/694/400/783/337/original/71c5bad1756bbc8f.jpg\",\n                        \"preview_url\": \"https://files.mastodon.social/cache/media_attachments/files/107/863/694/400/783/337/small/71c5bad1756bbc8f.jpg\",\n                        \"remote_url\": \"https://pixelfed-prod.nyc3.cdn.digitaloceanspaces.com/public/m/_v2/1138/affc38a2b-1c5f41/JRKoMNoj6dKa/9mXs0Fetvj4KwRbKypt8C1PZNVd7d3dQqod4roLZ.jpg\",\n                        \"preview_remote_url\": null,\n                        \"text_url\": null,\n                        \"meta\": {\n                            \"original\": {\n                                \"width\": 1371,\n                                \"height\": 1080,\n                                \"size\": \"1371x1080\",\n                                \"aspect\": 1.2694444444444444\n                            },\n                            \"small\": {\n                                \"width\": 451,\n                                \"height\": 355,\n                                \"size\": \"451x355\",\n                                \"aspect\": 1.2704225352112677\n                            }\n                        },\n                        \"description\": \"Oilpainting of a kingfisher, photographed on my easel\",\n                        \"blurhash\": \"UUG91|?wxHV@WTkDs.V?xZa_I:WBNFR*WBRk\"\n                    },\n                    {\n                        \"id\": \"107863694727565058\",\n                        \"type\": \"image\",\n                        \"url\": \"https://files.mastodon.social/cache/media_attachments/files/107/863/694/727/565/058/original/68daef05be7ac6b6.jpg\",\n                        \"preview_url\": \"https://files.mastodon.social/cache/media_attachments/files/107/863/694/727/565/058/small/68daef05be7ac6b6.jpg\",\n                        \"remote_url\": \"https://pixelfed-prod.nyc3.cdn.digitaloceanspaces.com/public/m/_v2/1138/affc38a2b-1c5f41/nBVJUnrEIjfO/M6i8GSP44Iv230KWXnMpvVobOqASXY3EkImyxySS.jpg\",\n                        \"preview_remote_url\": null,\n                        \"text_url\": null,\n                        \"meta\": {\n                            \"original\": {\n                                \"width\": 1087,\n                                \"height\": 1080,\n                                \"size\": \"1087x1080\",\n                                \"aspect\": 1.0064814814814815\n                            },\n                            \"small\": {\n                                \"width\": 401,\n                                \"height\": 398,\n                                \"size\": \"401x398\",\n                                \"aspect\": 1.0075376884422111\n                            }\n                        },\n                        \"description\": \"Oilpainting of a kingfisher\",\n                        \"blurhash\": \"U89u4pPJ4:SoJ6NNnkoxoBtSx0Von-RiNgt8\"\n                    }\n                ],\n                \"mentions\": [],\n                \"tags\": [],\n                \"emojis\": [],\n                \"card\": null,\n                \"poll\": null\n            }\n        \"\"\".trimIndent()\n        return moshi.adapter<Status>().fromJson(statusJson)!!\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/StringUtilsTest.kt",
    "content": "package com.keylesspalace.tusky\n\nimport com.keylesspalace.tusky.util.isLessThan\nimport com.keylesspalace.tusky.util.isLessThanOrEqual\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Test\n\nclass StringUtilsTest {\n    @Test\n    fun isLessThan() {\n        val lessList = listOf(\n            \"abc\" to \"bcd\",\n            \"ab\" to \"abc\",\n            \"cb\" to \"abc\",\n            \"1\" to \"2\"\n        )\n        lessList.forEach { (l, r) -> assertTrue(\"$l < $r\", l.isLessThan(r)) }\n        val notLessList = lessList.map { (l, r) -> r to l } + listOf(\n            \"abc\" to \"abc\"\n        )\n        notLessList.forEach { (l, r) -> assertFalse(\"not $l < $r\", l.isLessThan(r)) }\n    }\n\n    @Test\n    fun isLessThanOrEqual() {\n        val lessList = listOf(\n            \"abc\" to \"bcd\",\n            \"ab\" to \"abc\",\n            \"cb\" to \"abc\",\n            \"1\" to \"2\",\n            \"abc\" to \"abc\"\n        )\n        lessList.forEach { (l, r) -> assertTrue(\"$l < $r\", l.isLessThanOrEqual(r)) }\n        val notLessList = lessList.filterNot { (l, r) -> l == r }.map { (l, r) -> r to l }\n        notLessList.forEach { (l, r) -> assertFalse(\"not $l < $r\", l.isLessThanOrEqual(r)) }\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/TuskyApplication.kt",
    "content": "/* Copyright 2020 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky\n\nimport android.app.Application\nimport android.content.SharedPreferences\nimport com.keylesspalace.tusky.di.PreferencesEntryPoint\nimport dagger.hilt.internal.GeneratedComponent\nimport de.c1710.filemojicompat_defaults.DefaultEmojiPackList\nimport de.c1710.filemojicompat_ui.helpers.EmojiPackHelper\nimport org.mockito.kotlin.mock\n\n// override TuskyApplication for Robolectric tests, only initialize the necessary stuff\nclass TuskyApplication : Application(), PreferencesEntryPoint, GeneratedComponent {\n\n    override fun onCreate() {\n        super.onCreate()\n        EmojiPackHelper.init(this, DefaultEmojiPackList.get(this))\n    }\n\n    override fun preferences(): SharedPreferences = mock {}\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/components/compose/ComposeActivityTest.kt",
    "content": "/*\n * Copyright 2018 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.components.compose\n\nimport android.content.Intent\nimport android.os.Looper.getMainLooper\nimport android.widget.EditText\nimport androidx.lifecycle.viewmodel.initializer\nimport androidx.lifecycle.viewmodel.viewModelFactory\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.components.instanceinfo.InstanceInfoRepository\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.dao.InstanceDao\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.db.entity.EmojisEntity\nimport com.keylesspalace.tusky.db.entity.InstanceInfoEntity\nimport com.keylesspalace.tusky.di.NetworkModule\nimport com.keylesspalace.tusky.entity.Instance\nimport com.keylesspalace.tusky.entity.InstanceConfiguration\nimport com.keylesspalace.tusky.entity.InstanceV1\nimport com.keylesspalace.tusky.entity.SearchResult\nimport com.keylesspalace.tusky.entity.StatusConfiguration\nimport com.keylesspalace.tusky.finders\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.squareup.moshi.adapter\nimport java.util.Locale\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport okhttp3.ResponseBody\nimport okhttp3.ResponseBody.Companion.toResponseBody\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.kotlin.any\nimport org.mockito.kotlin.anyOrNull\nimport org.mockito.kotlin.doReturn\nimport org.mockito.kotlin.mock\nimport org.robolectric.Robolectric\nimport org.robolectric.Shadows.shadowOf\nimport org.robolectric.annotation.Config\nimport org.robolectric.fakes.RoboMenuItem\nimport retrofit2.HttpException\nimport retrofit2.Response\n\n/**\n * Created by charlag on 3/7/18.\n */\n\n@Config(sdk = [34])\n@RunWith(AndroidJUnit4::class)\nclass ComposeActivityTest {\n    private lateinit var activity: ComposeActivity\n    private lateinit var accountManagerMock: AccountManager\n    private lateinit var apiMock: MastodonApi\n\n    private val instanceDomain = \"example.domain\"\n\n    private val account = AccountEntity(\n        id = 1,\n        domain = instanceDomain,\n        accessToken = \"token\",\n        clientId = \"id\",\n        clientSecret = \"secret\",\n        isActive = true,\n        accountId = \"1\",\n        username = \"username\",\n        displayName = \"Display Name\",\n        profilePictureUrl = \"\",\n        notificationsEnabled = true,\n        notificationsMentioned = true,\n        notificationsFollowed = true,\n        notificationsFollowRequested = false,\n        notificationsReblogged = true,\n        notificationsFavorited = true,\n        notificationSound = true,\n        notificationVibration = true,\n        notificationLight = true\n    )\n    private var instanceV1ResponseCallback: (() -> InstanceV1)? = null\n    private var instanceResponseCallback: (() -> Instance)? = null\n    private var composeOptions: ComposeActivity.ComposeOptions? = null\n    private val moshi = NetworkModule.providesMoshi()\n\n    @Before\n    fun setupActivity() {\n        val controller = Robolectric.buildActivity(ComposeActivity::class.java)\n        activity = controller.get()\n\n        accountManagerMock = mock {\n            on { accounts } doReturn listOf(account)\n            on { accountsFlow } doReturn MutableStateFlow(listOf(account))\n            on { activeAccount } doReturn account\n        }\n\n        apiMock = mock {\n            onBlocking { getCustomEmojis() } doReturn NetworkResult.success(emptyList())\n            onBlocking { getInstance() } doReturn instanceResponseCallback?.invoke().let { instance ->\n                if (instance == null) {\n                    NetworkResult.failure(HttpException(Response.error<ResponseBody>(404, \"Not found\".toResponseBody())))\n                } else {\n                    NetworkResult.success(instance)\n                }\n            }\n            onBlocking { getInstanceV1() } doReturn instanceV1ResponseCallback?.invoke().let { instance ->\n                if (instance == null) {\n                    NetworkResult.failure(Throwable())\n                } else {\n                    NetworkResult.success(instance)\n                }\n            }\n            onBlocking { search(anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull()) } doReturn NetworkResult.success(\n                SearchResult(emptyList(), emptyList(), emptyList())\n            )\n        }\n\n        val instanceDaoMock: InstanceDao = mock {\n            onBlocking { getInstanceInfo(any()) } doReturn\n                InstanceInfoEntity(instanceDomain, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null)\n            onBlocking { getEmojiInfo(any()) } doReturn\n                EmojisEntity(instanceDomain, emptyList())\n        }\n\n        val dbMock: AppDatabase = mock {\n            on { instanceDao() } doReturn instanceDaoMock\n        }\n\n        val instanceInfoRepo = InstanceInfoRepository(apiMock, dbMock, accountManagerMock, CoroutineScope(SupervisorJob()))\n\n        val viewModel = ComposeViewModel(\n            apiMock,\n            accountManagerMock,\n            mock(),\n            mock(),\n            mock(),\n            instanceInfoRepo\n        )\n        activity.intent = Intent(activity, ComposeActivity::class.java).apply {\n            putExtra(ComposeActivity.COMPOSE_OPTIONS_EXTRA, composeOptions)\n        }\n\n        val testViewModelFactory = viewModelFactory {\n            initializer { viewModel }\n        }\n\n        activity.accountManager = accountManagerMock\n        activity.viewModelProviderFactory = testViewModelFactory\n\n        activity.preferences = mock(defaultAnswer = {\n            when (it.method.returnType) {\n                String::class.java -> \"test\"\n                Boolean::class.java -> false\n                else -> null\n            }\n        })\n\n        activity.highlightFinders = finders\n\n        controller.create().start()\n        shadowOf(getMainLooper()).idle()\n    }\n\n    @Test\n    fun whenCloseButtonPressedAndEmpty_finish() {\n        clickUp()\n        assertTrue(activity.isFinishing)\n    }\n\n    @Test\n    fun whenCloseButtonPressedNotEmpty_notFinish() {\n        insertSomeTextInContent()\n        clickUp()\n        assertFalse(activity.isFinishing)\n        // We would like to check for dialog but Robolectric doesn't work with AppCompat v7 yet\n    }\n\n    @Test\n    fun whenModifiedInitialState_andCloseButtonPressed_notFinish() {\n        composeOptions = ComposeActivity.ComposeOptions(modifiedInitialState = true)\n        setupActivity()\n        clickUp()\n        assertFalse(activity.isFinishing)\n    }\n\n    @Test\n    fun whenBackButtonPressedAndEmpty_finish() {\n        clickBack()\n        assertTrue(activity.isFinishing)\n    }\n\n    @Test\n    fun whenBackButtonPressedNotEmpty_notFinish() {\n        insertSomeTextInContent()\n        clickBack()\n        assertFalse(activity.isFinishing)\n        // We would like to check for dialog but Robolectric doesn't work with AppCompat v7 yet\n    }\n\n    @Test\n    fun whenModifiedInitialState_andBackButtonPressed_notFinish() {\n        composeOptions = ComposeActivity.ComposeOptions(modifiedInitialState = true)\n        setupActivity()\n        clickBack()\n        assertFalse(activity.isFinishing)\n    }\n\n    @Test\n    fun whenMaximumTootCharsIsNull_defaultLimitIsUsed() {\n        instanceV1ResponseCallback = { getInstanceV1WithCustomConfiguration(null) }\n        setupActivity()\n        assertEquals(InstanceInfoRepository.DEFAULT_CHARACTER_LIMIT, activity.maximumTootCharacters)\n    }\n\n    @Test\n    fun whenMaximumTootCharsIsPopulated_customLimitIsUsed() {\n        val customMaximum = 1000\n        instanceResponseCallback = { getInstanceWithCustomConfiguration(customMaximum) }\n        setupActivity()\n        shadowOf(getMainLooper()).idle()\n        assertEquals(customMaximum, activity.maximumTootCharacters)\n    }\n\n    @Test\n    fun whenOnlyLegacyMaximumTootCharsIsPopulated_customLimitIsUsed() {\n        val customMaximum = 1000\n        instanceV1ResponseCallback = { getInstanceV1WithCustomConfiguration(customMaximum) }\n        setupActivity()\n        shadowOf(getMainLooper()).idle()\n        assertEquals(customMaximum, activity.maximumTootCharacters)\n    }\n\n    @Test\n    fun whenOnlyConfigurationMaximumTootCharsIsPopulated_customLimitIsUsed() {\n        val customMaximum = 1000\n        instanceV1ResponseCallback = { getInstanceV1WithCustomConfiguration(null, getCustomInstanceConfiguration(maximumStatusCharacters = customMaximum)) }\n        setupActivity()\n        shadowOf(getMainLooper()).idle()\n        assertEquals(customMaximum, activity.maximumTootCharacters)\n    }\n\n    @Test\n    fun whenDifferentCharLimitsArePopulated_statusConfigurationLimitIsUsed() {\n        val customMaximum = 1000\n        instanceV1ResponseCallback = { getInstanceV1WithCustomConfiguration(customMaximum, getCustomInstanceConfiguration(maximumStatusCharacters = customMaximum * 2)) }\n        setupActivity()\n        shadowOf(getMainLooper()).idle()\n        assertEquals(customMaximum * 2, activity.maximumTootCharacters)\n    }\n\n    @Test\n    fun whenTextContainsNoUrl_everyCharacterIsCounted() {\n        val content = \"This is test content please ignore thx \"\n        insertSomeTextInContent(content)\n        assertEquals(content.length, activity.calculateTextLength())\n    }\n\n    @Test\n    fun whenTextContainsEmoji_emojisAreCountedAsOneCharacter() {\n        val content = \"Test 😜\"\n        insertSomeTextInContent(content)\n        assertEquals(6, activity.calculateTextLength())\n    }\n\n    @Test\n    fun whenTextContainsUrlWithEmoji_ellipsizedUrlIsCountedCorrectly() {\n        val content = \"https://🤪.com\"\n        insertSomeTextInContent(content)\n        assertEquals(InstanceInfoRepository.DEFAULT_CHARACTERS_RESERVED_PER_URL, activity.calculateTextLength())\n    }\n\n    @Test\n    fun whenTextContainsUrl_onlyEllipsizedURLIsCounted() {\n        val url = \"https://www.google.dk/search?biw=1920&bih=990&tbm=isch&sa=1&ei=bmDrWuOoKMv6kwWOkIaoDQ&q=indiana+jones+i+hate+snakes+animated&oq=indiana+jones+i+hate+snakes+animated&gs_l=psy-ab.3...54174.55443.0.55553.9.7.0.0.0.0.255.333.1j0j1.2.0....0...1c.1.64.psy-ab..7.0.0....0.40G-kcDkC6A#imgdii=PSp15hQjN1JqvM:&imgrc=H0hyE2JW5wrpBM\"\n        val additionalContent = \"Check out this @image #search result: \"\n        insertSomeTextInContent(additionalContent + url)\n        assertEquals(additionalContent.length + InstanceInfoRepository.DEFAULT_CHARACTERS_RESERVED_PER_URL, activity.calculateTextLength())\n    }\n\n    @Test\n    fun whenTextContainsShortUrls_allUrlsGetEllipsized() {\n        val shortUrl = \"https://tusky.app\"\n        val url = \"https://www.google.dk/search?biw=1920&bih=990&tbm=isch&sa=1&ei=bmDrWuOoKMv6kwWOkIaoDQ&q=indiana+jones+i+hate+snakes+animated&oq=indiana+jones+i+hate+snakes+animated&gs_l=psy-ab.3...54174.55443.0.55553.9.7.0.0.0.0.255.333.1j0j1.2.0....0...1c.1.64.psy-ab..7.0.0....0.40G-kcDkC6A#imgdii=PSp15hQjN1JqvM:&imgrc=H0hyE2JW5wrpBM\"\n        val additionalContent = \" Check out this @image #search result: \"\n        insertSomeTextInContent(shortUrl + additionalContent + url)\n        assertEquals(additionalContent.length + (InstanceInfoRepository.DEFAULT_CHARACTERS_RESERVED_PER_URL * 2), activity.calculateTextLength())\n    }\n\n    @Test\n    fun whenTextContainsMultipleURLs_allURLsGetEllipsized() {\n        val url = \"https://www.google.dk/search?biw=1920&bih=990&tbm=isch&sa=1&ei=bmDrWuOoKMv6kwWOkIaoDQ&q=indiana+jones+i+hate+snakes+animated&oq=indiana+jones+i+hate+snakes+animated&gs_l=psy-ab.3...54174.55443.0.55553.9.7.0.0.0.0.255.333.1j0j1.2.0....0...1c.1.64.psy-ab..7.0.0....0.40G-kcDkC6A#imgdii=PSp15hQjN1JqvM:&imgrc=H0hyE2JW5wrpBM\"\n        val additionalContent = \" Check out this @image #search result: \"\n        insertSomeTextInContent(url + additionalContent + url)\n        assertEquals(additionalContent.length + (InstanceInfoRepository.DEFAULT_CHARACTERS_RESERVED_PER_URL * 2), activity.calculateTextLength())\n    }\n\n    @Test\n    fun whenTextContainsUrl_onlyEllipsizedURLIsCounted_withCustomConfiguration() {\n        val url = \"https://www.google.dk/search?biw=1920&bih=990&tbm=isch&sa=1&ei=bmDrWuOoKMv6kwWOkIaoDQ&q=indiana+jones+i+hate+snakes+animated&oq=indiana+jones+i+hate+snakes+animated&gs_l=psy-ab.3...54174.55443.0.55553.9.7.0.0.0.0.255.333.1j0j1.2.0....0...1c.1.64.psy-ab..7.0.0....0.40G-kcDkC6A#imgdii=PSp15hQjN1JqvM:&imgrc=H0hyE2JW5wrpBM\"\n        val additionalContent = \"Check out this @image #search result: \"\n        val customUrlLength = 16\n        instanceResponseCallback = { getInstanceWithCustomConfiguration(null, customUrlLength) }\n        setupActivity()\n        shadowOf(getMainLooper()).idle()\n        insertSomeTextInContent(additionalContent + url)\n        assertEquals(additionalContent.length + customUrlLength, activity.calculateTextLength())\n    }\n\n    @Test\n    fun whenTextContainsUrl_onlyEllipsizedURLIsCounted_withCustomConfigurationV1() {\n        val url = \"https://www.google.dk/search?biw=1920&bih=990&tbm=isch&sa=1&ei=bmDrWuOoKMv6kwWOkIaoDQ&q=indiana+jones+i+hate+snakes+animated&oq=indiana+jones+i+hate+snakes+animated&gs_l=psy-ab.3...54174.55443.0.55553.9.7.0.0.0.0.255.333.1j0j1.2.0....0...1c.1.64.psy-ab..7.0.0....0.40G-kcDkC6A#imgdii=PSp15hQjN1JqvM:&imgrc=H0hyE2JW5wrpBM\"\n        val additionalContent = \"Check out this @image #search result: \"\n        val customUrlLength = 16\n        instanceV1ResponseCallback = { getInstanceV1WithCustomConfiguration(configuration = getCustomInstanceConfiguration(charactersReservedPerUrl = customUrlLength)) }\n        setupActivity()\n        shadowOf(getMainLooper()).idle()\n        insertSomeTextInContent(additionalContent + url)\n        assertEquals(additionalContent.length + customUrlLength, activity.calculateTextLength())\n    }\n\n    @Test\n    fun whenTextContainsShortUrls_allUrlsGetEllipsized_withCustomConfiguration() {\n        val shortUrl = \"https://tusky.app\"\n        val url = \"https://www.google.dk/search?biw=1920&bih=990&tbm=isch&sa=1&ei=bmDrWuOoKMv6kwWOkIaoDQ&q=indiana+jones+i+hate+snakes+animated&oq=indiana+jones+i+hate+snakes+animated&gs_l=psy-ab.3...54174.55443.0.55553.9.7.0.0.0.0.255.333.1j0j1.2.0....0...1c.1.64.psy-ab..7.0.0....0.40G-kcDkC6A#imgdii=PSp15hQjN1JqvM:&imgrc=H0hyE2JW5wrpBM\"\n        val additionalContent = \" Check out this @image #search result: \"\n        val customUrlLength = 18 // The intention is that this is longer than shortUrl.length\n        instanceResponseCallback = { getInstanceWithCustomConfiguration(null, customUrlLength) }\n        setupActivity()\n        shadowOf(getMainLooper()).idle()\n        insertSomeTextInContent(shortUrl + additionalContent + url)\n        assertEquals(additionalContent.length + (customUrlLength * 2), activity.calculateTextLength())\n    }\n\n    @Test\n    fun whenTextContainsShortUrls_allUrlsGetEllipsized_withCustomConfigurationV1() {\n        val shortUrl = \"https://tusky.app\"\n        val url = \"https://www.google.dk/search?biw=1920&bih=990&tbm=isch&sa=1&ei=bmDrWuOoKMv6kwWOkIaoDQ&q=indiana+jones+i+hate+snakes+animated&oq=indiana+jones+i+hate+snakes+animated&gs_l=psy-ab.3...54174.55443.0.55553.9.7.0.0.0.0.255.333.1j0j1.2.0....0...1c.1.64.psy-ab..7.0.0....0.40G-kcDkC6A#imgdii=PSp15hQjN1JqvM:&imgrc=H0hyE2JW5wrpBM\"\n        val additionalContent = \" Check out this @image #search result: \"\n        val customUrlLength = 18 // The intention is that this is longer than shortUrl.length\n        instanceV1ResponseCallback = { getInstanceV1WithCustomConfiguration(configuration = getCustomInstanceConfiguration(charactersReservedPerUrl = customUrlLength)) }\n        setupActivity()\n        shadowOf(getMainLooper()).idle()\n        insertSomeTextInContent(shortUrl + additionalContent + url)\n        assertEquals(additionalContent.length + (customUrlLength * 2), activity.calculateTextLength())\n    }\n\n    @Test\n    fun whenTextContainsMultipleURLs_allURLsGetEllipsized_withCustomConfiguration() {\n        val url = \"https://www.google.dk/search?biw=1920&bih=990&tbm=isch&sa=1&ei=bmDrWuOoKMv6kwWOkIaoDQ&q=indiana+jones+i+hate+snakes+animated&oq=indiana+jones+i+hate+snakes+animated&gs_l=psy-ab.3...54174.55443.0.55553.9.7.0.0.0.0.255.333.1j0j1.2.0....0...1c.1.64.psy-ab..7.0.0....0.40G-kcDkC6A#imgdii=PSp15hQjN1JqvM:&imgrc=H0hyE2JW5wrpBM\"\n        val additionalContent = \" Check out this @image #search result: \"\n        val customUrlLength = 16\n        instanceResponseCallback = { getInstanceWithCustomConfiguration(null, customUrlLength) }\n        setupActivity()\n        shadowOf(getMainLooper()).idle()\n        insertSomeTextInContent(url + additionalContent + url)\n        assertEquals(additionalContent.length + (customUrlLength * 2), activity.calculateTextLength())\n    }\n\n    @Test\n    fun whenTextContainsMultipleURLs_allURLsGetEllipsized_withCustomConfigurationV1() {\n        val url = \"https://www.google.dk/search?biw=1920&bih=990&tbm=isch&sa=1&ei=bmDrWuOoKMv6kwWOkIaoDQ&q=indiana+jones+i+hate+snakes+animated&oq=indiana+jones+i+hate+snakes+animated&gs_l=psy-ab.3...54174.55443.0.55553.9.7.0.0.0.0.255.333.1j0j1.2.0....0...1c.1.64.psy-ab..7.0.0....0.40G-kcDkC6A#imgdii=PSp15hQjN1JqvM:&imgrc=H0hyE2JW5wrpBM\"\n        val additionalContent = \" Check out this @image #search result: \"\n        val customUrlLength = 16\n        instanceV1ResponseCallback = { getInstanceV1WithCustomConfiguration(configuration = getCustomInstanceConfiguration(charactersReservedPerUrl = customUrlLength)) }\n        setupActivity()\n        shadowOf(getMainLooper()).idle()\n        insertSomeTextInContent(url + additionalContent + url)\n        assertEquals(additionalContent.length + (customUrlLength * 2), activity.calculateTextLength())\n    }\n\n    @Test\n    fun whenSelectionIsEmpty_specialTextIsInsertedAtCaret() {\n        val editor = activity.findViewById<EditText>(R.id.composeEditField)\n        val insertText = \"#\"\n        editor.setText(\"Some text\")\n\n        for (caretIndex in listOf(9, 1, 0)) {\n            editor.setSelection(caretIndex)\n            activity.prependSelectedWordsWith(insertText)\n            // Text should be inserted at caret\n            assertEquals(\"Unexpected value at $caretIndex\", insertText, editor.text.substring(caretIndex, caretIndex + insertText.length))\n\n            // Caret should be placed after inserted text\n            assertEquals(caretIndex + insertText.length, editor.selectionStart)\n            assertEquals(caretIndex + insertText.length, editor.selectionEnd)\n        }\n    }\n\n    @Test\n    fun whenSelectionDoesNotIncludeWordBreak_noSpecialTextIsInserted() {\n        val editor = activity.findViewById<EditText>(R.id.composeEditField)\n        val insertText = \"#\"\n        val originalText = \"Some text\"\n        val selectionStart = 1\n        val selectionEnd = 4\n        editor.setText(originalText)\n        editor.setSelection(selectionStart, selectionEnd) // \"ome\"\n        activity.prependSelectedWordsWith(insertText)\n\n        // Text and selection should be unmodified\n        assertEquals(originalText, editor.text.toString())\n        assertEquals(selectionStart, editor.selectionStart)\n        assertEquals(selectionEnd, editor.selectionEnd)\n    }\n\n    @Test\n    fun whenSelectionIncludesWordBreaks_startsOfAllWordsArePrepended() {\n        val editor = activity.findViewById<EditText>(R.id.composeEditField)\n        val insertText = \"#\"\n        val originalText = \"one two three four\"\n        val selectionStart = 2\n        val originalSelectionEnd = 15\n        val modifiedSelectionEnd = 18\n        editor.setText(originalText)\n        editor.setSelection(selectionStart, originalSelectionEnd) // \"e two three f\"\n        activity.prependSelectedWordsWith(insertText)\n\n        // text should be inserted at word starts inside selection\n        assertEquals(\"one #two #three #four\", editor.text.toString())\n\n        // selection should be expanded accordingly\n        assertEquals(selectionStart, editor.selectionStart)\n        assertEquals(modifiedSelectionEnd, editor.selectionEnd)\n    }\n\n    @Test\n    fun whenSelectionIncludesEnd_textIsNotAppended() {\n        val editor = activity.findViewById<EditText>(R.id.composeEditField)\n        val insertText = \"#\"\n        val originalText = \"Some text\"\n        val selectionStart = 7\n        val selectionEnd = 9\n        editor.setText(originalText)\n        editor.setSelection(selectionStart, selectionEnd) // \"xt\"\n        activity.prependSelectedWordsWith(insertText)\n\n        // Text and selection should be unmodified\n        assertEquals(originalText, editor.text.toString())\n        assertEquals(selectionStart, editor.selectionStart)\n        assertEquals(selectionEnd, editor.selectionEnd)\n    }\n\n    @Test\n    fun whenSelectionIncludesStartAndStartIsAWord_textIsPrepended() {\n        val editor = activity.findViewById<EditText>(R.id.composeEditField)\n        val insertText = \"#\"\n        val originalText = \"Some text\"\n        val selectionStart = 0\n        val selectionEnd = 3\n        editor.setText(originalText)\n        editor.setSelection(selectionStart, selectionEnd) // \"Som\"\n        activity.prependSelectedWordsWith(insertText)\n\n        // Text should be inserted at beginning\n        assert(editor.text.startsWith(insertText))\n\n        // selection should be expanded accordingly\n        assertEquals(selectionStart, editor.selectionStart)\n        assertEquals(selectionEnd + insertText.length, editor.selectionEnd)\n    }\n\n    @Test\n    fun whenSelectionIncludesStartAndStartIsNotAWord_textIsNotPrepended() {\n        val editor = activity.findViewById<EditText>(R.id.composeEditField)\n        val insertText = \"#\"\n        val originalText = \"  Some text\"\n        val selectionStart = 0\n        val selectionEnd = 1\n        editor.setText(originalText)\n        editor.setSelection(selectionStart, selectionEnd) // \" \"\n        activity.prependSelectedWordsWith(insertText)\n\n        // Text and selection should be unmodified\n        assertEquals(originalText, editor.text.toString())\n        assertEquals(selectionStart, editor.selectionStart)\n        assertEquals(selectionEnd, editor.selectionEnd)\n    }\n\n    @Test\n    fun whenSelectionBeginsAtWordStart_textIsPrepended() {\n        val editor = activity.findViewById<EditText>(R.id.composeEditField)\n        val insertText = \"#\"\n        val originalText = \"Some text\"\n        val selectionStart = 5\n        val selectionEnd = 9\n        editor.setText(originalText)\n        editor.setSelection(selectionStart, selectionEnd) // \"text\"\n        activity.prependSelectedWordsWith(insertText)\n\n        // Text is prepended\n        assertEquals(\"Some #text\", editor.text.toString())\n\n        // Selection is expanded accordingly\n        assertEquals(selectionStart, editor.selectionStart)\n        assertEquals(selectionEnd + insertText.length, editor.selectionEnd)\n    }\n\n    @Test\n    fun whenSelectionEndsAtWordStart_textIsAppended() {\n        val editor = activity.findViewById<EditText>(R.id.composeEditField)\n        val insertText = \"#\"\n        val originalText = \"Some text\"\n        val selectionStart = 1\n        val selectionEnd = 5\n        editor.setText(originalText)\n        editor.setSelection(selectionStart, selectionEnd) // \"ome \"\n        activity.prependSelectedWordsWith(insertText)\n\n        // Text is prepended\n        assertEquals(\"Some #text\", editor.text.toString())\n\n        // Selection is expanded accordingly\n        assertEquals(selectionStart, editor.selectionStart)\n        assertEquals(selectionEnd + insertText.length, editor.selectionEnd)\n    }\n\n    @Test\n    fun whenNoLanguageIsGiven_defaultLanguageIsSelected() {\n        assertEquals(Locale.getDefault().language, activity.selectedLanguage)\n    }\n\n    @Test\n    fun languageGivenInComposeOptionsIsRespected() {\n        val language = \"no\"\n        composeOptions = ComposeActivity.ComposeOptions(language = language)\n        setupActivity()\n        assertEquals(language, activity.selectedLanguage)\n    }\n\n    @Test\n    fun modernLanguageCodeIsUsed() {\n        // https://github.com/tuskyapp/Tusky/issues/2903\n        // \"ji\" was deprecated in favor of \"yi\"\n        composeOptions = ComposeActivity.ComposeOptions(language = \"ji\")\n        setupActivity()\n        assertEquals(\"yi\", activity.selectedLanguage)\n    }\n\n    @Test\n    fun unknownLanguageGivenInComposeOptionsIsRespected() {\n        val language = \"zzz\"\n        composeOptions = ComposeActivity.ComposeOptions(language = language)\n        setupActivity()\n        assertEquals(language, activity.selectedLanguage)\n    }\n\n    @Test\n    fun sampleFriendicaInstanceResponseIsDeserializable() {\n        // https://github.com/tuskyapp/Tusky/issues/4100\n        instanceResponseCallback = { getSampleFriendicaInstance() }\n        setupActivity()\n        shadowOf(getMainLooper()).idle()\n        assertEquals(FRIENDICA_MAXIMUM, activity.maximumTootCharacters)\n    }\n\n    private fun clickUp() {\n        val menuItem = RoboMenuItem(android.R.id.home)\n        activity.onOptionsItemSelected(menuItem)\n    }\n\n    private fun clickBack() {\n        activity.onBackPressedDispatcher.onBackPressed()\n    }\n\n    private fun insertSomeTextInContent(text: String? = null) {\n        activity.findViewById<EditText>(R.id.composeEditField).setText(text ?: \"Some text\")\n    }\n\n    private fun getInstanceWithCustomConfiguration(maximumStatusCharacters: Int? = null, charactersReservedPerUrl: Int? = null): Instance {\n        return Instance(\n            domain = \"https://example.token\",\n            version = \"2.6.3\",\n            configuration = getConfiguration(maximumStatusCharacters, charactersReservedPerUrl),\n            pleroma = null,\n            rules = emptyList()\n        )\n    }\n\n    private fun getConfiguration(maximumStatusCharacters: Int?, charactersReservedPerUrl: Int?): Instance.Configuration {\n        return Instance.Configuration(\n            Instance.Configuration.Urls(),\n            Instance.Configuration.Accounts(maxFeaturedTags = 1, maxProfileFields = 4),\n            Instance.Configuration.Statuses(\n                maximumStatusCharacters ?: InstanceInfoRepository.DEFAULT_CHARACTER_LIMIT,\n                InstanceInfoRepository.DEFAULT_MAX_MEDIA_ATTACHMENTS,\n                charactersReservedPerUrl ?: InstanceInfoRepository.DEFAULT_CHARACTERS_RESERVED_PER_URL\n            ),\n            Instance.Configuration.MediaAttachments(0, 0, 0, 0, 0),\n            Instance.Configuration.Polls(0, 0, 0, 0),\n            Instance.Configuration.Translation(false)\n        )\n    }\n\n    private fun getInstanceV1WithCustomConfiguration(maximumLegacyTootCharacters: Int? = null, configuration: InstanceConfiguration? = null): InstanceV1 {\n        return InstanceV1(\n            uri = \"https://example.token\",\n            version = \"2.6.3\",\n            maxTootChars = maximumLegacyTootCharacters,\n            pollConfiguration = null,\n            configuration = configuration,\n            maxMediaAttachments = null,\n            pleroma = null,\n            uploadLimit = null,\n            rules = emptyList()\n        )\n    }\n\n    private fun getCustomInstanceConfiguration(maximumStatusCharacters: Int? = null, charactersReservedPerUrl: Int? = null): InstanceConfiguration {\n        return InstanceConfiguration(\n            statuses = StatusConfiguration(\n                maxCharacters = maximumStatusCharacters,\n                maxMediaAttachments = null,\n                charactersReservedPerUrl = charactersReservedPerUrl\n            ),\n            mediaAttachments = null,\n            polls = null\n        )\n    }\n\n    @OptIn(ExperimentalStdlibApi::class)\n    private fun getSampleFriendicaInstance(): Instance {\n        return moshi.adapter<Instance>().fromJson(sampleFriendicaResponse)!!\n    }\n\n    companion object {\n        private const val FRIENDICA_MAXIMUM = 200000\n\n        // https://github.com/tuskyapp/Tusky/issues/4100\n        private val sampleFriendicaResponse = \"\"\"{\n                \"domain\": \"loma.ml\",\n                \"title\": \"[ˈloma]\",\n                \"version\": \"2.8.0 (compatible; Friendica 2023.09-rc)\",\n                \"source_url\": \"https://git.friendi.ca/friendica/friendica\",\n                \"description\": \"loma.ml ist eine Friendica Community im Fediverse auf der vorwiegend DE \\uD83C\\uDDE9\\uD83C\\uDDEA gesprochen wird. \\\\r\\\\nServer in Germany/EU \\uD83C\\uDDE9\\uD83C\\uDDEA \\uD83C\\uDDEA\\uD83C\\uDDFA. Open to all with fun in new. \\\\r\\\\nServer in Deutschland. Offen für alle mit Spaß an Neuen.\",\n                \"usage\": {\n                    \"users\": {\n                        \"active_month\": 125\n                    }\n                },\n                \"thumbnail\": {\n                    \"url\": \"https://loma.ml/ad/friendica-banner.jpg\"\n                },\n                \"languages\": [\n                    \"de\"\n                ],\n                \"configuration\": {\n                    \"statuses\": {\n                        \"max_characters\": $FRIENDICA_MAXIMUM\n                    },\n                    \"media_attachments\": {\n                        \"supported_mime_types\": {\n                            \"image/jpeg\": \"jpg\",\n                            \"image/jpg\": \"jpg\",\n                            \"image/png\": \"png\",\n                            \"image/gif\": \"gif\"\n                        },\n                        \"image_size_limit\": 10485760\n                    }\n                },\n                \"registrations\": {\n                    \"enabled\": true,\n                    \"approval_required\": false\n                },\n                \"contact\": {\n                    \"email\": \"anony@miz.ed\",\n                    \"account\": {\n                        \"id\": \"9632\",\n                        \"username\": \"webm\",\n                        \"acct\": \"webm\",\n                        \"display_name\": \"web m \\uD83C\\uDDEA\\uD83C\\uDDFA\",\n                        \"locked\": false,\n                        \"bot\": false,\n                        \"discoverable\": true,\n                        \"group\": false,\n                        \"created_at\": \"2018-05-21T11:24:55.000Z\",\n                        \"note\": \"\\uD83C\\uDDE9\\uD83C\\uDDEA Über diesen Account werden Änderungen oder geplante Beeinträchtigungen angekündigt. Wenn du einen Account auf Loma.ml besitzt, dann solltest du dich mit mir verbinden.\\uD83C\\uDDEA\\uD83C\\uDDFA Changes or planned impairments are announced via this account. If you have an account on Loma.ml, you should connect to me.\\uD83C\\uDD98 Fallbackaccount @webm@joinfriendica.de\",\n                        \"url\": \"https://loma.ml/profile/webm\",\n                        \"avatar\": \"https://loma.ml/photo/contact/320/373ebf56355ac895a09cb99264485383?ts=1686417730\",\n                        \"avatar_static\": \"https://loma.ml/photo/contact/320/373ebf56355ac895a09cb99264485383?ts=1686417730&static=1\",\n                        \"header\": \"https://loma.ml/photo/header/373ebf56355ac895a09cb99264485383?ts=1686417730\",\n                        \"header_static\": \"https://loma.ml/photo/header/373ebf56355ac895a09cb99264485383?ts=1686417730&static=1\",\n                        \"followers_count\": 23,\n                        \"following_count\": 25,\n                        \"statuses_count\": 15,\n                        \"last_status_at\": \"2023-09-19T00:00:00.000Z\",\n                        \"emojis\": [],\n                        \"fields\": []\n                    }\n                },\n                \"rules\": [],\n                \"friendica\": {\n                    \"version\": \"2023.09-rc\",\n                    \"codename\": \"Giant Rhubarb\",\n                    \"db_version\": 1539\n                }\n            }\n        \"\"\".trimIndent()\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/components/compose/ComposeTokenizerTest.kt",
    "content": "/* Copyright 2018 Levi Bard\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>. */\n\npackage com.keylesspalace.tusky.components.compose\n\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\n\n@RunWith(Parameterized::class)\nclass ComposeTokenizerTest(\n    private val text: CharSequence,\n    private val expectedStartIndex: Int,\n    private val expectedEndIndex: Int\n) {\n\n    companion object {\n        @Parameterized.Parameters(name = \"{0}\")\n        @JvmStatic\n        fun data(): Iterable<Array<Any>> {\n            return listOf(\n                arrayOf(\"@mention\", 0, 8),\n                arrayOf(\"@ment10n\", 0, 8),\n                arrayOf(\"@ment10n_\", 0, 9),\n                arrayOf(\"@ment10n_n\", 0, 10),\n                arrayOf(\"@ment10n_9\", 0, 10),\n                arrayOf(\" @mention\", 1, 9),\n                arrayOf(\" @ment10n\", 1, 9),\n                arrayOf(\" @ment10n_\", 1, 10),\n                arrayOf(\" @ment10n_ @\", 11, 12),\n                arrayOf(\" @ment10n_ @ment20n\", 11, 19),\n                arrayOf(\" @ment10n_ @ment20n_\", 11, 20),\n                arrayOf(\" @ment10n_ @ment20n_n\", 11, 21),\n                arrayOf(\" @ment10n_ @ment20n_9\", 11, 21),\n                arrayOf(\" @ment10n-\", 1, 10),\n                arrayOf(\" @ment10n- @\", 11, 12),\n                arrayOf(\" @ment10n- @ment20n\", 11, 19),\n                arrayOf(\" @ment10n- @ment20n-\", 11, 20),\n                arrayOf(\" @ment10n- @ment20n-n\", 11, 21),\n                arrayOf(\" @ment10n- @ment20n-9\", 11, 21),\n                arrayOf(\"@ment10n@l0calhost\", 0, 18),\n                arrayOf(\" @ment10n@l0calhost\", 1, 19),\n                arrayOf(\" @ment10n_@l0calhost\", 1, 20),\n                arrayOf(\" @ment10n-@l0calhost\", 1, 20),\n                arrayOf(\" @ment10n_@l0calhost @ment20n@husky\", 21, 35),\n                arrayOf(\" @ment10n_@l0calhost @ment20n_@husky\", 21, 36),\n                arrayOf(\" @ment10n-@l0calhost @ment20n-@husky\", 21, 36),\n                arrayOf(\" @m@localhost\", 1, 13),\n                arrayOf(\" @m@localhost @a@localhost\", 14, 26),\n                arrayOf(\"@m@\", 0, 3),\n                arrayOf(\" @m@ @a@asdf\", 5, 12),\n                arrayOf(\" @m@ @a@\", 5, 8),\n                arrayOf(\" @m@ @a@a\", 5, 9),\n                arrayOf(\" @m@a @a@m\", 6, 10),\n                arrayOf(\"@m@m@\", 5, 5),\n                arrayOf(\"#tusky@husky\", 12, 12),\n                arrayOf(\":tusky@husky\", 12, 12),\n                arrayOf(\"mention\", 7, 7),\n                arrayOf(\"ment10n\", 7, 7),\n                arrayOf(\"mentio_\", 7, 7),\n                arrayOf(\"#tusky\", 0, 6),\n                arrayOf(\"#@tusky\", 7, 7),\n                arrayOf(\"@#tusky\", 7, 7),\n                arrayOf(\" @#tusky\", 8, 8),\n                arrayOf(\":mastodon\", 0, 9),\n                arrayOf(\":@mastodon\", 10, 10),\n                arrayOf(\"@:mastodon\", 10, 10),\n                arrayOf(\" @:mastodon\", 11, 11),\n                arrayOf(\"#@:mastodon\", 11, 11),\n                arrayOf(\" #@:mastodon\", 12, 12)\n            )\n        }\n    }\n\n    private val tokenizer = ComposeTokenizer()\n\n    @Test\n    fun tokenIndices_matchExpectations() {\n        assertEquals(expectedStartIndex, tokenizer.findTokenStart(text, text.length))\n        assertEquals(expectedEndIndex, tokenizer.findTokenEnd(text, text.length))\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/components/compose/ComposeViewModelTest.kt",
    "content": "package com.keylesspalace.tusky.components.compose\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.settings.DefaultReplyVisibility\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.kotlin.doReturn\nimport org.mockito.kotlin.mock\nimport org.robolectric.annotation.Config\n\n@Config(sdk = [34])\n@RunWith(AndroidJUnit4::class)\nclass ComposeViewModelTest {\n\n    private lateinit var api: MastodonApi\n    private lateinit var accountManager: AccountManager\n    private lateinit var eventHub: EventHub\n    private lateinit var viewModel: ComposeViewModel\n\n    private fun setup(defaultReplyVisibility: DefaultReplyVisibility = DefaultReplyVisibility.UNLISTED) {\n        api = mock()\n        accountManager = mock {\n            on { activeAccount } doReturn\n                AccountEntity(\n                    id = 1,\n                    domain = \"test.domain\",\n                    accessToken = \"fakeToken\",\n                    clientId = \"fakeId\",\n                    clientSecret = \"fakeSecret\",\n                    isActive = true,\n                    defaultReplyPrivacy = defaultReplyVisibility\n                )\n        }\n        eventHub = EventHub()\n\n        viewModel = ComposeViewModel(\n            api = api,\n            accountManager = accountManager,\n            mediaUploader = mock(),\n            serviceClient = mock(),\n            draftHelper = mock(),\n            instanceInfoRepo = mock(),\n        )\n    }\n\n    @Test\n    fun `startingVisibility initially set to defaultPostPrivacy for post`() {\n        setup()\n        viewModel.setup(null)\n\n        assertEquals(Status.Visibility.PUBLIC, viewModel.statusVisibility.value)\n    }\n\n    @Test\n    fun `startingVisibility initially set to replyPostPrivacy for reply`() {\n        setup()\n        viewModel.setup(ComposeActivity.ComposeOptions(inReplyToId = \"123\"))\n\n        assertEquals(Status.Visibility.UNLISTED, viewModel.statusVisibility.value)\n    }\n\n    @Test\n    fun `startingVisibility initially set to defaultPostPrivacy when replyPostPrivacy is MATCH_DEFAULT_POST_VISIBILITY for reply`() {\n        setup(defaultReplyVisibility = DefaultReplyVisibility.MATCH_DEFAULT_POST_VISIBILITY)\n        viewModel.setup(ComposeActivity.ComposeOptions(inReplyToId = \"123\"))\n\n        assertEquals(Status.Visibility.PUBLIC, viewModel.statusVisibility.value)\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/components/compose/StatusLengthTest.kt",
    "content": "/*\n * Copyright 2023 Tusky Contributors\n *\n * This file is a part of Tusky.\n *\n * This program is free software; you can redistribute it and/or modify it under the terms of the\n * GNU General Public License as published by the Free Software Foundation; either version 3 of the\n * License, or (at your option) any later version.\n *\n * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even\n * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n * Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along with Tusky; if not,\n * see <http://www.gnu.org/licenses>.\n */\n\npackage com.keylesspalace.tusky.components.compose\n\nimport com.keylesspalace.tusky.FakeSpannable\nimport com.keylesspalace.tusky.finders\nimport com.keylesspalace.tusky.util.highlightSpans\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.ParameterizedRobolectricTestRunner\nimport org.robolectric.annotation.Config\n\n@RunWith(ParameterizedRobolectricTestRunner::class)\n@Config(sdk = [34])\nclass StatusLengthTest(\n    private val text: String,\n    private val expectedLength: Int\n) {\n    companion object {\n        @ParameterizedRobolectricTestRunner.Parameters(name = \"{0}\")\n        @JvmStatic\n        fun data(): Iterable<Array<Any>> {\n            return listOf(\n                arrayOf(\"\", 0),\n                arrayOf(\" \", 1),\n                arrayOf(\"123\", 3),\n                arrayOf(\"🫣\", 1),\n                // \"@user@server\" should be treated as \"@user\"\n                arrayOf(\"123 @example@example.org\", 12),\n                // URLs are always treated as 23 even if they are shorter\n                arrayOf(\"123 http://example.org\", 27),\n                // URLs over 23 chars are treated as 23 chars\n                arrayOf(\"123 http://urlthatislongerthan23characters.example.org\", 27),\n                // Short hashtags are treated as is\n                arrayOf(\"123 #basictag\", 13),\n                // Long hashtags are *also* treated as is (not treated as 23, like URLs)\n                arrayOf(\"123 #atagthatislongerthan23characters\", 37),\n                // urls can have balanced parenthesis, otherwise they are ignored https://github.com/tuskyapp/Tusky/issues/4425\n                arrayOf(\"(https://en.wikipedia.org/wiki/Beethoven_(horse))\", 25),\n                // protocols can have any case https://github.com/tuskyapp/Tusky/issues/4641\n                arrayOf(\"Http://example.org\", 23),\n                arrayOf(\"HTTPS://example.org\", 23),\n                arrayOf(\"HTTPS://EXAMPLE.ORG\", 23)\n            )\n        }\n    }\n\n    @Test\n    fun statusLength_matchesExpectations() {\n        val spannedText = FakeSpannable(text)\n        spannedText.highlightSpans(0, finders)\n\n        assertEquals(\n            expectedLength,\n            ComposeActivity.statusLength(spannedText, null, 23)\n        )\n    }\n\n    @Test\n    fun statusLength_withCwText_matchesExpectations() {\n        val spannedText = FakeSpannable(text)\n        spannedText.highlightSpans(0, finders)\n\n        val cwText = FakeSpannable(\n            \"a @example@example.org #hashtagmention and http://example.org URL\"\n        )\n        assertEquals(\n            expectedLength + cwText.length,\n            ComposeActivity.statusLength(spannedText, cwText, 23)\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationFaker.kt",
    "content": "package com.keylesspalace.tusky.components.notifications\n\nimport androidx.paging.PagingSource\nimport androidx.room.withTransaction\nimport com.keylesspalace.tusky.components.timeline.LoadMorePlaceholder\nimport com.keylesspalace.tusky.components.timeline.fakeAccount\nimport com.keylesspalace.tusky.components.timeline.fakeStatus\nimport com.keylesspalace.tusky.components.timeline.toEntity\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.entity.NotificationDataEntity\nimport com.keylesspalace.tusky.db.entity.NotificationEntity\nimport com.keylesspalace.tusky.entity.Notification\nimport com.keylesspalace.tusky.entity.Report\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.entity.TimelineAccount\nimport java.util.Date\nimport org.junit.Assert.assertEquals\n\nfun fakeNotification(\n    type: Notification.Type = Notification.Type.Favourite,\n    id: String = \"1\",\n    account: TimelineAccount = fakeAccount(id = id),\n    status: Status? = fakeStatus(id = id),\n    report: Report? = null\n) = Notification(\n    type = type,\n    id = id,\n    account = account,\n    status = status,\n    report = report\n)\n\nfun fakeReport(\n    id: String = \"1\",\n    category: String = \"spam\",\n    statusIds: List<String>? = null,\n    createdAt: Date = Date(1712509983273),\n    targetAccount: TimelineAccount = fakeAccount()\n) = Report(\n    id = id,\n    category = category,\n    statusIds = statusIds,\n    createdAt = createdAt,\n    targetAccount = targetAccount\n)\n\nfun Notification.toNotificationDataEntity(\n    tuskyAccountId: Long,\n    isStatusExpanded: Boolean = false,\n    isStatusContentShowing: Boolean = false\n) = NotificationDataEntity(\n    tuskyAccountId = tuskyAccountId,\n    type = type,\n    id = id,\n    account = account.toEntity(tuskyAccountId),\n    status = status?.toEntity(\n        tuskyAccountId = tuskyAccountId,\n        expanded = isStatusExpanded,\n        contentShowing = isStatusContentShowing,\n        contentCollapsed = true\n    ),\n    statusAccount = status?.account?.toEntity(tuskyAccountId),\n    report = report?.toEntity(tuskyAccountId),\n    reportTargetAccount = report?.targetAccount?.toEntity(tuskyAccountId),\n    event = null,\n    moderationWarning = null,\n)\n\nfun LoadMorePlaceholder.toNotificationDataEntity(\n    tuskyAccountId: Long\n) = NotificationDataEntity(\n    tuskyAccountId = tuskyAccountId,\n    type = null,\n    id = id,\n    account = null,\n    status = null,\n    statusAccount = null,\n    report = null,\n    reportTargetAccount = null,\n    event = null,\n    moderationWarning = null,\n)\n\nsuspend fun AppDatabase.insert(notifications: List<Notification>, tuskyAccountId: Long = 1) = withTransaction {\n    notifications.forEach { notification ->\n\n        timelineAccountDao().insert(\n            notification.account.toEntity(tuskyAccountId)\n        )\n\n        notification.report?.let { report ->\n            timelineAccountDao().insert(\n                report.targetAccount.toEntity(\n                    tuskyAccountId = tuskyAccountId,\n                )\n            )\n            notificationsDao().insertReport(report.toEntity(tuskyAccountId))\n        }\n        notification.status?.let { status ->\n            timelineAccountDao().insert(\n                status.account.toEntity(\n                    tuskyAccountId = tuskyAccountId,\n                )\n            )\n            timelineStatusDao().insert(\n                status.toEntity(\n                    tuskyAccountId = tuskyAccountId,\n                    expanded = false,\n                    contentShowing = false,\n                    contentCollapsed = true\n                )\n            )\n        }\n        notificationsDao().insertNotification(\n            NotificationEntity(\n                tuskyAccountId = tuskyAccountId,\n                type = notification.type,\n                id = notification.id,\n                accountId = notification.account.id,\n                statusId = notification.status?.id,\n                reportId = notification.report?.id,\n                event = null,\n                moderationWarning = null,\n                loading = false\n            )\n        )\n    }\n}\n\nsuspend fun AppDatabase.assertNotifications(\n    expected: List<NotificationDataEntity>,\n    tuskyAccountId: Long = 1\n) {\n    val pagingSource = notificationsDao().getNotifications(tuskyAccountId)\n\n    val loadResult = pagingSource.load(PagingSource.LoadParams.Refresh(null, 100, false))\n\n    val loaded = (loadResult as PagingSource.LoadResult.Page).data\n\n    assertEquals(expected, loaded)\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsRemoteMediatorTest.kt",
    "content": "package com.keylesspalace.tusky.components.notifications\n\nimport android.os.Looper.getMainLooper\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.LoadType\nimport androidx.paging.PagingConfig\nimport androidx.paging.PagingSource\nimport androidx.paging.PagingState\nimport androidx.paging.RemoteMediator\nimport androidx.room.Room\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.platform.app.InstrumentationRegistry\nimport com.keylesspalace.tusky.components.timeline.LoadMorePlaceholder\nimport com.keylesspalace.tusky.components.timeline.fakeStatus\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.Converters\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.db.entity.NotificationDataEntity\nimport com.keylesspalace.tusky.di.NetworkModule\nimport java.io.IOException\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.test.runTest\nimport okhttp3.ResponseBody.Companion.toResponseBody\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.kotlin.anyOrNull\nimport org.mockito.kotlin.doReturn\nimport org.mockito.kotlin.doThrow\nimport org.mockito.kotlin.mock\nimport org.robolectric.Shadows.shadowOf\nimport org.robolectric.annotation.Config\nimport retrofit2.HttpException\nimport retrofit2.Response\n\n@Config(sdk = [34])\n@RunWith(AndroidJUnit4::class)\nclass NotificationsRemoteMediatorTest {\n\n    private val account = AccountEntity(\n        id = 1,\n        domain = \"mastodon.example\",\n        accessToken = \"token\",\n        clientId = \"id\",\n        clientSecret = \"secret\",\n        isActive = true\n    )\n\n    private val accountManager: AccountManager = mock {\n        on { activeAccount } doReturn account\n        on { accountsFlow } doReturn MutableStateFlow(listOf(account))\n    }\n\n    private lateinit var db: AppDatabase\n\n    private val moshi = NetworkModule.providesMoshi()\n\n    @Before\n    @ExperimentalCoroutinesApi\n    fun setup() {\n        shadowOf(getMainLooper()).idle()\n\n        val context = InstrumentationRegistry.getInstrumentation().targetContext\n        db = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java)\n            .addTypeConverter(Converters(moshi))\n            .build()\n    }\n\n    @After\n    @ExperimentalCoroutinesApi\n    fun tearDown() {\n        db.close()\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should return error when network call returns error code`() = runTest {\n        val remoteMediator = NotificationsRemoteMediator(\n            viewModel = mockViewModel(),\n            accountManager = accountManager,\n            api = mock {\n                onBlocking { notifications(anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull()) } doReturn Response.error(500, \"\".toResponseBody())\n            },\n            db = db\n        )\n\n        val result = remoteMediator.load(LoadType.REFRESH, state())\n\n        assertTrue(result is RemoteMediator.MediatorResult.Error)\n        assertTrue((result as RemoteMediator.MediatorResult.Error).throwable is HttpException)\n        assertEquals(500, (result.throwable as HttpException).code())\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should return error when network call fails`() = runTest {\n        val remoteMediator = NotificationsRemoteMediator(\n            viewModel = mockViewModel(),\n            accountManager = accountManager,\n            api = mock {\n                onBlocking { notifications(anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull()) } doThrow IOException()\n            },\n            db = db\n        )\n\n        val result = remoteMediator.load(LoadType.REFRESH, state())\n\n        assertTrue(result is RemoteMediator.MediatorResult.Error)\n        assertTrue((result as RemoteMediator.MediatorResult.Error).throwable is IOException)\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should not prepend notifications`() = runTest {\n        val remoteMediator = NotificationsRemoteMediator(\n            viewModel = mockViewModel(),\n            accountManager = accountManager,\n            api = mock(),\n            db = db\n        )\n\n        val state = state(\n            listOf(\n                PagingSource.LoadResult.Page(\n                    data = listOf(\n                        fakeNotification(id = \"3\").toNotificationDataEntity(1)\n                    ),\n                    prevKey = null,\n                    nextKey = 1\n                )\n            )\n        )\n\n        val result = remoteMediator.load(LoadType.PREPEND, state)\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertTrue((result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should refresh and insert placeholder when a whole page with no overlap to existing notifications is loaded`() = runTest {\n        val notificationsAlreadyInDb = listOf(\n            fakeNotification(id = \"3\"),\n            fakeNotification(id = \"2\"),\n            fakeNotification(id = \"1\")\n        )\n\n        db.insert(notificationsAlreadyInDb)\n\n        val remoteMediator = NotificationsRemoteMediator(\n            viewModel = mockViewModel(),\n            accountManager = accountManager,\n            api = mock {\n                onBlocking { notifications(limit = 3, excludes = emptySet()) } doReturn Response.success(\n                    listOf(\n                        fakeNotification(id = \"8\"),\n                        fakeNotification(id = \"7\"),\n                        fakeNotification(id = \"5\")\n                    )\n                )\n                onBlocking { notifications(maxId = \"3\", limit = 3, excludes = emptySet()) } doReturn Response.success(\n                    listOf(\n                        fakeNotification(id = \"3\"),\n                        fakeNotification(id = \"2\"),\n                        fakeNotification(id = \"1\")\n                    )\n                )\n            },\n            db = db\n        )\n\n        val state = state(\n            pages = listOf(\n                PagingSource.LoadResult.Page(\n                    data = notificationsAlreadyInDb.map { it.toNotificationDataEntity(1) },\n                    prevKey = null,\n                    nextKey = 0\n                )\n            ),\n            pageSize = 3\n        )\n\n        val result = remoteMediator.load(LoadType.REFRESH, state)\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertEquals(false, (result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n\n        db.assertNotifications(\n            listOf(\n                fakeNotification(id = \"8\").toNotificationDataEntity(1),\n                fakeNotification(id = \"7\").toNotificationDataEntity(1),\n                LoadMorePlaceholder(id = \"5\", loading = false).toNotificationDataEntity(1),\n                fakeNotification(id = \"3\").toNotificationDataEntity(1),\n                fakeNotification(id = \"2\").toNotificationDataEntity(1),\n                fakeNotification(id = \"1\").toNotificationDataEntity(1)\n            )\n        )\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should refresh and not insert placeholder when less than a whole page is loaded`() = runTest {\n        val notificationsAlreadyInDb = listOf(\n            fakeNotification(id = \"3\"),\n            fakeNotification(id = \"2\"),\n            fakeNotification(id = \"1\")\n        )\n\n        db.insert(notificationsAlreadyInDb)\n\n        val remoteMediator = NotificationsRemoteMediator(\n            viewModel = mockViewModel(),\n            accountManager = accountManager,\n            api = mock {\n                onBlocking { notifications(limit = 20, excludes = emptySet()) } doReturn Response.success(\n                    listOf(\n                        // testing for https://github.com/tuskyapp/Tusky/issues/4563\n                        fakeNotification(\n                            id = \"8\",\n                            status = fakeStatus(\n                                id = \"r1\",\n                                reblog = fakeStatus(\n                                    id = \"8\",\n                                    authorServerId = \"r1\"\n                                )\n                            )\n                        ),\n                        fakeNotification(id = \"7\"),\n                        fakeNotification(id = \"5\")\n                    )\n                )\n                onBlocking { notifications(maxId = \"3\", limit = 20, excludes = emptySet()) } doReturn Response.success(\n                    listOf(\n                        fakeNotification(id = \"3\"),\n                        fakeNotification(id = \"2\"),\n                        fakeNotification(id = \"1\")\n                    )\n                )\n            },\n            db = db\n        )\n\n        val state = state(\n            pages = listOf(\n                PagingSource.LoadResult.Page(\n                    data = notificationsAlreadyInDb.map { it.toNotificationDataEntity(1) },\n                    prevKey = null,\n                    nextKey = 0\n                )\n            )\n        )\n\n        val result = remoteMediator.load(LoadType.REFRESH, state)\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertEquals(false, (result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n\n        db.assertNotifications(\n            listOf(\n                fakeNotification(\n                    id = \"8\",\n                    status = fakeStatus(\n                        id = \"8\",\n                        authorServerId = \"r1\"\n                    )\n                ).toNotificationDataEntity(1),\n                fakeNotification(id = \"7\").toNotificationDataEntity(1),\n                fakeNotification(id = \"5\").toNotificationDataEntity(1),\n                fakeNotification(id = \"3\").toNotificationDataEntity(1),\n                fakeNotification(id = \"2\").toNotificationDataEntity(1),\n                fakeNotification(id = \"1\").toNotificationDataEntity(1)\n            )\n        )\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should refresh and not insert placeholders when there is overlap with existing notifications`() = runTest {\n        val notificationsAlreadyInDb = listOf(\n            fakeNotification(id = \"3\"),\n            fakeNotification(id = \"2\"),\n            fakeNotification(id = \"1\")\n        )\n\n        db.insert(notificationsAlreadyInDb)\n\n        val remoteMediator = NotificationsRemoteMediator(\n            viewModel = mockViewModel(),\n            accountManager = accountManager,\n            api = mock {\n                onBlocking { notifications(limit = 3, excludes = emptySet()) } doReturn Response.success(\n                    listOf(\n                        fakeNotification(id = \"6\"),\n                        fakeNotification(id = \"4\"),\n                        fakeNotification(id = \"3\")\n                    )\n                )\n                onBlocking { notifications(maxId = \"3\", limit = 3, excludes = emptySet()) } doReturn Response.success(\n                    listOf(\n                        fakeNotification(id = \"3\"),\n                        fakeNotification(id = \"2\"),\n                        fakeNotification(id = \"1\")\n                    )\n                )\n            },\n            db = db\n        )\n\n        val state = state(\n            listOf(\n                PagingSource.LoadResult.Page(\n                    data = notificationsAlreadyInDb.map { it.toNotificationDataEntity(1) },\n                    prevKey = null,\n                    nextKey = 0\n                )\n            ),\n            pageSize = 3\n        )\n\n        val result = remoteMediator.load(LoadType.REFRESH, state)\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertEquals(false, (result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n\n        db.assertNotifications(\n            listOf(\n                fakeNotification(id = \"6\").toNotificationDataEntity(1),\n                fakeNotification(id = \"4\").toNotificationDataEntity(1),\n                fakeNotification(id = \"3\").toNotificationDataEntity(1),\n                fakeNotification(id = \"2\").toNotificationDataEntity(1),\n                fakeNotification(id = \"1\").toNotificationDataEntity(1)\n            )\n        )\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should not try to refresh already cached notifications when db is empty`() = runTest {\n        val remoteMediator = NotificationsRemoteMediator(\n            viewModel = mockViewModel(),\n            accountManager = accountManager,\n            api = mock {\n                onBlocking { notifications(limit = 20, excludes = emptySet()) } doReturn Response.success(\n                    listOf(\n                        fakeNotification(id = \"5\"),\n                        fakeNotification(id = \"4\"),\n                        fakeNotification(id = \"3\")\n                    )\n                )\n            },\n            db = db\n        )\n\n        val state = state(\n            listOf(\n                PagingSource.LoadResult.Page(\n                    data = emptyList(),\n                    prevKey = null,\n                    nextKey = 0\n                )\n            )\n        )\n\n        val result = remoteMediator.load(LoadType.REFRESH, state)\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertEquals(false, (result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n\n        db.assertNotifications(\n            listOf(\n                fakeNotification(id = \"5\").toNotificationDataEntity(1),\n                fakeNotification(id = \"4\").toNotificationDataEntity(1),\n                fakeNotification(id = \"3\").toNotificationDataEntity(1)\n            )\n        )\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should remove deleted notification from db and keep state of statuses in the remaining ones`() = runTest {\n        val notificationsAlreadyInDb = listOf(\n            fakeNotification(id = \"3\"),\n            fakeNotification(id = \"2\"),\n            fakeNotification(id = \"1\")\n        )\n        db.insert(notificationsAlreadyInDb)\n\n        db.timelineStatusDao().setExpanded(1, \"3\", true)\n        db.timelineStatusDao().setExpanded(1, \"2\", true)\n        db.timelineStatusDao().setContentCollapsed(1, \"1\", false)\n\n        val remoteMediator = NotificationsRemoteMediator(\n            viewModel = mockViewModel(),\n            accountManager = accountManager,\n            api = mock {\n                onBlocking { notifications(limit = 20, excludes = emptySet()) } doReturn Response.success(emptyList())\n\n                onBlocking { notifications(maxId = \"3\", limit = 20, excludes = emptySet()) } doReturn Response.success(\n                    listOf(\n                        fakeNotification(id = \"3\"),\n                        fakeNotification(id = \"1\")\n                    )\n                )\n            },\n            db = db\n        )\n\n        val state = state(\n            listOf(\n                PagingSource.LoadResult.Page(\n                    data = listOf(\n                        fakeNotification(id = \"3\").toNotificationDataEntity(1, isStatusExpanded = true),\n                        fakeNotification(id = \"2\").toNotificationDataEntity(1, isStatusExpanded = true),\n                        fakeNotification(id = \"1\").toNotificationDataEntity(1, isStatusContentShowing = true)\n                    ),\n                    prevKey = null,\n                    nextKey = 0\n                )\n            )\n        )\n\n        val result = remoteMediator.load(LoadType.REFRESH, state)\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertTrue((result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n\n        db.assertNotifications(\n            listOf(\n                fakeNotification(id = \"3\").toNotificationDataEntity(1, isStatusExpanded = true),\n                fakeNotification(id = \"1\").toNotificationDataEntity(1, isStatusContentShowing = true)\n            )\n        )\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should not remove placeholder in timeline`() = runTest {\n        val notificationsAlreadyInDb = listOf(\n            fakeNotification(id = \"8\"),\n            fakeNotification(id = \"7\"),\n            fakeNotification(id = \"1\")\n        )\n        db.insert(notificationsAlreadyInDb)\n\n        val placeholder = LoadMorePlaceholder(id = \"6\", loading = false).toNotificationEntity(1)\n        db.notificationsDao().insertNotification(placeholder)\n\n        val remoteMediator = NotificationsRemoteMediator(\n            viewModel = mockViewModel(),\n            accountManager = accountManager,\n            api = mock {\n                onBlocking { notifications(sinceId = \"6\", limit = 20, excludes = emptySet()) } doReturn Response.success(\n                    listOf(\n                        fakeNotification(id = \"9\"),\n                        fakeNotification(id = \"8\"),\n                        fakeNotification(id = \"7\")\n                    )\n                )\n                onBlocking { notifications(maxId = \"8\", sinceId = \"6\", limit = 20, excludes = emptySet()) } doReturn Response.success(\n                    listOf(\n                        fakeNotification(id = \"8\"),\n                        fakeNotification(id = \"7\")\n                    )\n                )\n            },\n            db = db\n        )\n\n        val state = state(\n            listOf(\n                PagingSource.LoadResult.Page(\n                    data = notificationsAlreadyInDb.map { it.toNotificationDataEntity(1) },\n                    prevKey = null,\n                    nextKey = 0\n                )\n            )\n        )\n\n        val result = remoteMediator.load(LoadType.REFRESH, state)\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertFalse((result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n\n        db.assertNotifications(\n            listOf(\n                fakeNotification(id = \"9\").toNotificationDataEntity(1),\n                fakeNotification(id = \"8\").toNotificationDataEntity(1),\n                fakeNotification(id = \"7\").toNotificationDataEntity(1),\n                LoadMorePlaceholder(id = \"6\", loading = false).toNotificationDataEntity(1),\n                fakeNotification(id = \"1\").toNotificationDataEntity(1)\n            )\n        )\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should append notifications`() = runTest {\n        val notificationsAlreadyInDb = listOf(\n            fakeNotification(id = \"8\"),\n            fakeNotification(id = \"7\"),\n            fakeNotification(id = \"5\")\n        )\n\n        db.insert(notificationsAlreadyInDb)\n\n        val remoteMediator = NotificationsRemoteMediator(\n            viewModel = mockViewModel(),\n            accountManager = accountManager,\n            api = mock {\n                onBlocking { notifications(maxId = \"5\", limit = 20, excludes = emptySet()) } doReturn Response.success(\n                    listOf(\n                        fakeNotification(id = \"3\"),\n                        fakeNotification(id = \"2\"),\n                        fakeNotification(id = \"1\")\n                    )\n                )\n            },\n            db = db\n        )\n\n        val state = state(\n            listOf(\n                PagingSource.LoadResult.Page(\n                    data = notificationsAlreadyInDb.map { it.toNotificationDataEntity(1) },\n                    prevKey = null,\n                    nextKey = 0\n                )\n            )\n        )\n\n        val result = remoteMediator.load(LoadType.APPEND, state)\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertEquals(false, (result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n        db.assertNotifications(\n            listOf(\n                fakeNotification(id = \"8\").toNotificationDataEntity(1),\n                fakeNotification(id = \"7\").toNotificationDataEntity(1),\n                fakeNotification(id = \"5\").toNotificationDataEntity(1),\n                fakeNotification(id = \"3\").toNotificationDataEntity(1),\n                fakeNotification(id = \"2\").toNotificationDataEntity(1),\n                fakeNotification(id = \"1\").toNotificationDataEntity(1)\n            )\n        )\n    }\n\n    private fun state(\n        pages: List<PagingSource.LoadResult.Page<Int, NotificationDataEntity>> = emptyList(),\n        pageSize: Int = 20\n    ) = PagingState(\n        pages = pages,\n        anchorPosition = null,\n        config = PagingConfig(\n            pageSize = pageSize\n        ),\n        leadingPlaceholderCount = 0\n    )\n\n    private fun mockViewModel(): NotificationsViewModel {\n        return mock {\n            on { activeAccountFlow } doReturn MutableStateFlow(account)\n            on { excludes } doReturn MutableStateFlow(emptySet())\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/components/timeline/CachedTimelineRemoteMediatorTest.kt",
    "content": "package com.keylesspalace.tusky.components.timeline\n\nimport android.os.Looper.getMainLooper\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.LoadType\nimport androidx.paging.PagingConfig\nimport androidx.paging.PagingSource\nimport androidx.paging.PagingState\nimport androidx.paging.RemoteMediator\nimport androidx.room.Room\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.platform.app.InstrumentationRegistry\nimport com.keylesspalace.tusky.components.timeline.viewmodel.CachedTimelineRemoteMediator\nimport com.keylesspalace.tusky.components.timeline.viewmodel.CachedTimelineViewModel\nimport com.keylesspalace.tusky.components.timeline.viewmodel.TimelineViewModel\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.Converters\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.db.entity.HomeTimelineData\nimport com.keylesspalace.tusky.di.NetworkModule\nimport java.io.IOException\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.test.runTest\nimport okhttp3.ResponseBody.Companion.toResponseBody\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.kotlin.anyOrNull\nimport org.mockito.kotlin.doReturn\nimport org.mockito.kotlin.doThrow\nimport org.mockito.kotlin.mock\nimport org.robolectric.Shadows.shadowOf\nimport org.robolectric.annotation.Config\nimport retrofit2.HttpException\nimport retrofit2.Response\n\n@Config(sdk = [34])\n@RunWith(AndroidJUnit4::class)\nclass CachedTimelineRemoteMediatorTest {\n\n    private lateinit var db: AppDatabase\n\n    private val moshi = NetworkModule.providesMoshi()\n\n    @Before\n    @ExperimentalCoroutinesApi\n    fun setup() {\n        shadowOf(getMainLooper()).idle()\n\n        val context = InstrumentationRegistry.getInstrumentation().targetContext\n        db = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java)\n            .addTypeConverter(Converters(moshi))\n            .build()\n    }\n\n    @After\n    @ExperimentalCoroutinesApi\n    fun tearDown() {\n        db.close()\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should return error when network call returns error code`() = runTest {\n        val remoteMediator = CachedTimelineRemoteMediator(\n            viewModel = mockViewModel(),\n            api = mock {\n                onBlocking { homeTimeline(anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull()) } doReturn Response.error(500, \"\".toResponseBody())\n            },\n            db = db,\n        )\n\n        val result = remoteMediator.load(LoadType.REFRESH, state())\n\n        assertTrue(result is RemoteMediator.MediatorResult.Error)\n        assertTrue((result as RemoteMediator.MediatorResult.Error).throwable is HttpException)\n        assertEquals(500, (result.throwable as HttpException).code())\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should return error when network call fails`() = runTest {\n        val remoteMediator = CachedTimelineRemoteMediator(\n            viewModel = mockViewModel(),\n            api = mock {\n                onBlocking { homeTimeline(anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull()) } doThrow IOException()\n            },\n            db = db,\n        )\n\n        val result = remoteMediator.load(LoadType.REFRESH, state())\n\n        assertTrue(result is RemoteMediator.MediatorResult.Error)\n        assertTrue((result as RemoteMediator.MediatorResult.Error).throwable is IOException)\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should not prepend statuses`() = runTest {\n        val remoteMediator = CachedTimelineRemoteMediator(\n            viewModel = mockViewModel(),\n            api = mock(),\n            db = db,\n        )\n\n        val state = state(\n            listOf(\n                PagingSource.LoadResult.Page(\n                    data = listOf(\n                        fakeHomeTimelineData(\"3\")\n                    ),\n                    prevKey = null,\n                    nextKey = 1\n                )\n            )\n        )\n\n        val result = remoteMediator.load(LoadType.PREPEND, state)\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertTrue((result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should refresh and insert placeholder when a whole page with no overlap to existing statuses is loaded`() = runTest {\n        val statusesAlreadyInDb = listOf(\n            fakeHomeTimelineData(\"3\"),\n            fakeHomeTimelineData(\"2\"),\n            fakeHomeTimelineData(\"1\")\n        )\n\n        db.insert(statusesAlreadyInDb)\n\n        val remoteMediator = CachedTimelineRemoteMediator(\n            viewModel = mockViewModel(),\n            api = mock {\n                onBlocking { homeTimeline(limit = 3) } doReturn Response.success(\n                    listOf(\n                        fakeStatus(\"8\"),\n                        fakeStatus(\"7\"),\n                        fakeStatus(\"5\")\n                    )\n                )\n                onBlocking { homeTimeline(maxId = \"3\", limit = 3) } doReturn Response.success(\n                    listOf(\n                        fakeStatus(\"3\"),\n                        fakeStatus(\"2\"),\n                        fakeStatus(\"1\")\n                    )\n                )\n            },\n            db = db,\n        )\n\n        val state = state(\n            pages = listOf(\n                PagingSource.LoadResult.Page(\n                    data = statusesAlreadyInDb,\n                    prevKey = null,\n                    nextKey = 0\n                )\n            ),\n            pageSize = 3\n        )\n\n        val result = remoteMediator.load(LoadType.REFRESH, state)\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertEquals(false, (result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n\n        db.assertTimeline(\n            listOf(\n                fakeHomeTimelineData(\"8\"),\n                fakeHomeTimelineData(\"7\"),\n                fakePlaceholderHomeTimelineData(\"5\"),\n                fakeHomeTimelineData(\"3\"),\n                fakeHomeTimelineData(\"2\"),\n                fakeHomeTimelineData(\"1\")\n            )\n        )\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should refresh and not insert placeholder when less than a whole page is loaded`() = runTest {\n        val statusesAlreadyInDb = listOf(\n            fakeHomeTimelineData(\"3\"),\n            fakeHomeTimelineData(\"2\"),\n            fakeHomeTimelineData(\"1\")\n        )\n\n        db.insert(statusesAlreadyInDb)\n\n        val remoteMediator = CachedTimelineRemoteMediator(\n            viewModel = mockViewModel(),\n            api = mock {\n                onBlocking { homeTimeline(limit = 20) } doReturn Response.success(\n                    listOf(\n                        fakeStatus(\"8\"),\n                        fakeStatus(\"7\"),\n                        fakeStatus(\"5\")\n                    )\n                )\n                onBlocking { homeTimeline(maxId = \"3\", limit = 20) } doReturn Response.success(\n                    listOf(\n                        fakeStatus(\"3\"),\n                        fakeStatus(\"2\"),\n                        fakeStatus(\"1\")\n                    )\n                )\n            },\n            db = db,\n        )\n\n        val state = state(\n            pages = listOf(\n                PagingSource.LoadResult.Page(\n                    data = statusesAlreadyInDb,\n                    prevKey = null,\n                    nextKey = 0\n                )\n            )\n        )\n\n        val result = remoteMediator.load(LoadType.REFRESH, state)\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertEquals(false, (result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n\n        db.assertTimeline(\n            listOf(\n                fakeHomeTimelineData(\"8\"),\n                fakeHomeTimelineData(\"7\"),\n                fakeHomeTimelineData(\"5\"),\n                fakeHomeTimelineData(\"3\"),\n                fakeHomeTimelineData(\"2\"),\n                fakeHomeTimelineData(\"1\")\n            )\n        )\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should refresh and not insert placeholders when there is overlap with existing statuses`() = runTest {\n        val statusesAlreadyInDb = listOf(\n            fakeHomeTimelineData(\"3\"),\n            fakeHomeTimelineData(\"2\"),\n            fakeHomeTimelineData(\"1\")\n        )\n\n        db.insert(statusesAlreadyInDb)\n\n        val remoteMediator = CachedTimelineRemoteMediator(\n            viewModel = mockViewModel(),\n            api = mock {\n                onBlocking { homeTimeline(limit = 3) } doReturn Response.success(\n                    listOf(\n                        fakeStatus(\"6\"),\n                        fakeStatus(\"4\"),\n                        fakeStatus(\"3\")\n                    )\n                )\n                onBlocking { homeTimeline(maxId = \"3\", limit = 3) } doReturn Response.success(\n                    listOf(\n                        fakeStatus(\"3\"),\n                        fakeStatus(\"2\"),\n                        fakeStatus(\"1\")\n                    )\n                )\n            },\n            db = db,\n        )\n\n        val state = state(\n            listOf(\n                PagingSource.LoadResult.Page(\n                    data = statusesAlreadyInDb,\n                    prevKey = null,\n                    nextKey = 0\n                )\n            ),\n            pageSize = 3\n        )\n\n        val result = remoteMediator.load(LoadType.REFRESH, state)\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertEquals(false, (result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n\n        db.assertTimeline(\n            listOf(\n                fakeHomeTimelineData(\"6\"),\n                fakeHomeTimelineData(\"4\"),\n                fakeHomeTimelineData(\"3\"),\n                fakeHomeTimelineData(\"2\"),\n                fakeHomeTimelineData(\"1\")\n            )\n        )\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should not try to refresh already cached statuses when db is empty`() = runTest {\n        val remoteMediator = CachedTimelineRemoteMediator(\n            viewModel = mockViewModel(),\n            api = mock {\n                onBlocking { homeTimeline(limit = 20) } doReturn Response.success(\n                    listOf(\n                        fakeStatus(\"5\"),\n                        fakeStatus(\"4\"),\n                        fakeStatus(\"3\")\n                    )\n                )\n            },\n            db = db,\n        )\n\n        val state = state(\n            listOf(\n                PagingSource.LoadResult.Page(\n                    data = emptyList(),\n                    prevKey = null,\n                    nextKey = 0\n                )\n            )\n        )\n\n        val result = remoteMediator.load(LoadType.REFRESH, state)\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertEquals(false, (result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n\n        db.assertTimeline(\n            listOf(\n                fakeHomeTimelineData(\"5\"),\n                fakeHomeTimelineData(\"4\"),\n                fakeHomeTimelineData(\"3\")\n            )\n        )\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should remove deleted status from db and keep state of other cached statuses`() = runTest {\n        val statusesAlreadyInDb = listOf(\n            fakeHomeTimelineData(\"3\", expanded = true),\n            fakeHomeTimelineData(\"2\"),\n            fakeHomeTimelineData(\"1\", expanded = false)\n        )\n\n        db.insert(statusesAlreadyInDb)\n\n        val remoteMediator = CachedTimelineRemoteMediator(\n            viewModel = mockViewModel(),\n            api = mock {\n                onBlocking { homeTimeline(limit = 20) } doReturn Response.success(emptyList())\n\n                onBlocking { homeTimeline(maxId = \"3\", limit = 20) } doReturn Response.success(\n                    listOf(\n                        fakeStatus(\"3\"),\n                        fakeStatus(\"1\")\n                    )\n                )\n            },\n            db = db,\n        )\n\n        val state = state(\n            listOf(\n                PagingSource.LoadResult.Page(\n                    data = statusesAlreadyInDb,\n                    prevKey = null,\n                    nextKey = 0\n                )\n            )\n        )\n\n        val result = remoteMediator.load(LoadType.REFRESH, state)\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertTrue((result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n\n        db.assertTimeline(\n            listOf(\n                fakeHomeTimelineData(\"3\", expanded = true),\n                fakeHomeTimelineData(\"1\", expanded = false)\n            )\n        )\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should not remove placeholder in timeline`() = runTest {\n        val statusesAlreadyInDb = listOf(\n            fakeHomeTimelineData(\"8\"),\n            fakeHomeTimelineData(\"7\"),\n            fakePlaceholderHomeTimelineData(\"6\"),\n            fakeHomeTimelineData(\"1\")\n        )\n\n        db.insert(statusesAlreadyInDb)\n\n        val remoteMediator = CachedTimelineRemoteMediator(\n            viewModel = mockViewModel(),\n            api = mock {\n                onBlocking { homeTimeline(sinceId = \"6\", limit = 20) } doReturn Response.success(\n                    listOf(\n                        fakeStatus(\"9\"),\n                        fakeStatus(\"8\"),\n                        fakeStatus(\"7\")\n                    )\n                )\n                onBlocking { homeTimeline(maxId = \"8\", sinceId = \"6\", limit = 20) } doReturn Response.success(\n                    listOf(\n                        fakeStatus(\"8\"),\n                        fakeStatus(\"7\")\n                    )\n                )\n            },\n            db = db,\n        )\n\n        val state = state(\n            listOf(\n                PagingSource.LoadResult.Page(\n                    data = statusesAlreadyInDb,\n                    prevKey = null,\n                    nextKey = 0\n                )\n            )\n        )\n\n        val result = remoteMediator.load(LoadType.REFRESH, state)\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertFalse((result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n\n        db.assertTimeline(\n            listOf(\n                fakeHomeTimelineData(\"9\"),\n                fakeHomeTimelineData(\"8\"),\n                fakeHomeTimelineData(\"7\"),\n                fakePlaceholderHomeTimelineData(\"6\"),\n                fakeHomeTimelineData(\"1\")\n            )\n        )\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should append statuses`() = runTest {\n        val statusesAlreadyInDb = listOf(\n            fakeHomeTimelineData(\"8\"),\n            fakeHomeTimelineData(\"7\"),\n            fakeHomeTimelineData(\"5\")\n        )\n\n        db.insert(statusesAlreadyInDb)\n\n        val remoteMediator = CachedTimelineRemoteMediator(\n            viewModel = mockViewModel(),\n            api = mock {\n                onBlocking { homeTimeline(maxId = \"5\", limit = 20) } doReturn Response.success(\n                    listOf(\n                        fakeStatus(\"3\"),\n                        fakeStatus(\"2\"),\n                        fakeStatus(\"1\")\n                    )\n                )\n            },\n            db = db,\n        )\n\n        val state = state(\n            listOf(\n                PagingSource.LoadResult.Page(\n                    data = statusesAlreadyInDb,\n                    prevKey = null,\n                    nextKey = 0\n                )\n            )\n        )\n\n        val result = remoteMediator.load(LoadType.APPEND, state)\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertEquals(false, (result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n        db.assertTimeline(\n            listOf(\n                fakeHomeTimelineData(\"8\"),\n                fakeHomeTimelineData(\"7\"),\n                fakeHomeTimelineData(\"5\"),\n                fakeHomeTimelineData(\"3\"),\n                fakeHomeTimelineData(\"2\"),\n                fakeHomeTimelineData(\"1\")\n            )\n        )\n    }\n\n    private fun state(\n        pages: List<PagingSource.LoadResult.Page<Int, HomeTimelineData>> = emptyList(),\n        pageSize: Int = 20\n    ) = PagingState(\n        pages = pages,\n        anchorPosition = null,\n        config = PagingConfig(\n            pageSize = pageSize\n        ),\n        leadingPlaceholderCount = 0\n    )\n\n    private fun mockViewModel(): CachedTimelineViewModel {\n        val account = AccountEntity(\n            id = 1,\n            domain = \"mastodon.example\",\n            accessToken = \"token\",\n            clientId = \"id\",\n            clientSecret = \"secret\",\n            isActive = true\n        )\n        val accManager: AccountManager = mock {\n            on { activeAccount } doReturn account\n            on { accountsFlow } doReturn MutableStateFlow(listOf(account))\n        }\n        return mock {\n            on { accountManager } doReturn accManager\n            on { activeAccountFlow } doReturn MutableStateFlow(account)\n            on { kind } doReturn TimelineViewModel.Kind.PUBLIC_FEDERATED\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/components/timeline/NetworkTimelinePagingSourceTest.kt",
    "content": "package com.keylesspalace.tusky.components.timeline\n\nimport androidx.paging.PagingSource\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.keylesspalace.tusky.components.timeline.viewmodel.NetworkTimelinePagingSource\nimport com.keylesspalace.tusky.components.timeline.viewmodel.NetworkTimelineViewModel\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.kotlin.doReturn\nimport org.mockito.kotlin.mock\nimport org.robolectric.annotation.Config\n\n@Config(sdk = [34])\n@RunWith(AndroidJUnit4::class)\nclass NetworkTimelinePagingSourceTest {\n\n    private val status = fakeStatusViewData()\n\n    private val timelineViewModel: NetworkTimelineViewModel = mock {\n        on { statusData } doReturn mutableListOf(status)\n    }\n\n    @Test\n    fun `should return empty list when params are Append`() = runTest {\n        val pagingSource = NetworkTimelinePagingSource(timelineViewModel)\n\n        val params = PagingSource.LoadParams.Append(\"132\", 20, false)\n\n        val expectedResult = PagingSource.LoadResult.Page(emptyList(), null, null)\n\n        assertEquals(expectedResult, pagingSource.load(params))\n    }\n\n    @Test\n    fun `should return empty list when params are Prepend`() = runTest {\n        val pagingSource = NetworkTimelinePagingSource(timelineViewModel)\n\n        val params = PagingSource.LoadParams.Prepend(\"132\", 20, false)\n\n        val expectedResult = PagingSource.LoadResult.Page(emptyList(), null, null)\n\n        assertEquals(expectedResult, pagingSource.load(params))\n    }\n\n    @Test\n    fun `should return full list when params are Refresh`() = runTest {\n        val pagingSource = NetworkTimelinePagingSource(timelineViewModel)\n\n        val params = PagingSource.LoadParams.Refresh<String>(null, 20, false)\n\n        val expectedResult = PagingSource.LoadResult.Page(listOf(status), null, null)\n\n        val result = pagingSource.load(params)\n        assertEquals(expectedResult, result)\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/components/timeline/NetworkTimelineRemoteMediatorTest.kt",
    "content": "package com.keylesspalace.tusky.components.timeline\n\nimport androidx.paging.ExperimentalPagingApi\nimport androidx.paging.LoadType\nimport androidx.paging.PagingConfig\nimport androidx.paging.PagingSource\nimport androidx.paging.PagingState\nimport androidx.paging.RemoteMediator\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.keylesspalace.tusky.components.timeline.viewmodel.NetworkTimelineRemoteMediator\nimport com.keylesspalace.tusky.components.timeline.viewmodel.NetworkTimelineViewModel\nimport com.keylesspalace.tusky.components.timeline.viewmodel.TimelineViewModel\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport java.io.IOException\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.test.runTest\nimport okhttp3.Headers\nimport okhttp3.ResponseBody.Companion.toResponseBody\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertTrue\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.kotlin.anyOrNull\nimport org.mockito.kotlin.doReturn\nimport org.mockito.kotlin.doThrow\nimport org.mockito.kotlin.mock\nimport org.mockito.kotlin.verify\nimport org.robolectric.annotation.Config\nimport retrofit2.HttpException\nimport retrofit2.Response\n\n@Config(sdk = [34])\n@RunWith(AndroidJUnit4::class)\nclass NetworkTimelineRemoteMediatorTest {\n\n    private val account = AccountEntity(\n        id = 1,\n        domain = \"mastodon.example\",\n        accessToken = \"token\",\n        clientId = \"id\",\n        clientSecret = \"secret\",\n        isActive = true\n    )\n\n    private val accountManager: AccountManager = mock {\n        on { activeAccount } doReturn account\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should return error when network call returns error code`() = runTest {\n        val timelineViewModel: NetworkTimelineViewModel = mock {\n            on { statusData } doReturn mutableListOf()\n            onBlocking { fetchStatusesForKind(anyOrNull(), anyOrNull(), anyOrNull()) } doReturn Response.error(500, \"\".toResponseBody())\n        }\n\n        val remoteMediator = NetworkTimelineRemoteMediator(timelineViewModel)\n\n        val result = remoteMediator.load(LoadType.REFRESH, state())\n\n        assertTrue(result is RemoteMediator.MediatorResult.Error)\n        assertTrue((result as RemoteMediator.MediatorResult.Error).throwable is HttpException)\n        assertEquals(500, (result.throwable as HttpException).code())\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should return error when network call fails`() = runTest {\n        val timelineViewModel: NetworkTimelineViewModel = mock {\n            on { accountManager } doReturn accountManager\n            on { activeAccountFlow } doReturn MutableStateFlow(account)\n            on { statusData } doReturn mutableListOf()\n            onBlocking { fetchStatusesForKind(anyOrNull(), anyOrNull(), anyOrNull()) } doThrow IOException()\n        }\n\n        val remoteMediator = NetworkTimelineRemoteMediator(timelineViewModel)\n\n        val result = remoteMediator.load(LoadType.REFRESH, state())\n\n        assertTrue(result is RemoteMediator.MediatorResult.Error)\n        assertTrue((result as RemoteMediator.MediatorResult.Error).throwable is IOException)\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should do initial loading`() = runTest {\n        val statuses: MutableList<StatusViewData> = mutableListOf()\n\n        val timelineViewModel: NetworkTimelineViewModel = mock {\n            on { accountManager } doReturn accountManager\n            on { activeAccountFlow } doReturn MutableStateFlow(account)\n            on { activeAccountFlow } doReturn MutableStateFlow(account)\n            on { statusData } doReturn statuses\n            on { nextKey } doReturn null\n            on { kind } doReturn TimelineViewModel.Kind.PUBLIC_FEDERATED\n\n            onBlocking { fetchStatusesForKind(null, null, 20) } doReturn Response.success(\n                listOf(\n                    fakeStatus(\"7\"),\n                    fakeStatus(\"6\"),\n                    fakeStatus(\"5\")\n                ),\n                Headers.headersOf(\n                    \"Link\",\n                    \"<https://mastodon.example/api/v1/favourites?limit=20&max_id=4>; rel=\\\"next\\\", <https://mastodon.example/api/v1/favourites?limit=20&min_id=8>; rel=\\\"prev\\\"\"\n                )\n            )\n        }\n\n        val remoteMediator = NetworkTimelineRemoteMediator(timelineViewModel)\n\n        val state = state(\n            listOf(\n                PagingSource.LoadResult.Page(\n                    data = emptyList(),\n                    prevKey = null,\n                    nextKey = null\n                )\n            )\n        )\n\n        val result = remoteMediator.load(LoadType.REFRESH, state)\n\n        val newStatusData = mutableListOf(\n            fakeStatusViewData(\"7\"),\n            fakeStatusViewData(\"6\"),\n            fakeStatusViewData(\"5\")\n        )\n\n        verify(timelineViewModel).nextKey = \"4\"\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertEquals(false, (result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n        assertEquals(newStatusData, statuses)\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should not prepend statuses`() = runTest {\n        val statuses: MutableList<StatusViewData> = mutableListOf(\n            fakeStatusViewData(\"3\"),\n            fakeStatusViewData(\"2\"),\n            fakeStatusViewData(\"1\")\n        )\n\n        val timelineViewModel: NetworkTimelineViewModel = mock {\n            on { accountManager } doReturn accountManager\n            on { activeAccountFlow } doReturn MutableStateFlow(account)\n            on { statusData } doReturn statuses\n            on { nextKey } doReturn \"0\"\n            on { kind } doReturn TimelineViewModel.Kind.PUBLIC_FEDERATED\n\n            onBlocking { fetchStatusesForKind(null, null, 20) } doReturn Response.success(\n                listOf(\n                    fakeStatus(\"5\"),\n                    fakeStatus(\"4\"),\n                    fakeStatus(\"3\")\n                )\n            )\n        }\n\n        val remoteMediator = NetworkTimelineRemoteMediator(timelineViewModel)\n\n        val state = state(\n            listOf(\n                PagingSource.LoadResult.Page(\n                    data = listOf(\n                        fakeStatusViewData(\"3\"),\n                        fakeStatusViewData(\"2\"),\n                        fakeStatusViewData(\"1\")\n                    ),\n                    prevKey = null,\n                    nextKey = \"0\"\n                )\n            )\n        )\n\n        val result = remoteMediator.load(LoadType.REFRESH, state)\n\n        val newStatusData = mutableListOf(\n            fakeStatusViewData(\"5\"),\n            fakeStatusViewData(\"4\"),\n            fakeStatusViewData(\"3\"),\n            fakeStatusViewData(\"2\"),\n            fakeStatusViewData(\"1\")\n        )\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertEquals(false, (result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n        assertEquals(newStatusData, statuses)\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should refresh and insert placeholder`() = runTest {\n        val statuses: MutableList<StatusViewData> = mutableListOf(\n            fakeStatusViewData(\"3\"),\n            fakeStatusViewData(\"2\"),\n            fakeStatusViewData(\"1\")\n        )\n\n        val timelineViewModel: NetworkTimelineViewModel = mock {\n            on { accountManager } doReturn accountManager\n            on { activeAccountFlow } doReturn MutableStateFlow(account)\n            on { statusData } doReturn statuses\n            on { nextKey } doReturn \"0\"\n            on { kind } doReturn TimelineViewModel.Kind.PUBLIC_FEDERATED\n\n            onBlocking { fetchStatusesForKind(null, null, 20) } doReturn Response.success(\n                listOf(\n                    fakeStatus(\"10\"),\n                    fakeStatus(\"9\"),\n                    fakeStatus(\"7\")\n                )\n            )\n        }\n\n        val remoteMediator = NetworkTimelineRemoteMediator(timelineViewModel)\n\n        val state = state(\n            listOf(\n                PagingSource.LoadResult.Page(\n                    data = listOf(\n                        fakeStatusViewData(\"3\"),\n                        fakeStatusViewData(\"2\"),\n                        fakeStatusViewData(\"1\")\n                    ),\n                    prevKey = null,\n                    nextKey = \"0\"\n                )\n            )\n        )\n\n        val result = remoteMediator.load(LoadType.REFRESH, state)\n\n        val newStatusData = mutableListOf(\n            fakeStatusViewData(\"10\"),\n            fakeStatusViewData(\"9\"),\n            StatusViewData.LoadMore(\"7\", false),\n            fakeStatusViewData(\"3\"),\n            fakeStatusViewData(\"2\"),\n            fakeStatusViewData(\"1\")\n        )\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertEquals(false, (result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n        assertEquals(newStatusData, statuses)\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should refresh and not insert placeholders`() = runTest {\n        val statuses: MutableList<StatusViewData> = mutableListOf(\n            fakeStatusViewData(\"8\"),\n            fakeStatusViewData(\"7\"),\n            fakeStatusViewData(\"5\")\n        )\n\n        val timelineViewModel: NetworkTimelineViewModel = mock {\n            on { accountManager } doReturn accountManager\n            on { activeAccountFlow } doReturn MutableStateFlow(account)\n            on { statusData } doReturn statuses\n            on { nextKey } doReturn \"3\"\n            on { kind } doReturn TimelineViewModel.Kind.PUBLIC_FEDERATED\n\n            onBlocking { fetchStatusesForKind(\"3\", null, 20) } doReturn Response.success(\n                listOf(\n                    fakeStatus(\"3\"),\n                    fakeStatus(\"2\"),\n                    fakeStatus(\"1\")\n                )\n            )\n        }\n\n        val remoteMediator = NetworkTimelineRemoteMediator(timelineViewModel)\n\n        val state = state(\n            listOf(\n                PagingSource.LoadResult.Page(\n                    data = listOf(\n                        fakeStatusViewData(\"8\"),\n                        fakeStatusViewData(\"7\"),\n                        fakeStatusViewData(\"5\")\n                    ),\n                    prevKey = null,\n                    nextKey = \"3\"\n                )\n            )\n        )\n\n        val result = remoteMediator.load(LoadType.APPEND, state)\n\n        val newStatusData = mutableListOf(\n            fakeStatusViewData(\"8\"),\n            fakeStatusViewData(\"7\"),\n            fakeStatusViewData(\"5\"),\n            fakeStatusViewData(\"3\"),\n            fakeStatusViewData(\"2\"),\n            fakeStatusViewData(\"1\")\n        )\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertEquals(false, (result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n        assertEquals(newStatusData, statuses)\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should append statuses`() = runTest {\n        val statuses: MutableList<StatusViewData> = mutableListOf(\n            fakeStatusViewData(\"8\"),\n            fakeStatusViewData(\"7\"),\n            fakeStatusViewData(\"5\")\n        )\n\n        val timelineViewModel: NetworkTimelineViewModel = mock {\n            on { accountManager } doReturn accountManager\n            on { activeAccountFlow } doReturn MutableStateFlow(account)\n            on { statusData } doReturn statuses\n            on { nextKey } doReturn \"3\"\n            on { kind } doReturn TimelineViewModel.Kind.PUBLIC_FEDERATED\n\n            onBlocking { fetchStatusesForKind(\"3\", null, 20) } doReturn Response.success(\n                listOf(\n                    fakeStatus(\"3\"),\n                    fakeStatus(\"2\"),\n                    fakeStatus(\"1\")\n                ),\n                Headers.headersOf(\n                    \"Link\",\n                    \"<https://mastodon.example/api/v1/favourites?limit=20&max_id=0>; rel=\\\"next\\\", <https://mastodon.example/api/v1/favourites?limit=20&min_id=4>; rel=\\\"prev\\\"\"\n                )\n            )\n        }\n\n        val remoteMediator = NetworkTimelineRemoteMediator(timelineViewModel)\n\n        val state = state(\n            listOf(\n                PagingSource.LoadResult.Page(\n                    data = listOf(\n                        fakeStatusViewData(\"8\"),\n                        fakeStatusViewData(\"7\"),\n                        fakeStatusViewData(\"5\")\n                    ),\n                    prevKey = null,\n                    nextKey = \"3\"\n                )\n            )\n        )\n\n        val result = remoteMediator.load(LoadType.APPEND, state)\n\n        val newStatusData = mutableListOf(\n            fakeStatusViewData(\"8\"),\n            fakeStatusViewData(\"7\"),\n            fakeStatusViewData(\"5\"),\n            fakeStatusViewData(\"3\"),\n            fakeStatusViewData(\"2\"),\n            fakeStatusViewData(\"1\")\n        )\n        verify(timelineViewModel).nextKey = \"0\"\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertEquals(false, (result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n        assertEquals(newStatusData, statuses)\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should not append statuses when pagination end has been reached`() = runTest {\n        val statuses: MutableList<StatusViewData> = mutableListOf(\n            fakeStatusViewData(\"8\"),\n            fakeStatusViewData(\"7\"),\n            fakeStatusViewData(\"5\")\n        )\n\n        val timelineViewModel: NetworkTimelineViewModel = mock {\n            on { accountManager } doReturn accountManager\n            on { activeAccountFlow } doReturn MutableStateFlow(account)\n            on { statusData } doReturn statuses\n            on { nextKey } doReturn null\n        }\n\n        val remoteMediator = NetworkTimelineRemoteMediator(timelineViewModel)\n\n        val state = state(\n            listOf(\n                PagingSource.LoadResult.Page(\n                    data = listOf(\n                        fakeStatusViewData(\"8\"),\n                        fakeStatusViewData(\"7\"),\n                        fakeStatusViewData(\"5\")\n                    ),\n                    prevKey = null,\n                    nextKey = null\n                )\n            )\n        )\n\n        val result = remoteMediator.load(LoadType.APPEND, state)\n\n        val newStatusData = mutableListOf(\n            fakeStatusViewData(\"8\"),\n            fakeStatusViewData(\"7\"),\n            fakeStatusViewData(\"5\")\n        )\n\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertTrue((result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n        assertEquals(newStatusData, statuses)\n    }\n\n    @Test\n    @ExperimentalPagingApi\n    fun `should not append duplicates for trending statuses`() = runTest {\n        val statuses: MutableList<StatusViewData> = mutableListOf(\n            fakeStatusViewData(\"5\"),\n            fakeStatusViewData(\"4\"),\n            fakeStatusViewData(\"3\")\n        )\n\n        val timelineViewModel: NetworkTimelineViewModel = mock {\n            on { accountManager } doReturn accountManager\n            on { activeAccountFlow } doReturn MutableStateFlow(account)\n            on { statusData } doReturn statuses\n            on { nextKey } doReturn \"3\"\n            on { kind } doReturn TimelineViewModel.Kind.PUBLIC_TRENDING_STATUSES\n            onBlocking { fetchStatusesForKind(\"3\", null, 20) } doReturn Response.success(\n                listOf(\n                    fakeStatus(\"3\"),\n                    fakeStatus(\"2\"),\n                    fakeStatus(\"1\")\n                ),\n                Headers.headersOf(\n                    \"Link\",\n                    \"<https://mastodon.example/api/v1/trends/statuses?offset=5>; rel=\\\"next\\\"\"\n                )\n            )\n        }\n\n        val remoteMediator = NetworkTimelineRemoteMediator(timelineViewModel)\n\n        val state = state(\n            listOf(\n                PagingSource.LoadResult.Page(\n                    data = statuses,\n                    prevKey = null,\n                    nextKey = \"3\"\n                )\n            )\n        )\n\n        val result = remoteMediator.load(LoadType.APPEND, state)\n\n        val newStatusData = mutableListOf(\n            fakeStatusViewData(\"5\"),\n            fakeStatusViewData(\"4\"),\n            fakeStatusViewData(\"3\"),\n            fakeStatusViewData(\"2\"),\n            fakeStatusViewData(\"1\")\n        )\n        verify(timelineViewModel).nextKey = \"5\"\n        assertTrue(result is RemoteMediator.MediatorResult.Success)\n        assertEquals(false, (result as RemoteMediator.MediatorResult.Success).endOfPaginationReached)\n        assertEquals(newStatusData, statuses)\n    }\n\n    private fun state(pages: List<PagingSource.LoadResult.Page<String, StatusViewData>> = emptyList()) = PagingState(\n        pages = pages,\n        anchorPosition = null,\n        config = PagingConfig(\n            pageSize = 20\n        ),\n        leadingPlaceholderCount = 0\n    )\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/components/timeline/TimelineFaker.kt",
    "content": "package com.keylesspalace.tusky.components.timeline\n\nimport androidx.paging.PagingSource\nimport androidx.room.withTransaction\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.entity.HomeTimelineData\nimport com.keylesspalace.tusky.db.entity.HomeTimelineEntity\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.entity.TimelineAccount\nimport com.keylesspalace.tusky.viewdata.StatusViewData\nimport java.util.Date\nimport org.junit.Assert.assertEquals\n\nprivate val fixedDate = Date(1638889052000)\n\nfun fakeAccount(\n    id: String = \"100\",\n    domain: String = \"mastodon.example\"\n) = TimelineAccount(\n    id = id,\n    localUsername = \"connyduck\",\n    username = \"connyduck@$domain\",\n    displayName = \"Conny Duck\",\n    note = \"This is their bio\",\n    url = \"https://$domain/@ConnyDuck\",\n    avatar = \"https://$domain/system/accounts/avatars/000/150/486/original/ab27d7ddd18a10ea.jpg\"\n)\n\nfun fakeStatus(\n    id: String = \"100\",\n    authorServerId: String = \"100\",\n    inReplyToId: String? = null,\n    inReplyToAccountId: String? = null,\n    spoilerText: String = \"\",\n    reblogged: Boolean = false,\n    favourited: Boolean = true,\n    bookmarked: Boolean = true,\n    domain: String = \"mastodon.example\",\n    reblog: Status? = null\n) = Status(\n    id = id,\n    url = \"https://$domain/@ConnyDuck/$id\",\n    account = fakeAccount(\n        id = authorServerId,\n        domain = domain\n    ),\n    inReplyToId = inReplyToId,\n    inReplyToAccountId = inReplyToAccountId,\n    reblog = reblog,\n    content = \"Test\",\n    createdAt = fixedDate,\n    editedAt = null,\n    emojis = emptyList(),\n    reblogsCount = 1,\n    favouritesCount = 2,\n    repliesCount = 3,\n    reblogged = reblogged,\n    favourited = favourited,\n    bookmarked = bookmarked,\n    sensitive = true,\n    spoilerText = spoilerText,\n    visibility = Status.Visibility.PUBLIC,\n    attachments = ArrayList(),\n    mentions = emptyList(),\n    tags = emptyList(),\n    application = Status.Application(\"Tusky\", \"https://tusky.app\"),\n    pinned = false,\n    muted = false,\n    poll = null,\n    card = null,\n    language = null,\n    filtered = emptyList()\n)\n\nfun fakeStatusViewData(\n    id: String = \"100\",\n    inReplyToId: String? = null,\n    inReplyToAccountId: String? = null,\n    isDetailed: Boolean = false,\n    spoilerText: String = \"\",\n    isExpanded: Boolean = false,\n    isShowingContent: Boolean = false,\n    isCollapsed: Boolean = !isDetailed,\n    reblogged: Boolean = false,\n    favourited: Boolean = true,\n    bookmarked: Boolean = true\n) = StatusViewData.Concrete(\n    status = fakeStatus(\n        id = id,\n        inReplyToId = inReplyToId,\n        inReplyToAccountId = inReplyToAccountId,\n        spoilerText = spoilerText,\n        reblogged = reblogged,\n        favourited = favourited,\n        bookmarked = bookmarked\n    ),\n    isExpanded = isExpanded,\n    isShowingContent = isShowingContent,\n    isCollapsed = isCollapsed,\n    isDetailed = isDetailed\n)\n\nfun fakeHomeTimelineData(\n    id: String = \"100\",\n    statusId: String = id,\n    tuskyAccountId: Long = 1,\n    authorServerId: String = \"100\",\n    expanded: Boolean = false,\n    domain: String = \"mastodon.example\",\n    reblogAuthorServerId: String? = null\n): HomeTimelineData {\n    val mockedStatus = fakeStatus(\n        id = statusId,\n        authorServerId = authorServerId,\n        domain = domain\n    )\n\n    return HomeTimelineData(\n        id = id,\n        status = mockedStatus.toEntity(\n            tuskyAccountId = tuskyAccountId,\n            expanded = expanded,\n            contentShowing = false,\n            contentCollapsed = true\n        ),\n        account = mockedStatus.account.toEntity(\n            tuskyAccountId = tuskyAccountId,\n        ),\n        reblogAccount = reblogAuthorServerId?.let { reblogAuthorId ->\n            fakeAccount(\n                id = reblogAuthorId\n            ).toEntity(\n                tuskyAccountId = tuskyAccountId,\n            )\n        },\n        repliedToAccount = null,\n        loading = false\n    )\n}\n\nfun fakePlaceholderHomeTimelineData(\n    id: String\n) = HomeTimelineData(\n    id = id,\n    account = null,\n    status = null,\n    reblogAccount = null,\n    repliedToAccount = null,\n    loading = false\n)\n\nsuspend fun AppDatabase.insert(timelineItems: List<HomeTimelineData>, tuskyAccountId: Long = 1) = withTransaction {\n    timelineItems.forEach { timelineItem ->\n        timelineItem.account?.let { account ->\n            timelineAccountDao().insert(account)\n        }\n        timelineItem.reblogAccount?.let { account ->\n            timelineAccountDao().insert(account)\n        }\n        timelineItem.status?.let { status ->\n            timelineStatusDao().insert(status)\n        }\n        timelineDao().insertHomeTimelineItem(\n            HomeTimelineEntity(\n                tuskyAccountId = tuskyAccountId,\n                id = timelineItem.id,\n                statusId = timelineItem.status?.serverId,\n                reblogAccountId = timelineItem.reblogAccount?.serverId,\n                loading = timelineItem.loading\n            )\n        )\n    }\n}\n\nsuspend fun AppDatabase.assertTimeline(\n    expected: List<HomeTimelineData>,\n    tuskyAccountId: Long = 1\n) {\n    val pagingSource = timelineDao().getHomeTimeline(tuskyAccountId)\n\n    val loadResult = pagingSource.load(PagingSource.LoadParams.Refresh(null, 100, false))\n\n    val loadedStatuses = (loadResult as PagingSource.LoadResult.Page).data\n\n    assertEquals(expected.size, loadedStatuses.size)\n\n    for ((exp, prov) in expected.zip(loadedStatuses)) {\n        assertEquals(exp.status, prov.status)\n        assertEquals(exp.account, prov.account)\n        assertEquals(exp.reblogAccount, prov.reblogAccount)\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/components/viewthread/ViewThreadViewModelTest.kt",
    "content": "package com.keylesspalace.tusky.components.viewthread\n\nimport android.os.Looper.getMainLooper\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport androidx.room.Room\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.platform.app.InstrumentationRegistry\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.StatusChangedEvent\nimport com.keylesspalace.tusky.components.instanceinfo.InstanceInfoRepository\nimport com.keylesspalace.tusky.components.timeline.fakeStatus\nimport com.keylesspalace.tusky.components.timeline.fakeStatusViewData\nimport com.keylesspalace.tusky.db.AccountManager\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.Converters\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.di.NetworkModule\nimport com.keylesspalace.tusky.entity.StatusContext\nimport com.keylesspalace.tusky.network.FilterModel\nimport com.keylesspalace.tusky.network.MastodonApi\nimport com.keylesspalace.tusky.usecase.TimelineCases\nimport java.io.IOException\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.kotlin.doReturn\nimport org.mockito.kotlin.mock\nimport org.mockito.kotlin.stub\nimport org.robolectric.Shadows.shadowOf\nimport org.robolectric.annotation.Config\n\n@Config(sdk = [34])\n@RunWith(AndroidJUnit4::class)\nclass ViewThreadViewModelTest {\n\n    private lateinit var api: MastodonApi\n    private lateinit var eventHub: EventHub\n    private lateinit var viewModel: ViewThreadViewModel\n    private lateinit var db: AppDatabase\n\n    private val threadId = \"1234\"\n    private val moshi = NetworkModule.providesMoshi()\n\n    /**\n     * Execute each task synchronously.\n     *\n     * If you do not do this, and you have code like this under test:\n     *\n     * ```\n     * fun someFunc() = viewModelScope.launch {\n     *     _uiState.value = \"initial value\"\n     *     // ...\n     *     call_a_suspend_fun()\n     *     // ...\n     *     _uiState.value = \"new value\"\n     * }\n     * ```\n     *\n     * and a test like:\n     *\n     * ```\n     * someFunc()\n     * assertEquals(\"new value\", viewModel.uiState.value)\n     * ```\n     *\n     * The test will fail, because someFunc() yields at the `call_a_suspend_func()` point,\n     * and control returns to the test before `_uiState.value` has been changed.\n     */\n    @get:Rule\n    val instantTaskRule = InstantTaskExecutorRule()\n\n    @Before\n    fun setup() {\n        shadowOf(getMainLooper()).idle()\n\n        api = mock {\n            onBlocking { getFilters() } doReturn NetworkResult.success(emptyList())\n        }\n        val instanceInfoRepo: InstanceInfoRepository = mock {\n            onBlocking { isFilterV2Supported() } doReturn false\n        }\n        eventHub = EventHub()\n        val filterModel = FilterModel(instanceInfoRepo, api)\n        val timelineCases = TimelineCases(api, eventHub)\n        val accountManager: AccountManager = mock {\n            on { activeAccount } doReturn AccountEntity(\n                id = 1,\n                domain = \"mastodon.test\",\n                accessToken = \"fakeToken\",\n                clientId = \"fakeId\",\n                clientSecret = \"fakeSecret\",\n                isActive = true\n            )\n        }\n        val context = InstrumentationRegistry.getInstrumentation().targetContext\n        db = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java)\n            .addTypeConverter(Converters(moshi))\n            .allowMainThreadQueries()\n            .build()\n\n        viewModel = ViewThreadViewModel(api, filterModel, timelineCases, db, eventHub, accountManager)\n    }\n\n    @After\n    fun closeDb() {\n        db.close()\n    }\n\n    @Test\n    fun `should emit status and context when both load`() = runTest {\n        mockSuccessResponses()\n\n        viewModel.loadThread(threadId)\n\n        assertEquals(\n            ThreadUiState.Success(\n                statusViewData = listOf(\n                    fakeStatusViewData(id = \"1\", spoilerText = \"Test\"),\n                    fakeStatusViewData(id = \"2\", inReplyToId = \"1\", inReplyToAccountId = \"1\", isDetailed = true, spoilerText = \"Test\"),\n                    fakeStatusViewData(id = \"3\", inReplyToId = \"2\", inReplyToAccountId = \"1\", spoilerText = \"Test\")\n                ),\n                detailedStatusPosition = 1,\n                revealButton = RevealButtonState.REVEAL\n            ),\n            viewModel.uiState.first()\n        )\n    }\n\n    @Test\n    fun `should emit status even if context fails to load`() = runTest {\n        api.stub {\n            onBlocking { status(threadId) } doReturn NetworkResult.success(fakeStatus(id = \"2\", inReplyToId = \"1\", inReplyToAccountId = \"1\"))\n            onBlocking { statusContext(threadId) } doReturn NetworkResult.failure(IOException())\n        }\n\n        viewModel.loadThread(threadId)\n\n        assertEquals(\n            ThreadUiState.Success(\n                statusViewData = listOf(\n                    fakeStatusViewData(id = \"2\", inReplyToId = \"1\", inReplyToAccountId = \"1\", isDetailed = true)\n                ),\n                detailedStatusPosition = 0,\n                revealButton = RevealButtonState.NO_BUTTON\n            ),\n            viewModel.uiState.first()\n        )\n    }\n\n    @Test\n    fun `should emit error when status and context fail to load`() = runTest {\n        api.stub {\n            onBlocking { status(threadId) } doReturn NetworkResult.failure(IOException())\n            onBlocking { statusContext(threadId) } doReturn NetworkResult.failure(IOException())\n        }\n\n        viewModel.loadThread(threadId)\n\n        assertEquals(\n            ThreadUiState.Error::class.java,\n            viewModel.uiState.first().javaClass\n        )\n    }\n\n    @Test\n    fun `should emit error when status fails to load`() = runTest {\n        api.stub {\n            onBlocking { status(threadId) } doReturn NetworkResult.failure(IOException())\n            onBlocking { statusContext(threadId) } doReturn NetworkResult.success(\n                StatusContext(\n                    ancestors = listOf(fakeStatus(id = \"1\")),\n                    descendants = listOf(fakeStatus(id = \"3\", inReplyToId = \"2\", inReplyToAccountId = \"1\"))\n                )\n            )\n        }\n\n        viewModel.loadThread(threadId)\n\n        assertEquals(\n            ThreadUiState.Error::class.java,\n            viewModel.uiState.first().javaClass\n        )\n    }\n\n    @Test\n    fun `should update state when reveal button is toggled`() = runTest {\n        mockSuccessResponses()\n\n        viewModel.loadThread(threadId)\n        viewModel.toggleRevealButton()\n\n        assertEquals(\n            ThreadUiState.Success(\n                statusViewData = listOf(\n                    fakeStatusViewData(id = \"1\", spoilerText = \"Test\", isExpanded = true),\n                    fakeStatusViewData(id = \"2\", inReplyToId = \"1\", inReplyToAccountId = \"1\", isDetailed = true, spoilerText = \"Test\", isExpanded = true),\n                    fakeStatusViewData(id = \"3\", inReplyToId = \"2\", inReplyToAccountId = \"1\", spoilerText = \"Test\", isExpanded = true)\n                ),\n                detailedStatusPosition = 1,\n                revealButton = RevealButtonState.HIDE\n            ),\n            viewModel.uiState.first()\n        )\n    }\n\n    @Test\n    fun `should handle status changed event`() = runTest {\n        mockSuccessResponses()\n\n        viewModel.loadThread(threadId)\n\n        eventHub.dispatch(StatusChangedEvent(fakeStatus(id = \"1\", spoilerText = \"Test\", favourited = false)))\n\n        assertEquals(\n            ThreadUiState.Success(\n                statusViewData = listOf(\n                    fakeStatusViewData(id = \"1\", spoilerText = \"Test\", favourited = false),\n                    fakeStatusViewData(id = \"2\", inReplyToId = \"1\", inReplyToAccountId = \"1\", isDetailed = true, spoilerText = \"Test\"),\n                    fakeStatusViewData(id = \"3\", inReplyToId = \"2\", inReplyToAccountId = \"1\", spoilerText = \"Test\")\n                ),\n                detailedStatusPosition = 1,\n                revealButton = RevealButtonState.REVEAL\n            ),\n            viewModel.uiState.first()\n        )\n    }\n\n    @Test\n    fun `should remove status`() = runTest {\n        mockSuccessResponses()\n\n        viewModel.loadThread(threadId)\n\n        viewModel.removeStatus(fakeStatusViewData(id = \"3\", inReplyToId = \"2\", inReplyToAccountId = \"1\", spoilerText = \"Test\"))\n\n        assertEquals(\n            ThreadUiState.Success(\n                statusViewData = listOf(\n                    fakeStatusViewData(id = \"1\", spoilerText = \"Test\"),\n                    fakeStatusViewData(id = \"2\", inReplyToId = \"1\", inReplyToAccountId = \"1\", isDetailed = true, spoilerText = \"Test\")\n                ),\n                detailedStatusPosition = 1,\n                revealButton = RevealButtonState.REVEAL\n            ),\n            viewModel.uiState.first()\n        )\n    }\n\n    @Test\n    fun `should change status expanded state`() = runTest {\n        mockSuccessResponses()\n\n        viewModel.loadThread(threadId)\n\n        viewModel.changeExpanded(\n            true,\n            fakeStatusViewData(id = \"2\", inReplyToId = \"1\", inReplyToAccountId = \"1\", isDetailed = true, spoilerText = \"Test\")\n        )\n\n        assertEquals(\n            ThreadUiState.Success(\n                statusViewData = listOf(\n                    fakeStatusViewData(id = \"1\", spoilerText = \"Test\"),\n                    fakeStatusViewData(id = \"2\", inReplyToId = \"1\", inReplyToAccountId = \"1\", isDetailed = true, spoilerText = \"Test\", isExpanded = true),\n                    fakeStatusViewData(id = \"3\", inReplyToId = \"2\", inReplyToAccountId = \"1\", spoilerText = \"Test\")\n                ),\n                detailedStatusPosition = 1,\n                revealButton = RevealButtonState.REVEAL\n            ),\n            viewModel.uiState.first()\n        )\n    }\n\n    @Test\n    fun `should change content collapsed state`() = runTest {\n        mockSuccessResponses()\n\n        viewModel.loadThread(threadId)\n\n        viewModel.changeContentCollapsed(\n            true,\n            fakeStatusViewData(id = \"2\", inReplyToId = \"1\", inReplyToAccountId = \"1\", isDetailed = true, spoilerText = \"Test\")\n        )\n\n        assertEquals(\n            ThreadUiState.Success(\n                statusViewData = listOf(\n                    fakeStatusViewData(id = \"1\", spoilerText = \"Test\"),\n                    fakeStatusViewData(id = \"2\", inReplyToId = \"1\", inReplyToAccountId = \"1\", isDetailed = true, spoilerText = \"Test\", isCollapsed = true),\n                    fakeStatusViewData(id = \"3\", inReplyToId = \"2\", inReplyToAccountId = \"1\", spoilerText = \"Test\")\n                ),\n                detailedStatusPosition = 1,\n                revealButton = RevealButtonState.REVEAL\n            ),\n            viewModel.uiState.first()\n        )\n    }\n\n    @Test\n    fun `should change content showing state`() = runTest {\n        mockSuccessResponses()\n\n        viewModel.loadThread(threadId)\n\n        viewModel.changeContentShowing(\n            true,\n            fakeStatusViewData(id = \"2\", inReplyToId = \"1\", inReplyToAccountId = \"1\", isDetailed = true, spoilerText = \"Test\")\n        )\n\n        assertEquals(\n            ThreadUiState.Success(\n                statusViewData = listOf(\n                    fakeStatusViewData(id = \"1\", spoilerText = \"Test\"),\n                    fakeStatusViewData(id = \"2\", inReplyToId = \"1\", inReplyToAccountId = \"1\", isDetailed = true, spoilerText = \"Test\", isShowingContent = true),\n                    fakeStatusViewData(id = \"3\", inReplyToId = \"2\", inReplyToAccountId = \"1\", spoilerText = \"Test\")\n                ),\n                detailedStatusPosition = 1,\n                revealButton = RevealButtonState.REVEAL\n            ),\n            viewModel.uiState.first()\n        )\n    }\n\n    private fun mockSuccessResponses() {\n        api.stub {\n            onBlocking { status(threadId) } doReturn NetworkResult.success(fakeStatus(id = \"2\", inReplyToId = \"1\", inReplyToAccountId = \"1\", spoilerText = \"Test\"))\n            onBlocking { statusContext(threadId) } doReturn NetworkResult.success(\n                StatusContext(\n                    ancestors = listOf(fakeStatus(id = \"1\", spoilerText = \"Test\")),\n                    descendants = listOf(fakeStatus(id = \"3\", inReplyToId = \"2\", inReplyToAccountId = \"1\", spoilerText = \"Test\"))\n                )\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/db/MigrationsTest.kt",
    "content": "package com.keylesspalace.tusky.db\n\nimport androidx.room.testing.MigrationTestHelper\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.platform.app.InstrumentationRegistry\nimport com.keylesspalace.tusky.di.StorageModule\nimport com.keylesspalace.tusky.entity.Emoji\nimport com.squareup.moshi.Moshi\nimport com.squareup.moshi.Types\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.test.runTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.annotation.Config\n\n@Config(sdk = [34])\n@RunWith(AndroidJUnit4::class)\nclass MigrationsTest {\n\n    @get:Rule\n    val migrationHelper = MigrationTestHelper(\n        InstrumentationRegistry.getInstrumentation(),\n        AppDatabase::class.java\n    )\n\n    @Test\n    fun testMigrations() = runTest {\n        /** the db name must match the one in [StorageModule.providesDatabase] */\n        val db = migrationHelper.createDatabase(\"tuskyDB\", 10)\n        val moshi = Moshi.Builder().build()\n\n        val id = 1L\n        val domain = \"domain.site\"\n        val token = \"token\"\n        val active = true\n        val accountId = \"accountId\"\n        val username = \"username\"\n        val emoji = moshi.adapter<List<Emoji>>(Types.newParameterizedType(List::class.java, Emoji::class.java), emptySet()).toJson(\n            listOf(\n                Emoji(\n                    shortcode = \"testemoji\",\n                    url = \"https://some.url\",\n                    staticUrl = \"https://some.url\",\n                    visibleInPicker = true,\n                    category = null\n                )\n            )\n        )\n        val values = arrayOf(\n            id, domain, token, active, accountId, username, \"Display Name\",\n            \"https://picture.url\", true, true, true, true, true, true, true,\n            true, \"1000\", \"[]\", emoji, 0, false,\n            false, true\n        )\n\n        db.execSQL(\n            \"INSERT OR REPLACE INTO `AccountEntity`(`id`,`domain`,`accessToken`,`isActive`,\" +\n                \"`accountId`,`username`,`displayName`,`profilePictureUrl`,`notificationsEnabled`,\" +\n                \"`notificationsMentioned`,`notificationsFollowed`,`notificationsReblogged`,\" +\n                \"`notificationsFavorited`,`notificationSound`,`notificationVibration`,\" +\n                \"`notificationLight`,`lastNotificationId`,`activeNotifications`,`emojis`,\" +\n                \"`defaultPostPrivacy`,`defaultMediaSensitivity`,`alwaysShowSensitiveMedia`,\" +\n                \"`mediaPreviewEnabled`) \" +\n                \"VALUES (nullif(?, 0),?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)\",\n            values\n        )\n\n        db.close()\n\n        // Room will run all migrations and validate the scheme afterwards\n        val roomDb = StorageModule.providesDatabase(\n            InstrumentationRegistry.getInstrumentation().context,\n            Converters(moshi)\n        )\n\n        val account = roomDb.accountDao().allAccounts().first().first()\n\n        roomDb.close()\n\n        assertEquals(id, account.id)\n        assertEquals(domain, account.domain)\n        assertEquals(token, account.accessToken)\n        assertEquals(active, account.isActive)\n        assertEquals(accountId, account.accountId)\n        assertEquals(username, account.username)\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/db/dao/DatabaseCleanerTest.kt",
    "content": "package com.keylesspalace.tusky.db.dao\n\nimport androidx.room.Room\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.platform.app.InstrumentationRegistry\nimport com.keylesspalace.tusky.components.notifications.fakeNotification\nimport com.keylesspalace.tusky.components.notifications.fakeReport\nimport com.keylesspalace.tusky.components.notifications.insert\nimport com.keylesspalace.tusky.components.timeline.fakeAccount\nimport com.keylesspalace.tusky.components.timeline.fakeHomeTimelineData\nimport com.keylesspalace.tusky.components.timeline.fakeStatus\nimport com.keylesspalace.tusky.components.timeline.insert\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.Converters\nimport com.keylesspalace.tusky.db.DatabaseCleaner\nimport com.keylesspalace.tusky.db.entity.HomeTimelineEntity\nimport com.keylesspalace.tusky.db.entity.NotificationEntity\nimport com.keylesspalace.tusky.db.entity.NotificationReportEntity\nimport com.keylesspalace.tusky.db.entity.TimelineAccountEntity\nimport com.keylesspalace.tusky.db.entity.TimelineStatusEntity\nimport com.keylesspalace.tusky.di.NetworkModule\nimport kotlin.reflect.KClass\nimport kotlinx.coroutines.test.runTest\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.annotation.Config\n\n@Config(sdk = [34])\n@RunWith(AndroidJUnit4::class)\nclass DatabaseCleanerTest {\n    private lateinit var timelineDao: TimelineDao\n    private lateinit var dbCleaner: DatabaseCleaner\n    private lateinit var db: AppDatabase\n\n    private val moshi = NetworkModule.providesMoshi()\n\n    @Before\n    fun createDb() {\n        val context = InstrumentationRegistry.getInstrumentation().targetContext\n        db = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java)\n            .addTypeConverter(Converters(moshi))\n            .allowMainThreadQueries()\n            .build()\n        timelineDao = db.timelineDao()\n        dbCleaner = DatabaseCleaner(db)\n    }\n\n    @After\n    fun closeDb() {\n        db.close()\n    }\n\n    @Test\n    fun cleanupOldData() = runTest {\n        fillDatabase()\n\n        dbCleaner.cleanupOldData(tuskyAccountId = 1, timelineLimit = 3, notificationLimit = 3)\n\n        // all but 3 timeline items and notifications and all references items should be gone for Tusky account 1\n        // items of Tusky account 2 should be untouched\n        expect(\n            hometimelineItems = listOf(\n                1L to \"10\",\n                1L to \"100\",\n                1L to \"8\",\n                2L to \"2\"\n            ),\n            statuses = listOf(\n                1L to \"10\",\n                1L to \"100\",\n                1L to \"8\",\n                1L to \"n3\",\n                1L to \"n4\",\n                1L to \"n5\",\n                2L to \"2\",\n                2L to \"n1\",\n                2L to \"n2\",\n                2L to \"n3\",\n                2L to \"n4\"\n            ),\n            notifications = listOf(\n                1L to \"3\",\n                1L to \"4\",\n                1L to \"5\",\n                2L to \"1\",\n                2L to \"2\",\n                2L to \"3\",\n                2L to \"4\",\n            ),\n            accounts = listOf(\n                1L to \"10\",\n                1L to \"100\",\n                1L to \"3\",\n                1L to \"R10\",\n                1L to \"n3\",\n                1L to \"n4\",\n                1L to \"n5\",\n                1L to \"r2\",\n                2L to \"100\",\n                2L to \"5\",\n                2L to \"n1\",\n                2L to \"n2\",\n                2L to \"n3\",\n                2L to \"n4\",\n                2L to \"r1\"\n            ),\n            reports = listOf(\n                1L to \"2\",\n                2L to \"1\"\n            ),\n        )\n    }\n\n    @Test\n    fun cleanupEverything() = runTest {\n        fillDatabase()\n\n        dbCleaner.cleanupEverything(tuskyAccountId = 1)\n\n        // everything from Tusky account 1 should be gone\n        // items of Tusky account 2 should be untouched\n        expect(\n            hometimelineItems = listOf(\n                2L to \"2\"\n            ),\n            statuses = listOf(\n                2L to \"2\",\n                2L to \"n1\",\n                2L to \"n2\",\n                2L to \"n3\",\n                2L to \"n4\"\n            ),\n            notifications = listOf(\n                2L to \"1\",\n                2L to \"2\",\n                2L to \"3\",\n                2L to \"4\",\n            ),\n            accounts = listOf(\n                2L to \"100\",\n                2L to \"5\",\n                2L to \"n1\",\n                2L to \"n2\",\n                2L to \"n3\",\n                2L to \"n4\",\n                2L to \"r1\"\n            ),\n            reports = listOf(\n                2L to \"1\"\n            ),\n        )\n    }\n\n    private suspend fun fillDatabase() {\n        db.insert(\n            listOf(\n                fakeHomeTimelineData(id = \"100\", authorServerId = \"100\"),\n                fakeHomeTimelineData(id = \"10\", authorServerId = \"3\"),\n                fakeHomeTimelineData(id = \"8\", reblogAuthorServerId = \"R10\", authorServerId = \"10\"),\n                fakeHomeTimelineData(id = \"5\", authorServerId = \"100\"),\n                fakeHomeTimelineData(id = \"3\", authorServerId = \"4\"),\n                fakeHomeTimelineData(id = \"1\", authorServerId = \"5\")\n            ),\n            tuskyAccountId = 1\n        )\n        db.insert(\n            listOf(\n                fakeHomeTimelineData(id = \"2\", tuskyAccountId = 2, authorServerId = \"5\")\n            ),\n            tuskyAccountId = 2\n        )\n\n        db.insert(\n            listOf(\n                fakeNotification(id = \"1\", account = fakeAccount(id = \"n1\"), status = fakeStatus(id = \"n1\")),\n                fakeNotification(id = \"2\", account = fakeAccount(id = \"n2\"), status = fakeStatus(id = \"n2\"), report = fakeReport(targetAccount = fakeAccount(id = \"r1\"))),\n                fakeNotification(id = \"3\", account = fakeAccount(id = \"n3\"), status = fakeStatus(id = \"n3\")),\n                fakeNotification(id = \"4\", account = fakeAccount(id = \"n4\"), status = fakeStatus(id = \"n4\"), report = fakeReport(id = \"2\", targetAccount = fakeAccount(id = \"r2\"))),\n                fakeNotification(id = \"5\", account = fakeAccount(id = \"n5\"), status = fakeStatus(id = \"n5\")),\n            ),\n            tuskyAccountId = 1\n        )\n        db.insert(\n            listOf(\n                fakeNotification(id = \"1\", account = fakeAccount(id = \"n1\"), status = fakeStatus(id = \"n1\")),\n                fakeNotification(id = \"2\", account = fakeAccount(id = \"n2\"), status = fakeStatus(id = \"n2\")),\n                fakeNotification(id = \"3\", account = fakeAccount(id = \"n3\"), status = fakeStatus(id = \"n3\")),\n                fakeNotification(id = \"4\", account = fakeAccount(id = \"n4\"), status = fakeStatus(id = \"n4\"), report = fakeReport(targetAccount = fakeAccount(id = \"r1\")))\n            ),\n            tuskyAccountId = 2\n        )\n    }\n\n    private fun expect(\n        hometimelineItems: List<Pair<Long, String>>,\n        statuses: List<Pair<Long, String>>,\n        notifications: List<Pair<Long, String>>,\n        accounts: List<Pair<Long, String>>,\n        reports: List<Pair<Long, String>>,\n    ) {\n        expect(HomeTimelineEntity::class, \"id\", hometimelineItems)\n        expect(TimelineStatusEntity::class, \"serverId\", statuses)\n        expect(NotificationEntity::class, \"id\", notifications)\n        expect(TimelineAccountEntity::class, \"serverId\", accounts)\n        expect(NotificationReportEntity::class, \"serverId\", reports)\n    }\n\n    private fun expect(\n        entity: KClass<*>,\n        idName: String,\n        expectedItems: List<Pair<Long, String>>\n    ) {\n        val loadedItems: MutableList<Pair<Long, String>> = mutableListOf()\n        val cursor = db.query(\"SELECT tuskyAccountId, $idName FROM ${entity.simpleName} ORDER BY tuskyAccountId, $idName\", null)\n        cursor.moveToFirst()\n        while (!cursor.isAfterLast) {\n            val tuskyAccountId: Long = cursor.getLong(cursor.getColumnIndex(\"tuskyAccountId\"))\n            val id: String = cursor.getString(cursor.getColumnIndex(idName))\n            loadedItems.add(tuskyAccountId to id)\n            cursor.moveToNext()\n        }\n        cursor.close()\n\n        assertEquals(expectedItems, loadedItems)\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/db/dao/NotificationsDaoTest.kt",
    "content": "package com.keylesspalace.tusky.db.dao\n\nimport androidx.paging.PagingSource\nimport androidx.room.Room\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.platform.app.InstrumentationRegistry\nimport com.keylesspalace.tusky.components.notifications.fakeNotification\nimport com.keylesspalace.tusky.components.notifications.fakeReport\nimport com.keylesspalace.tusky.components.notifications.insert\nimport com.keylesspalace.tusky.components.notifications.toNotificationDataEntity\nimport com.keylesspalace.tusky.components.notifications.toNotificationEntity\nimport com.keylesspalace.tusky.components.timeline.LoadMorePlaceholder\nimport com.keylesspalace.tusky.components.timeline.fakeAccount\nimport com.keylesspalace.tusky.components.timeline.fakeStatus\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.Converters\nimport com.keylesspalace.tusky.di.NetworkModule\nimport com.keylesspalace.tusky.entity.Notification\nimport kotlinx.coroutines.test.runTest\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNull\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.annotation.Config\n\n@Config(sdk = [34])\n@RunWith(AndroidJUnit4::class)\nclass NotificationsDaoTest {\n    private lateinit var notificationsDao: NotificationsDao\n    private lateinit var db: AppDatabase\n\n    private val moshi = NetworkModule.providesMoshi()\n\n    @Before\n    fun createDb() {\n        val context = InstrumentationRegistry.getInstrumentation().targetContext\n        db = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java)\n            .addTypeConverter(Converters(moshi))\n            .allowMainThreadQueries()\n            .build()\n        notificationsDao = db.notificationsDao()\n    }\n\n    @After\n    fun closeDb() {\n        db.close()\n    }\n\n    @Test\n    fun insertAndGetNotification() = runTest {\n        db.insert(\n            listOf(\n                fakeNotification(id = \"1\"),\n                fakeNotification(id = \"2\"),\n                fakeNotification(id = \"3\"),\n            ),\n            tuskyAccountId = 1\n        )\n        db.insert(\n            listOf(fakeNotification(id = \"3\")),\n            tuskyAccountId = 2\n        )\n\n        val pagingSource = notificationsDao.getNotifications(tuskyAccountId = 1)\n\n        val loadResult = pagingSource.load(PagingSource.LoadParams.Refresh(null, 2, false))\n\n        val loadedStatuses = (loadResult as PagingSource.LoadResult.Page).data\n\n        assertEquals(\n            listOf(\n                fakeNotification(id = \"3\").toNotificationDataEntity(1),\n                fakeNotification(id = \"2\").toNotificationDataEntity(1)\n            ),\n            loadedStatuses\n        )\n    }\n\n    @Test\n    fun deleteRange() = runTest {\n        val notifications = listOf(\n            fakeNotification(id = \"100\"),\n            fakeNotification(id = \"50\"),\n            fakeNotification(id = \"15\"),\n            fakeNotification(id = \"14\"),\n            fakeNotification(id = \"13\"),\n            fakeNotification(id = \"12\"),\n            fakeNotification(id = \"11\"),\n            fakeNotification(id = \"9\")\n        )\n\n        db.insert(notifications, 1)\n        db.insert(listOf(fakeNotification(id = \"13\")), 2)\n\n        assertEquals(3, notificationsDao.deleteRange(1, \"12\", \"14\"))\n        assertEquals(0, notificationsDao.deleteRange(1, \"80\", \"80\"))\n        assertEquals(0, notificationsDao.deleteRange(1, \"60\", \"80\"))\n        assertEquals(0, notificationsDao.deleteRange(1, \"5\", \"8\"))\n        assertEquals(0, notificationsDao.deleteRange(1, \"101\", \"1000\"))\n        assertEquals(1, notificationsDao.deleteRange(1, \"50\", \"50\"))\n\n        val loadParams: PagingSource.LoadParams<Int> = PagingSource.LoadParams.Refresh(null, 100, false)\n\n        val notificationsAccount1 = (notificationsDao.getNotifications(1).load(loadParams) as PagingSource.LoadResult.Page).data\n        val notificationsAccount2 = (notificationsDao.getNotifications(2).load(loadParams) as PagingSource.LoadResult.Page).data\n\n        val remainingNotificationsAccount1 = listOf(\n            fakeNotification(id = \"100\").toNotificationDataEntity(1),\n            fakeNotification(id = \"15\").toNotificationDataEntity(1),\n            fakeNotification(id = \"11\").toNotificationDataEntity(1),\n            fakeNotification(id = \"9\").toNotificationDataEntity(1)\n        )\n\n        val remainingNotificationsAccount2 = listOf(\n            fakeNotification(id = \"13\").toNotificationDataEntity(2)\n        )\n\n        assertEquals(remainingNotificationsAccount1, notificationsAccount1)\n        assertEquals(remainingNotificationsAccount2, notificationsAccount2)\n    }\n\n    @Test\n    fun deleteAllForInstance() = runTest {\n        val redAccount = fakeNotification(id = \"500\", account = fakeAccount(id = \"500\", domain = \"mastodon.red\"))\n        val blueAccount = fakeNotification(id = \"501\", account = fakeAccount(id = \"501\", domain = \"mastodon.blue\"))\n        val redStatus = fakeNotification(id = \"502\", account = fakeAccount(id = \"502\", domain = \"mastodon.example\"), status = fakeStatus(id = \"502\", domain = \"mastodon.red\", authorServerId = \"502a\"))\n        val blueStatus = fakeNotification(id = \"503\", account = fakeAccount(id = \"503\", domain = \"mastodon.example\"), status = fakeStatus(id = \"503\", domain = \"mastodon.blue\", authorServerId = \"503a\"))\n\n        val redStatus2 = fakeNotification(id = \"600\", account = fakeAccount(id = \"600\", domain = \"mastodon.red\"))\n\n        db.insert(listOf(redAccount, blueAccount, redStatus, blueStatus), 1)\n        db.insert(listOf(redStatus2), 2)\n\n        notificationsDao.deleteAllFromInstance(1, \"mastodon.red\")\n        notificationsDao.deleteAllFromInstance(1, \"mastodon.blu\") // shouldn't delete anything\n        notificationsDao.deleteAllFromInstance(1, \"mastodon.green\") // shouldn't delete anything\n\n        val loadParams: PagingSource.LoadParams<Int> = PagingSource.LoadParams.Refresh(null, 100, false)\n\n        val notificationsAccount1 = (notificationsDao.getNotifications(1).load(loadParams) as PagingSource.LoadResult.Page).data\n        val notificationsAccount2 = (notificationsDao.getNotifications(2).load(loadParams) as PagingSource.LoadResult.Page).data\n\n        assertEquals(\n            listOf(\n                blueStatus.toNotificationDataEntity(1),\n                blueAccount.toNotificationDataEntity(1)\n            ),\n            notificationsAccount1\n        )\n        assertEquals(listOf(redStatus2.toNotificationDataEntity(2)), notificationsAccount2)\n    }\n\n    @Test\n    fun `should return null as topId when db is empty`() = runTest {\n        assertNull(notificationsDao.getTopId(1))\n    }\n\n    @Test\n    fun `should return correct topId`() = runTest {\n        db.insert(\n            listOf(\n                fakeNotification(id = \"100\"),\n                fakeNotification(id = \"3\"),\n                fakeNotification(id = \"33\"),\n                fakeNotification(id = \"8\"),\n            ),\n            tuskyAccountId = 1\n        )\n        db.insert(\n            listOf(\n                fakeNotification(id = \"200\"),\n                fakeNotification(id = \"300\"),\n                fakeNotification(id = \"1000\"),\n            ),\n            tuskyAccountId = 2\n        )\n\n        assertEquals(\"100\", notificationsDao.getTopId(1))\n        assertEquals(\"1000\", notificationsDao.getTopId(2))\n    }\n\n    @Test\n    fun `should return correct top placeholderId`() = runTest {\n        val notifications = listOf(\n            fakeNotification(id = \"1000\"),\n            fakeNotification(id = \"97\"),\n            fakeNotification(id = \"90\"),\n            fakeNotification(id = \"77\")\n        )\n        db.insert(notifications)\n\n        notificationsDao.insertNotification(LoadMorePlaceholder(id = \"99\", loading = false).toNotificationEntity(1))\n        notificationsDao.insertNotification(LoadMorePlaceholder(id = \"96\", loading = false).toNotificationEntity(1))\n        notificationsDao.insertNotification(LoadMorePlaceholder(id = \"80\", loading = false).toNotificationEntity(1))\n\n        assertEquals(\"99\", notificationsDao.getTopPlaceholderId(1))\n    }\n\n    @Test\n    fun `should correctly delete all by user`() = runTest {\n        val notificationsAccount1 = listOf(\n            // will be removed because it is a like by account 1\n            fakeNotification(id = \"1\", account = fakeAccount(id = \"1\"), status = fakeStatus(id = \"1\", authorServerId = \"100\")),\n            // will be removed because it references a status by account 1\n            fakeNotification(id = \"2\", account = fakeAccount(id = \"2\"), status = fakeStatus(id = \"2\", authorServerId = \"1\")),\n            // will not be removed because they are admin notifications\n            fakeNotification(type = Notification.Type.Report, id = \"3\", account = fakeAccount(id = \"3\"), status = null, report = fakeReport(id = \"1\", targetAccount = fakeAccount(id = \"1\"))),\n            fakeNotification(type = Notification.Type.SignUp, id = \"4\", account = fakeAccount(id = \"1\"), status = null, report = fakeReport(id = \"1\", targetAccount = fakeAccount(id = \"4\"))),\n            // will not be removed because it does not reference account 1\n            fakeNotification(id = \"5\", account = fakeAccount(id = \"5\"), status = fakeStatus(id = \"5\", authorServerId = \"100\")),\n            fakeNotification(type = Notification.Type.Follow, id = \"6\", account = fakeAccount(id = \"1\"), status = null)\n        )\n\n        db.insert(notificationsAccount1, tuskyAccountId = 1)\n        db.insert(listOf(fakeNotification(id = \"2000\")), tuskyAccountId = 2)\n\n        notificationsDao.removeAllByUser(1, \"1\")\n\n        val loadedNotifications: MutableList<String> = mutableListOf()\n        val cursor = db.query(\"SELECT id FROM NotificationEntity ORDER BY id ASC\", null)\n        cursor.moveToFirst()\n        while (!cursor.isAfterLast) {\n            val id: String = cursor.getString(cursor.getColumnIndex(\"id\"))\n            loadedNotifications.add(id)\n            cursor.moveToNext()\n        }\n        cursor.close()\n\n        val expectedNotifications = listOf(\"2000\", \"3\", \"4\", \"5\")\n\n        assertEquals(expectedNotifications, loadedNotifications)\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/db/dao/TimelineDaoTest.kt",
    "content": "package com.keylesspalace.tusky.db.dao\n\nimport androidx.paging.PagingSource\nimport androidx.room.Room\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.platform.app.InstrumentationRegistry\nimport com.keylesspalace.tusky.components.timeline.fakeHomeTimelineData\nimport com.keylesspalace.tusky.components.timeline.fakePlaceholderHomeTimelineData\nimport com.keylesspalace.tusky.components.timeline.insert\nimport com.keylesspalace.tusky.db.AppDatabase\nimport com.keylesspalace.tusky.db.Converters\nimport com.keylesspalace.tusky.di.NetworkModule\nimport kotlinx.coroutines.test.runTest\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNull\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.annotation.Config\n\n@Config(sdk = [34])\n@RunWith(AndroidJUnit4::class)\nclass TimelineDaoTest {\n    private lateinit var timelineDao: TimelineDao\n    private lateinit var db: AppDatabase\n\n    private val moshi = NetworkModule.providesMoshi()\n\n    @Before\n    fun createDb() {\n        val context = InstrumentationRegistry.getInstrumentation().targetContext\n        db = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java)\n            .addTypeConverter(Converters(moshi))\n            .allowMainThreadQueries()\n            .build()\n        timelineDao = db.timelineDao()\n    }\n\n    @After\n    fun closeDb() {\n        db.close()\n    }\n\n    @Test\n    fun insertGetStatus() = runTest {\n        val setOne = fakeHomeTimelineData(id = \"3\")\n        val setTwo = fakeHomeTimelineData(id = \"20\", reblogAuthorServerId = \"R1\")\n        val ignoredOne = fakeHomeTimelineData(id = \"1\")\n        val ignoredTwo = fakeHomeTimelineData(id = \"2\", tuskyAccountId = 2)\n\n        db.insert(\n            listOf(setOne, setTwo, ignoredOne),\n            tuskyAccountId = 1\n        )\n        db.insert(\n            listOf(ignoredTwo),\n            tuskyAccountId = 2\n        )\n\n        val pagingSource = timelineDao.getHomeTimeline(1)\n\n        val loadResult = pagingSource.load(PagingSource.LoadParams.Refresh(null, 2, false))\n\n        val loadedStatuses = (loadResult as PagingSource.LoadResult.Page).data\n\n        assertEquals(2, loadedStatuses.size)\n        assertEquals(listOf(setTwo, setOne), loadedStatuses)\n    }\n\n    @Test\n    fun overwriteDeletedStatus() = runTest {\n        val oldStatuses = listOf(\n            fakeHomeTimelineData(id = \"3\"),\n            fakeHomeTimelineData(id = \"2\"),\n            fakeHomeTimelineData(id = \"1\")\n        )\n\n        db.insert(oldStatuses, 1)\n\n        // status 2 gets deleted, newly loaded status contain only 1 + 3\n        val newStatuses = listOf(\n            fakeHomeTimelineData(id = \"3\"),\n            fakeHomeTimelineData(id = \"1\")\n        )\n\n        val deletedCount = timelineDao.deleteRange(1, newStatuses.last().id, newStatuses.first().id)\n        assertEquals(3, deletedCount)\n\n        db.insert(newStatuses, 1)\n\n        // make sure status 2 is no longer in db\n        val pagingSource = timelineDao.getHomeTimeline(1)\n\n        val loadResult = pagingSource.load(PagingSource.LoadParams.Refresh(null, 100, false))\n\n        val loadedStatuses = (loadResult as PagingSource.LoadResult.Page).data\n\n        assertEquals(newStatuses, loadedStatuses)\n    }\n\n    @Test\n    fun deleteRange() = runTest {\n        val statuses = listOf(\n            fakeHomeTimelineData(id = \"100\"),\n            fakeHomeTimelineData(id = \"50\"),\n            fakeHomeTimelineData(id = \"15\"),\n            fakeHomeTimelineData(id = \"14\"),\n            fakeHomeTimelineData(id = \"13\"),\n            fakeHomeTimelineData(id = \"13\", tuskyAccountId = 2),\n            fakeHomeTimelineData(id = \"12\"),\n            fakeHomeTimelineData(id = \"11\"),\n            fakeHomeTimelineData(id = \"9\")\n        )\n\n        db.insert(statuses - statuses[5], 1)\n        db.insert(listOf(statuses[5]), 2)\n\n        assertEquals(3, timelineDao.deleteRange(1, \"12\", \"14\"))\n        assertEquals(0, timelineDao.deleteRange(1, \"80\", \"80\"))\n        assertEquals(0, timelineDao.deleteRange(1, \"60\", \"80\"))\n        assertEquals(0, timelineDao.deleteRange(1, \"5\", \"8\"))\n        assertEquals(0, timelineDao.deleteRange(1, \"101\", \"1000\"))\n        assertEquals(1, timelineDao.deleteRange(1, \"50\", \"50\"))\n\n        val loadParams: PagingSource.LoadParams<Int> = PagingSource.LoadParams.Refresh(null, 100, false)\n\n        val statusesAccount1 = (timelineDao.getHomeTimeline(1).load(loadParams) as PagingSource.LoadResult.Page).data\n        val statusesAccount2 = (timelineDao.getHomeTimeline(2).load(loadParams) as PagingSource.LoadResult.Page).data\n\n        val remainingStatusesAccount1 = listOf(\n            fakeHomeTimelineData(id = \"100\"),\n            fakeHomeTimelineData(id = \"15\"),\n            fakeHomeTimelineData(id = \"11\"),\n            fakeHomeTimelineData(id = \"9\")\n        )\n\n        val remainingStatusesAccount2 = listOf(\n            fakeHomeTimelineData(id = \"13\", tuskyAccountId = 2)\n        )\n\n        assertEquals(remainingStatusesAccount1, statusesAccount1)\n        assertEquals(remainingStatusesAccount2, statusesAccount2)\n    }\n\n    @Test\n    fun deleteAllForInstance() = runTest {\n        val statusWithRedDomain1 = fakeHomeTimelineData(\n            id = \"15\",\n            tuskyAccountId = 1,\n            domain = \"mastodon.red\",\n            authorServerId = \"1\"\n        )\n        val statusWithRedDomain2 = fakeHomeTimelineData(\n            id = \"14\",\n            tuskyAccountId = 1,\n            domain = \"mastodon.red\",\n            authorServerId = \"2\"\n        )\n        val statusWithRedDomainOtherAccount = fakeHomeTimelineData(\n            id = \"12\",\n            tuskyAccountId = 2,\n            domain = \"mastodon.red\",\n            authorServerId = \"2\"\n        )\n        val statusWithBlueDomain = fakeHomeTimelineData(\n            id = \"10\",\n            tuskyAccountId = 1,\n            domain = \"mastodon.blue\",\n            authorServerId = \"4\"\n        )\n        val statusWithBlueDomainOtherAccount = fakeHomeTimelineData(\n            id = \"10\",\n            tuskyAccountId = 2,\n            domain = \"mastodon.blue\",\n            authorServerId = \"5\"\n        )\n        val statusWithGreenDomain = fakeHomeTimelineData(\n            id = \"8\",\n            tuskyAccountId = 1,\n            domain = \"mastodon.green\",\n            authorServerId = \"6\"\n        )\n\n        db.insert(listOf(statusWithRedDomain1, statusWithRedDomain2, statusWithBlueDomain, statusWithGreenDomain), 1)\n        db.insert(listOf(statusWithRedDomainOtherAccount, statusWithBlueDomainOtherAccount), 2)\n\n        timelineDao.deleteAllFromInstance(1, \"mastodon.red\")\n        timelineDao.deleteAllFromInstance(1, \"mastodon.blu\") // shouldn't delete anything\n        timelineDao.deleteAllFromInstance(1, \"greenmastodon.green\") // shouldn't delete anything\n\n        val loadParams: PagingSource.LoadParams<Int> = PagingSource.LoadParams.Refresh(null, 100, false)\n\n        val statusesAccount1 = (timelineDao.getHomeTimeline(1).load(loadParams) as PagingSource.LoadResult.Page).data\n        val statusesAccount2 = (timelineDao.getHomeTimeline(2).load(loadParams) as PagingSource.LoadResult.Page).data\n\n        assertEquals(listOf(statusWithBlueDomain, statusWithGreenDomain), statusesAccount1)\n        assertEquals(listOf(statusWithRedDomainOtherAccount, statusWithBlueDomainOtherAccount), statusesAccount2)\n    }\n\n    @Test\n    fun `should return null as topId when db is empty`() = runTest {\n        assertNull(timelineDao.getTopId(1))\n    }\n\n    @Test\n    fun `should return correct topId`() = runTest {\n        val statusData = listOf(\n            fakeHomeTimelineData(\n                id = \"4\",\n                tuskyAccountId = 1,\n                domain = \"mastodon.test\",\n                authorServerId = \"1\"\n            ),\n            fakeHomeTimelineData(\n                id = \"33\",\n                tuskyAccountId = 1,\n                domain = \"mastodon.test\",\n                authorServerId = \"2\"\n            ),\n            fakeHomeTimelineData(\n                id = \"22\",\n                tuskyAccountId = 1,\n                domain = \"mastodon.test\",\n                authorServerId = \"2\"\n            )\n        )\n\n        db.insert(statusData, 1)\n\n        assertEquals(\"33\", timelineDao.getTopId(1))\n    }\n\n    @Test\n    fun `should return correct top placeholderId`() = runTest {\n        val statusData = listOf(\n            fakeHomeTimelineData(id = \"1000\"),\n            fakePlaceholderHomeTimelineData(id = \"99\"),\n            fakeHomeTimelineData(id = \"97\"),\n            fakePlaceholderHomeTimelineData(id = \"96\"),\n            fakeHomeTimelineData(id = \"90\"),\n            fakePlaceholderHomeTimelineData(id = \"80\"),\n            fakeHomeTimelineData(id = \"77\")\n        )\n\n        db.insert(statusData)\n\n        assertEquals(\"99\", timelineDao.getTopPlaceholderId(1))\n    }\n\n    @Test\n    fun `should correctly delete all by user`() = runTest {\n        val statusData = listOf(\n            // will be deleted because it is a direct post\n            fakeHomeTimelineData(id = \"0\", tuskyAccountId = 1, authorServerId = \"1\"),\n            // different Tusky Account\n            fakeHomeTimelineData(id = \"1\", tuskyAccountId = 2, authorServerId = \"1\"),\n            // different author\n            fakeHomeTimelineData(id = \"2\", tuskyAccountId = 1, authorServerId = \"2\"),\n            // different author and reblogger\n            fakeHomeTimelineData(id = \"3\", tuskyAccountId = 1, authorServerId = \"2\", statusId = \"100\", reblogAuthorServerId = \"3\"),\n            // will be deleted because it is a reblog\n            fakeHomeTimelineData(id = \"4\", tuskyAccountId = 1, authorServerId = \"2\", statusId = \"101\", reblogAuthorServerId = \"1\"),\n            // not a status\n            fakePlaceholderHomeTimelineData(id = \"5\"),\n            // will be deleted because it is a self reblog\n            fakeHomeTimelineData(id = \"6\", tuskyAccountId = 1, authorServerId = \"1\", statusId = \"102\", reblogAuthorServerId = \"1\"),\n            // will be deleted because it direct post reblogged by another user\n            fakeHomeTimelineData(id = \"7\", tuskyAccountId = 1, authorServerId = \"1\", statusId = \"103\", reblogAuthorServerId = \"3\"),\n            // different Tusky Account\n            fakeHomeTimelineData(id = \"8\", tuskyAccountId = 2, authorServerId = \"3\", statusId = \"104\", reblogAuthorServerId = \"2\"),\n            // different Tusky Account\n            fakeHomeTimelineData(id = \"9\", tuskyAccountId = 2, authorServerId = \"3\", statusId = \"105\", reblogAuthorServerId = \"1\"),\n        )\n\n        db.insert(statusData - statusData[1] - statusData[8] - statusData [9], tuskyAccountId = 1)\n        db.insert(listOf(statusData[1], statusData[8], statusData [9]), tuskyAccountId = 2)\n\n        timelineDao.removeAllByUser(1, \"1\")\n\n        val loadedHomeTimelineItems: MutableList<String> = mutableListOf()\n        val accountCursor = db.query(\"SELECT id FROM HomeTimelineEntity ORDER BY id ASC\", null)\n        accountCursor.moveToFirst()\n        while (!accountCursor.isAfterLast) {\n            val id: String = accountCursor.getString(accountCursor.getColumnIndex(\"id\"))\n            loadedHomeTimelineItems.add(id)\n            accountCursor.moveToNext()\n        }\n        accountCursor.close()\n\n        val expectedHomeTimelineItems = listOf(\"1\", \"2\", \"3\", \"5\", \"8\", \"9\")\n\n        assertEquals(expectedHomeTimelineItems, loadedHomeTimelineItems)\n    }\n\n    @Test\n    fun `should correctly delete statuses and reblogs by user`() = runTest {\n        val statusData = listOf(\n            // will be deleted because it is a direct post\n            fakeHomeTimelineData(id = \"0\", tuskyAccountId = 1, authorServerId = \"1\"),\n            // different Tusky Account\n            fakeHomeTimelineData(id = \"1\", tuskyAccountId = 2, authorServerId = \"1\"),\n            // different author\n            fakeHomeTimelineData(id = \"2\", tuskyAccountId = 1, authorServerId = \"2\"),\n            // different author and reblogger\n            fakeHomeTimelineData(id = \"3\", tuskyAccountId = 1, authorServerId = \"2\", statusId = \"100\", reblogAuthorServerId = \"3\"),\n            // will be deleted because it is a reblog\n            fakeHomeTimelineData(id = \"4\", tuskyAccountId = 1, authorServerId = \"2\", statusId = \"101\", reblogAuthorServerId = \"1\"),\n            // not a status\n            fakePlaceholderHomeTimelineData(id = \"5\"),\n            // will be deleted because it is a self reblog\n            fakeHomeTimelineData(id = \"6\", tuskyAccountId = 1, authorServerId = \"1\", statusId = \"102\", reblogAuthorServerId = \"1\"),\n            // will NOT be deleted because it direct post reblogged by another user\n            fakeHomeTimelineData(id = \"7\", tuskyAccountId = 1, authorServerId = \"1\", statusId = \"103\", reblogAuthorServerId = \"3\"),\n            // different Tusky Account\n            fakeHomeTimelineData(id = \"8\", tuskyAccountId = 2, authorServerId = \"3\", statusId = \"104\", reblogAuthorServerId = \"2\"),\n            // different Tusky Account\n            fakeHomeTimelineData(id = \"9\", tuskyAccountId = 2, authorServerId = \"3\", statusId = \"105\", reblogAuthorServerId = \"1\"),\n        )\n\n        db.insert(statusData - statusData[1] - statusData[8] - statusData [9], tuskyAccountId = 1)\n        db.insert(listOf(statusData[1], statusData[8], statusData [9]), tuskyAccountId = 2)\n\n        timelineDao.removeStatusesAndReblogsByUser(1, \"1\")\n\n        val loadedHomeTimelineItems: MutableList<String> = mutableListOf()\n        val accountCursor = db.query(\"SELECT id FROM HomeTimelineEntity ORDER BY id ASC\", null)\n        accountCursor.moveToFirst()\n        while (!accountCursor.isAfterLast) {\n            val id: String = accountCursor.getString(accountCursor.getColumnIndex(\"id\"))\n            loadedHomeTimelineItems.add(id)\n            accountCursor.moveToNext()\n        }\n        accountCursor.close()\n\n        val expectedHomeTimelineItems = listOf(\"1\", \"2\", \"3\", \"5\", \"7\", \"8\", \"9\")\n\n        assertEquals(expectedHomeTimelineItems, loadedHomeTimelineItems)\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/entity/ProxyConfigurationTest.kt",
    "content": "package com.keylesspalace.tusky.entity\n\nimport com.keylesspalace.tusky.settings.ProxyConfiguration\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertNull\nimport org.junit.Assert.assertTrue\nimport org.junit.Test\n\nclass ProxyConfigurationTest {\n    @Test\n    fun `serialized non-int is not valid proxy port`() {\n        assertFalse(ProxyConfiguration.isValidProxyPort(\"should fail\"))\n        assertFalse(ProxyConfiguration.isValidProxyPort(\"1.5\"))\n    }\n\n    @Test\n    fun `number outside port range is not valid`() {\n        assertFalse(ProxyConfiguration.isValidProxyPort(\"${ProxyConfiguration.MIN_PROXY_PORT - 1}\"))\n        assertFalse(ProxyConfiguration.isValidProxyPort(\"${ProxyConfiguration.MAX_PROXY_PORT + 1}\"))\n    }\n\n    @Test\n    fun `number in port range, inclusive of min and max, is valid`() {\n        assertTrue(ProxyConfiguration.isValidProxyPort(ProxyConfiguration.MIN_PROXY_PORT))\n        assertTrue(ProxyConfiguration.isValidProxyPort(ProxyConfiguration.MAX_PROXY_PORT))\n        assertTrue(ProxyConfiguration.isValidProxyPort((ProxyConfiguration.MIN_PROXY_PORT + ProxyConfiguration.MAX_PROXY_PORT) / 2))\n    }\n\n    @Test\n    fun `create with invalid port yields null`() {\n        assertNull(ProxyConfiguration.create(\"hostname\", ProxyConfiguration.MIN_PROXY_PORT - 1))\n    }\n\n    @Test\n    fun `create with invalid hostname yields null`() {\n        assertNull(ProxyConfiguration.create(\".\", ProxyConfiguration.MIN_PROXY_PORT))\n    }\n\n    @Test\n    fun `create with valid hostname and port yields the config object`() {\n        assertTrue(ProxyConfiguration.create(\"hostname\", ProxyConfiguration.MIN_PROXY_PORT) is ProxyConfiguration)\n    }\n\n    @Test\n    fun `unicode hostname allowed`() {\n        assertTrue(ProxyConfiguration.create(\"federação.social\", ProxyConfiguration.MIN_PROXY_PORT) is ProxyConfiguration)\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/json/GuardedAdapterTest.kt",
    "content": "package com.keylesspalace.tusky.json\n\nimport com.keylesspalace.tusky.entity.PreviewCard\nimport com.keylesspalace.tusky.entity.Relationship\nimport com.squareup.moshi.Moshi\nimport com.squareup.moshi.adapter\nimport com.squareup.moshi.adapters.Rfc3339DateJsonAdapter\nimport java.util.Date\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\n\n@OptIn(ExperimentalStdlibApi::class)\nclass GuardedAdapterTest {\n\n    private val moshi = Moshi.Builder()\n        .add(GuardedAdapter.ANNOTATION_FACTORY)\n        .add(Date::class.java, Rfc3339DateJsonAdapter())\n        .build()\n\n    @Test\n    fun `should deserialize Relationship when attribute 'subscribing' is a boolean`() {\n        val jsonInput = \"\"\"\n            {\n              \"id\": \"1\",\n              \"following\": true,\n              \"showing_reblogs\": true,\n              \"notifying\": false,\n              \"followed_by\": true,\n              \"blocking\": false,\n              \"blocked_by\": false,\n              \"muting\": false,\n              \"muting_notifications\": false,\n              \"requested\": false,\n              \"domain_blocking\": false,\n              \"endorsed\": false,\n              \"note\": \"Hi\",\n              \"subscribing\": true\n            }\n        \"\"\".trimIndent()\n\n        assertEquals(\n            Relationship(\n                id = \"1\",\n                following = true,\n                followedBy = true,\n                blocking = false,\n                muting = false,\n                mutingNotifications = false,\n                requested = false,\n                showingReblogs = true,\n                subscribing = true,\n                blockingDomain = false,\n                note = \"Hi\",\n                notifying = false\n            ),\n            moshi.adapter<Relationship>().fromJson(jsonInput)\n        )\n    }\n\n    @Test\n    fun `should deserialize Relationship when attribute 'subscribing' is an object`() {\n        val jsonInput = \"\"\"\n            {\n              \"id\": \"2\",\n              \"following\": true,\n              \"showing_reblogs\": true,\n              \"notifying\": false,\n              \"followed_by\": true,\n              \"blocking\": false,\n              \"blocked_by\": false,\n              \"muting\": false,\n              \"muting_notifications\": false,\n              \"requested\": false,\n              \"domain_blocking\": false,\n              \"endorsed\": false,\n              \"note\": \"Hi\",\n              \"subscribing\": { }\n            }\n        \"\"\".trimIndent()\n\n        assertEquals(\n            Relationship(\n                id = \"2\",\n                following = true,\n                followedBy = true,\n                blocking = false,\n                muting = false,\n                mutingNotifications = false,\n                requested = false,\n                showingReblogs = true,\n                subscribing = null,\n                blockingDomain = false,\n                note = \"Hi\",\n                notifying = false\n            ),\n            moshi.adapter<Relationship>().fromJson(jsonInput)\n        )\n    }\n\n    @Test\n    fun `should deserialize Relationship when attribute 'subscribing' does not exist`() {\n        val jsonInput = \"\"\"\n            {\n              \"id\": \"3\",\n              \"following\": true,\n              \"showing_reblogs\": true,\n              \"notifying\": false,\n              \"followed_by\": true,\n              \"blocking\": false,\n              \"blocked_by\": false,\n              \"muting\": false,\n              \"muting_notifications\": false,\n              \"requested\": false,\n              \"domain_blocking\": false,\n              \"endorsed\": false,\n              \"note\": \"Hi\"\n            }\n        \"\"\".trimIndent()\n\n        assertEquals(\n            Relationship(\n                id = \"3\",\n                following = true,\n                followedBy = true,\n                blocking = false,\n                muting = false,\n                mutingNotifications = false,\n                requested = false,\n                showingReblogs = true,\n                subscribing = null,\n                blockingDomain = false,\n                note = \"Hi\",\n                notifying = false\n            ),\n            moshi.adapter<Relationship>().fromJson(jsonInput)\n        )\n    }\n\n    @Test\n    fun `should deserialize PreviewCard when attribute 'published_at' is invalid`() {\n        // https://github.com/tuskyapp/Tusky/issues/4992\n        val jsonInput = \"\"\"{\n\n            \"url\": \"https://www.cbc.ca/amp/1.7484477\",\n            \"title\": \"Canada reconsidering F-35 purchase amid tensions with Washington, says minister\",\n            \"description\": \"Canada is looking at cancelling a major portion of its purchase of U.S.-built F-35 stealth fighters and plans on opening talks with rival aircraft makers, Defence Minister Bill Blair said.\",\n            \"language\": \"en\",\n            \"type\": \"link\",\n            \"author_name\": \"Murray Brewster\",\n            \"author_url\": \"\",\n            \"provider_name\": \"CBC\",\n            \"provider_url\": \"\",\n            \"html\": \"\",\n            \"width\": 0,\n            \"height\": 0,\n            \"image\": \"https://files.mastodon.social/cache/preview_cards/images/137/231/445/original/0f63297db3ac7362.jpg\",\n            \"image_description\": \"\",\n            \"embed_url\": \"\",\n            \"blurhash\": \"U74#eeXoK9nLrVWZS+nfXVaenKkXTOjErobx\",\n            \"published_at\": \"57171-08-04T06:31:30.000Z\",\n            \"authors\": [\n            {\n                \"name\": \"Murray Brewster\",\n                \"url\": \"\",\n                \"account\": null\n            }\n            ]\n\n        }\"\"\"\n        assertEquals(\n            PreviewCard(\n                url = \"https://www.cbc.ca/amp/1.7484477\",\n                title = \"Canada reconsidering F-35 purchase amid tensions with Washington, says minister\",\n                description = \"Canada is looking at cancelling a major portion of its purchase of U.S.-built F-35 stealth fighters and plans on opening talks with rival aircraft makers, Defence Minister Bill Blair said.\",\n                type = \"link\",\n                authorName = \"Murray Brewster\",\n                providerName = \"CBC\",\n                image = \"https://files.mastodon.social/cache/preview_cards/images/137/231/445/original/0f63297db3ac7362.jpg\",\n                width = 0,\n                height = 0,\n                blurhash = \"U74#eeXoK9nLrVWZS+nfXVaenKkXTOjErobx\",\n                publishedAt = null,\n            ),\n            moshi.adapter<PreviewCard>().fromJson(jsonInput)\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/network/ApiFactoryTest.kt",
    "content": "package com.keylesspalace.tusky.network\n\nimport at.connyduck.calladapter.networkresult.NetworkResultCallAdapterFactory\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport com.keylesspalace.tusky.entity.Instance\nimport com.squareup.moshi.Moshi\nimport kotlinx.coroutines.test.runTest\nimport okhttp3.OkHttpClient\nimport okhttp3.mockwebserver.MockResponse\nimport okhttp3.mockwebserver.MockWebServer\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNull\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport retrofit2.Retrofit\nimport retrofit2.converter.moshi.MoshiConverterFactory\n\nclass ApiFactoryTest {\n\n    private val mockWebServer = MockWebServer()\n    private val okHttpClient = OkHttpClient.Builder().build()\n    private val moshi = Moshi.Builder().build()\n\n    @Before\n    fun setup() {\n        mockWebServer.start()\n    }\n\n    @After\n    fun teardown() {\n        mockWebServer.shutdown()\n    }\n\n    private fun retrofit() = Retrofit.Builder()\n        .baseUrl(\"http://${MastodonApi.PLACEHOLDER_DOMAIN}:${mockWebServer.port}\")\n        .client(okHttpClient)\n        .addConverterFactory(MoshiConverterFactory.create(moshi))\n        .addCallAdapterFactory(NetworkResultCallAdapterFactory.create())\n        .build()\n\n    @Test\n    fun `should make request to the active account's instance`() = runTest {\n        mockInstanceResponse()\n\n        val account = AccountEntity(\n            id = 1,\n            domain = mockWebServer.hostName,\n            accessToken = \"fakeToken\",\n            clientId = \"fakeId\",\n            clientSecret = \"fakeSecret\",\n            isActive = true\n        )\n\n        val retrofit = retrofit()\n        val api: MastodonApi = apiForAccount(account, okHttpClient, retrofit, \"http://\", mockWebServer.port)\n\n        val instanceResponse = api.getInstance()\n\n        assertTrue(instanceResponse.isSuccess)\n        assertEquals(\"Bearer fakeToken\", mockWebServer.takeRequest().getHeader(\"Authorization\"))\n    }\n\n    @Test\n    fun `should make request to instance requested in special header when account active`() = runTest {\n        mockInstanceResponse()\n\n        val account = AccountEntity(\n            id = 1,\n            domain = mockWebServer.hostName,\n            accessToken = \"fakeToken\",\n            clientId = \"fakeId\",\n            clientSecret = \"fakeSecret\",\n            isActive = true\n        )\n\n        val retrofit = retrofit()\n        val api: MastodonApi = apiForAccount(account, okHttpClient, retrofit, \"http://\", mockWebServer.port)\n\n        val instanceResponse = api.getInstance(domain = mockWebServer.hostName)\n\n        assertTrue(instanceResponse.isSuccess)\n        assertNull(mockWebServer.takeRequest().getHeader(\"Authorization\"))\n    }\n\n    @Test\n    fun `should make request to instance requested in special header when no account active`() = runTest {\n        mockInstanceResponse()\n\n        val retrofit = retrofit()\n        val api: MastodonApi = apiForAccount(null, okHttpClient, retrofit, \"http://\", mockWebServer.port)\n\n        val instanceResponse = api.getInstance(domain = mockWebServer.hostName)\n\n        assertTrue(instanceResponse.isSuccess)\n        assertNull(mockWebServer.takeRequest().getHeader(\"Authorization\"))\n    }\n\n    @Test\n    fun `should fail when current instance is requested but no user is logged in`() = runTest {\n        mockInstanceResponse()\n\n        val retrofit = retrofit()\n        val api: MastodonApi = apiForAccount(null, okHttpClient, retrofit, \"http://\", mockWebServer.port)\n\n        val instanceResponse = api.getInstance()\n\n        assertTrue(instanceResponse.isFailure)\n        assertEquals(0, mockWebServer.requestCount)\n    }\n\n    private fun mockInstanceResponse() {\n        mockWebServer.enqueue(\n            MockResponse()\n                .setBody(\n                    moshi.adapter(Instance::class.java).toJson(\n                        Instance(\n                            domain = \"example.org\",\n                            version = \"1.0.0\"\n                        )\n                    )\n                )\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/usecase/TimelineCasesTest.kt",
    "content": "package com.keylesspalace.tusky.usecase\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport app.cash.turbine.test\nimport at.connyduck.calladapter.networkresult.NetworkResult\nimport com.keylesspalace.tusky.appstore.EventHub\nimport com.keylesspalace.tusky.appstore.StatusChangedEvent\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.network.MastodonApi\nimport java.util.Date\nimport kotlinx.coroutines.test.runTest\nimport okhttp3.ResponseBody.Companion.toResponseBody\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.kotlin.doReturn\nimport org.mockito.kotlin.mock\nimport org.mockito.kotlin.stub\nimport org.robolectric.annotation.Config\nimport retrofit2.HttpException\nimport retrofit2.Response\n\n@Config(sdk = [34])\n@RunWith(AndroidJUnit4::class)\nclass TimelineCasesTest {\n\n    private lateinit var api: MastodonApi\n    private lateinit var eventHub: EventHub\n    private lateinit var timelineCases: TimelineCases\n\n    private val statusId = \"1234\"\n\n    @Before\n    fun setup() {\n        api = mock()\n        eventHub = EventHub()\n        timelineCases = TimelineCases(api, eventHub)\n    }\n\n    @Test\n    fun `pin success emits StatusChangedEvent`() = runTest {\n        val pinnedStatus = mockStatus(pinned = true)\n\n        api.stub {\n            onBlocking { pinStatus(statusId) } doReturn NetworkResult.success(pinnedStatus)\n        }\n\n        eventHub.events.test {\n            timelineCases.pin(statusId, true)\n            assertEquals(StatusChangedEvent(pinnedStatus), awaitItem())\n        }\n    }\n\n    @Test\n    fun `pin failure with server error throws TimelineError with server message`() = runTest {\n        api.stub {\n            onBlocking { pinStatus(statusId) } doReturn NetworkResult.failure(\n                HttpException(\n                    Response.error<Status>(\n                        422,\n                        \"{\\\"error\\\":\\\"Validation Failed: You have already pinned the maximum number of toots\\\"}\".toResponseBody()\n                    )\n                )\n            )\n        }\n        assertEquals(\n            \"Validation Failed: You have already pinned the maximum number of toots\",\n            timelineCases.pin(statusId, true).exceptionOrNull()?.message\n        )\n    }\n\n    private fun mockStatus(pinned: Boolean = false): Status {\n        return Status(\n            id = \"123\",\n            url = \"https://mastodon.social/@Tusky/100571663297225812\",\n            account = mock(),\n            inReplyToId = null,\n            inReplyToAccountId = null,\n            reblog = null,\n            content = \"\",\n            createdAt = Date(),\n            editedAt = null,\n            emojis = emptyList(),\n            reblogsCount = 0,\n            favouritesCount = 0,\n            repliesCount = 0,\n            reblogged = false,\n            favourited = false,\n            bookmarked = false,\n            sensitive = false,\n            spoilerText = \"\",\n            visibility = Status.Visibility.PUBLIC,\n            attachments = arrayListOf(),\n            mentions = listOf(),\n            tags = listOf(),\n            application = null,\n            pinned = pinned,\n            muted = false,\n            poll = null,\n            card = null,\n            language = null,\n            filtered = emptyList()\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/util/AbsoluteTimeFormatterTest.kt",
    "content": "package com.keylesspalace.tusky.util\n\nimport java.time.Instant\nimport java.util.*\nimport org.junit.AfterClass\nimport org.junit.Assert.assertEquals\nimport org.junit.BeforeClass\nimport org.junit.Test\n\nclass AbsoluteTimeFormatterTest {\n    companion object {\n        /** Default locale before this test started */\n        private lateinit var locale: Locale\n\n        /**\n         * Ensure the Locale is ENGLISH so that tests against literal strings like\n         * \"Apr\" later, even if the test host's locale is e.g. FRENCH which would\n         * normally report \"avr.\".\n         */\n        @BeforeClass\n        @JvmStatic\n        fun beforeClass() {\n            locale = Locale.getDefault()\n            Locale.setDefault(Locale.ENGLISH)\n        }\n\n        @AfterClass\n        @JvmStatic\n        fun afterClass() {\n            Locale.setDefault(locale)\n        }\n    }\n\n    private val formatter = AbsoluteTimeFormatter(TimeZone.getTimeZone(\"UTC\"))\n    private val now = Date.from(Instant.parse(\"2022-04-11T00:00:00.00Z\"))\n\n    @Test\n    fun `null handling`() {\n        assertEquals(\"??\", formatter.format(null, true, now))\n        assertEquals(\"??\", formatter.format(null, false, now))\n    }\n\n    @Test\n    fun `same day formatting`() {\n        val tenTen = Date.from(Instant.parse(\"2022-04-11T10:10:00.00Z\"))\n        assertEquals(\"10:10\", formatter.format(tenTen, true, now))\n        assertEquals(\"10:10\", formatter.format(tenTen, false, now))\n    }\n\n    @Test\n    fun `same year formatting`() {\n        val nextDay = Date.from(Instant.parse(\"2022-04-12T00:10:00.00Z\"))\n        assertEquals(\"12 Apr, 00:10\", formatter.format(nextDay, true, now))\n        assertEquals(\"12 Apr, 00:10\", formatter.format(nextDay, false, now))\n        val endOfYear = Date.from(Instant.parse(\"2022-12-31T23:59:00.00Z\"))\n        assertEquals(\"31 Dec, 23:59\", formatter.format(endOfYear, true, now))\n        assertEquals(\"31 Dec, 23:59\", formatter.format(endOfYear, false, now))\n    }\n\n    @Test\n    fun `other year formatting`() {\n        val firstDayNextYear = Date.from(Instant.parse(\"2023-01-01T00:00:00.00Z\"))\n        assertEquals(\"2023-01-01\", formatter.format(firstDayNextYear, true, now))\n        assertEquals(\"2023-01-01 00:00\", formatter.format(firstDayNextYear, false, now))\n        val inTenYears = Date.from(Instant.parse(\"2032-04-11T10:10:00.00Z\"))\n        assertEquals(\"2032-04-11\", formatter.format(inTenYears, true, now))\n        assertEquals(\"2032-04-11 10:10\", formatter.format(inTenYears, false, now))\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/util/HttpHeaderLinkTest.kt",
    "content": "package com.keylesspalace.tusky.util\n\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\n\nclass HttpHeaderLinkTest {\n    data class TestData(val name: String, val input: String, val want: List<HttpHeaderLink>)\n\n    @Test\n    fun shouldParseValidLinks() {\n        val testData = arrayOf(\n            // Examples from https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Link\n            TestData(\n                \"Single URL\",\n                \"<https://example.com>\",\n                listOf(HttpHeaderLink(\"https://example.com\"))\n            ),\n            TestData(\n                \"Single URL with parameters\",\n                \"<https://example.com>; rel=\\\"preconnect\\\"\",\n                listOf(HttpHeaderLink(\"https://example.com\"))\n            ),\n            TestData(\n                \"Single encoded URL with parameters\",\n                \"<https://example.com/%E8%8B%97%E6%9D%A1>; rel=\\\"preconnect\\\"\",\n                listOf(HttpHeaderLink(\"https://example.com/%E8%8B%97%E6%9D%A1\"))\n            ),\n            TestData(\n                \"Multiple URLs, separated by commas\",\n                \"<https://one.example.com>; rel=\\\"preconnect\\\", <https://two.example.com>; rel=\\\"preconnect\\\", <https://three.example.com>; rel=\\\"preconnect\\\"\",\n                listOf(\n                    HttpHeaderLink(\"https://one.example.com\"),\n                    HttpHeaderLink(\"https://two.example.com\"),\n                    HttpHeaderLink(\"https://three.example.com\")\n                )\n            ),\n            // Examples from https://httpwg.org/specs/rfc8288.html#rfc.section.3.5\n            TestData(\n                \"Single URL, multiple parameters\",\n                \"<http://example.com/TheBook/chapter2>; rel=\\\"previous\\\"; title=\\\"previous chapter\\\"\",\n                listOf(HttpHeaderLink(\"http://example.com/TheBook/chapter2\"))\n            ),\n            TestData(\n                \"Root resource\",\n                \"</>; rel=\\\"http://example.net/foo\\\"\",\n                listOf(HttpHeaderLink(\"/\"))\n            ),\n            TestData(\n                \"Terms and anchor\",\n                \"</terms>; rel=\\\"copyright\\\"; anchor=\\\"#foo\\\"\",\n                listOf(HttpHeaderLink(\"/terms\"))\n            ),\n            TestData(\n                \"Multiple URLs with parameter encoding\",\n                \"</TheBook/chapter2>; rel=\\\"previous\\\"; title*=UTF-8'de'letztes%20Kapitel, </TheBook/chapter4>; rel=\\\"next\\\"; title*=UTF-8'de'n%c3%a4chstes%20Kapitel\",\n                listOf(\n                    HttpHeaderLink(\"/TheBook/chapter2\"),\n                    HttpHeaderLink(\"/TheBook/chapter4\")\n                )\n            )\n        )\n\n        // Verify that the URLs are parsed correctly\n        for (test in testData) {\n            val links = HttpHeaderLink.parse(test.input)\n            assertEquals(\"${test.name}: Same size\", links.size, test.want.size)\n            for (i in links.indices) {\n                assertEquals(test.name, test.want[i].uri, links[i].uri)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/util/LinkHelperTest.kt",
    "content": "package com.keylesspalace.tusky.util\n\nimport android.text.SpannableStringBuilder\nimport android.text.style.URLSpan\nimport android.widget.TextView\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.platform.app.InstrumentationRegistry\nimport com.keylesspalace.tusky.R\nimport com.keylesspalace.tusky.entity.HashTag\nimport com.keylesspalace.tusky.entity.Status\nimport com.keylesspalace.tusky.interfaces.LinkListener\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertNotNull\nimport org.junit.Assert.assertNull\nimport org.junit.Assert.assertTrue\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\nimport org.robolectric.annotation.Config\n\n@Config(sdk = [34])\n@RunWith(AndroidJUnit4::class)\nclass LinkHelperTest {\n    private val listener = object : LinkListener {\n        override fun onViewTag(tag: String) { }\n        override fun onViewAccount(id: String) { }\n        override fun onViewUrl(url: String) { }\n    }\n\n    private val mentions = listOf(\n        Status.Mention(\"1\", \"https://example.com/@user\", \"user\", \"user\"),\n        Status.Mention(\"2\", \"https://example.com/@anotherUser\", \"anotherUser\", \"anotherUser\")\n    )\n    private val tags = listOf(\n        HashTag(\"Tusky\", \"https://example.com/Tags/Tusky\"),\n        HashTag(\"mastodev\", \"https://example.com/Tags/mastodev\")\n    )\n\n    private val textView: TextView\n        get() = TextView(InstrumentationRegistry.getInstrumentation().targetContext)\n\n    @Test\n    fun whenSettingClickableText_mentionUrlsArePreserved() {\n        val builder = SpannableStringBuilder()\n        for (mention in mentions) {\n            builder.append(\"@${mention.username}\", URLSpan(mention.url), 0)\n            builder.append(\" \")\n        }\n\n        var urlSpans = builder.getSpans(0, builder.length, URLSpan::class.java)\n        for (span in urlSpans) {\n            setClickableText(span, builder, mentions, null, listener)\n        }\n\n        urlSpans = builder.getSpans(0, builder.length, URLSpan::class.java)\n        for (span in urlSpans) {\n            assertNotNull(mentions.firstOrNull { it.url == span.url })\n        }\n    }\n\n    @Test\n    fun whenSettingClickableText_nonMentionsAreNotConvertedToMentions() {\n        val builder = SpannableStringBuilder()\n        val nonMentionUrl = \"http://example.com/\"\n        for (mention in mentions) {\n            builder.append(\"@${mention.username}\", URLSpan(nonMentionUrl), 0)\n            builder.append(\" \")\n            builder.append(\"@${mention.username} \")\n        }\n\n        var urlSpans = builder.getSpans(0, builder.length, URLSpan::class.java)\n        for (span in urlSpans) {\n            setClickableText(span, builder, mentions, null, listener)\n        }\n\n        urlSpans = builder.getSpans(0, builder.length, URLSpan::class.java)\n        for (span in urlSpans) {\n            assertEquals(nonMentionUrl, span.url)\n        }\n    }\n\n    @Test\n    fun whenCheckingTags_tagNameIsComparedCaseInsensitively() {\n        for (tag in tags) {\n            for (mutatedTagName in listOf(tag.name, tag.name.uppercase(), tag.name.lowercase())) {\n                val tagName = getTagName(\"#$mutatedTagName\", tags)\n                assertNotNull(tagName)\n                assertNotNull(tags.firstOrNull { it.name == tagName })\n            }\n        }\n    }\n\n    @Test\n    fun whenCheckingTags_tagNameIsNormalized() {\n        val mutator = \"aeiou\".toList().zip(\"åÉîøÜ\".toList()).toMap()\n        for (tag in tags) {\n            val mutatedTagName = String(tag.name.map { mutator[it] ?: it }.toCharArray())\n            val tagName = getTagName(\"#$mutatedTagName\", tags)\n            assertNotNull(tagName)\n            assertNotNull(tags.firstOrNull { it.name == tagName })\n        }\n    }\n\n    @Test\n    fun hashedUrlSpans_withNoMatchingTag_areNotModified() {\n        for (tag in tags) {\n            assertNull(getTagName(\"#not${tag.name}\", tags))\n        }\n    }\n\n    @Test\n    fun whenTagsAreNull_tagNameIsGeneratedFromText() {\n        for (tag in tags) {\n            assertEquals(tag.name, getTagName(\"#${tag.name}\", null))\n        }\n    }\n\n    @Test\n    fun whenStringIsInvalidUri_emptyStringIsReturnedFromGetDomain() {\n        listOf(\n            null,\n            \"foo bar baz\",\n            \"http:/foo.bar\",\n            \"c:/foo/bar\"\n        ).forEach {\n            assertEquals(\"\", getDomain(it))\n        }\n    }\n\n    @Test\n    fun whenUrlIsValid_correctDomainIsReturned() {\n        listOf(\n            \"example.com\",\n            \"localhost\",\n            \"sub.domain.com\",\n            \"10.45.0.123\"\n        ).forEach { domain ->\n            listOf(\n                \"https://$domain\",\n                \"https://$domain/\",\n                \"https://$domain/foo/bar\",\n                \"https://$domain/foo/bar.html\",\n                \"https://$domain/foo/bar.html#\",\n                \"https://$domain/foo/bar.html#anchor\",\n                \"https://$domain/foo/bar.html?argument=value\",\n                \"https://$domain/foo/bar.html?argument=value&otherArgument=otherValue\"\n            ).forEach { url ->\n                assertEquals(domain, getDomain(url))\n            }\n        }\n    }\n\n    @Test\n    fun wwwPrefixIsStrippedFromGetDomain() {\n        mapOf(\n            \"https://www.example.com/foo/bar\" to \"example.com\",\n            \"https://awww.example.com/foo/bar\" to \"awww.example.com\",\n            \"http://www.localhost\" to \"localhost\",\n            \"https://wwwexample.com/\" to \"wwwexample.com\"\n        ).forEach { (url, domain) ->\n            assertEquals(domain, getDomain(url))\n        }\n    }\n\n    @Test\n    fun hiddenDomainsAreMarkedUp() {\n        val displayedContent = \"This is a good place to go\"\n        val maliciousDomain = \"malicious.place\"\n        val maliciousUrl = \"https://$maliciousDomain/to/go\"\n        val content = SpannableStringBuilder()\n        content.append(displayedContent, URLSpan(maliciousUrl), 0)\n        val oldContent = content.toString()\n        assertEquals(\n            displayedContent + \" \" + textView.context.getString(R.string.url_domain_notifier, maliciousDomain),\n            markupHiddenUrls(textView, content).toString()\n        )\n        assertEquals(oldContent, content.toString())\n    }\n\n    @Test\n    fun fraudulentDomainsAreMarkedUp() {\n        val displayedContent = \"https://tusky.app/\"\n        val maliciousDomain = \"malicious.place\"\n        val maliciousUrl = \"https://$maliciousDomain/to/go\"\n        val content = SpannableStringBuilder()\n        content.append(displayedContent, URLSpan(maliciousUrl), 0)\n        assertEquals(\n            displayedContent + \" \" + textView.context.getString(R.string.url_domain_notifier, maliciousDomain),\n            markupHiddenUrls(textView, content).toString()\n        )\n    }\n\n    @Test\n    fun multipleHiddenDomainsAreMarkedUp() {\n        val domains = listOf(\"one.place\", \"another.place\", \"athird.place\")\n        val displayedContent = \"link\"\n        val content = SpannableStringBuilder()\n        for (domain in domains) {\n            content.append(displayedContent, URLSpan(\"https://$domain/foo/bar\"), 0)\n        }\n\n        val markedUpContent = markupHiddenUrls(textView, content)\n        for (domain in domains) {\n            assertTrue(markedUpContent.contains(displayedContent + \" \" + textView.context.getString(R.string.url_domain_notifier, domain)))\n        }\n    }\n\n    @Test\n    fun nonUriTextExactlyMatchingDomainIsNotMarkedUp() {\n        val domain = \"some.place\"\n        val content = SpannableStringBuilder()\n            .append(domain, URLSpan(\"https://$domain/\"), 0)\n            .append(domain, URLSpan(\"https://$domain\"), 0)\n            .append(domain, URLSpan(\"https://www.$domain\"), 0)\n            .append(\"www.$domain\", URLSpan(\"https://$domain\"), 0)\n            .append(\"www.$domain\", URLSpan(\"https://$domain/\"), 0)\n            .append(\"$domain/\", URLSpan(\"https://$domain/\"), 0)\n            .append(\"$domain/\", URLSpan(\"https://$domain\"), 0)\n            .append(\"$domain/\", URLSpan(\"https://www.$domain\"), 0)\n\n        val markedUpContent = markupHiddenUrls(textView, content)\n        assertFalse(markedUpContent.contains(\"🔗\"))\n    }\n\n    @Test\n    fun spanEndsWithUrlIsNotMarkedUp() {\n        val content = SpannableStringBuilder()\n            .append(\"Some Place: some.place\", URLSpan(\"https://some.place\"), 0)\n            .append(\"Some Place: some.place/\", URLSpan(\"https://some.place/\"), 0)\n            .append(\"Some Place - https://some.place\", URLSpan(\"https://some.place\"), 0)\n            .append(\"Some Place | https://some.place/\", URLSpan(\"https://some.place/\"), 0)\n            .append(\"Some Place https://some.place/path\", URLSpan(\"https://some.place/path\"), 0)\n\n        val markedUpContent = markupHiddenUrls(textView, content)\n        assertFalse(markedUpContent.contains(\"🔗\"))\n    }\n\n    @Test\n    fun spanEndsWithFraudulentUrlIsMarkedUp() {\n        val content = SpannableStringBuilder()\n            .append(\"Another Place: another.place\", URLSpan(\"https://some.place\"), 0)\n            .append(\"Another Place: another.place/\", URLSpan(\"https://some.place/\"), 0)\n            .append(\"Another Place - https://another.place\", URLSpan(\"https://some.place\"), 0)\n            .append(\"Another Place | https://another.place/\", URLSpan(\"https://some.place/\"), 0)\n            .append(\"Another Place https://another.place/path\", URLSpan(\"https://some.place/path\"), 0)\n\n        val markedUpContent = markupHiddenUrls(textView, content)\n        val asserts = listOf(\n            \"Another Place: another.place\",\n            \"Another Place: another.place/\",\n            \"Another Place - https://another.place\",\n            \"Another Place | https://another.place/\",\n            \"Another Place https://another.place/path\"\n        )\n        print(markedUpContent)\n        asserts.forEach {\n            assertTrue(markedUpContent.contains(it + \" \" + textView.context.getString(R.string.url_domain_notifier, \"some.place\")))\n        }\n    }\n\n    @Test\n    fun validMentionsAreNotMarkedUp() {\n        val builder = SpannableStringBuilder()\n        for (mention in mentions) {\n            builder.append(\"@${mention.username}\", URLSpan(mention.url), 0)\n            builder.append(\" \")\n        }\n\n        val markedUpContent = markupHiddenUrls(textView, builder)\n        for (mention in mentions) {\n            assertFalse(markedUpContent.contains(\"${getDomain(mention.url)})\"))\n        }\n    }\n\n    @Test\n    fun invalidMentionsAreNotMarkedUp() {\n        val builder = SpannableStringBuilder()\n        for (mention in mentions) {\n            builder.append(\"@${mention.username}\", URLSpan(mention.url), 0)\n            builder.append(\" \")\n        }\n\n        val markedUpContent = markupHiddenUrls(textView, builder)\n        for (mention in mentions) {\n            assertFalse(markedUpContent.contains(\"${getDomain(mention.url)})\"))\n        }\n    }\n\n    @Test\n    fun validTagsAreNotMarkedUp() {\n        val builder = SpannableStringBuilder()\n        for (tag in tags) {\n            builder.append(\"#${tag.name}\", URLSpan(tag.url), 0)\n            builder.append(\" \")\n        }\n\n        val markedUpContent = markupHiddenUrls(textView, builder)\n        for (tag in tags) {\n            assertFalse(markedUpContent.contains(\"${getDomain(tag.url)})\"))\n        }\n    }\n\n    @Test\n    fun invalidTagsAreNotMarkedUp() {\n        val builder = SpannableStringBuilder()\n        for (tag in tags) {\n            builder.append(\"#${tag.name}\", URLSpan(tag.url), 0)\n            builder.append(\" \")\n        }\n\n        val markedUpContent = markupHiddenUrls(textView, builder)\n        for (tag in tags) {\n            assertFalse(markedUpContent.contains(\"${getDomain(tag.url)})\"))\n        }\n    }\n\n    @Test\n    fun `get trailing hashtags with empty content returns empty list`() {\n        val (endOfContent, trailingHashtags) = getTrailingHashtags(SpannableStringBuilder(\"\"))\n        assertEquals(0, endOfContent)\n        assert(trailingHashtags.isEmpty())\n    }\n\n    @Test\n    fun `get trailing hashtags with no hashtags returns empty list`() {\n        val (endOfContent, trailingHashtags) = getTrailingHashtags(SpannableStringBuilder(\"some untagged content\"))\n        assertEquals(21, endOfContent)\n        assert(trailingHashtags.isEmpty())\n    }\n\n    @Test\n    fun `get trailing hashtags with all inline hashtags returns empty list`() {\n        val (endOfContent, trailingHashtags) = getTrailingHashtags(SpannableStringBuilder(\"some #inline #tagged #content\"))\n        assertEquals(29, endOfContent)\n        assert(trailingHashtags.isEmpty())\n    }\n\n    @Test\n    fun `get trailing hashtags with only hashtags returns empty list`() {\n        val (endOfContent, trailingHashtags) = getTrailingHashtags(SpannableStringBuilder(\"#some #inline #tagged #content\"))\n        assertEquals(0, endOfContent)\n        assert(trailingHashtags.isEmpty())\n    }\n\n    @Test\n    fun `get trailing hashtags with one tag`() {\n        val content = SpannableStringBuilder(\"some content followed by tags:\\n\").apply {\n            tags.first().let { append(\"#${it.name}\", URLSpan(it.url), 0) }\n        }\n\n        val (endOfContent, trailingHashtags) = getTrailingHashtags(content)\n        assertEquals(30, endOfContent)\n        assertEquals(tags.first().name, trailingHashtags.single().name)\n        assertEquals(tags.first().url, trailingHashtags.single().url)\n    }\n\n    @Test\n    fun `get trailing hashtags with multiple tags`() {\n        for (separator in listOf(\" \", \"\\t\", \"\\n\", \"\\r\\n\")) {\n            val content = SpannableStringBuilder(\"some content followed by tags:\\n\").apply {\n                for (tag in tags) {\n                    append(separator)\n                    append(\"#${tag.name}\", URLSpan(tag.url), 0)\n                    append(separator)\n                }\n            }\n\n            val (endOfContent, trailingHashtags) = getTrailingHashtags(content)\n            assertEquals(30, endOfContent)\n            assertEquals(tags.size, trailingHashtags.size)\n            tags.forEachIndexed { index, tag ->\n                assertEquals(tag.name, trailingHashtags[index].name)\n                assertEquals(tag.url, trailingHashtags[index].url)\n            }\n        }\n    }\n\n    @Test\n    fun `get trailing hashtags ignores inline tags`() {\n        for (separator in listOf(\" \", \"\\t\", \"\\n\", \"\\r\\n\")) {\n            val content = SpannableStringBuilder(\"some content with inline tag \").apply {\n                append(\"#inline\", URLSpan(\"https://example.com/tag/inline\"), 0)\n                append(\" followed by trailing tags\\n\")\n                for (tag in tags) {\n                    append(separator)\n                    append(\"#${tag.name}\", URLSpan(tag.url), 0)\n                    append(separator)\n                }\n            }\n\n            val (_, trailingHashtags) = getTrailingHashtags(content)\n            assertEquals(tags.size, trailingHashtags.size)\n            tags.forEachIndexed { index, tag ->\n                assertEquals(tag.name, trailingHashtags[index].name)\n                assertEquals(tag.url, trailingHashtags[index].url)\n            }\n        }\n    }\n\n    @RunWith(Parameterized::class)\n    class UrlMatchingTests(private val url: String, private val expectedResult: Boolean) {\n        companion object {\n            @Parameterized.Parameters(name = \"match_{0}\")\n            @JvmStatic\n            fun data(): Iterable<Array<Any>> {\n                return listOf(\n                    arrayOf(\"https://mastodon.foo.bar/@User\", true),\n                    arrayOf(\"http://mastodon.foo.bar/@abc123\", true),\n                    arrayOf(\"https://mastodon.foo.bar/@user/345667890345678\", true),\n                    arrayOf(\"https://mastodon.foo.bar/@user/3\", true),\n                    arrayOf(\"https://mastodon.foo.bar/users/User/statuses/43456787654678\", true),\n                    arrayOf(\"https://pleroma.foo.bar/users/meh3223\", true),\n                    arrayOf(\"https://pleroma.foo.bar/users/meh3223_bruh\", true),\n                    arrayOf(\"https://pleroma.foo.bar/users/2345\", true),\n                    arrayOf(\"https://pleroma.foo.bar/notice/9\", true),\n                    arrayOf(\"https://pleroma.foo.bar/notice/9345678\", true),\n                    arrayOf(\"https://pleroma.foo.bar/notice/wat\", true),\n                    arrayOf(\"https://pleroma.foo.bar/notice/9qTHT2ANWUdXzENqC0\", true),\n                    arrayOf(\"https://pleroma.foo.bar/objects/abcdef-123-abcd-9876543\", true),\n                    arrayOf(\"https://misskey.foo.bar/notes/mew\", true),\n                    arrayOf(\"https://misskey.foo.bar/notes/1421564653\", true),\n                    arrayOf(\"https://misskey.foo.bar/notes/qwer615985ddf\", true),\n                    arrayOf(\"https://friendica.foo.bar/profile/user\", true),\n                    arrayOf(\"https://friendica.foo.bar/profile/uSeR\", true),\n                    arrayOf(\"https://friendica.foo.bar/profile/user_user\", true),\n                    arrayOf(\"https://friendica.foo.bar/profile/123\", true),\n                    arrayOf(\"https://friendica.foo.bar/display/abcdef-123-abcd-9876543\", true),\n                    arrayOf(\"https://google.com/\", false),\n                    arrayOf(\"https://mastodon.foo.bar/@User?foo=bar\", false),\n                    arrayOf(\"https://mastodon.foo.bar/@User#foo\", false),\n                    arrayOf(\"http://mastodon.foo.bar/@\", false),\n                    arrayOf(\"http://mastodon.foo.bar/@/345678\", false),\n                    arrayOf(\"https://mastodon.foo.bar/@user/345667890345678/\", false),\n                    arrayOf(\"https://mastodon.foo.bar/@user/3abce\", false),\n                    arrayOf(\"https://pleroma.foo.bar/users/\", false),\n                    arrayOf(\"https://pleroma.foo.bar/users/meow/\", false),\n                    arrayOf(\"https://pleroma.foo.bar/users/@meow\", false),\n                    arrayOf(\"https://pleroma.foo.bar/notices/123456\", false),\n                    arrayOf(\"https://pleroma.foo.bar/notice/@neverhappen/\", false),\n                    arrayOf(\"https://pleroma.foo.bar/object/abcdef-123-abcd-9876543\", false),\n                    arrayOf(\"https://pleroma.foo.bar/objects/xabcdef-123-abcd-9876543\", false),\n                    arrayOf(\"https://pleroma.foo.bar/objects/xabcdef-123-abcd-9876543/\", false),\n                    arrayOf(\"https://pleroma.foo.bar/objects/xabcdef-123-abcd_9876543\", false),\n                    arrayOf(\"https://friendica.foo.bar/display/xabcdef-123-abcd-9876543\", false),\n                    arrayOf(\"https://friendica.foo.bar/display/xabcdef-123-abcd-9876543/\", false),\n                    arrayOf(\"https://friendica.foo.bar/display/xabcdef-123-abcd_9876543\", false),\n                    arrayOf(\"https://friendica.foo.bar/profile/@mew\", false),\n                    arrayOf(\"https://friendica.foo.bar/profile/@mew/\", false),\n                    arrayOf(\"https://misskey.foo.bar/notes/@nyan\", false),\n                    arrayOf(\"https://misskey.foo.bar/notes/NYAN123\", false),\n                    arrayOf(\"https://misskey.foo.bar/notes/meow123/\", false),\n                    arrayOf(\"https://pixelfed.social/p/connyduck/391263492998670833\", true),\n                    arrayOf(\"https://pixelfed.social/connyduck\", true),\n                    arrayOf(\"https://gts.foo.bar/@goblin/statuses/01GH9XANCJ0TA8Y95VE9H3Y0Q2\", true),\n                    arrayOf(\"https://gts.foo.bar/@goblin\", true),\n                    arrayOf(\"https://foo.microblog.pub/o/5b64045effd24f48a27d7059f6cb38f5\", true),\n                    arrayOf(\"https://bookwyrm.foo.bar/user/User\", true),\n                    arrayOf(\"https://bookwyrm.foo.bar/user/User/comment/123456\", true)\n                )\n            }\n        }\n\n        @Test\n        fun test() {\n            assertEquals(expectedResult, looksLikeMastodonUrl(url))\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/util/LocaleUtilsTest.kt",
    "content": "package com.keylesspalace.tusky.util\n\nimport androidx.appcompat.app.AppCompatDelegate\nimport androidx.core.os.LocaleListCompat\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport com.keylesspalace.tusky.db.entity.AccountEntity\nimport org.junit.Assert.assertArrayEquals\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertFalse\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Mockito\nimport org.robolectric.annotation.Config\n\n@Config(sdk = [34])\n@RunWith(AndroidJUnit4::class)\nclass LocaleUtilsTest {\n    @Test\n    fun initialLanguagesContainReplySelectedAppAndSystem() {\n        val expectedLanguages = arrayOf<String?>(\"yi\", \"tok\", \"da\", \"fr\", \"sv\", \"kab\")\n        val languages = getMockedInitialLanguages(expectedLanguages)\n        assertArrayEquals(expectedLanguages, languages.subList(0, expectedLanguages.size).toTypedArray())\n    }\n\n    @Test\n    fun whenReplyLanguageIsNull_DefaultLanguageIsFirst() {\n        val defaultLanguage = \"tok\"\n        val languages = getMockedInitialLanguages(arrayOf(null, defaultLanguage, \"da\", \"fr\", \"sv\", \"kab\"))\n        assertEquals(defaultLanguage, languages[0])\n    }\n\n    @Test\n    fun initialLanguagesAreDistinct() {\n        val defaultLanguage = \"da\"\n        val languages = getMockedInitialLanguages(arrayOf(defaultLanguage, defaultLanguage, \"fr\", defaultLanguage, \"kab\", defaultLanguage))\n        assertEquals(1, languages.count { it == defaultLanguage })\n    }\n\n    @Test\n    fun initialLanguageDeduplicationDoesNotReorder() {\n        val defaultLanguage = \"da\"\n\n        assertEquals(\n            defaultLanguage,\n            getMockedInitialLanguages(arrayOf(defaultLanguage, defaultLanguage, \"fr\", defaultLanguage, \"kab\", defaultLanguage))[0]\n        )\n        assertEquals(\n            defaultLanguage,\n            getMockedInitialLanguages(arrayOf(null, defaultLanguage, \"fr\", defaultLanguage, \"kab\", defaultLanguage))[0]\n        )\n    }\n\n    @Test\n    fun emptyInitialLanguagesAreDropped() {\n        val languages = getMockedInitialLanguages(arrayOf(\"\", \"\", \"fr\", \"\", \"kab\", \"\"))\n        assertFalse(languages.any { it.isEmpty() })\n    }\n\n    private fun getMockedInitialLanguages(configuredLanguages: Array<String?>): List<String> {\n        val appLanguages = LocaleListCompat.forLanguageTags(configuredLanguages.slice(2 until 4).joinToString(\",\"))\n        val systemLanguages = LocaleListCompat.forLanguageTags(configuredLanguages.slice(4 until configuredLanguages.size).joinToString(\",\"))\n\n        Mockito.mockStatic(AppCompatDelegate::class.java).use { appCompatDelegate ->\n            appCompatDelegate.`when`<LocaleListCompat> { AppCompatDelegate.getApplicationLocales() }.thenReturn(appLanguages)\n\n            Mockito.mockStatic(LocaleListCompat::class.java).use { localeListCompat ->\n                localeListCompat.`when`<LocaleListCompat> { LocaleListCompat.getDefault() }.thenReturn(systemLanguages)\n\n                return getInitialLanguages(\n                    configuredLanguages[0],\n                    AccountEntity(\n                        id = 0,\n                        domain = \"foo.bar\",\n                        accessToken = \"\",\n                        clientId = null,\n                        clientSecret = null,\n                        isActive = true,\n                        defaultPostLanguage = configuredLanguages[1].orEmpty()\n                    )\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/util/NumberUtilsTest.kt",
    "content": "package com.keylesspalace.tusky.util\n\nimport java.util.Locale\nimport kotlin.math.pow\nimport org.junit.AfterClass\nimport org.junit.Assert.assertEquals\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.junit.runners.Parameterized\n\n@RunWith(Parameterized::class)\nclass NumberUtilsTest(private val input: Long, private val want: String) {\n    companion object {\n        /** Default locale before this test started */\n        private lateinit var locale: Locale\n\n        /**\n         * Ensure the Locale is ENGLISH so that tests against literal strings like\n         * \"1.0M\" later, even if the test host's locale is e.g. GERMAN which would\n         * normally report \"1,0M\".\n         */\n        @BeforeClass\n        @JvmStatic\n        fun beforeClass() {\n            locale = Locale.getDefault()\n            Locale.setDefault(Locale.ENGLISH)\n        }\n\n        @AfterClass\n        @JvmStatic\n        fun afterClass() {\n            Locale.setDefault(locale)\n        }\n\n        @Parameterized.Parameters(name = \"formatNumber_{0}\")\n        @JvmStatic\n        fun data(): Iterable<Array<Any>> {\n            return listOf(\n                arrayOf(0, \"0\"),\n                arrayOf(1, \"1\"),\n                arrayOf(-1, \"-1\"),\n                arrayOf(999, \"999\"),\n                arrayOf(1000, \"1.0K\"),\n                arrayOf(1500, \"1.5K\"),\n                arrayOf(-1500, \"-1.5K\"),\n                arrayOf(1000.0.pow(2).toLong(), \"1.0M\"),\n                arrayOf(1000.0.pow(3).toLong(), \"1.0G\"),\n                arrayOf(1000.0.pow(4).toLong(), \"1.0T\"),\n                arrayOf(1000.0.pow(5).toLong(), \"1.0P\"),\n                arrayOf(1000.0.pow(6).toLong(), \"1.0E\"),\n                arrayOf(3, \"3\"),\n                arrayOf(35, \"35\"),\n                arrayOf(350, \"350\"),\n                arrayOf(3500, \"3.5K\"),\n                arrayOf(-3500, \"-3.5K\"),\n                arrayOf(3500 * 1000, \"3.5M\"),\n                arrayOf(3500 * 1000.0.pow(2).toLong(), \"3.5G\"),\n                arrayOf(3500 * 1000.0.pow(3).toLong(), \"3.5T\"),\n                arrayOf(3500 * 1000.0.pow(4).toLong(), \"3.5P\"),\n                arrayOf(3500 * 1000.0.pow(5).toLong(), \"3.5E\")\n            )\n        }\n    }\n\n    @Test\n    fun test() {\n        assertEquals(want, formatNumber(input, 1000))\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/util/RickRollTest.kt",
    "content": "package com.keylesspalace.tusky.util\n\nimport android.app.Activity\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.Robolectric\nimport org.robolectric.annotation.Config\n\n@Config(sdk = [34])\n@RunWith(AndroidJUnit4::class)\nclass RickRollTest {\n    private lateinit var activity: Activity\n\n    @Before\n    fun setupActivity() {\n        val controller = Robolectric.buildActivity(Activity::class.java)\n        activity = controller.get()\n    }\n\n    @Test\n    fun testShouldRickRoll() {\n        listOf(\"gab.Com\", \"social.gab.ai\", \"whatever.GAB.com\").forEach {\n                rollableDomain ->\n            assertTrue(shouldRickRoll(activity, rollableDomain))\n        }\n\n        listOf(\"chaos.social\", \"notgab.com\").forEach {\n                notRollableDomain ->\n            assertFalse(shouldRickRoll(activity, notRollableDomain))\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/util/SmartLengthInputFilterTest.kt",
    "content": "package com.keylesspalace.tusky.util\n\nimport android.text.SpannableStringBuilder\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.annotation.Config\n\n@Config(sdk = [34])\n@RunWith(AndroidJUnit4::class)\nclass SmartLengthInputFilterTest {\n\n    @Test\n    fun shouldNotTrimStatusWithLength0() {\n        assertFalse(shouldTrimStatus(SpannableStringBuilder(\"\")))\n    }\n\n    @Test\n    fun shouldNotTrimStatusWithLength10() {\n        assertFalse(shouldTrimStatus(SpannableStringBuilder(\"0123456789\")))\n    }\n\n    @Test\n    fun shouldNotTrimStatusWithLength500() {\n        assertFalse(\n            shouldTrimStatus(\n                SpannableStringBuilder(\n                    \"u1Pc5TbDVYFnzIdqlQkb3xuZ2S61fFD1K4u\" +\n                        \"cb3q40dnELjAsWxnSH59jqly249Spr0Vod029zfwFHYQ0PkBCNQ7tuk90h6aY661RFC7vhIKJna4yDYOBFj\" +\n                        \"RR9u0CsUa6vlgEE5yUrk5LKn3bmnnzRCXmU6HyT2bFu256qoUWbmMQ6GFXUXjO28tru8Q3UiXKLgrotKdSH\" +\n                        \"mmqPwQgtatbMykTW4RZdKTE46nzlbD3mXHdWQkf4uVPYhVT1CMvVbCPMaimfQ0xuU8CpxyVqA8a6lCL3YX9\" +\n                        \"pNnZjD7DoCg2FCejANnjXsTF6vuqPSHjQZDjy696nSAFy95p9kBeJkc70fHzX5TcfUqSaNtvx3LUtpIkwh4\" +\n                        \"q2EYmKISPsxlANaspEMPuX6r9fSACiEwmHsitZkp4RMKZq5NqRsGPCiAXcNIN3jj9fCYVGxUwVxVeCescDG\" +\n                        \"5naEEszIR3FT1RO4MSn9c2ZZi0UdLizd8ciJAIuwwmcVyYyyM4\"\n                )\n            )\n        )\n    }\n\n    @Test\n    fun shouldNotTrimStatusWithLength666() {\n        assertFalse(\n            shouldTrimStatus(\n                SpannableStringBuilder(\n                    \"hIAXqY7DYynQGcr3zxcjCjNZFcdwAzwnWv\" +\n                        \"NHONtT55rO3r2faeMRZLTG3JlOshq8M1mtLRn0Ca8M9w82nIjJDm1jspxhFc4uLFpOjb9Gm2BokgRftA8ih\" +\n                        \"pv6wvMwF5Fg8V4qa8GcXcqt1q7S9g09S3PszCXG4wnrR6dp8GGc9TqVArgmoLSc9EVREIRcLPdzkhV1WWM9\" +\n                        \"ZWw7josT27BfBdMWk0ckQkClHAyqLtlKZ84WamxK2q3NtHR5gr7ohIjU8CZoKDjv1bA8ZI8wBesyOhqbmHf\" +\n                        \"0Ltypq39WKZ63VTGSf5Dd9kuTEjlXJtxZD1DXH4FFplY45DH5WuQ61Ih5dGx0WFEEVb1L3aku3Ht8rKG7YU\" +\n                        \"bOPeanGMBmeI9YRdiD4MmuTUkJfVLkA9rrpRtiEYw8RS3Jf9iqDkTpES9aLQODMip5xTsT4liIcUbLo0Z1d\" +\n                        \"NhHk7YKubigNQIm1mmh2iU3Q0ZEm8TraDpKu2o27gIwSKbAnTllrOokprPxWQWDVrN9bIliwGHzgTKPI5z8\" +\n                        \"gUybaqewxUYe12GvxnzqpfPFvvHricyZAC9i6Fkil5VmFdae75tLFWRBfE8Wfep0dSjL751m2yzvzZTc6uZ\" +\n                        \"RTcUiipvl42DaY8Z5eG2b6xPVhvXshMORvHzwhJhPkHSbnwXX5K\"\n                )\n            )\n        )\n    }\n\n    @Test\n    fun shouldTrimStatusWithLength667() {\n        assertTrue(\n            shouldTrimStatus(\n                SpannableStringBuilder(\n                    \"hIAXqY7DYynQGcr3zxcjCjNZFcdwAzwnWv\" +\n                        \"NHONtT55rO3r2faeMRZLTG3JlOshq8M1mtLRn0Ca8M9w82nIjJDm1jspxhFc4uLFpOjb9Gm2BokgRftA8ih\" +\n                        \"pv6wvMwF5Fg8V4qa8GcXcqt1q7S9g09S3PszCXG4wnrR6dp8GGc9TqVArgmoLSc9EVREIRcLPdzkhV1WWM9\" +\n                        \"ZWw7josT27BfBdMWk0ckQkClHAyqLtlKZ84WamxK2q3NtHR5gr7ohIjU8CZoKDjv1bA8ZI8wBesyOhqbmHf\" +\n                        \"0Ltypq39WKZ63VTGSf5Dd9kuTEjlXJtxZD1DXH4FFplY45DH5WuQ61Ih5dGx0WFEEVb1L3aku3Ht8rKG7YU\" +\n                        \"bOPeanGMBmeI9YRdiD4MmuTUkJfVLkA9rrpRtiEYw8RS3Jf9iqDkTpES9aLQODMip5xTsT4liIcUbLo0Z1d\" +\n                        \"NhHk7YKubigNQIm1mmh2iU3Q0ZEm8TraDpKu2o27gIwSKbAnTllrOokprPxWQWDVrN9bIliwGHzgTKPI5z8\" +\n                        \"gUybaqewxUYe12GvxnzqpfPFvvHricyZAC9i6Fkil5VmFdae75tLFWRBfE8Wfep0dSjL751m2yzvzZTc6uZ\" +\n                        \"RTcUiipvl42DaY8Z5eG2b6xPVhvXshMORvHzwhJhPkHSbnwXX5K1\"\n                )\n            )\n        )\n    }\n\n    @Test\n    fun shouldTrimStatusWithLength1000() {\n        assertTrue(\n            shouldTrimStatus(\n                SpannableStringBuilder(\n                    \"u1Pc5TbDVYFnzIdqlQkb3xuZ2S61fFD1K4u\" +\n                        \"cb3q40dnELjAsWxnSH59jqly249Spr0Vod029zfwFHYQ0PkBCNQ7tuk90h6aY661RFC7vhIKJna4yDYOBFj\" +\n                        \"RR9u0CsUa6vlgEE5yUrk5LKn3bmnnzRCXmU6HyT2bFu256qoUWbmMQ6GFXUXjO28tru8Q3UiXKLgrotKdSH\" +\n                        \"mmqPwQgtatbMykTW4RZdKTE46nzlbD3mXHdWQkf4uVPYhVT1CMvVbCPMaimfQ0xuU8CpxyVqA8a6lCL3YX9\" +\n                        \"pNnZjD7DoCg2FCejANnjXsTF6vuqPSHjQZDjy696nSAFy95p9kBeJkc70fHzX5TcfUqSaNtvx3LUtpIkwh4\" +\n                        \"q2EYmKISPsxlANaspEMPuX6r9fSACiEwmHsitZkp4RMKZq5NqRsGPCiAXcNIN3jj9fCYVGxUwVxVeCescDG\" +\n                        \"5naEEszIR3FT1RO4MSn9c2ZZi0UdLizd8ciJAIuwwmcVyYyyM4\" +\n                        \"u1Pc5TbDVYFnzIdqlQkb3xuZ2S61fFD1K4u\" +\n                        \"cb3q40dnELjAsWxnSH59jqly249Spr0Vod029zfwFHYQ0PkBCNQ7tuk90h6aY661RFC7vhIKJna4yDYOBFj\" +\n                        \"RR9u0CsUa6vlgEE5yUrk5LKn3bmnnzRCXmU6HyT2bFu256qoUWbmMQ6GFXUXjO28tru8Q3UiXKLgrotKdSH\" +\n                        \"mmqPwQgtatbMykTW4RZdKTE46nzlbD3mXHdWQkf4uVPYhVT1CMvVbCPMaimfQ0xuU8CpxyVqA8a6lCL3YX9\" +\n                        \"pNnZjD7DoCg2FCejANnjXsTF6vuqPSHjQZDjy696nSAFy95p9kBeJkc70fHzX5TcfUqSaNtvx3LUtpIkwh4\" +\n                        \"q2EYmKISPsxlANaspEMPuX6r9fSACiEwmHsitZkp4RMKZq5NqRsGPCiAXcNIN3jj9fCYVGxUwVxVeCescDG\" +\n                        \"5naEEszIR3FT1RO4MSn9c2ZZi0UdLizd8ciJAIuwwmcVyYyyM4\"\n                )\n            )\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/com/keylesspalace/tusky/util/TimestampUtilsTest.kt",
    "content": "package com.keylesspalace.tusky.util\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.platform.app.InstrumentationRegistry\nimport java.util.Locale\nimport kotlin.time.Duration.Companion.days\nimport kotlin.time.Duration.Companion.hours\nimport kotlin.time.Duration.Companion.minutes\nimport kotlin.time.Duration.Companion.seconds\nimport org.junit.AfterClass\nimport org.junit.Assert.assertEquals\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.robolectric.annotation.Config\n\n@Config(sdk = [34])\n@RunWith(AndroidJUnit4::class)\nclass TimestampUtilsTest {\n\n    companion object {\n        private lateinit var locale: Locale\n\n        @BeforeClass\n        @JvmStatic\n        fun beforeClass() {\n            locale = Locale.getDefault()\n            Locale.setDefault(Locale.ENGLISH)\n        }\n\n        @AfterClass\n        @JvmStatic\n        fun afterClass() {\n            Locale.setDefault(locale)\n        }\n    }\n\n    val context = InstrumentationRegistry.getInstrumentation().targetContext\n\n    @Test\n    fun `should return 'now' for small timespans`() {\n        assertEquals(\"now\", getRelativeTimeSpanString(context, 0, 300))\n        assertEquals(\"now\", getRelativeTimeSpanString(context, 300, 0))\n        assertEquals(\"now\", getRelativeTimeSpanString(context, 501, 0))\n        assertEquals(\"now\", getRelativeTimeSpanString(context, 0, 999))\n    }\n\n    @Test\n    fun `should return 'in --' when then is after now`() {\n        assertEquals(\"in 49s\", getRelativeTimeSpanString(context, 49.seconds.inWholeMilliseconds, 0))\n        assertEquals(\"in 34m\", getRelativeTimeSpanString(context, 37.minutes.inWholeMilliseconds, 3.minutes.inWholeMilliseconds))\n        assertEquals(\"in 7h\", getRelativeTimeSpanString(context, 10.hours.inWholeMilliseconds, 3.hours.inWholeMilliseconds))\n        assertEquals(\"in 10d\", getRelativeTimeSpanString(context, 10.days.inWholeMilliseconds, 0))\n        assertEquals(\"in 4y\", getRelativeTimeSpanString(context, 800.days.inWholeMilliseconds + (4 * 365).days.inWholeMilliseconds, 800.days.inWholeMilliseconds))\n    }\n\n    @Test\n    fun `should return correct timespans`() {\n        assertEquals(\"49s\", getRelativeTimeSpanString(context, 0, 49.seconds.inWholeMilliseconds))\n        assertEquals(\"34m\", getRelativeTimeSpanString(context, 3.minutes.inWholeMilliseconds, 37.minutes.inWholeMilliseconds))\n        assertEquals(\"7h\", getRelativeTimeSpanString(context, 3.hours.inWholeMilliseconds, 10.hours.inWholeMilliseconds))\n        assertEquals(\"10d\", getRelativeTimeSpanString(context, 0, 10.days.inWholeMilliseconds))\n        assertEquals(\"4y\", getRelativeTimeSpanString(context, 800.days.inWholeMilliseconds, 800.days.inWholeMilliseconds + (4 * 365).days.inWholeMilliseconds))\n    }\n\n    @Test\n    fun `should return correct poll duration`() {\n        assertEquals(\"1 second left\", formatPollDuration(context, 1.seconds.inWholeMilliseconds, 0))\n        assertEquals(\"49 seconds left\", formatPollDuration(context, 49.seconds.inWholeMilliseconds, 0))\n        assertEquals(\"1 minute left\", formatPollDuration(context, 37.minutes.inWholeMilliseconds, 36.minutes.inWholeMilliseconds))\n        assertEquals(\"34 minutes left\", formatPollDuration(context, 37.minutes.inWholeMilliseconds, 3.minutes.inWholeMilliseconds))\n        assertEquals(\"1 hour left\", formatPollDuration(context, 10.hours.inWholeMilliseconds, 9.hours.inWholeMilliseconds))\n        assertEquals(\"7 hours left\", formatPollDuration(context, 10.hours.inWholeMilliseconds, 3.hours.inWholeMilliseconds))\n        assertEquals(\"1 day left\", formatPollDuration(context, 1.days.inWholeMilliseconds, 0))\n        assertEquals(\"10 days left\", formatPollDuration(context, 10.days.inWholeMilliseconds, 0))\n        assertEquals(\"1460 days left\", formatPollDuration(context, 800.days.inWholeMilliseconds + (4 * 365).days.inWholeMilliseconds, 800.days.inWholeMilliseconds))\n    }\n}\n"
  },
  {
    "path": "build.gradle",
    "content": "plugins {\n    alias(libs.plugins.android.application) apply false\n    alias(libs.plugins.google.ksp) apply false\n    alias(libs.plugins.hilt.android) apply false\n    alias(libs.plugins.kotlin.android) apply false\n    alias(libs.plugins.kotlin.parcelize) apply false\n    alias(libs.plugins.ktlint) apply false\n    alias(libs.plugins.licensee) apply false\n}\n\nallprojects {\n    apply plugin: libs.plugins.ktlint.get().pluginId\n\n    plugins.withType(JavaBasePlugin).configureEach {\n        java {\n            toolchain.languageVersion = JavaLanguageVersion.of(21)\n        }\n    }\n\n    // Required for Hilt to use the toolchain\n    tasks.withType(JavaCompile).configureEach {\n        javaCompiler = javaToolchains.compilerFor {\n            languageVersion = JavaLanguageVersion.of(21)\n        }\n    }\n}\n\ntasks.register('clean') {\n    delete layout.buildDirectory\n}\n"
  },
  {
    "path": "doc/PaymentPolicy.md",
    "content": "<h1>Payment Policy</h1>  \n\nWe provide payment for work done on the Tusky project, including but not limited to, Coding, Code Review, Design, and User Support. We also reimburse all costs necessary to keep the project running, e.g. servers, hosting, domain renewals, and the occasional merchandise drop to promote the project.\n\nWe primarily use our budget to enable contributors who would otherwise not be able to contribute, and prioritize payments to such need-based contributors. \n\n<ul>\n  <li>Payments for one-off contributions are welcome, but the scope of the work must be discussed and approved in our Matrix-based <a href=\"https://matrix.to/#/#Tusky-Code:matrix.org\" target=\"_new\">Tusky Code room</a> prior to the work commencing.</li> \n        <ul>\n          <li>Payment amounts for one-off contributions will be determined based on the scope of the work and amount of funds available, both of which will be discussed and agreed upon by the contributor and team up front. The payment amount will be considered approved with the sign-off of one of our <a href=\"https://opencollective.com/tusky#category-ABOUT\" target=\"_new\">OpenCollective Admins</a> after the discussion has occurred.</li>\n        </ul>\n    <li>Regular contributors can submit for payments based on a team-approved individual agreement.</li>\n    <li>Payment requests are approved by our <a href=\"https://opencollective.com/tusky#category-ABOUT\" target=\"_new\">OpenCollective Admins</a>. Admins <i>cannot</i> approve their own payment requests.</li>\n    <li>Payments have a soft cap of $500/month per contributor. Additional amounts may not be considered without a broad team consensus.</li>\n</ul>\n\n<h2>Expense Submissions</h2>\n\nPayment requests should be submitted monthly for the previous month's work. A description of the work must be included. Some examples:\n\n<ul>\n  <li>September 2023: [#] hours of development work on GitHub issues #1234, #5678, #9000.</li>\n  <li>September 2023: [#] hours of support work updating Tusky FAQs, answering email inquiries sent to the Tusky email address, and posting updates to the official Mastodon Tusky account.</li>\n</ul>\n\nYou are not required to upload an invoice attachment (the data you submit in the expense form is sufficient) but if you would like to include an uploaded invoice, please make it out to:\n\nTusky<br>\nOpen Source Collective<br>\n440 N. Barranca Avenue #3717<br>\nCovina, CA 91723, USA<br>\n\n<h2>Reimbursement Submissions</h2>\nReimbursements must include receipts, whether a PDF copy or photo of a paper receipt. For more information on what constitutes a valid receipt, see <a href=\"https://docs.oscollective.org/how-it-works/basics/invoice-and-reimbursement-examples#reimbursements\" target=\"_new\">Open Source Collective's documentation</a>. \n"
  },
  {
    "path": "doc/Release.md",
    "content": "# Releasing Tusky\n\nBefore each major release, make a beta for at least a week to make sure the release is well tested before being released for everybody. Minor releases can skip beta.\n\nThis approach of having ~500 user on the nightly releases and ~5000 users on the beta releases has so far worked very well and helped to fix bugs before they could reach most users.\n\n## Beta\n\n- Make sure all new features are well tested by Nightly users and all issues addressed as good as possible. Check GitHub issues, Google Play crash reports, messages on `@Tusky@mastodon.social`, emails on `contact@tusky.app`, #Tusky hashtag.\n- Merge the latest Weblate translations (Weblate -> Repository maintenance -> commit all changes, then merge the automatic PRs by @nailyk-weblate on GitHub)\n- Update `versionCode` and `versionName` in `app/build.gradle`\n- Add a new short changelog under `fastlane/metadata/android/en-US/changelogs`. Use the next versionCode as the filename. This is so translators on Weblate have the duration of the beta to translate the changelog and F-Droid users will see it in their language on the release. If another beta is released, the changelogs have to be renamed. Note that changelogs shouldn't be over 500 characters or F-Droid will truncate them.\n- Merge `develop` into `main`\n- Create a new [GitHub release](https://github.com/tuskyapp/Tusky/releases).\n  - Tag the head of `main`.\n  - Create an exhaustive changelog by going through all commits since the last release.\n  - Mark the release as being a pre-release.\n- GitHub Actions will automatically build and upload the release to the Internal Testing track on Google Play.\n- Do a quick check to make sure the build doesn't crash, e.g. by enrolling yourself into the test track.\n    - In case there are any problems, delete the GitHub release, fix the problems and start again\n- Download the build as apk from Google Play (App Bundle Explorer -> choose the release -> Downloads -> Signed, universal APK). Attach it to the GitHub Release.\n- Create a new Open Testing release on Google Play. Reuse the build from the Internal Testing track.\n- Create a merge request at F-Droid. [Example](https://gitlab.com/fdroid/fdroiddata/-/merge_requests/11218) (F-Droid automatically picks up new release tags, but not beta ones. This could probably be changed somehow.)\n- Announce the release\n\n## Full release\n\n- Make sure all new features are well tested by beta users and all issues addressed as good as possible. Check GitHub issues, Google Play crash reports, messages on `@Tusky@mastodon.social`, #Tusky hashtag.\n- Merge the latest Weblate translations (Weblate -> Repository maintenance -> commit all changes, then merge the automatic PRs by @nailyk-weblate on GitHub)\n- Update `versionCode` and `versionName` in `app/build.gradle`\n- Merge `develop` into `main`\n- Create a new [GitHub release](https://github.com/tuskyapp/Tusky/releases).\n  - Tag the head of `main`.\n  - Reuse the changelog from the beta release, or create a new one if this is only a minor release.\n- (F-Droid will automatically detect and build the release)\n- GitHub Actions will automatically build and upload the release to the Internal Testing track on Google Play.\n- Do a quick check to make sure the build doesn't crash, e.g. by enrolling yourself into the test track.\n    - In case there are any problems, delete the GitHub release, fix the problems and start again\n- Download the build as apk from Google Play (App Bundle Explorer -> choose the release -> Downloads -> Signed, universal APK). Attach it to the GitHub Release.\n- Create a new full release on Google Play. Reuse the build from the Internal Testing track.\n- Announce the release\n\n## Versioning\n\nSince Tusky is user facing software that has no Api, we don't use semantic versioning. Tusky version numbers only consist of two numbers major.minor with optional commit hash (nightly/test releases) or beta flag (beta releases).\n- User visible changes in the release -> new major version\n- Only bugfixes, new translations, refactorings or performance improvements in the release -> new minor version\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/61.txt",
    "content": "توسكي الإصدار 7.0\n\n- دعم عرض استطلاعات الرأي والتصويت وإشعارات الاقتراع\n أزرار جديدة لتنقية لسان الإخطارات و حذف جميع الإخطارات\n- حذف و أعاد صياغة تبويقاتكم\n- مؤشر جديد يظهر إذا كان الحساب روبوتا على صورة الحساب (يمكن تعطيله في التفضيلات)\n- ترجمات جديدة: بوكمول النرويجية والسلوفينية.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/68.txt",
    "content": "Tusky v9.1\n\nيكفل هذا التحديث التوافق مع ماستدون 3 ويحسن الأداء والاستقرار.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/70.txt",
    "content": "Ml\n"
  },
  {
    "path": "fastlane/metadata/android/ar/full_description.txt",
    "content": "توسكي أو Tusky هو تطبيق خفيف لماستدون ، خادم الشبكة الاجتماعية الحرة والمفتوحة المصدر.\n\n* مواد التصميم\n* يدعم معظم ميزات واجهة برمجة التطبيقات الخاصة بماستدون\n* يدعم الحسابات المتعددة\n* مظهر داكن أو فاتح مع إمكانية التبديل بينهما تلقائيا بحسب ساعة اليوم\n* المسودات - تحرير تبويقات والاحتفاظ بها لنشرها في وقت لاحق \n* اختر بين مختلف أنواع الإيموجي\n* يدعم جميع أحجام الشاشات\n* مفتوح المصدر كليا - لا يعتمد بتاتا على مكتبات غير حرة مثل خدمات غوغل\n\nلمعرفة المزيد عن ماستدون ، يمكنكم زيارة https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/ar/short_description.txt",
    "content": "تطبيق للشبكة الاجتماعية ماستدون يدعم الحسابات المتعددة\n"
  },
  {
    "path": "fastlane/metadata/android/ar/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/be/full_description.txt",
    "content": "Tusky — гэта лёгкі кліент для Mastodon, бескаштоўнай сацыяльнай сеткі з адкрытым кодам сервера.\n\n• Дызайн у стылі Material\n• Падтрымка большасці магчымасцей Mastodon\n• Падтрымка некалькіх уліковых запісаў\n• Цёмна і светлая тэмы з магчымасцю аўтапераключэння ў залежнасці ад часу дня\n• Чарнавікі — пачніце ствараць допіс і зберажыце яго на потым\n• Выбар паміж рознымі наборамі эмодзі\n• Аптымізаваны для розных памераў экрана\n• Адкрыты зыходны код, ніякіх не вольных залежнасцей, як ад сэрвісаў Google.\n\nКаб даведацца больш пра Mastodon, наведайце https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/be/short_description.txt",
    "content": "Кліент сацыяльнай сеткі Mastodon з падтрымкай некалькіх уліковых запісаў\n"
  },
  {
    "path": "fastlane/metadata/android/be/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/bg/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Поддръжка за показване на анкети, гласуване и известия за анкети\n- Нови бутони за филтриране на раздела за известия и за изтриване на всички известия\n- изтриване и преработване на вашите собствени публикации\n- нов индикатор, който показва дали даден акаунт е бот на изображението на профила (може да бъде изключен в предпочитанията)\n- Нови преводи: норвежки, букмал и словенски.\n"
  },
  {
    "path": "fastlane/metadata/android/bg/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Вече можете да създавате анкети от Tusky\n- Подобрено търсене\n- Нова опция в Предпочитания на акаунта за винаги разширяване на предупрежденията за съдържание\n- Аватарите в навигационното чекмедже вече имат закръглена квадратна форма\n- Вече е възможно да докладвате за потребители, дори когато те никога не са публикували статус\n- Tusky сега ще откаже да се свързва чрез връзки с чист текст на Android 6+\n- Много други малки подобрения и корекции на грешки\n"
  },
  {
    "path": "fastlane/metadata/android/bg/changelogs/68.txt",
    "content": "Tusky v9.1\n\nТази версия осигурява съвместимост с Mastodon 3 и подобрява производителността и стабилността.\n"
  },
  {
    "path": "fastlane/metadata/android/bg/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Вече можете да маркирате състояния и да показвате отметките си в Tusky.\n- Вече можете да планирате публикации с Tusky. Имайте предвид, че избраното време трябва да бъде поне 5 минути в бъдеще.\n- Вече можете да добавяте списъци към главния екран.\n- Вече можете да публикувате аудио прикачени файлове с Tusky.\n\nИ много други малки подобрения и корекции на грешки!\n"
  },
  {
    "path": "fastlane/metadata/android/bg/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- Подобрен основен интерфейс - вече можете да премествате разделите отдолу\n- Когато заглушавате потребител, вече можете също да решите дали да заглушите известията му\n- Вече можете да следвате колкото искате хештегове в един единствен раздел хештегове\n- Подобрен е начинът, по който се показват описанията на мултимедиите, така че да работи дори за супер дълги описания\n    \nПълен дневник на промените: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/bg/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- поддръжка за бележки в профила (функция на Mastodon 3.2.0)\n- поддръжка за администраторски съобщения (функция на Mastodon 3.1.0)\n\n- аватарът на избрания от вас акаунт вече ще се показва в главната лента с инструменти\n- щракването върху показваното име в емисия ще отвори страницата с профила на този потребител\n\n- много корекции на грешки и малки подобрения\n- подобрени преводи\n"
  },
  {
    "path": "fastlane/metadata/android/bg/full_description.txt",
    "content": "Tusky е лек клиент за Mastodon, свободен сървър за социални мрежи с отворен код.\n\n• Материален дизайн\n• Повечето приложени API на Mastodon\n• Поддръжка на няколко акаунта\n• Тъмна и светла тема с възможност за автоматично превключване в зависимост от часа\n• Чернови - съставете публикации и ги запазете за по-късно\n• Изберете между различни стилове емоджита\n• Оптимизиран за всички размери на екрана\n• Напълно отворен код - няма несвободни зависимости като услугите на Google\n\nЗа да научите повече за Mastodon, посетете https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/bg/short_description.txt",
    "content": "Клиент с няколко акаунта за социалната мрежа Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/bg/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/bn-BD/full_description.txt",
    "content": "টাস্কি একটি ফ্রি এবং মুক্ত উৎসবিশিষ্ট সামাজিক নেটওয়ার্ক সার্ভার মাস্টোডনের জন্য একটি হালকা ক্লায়েন্ট।\n\n• মেটেরিয়াল নকশা\n• বেশিরভাগ মাস্টডন এপিআই প্রয়োগ করা হয়েছে\n• বহু অ্যাকাউন্ট সমর্থন করে\n• দিনের সময় ভিত্তিতে অন্ধকার এবং হালকা রঙে পাল্টানো যায়\n• খসড়া - টুট রচনা করে পরে ছাপানোর জন্য সংরক্ষণ করো\n• বিভিন্ন আবেগ শৈলীর বিদ্যমান\n• সমস্ত পর্দার আকারের জন্য অনূকুল\n• সম্পূর্ণ মুক্ত উৎসবিশিষ্ট- গুগল পরিষেবাগুলোর মতো কোনও অ-মুক্ত নির্ভরতা নেই\n\nমাস্টডন সম্পর্কে আরও জানতে, দেখো https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/bn-BD/short_description.txt",
    "content": "মাস্টডন নামক সামাজিক নেটওয়ার্কের জন্য একাধিক অ্যাকাউন্ট সমর্থনকারী ক্লায়েন্ট\n"
  },
  {
    "path": "fastlane/metadata/android/bn-BD/title.txt",
    "content": "টাস্কি\n"
  },
  {
    "path": "fastlane/metadata/android/bn-IN/changelogs/67.txt",
    "content": "টাস্কি সং-৯.০\n\n- আপনি এখন টাস্কি থেকে পোল তৈরি করতে পারেন\n- উন্নত অনুসন্ধান\n- সর্বদা সামগ্রীর সতর্কতাগুলি প্রসারিত করতে অ্যাকাউন্ট পছন্দগুলিতে নতুন বিকল্প\n- নেভিগেশন ড্রয়ারের অবতারগুলিতে এখন একটি বৃত্তাকার বর্গাকার আকার রয়েছে\n- ব্যবহারকারীরা কোনও স্ট্যাটাস কখনও পোস্ট না করলেও এখন তাদের প্রতিবেদন করা সম্ভব\n- টস্কি এখন অ্যান্ড্রয়েড 6+ এ ক্লিয়ারটেক্সট সংযোগের মাধ্যমে সংযোগ দিতে অস্বীকার করবে\n- অন্যান্য অনেক ছোট উন্নতি এবং বাগ ফিক্স\n"
  },
  {
    "path": "fastlane/metadata/android/bn-IN/full_description.txt",
    "content": "টাস্কি একটি ফ্রি এবং মুক্ত উৎসবিশিষ্ট সামাজিক নেটওয়ার্ক সার্ভার মাস্টোডনের জন্য একটি হালকা ক্লায়েন্ট।\n\n• মেটেরিয়াল নকশা\n• বেশিরভাগ মাস্টডন এপিআই প্রয়োগ করা হয়েছে\n• বহু অ্যাকাউন্ট সমর্থন করে\n• দিনের সময় ভিত্তিতে অন্ধকার এবং হালকা রঙে পাল্টানো যায়\n• খসড়া - টুট রচনা করে পরে ছাপানোর জন্য সংরক্ষণ করো\n• বিভিন্ন আবেগ শৈলীর বিদ্যমান\n• সমস্ত পর্দার আকারের জন্য অনূকুল\n• সম্পূর্ণ মুক্ত উৎসবিশিষ্ট- গুগল পরিষেবাগুলোর মতো কোনও অ-মুক্ত নির্ভরতা নেই\n\nমাস্টডন সম্পর্কে আরও জানতে, দেখো\nhttps://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/bn-IN/short_description.txt",
    "content": "মাস্টডন নামক সামাজিক নেটওয়ার্কের জন্য একাধিক অ্যাকাউন্ট সমর্থনকারী ক্লায়েন্ট\n"
  },
  {
    "path": "fastlane/metadata/android/bn-IN/title.txt",
    "content": "টাস্কি\n"
  },
  {
    "path": "fastlane/metadata/android/ca/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Suport per a l'edició de publicacions\n- Nova configuració per controlar la direcció de lectura preferida\n- Visualitzacions prèvies d'imatges més grans i una nova superposició per indicar les imatges amb descripció\n- Ara és possible afegir comptes a llistes des del seu perfil\ni molt més\n"
  },
  {
    "path": "fastlane/metadata/android/ca/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Els filtres de cronologia s'han mogut a Preferències del compte i se sincronitzaran amb el servidor\n- Ara podeu tenir un hashtag personalitzat com a pestanya a la interfície principal\n- Ara es poden editar les llistes\n- Seguretat: s'ha eliminat el suport per a TLS 1.0 i TLS 1.1 i s'ha afegit suport per a TLS 1.3 a Android 6+\n- La vista de redacció ara suggerirà emojis personalitzats quan comenci a escriure\n- Nova configuració del tema \"seguir el tema del sistema\"\n- Millora de l'accessibilitat de la cronologia\n- Ara Tusky ignorarà les notificacions desconegudes i ja no es bloquejarà\n- Configuració nova: ara podeu anul·lar l'idioma del sistema i definir un idioma diferent a Tusky\n- Noves traduccions: txec i esperanto\n- Moltes altres millores i correccions\n"
  },
  {
    "path": "fastlane/metadata/android/ca/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Suport per mostrar votacions, vots i notificacions de votacions\n- Nous botons per filtrar la pestanya de notificacions i suprimir totes les notificacions\n- Suprimeix i redirigeix els teus propis signes\n- Nou indicador que mostra si un compte és un bot a la imatge de perfil (es pot desactivar a les preferències)\n- Noves traduccions: norvégien bokmål i eslovè\n"
  },
  {
    "path": "fastlane/metadata/android/ca/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Ara podeu crear enquestes a partir de Tusky\n- Millora de la cerca\n- Nova opció a Preferències del compte per ampliar sempre els avisos de contingut\n- Els avatars del calaix de navegació tenen ara una forma quadrada arrodonida\n- Ara és possible informar als usuaris fins i tot quan mai no han publicat un estat\n- Ara Tusky es negarà a connectar-se a connexions de text clar a Android 6+\n- Un munt d’altres petites millores i solucions d’errors\n"
  },
  {
    "path": "fastlane/metadata/android/ca/changelogs/68.txt",
    "content": "Tusky v9.1\n\nAquesta versió garanteix la compatibilitat amb Mastodon 3 i millora el rendiment i l'estabilitat.\n"
  },
  {
    "path": "fastlane/metadata/android/ca/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Ara podeu marcar els estatuts de les adreces i enumerar les adreces d'interès a Tusky.\n- Ara podeu programar toots amb Tusky. Tingueu en compte que el temps que seleccioneu ha de ser d'almenys 5 minuts en el futur.\n- Ara podeu afegir llistes a la pantalla principal.\n- Ja podeu publicar fitxers adjunts d'àudio amb Tusky.\n\nI moltes altres petites millores i solucions d’errors.\n"
  },
  {
    "path": "fastlane/metadata/android/ca/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- Notificacions sobre les noves sol·licituds de seguiment quan el vostre compte està bloquejat\n- Noves funcions que es poden commutar a la pantalla de Preferències:\n    - desactiva el desplaçament entre pestanyes\n    - mostreu un diàleg de confirmació abans de fer augmentar el punt de mira\n    - mostra les previsualitzacions d'enllaços en els terminis\n- Ara es poden silenciar les converses\n- més informació al changelog\n"
  },
  {
    "path": "fastlane/metadata/android/ca/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- Interfície principal millorada: ara podeu moure les pestanyes a la part inferior\n- Quan silencieu un usuari, ara també podeu decidir si silencieu les seves notificacions\n- Ara podeu seguir tants hashtags com vulgueu en una sola pestanya d'hashtag\n- S'ha millorat la manera com es mostren les descripcions dels mitjans perquè funcioni fins i tot per a descripcions molt llargues\n    \nRegistre de canvis complet: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/ca/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- Suport per a notes de perfil (funció Mastodon 3.2.0)\n- Suport per a anuncis d'administrador (funció Mastodon 3.1.0)\n\n- Ara es mostrarà l'avatar del vostre compte seleccionat a la barra d'eines principal\n- Si feu clic al nom de visualització en una línia de temps, ara s'obrirà la pàgina de perfil d'aquest usuari\n\n- Moltes correccions d'errors i petites millores\n- Traduccions millorades\n"
  },
  {
    "path": "fastlane/metadata/android/ca/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Rebeu una notificació quan un usuari seguit publica: feu clic a la icona de campana del seu perfil! (funció Mastodon 3.3.0)\n- La funció d'esborrany de Tusky s'ha redissenyat completament per ser més ràpida, més fàcil d'utilitzar i amb menys errors.\n- S'ha afegit un nou mode de benestar que us permet limitar determinades funcions de Tusky.\n- Ara Tusky pot animar emojis personalitzats.\nRegistre de canvis complet: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/ca/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- Les sol·licituds de seguiment ara es mostren sempre al menú principal.\n- El selector de temps per programar una publicació té ara un disseny coherent amb la resta de l'aplicació\nRegistre de canvis complet: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/ca/changelogs/83.txt",
    "content": "Tusky v15.1\n\nAquesta versió corregeix un error en subtitular imatges\n"
  },
  {
    "path": "fastlane/metadata/android/ca/changelogs/87.txt",
    "content": "Tusky v16.0\n\n- La lògica de càrrega de la línia de temps s'ha reescrit completament per tal de ser més ràpida, amb menys errors i més fàcil de mantenir.\n- Tusky ara pot animar emojis personalitzats en format APNG i WebP animat.\n- Moltes correccions d'errors\n- Suport per a Android 11\n- Noves traduccions: gaèlic escocès, gallec, ucraïnès\n- Traduccions millorades\n"
  },
  {
    "path": "fastlane/metadata/android/ca/changelogs/89.txt",
    "content": "Tusky v17.0\n\n- \"Obre com...\" ara també està disponible al menú dels perfils del compte quan s'utilitzen diversos comptes\n- Ara l'inici de sessió es gestiona en una WebView dins de l'aplicació\n- Suport per a Android 12\n- Suport per a la nova API de configuració de la instància Mastodon\n- i moltes altres petites correccions i millores\n"
  },
  {
    "path": "fastlane/metadata/android/ca/changelogs/91.txt",
    "content": "Tusky v18.0\n\n- Suport per als nous tipus de notificacions Mastodon 3.5\n- La insígnia del bot ara es veu millor i s'ajusta al tema seleccionat\n- Ara es pot seleccionar el text a la vista detallada de la publicació\n- S'han corregit molts errors, inclòs un que impedia els inicis de sessió a Android 6 i anteriors\n"
  },
  {
    "path": "fastlane/metadata/android/ca/changelogs/94.txt",
    "content": "Tusky 19.0\n\n- Suport per a Unified Push. Per activar l'assistència, haureu de tornar a iniciar sessió als vostres comptes.\n- El nombre de respostes a una publicació s'indica ara a les línies de temps.\n- Les imatges ara es poden retallar mentre es redacta una publicació.\n- Ara els perfils mostren la data en què es van crear.\n- Quan es visualitza una llista, ara el títol es mostra a la barra d'eines.\n- Moltes correccions d'errors\n- Millores en la traducció\n"
  },
  {
    "path": "fastlane/metadata/android/ca/changelogs/97.txt",
    "content": "Tusky 20.0\n\n- Nova icona de l'aplicació de Dzuk https://dzuk.zone/\n- Ara podeu seguir els hashtags. Feu clic a un hashtag i després a la icona de la barra d'eines.\n- Suport per a Android 13\n- nou menú desplegable a la vista de redacció per definir l'idioma d'una publicació\n- La pestanya multimèdia dels perfils ara respecta les imatges sensibles i es carrega més suaument.\n- Ara és possible establir el punt d'enfocament d'una imatge abans de publicar-la\n- Nova opció per mostrar el vostre nom d'usuari complet a la barra d'eines\n"
  },
  {
    "path": "fastlane/metadata/android/ca/full_description.txt",
    "content": "Tusky és un client lleuger per a Mastodon, un servidor de xarxa social gratuït i de codi obert.\n\n• Estils de \"Material Design\"\n• S'han implementat la majoria de les API de Mastodon\n• Assistència multi-compte\n• Tema fosc i clar amb la possibilitat de canviar automàticament en funció de l’hora del dia\n• Esborranys: composeu els toots de sortida i deseu-los per a més endavant\n• Trieu entre diferents estils emoji\n• Optimitzat per a totes les mides de pantalla\n• Completament de codi obert: no hi ha dependències no gratuïtes com els serveis de Google\n\nPer obtenir més informació sobre Mastodon, visiteu https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/ca/short_description.txt",
    "content": "Un client multicomptes per a la xarxa social Mastodont\n"
  },
  {
    "path": "fastlane/metadata/android/ca/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/ckb/changelogs/77.txt",
    "content": "تاسکی وشانی ١٣.٠\n\n- پشتگیری بۆ تێبینیەکانی پرۆفایل (تایبەتمەندی ماستۆدۆن ٣.٢.٠)\n- پشتگیری لە راگەیاندنی بەڕێوەبەر (تایبەتمەندی ماستۆدۆن ٣.١.٠)\n\n- ئێستا ئەژمێری هەڵبژێردراوی هەژمارەکەت لە شریتی ئامڕازی سەرەکی دا پیشان دەدرێت\n- کرتە کردن لەسەر ناوی پیشاندان لە هێڵی کات ئێستا لاپەڕەی پرۆفایلی ئەو بەکارهێنەرە هەڵدەدات\n\n- زۆر چاککردنەوەی هەڵەکان و چاککردنەوەی بچووک\n- وەرگێڕانە باشەکان\n"
  },
  {
    "path": "fastlane/metadata/android/ckb/full_description.txt",
    "content": "توسکی ئەپێکی سووکەڵە بۆ ماستۆدۆنە، خزمەتکاری تۆڕی کۆمەڵایەتی ئازاد و کراوە\n\n• دیزاینی ماتریالی\n• زۆربەی ماستۆدۆن   API جێبەجێ دەکا\n• پشتیوانی هەژمارەی هەمەجۆر\n• ڕووکاری تاریک و رووناک لەگەڵ ئەگەری گۆڕینی خۆکار لەسەر بنەمای کاتی رۆژ\n• ڕەشنووسەکان - دروستکردنی دووتەکان و هەڵگرتنیان بۆ دواتر\n• هەڵبژێرە لەنێوان شێوازە ئیمۆجییە جیاوازەکان\n• باشترکراوە بۆ هەموو قەبارەی شاشە\n• بەتەواوی کراوەی سەرچاوە - هیچ پشت پێبەستنێکی نائازاد وەک خزمەتگوزاریەکانی گووگڵ\n\nبۆ زیاتر فێربوون لەبارەی مەستوورن ، سەردانی https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/ckb/short_description.txt",
    "content": "کڕیارێکی هەژماری هەمەجۆر بۆ تۆڕی کۆمەڵایەتی ماستۆدۆن\n"
  },
  {
    "path": "fastlane/metadata/android/ckb/title.txt",
    "content": "تاسکی\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Filtry časové osy jsme přesunuli do Předvoleb účtu a budou se synchronizovat se serverem.\n- Na hlavním stránce můžete mít vlastní hashtag jako kartu \n- Seznamy lze upravovat\n- Zabezpečení: odstraněna podpora TLS 1.0 a TLS 1.1 a přidána podpora TLS 1.3 v systému Android 6+.\n- Vlastní emotikony jsou nabízeny při psaní\n- Nové nastavení motivu \"následovat systémový motiv\"\n- Vylepšená přístupnost časové osy\n- Tusky teď ignoruje neznámá oznámení a už nepadá\n- Nové nastavení: Nyní můžete v aplikaci Tusky nastavit jiný než systímový jazyk.\n- Nové překlady: čeština (!) a esperanto\n- Mnoho dalších vylepšení a oprav\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Podpora pro zobrazování anket, hlasování a oznámení o anketách\n- Nová tlačítka pro filtrování v záložce oznámení a smazání všech oznámení\n- Smažte a přepište své vlastní tooty\n- Nový indikátor na obrázku profilu, který ukazuje, jestli je účet robot (může být vypnut v nastavení)\n- Nové překlady: norština (bokmål) a slovinština.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Nyní můžete z Tuskyho vytvářet ankety\n- Vylepšené vyhledávání\n- Nová možnost v nastavení účtu umožňuje vždy rozbalovat varování o obsahu\n- Avatary v navigačním menu mají nyní zakulacené rohy\n- Je nyní možné nahlašovat uživatele i pokud ještě nenapsali žádný příspěvek\n- Tusky bude odteď odmítat cleartextová spojení na Androidu 6+\n- Spousta dalších malých vylepšení a oprav chyb\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/68.txt",
    "content": "Tusky v9.1\n\nToto vydání zajišťuje kompatibilitu s Mastodonem 3 a vylepšuje výkon a stabilitu.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- záložky na statusy a seznam záložek.\n- plánování tootů: Čas, který vyberete, musí být alespoň 5 minut v budoucnosti.\n- seznamy na hlavní obrazovce.\n- odesílání zvukových příloh.\n\nA spousta dalších drobných vylepšení a oprav chyb!\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- ipozornění na nové žádosti o sledování, když je váš účet uzamčen\n- nové funkce, které lze zapínat v předvolebách:\n   - swajpování mezi kartami\n   - potvrzení boostu\n   - zobrazení náhledů odkazů v časových osách\n- konverzace lze ztlumit\n- Výsledky ankety se nyní budou počítat na základě počtu hlasujících, a ne na základě celkového počtu hlasů, což usnadňuje přehlednost anket s více možnostmi volby.\n- oprava mnoha chyb, z nichž většina se týká psaní tootů\n- vylepšené překlady\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- Vylepšená hlavní obrazovka - karty lze nyní přesunout do spodní části.\n- Při ztlumení uživatele se nyní můžete také rozhodnout, zda chcete ztlumit jeho oznámení\n- Nyní můžete sledovat libovolný počet hashtagů na jedné kartě hashtagů\n- Vylepšený způsob zobrazování popisů médií, takže funguje i u superdlouhých popisů\n\nÚplný seznam změn: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- podpora poznámek k profilům (Mastodon 3.2.0)\n- podpora oznámení pro správce (Mastodon 3.1.0)\n\n- avatar vybraného účtu se nyní zobrazuje na hlavním panelu nástrojů\n- kliknutím na zobrazené jméno na časové ose se nyní otevře profilová stránka daného uživatele\n\n- mnoho oprav chyb a drobných vylepšení\n- vylepšené překlady\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- upozornění na příspěvky sledovaného uživatele - klikněte na ikonu zvonku na jeho profilu! (funkce Mastodon 3.3.0)\n- redesign funkce návrhu. Teď je rychlejší, uživatelsky přívětivější a méně chybová.\n- Byl přidán nový zen režim, který umožňuje omezit některé funkce Tusky.\n- Tusky nyní umí animovat vlastní emotikony.\n\nÚplný seznam změn: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- Žádosti o sledování se vždy zobrazují v hlavní nabídce.\n- Výběr času pro naplánování příspěvku má teď design odpovídající zbytku aplikace.\nÚplný seznam změn: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/83.txt",
    "content": "Tusky v15.1\n\nToto vydání opravuje pád při popisování obrázků\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/87.txt",
    "content": "Tusky v16.0\n\n- Logika načítání časové osy byla kompletně přepsána, aby byla rychlejší, méně chybová a jednodušší na údržbu.\n- Tusky nyní umí animovat vlastní emotikony ve formátu APNG a Animated WebP.\n- mnoho opravených chyb\n- podpora systému Android 11\n- nové překlady: skotská gaelština, galicijština, ukrajinština.\n- vylepšené překlady\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/89.txt",
    "content": "Tusky v17.0\n\n- \"Otevřít jako...\" je nyní k dispozici také v nabídce profilů účtů při použití více účtů.\n- Přihlášení je nyní zpracováváno ve webovém zobrazení v rámci aplikace\n- podpora systému Android 12\n- podpora nového API pro konfiguraci instancí Mastodon\n- a mnoho dalších drobných oprav a vylepšení\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/91.txt",
    "content": "Tusky v18.0\n\n- podpora nových typů oznámení (Mastodon 3.5)\n- Odznak bota nyní vypadá lépe a přizpůsobuje se zvolenému tématu.\n- V zobrazení detailu příspěvku lze nyní vybrat text\n- Opraveno mnoho chyb, včetně jedné, která znemožňovala přihlášení v systému Android 6 a nižším.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/94.txt",
    "content": "Tusky 19.0\n\n- podpora Unified Push: Pro aktivaci podpory se musíte znovu přihlásit ke svým účtům.\n- Počet odpovědí na příspěvek se nyní zobrazuje v časových osách.\n- Obrázky lze nyní při vytváření příspěvku oříznout.\n- U profilů se nyní zobrazuje datum jejich vytvoření.\n- Při prohlížení seznamu se nyní na panelu nástrojů zobrazuje jeho název.\n- Mnoho opravených chyb\n- Vylepšení překladů\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/97.txt",
    "content": "Tusky 20.0\n\n- Nová ikona aplikace od Dzuk https://dzuk.zone/\n- Nyní můžete sledovat hashtagy. Klikněte na hashtag a poté na ikonu v panelu nástrojů.\n- podpora systému Android 13\n- Nová rozbalovací nabídka v při psaní příspěvku, která umožňuje nastavit jazyk příspěvku.\n- Karta médií v profilech nyní respektuje citlivá média a načítá se plynuleji.\n- Před odesláním příspěvku je nyní možné nastavit bod střed zvětšení obrázku.\n- nová možnost zobrazení celého uživatelského jména v panelu nástrojů\n"
  },
  {
    "path": "fastlane/metadata/android/cs/full_description.txt",
    "content": "Tusky je odlehčený klient pro Mastodon, svobodný a otevřený server pro sociální síť.\n\n• Material Design\n• Implementována většina API Mastodonu\n• Podpora více účtů\n• Tmavý a světlý motiv s možností automatického přepínání podle denní doby\n• Koncepty – pište tooty a uložte je na později\n• Vyberte si mezi různými styly emoji\n• Optimalizováno pro obrazovky všech velikostí\n• Zcela otevřený kód – žádný nesvobodný uzavřený software jako služby Google\n\nChcete-li o Mastodonu vědět více, navštivte https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/cs/short_description.txt",
    "content": "Víceúčtový klient pro sociální síť Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/cs/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Cefnogaeth ar gyfer golygu post\n- Gosodiad newydd i ddewis y cyfeiriad darllen a ffefrir\n- Rhagluniau cyfryngau mwy a throshaen newydd i nodi cyfryngau gyda disgrifiad\n- Mae bellach yn bosibl ychwanegu cyfrifon at restrau o'u proffil\na llawer mwy\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/103.txt",
    "content": "Tusky 22.0 beta 1\n\nNodweddion sydd yn ychwanegu:\n\n- Gweld hashnodau tueddol\n- Golygu disgrifiad delweddau a phwynt ffocws\n- Dewislen \"Adnewyddu\" er mwyn hygyrchedd\n- Cefnogi hidlydd Mastodon v4\n- Dangos gwahaniaethau manwl pryd mae neges yn cael ei golwg\n- Opsiwn i ddangos ystadegau neges yn y ffrwd\n\nCywiriadau sydd yn ychwanegu:\n\n- Dangos rheolau'r chwaraewr wrth chwarae sain\n- Cyfrifo hyd y neges yn gywir\n- Cyhoeddi disgrifiad delweddau pob tro\n\nA llawer mwy\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/104.txt",
    "content": "Tusky 22.0 beta 2\n\nCywiriadau sydd yn ychwanegu:\n\n- Llwytho hysbysiadau'n gyflymach\n- Dangos 0/1/1+ ar gyfer ymatebion eto\n- Dangos teitlau hidlydd, yn lle allweddeiriau hidlydd, yn negeseuon wedi'u hidlo\n- Cywirwyd gwallau sydd yn perthyn ag y posibilrwydd agor dolen amherthynol wrth agor statws\n- Dangos botym \"Ychwanegu\" yn y lle cywir pan nad oes unrhyw hidlyddion\n- Cywirwyd chwalfa eraill\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/105.txt",
    "content": "Tusky 22.0 beta 3\n\nCywiriadau sydd yn ychwanegu:\n\n- Cywirwyd chwalfa wrth weld trywydd\n- Cywirwyd chwalfa wrth brosesu hidlydd Mastodon\n- Gallwch glicio dolennau ym mywgraffiadau hysbysiadau dilyn / ceisiadau i'ch dilyn\n- Diweddariadau Hysbysiadau Android:\n  - Dylai hysbysiad Android ar gyfer hysbysiad Mastodon yn cael ei ddangos unwaith\n  - Mae hysbysiadau Android yn cael ei grwpio gan ddull hysbysiad Mastodon (dilyn, crybwyll, hybu, ac ati)\n  - Cywirwyd posibilrwydd hysbysiadau coll\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/106.txt",
    "content": "Tusky 22.0 beta 4\n\nCywiriadau:\n\n- Cywirwyd y nôl niferus o hysbysiadau os ydy'r ap yn cael ei ffurfweddu gyda chyfrifon amryfal\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/107.txt",
    "content": "Tusky 22.0 beta 5\n\nCywiriadau:\n\n- Dychwelwyd llyfrgell APNG er mwyn cywiro emojis wedi'u hanimeiddio\n- Cadw copi lleol y marciwr hysbysiad rhag ofn dyw'r gweinydd ddim yn cefnogi'r API\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/108.txt",
    "content": "Tusky 22.0 beta 6\n\nCywiriadau:\n\n- Cadw eich safle darllen yn y tab Hysbysiadau yn amlach\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/109.txt",
    "content": "Tusky 22.0 beta 7\n\nCywiriadau:\n\n\n### Cywiriadau gwall pwysig\n\n- Wrth greu hysbysiadau Android, nôl pob hysbysiadau Mastodon dyledus\n- Byddai clicio \"Creu\" o hysbysiad yn dewis y cyfrif anghywir\n- Sicrhau mae'r \"ID hysbysiad wedi'i ddarllen yn ddiweddaraf\" yn cael ei gadw i'r cyfrif cywir\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/110.txt",
    "content": "Tusky 22.0\n\nNodweddion newydd:\n\n- Gwylio hashnodau tueddiadol\n- Dilyn hashnodau newydd\n- Gwell trefniadaeth wrth ddewis ieithoedd\n- Dangos y gwahaniaeth rhwng fersiynau o bost\n- Cefnogi hidlenni Mastodon v4\n- Opsiwn i ddangos ystadegau post yn y ffrwd\n- A mwy...\n\nGwelliannau:\n\n- Cofio'r tab a ddewiswyd a'r safle\n- Cadw'r hysbysiadau tan eu ddarllen\n- Dangos testun RTL a LTR yn gywir ym mhroffiliau\n- Cywiro cyfrifiad hyd post\n- Cyhoeddi disgrifiadau delwedd bob amser\n- A mwy...\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/111.txt",
    "content": "Tusky 23.0 beta 1\n\nNodwedd newydd:\n\n- Opsiwn newydd i newid testun y rhyngwyneb\n\nCywiriadau:\n\n- Cadw gwybodaeth cyfrif yn gywir\n- Hysbysiadau \"tynnu\" ar ddyfeisiau sydd yn defnyddio fersiwn Android <= 11\n- Gweithio o gwmpas gwall Android yn perthyn i'r gallu maes testun i \"anghofio\" y gallan nhw gopïo neu gludo\n- Fydd weld gwahaniaethau yn yr hanes golygu ddim yn mynd y tu hwnt i ymyl y sgrin\n- Fydd yr ap ddim yn chwalu os nad oes gan eich gweinydd unrhyw hanes golygu\n- Ychwanegu botwm \"Dileu\" wrth olygu hidlydd\n- Dangos emoji nad yw'n sgwâr yn gywir\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/112.txt",
    "content": "Tusky 23.0 beta 2\n\nCywiriadau:\n\n- Chwalu posibl wrth olygu meysydd proffil\n- Dewislen cyd-destun rhy fawr wrth olygu disgrifiad delweddau\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/113.txt",
    "content": "Tusky 23.0\n\nNodweddion newydd:\n\n- Opsiwn newydd i newid maint testun y rhyngwyneb\n\nCywiriadau:\n\n- Cadw gwybodaeth cyfrif yn gywir\n- Hysbysiadau \"tynnu\" ar ddyfeisiau sydd yn defnyddio fersiwn Android <= 11\n- Gwall Android lle gall maes testun yn \"anghofio\" y gallan nhw gopïo neu gludo\n- Fydd weld newidiadau yn yr hanes golygu ddim yn mynd y tu hwnt i ymyl y sgrin\n- Fydd yr ap ddim yn chwalu os nad oes gan eich gweinydd unrhyw hanes golygu\n- Dangos emoji nad yw'n sgwâr yn gywir\n- Chwalu posibl wrth olygu meysydd proffil\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/115.txt",
    "content": "Tusky 24.0\n\n- Mae dyfyniadau bloc a blociau cod mewn negeseuon yn edrych yn well.\n- Mae'r hen ymarweddiad y tab hysbysiadau wedi'i adfer.\n- Mae bathodynnau rôl nawr yn cael eu dangos ar broffiliau.\n- Mae'r chwaraewr fideo wedi'i wella. Nawr galli di ddewis cyflymder chwarae.\n- Mae opsiwn newydd i ddefnyddio'r thema ddu wrth ddilyn thema'r system.\n- Mae golygfa newydd i weld negeseuon tueddiadol ar gael yn y ddewislen ac fel tab a gwsmereiddiwyd.\n\nA llawer mwy o welliannau a datrysiadau!\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/117.txt",
    "content": "Tusky 24.1\n\n- Bydd y sgrin yn aros ymlaen eto tra bod fideo yn chwarae.\n- Mae gollwng cof wedi cael ei gyweirio. Dylai hyn yn gwella sefydlogrwydd a pherfformiad.\n- Mae emojis nawr yn cael ei rhifo'n gywir fel 1 nod wrth greu neges.\n- Wedi cyweirio chwalfa pan ddetholwyd testun ar rai dyfeisiau.\n- Bydd yr eiconau yn nhestunau help ffrydiau gwag yn cael eu halinio yn gywir bob tro.\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/119.txt",
    "content": "Tusky 25\n\n- Cynnal API cyfieithu Mastodon\n- Dangos iaith y neges\n- Gwella trawsnewidiadau'r sgrin\n- Mae gosodiadau hidlo wedi cael eu symud i osodiadau'r cyfrif\n- Mae ystadegau'r neges bob amser yn dangos yn yr un lle\n- Llawer o wella wedi'u cudd\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/123.txt",
    "content": "Tusky 26\n\n- Mae'r prif liw glas wedi cael ei newid er mwyn gwella'r cyferbyniad\n- Mae cynnwys y tab hysbysiadau yn cael ei gadw yn y cof dros dro er mwyn gwella'r ap pan nad yw ar-lein\n- Mae gosodiad cyfrif newydd \"preifatrwydd rhagosodedig ymatebion\"\n- Mae llawer o gywiriadau cudd eraill: gwelwch https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md am y log newid cyflawn\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/124.txt",
    "content": "Tusky 26.1\n\n- Mae gan osodiad y cyfrif \"Preifatrwydd ymateb\" dau ddewis ychwanegol: \"Cydweddu â phreifatrwydd rhagosodedig negeseuon\", ac \"Uniongyrchol\".\n- Mae Tusky yn cynnwys ISRG root certificates, er mwyn gweithio gydag Android 7 a gweinyddion sydd yn defnyddio Let's Encrypt.\n- Wedi cyweirio byg am gymysgu hysbysiadau a ffrydiau rhwng cyfrifon.\nGweler https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md i ddarllen y log newid llawn\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/127.txt",
    "content": "Tusky 27.0\n\n- Mae Tusky wedi cael dylunio yn ôl Material 3\n- Mae Tusky yn gweithio gyda Notification Policies (nodwedd Mastodon 4.3)\n- Mae hashnodau ar ddiwedd negeseuon yn cael eu dangos mewn bar eu hunain - Mae Tusky yn gweithio gyda dyfeisiau plygu\n\nGweler https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md i ddarllen y log newid llawn\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/131.txt",
    "content": "Tusky 28.0\n\n- Cefnogaeth i Android 15 a modd ymyl-i-ymyl\n- Yn gwella dibynadwyaeth hysbysiadau gwthio\n- Mae atebion yn yr amserlen bellach wedi'u nodi'n glir\n- Sawl gwelliant i sut mae hysbysiadau'n cael eu rhoi yn y tab hysbysiadau\n- Cafodd Link Preview Cards ddyluniad newydd ac maent bellach yn cefnogi'r nodwedd fediverse:creator\n\nGweler https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md am y log newid llawn\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Mae hidlwyr ffrwd wedi symud i ddewisiadau'ch cyfrif a byddant yn cysoni â'r gweinydd\n- Nawr gallwch chi gael hashnod wedi'i deilwra fel tab yn y prif ryngwyneb\n- Bellach gellir golygu rhestrau\n- Diogelwch: dileu cefnogaeth ar gyfer TLS 1.0 a TLS 1.1, ac ychwanegu cefnogaeth i TLS 1.3 ar Android 6+\n- Bydd yr olygfa gyfansoddi nawr yn awgrymu emojis personol wrth ddechrau teipio\n- Gosodiad thema newydd \"dilyn thema system\"\n- Gwell hygyrchedd y ffrwd\n- Bydd Tusky nawr yn anwybyddu hysbysiadau anhysbys ac ni fyddant yn chwalu mwyach\n- Lleoliad newydd: Nawr gallwch chi ddiystyru iaith y system a gosod iaith wahanol yn Tusky\n- Cyfieithiadau newydd: Tsieceg ac Esperanto\n- Llawer o welliannau ac atebion eraill\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Cefnogaeth ar gyfer arddangos polau, pleidleisio a hysbysiadau pleidleisio\n- Botymau newydd i hidlo'r tab hysbysu ac i ddileu pob hysbysiad\n- dileu ac ailddrafftio eich tŵtiau eich hun\n- dangosydd newydd sy'n dangos a yw cyfrif yn bot ar y ddelwedd proffil (gellir ei ddiffodd yn y dewisiadau)\n- Cyfieithiadau newydd: Norwyeg Bokmål a Slofeneg.\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Gallwch nawr greu Polau o Tusky\n- Gwell chwiliad\n- Opsiwn newydd yn dewisiadau'ch cyfrif i ehangu rhybuddion cynnwys bob amser\n- Mae gan avatars yn y drôr llywio siâp sgwâr crwn bellach\n- Mae bellach yn bosibl adrodd defnyddwyr hyd yn oed pan nad ydynt byth yn postio statws\n- Bydd Tusky nawr yn gwrthod cysylltu dros gysylltiadau clir-destun ar Android 6+\n- Llawer o welliannau bach eraill ac atgyweiriadau i fygiau\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/68.txt",
    "content": "Tusky v9.1\n\nMae'r datganiad hwn yn sicrhau cydnawsedd â Mastodon 3 ac yn gwella perfformiad a sefydlogrwydd.\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Gallwch nawr nodi statws tudalen a rhestru'ch nodau tudalen yn Tusky.\n- Gallwch nawr amserlennu toots gyda Thusky. Sylwch fod yn rhaid i'r amser a ddewiswch fod o leiaf 5 munud yn y dyfodol.\n- Gallwch nawr ychwanegu rhestrau at y brif sgrin.\n- Gallwch nawr bostio atodiadau sain gyda Tusky.\n\nA llawer o welliannau bach eraill ac atgyweiriadau bygiau!\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- Hysbysiadau am geisiadau dilynol newydd pan fydd eich cyfrif wedi'i gloi\n- Nodweddion newydd y gellir eu toglo ar y sgrin Dewisiadau:\n    - analluogi llithro rhwng tabiau\n    - dangos ymgom cadarnhau cyn rhoi hwb i dant\n    - dangos rhagolygon cyswllt mewn llinellau amser\n- Bellach gellir tawelu sgyrsiau\n- Bydd canlyniadau pleidleisio nawr yn cael eu cyfrifo ar sail nifer y pleidleiswyr ac nid ar gyfanswm y pleidleisiau sy'n gwneud polau amlddewis yn haws i'w deall\n- Llawer o atgyweiriadau, y rhan fwyaf ohonynt yn ymwneud â chyfansoddi toots\n- Gwell cyfieithiadau\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- Gwell prif ryngwyneb - gallwch nawr symud y tabiau i'r gwaelod\n- Wrth tewi defnyddiwr, gallwch nawr hefyd benderfynu a ydych am tewi eu hysbysiadau\n- Gallwch nawr ddilyn cymaint o hashnodau ag y dymunwch mewn un tab hashnod unigol\n- Gwella'r ffordd y mae disgrifiadau cyfryngau yn cael eu harddangos fel ei fod yn gweithio hyd yn oed ar gyfer disgrifiadau hir iawn\n    \nLog newid llawn: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- cefnogaeth ar gyfer nodiadau proffil (nodwedd o Mastodon 3.2.0)\n- cefnogaeth ar gyfer cyhoeddiadau gweinyddol (nodwedd o Mastodon 3.1.0)\n\n- bydd avatar y cyfrif a ddewiswyd gennych nawr yn cael ei ddangos yn y prif far offer\n- bydd clicio ar yr enw arddangos mewn llinell amser nawr yn agor tudalen proffil y defnyddiwr hwnnw\n\n- llawer o atgyweiriadau i fygiau a mân welliannau\n- gwell cyfieithiadau\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Cael gwybod pan fydd defnyddiwr a ddilynir yn postio - cliciwch ar eicon y gloch ar eu proffil! (Nodwedd o Mastodon 3.3.0)\n- Mae'r nodwedd ddrafft yn Tusky wedi'i hailgynllunio'n llwyr i fod yn gyflymach, yn haws ei defnyddio ac yn llai ddrwg.\n- Mae modd lles newydd sy'n eich galluogi i gyfyngu ar rai nodweddion Tusky wedi'i ychwanegu.\n- Gall Tusky nawr animeiddio emojis personol.\nLog newid llawn: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- Mae ceisiadau dilyn bellach bob amser yn cael eu dangos yn y brif ddewislen.\n- Mae gan y dewisiad amser ar gyfer amserlennu post ddyluniad sy'n gyson â gweddill yr app nawr\nLog newid llawn: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/83.txt",
    "content": "Tusky v15.1\n\nMae'r datganiad hwn yn trwsio damwain wrth roi capsiwn ar ddelweddau\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/87.txt",
    "content": "Tusky v16.0\n\n- Mae'r rhesymeg llwytho llinell amser wedi'i hailysgrifennu'n llwyr er mwyn bod yn gyflymach, yn llai ddrwg ac yn haws ei chynnal.\n- Gall Tusky nawr animeiddio emojis wedi'u teilwra ar fformat APNG a WebP wedi'i hanimeiddio.\n- Llawer o atgyweiriadau\n- Cefnogaeth i Android 11\n- Cyfieithiadau newydd: Gaeleg yr Alban, Galiseg, Wcreineg\n- Gwell cyfieithiadau\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/89.txt",
    "content": "Tusky v17.0\n\n- Mae \"Ar agor fel ...\" hefyd ar gael yn y ddewislen ar broffiliau cyfrifon wrth ddefnyddio cyfrifon lluosog\n- Mae mewngofnodi bellach yn cael ei drin mewn WebView o fewn yr ap\n- Cefnogaeth i Android 12\n- cefnogaeth i'r API cyfluniad enghraifft Mastodon newydd\n- a llawer o atebion a gwelliannau bach eraill\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/91.txt",
    "content": "Tusky v18.0\n\n- Cefnogaeth ar gyfer mathau newydd o hysbysiadau Mastodon 3.5\n- Mae'r bathodyn bot bellach yn edrych yn well ac yn addasu i'r thema a ddewiswyd\n- Bellach gellir dewis testun ar olwg manylion y post\n- Trwsio llawer o fygiau, gan gynnwys un a oedd yn atal mewngofnodi ar Android 6 ac yn is\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/94.txt",
    "content": "Tusky 19.0\n\n- Cefnogaeth i Unified Push. I actifadu'r gefnogaeth bydd yn rhaid i chi ail-fewngofnodi i'ch cyfrifon.\n- Mae nifer yr ymatebion i swydd bellach wedi'i nodi mewn llinellau amser.\n- Bellach gellir tocio delweddau wrth gyfansoddi post.\n- Mae proffiliau bellach yn dangos y dyddiad y cawsant eu creu.\n- Wrth edrych ar restr mae'r teitl nawr yn cael ei arddangos yn y bar offer.\n- Llawer o atgyweiriadau byg\n- Gwelliannau cyfieithu\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/97.txt",
    "content": "Tusky 20.0\n\n- Eicon Ap Newydd gan Dzuk https://dzuk.zone/\n- Gallwch nawr ddilyn hashnodau. Cliciwch ar hashnod ac yna ar yr eicon yn y bar offer.\n- Cefnogaeth i Android 13\n- cwymplen newydd yn y golwg cyfansoddi i osod iaith post\n- Mae'r tab cyfryngau mewn proffiliau bellach yn parchu cyfryngau sensitif ac yn llwytho'n llyfnach.\n- Mae bellach yn bosibl gosod pwynt ffocws delwedd cyn ei hanfon y post\n- Opsiwn newydd i ddangos eich enw defnyddiwr llawn yn y bar offer\n"
  },
  {
    "path": "fastlane/metadata/android/cy/full_description.txt",
    "content": "Mae Tusky yn gleient ysgafn i Mastodon, gweinydd rhwydwaith cymdeithasol cod-agored am ddim.\n\n• Material Design\n• Gweithredwyd y rhan fwyaf o API Mastodon\n• Cefnogaeth i gyfrifon lluosog\n• Thema dywyll a golau gyda'r posibilrwydd newid yn awtomatig ar sail amser y dydd\n• Drafftiau - cyfansoddi negeseuon a'u cadw yn nes ymlaen\n• Dewis rhwng arddulliau emoji gwahanol\n• Wedi'i optimeiddio ar gyfer pob maint sgrin\n• Hollol cod-agored - dim dibyniaethau nad ydynt yn agored, fel gwasanaethau Google\n\nEr mwyn dysgu mwy am Mastodon, ewch i https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/cy/short_description.txt",
    "content": "Cleient amlgyfrif ar gyfer y rhwydwaith cymdeithasol Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/cy/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Beiträge können nun bearbeitet werden\n- Neue Einstellungen für die bevorzugte Leserichtung\n- Größere Medienvorschauen und ein neuer Hinweis, dass Medien eine Beschreibung haben\n- Konten können nun direkt von der Profilansicht zu Listen hinzugefügt werden\nund viele weitere Verbesserungen\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/103.txt",
    "content": "Tusky 22.0 Beta 1\n\nNeue Funktionen:\n- Sieh dir angesagte Hashtags an\n- Bearbeite Bildbeschreibungen und Fokuspunkte\n- »Aktualisieren«-Menü für Barrierefreiheit\n- Filter aus Mastodon V4 werden unterstützt\n- Detaillierte Unterschiede beim Bearbeiten eines Beitrags\n- Option zum Anzeigen von Beitragsstatistiken in der Timeline\n\nBehobene Fehler:\n- Anzeigen von Bedienelemente bei der Audiowiedergabe\n- Korrekte Berechnung der Beitragslänge\n- Bildbeschreibungen werden immer veröffentlicht\n\nund mehr\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/104.txt",
    "content": "Tusky 22.0 Beta 2\n\nBehobene Fehler:\n- Ladegeschwindigkeit von Benachrichtigungen verbessert\n- 0/1/1+ werden bei Antworten wieder angezeigt\n- Bei gefilterten Beiträgen Filtertitel anstatt Filterschlagwörter anzeigen\n- Öffnen eines Beitrags öffnet keinen nicht zugehörigen Link mehr\n- »Hinzufügen« wird nun korrekt angezeigt, wenn keine Filter vorhanden sind\n- Diverse Abstürze behoben\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/105.txt",
    "content": "Tusky 22.0 Beta 3\n\nBehobene Fehler:\n- Abstürze beim Ansehen eines Threads und beim Verarbeiten von Mastodonfiltern behoben\n- Links in »Über mich« bei Benachrichtigungen für Follower-Anfragen sind anklickbar\n- Aktualisierte Android-Benachrichtigungen:\n  - Mastodon-Benachrichtigungen sollten nur noch einmal angezeigt werden\n  - Werden anhand des Typs von Mastodon-Benachrichtigungen gruppiert (Beitrag geteilt, erwähnt, usw.)\n  - Möglichkeit, Benachrichtigungen zu verpassen, wurde beseitigt\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/106.txt",
    "content": "Tusky 22.0 Beta 4\n\nBehobener Fehler:\n- Wiederholtes Abrufen von Benachrichtigungen bei Konfiguration mit mehreren Konten behoben\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/107.txt",
    "content": "Tusky 22.0 Beta 5\n\nBehobene Fehler:\n- »APNG library« auf eine ältere Version zurückgestuft, damit animierte Emojis wieder animiert sind\n- Eine Kopie der Benachrichtigungsmarkierung wird lokal gespeichert, falls der Server die entsprechende API nicht unterstützt\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/108.txt",
    "content": "Tusky 22.0 Beta 6\n\nBehobener Fehler:\n- Leseposition wird im Tab »Benachrichtigung« häufiger gespeichert\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/109.txt",
    "content": "Tusky 22.0 Beta 7\n\nBehobene Fehler:\n- Alle ausstehenden Mastodon-Benachrichtigungen werden nun beim Erstellen von Android-Benachrichtigungen abgerufen\n- Beim Anlicken auf »Beitrag erstellen« in einer Benachrichtigung wurde das falsche Konto ausgewählt\n- Die »ID der zuletzt gelesenen Benachrichtigung« wird nun im richtigen Konto gespeichert\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/110.txt",
    "content": "Tusky 22.0\n\nNeu:\n- Sieh dir angesagte Hashtags an\n- Bessere Sortierung bei der Sprachauswahl\n- Unterschiede zwischen den Versionen eines Beitrags ansehen\n- Unterstützung für Filter aus Mastodon V4\n- Option zum Anzeigen von Beitragsstatistiken in der Timeline\n- Und mehr …\n\nBehobene Fehler:\n- Ausgewählter Tab und Position wird gespeichert\n- Benachrichtigungen bleiben bis zum Lesen erhalten\n- Korrekte Berechnung der Beitragslänge\n- Bildbeschreibungen werden immer veröffentlicht\n- Und mehr …\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/111.txt",
    "content": "Tusky 23.0 Beta 1\n\nNeue Funktionen:\n- Skalierung des Oberflächentextes\n\nBehoben:\n- Kontoinformationen werden korrekt gespeichert\n- »Herunterziehen«-Benachrichtigungen für Android-Geräte mit Version <= 11\n- Android-Fehler, bei dem ein Textfeld das Kopieren/Einfügen „vergessen“ konnte\n- Absturz behoben, wenn der Server keinen Beitragsbearbeitungsverlauf hat\n- »Löschen«-Schaltfläche beim Bearbeiten eines Filters hinzugefügt\n- Nicht-quadratische Emojis werden korrekt dargestellt\n- und mehr\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/112.txt",
    "content": "Tusky 23.0 Beta 2\n\nBehoben:\n- möglicher Absturz beim Ändern von Zusatzfeldern im Profil\n- überdimensioniertes Kontextmenü, wenn die Bildbeschreibung bearbeitet wird\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/113.txt",
    "content": "Tusky 23.0\n\nNeue Funktionen:\n- Skalierung des Oberflächentextes\n\nBehoben:\n- Kontoinformationen werden korrekt gespeichert\n- »Herunterziehen«-Benachrichtigungen für Android-Geräte mit Version <= 11\n- Android-Fehler, bei dem ein Textfeld das Kopieren/Einfügen „vergessen“ konnte\n- Absturz behoben, wenn der Server keinen Beitragsbearbeitungsverlauf hat\n- »Löschen«-Schaltfläche beim Bearbeiten eines Filters hinzugefügt\n- Nicht-quadratische Emojis werden korrekt dargestellt\n- und mehr\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/115.txt",
    "content": "Tusky 24.0\n\n- Blockzitate und Code-Blocks sehen ansprechender aus\n- Alte Verhaltensweise vom Tab »Benachrichtigungen« wurde wiederhergestellt\n- Abzeichen sind auf Profilen sichtbar\n- Beim Videoplayer kann nun die Wiedergabegeschwindigkeit geändert werden\n- Neue Design-Einstellung, um das schwarze Design zu verwenden, wenn das System-Design ausgewählt ist\n- Neue Ansicht für beliebte Beiträge im Menü und benutzerdefinierten Tabs verfügbar\n- Viele weitere Verbesserungen und Fehlerbehebungen!\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/117.txt",
    "content": "Tusky 24.1\n- Bildschirm schaltet sich beim Anschauen eines Videos nicht mehr aus.\n- Ein Memory Leak wurde behoben. Dies sollte die Stabilität und Leistung verbessern.\n- Emojis werden jetzt korrekt als 1 Zeichen gezählt, wenn ein Beitrag verfasst wird.\n- Absturz auf einigen Geräten bei der Textauswahl behoben.\n- Symbole in den Hilfetexten von leeren Timelines werden nun immer korrekt ausgerichtet.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/119.txt",
    "content": "Tusky 25\n- Unterstützung für die Mastodon-Übersetzungs-API\n- Sichtbarkeit der Beitragssprache\n- Bildschirmübergänge verbessert\n- Filter-Einstellungen in die Konto-Einstellungen verschoben\n- Beitragsstatistiken haben eine feste Position\n- Eine Menge Stabilitäts- und Leistungsverbesserungen\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/123.txt",
    "content": "Tusky 26\n\n- Die blaue Primärfarbe wurde für einen besseren Kontrast leicht angepasst\n- Die Inhalte im Tab »Benachrichtigungen« werden jetzt im Cache gespeichert, um das Offline-Verhalten zu verbessern\n- Neue Einstellung: Standard-Antwortsichtbarkeit\n- Viele Stabilitäts- und Leistungsverbesserungen\nSieh dir https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md für alle Änderungen an.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/124.txt",
    "content": "Tusky 26.1\n\n- 2 neue Einstellungen für die »Antwortsichtbarkeit«: »Von Standard-Beitragssichtbarkeit übernehmen« und »Direkt«.\n- Tusky enthält ISRG-Root-Zertifikate, um auf Geräten mit Android 7 und Servern, die Let's Encrypt verwenden, zu funktionieren.\n- Tusky vermischt nicht länger Timelines und/oder Benachrichtigungen mit anderen Konten.\n\nAlle Änderungen sind auf https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md einsehbar (nur Englisch)\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/127.txt",
    "content": "Tusky 27.0\n- Tusky orientiert sich jetzt an das Material-3-Design\n- Unterstützung für Benachrichtigungsrichtlinien (Funktion aus Mastodon 4.3)\n- Hashtags am Ende eines Beitrags werden jetzt in einer extra Zeile angezeigt\n- Vollständige Unterstützung für faltbare Geräte\n\nAlle Änderungen sind auf https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md einsehbar (nur Englisch)\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/131.txt",
    "content": "Tusky 28.0\n\n- Unterstüzung für Android 15 und Edge-to-Edge\n- Zuverlässigkeit von Push-Benachrichtigungen verbessert\n- Antworten sind in der Timeline jetzt als solche gekennzeichnet\n- Mehrere Verbesserungen bei der Darstellung von Benachrichtigungen im entsprechenden Tab\n- Neues Design für die Linkvorschau, um die Funktion von fediverse:creator zu unterstützen\n\nAlle Änderungen sind auf https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md einsehbar (nur Englisch)\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Timeline-Filter in Kontoeinstellungen verschoben; werden mit dem Server synchronisiert\n- Eigener Tab für Hashtags\n- Listen sind nun bearbeitbar\n- TLS 1.0 und 1.1 entfernt, 1.3 für Android 6+ hinzugefügt\n- Automatische Emoji-Vorschläge beim Tippen\n- „Systemdesign verwenden“ hinzugefügt\n- Verbesserte Barrierefreiheit\n- Tusky ignoriert nun unbekannte Benachrichtigungen\n- Neue Einstellung: Individuelle App-Sprache\n- Neue Sprachen: Tschechisch und Esperanto\n- Fehlerkorrekturen\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Unterstützung für das Anzeigen von Umfragen, Abstimmungen und Umfragebenachrichtigungen\n- Neue Schaltflächen, um den Benachrichtigungstab zu filtern und alle Benachrichtigungen zu löschen\n- Lösche & erstelle deine Beiträge neu\n- Es wird auf dem Profilbild angezeigt, ob es sich bei einem Konto um einen Bot handelt (kann in den Einstellungen ausgeschaltet werden)\n- Neue Übersetzungen: Norwegisch Bokmål und Slovenisch.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Du kannst jetzt Umfragen erstellen\n- Die Suche wurde verbessert\n- Neue Option in den Profileinstellungen, um Inhaltswarnungen immer auszuklappen\n- Profilbilder im Hauptmenü haben jetzt abgerundete Ecken\n- Es ist jetzt möglich, Profile ohne Beiträge zu melden\n- Tusky wird auf Android 6+ nur noch sichere Netzwerkverbindungen nutzen\n- Viele andere kleine Verbesserungen und Fehlerkorrekturen\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/68.txt",
    "content": "Tusky v9.1\n\nDiese Veröffentlichung stellt die Kompatibilität mit Mastodon 3 sicher und verbessert die Geschwindigkeit und Stabilität der App.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Du kannst jetzt Lesezeichen hinzufügen und ansehen\n- Du kannst jetzt Beiträge vorausplanen. Achtung, der geplante Zeitpunkt muss mindestens 5 Minuten in der Zukunft liegen!\n- Du kannst jetzt Listen auf dem Hauptbildschirm anzeigen.\n- Du kannst jetzt Audio-Anhänge versenden.\n\nUnd viele andere Verbesserungen und Fehlerkorrekturen!\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- Benachrichtigungen über neue Follower-Anfragen, wenn das Konto privat ist\n- Neue Funktionen, die aktiviert werden können:\n   - Wischgeste zum Wechseln zwischen Tabs\n   - Bestätigung vor dem Teilen eines Beitrags\n   - Linkvorschauen in Timelines\n- Konversationen können jetzt stummgeschaltet werden\n- Umfrageergebnisse für Umfragen mit Mehrfachauswahl sind jetzt einfacher zu verstehen\n- Viele Fehlerkorrekturen, primär beim Verfassen von Beiträgen\n- Verbesserte Übersetzungen\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- Verbessertes Interface — die Hauptnavigation kann jetzt auch unten angezeigt werden\n- Entscheide beim Stummschalten eines Profils, ob du Benachrichtigungen stummschalten willst\n- Es ist jetzt möglich, beliebig vielen Hashtags in einem Hashtag-Tab zu folgen\n- Verbesserte Bildbeschreibungen, vorallem bei langen Texten\n\nAlle Änderungen: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- Unterstützung für Profilnotizen (Mastodon 3.2.0 Funktion)\n- Unterstützung für Ankündigungen von Admins (Mastodon 3.1.0 Funktion)\n\n- Das Profilbild des ausgewählten Kontos wird nun in der Hauptnavigation angezeigt\n- Ein Klick auf den Anzeigenamen in einer Timeline öffnet nun die Profilseite des jeweiligen Profils\n\n- Viele Fehlerkorrekturen und kleine Verbesserungen\n- Verbesserte Übersetzungen\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Werde über neue Beiträge benachrichtigt — Klicke auf das Glockensymbol in Profilen! (Funktion von Mastodon 3.3.0)\n- Die Entwurfsfunktion in Tusky wurde vollständig neu gestaltet, um schneller, nutzerfreundlicher und weniger fehleranfällig zu sein.\n- Ein neuer Wohlbefinden-Modus, der dir erlaubt, bestimmte Funktionen von Tusky zu beschränken, wurde hinzugefügt.\n- Tusky kann jetzt animierte Emojis darstellen.\nAlle Änderungen: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- Follower-Anfragen werden jetzt immer im Menü angezeigt\n- Der Zeitauswahldialog beim Planen eines Beitrags hat jetzt ein besseres Design\nAlle Änderungen: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/83.txt",
    "content": "Tusky v15.1\n\nDiese Veröffentlichung behebt einen Absturz bei der Eingabe einer Bildbeschreibung\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/87.txt",
    "content": "Tusky v16.0\n\n- Die Logik des Ladens der Timeline wurde komplett neu geschrieben, um schneller, weniger fehlerhaft und wartungsfreundlicher zu sein.\n- Tusky kann nun benutzerdefinierte Emojis im APNG- & Animated-WebP-Format darstellen.\n- Viele Fehlerbehebungen\n- Unterstützung von Android 11\n- Neue Übersetzungen: Schottisches Gälisch, Galicisch, Ukrainisch\n- Verbesserte Übersetzungen\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/89.txt",
    "content": "Tusky v17.0\n\n- „Als %s öffnen“ ist jetzt auch im Menü der Kontoprofile verfügbar, wenn mehrere Konten verwendet werden\n- Die Anmeldung erfolgt nun über WebView innerhalb der App\n- Unterstützung für Android 12\n- Unterstützung für die neue „Mastodon instance configuration API“\n- und einige andere kleine Fehlerbehebungen und Verbesserungen\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/91.txt",
    "content": "Tusky v18.0\n\n- Unterstützung für neue Benachrichtigungstypen aus Mastodon 3.5\n- Das Bot-Symbol sieht jetzt besser aus und passt sich dem gewählten App-Design an\n- Der Text in den Beitragsdetails kann jetzt ausgewählt werden\n- Viele Fehler behoben, inklusive einem, der Anmeldungen auf Android 6 und älter verhindert hat\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/94.txt",
    "content": "Tusky 19.0\n\n- Push-Benachrichtigungen via Unified Push. Um Unified Push zu verwenden, musst du dich erneut anmelden.\n- Die Anzahl an Antworten unter einem Beitrag wird jetzt in der Timeline angezeigt.\n- Bilder können jetzt vor dem Veröffentlichen zugeschnitten werden.\n- Das Erstellungsdatum eines Profils wird jetzt angezeigt.\n- Beim Betrachten einer Liste ist jetzt der Listenname ersichtlich.\n- Fehlerbehebungen\n- verbesserte Übersetzungen\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/97.txt",
    "content": "Tusky 20.0\n\n- Neues Appsymbol von Dzuk https://dzuk.zone\n- Du kannst Hashtags folgen. Tippe auf einen Hashtag und dann auf das Symbol in der Hauptnavigation\n- Unterstützung für Android 13\n- Neues Auswahlmenü zum Festlegen der Beitragssprache\n- Der Medien-Tab in Profilen respektiert nun Mediendateien mit Inhaltswarnung und lädt schneller\n- Es ist nun möglich, den Fokuspunkt eines Bildes vor der Veröffentlichung festzulegen\n- Der vollständige Profilname kann nun in der Hauptleiste angezeigt werden\n"
  },
  {
    "path": "fastlane/metadata/android/de/full_description.txt",
    "content": "Tusky ist ein kompakter Client für Mastodon, ein freier und quelloffener Server für soziales Netzwerken.\n\n• Material Design\n• Fast alle Mastodon-APIs implementiert\n• Unterstützung mehrerer Konten\n• Dunkles und helles Design mit der Möglichkeit, es automatisch je nach Tageszeit wechseln zu lassen\n• Entwürfe — schreibe Beiträge und speichere sie für später\n• Auswahl zwischen verschiedenen Emoji-Stilen\n• Optimiert für alle Bildschirmgrößen\n• Komplett quelloffenen - keine unfreien Abhängigkeiten z. B. von Google-Diensten\n\nUm mehr über Mastodon zu erfahren, besuche https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/de/short_description.txt",
    "content": "Ein Client für das soziale Netzwerk Mastodon, der mehrere Konten unterstützt\n"
  },
  {
    "path": "fastlane/metadata/android/de/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Υποστήριξη για επεξεργασία αναρτήσεων\n- Νέες ρυθμίσεις για έλεγχο των προτιμητέων διευθύνσεων ανάγνωσης\n- Προεπισκόπηση μεγαλύτερων πολυμέσων και νέα εμφάνιση για την αναγνώριση των πολυμέσων με περιγραφή\n- Πλέον είναι δυνατή η εισαγωγή λογαριασμών σε λίστες από τα προφιλ τους\nκαι πολλά περισσότερα\n"
  },
  {
    "path": "fastlane/metadata/android/el/full_description.txt",
    "content": "Το Tusky είνια μια ελαφριά εφαρμογή για το Mastodon, ένα δωρεάν και ανοικτού κώδικα διακομιστή κοινωνικού δικτύου.\n\n• Material Design\n• Τα περισσότερα API του Mastodon είναι προσβάσιμα\n• Υποστήριξη πολλαπλών λογαριασμών\n• Σκούρο και φωτεινό θέμα με δυνατότητα αυτόματης εναλλαγής ανάλογα την ώρα της ημέρας\n• Πρόχειρα - γράψτε toots και αποθηκεύστε τα για αργότερα\n• Επιλέξτε μεταξύ διαφορετικών στιλ emoji\n• Προσαρμόζεται σε όλα τα μεγέθη οθόνης\n• Απόλυτα ανοικτού-κώδια - χωρίς μη-ελεύθερες εξαρτήσεις όπως υπηρεσίες της Google\n\nΓια να μάθαιτε περισσότερα για το Mastodon, επισκεφτείτε το https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/el/short_description.txt",
    "content": "Μια εφαρμογή πολλαπλών λογαριασμών του κοινωνικού δικτύου Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/el/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Support for post editing\n- New setting to control preferred reading direction\n- Larger media previews and a new overlay to indicate media with description\n- It is now possible to add accounts to lists from their profile\nand much more"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/103.txt",
    "content": "Tusky 22.0 beta 1\n\nFeatures including:\n\n- View trending hashtags\n- Edit image descriptions and focus point\n- \"Refresh\" menu for accessibility\n- Support Mastodon v4 filters\n- Show detailed differences when a post is edited\n- Option to show post statistics in the timeline\n\nFixes including:\n\n- Show player controls during audio playback\n- Correct post length calculation\n- Always publish image captions\n\nand much more\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/104.txt",
    "content": "Tusky 22.0 beta 2\n\nFixes including:\n\n- Improved notification loading speed\n- Restore showing 0/1/1+ for replies\n- Show filter titles, not filter keywords, on filtered posts\n- Fixed a bug where opening a status could open an unrelated link\n- Show \"Add\" button in correct place when there are no filters\n- Fixed assorted crashes\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/105.txt",
    "content": "Tusky 22.0 beta 3\n\nFixes including:\n\n- Fixed crash when viewing a thread\n- Fixed crash processing Mastodon filters\n- Links in bios of follow/follow request notifications are clickable\n- Android Notifications updates\n  - Android notification for a Mastodon notification should only be shown once\n  - Android notifications are grouped by Mastodon notification type (follow, mention, boost, etc)\n  - Potential for missing notifications has been removed\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/106.txt",
    "content": "Tusky 22.0 beta 4\n\nFixes:\n\n- Fixed repeated fetch of notifications if configured with multiple accounts\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/107.txt",
    "content": "Tusky 22.0 beta 5\n\nFixes:\n\n- Rolled back APNG library to fix broken animated emojis\n- Save local copy of notification marker in case server does not support the API\n\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/108.txt",
    "content": "Tusky 22.0 beta 6\n\nFixes:\n\n- Save reading position in the Notifications tab more frequently\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/109.txt",
    "content": "Tusky 22.0 beta 7\n\nFixes:\n\n\n### Significant bug fixes\n\n- Fetch all outstanding Mastodon notifications when creating Android notifications\n- Clicking \"Compose\" from a notification would set the wrong account\n- Ensure \"last read notification ID\" is saved to the correct account\n\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/110.txt",
    "content": "Tusky 22.0\n\nNew features:\n\n- View trending hashtags\n- Follow new hashtags\n- Better ordering when selecting languages\n- Show the difference between versions of a post\n- Support Mastodon v4 filters\n- Option to show post statistics in the timeline\n- And more...\n\nFixes:\n\n- Remember selected tab and position\n- Keep notifications until read\n- Correctly display mixed RTL and LTR text in profiles\n- Correct post length calculation\n- Always publish image captions\n- And more...\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/111.txt",
    "content": "Tusky 23.0 beta 1\n\nNew features:\n\n- New preference to scale UI text\n\nFixes:\n\n- Save account information correctly\n- \"pull\" notifications on devices running Android versions <= 11\n- Work around Android bug where text fields could \"forget\" they can copy/paste\n- Viewing \"diffs\" in edit history will not extend off screen edge\n- Don't crash if your server has no post edit history\n- Add a \"Delete\" button when editing a filter\n- Show non-square emoji correctly\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/112.txt",
    "content": "Tusky 23.0 beta 2\n\nFixes:\n\n- Potential crash when editing profile fields\n- Oversized context menu when editing image descriptions\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/113.txt",
    "content": "Tusky 23.0\n\nNew features:\n\n- New preference to scale UI text\n\nFixes:\n\n- Save account information correctly\n- \"pull\" notifications on devices running Android versions <= 11\n- Android bug where text fields could \"forget\" they can copy/paste\n- Viewing changes in edit history will not extend off screen edge\n- Don't crash if your server has no post edit history\n- Show non-square emoji correctly\n- Potential crash when editing profile fields\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/115.txt",
    "content": "Tusky 24.0\n\n- Blockquotes and code blocks in posts now look nicer.\n- The old behavior of the notification tab has been restored.\n- Role badges are now shown on profiles.\n- The video player has been improved. You can now select the playback speed.\n- New theme option to use the black theme when following the system design.\n- A new view to see trending posts is available both in the menu and as custom tab.\n\nAnd a lot of other improvements and fixes!\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/117.txt",
    "content": "Tusky 24.1\n\n- The screen will stay on again while a video is playing.\n- A memory leak has been fixed. This should improve stability and performance.\n- Emojis are now correctly counted as 1 character when composing a post.\n- Fixed a crash when text was selected on some devices.\n- The icons in the help texts of empty timelines will now always be correctly aligned.\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/119.txt",
    "content": "Tusky 25\n\n- Support Mastodon translation API\n- Show post language\n- Improved screen transitions\n- Filter settings are moved to account preferences\n- Post stats now have stable position\n- A lot off under-the-hood stability & performance improvements\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/123.txt",
    "content": "Tusky 26\n\n- The blue primary color has been slightly changed for better contrast\n- The content of the notifications tab is now cached for better offline behavior.\n- New account preference \"default reply privacy\"\n- A lot off under-the-hood stability & performance improvements\nSee https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md for the full changelog\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/124.txt",
    "content": "Tusky 26.1\n\n- The \"Reply privacy\" account preference now has two additional options: \"Match default post privacy\" and \"Direct\".\n- Tusky now includes ISRG root certificates to keep working on Android 7 and servers that use Let's Encrypt.\n- Fixes a bug where Tusky sometimes mixes up timelines and/or notifications of accounts.\nSee https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md for the full changelog\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/127.txt",
    "content": "Tusky 27.0\n\n- Tusky has been redesigned with Material 3\n- Support for Notification Policies (Mastodon 4.3 feature)\n- Hashtags at the end of posts are now shown in a separate bar\n- Full support for folding devices\n\nSee https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md for the full changelog\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/131.txt",
    "content": "Tusky 28.0\n\n- Support for Android 15 and edge-to-edge mode\n- Improves the reliability of push notifications\n- Replies in timeline are now clearly marked as such\n- Several improvements to how notifications are rendered in the notifications tab\n- Link Preview Cards got a new design and now support the fediverse:creator feature\n\nSee https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md for the full changelog\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/133.txt",
    "content": "Tusky 29.0\n\n- New iconset\n- The layout of polls has been improved and a \"show results\" button was added\n- Support for the \"blur\" filter action (Mastodon 4.4 feature)\n- The quality of the image viewer has been improved\n- An additional dialog will now prevent accidentally dismissing the media caption dialog\n- Boosts and favorites are now confirmed via a bottom sheet instead of a drop down\n\nSee https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md for the full changelog\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Timeline filters have moved to Account Preferences and will sync with the server\n- You can now have a custom hashtag as tab in the main interface\n- Lists can now be edited\n- Security: removed support for TLS 1.0 and TLS 1.1, and added support for TLS 1.3 on Android 6+\n- The compose view will now suggest custom emojis when starting to type\n- New theme setting \"follow system theme\"\n- Improved timeline accessibility\n- Tusky will now ignore unknown notifications and no longer crash\n- New setting: You can now override the system language and set a different language in Tusky\n- New translations: Czech and Esperanto\n- A lot of other improvements and fixes\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Support for displaying polls, voting and poll notifications\n- New buttons to filter the notification tab and to delete all notifications\n- delete & redraft your own toots\n- new indicator that shows if an account is a bot on the profile image (can be turned off in the preferences)\n- New translations: Norwegian Bokmål and Slovenian. "
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- You can now create Polls from Tusky\n- Improved search\n- New option in Account Preferences to always expand content warnings\n- Avatars in the navigation drawer have now a rounded square shape\n- It is now possible to report users even when they never posted a status\n- Tusky will now refuse to connect over cleartext connections on Android 6+\n- A lot of other small improvements and bug fixes\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/68.txt",
    "content": "Tusky v9.1\n\nThis release ensures compatibility with Mastodon 3 and improves performance and stability.\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- You can now bookmark statuses & list your bookmarks in Tusky.\n- You can now schedule toots with Tusky. Note that the time you select has to be at least 5 minutes in the future.\n- You can now add lists to the main screen.\n- You can now post audio attachments with Tusky.\n\nAnd a lot of other small improvements and bug fixes!"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- Notifications about new follow requests when your account is locked\n- New features that can be toggled on the Preferences screen:\n   - disable swiping between tabs\n   - show a confirmation dialog before boosting a toot\n   - show link previews in timelines\n- Conversations can now be muted\n- Poll results will now be calculated based on the number of voters and not on the number of total votes which makes multichoice polls easier to understand\n- A lot of bugfixes, most of them related to composing toots\n- Improved translations\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- Improved main interface - you can now move the tabs to the bottom\n- When muting a user, you can now also decide whether to mute their notifications\n- You can now follow as many hashtags as you want in one single hashtag tab\n- Improved the way media descriptions are displayed so it works even for super long descriptions\n    \nFull changelog: https://github.com/tuskyapp/Tusky/releases"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- support for profile notes (Mastodon 3.2.0 feature)\n- support for admin announcements (Mastodon 3.1.0 feature)\n\n- the avatar of your selected account will now be shown in the main toolbar\n- clicking the display name in a timeline will now open the profile page of that user\n\n- a lot of bug fixes and small improvements\n- improved translations"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Get notified when a followed user posts - click the bell icon on their profile! (Mastodon 3.3.0 feature)\n- The draft feature in Tusky has been completely redesigned to be faster, more user friendly and less buggy.\n- A new wellbeing mode that allows you to limit certain Tusky features has been added.\n- Tusky can now animate custom emojis.\nFull changelog: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- Follow requests are now always shown in the main menu.\n- The time picker for scheduling a post has a design consistent with the rest of the app now\nFull changelog: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/83.txt",
    "content": "Tusky v15.1\n\nThis release fixes a crash when captioning images\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/87.txt",
    "content": "Tusky v16.0\n\n- The timeline loading logic has been completely rewritten in order to be faster, less buggy and easier to maintain.\n- Tusky can now animate custom emojis in APNG & Animated WebP format.\n- A lot of bugfixes\n- Support for Android 11\n- New translations: Scottish Gaelic, Galician, Ukrainian\n- Improved translations\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/89.txt",
    "content": "Tusky v17.0\n\n- \"Open as...\" is now also available in the menu on account profiles when using multiple accounts\n- Login is now handled in a WebView within the app\n- Support for Android 12\n- support for the new Mastodon instance configuration API\n- and a lot of other small fixes and improvements\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/91.txt",
    "content": "Tusky v18.0\n\n- Support for new Mastodon 3.5 notification types\n- The bot badge now looks better and adjusts to the selected theme\n- Text can now be selected on the post detail view\n- Fixed a lot of bugs, including one that prevented logins on Android 6 and lower\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/94.txt",
    "content": "Tusky 19.0\n\n- Support for Unified Push. To activate the support you will have to relogin into your accounts.\n- The number of responses to a post is now indicated in timelines.\n- Images can now by cropped while composing a post.\n- Profiles now show the date when they were created.\n- When viewing a list the title is now displayed in the toolbar.\n- A lot of bugfixes\n- Translation improvements"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/97.txt",
    "content": "Tusky 20.0\n\n- New App icon by Dzuk https://dzuk.zone/\n- You can now follow hashtags. Click on a hashtag and then on the icon in the toolbar.\n- Support for Android 13\n- new dropdown in the compose view to set the language of a post\n- The media tab in profiles now respects sensitive media and loads smoother.\n- It is now possible to set the focus point of an image before posting\n- New option to show your full username in the toolbar"
  },
  {
    "path": "fastlane/metadata/android/en-US/full_description.txt",
    "content": "Tusky is a lightweight client for Mastodon, a free and open-source social network server.\n\n• Material Design\n• Most Mastodon APIs implemented\n• Multi-Account support\n• Dark and light theme with the possibility to auto-switch based on the time of day\n• Drafts - compose toots and save them for later\n• Choose between different emoji styles \n• Optimized for all screen sizes\n• Completely open-source - no non-free dependencies like Google services\n\nTo learn more about Mastodon, visit https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/short_description.txt",
    "content": "A multi account client for the social network Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/title.txt",
    "content": "Tusky"
  },
  {
    "path": "fastlane/metadata/android/eo/full_description.txt",
    "content": "Tusky estas malpeza klienta aplikaĵo por Mastodon, libera kaj malfermitkoda socireta servilo.\n\n• „Material Design“\n• Funkcias kun la plejmulto de API de Mastodon\n• Subtenas uzadon de pluraj uzantkontoj\n• Hela kaj malhela etosoj kun la eblo de aŭtomata ŝanĝo inter ili depende de la momento de la tago\n• Malnetoj: ekredaktu hupojn kaj konservu ilin por poste\n• Elektu inter malsamaj emoĝi-stiloj\n• Optimumigita por ĉiuj ekrangrandoj\n• Tute malfermitkoda: sen ajna dependo de fermitkodaj servoj kiel tiuj de Google\n\nPor ekscii pli pri Mastodon, vizitu https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/eo/short_description.txt",
    "content": "Pluruzanta aplikaĵo por la socia reto Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/eo/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Soporte para edición de publicaciones\n- Nueva configuración para controlar la dirección de lectura preferida\n- Vistas previas de medios más grandes y una nueva superposición para indicar medios con descripción\n- Ahora es posible agregar cuentas a listas desde su perfil\ny mucho más\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/103.txt",
    "content": "Tusky 22.0 beta 1\n\nEntre sus características se incluyen:\n\n- Visualización de etiquetas que son tendencia\n- Editar descripciones de imágenes y puntos de enfoque\n- Menú \"Refrescar\" Para fines de accesibilidad\n- Soporte para filtros de Mastodon v4 \n- Mostrar información detallada cuando se edita una publicación\n- Opción para mostrar estadísticas de publicaciones en la cronología\n\nEntre las correcciones se incluye:\n\n- Mostrar controles del reproductor durante la reproducción de audio\n- Calculación correcta de la longitud de una publicación\n- Siempre publicar descripciones de imágenes\n\nEntre otras\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Filtros de linea de tiempo movidos a preferencias de cuenta y se sincroniza con servidor\n- Hashtags personalizados como una pestaña en la interfaz principal\n- Puedes editar listas\n- Seguridad: el soporte para TLS 1.0 y 1.1 se ha removido, se añade soporte para TLS 1.3 en Android 6+\n- La vista de composición ahora sugiere emojis personalizados al escribir\n- Nueva opción para seguir tema del sistema\n- Nueva traducción: Czech y Esperanto\n- Otras mejoras y arreglos\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Soporte para mostrar encuestas, votar y recibir notificaciones de ellas\n- Nuevos botones para filtrar la pestaña de notificaciones y borrar todas las notificaciones\n- Borra y edita tus propios toots\n- nuevo indicador para mostrar si la cuenta es un bot en la foto de perfil (puede apagarse en las preferencias)\n- Nueva traduccion: Norwegian Bokmål and Slovenian.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Ahora puedes crear encuestas desde Tusky\n- Se mejoro la búsqueda\n- Nueva opción en preferencias de Cuenta para siempre expandir contenido con aviso\n- Los avatar en el cajón de navegación ahora tienen forma de cuadro redondeado\n- Ahora puedes reportar usuarios incluso cuando nunca hayan tenido un estado\n- Tusky no se conectara a conexiones cleartext en Android 6+\n- Otras mejoras y arreglo de errores\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/68.txt",
    "content": "Tusky v9.1\n\nEsta versión asegura la compatibilidad con Mastodon 3 y mejora le estabilidad y desempeño.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Ahora puedes marcar estas y listar tus marcadores en Tusky.\n- Ahora puedes programar toots con Tusky. Ten en cuenta que el tiempo que elijas tiene que ser al menos 5 minutos en el futuro.\n- Ahora puedes añadir listas a la pantalla principal.\n- Ahora puedes publicar audio adjunto en Tusky.\n\n¡Y muchos otros pequeños cambios y mejoras!\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- Notificaciones sobre nuevas solicitudes de seguimiento cuando su cuenta está bloqueada\n- Nuevas funciones que se pueden alternar en la pantalla de Preferencias:\n    - deshabilitar deslizar entre pestañas\n    - muestra un diálogo de confirmación antes de dar un toque\n    - Mostrar vistas previas de enlaces en líneas de tiempo\n- Las conversaciones ahora se pueden silenciar\n- Los resultados de la encuesta ahora se calcularán en función de la cantidad de votantes y no de la cantidad t\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- La interfaz principal fue mejorada - puedes mover las pestañas a la parte inferior\n- Al silenciar un usuario, puedes decidir silenciar sus notificaciones\n- Ahora puedes seguir todos los hashtags que quieras en una sola pestaña de hashtags\n- Se mejoro la forma en la que la descripción de medios se muestra, ahora funciona para descripciones mas largas\n\nTodos los cambios: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- soporte para notas de perfil (Mastodon 3.2.0)\n- soporte para anuncios de administradores (Mastodon 3.1.0)\n\n- el avatar de tu cuenta escogida ahora se muestra en la barra de herramientas principal\n- al presionar el nombre de usuario en la linea de tiempo se abrira el perfil de dicho usuario\n\n- arreglo de errores y algunas mejoras\n- traducciones mejoradas\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Recibe notificaciones cuando un usuario que sigues hace una publicación - toca la campana en su perfil! (Mastodon 3.3.0)\n- La función de borradores en Tusky ha sido completamente rediseñada para ser mas rápida, amigable y con menos errores\n- Se añadió un nuevo modo de bienestar digital que puede limitar la funcionalidad de Tusky\n- Tusky ahora puede animar emojis personalizados.\nTodos los cambios: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- Las solicitudes de seguimiento ahora se muestran siempre en el menú principal\n- El selector de tiempo para programar una publicación tiene un diseño consistente con el resto de la app\nRegistro completo: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/83.txt",
    "content": "Tusky v15.1\n\nEsta versión arregla un fallo al subtitular imágenes\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/87.txt",
    "content": "Tusky v6.0\n\n- La lógica de carga de linea de tiempo fue reescrita para ser más rápida, tener menos bugs, y ser más fácil de mantener.\n- Tusky puede animar emojis personalizados en formatos APNG y Animated WebP\n- Muchos arreglos de bugs\n- Soporte para Android 11\n- Nuevas traducciones: Gaélico escocés, Galiciano y Ucraniano\n- Traducciones mejoradas\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/89.txt",
    "content": "Tusky versión 17.0\n\n-\"Abrir como...\" ahora disponible en el menú del perfil cuando se usan varias cuentas.\n- Para el registro ahora se utiliza WebView dentro de la app\n- Soporte para Android 12\n- Soporte para la nueva API de configuración de instancias de Mastodon\n- y muchas otras mejoras y correcciones\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/91.txt",
    "content": "Tusky versión 18.0\n\n- Soporte para las nuevas notificaciones de Mastodon 3.5\n- El símbolo de bot ahora se adecúa mejor al tema seleccionado\n- Ahora se puede seleccionar el texto de una publicación en la vista detallada\n- Correcciones de muchos errores, incluyendo el que impedía registros en Android 6 y anteriores\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/94.txt",
    "content": "Tusky versión 19.0\n\n- Soporte para Unified Push. Para activar el soporte tendrás que volver a iniciar sesión en tus cuentas.\n- Ahora se muestra el número de respuestas a una publicación en las cronologías.\n- Ahora se pueden recortar imágenes cuando se escribe una publicación.\n- Ahora se muestra la fecha en la que se crearon los perfiles.\n- Cuando se ve una lista, ahora se muestra el nombre en la barra de herramientas.\n- Correcciones de diversos errores\n- Mejoras en las traducciones\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/97.txt",
    "content": "Tusky versión 20.0\n\n- Nuevo icono de la aplicación, de Dzuk  https://dzuk.zone/ \n- Ahora se pueden seguir etiquetas. Clica en una etiqueta y después en el icono de la barra.\n- Soporte para Android 13\n- Se puede seleccionar el idioma en el que se escribe una publicación\n- La pestaña de multimedia en los perfiles ahora respeta el contenido sensible y carga mejor.\n- Ahora es posible fijar el foco de una imagen antes de publicarla\n- Nueva opción para mostrar el nombre de usuario completo en la barra\n"
  },
  {
    "path": "fastlane/metadata/android/es/full_description.txt",
    "content": "Tusky es un cliente ligero para Mastodon, un servidor de red social gratuito y de código abierto.\n\n• Material Design\n• La mayoría de las API de Mastodon están implementadas\n• Soporte de múltiples cuentas\n• Tema oscuro y claro con la posibilidad de cambiar automáticamente según la hora del día\n• Borradores - crear los toots y guárdalos para más adelante.\n• Elige entre diferentes estilos de emojis\n• Optimizado para todos los tamaños de pantalla.\n• Completamente de código abierto: sin dependencias no libres como los servicios de Google\n\nPara obtener más información sobre Mastodon, visite https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/es/short_description.txt",
    "content": "Un cliente multicuentas para la red social Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/es/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Kronikaren iragazkiak Kontuen Hobespenetara aldatu dira eta zerbitzariarekin sinkronizatuko dira\n- Orain interfaze nagusian traola pertsonalizatu bat izan dezakezu\n- Zerrendak horain editatu daitezke\n- Segurtasuna: TLS 1.0 eta TLS 1.1 sistemetarako laguntza kendu eta TLS 1.3-ren laguntza gehitu da Android 6+ bertsioan\n- Konposatutako ikuspegiak emoji pertsonalizatuak proposatzen ditu idazten hastean\n- Ezarpen berria \"jarraitu sistemaren gaia\"\n- Kronologiaren irisgarritasuna hobetu\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Inkestak, botoak eta inkestak jakinarazteko laguntza\n- Botoi berriak jakinarazpen fitxa iragazteko eta jakinarazpen guztiak ezabatzeko\n- Ezabatu eta berriro diseinatu zure toot-ak\n- Profil irudian kontua bot-a den erakusten duen adierazle berria (lehentasunetan desaktibatu daiteke)\n- Itzulpen berriak: Bokmål Norvegiera eta Esloveniera.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Orain Tusky-tik inkestak sor ditzakezu\n- Bilaketa hobetua\n- Aukera berria Kontuen Hobespenetan beti edukien abisuak zabaltzeko\n- Nabigazioko tiraderaren avatarrek forma karratu biribildua dute orain\n- Horain posible da erabiltzaileen berri ematea inoiz egoera bat argitaratu ez dutenean ere\n- Tusky-k orain ukatu egingo du Android 6+ bertsioetako testu-konexioen bidez konektatzea\n- Beste hainbat hobekuntza txiki eta akats konponketa\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/68.txt",
    "content": "Tusky v9.1\n\nArgitalpen honek Mastodon 3-rekin bateragarritasuna bermatzen du eta errendimendua eta egonkortasuna hobetzen ditu.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Orain tooten laster-markak egin ditzakezu eta zure laster-markak Tuskyn zerrendatu ditzakezu.\n- Orain tootak programa ditzakezu Tuskyrekin. Kontuan izan hautatzen duzun denborak gutxienez 5 minutu izan behar duela etorkizunean.\n- Orain zerrendak gehi ditzakezu pantaila nagusian.\n- Orain audioak argitara ditzakezu Tuskyrekin.\n\nEta beste hainbat hobekuntza txiki eta akatsen zuzenketa!\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- Jarraipena egiteko eskaera berriei buruzko jakinarazpenak zure kontua blokeatuta dagoenean.\n- Hobespenen pantailan txanda daitezkeen eginbide berriak:\n   - Desgaitu fitxen artean irristatzea.\n   - Erakutsi baieztapen elkarrizketa-koadroa tuta bultzatu aurretik.\n   - Erakutsi esteken aurrebistak kronogrametan.\n- Elkarrizketak isil daitezke.\n- Inkesten emaitzak orain hautesle kopuruaren arabera kalkulatuko dira horrek egiten du anitz aukerako inkesta errazago ulertzen.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- Interfaze nagusia hobetuta - fitxak beheko aldera eraman ditzakezu.\n- Erabiltzailea mututzean, orain ere jakinarazpenak isilarazi nahi dituzun erabaki dezakezu.\n- Orain nahi dituzun traola traola fitxa bakarrean jarrai ditzakezu.\n- Multimedia deskribapenak bistaratzeko modua hobetu da, beraz deskribapen oso luzeetarako ere funtzionatzen du.\n\nAldaketa erregistro osoa: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- Profileko oharren laguntza. (Mastodon 3.2.0-ren ezaugarria)\n- Administratzaileentzako iragarkien laguntza. (Mastodon 3.1.0-ren ezaugarria)\n\n- Hautatutako kontuaren abatarra tresna barra nagusian erakutsiko da.\n- Denbora-lerro batean bistaratzeko izena klikatuz gero, erabiltzaile horren profil orria irekiko da.\n\n- Akats konponketa asko eta hobekuntza txikiak.\n- Itzulpenak hobetuta.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Jaso jakinarazpena jarraitutako erabiltzaile batek argitaratzen duenean - egin klik bere profileko kanpaiaren ikonoan! (Mastodon 3.3.0-ren ezaugarria)\n- Tusky-ren zirriborroa erabat birmoldatu da azkarragoa, erabilerrazagoa eta txikiagoa izan dadin.\n- Tusky-ren zenbait ezaugarri mugatzea ahalbidetzen duen ongizate modu berria gehitu da.\n- Tusky-k emoji pertsonalizatuak animatu ditzake orain.\nAldaketa erregistro osoa : https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- Jarraitzeko eskaerak menu nagusian agertzen dira beti.\n- Mezu bat antolatzeko denbora-hautatzaileak orain gainerako aplikazioekin bat datorren diseinua du\nAldaketa erregistro osoa: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/83.txt",
    "content": "Tusky v15.1\n\nBertsio honek konpondu egin du irudiak azpititulatzean huts egitea\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/87.txt",
    "content": "Tusky 16.0 bertsioa\n\n- Denbora-lerroaren karga-logika guztiz berridatzia izan da, azkarragoa eta mantentzeko errazagoa izateko, baita akats gutxiago eduki dezan ere.\n- Orain, Tusky aplikazioak APNG eta animaziodun WebP formatudun emoji pertsonalizatuak anima ditzake.\n- Akats-zuzenketa ugari\n- Android 11rekin bateragarria\n- Itzulpen berriak: Eskoziako gaelera, galiziera eta ukrainera\n- Hobetutako itzulpenak\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/97.txt",
    "content": "Tusky 20.0\n\n- Aplikaziorako ikono berria Dzuk-en eskutik https://dzuk.zone\n- Orain traolak jarrai ditzakezu. Traolan klik egin eta ondoren, tresna-barrako ikonoa.\n- Android 13rekin bateragarria\n- Bidalketa bat egiterakoan, erabilitako hizkuntza aukera dezakezu\n- Profiletako edukien fitxak orain eduki hunkigarria errespetatzen du eta arinago kargatzen da.\n- Orain, irudiaren foku-puntua bidali aurretik zehazteko aukera duzu\n- Tresna-barran aukera berri bat zure erabiltzaile-izen osoa erakusteko\n"
  },
  {
    "path": "fastlane/metadata/android/eu/full_description.txt",
    "content": "Tusky bezero arina da Mastodonentzat, doako eta irekia den sare sozialen zerbitzarirako.\n\n• Material Design\n• Mastodon API gehienak inplementatu dira\n• Kontu anitzeko laguntza\n• Gai iluna eta argia eguneko orduaren arabera automatikoki aldatzeko aukerarekin\n• Zirriborroak - idatzi tootak eta gorde itzazu gerorako\n• Aukeratu emoji estilo desberdinen artean\n• Pantaila tamaina guztietarako optimizatua\n• Iturri guztiz irekiak - Google zerbitzuak bezalako doako menpekotasunik ez\n\nMastodoni buruz gehiago jakiteko, bisitatu https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/eu/short_description.txt",
    "content": "Mastodon sare sozialerako kontu anitzeko bezero bat\n"
  },
  {
    "path": "fastlane/metadata/android/eu/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/100.txt",
    "content": "تاسکی ۲۱٫۰\n\n- پشتیبانی از ویرایش فرسته\n- تنظیمات جدید برای واپایش جهت خوانش ترجیحی\n- پیش‌نمایش‌های رسانهٔ بزرگ‌تر و نشانگر روکار جدید برای رسانه‌های دارای شرح\n- اکنون افزودن حساب‌ها به فهرست‌ها از نمایه‌شان ممکن است\nو بسیاری چیزهای بیش‌تر\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/103.txt",
    "content": "تاسکی ۲۲٫۰ بتا ۱\n\nویژگی‌ها شامل:\n\n- دیدن برچسب‌های داغ\n- ویرایش شرح تصویر و نقطهٔ تمرکز\n- فهرست «بازخوانی» برای دسترسی‌پذیری\n- پشیبانی پالایه‌های ماستودون ن۴\n- نمایش تفاوت‌های جزیی ویرایش فرسته\n- گزینه برای نمایش آمار فرسته‌ها در خط زمانی\n\nرفع اشکال‌ها شامل:\n\n- نمایش واپایشگرهای پخش‌کننده در طول پخش صدا\n- تصحیح محاسبهٔ طول فرسته\n- انتشار همیشگی عنوان تصویرها\n\nو بیش‌تر\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/104.txt",
    "content": "تاسکی ۲۲٫۰ بتا ۲\n\nتغییرها شامل:\n\n- بهبود سرعت بار کردن آگاهی\n- بازگردانی نمایش ۰/۱/۱+ برای پاسخ‌ها\n- نمایش عنوان پالایه‌ها و نه کلیدواژه‌های پالایه روی فرسته‌های پالوده\n- رفع اشکالی که گشودن یک وضعیت می‌توانست پیوند نامرتبطی را بگشاید\n- نمایش دکمهٔ «افزودن» در جای درست هنگام نبودن هیچ پالایه‌ای\n- رفع فروپاشی‌های متفرّقه\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/105.txt",
    "content": "تاسکی ۲۲٫۰ بتا ۳\n\nتعمیرها شامل:\n\n- تعمیر فروپاشی هنگام دیدن رشته\n- تعمیر فروپاشی در پردازش پالایه‌های ماستودون\n- پیوندها در شرح‌حال‌های آگاهی‌های پی‌گیری‌ها و درخواست‌هایشان قابل کلیکند\n- به‌روز رسانی‌های آگاهی‌های اندروید\n  - آگاهی اندروید برای آگاهی ماستودون باید فقط یک بار نشان داده شود\n  - آگاهی‌های اندروید بر اساس گونهٔ آگاهی ماستودون (پی‌گیری، نام‌بری، تقویت و…) گروه می‌شوند\n  - امکان از دست رفتن آگاهی برداشته شده\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/106.txt",
    "content": "تاسکی ۲۲٫۰ بتا ۴\n\nرفع اشکال‌ها:\n\n- تعمیر واکشی مکرّر آگاهی‌ها در صورت پیکربندی بت چندین حساب\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/107.txt",
    "content": "تاسکی ۲۲٫۰ بتا ۵\n\nرفع اشکال‌ها:\n\n- برگرداندن کتابخانهٔ APNG برای تعمیر اموجی‌های پویا\n- ذخیرهٔ رونوشت محلی از علامت‌زن آگاهی در صورتی که کارساز از میانا پشتیبانی نکند\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/108.txt",
    "content": "تاسکی ۲۲٫۰ بتا ۶\n\nرفع اشکال‌ها:\n\n- ذخیرهٔ زودبه‌زودتر مکان خواندن در زبانهٔ آگاهی‌ها\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/109.txt",
    "content": "تاسکی ۲۲٫۰ بتا ۷\n\nرفع اشکال:\n\n\n## رفع اشکال‌های برجسته\n\n- گرفتن تمامی‌آگاهی‌های ماستودون مانده هنگام ساخت آگاهی اندروید\n- کلیک‌روی ایجاد از آگاهی حساب اشتباهی را تنظیم می‌کرد\n- اطمینان از ذخیرهٔ «آخرین شناسهٔ آگاهی خوانده شده» برای حساب درست\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/110.txt",
    "content": "تاسکی ۲۲٫۰\n\nویژگی‌های جدید:\n\n- دیدن برچسب‌های داغ\n- پی‌گیری برچسب‌های جدید\n- چینش بهتر هنگام گزینش زبان‌ها\n- نمایش تفاوت بین نگارش‌های فرسته\n- پشیبانی پالایه‌های ماستودون ن۴\n- گزینه برای نمایش آمار فرسته‌ها در خط زمانی\n- و بیش‌تر…\n\nرفع اشکال‌ها:\n\n- به یاد سپردن مکان و زبانهٔ گزیده\n- نگه داشتن آگاهی‌ها تا زمان خوانده شدن\n- نمایش درست متن دوجهته در نمایه‌ها\n- تصحیح محاسبهٔ طول فرسته\n- نشر همیشگی متن تصویر\n- و بیش‌تر…\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/111.txt",
    "content": "تاسکی ۲۳٫۰ بتا\n\nویژگی‌های جدید:\n\n- ترجیح جدید برای مقیاس متن میانای کاربری\n\nرفع اشکال‌ها:\n\n- ذخیرهٔ درست اطّلاعات حساب\n- «گرفتن» آگاهی‌ها روی افزاره‌های با نگارش اندروید کم‌تر از ۱۱\n- دور زدن مشکل امکان فراموشی توانایی رونوشت و جای‌گذاری در زمینه‌های متنی اندروید\n- تجاوز نکردن از لیهٔ صفحه هنگام دیدن «تفاوت‌ها» در تاریخچهٔ ویرایش\n- فرونپاشیدن در صورت نبودن تاریخچهٔ ویرایش فرسته روی کارساز\n- افزودن دکمهٔ «حذف» هنگام ویرایش یک پالایه\n- نمایش درست اموجی‌های نامربّعی\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/112.txt",
    "content": "تاسکی ۲۳٫۰ بتا ۲\n\nرفع اشکال‌ها:\n\n- فروپاشی بالقوه هنگام ویرایش زمینه‌های نمایه\n- فهرست بافتار بزرگ هنگام ویرایش شرح تصاویر\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/113.txt",
    "content": "تاسکی ۲۳٫۰\n\nویژگی‌های جدید:\n\n- ترجیح جدید برای مقیاس متن میانای کاربری\n\nرفع اشکال‌ها:\n\n- ذخیرهٔ درست اطّلاعات حساب\n- «گرفتن» آگاهی‌ها روی افزاره‌های با نگارش اندروید کم‌تر از ۱۱\n- مشکل امکان فراموشی توانایی رونوشت و جای‌گذاری در زمینه‌های متنی اندروید\n- تجاوز نکردن از لیهٔ صفحه هنگام دیدن «تفاوت‌ها» در تاریخچهٔ ویرایش\n- فرونپاشیدن در صورت نبودن تاریخچهٔ ویرایش فرسته روی کارساز\n- نمایش درست اموجی‌های نامربّعی\n- فروپاشی احتمالی هنگام ویرایش زمینه‌های نمایه\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/115.txt",
    "content": "تاسکی ۲۴٫۰\n\n- نمای بهتر نقل قول‌ها و بلوک‌های کد در فرسته‌ها.\n- بازگشت رفتار قدیمی زبانهٔ آگاهی‌ها.\n- نمایش نشان‌های نقش روی نمایه‌ها.\n- بهبود پخش‌کنندهٔ ویدیو. امکان گزینش سرعت پخش.\n- گزینهٔ استفاده از زمینهٔ سیاه هنگام پیروی از طرّاحی سامانه.\n- نمای جدید دیدن فرسته‌های داغ در فهرست و زبانهٔ سفارشی.\n\nو بسیاری بهبودها و رفع اشکال‌های دیگر!\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/117.txt",
    "content": "تاسکی ۲۴٫۱\n\n- صفحه هنگام‌نمایش ویدیو روشن می‌ماند.\n- نشت حافظه‌ای رفع شد. بهبود پایداری و کارایی.\n- شکلک‌ها هنگام ایجاد فرسته ۱ فرسته شمرده می‌شوند.\n- رفع فروپاشی هنگام گزینش متن روی برخی افزاره‌ها.\n- نقشک‌های متن‌های راهنما در خط‌ها زمانی خالی درست هم‌تراز می‌شوند.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/119.txt",
    "content": "تاسکی ۲۵\n\n- پشتیبانی از میانای ترجمهٔ ماستودون\n- نمایش زبان فرسته\n- بهبود جابه‌جایی صفحه‌ها\n- جابه‌جایی رشته‌های پالایه به ترجیحات حساب\n- ثابت شدن موقعیت آمار فرسته‌ها\n- بسیاری از بهبودهای کارایی و پایداری\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/123.txt",
    "content": "تاسکی ۲۶\n\n- رنگ آبی اصلی برای سایه‌روشن بهتر کمی تغییر کرد\n- محتوای زبانهٔ آگاهی‌ها برای رفتار بهتر برون‌خط انبارش می‌شود.\n- «محرمانگی پیش‌گزیدهٔ پاسخ» ترجیحات جساب جدید\n- کلی بهبود بازدهی و پایدار در زیر کاپوت\nبرای گزارش دگرگونی کامل https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md را ببینید\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/124.txt",
    "content": "تاسکی ۲۶٫۱\n\n- ترجیحات حساب «محرمانگی پاسخ» اکنون دو گزینهٔ اضافی دارد: «تطبیق با محرمانگی فرستهٔ پیش‌گزیده» و «مستقیم».\n- تاسکی اکنون برای ادامهٔ کار روی اندروید ۷ و کارسازهایی که از لتس‌انکریپت استفاده می‌کنند گواهی‌های ریشهٔ ISRG را درون خود دارد.\n- رفع مشکلی که تاسکی گاهی خط‌های زمانی و یا آگاهی‌های حساب‌ها را قاطی می‌کرد.\nبرای گزارش دگرگونی کامل https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md را ببینید\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/127.txt",
    "content": "تاسکی ۲۷٫۰\n\n- تاسکی با متریال ۳ بازطرّاحی شده\n- پشتیبانی از سیاست‌های آگاهی (ویژگی ماستودون ۴٫۳)\n- برچسب‌های پایانی اکنون در نواری جداگانه نشان داده می‌شوند\n- پشتسبانی کمل از افزاره‌های تاشو\n\nبرای گزارش دگرگونی کامل https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md را ببینید\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/131.txt",
    "content": "تاسکی ۲۸٫۰\n\n- پشیبانی از حالت لبه به لبه و اندروید ۱۵\n- بهبود اطمینان‌پذیری آگاهی‌های ارسالی\n- علامت‌گذاری پاسخ‌ها در خط زمانی\n- چندین بهبود در چگونگی پرداخت آگاهی‌ها پر زبانهٔ آگاهی\n- طراحی جدید کارت‌های پیش‌نمایش پیوند و پشتیبانی از ویژگی fediverse:creator\n\nدیدن https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md برای گزارش دگرگونی کامل\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/133.txt",
    "content": "تاسکی ۲۹\n\n- مجموعه نقشک جدید\n- چینش نظرسنجی‌ها بهبود یافته و دکمهٔ «نمایش نتیجه» اضافه شده\n- پشتیبانی از کنش پالایهٔ «محوی» (ویژگی ماستودون ۴٫۴)\n- کیفیت نمایشگر تصویر بهبود یافته\n- گفت‌وگویی اضافی اکنون جلوی رد شدن تصادفی گفت‌وگوی عنوان رسانه را می‌گیرد\n- تقویت‌ها و برگزیدن‌ها اکنون به جای صفحهٔ‌پایین افتادنی با صفحهٔ پایینی تأیید می‌شوند\n\nبرای گزارش دگرگونی کامل https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md را ببینید\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/58.txt",
    "content": "تاسکی نگارش ۶٫۰\n\n- انتقال پالایه‌های خط‌زمانی به ترجیحات حساب و همگام سازی با کارخواه\n- می‌توانید برچسب سفارشی را به عنوان زبانه‌ای در رابط اصلی داشته باشید\n- سیاهه‌ها می‌توانند ویرایش شوند\n- حذف پشتیبانی TLS ۱٫۰ و ۱٫۱ و افزودن پیشتیبانی برای TLS ۱٫۳ روی اندروید ۶ به بالا\n- پیشنهاد شکلک‌های سفارشی با نوشتن در نمای ایجاد\n- سبک جدید «پیروی از سامانه»\n- بهبود دسترسی‌پذیری خط‌زمانی\n- نادیده گرفتن آگاهی‌های ناشناخته\n- می‌توانید زبان سامانه را پایمال کنید\n- ترجمه‌های چک‌و اسپرانتو\n- بهبودهای بیش‌تر\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/61.txt",
    "content": "تاسکی نگارش ۷٫۰\n\n- پشتیبانی از نمایش نظرسنجی‌ها، رأی‌ها و آگاهی‌های مربوط به نظرسنجی\n- دکمهٔ جدید برای پالایش زبانهٔ آگاهی و حذف همهٔ آگاهی‌ها\n- حذف و بازنویسی بوق‌های خودتان\n- نشانگر جدید روی تصویر نمایه که نشان می‌دهد یک حساب، بات است (قابل خاموش کردن در ترجیحات)\n- ترجمه‌های جدید: نروژی و اسلونیایی.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/67.txt",
    "content": "تاسکی نگارش ۹٫۰\n\n- اکنون می‌توانید از تاسکی، نظرسنجی ایجاد کنید\n- جست‌وجوی بهبودیافته\n- گزینهٔ جدید در ترجیحات حساب برای گسترش همیشگی هشدارهای محتوا\n- آواتارها در کشوی ناوبری اکنون شکل مربّعی با لبه‌های گرد دارند\n- اکنون گزارش کاربرانی که هیچ بوقی ندارند نیز ممکن است\n- تاسکی اکنون روی اندروید ۶ به بالا از اتّصال غیر ایمن سر باز می‌زند\n- بسیاری از بهبودها و رفع اشکال‌های دیگر\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/68.txt",
    "content": "تاسکی نگارش ۹٫۱\n\nاین نگارش، سازگاری با ماستودون ۳ را تأمین کرده و عملکرد و پایداری را بهبود می‌دهد.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/70.txt",
    "content": "تاسکی نگارش ۱۰٫۰\n\n- اکنون می‌توانید بوق‌ها را نشان کرده و نشانک‌هایتان را فهرست کنید.\n- اکنون می‌توانید بوق‌ها را زمان‌بندی کنید. توجّه داشته باشید که زمان گزیده‌تان باید لااقل ۵ دقیقه بعد باشد.\n- اکنون می‌توانید فهرست‌ها را به صفحهٔ اصلی بیفزایید.\n- اکنون می‌توانید پیوست‌های صوتی بفرستید.\n\nو بسیاری از بهبودها و رفع اشکال‌های ریز!\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/72.txt",
    "content": "تاسکی نگارش ۱۱٫۰\n\n- آگاهی‌ها دربارهٔ درخواست‌های دنبال کردن جدید، هنگام قفل بودن حسابتان\n- ویژگی‌های جدیدی که وضعیتشان می‌تواند در صفحهٔ ترجیحات تغییر کند:\n   - از کار انداختن جابه‌جایی بین زبانه‌ها با کشیدن\n   - نمایش یک گفت‌وگوی تأیید، پیش از تقویت یک بوق\n   - نمایش پیش‌نمایش‌های پیوند در خط زمانی\n- امکان خموش کردن گفت‌وگوها\n- محاسبهٔ نتایج نظر سنجی‌های چندگزینه‌ای بر اساس تعداد رأی‌دهندگان و نه تعداد کل رأی‌ها\n- یک عالمه رفع اشکال که بیش‌ترشان مربوط به ایجاد بوق‌هاست\n- بهبود ترجمه‌ها\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/74.txt",
    "content": "تاسکی نگارش ۱۲٫۰\n\n- واسط اصلی بهبودیافته - اکنون می‌توانید زبانه‌ها را به پایین ببرید\n- هنگام خموش کردن کاربران، می‌توانید آگاهی‌هایشان را هم خموش کنید\n- اکنون می‌توانید هرتعداد هشتگ که می‌خواهید را در یک زبانهٔ هشتگ دنبال کنید\n- بهبود شیوهٔ نمایش توضیح رسانه‌ها که برای توضیحات خیلی طولانی هم نشان داده شوند\n…\nگزارش دگرگونی کامل: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/77.txt",
    "content": "تاسکی نگارش ۱۳٫۰\n\n- پشتیبانی از یادداشت‌های نمایه (ویژگی ماستودون ۳٫۲٫۰)\n- پشتیبانی از اعلامیه‌های مدیر (ویژگی ماستودون ۳٫۱٫۰)\n\n- آواتار حساب گزیده‌تان در نوار ابزار اصلی نشان داده می‌شود\n- زدن روی نام نمایشی در خط زمانی، نمایهٔ آن کاربر را می‌گشاید\n\n- کلّی رفع اشکال و بهبودهای جزیی\n- بازگردانی‌های بهبودیافته\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/80.txt",
    "content": "تاسکی نگارش ۱۴٫۰\n\n- هنگامی که کاربر پی‌گرفته‌ای بوق می‌زند، آگاه شوید - نقشک زنگ روی نمایه‌اش را بزنید! (ویژگی ماستودون ۳٫۳٫۰)\n- ویژگی پیش‌نویس در تاسکی برای سریع‌تر، کاربرپسندتر و کم‌مشکل‌تر بودن، به کلّی باز طرّاحی شده.\n- حالت سلامتی جدیدی افزوده شده ه می‌گذارد ویژگی‌های خاصی را در تاسکی محدود کنید.\n- تاسکی اکنون می‌تواند پویانمایی اموجی‌های شخصی را نشان دهد.\nگزارش تغییر کامل: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/82.txt",
    "content": "تاسکی نگارش ۱۵٫۰\n\n- درخواست‌های پیگیری اکنون همواره در فهرست اصلی نشان داده می‌شوند.\n- گزینشگر زمان برای زمان‌بندی یک فرسته، اکنون ظاهری هماهنگ با باقی کاره دارد.\nگزارش تغییر کامل: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/83.txt",
    "content": "تاسکی نگارش ۱۵٫۱\n\nاین ارائه، فروپاشی‌ای هنگام شرح نوشتن بر تصویرها را تعمیر می‌کند\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/87.txt",
    "content": "تاسکی ن۱۶٫۰\n\n- منطق بار کردن خط زمانی برای سریع‌تر بودن، کم‌اشکال بودن و نگه‌داری ساده‌تر به طور کامل از نو نوشته شد.\n- تاسکی اکنون می‌تواند اموجی‌های پویای شخصی را در قالبAPG و WebP پویا نشان دهد.\n- کلّی رفع اشکال\n- پشتیبانی اندروید ۱۱\n- ترجمه‌های جدید: گالیک اسکاتلندی، گالیسیایی، اوکراینی\n- ترجمه‌های بهبودیافته\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/89.txt",
    "content": "تاسکی ن۱۷٫۰\n\n- اکنون هنگام استفاده از چندین حساب «گشودن به عنوان…» در فهرست روی نمایه‌های حساب نیز موجود است\n- ورود اکنون در نمای وبی درون کاره مدیریت می‌شود\n- پشتیبانی از اندروید ۱۲\n- پشتیبانی از میانای جدید پیکربندی نمونهٔ ماستودون\n- و بسیاری از بهبودها و رفع مشکلات کوچک\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/91.txt",
    "content": "تاسکی نگارش ۱۸٫۰\n\n- پشتیبانی از گونه‌های آگاهی جدید ماستودون ۳٫۵\n- نشان بات اکنون ظاهر بهتری داشته و با زمینهٔ گزیده تنظیم می‌شود\n- متن‌ها اکنون می‌توانند در نمای جزییات فرسته، گزیده شوند\n- رفع کلّی مشکل، از جمله مشکلی که جلوی ورود روی اندروید ۶ و پایین‌تر را می‌گرفت\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/94.txt",
    "content": "تاسکی ۱۹٫۰\n\n- پشتیبانی از Unified Push. برای فعّال کردن این پشتیبانی باید دوباره به حساب‌هایتان وارد شوید.\n- اکنون تعداد پاسخ‌ها به فرسته‌ها در خط‌های زمانی نشان داده می‌شود.\n- اکنون تصویرها می‌توانند هنگام ایجاد فرسته بریده شوند.\n- اکنون نمایه‌ها تاریخ ایجادشان را نشان می‌دهند.\n- اکنون عنوان سیاهه هنگام دیدنش در نوار ابزار نمایش داده می‌شود.\n- یک عالمه رفع اشکال\n- بهبودهای ترجمه\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/97.txt",
    "content": "تاسکی ۲۰٫۰\n\n- نقشک‌کارهٔ جدید به دست https://dzuk.zone\n- اکنون می‌توانید برچسب‌ها را دنبال کنید. روی برچسبی زده و سپس نقشک داخل نوارابزار را بزنید.\n- پشتیبانی از اندروید ۱۳\n- پایین‌افتادنی جدید در نمای نوشتن برای تنظیم زبان فرسته\n- زبانهٔ رسانه در نمایه اکنون به رسانه‌های حسّاس احترام گذاشته و نرم‌تر بار می‌شود.\n- اکنون می‌توان پیش از فرستادن تصویر، نقطهٔ تمرکز را تنظیم کرد\n- گزینهٔ جدید برای نمایش نام کاربری کاملتان در نوارابزار\n"
  },
  {
    "path": "fastlane/metadata/android/fa/full_description.txt",
    "content": "تاسکی کارخواهی سبک برای ماستودون، یک کارساز شبکهٔ اجتماعی نرم‌افزار آزاد است.\n\n• طرّاحی متریال\n• پیاده‌سازی بیش‌تر میاناهای ماستودون\n• پشتیبانی از چند حساب\n• پشتیبانی از زمینهٔ تاریک و روشن با امکان تغییر خودکار بر اساس زمان روز\n• پیش‌نویس‌ها - ایجاد بوق‌ها و ذخیره‌شان برای بعد\n• گزینش بین سبک‌های مختلف اموجی\n• بهینه‌شده برای همهٔ اندازه‌های صفحه\n• کاملاُ نرم‌افزار آزاد - بدون وابستگی‌های انحصاری مانند خدمات گوگل\n\nبرای دریافت اطّلاعات بیش‌تر دربارهٔ ماستودون، https://joinmastodon.org را ببینید\n"
  },
  {
    "path": "fastlane/metadata/android/fa/short_description.txt",
    "content": "کارخواهی چندحسابه برای شبکهٔ اجتماعی ماستودون\n"
  },
  {
    "path": "fastlane/metadata/android/fa/title.txt",
    "content": "تاسکی\n"
  },
  {
    "path": "fastlane/metadata/android/fi/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Prise en charge de l'édition des statuts\n- Nouveau réglage pour contrôler l'ordre de lecture\n- Vignettes média plus grandes et avec un nouveau macaron indiquant les médias ayant une légende\n- Il est à présent possible d'ajouter un compte à une liste depuis son profil\net bien plus\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/103.txt",
    "content": "Tusky 22.0 beta 1\n\nAjouts, dont :\n\n- Consultation des hashtags tendance\n- Modification des légendes et du point focal des images\n- Actualisation via menu pour l'accessibilité\n- Prise en charge des filtres de Mastodon v4\n- Détail des différences d'un post modifié\n- Option pour l'affichage des statistiques des posts dans les fils\n\nCorrections, dont :\n\n- Affichage des contrôles lors de la lecture audio\n- Correction du calcul de la longueur d'un post\n- Publication des légendes d'images\n\net bien plus\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/104.txt",
    "content": "Tusky 22.0 beta 2\n\nCorrections, dont :\n\n- Amélioration de la vitesse de chargement des notifications\n- Restauration de l'affichage 0/1/>1 des réponses\n- Afficher le nom du titre et non pas ses mots-clés sur les publications filtrées\n- Correction du bug où appuyer sur une publication pouvait ouvrir un lien sans rapport\n- Affichage du bouton « Ajout » au bon endroit lorsqu'il n'y a aucun filtre\n- Correction de divers plantages\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Les filtres de la timeline ont été déplacés dans les Préférences de compte et se synchronisent avec le serveur\n- Vous pouvez personnaliser un onglet avec un hashtag dans la fenêtre principale\n- Les listes peuvent être éditées\n- Sécurité : suppression du support pour TLS 1.0 et TLS 1.1, et ajout du support pour TLS 1.3 sur Android 6+\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Supporte l'affichage, le vote et les notifications des sondages\n- Nouveaux boutons pour filtrer l’onglet des notifications et effacer toutes les notifications\n- « Effacer & réécrire » vos propres pouets\n- Nouvel indicateur qui montre si un compte est un robot sur l’image de profil (peut être désactivé dans les préférences)\n- Nouvelles traductions : Norvégien Bokmål et Slovène.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Vous pouvez désormais créer des sondages dans Tusky\n- Recherche améliorée\n- Nouvelle option dans les Préférences du compte pour toujours déplier les avertissements\n- Les avatars dans le menu de navigation ont désormais une forme de rectangle arrondi\n- Il est désormais possible de signaler des utilisateurs même si ils n'ont jamais posté de statut\n- Tusky refuse désormais de se connecter via une connexion non-sécurisée sur Android 6+\n- Plein de petites améliorations et corrections\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/68.txt",
    "content": "Tusky v9.1\n\nCette mise à jour assure la compatibilité avec Mastodon 3 et améliore les performances et la stabilité.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Vous pouvez maintenant marquer les statuts et lister vos signets dans Tusky.\n- Vous pouvez maintenant programmer des pouets avec Tusky. Notez que l'heure que vous sélectionnez doit être d'au moins 5 minutes dans le futur.\n- Vous pouvez maintenant ajouter des listes à l'écran principal.\n- Vous pouvez désormais publier des pièces jointes audio avec Tusky.\n\nEt beaucoup d'autres petites améliorations et corrections de bugs !\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- Notifications à propos des nouvelles demandes d’abonnement en cas de compte verrouillé\n- Nouvelles fonctionnalités dans l’écran Préférences :\n   - désactiver le changement d'onglet\n   - afficher une confirmation avant de partager un pouet\n   - afficher les aperçus des liens dans les fils\n- Possibilité de mettre en sourdine les conversations\n- Les résultats des sondages seront désormais calculés en fonction du nombre de sond·é·s\n- Résolution de bugs\n- Amélioration des traductions\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- Amélioration de l'interface principale - vous pouvez maintenant déplacer les onglets vers le bas\n- Lorsque vous mettez un utilisateur en sourdine, vous pouvez désormais décider de désactiver ses notifications\n- Vous pouvez maintenant suivre autant de hashtags que vous le souhaitez dans un seul onglet hashtag\n- La description des médias s'affiche correctement quelque soit sa taille\n    \nHistorique complet : https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- prise en charge des notes de profil (fonctionnalité de Mastodon 3.2.0)\n- le support des annonces de l'administration (fonctionnalité de Mastodon 3.1.0)\n\n- l'avatar de votre compte sélectionné apparaîtra désormais dans la barre d'outils principale\n- en cliquant sur le nom affiché dans une timeline, la page de profil de cet utilisateur s'ouvrira\n\n- plein corrections de bugs et de petites améliorations\n- l'amélioration des traductions\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Soyez notifié·e des nouveaux message d’un compte suivi — cliquez l’icône de cloche sur son profil ! (fonctionnalité de Mastodon 3.3.0)\n- La fonctionnalité de brouillon a été complètement repensée pour être plus rapide, plus conviviale et moins boguée.\n- Un nouveau mode bien-être qui vous permet de limiter certaines fonctions de Tusky a été ajouté.\n- Tusky peut désormais animer les émojis personnalisés.\nListe complète des changements : https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- Les demandes de suivi sont désormais toujours montrées dans le menu principal.\n- Le sélecteur de date/heure pour planifier un message a désormais un design cohérent avec le reste de l’application\nListe complète des changements : https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/83.txt",
    "content": "Tusky v15.1\n\nCette version corrige un plantage lors de l’ajout de description d’image\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/87.txt",
    "content": "Tusky v16.0\n\n- Le fonctionnement des fils a été complètement revu de manière à être plus rapide, moins dysfonctionnel et plus simple à maintenir,\n- Tusky peut désormais lire les émoticônes animées au format APNG et au format Animated WebP,\n- Une quantité considérable de bugs a été résolue,\n- Le support pour Android 11 a été mis en place,\n- De nouvelles traductions sont disponibles : Gaélique écossais, Galicien et Ukrainien,\n- Les traductions existantes ont été améliorées.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/89.txt",
    "content": "Tusky v17.0\n\n- L'option « Ouvrir comme… » disponible quand plusieurs comptes sont connectés est maintenant aussi accessible depuis le menu sur les profils\n- L'identification se fait maintenant par une WebView dans l'application\n- Android 12 est pris en charge\n- La nouvelle API Mastodon de configuration d'instance est prise en charge\n- et beaucoup d'autres petites corrections et améliorations\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/91.txt",
    "content": "Tusky v18.0\n\n- Les nouveaux types de notifications de Mastodon 3.5 sont maintenant supportés\n- Le badge robot est maintenant plus joli et s'adapte au thème choisi\n- Il est maintenant possible de sélectionner le texte dans l'écran de détails d'un post\n- Beaucoup de bogues résolus, dont un qui empêchait de se connecter sous Android 6 ou inférieur\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/94.txt",
    "content": "Tusky 19.0\n\n- Les notifications via UnifiedPush sont à présent supportées. Pour les activer vous devrez reconnecter vos comptes.\n- Le nombre de réponses est maintenant affiché sur chaque post dans les fils.\n- Les images peuvent maintenant être rognées lors de l'écriture d'un message.\n- Les profils affichent à présent leur date de création.\n- Lorsqu'une liste est affichée, son nom apparaît maintenant dans la barre d'outils.\n- Beaucoup de bogues résolus.\n- Des améliorations sur les traductions.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/97.txt",
    "content": "Tusky 20.0\n\n- Nouvelle icône d'application par  https://dzuk.zone/\n- Vous pouvez maintenant suivre des mot croisillon. Cliquer sur un mot croisillon puis sur l’icône dans la barre d'outil. \n- Support de Android 13\n- Nouveau menu déroulant dans la fenêtre de composition permettant de choisir la langue de la publication. \n- L'onglet Media dans les profiles respecte maintenant les images sensibles et charge de façon plus fluide. \n- Ajout de la possibilité de choisir la partie visible d'une image avant de publier. \n- Nouvelle option pour voir votre nom d'utilisateur complet dans la barre d'outils.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/full_description.txt",
    "content": "Tusky est un client léger pour Mastodon, un serveur de réseau social libre et ouvert.\n\n• Design Material\n• La plupart de l'API Mastodon est implémentée\n• Support du multi-compte\n• Thèmes sombre et clair avec possibilité de basculer automatiquement en fonction de l'heure\n• Brouillons — rédigez des pouets et enregistrez-les pour plus tard\n• Choisissez parmi différents styles d'émojis\n• Optimisé pour toutes les tailles d'écrans\n• Entièrement ouvert — aucune dépendance non libre comme les services Google\n\nPour en apprendre plus à propos de Mastodon, visitez https://joinmastodon.org/ (anglais)\n"
  },
  {
    "path": "fastlane/metadata/android/fr/short_description.txt",
    "content": "Un client multi-compte pour le réseau social Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/fr/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/ga/short_description.txt",
    "content": "Cliaint ilchuntasach don líonra sóisialta Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/ga/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/gd/short_description.txt",
    "content": "Cliant do dh’iomadh cunntas san lìonra sòisealta Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/gd/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Soporte para edición de publicacións\n- Novo axuste para controlar a dirección de lectura\n- Vistas previas de maior tamaño e indicador de descrición da imaxe\n- Agora podes engadir contas ás listas desde o seu perfil\ne moito máis\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/103.txt",
    "content": "Tusky 22.0 beta 1\n\nCaracterísticas incluídas:\n\n- Ver cancelos en voga\n- Edición da descrición das imaxes e punto focal\n- Menú \"actualizar\" para a accesibilidade\n- Soporte para filtros de Mastodon v4\n- Mostra as diferencias polo miúdo cando unha publicación se edita\n- Opción para mostrar estatísticas da publicación na cronoloxía\n\nArranxos:\n\n- Mostrar controis de reprodución durante reprodución de audio\n- Correxir o cálculo da lonxitude da publicación\n- Publicar sempre descrición da imaxe\n\ne moito máis\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/104.txt",
    "content": "Tusky 22.0 beta 2\n\nCorreccións que inclúen:\n\n- Velocidade de carga de notificacións mellorada\n- Restaurar mostrando 0/1/1+ para as respostas\n- Mostra títulos de filtro, non palabras clave de filtro, nas publicacións filtradas\n- Corrixiuse un erro no que abrir un estado podía abrir unha ligazón non relacionada\n- Mostrar o botón \"Engadir\" no lugar correcto cando non haxa filtros\n- Arranxáronse varios fallos\n (trad. automática)\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/105.txt",
    "content": "Tusky 22.0 beta 3\n\nCorreccións que inclúen:\n\n- Arranxouse o fallo ao ver un fío\n- Filtros Mastodon de procesamento de fallos corrixidos\n- Pódense facer clic nas ligazóns da bios das notificacións de solicitude de seguimento/seguimento\n- Actualizacións de notificacións de Android\n   - A notificación de Android para unha notificación de Mastodon só debe mostrarse unha vez\n   - As notificacións de Android agrúpanse por tipo de notificación de Mastodon (seguir, mencionar, aumentar, etc.)\n   - Eliminouse o potencial de notificacións que faltan\n(trad. auto)\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/106.txt",
    "content": "Tusky 22.0 beta 4\n\nArranxo:\n\n- das notificacións repetidas se hai varias contas\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/107.txt",
    "content": "Tusky 22.0 beta 5\n\nCorreccións:\n\n- Retrocedeu a biblioteca APNG para corrixir emojis animados rotos\n- Garda a copia local do marcador de notificación no caso de que o servidor non admita a API\n(trad. automática)\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/108.txt",
    "content": "Tusky 22.0 beta 6\n\nArranxos:\n\n- gardar con maior frecuencia a posición de lectura na pestana de Notificacións\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/109.txt",
    "content": "Tusky 22.0 beta 7\n\nCorreccións:\n\n\n### Correccións de erros importantes\n\n- Obtén todas as notificacións pendentes de Mastodon ao crear notificacións de Android\n- Facendo clic en \"Redactar\" desde unha notificación, establecerase a conta incorrecta\n- Asegúrate de gardar o \"ID de notificación da última lectura\" na conta correcta\n\n(trad. automática)\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/110.txt",
    "content": "Tusky 22.0\n\nNovidades:\n\n- Ver cancelos en voga\n- Seguir novos cancelos\n- Melloras na orde de selección de idiomas\n- Mostra a diferenza entre versións dunha publicación\n- Soporte para os filtros de Mastodon v4\n- Opción para mostrar na cronoloxía estatítiscas das enquisas\n- E máis...\n\nArranxos:\n\n- Lembrar lapela e posición\n- Manter as notificacións ata que son lidas\n- Disposición correcta de texto RTL e LTR misturados nos perfís\n- Cálculo correcto da lonxitude da publicación\n- Publicar sempre descrición das imaxes\n- E máis...\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/111.txt",
    "content": "Tusky 23.0 beta 1\n\nNovas características:\n\n- Nova preferencia para escalar o texto da IU\n\nCorreccións:\n\n- Garda a información da conta correctamente\n- notificacións \"pull\" en dispositivos con versións de Android <= 11\n- Soluciona un erro de Android onde os campos de texto poden \"esquecer\" que poden copiar/pegar\n- A visualización de \"diferencias\" no historial de edicións non se estenderá fóra do bordo da pantalla\n- Non falla se o teu servidor non ten historial de edición posterior\n- Engade un botón \"Eliminar\" ao editar un filtro\n- Mostrar emoji non cadrados correctamente\n\n(trad. automática)\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/112.txt",
    "content": "Tusky 23.0 beta 2\n\nArranxos:\n\n- fallo potencia ao editar os campos do perfil\n- menú contextual demasiado grando ao editar a descrición das imaxes\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/113.txt",
    "content": "Tusky 23.0\n\nNovas características:\n\n- Novo axuste para o tamaño da letra na interface\n\nArranxos:\n\n- Gardar correctamente a información da conta\n- \"obter\" notificacións en dispositivos con versión Android <=11\n- Problema en Android onde os campos de textos \"esquecían\" que poden copiar/pegar\n- Ver os cambios no historial de edicións e que non se extenda polos bordos da pantalla\n- Non falla se o servidor non ten o historial de edicións da publicación\n- Mostrar correctamente os emoji que non son cadrados\n- Posible fallo ao editar os campos do perfil de usuaria\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/115.txt",
    "content": "Tusky 24.0\n\n- As citas e o código agora locen mellor nas publicacións.\n- Restablecemos o comportamento antigo na pestana de notificacións.\n- As insignias dos roles son visibles nos perfís.\n- Melloramos o reprodutor de vídeo. Podes escoller a velocidade de reprodución.\n- Nova opción para a aparencia, poder usar o decorado negro seguindo a sistema.\n- Nova vista para as publicacións en voga, dispoñible tanto no menú como pestana personal.\n\nE moitos outros arranxos e melloras!\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/117.txt",
    "content": "Tusky 24.1\n\n- A pantalla permanece acendida mentras se reproduce un vídeo\n- Arranxadas as fugas de memoria. Debería mellorar o rendemento e estabilidade.\n- Os emojis cóntanse correctamente como 1 caracter ao escribir unha mensaxe.\n- Arranxo do fallo nalgúns dispositivos ao seleccionar texto.\n- As iconas nos texto de axuda en cronoloxías baleiras xa estarán aliñados correctamente.\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/119.txt",
    "content": "Tusky 25\n\n- soporte para a API de tradución de Mastodon\n- mostra o idioma da publicación\n- mellora nas transicións entre pantallas\n- os axustes dos filtros agora están nas preferencias da conta\n- as estatísticas da publicación están nunha posición estable\n- moitos cambios internos para mellorar a estabilidade e rendemento\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/123.txt",
    "content": "Tusky 26\n\n- A cor azul principal cambiou lixeiramente para mellorar o contraste\n- O contido da pestana de notificacións agora gárdase na caché para mellorar o funcionamento sen conexión.\n- Novo axuste para a conta \"privacidade por defecto para a resposta\"\n- Moitas melloras non visibles para mellorar a estabilidade e o rendemento\nLe https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md para ver todos os cambios\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/124.txt",
    "content": "Tusky 26.1\n\n- O axuste da conta \"Privacidade da resposta\" agora ten dúas opcións engadidas: \"Directa\" e \"Seguir ao valor por defecto\".\n- Tusky inclúe certificados raíz ISRG para seguir funcionando en Android 7 e servidores que usan Let's Encrypt.\n- Arranxo do problema que causaba que se misturasen cronoloxías e/ou notificacións para as contas.\nLe o rexistro completo coas novidades https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/127.txt",
    "content": "Tusky 27.0\n\n- Redeseño da interface con Material 3\n- Compatibilidade coas Políticas de Notificación (para Mastodon >4.3)\n- Os cancelos ao final da publicación móstranse nunha barra separada\n- Compatibilidade completa con dispositivos pregables\n\nLe o rexistro completo dos cambios https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/131.txt",
    "content": "Tusky 28.0\n\n- compatible co modo marxe-a-marxe de Android 15\n- melloras na fiabilidade das notificacións push\n- marcado máis claro das respostas na cronoloxía\n- varias melloras no xeito en que se mostran as notificacións na lapela de notificacións\n- as Tarxetas de previsualización de ligazóns teñen un novo deseño compatible con fediverse:creator\n\nLe a lista completa dos cambios en https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/133.txt",
    "content": "Tusky 29.0\n\n- Novas iconas\n- Melloras para mostrar as enquisas, cun novo botón para «mostrar resultados»\n- Compatiblidade coa acción de filtro «esvaecer» (Mastodon 4.4)\n- Mellor calidade ao ver as imaxes\n- Diálogo adicional para evitar sen querer o aviso de engadir descrición do multimedia\n- As promocións e favorecementos agora cofírmanse a través dun elemento na interface e non nun despregable\n\nVer o rexistro con todos os cambios https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Timeline filters have moved to Account Preferences and will sync with the server\n- You can now have a custom hashtag as tab in the main interface\n- Lists can now be edited\n- Security: removed support for TLS 1.0 and TLS 1.1, and added support for TLS 1.3 on Android 6+\n- The compose view will now suggest custom emojis when starting to type\n- New theme setting \"follow system theme\nhttps://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Support for displaying polls, voting and poll notifications\n- New buttons to filter the notification tab and to delete all notifications\n- delete & redraft your own toots\n- new indicator that shows if an account is a bot on the profile image (can be turned off in the preferences)\n- New translations: Norwegian Bokmål and Slovenian.\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Podes crear Enquisas desde Tusky\n- Busca mellorada\n- Nova opción nas Preferencias da Conta para despregar avisos de contido\n- Os avatares na caixa de navegación agora son cadrados con bordo redondeado\n- Xa podes denunciar usuarias incluso se nunca publicaron\n- Tusky rexeitará conectar sobre conexións sen cifrar en Android 6+\n- Múltiples melloras e corrección de fallos\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/68.txt",
    "content": "Tusky v9.1\n\nEsta versión asegura a compatibilidade con Mastodon 3 e mellora o rendemento e estabilidade.\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- You can now bookmark statuses & list your bookmarks in Tusky.\n- You can now schedule toots with Tusky. Note that the time you select has to be at least 5 minutes in the future.\n- You can now add lists to the main screen.\n- You can now post audio attachments with Tusky.\n\nAnd a lot of other small improvements and bug fixes!\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/72.txt",
    "content": "Tusky v11.\n\n- Notifications about new follow requests when your account is locked\n- New features that can be toggled on the Preferences screen:\n   - disable swiping between tabs\n   - show a confirmation dialog before boosting a toot\n   - show link previews in timelines\n- Conversations can now be muted\n- https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- Melloras na interface - podes mover lapela á zona inferior\n- Ao acalar unha usuaria, agora tamén podes decidir se acalas as súas notificacións\n- Podes seguir cantos cancelos queiras nunha única lapela de cancelos\n- Melloras no xeito en que se mostran as descricións do multimedia, útil para descricións moi longas\n...\nRexistro completo dos cambios en https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- soporte para notas do perfil (Mastodon >3.2.0)\n- soporte para anuncios da admin (Mastodon >3.1.0)\n\n- móstrase o avatar da túa conta seleccionada na barra de ferramentas principal\n- premendo no nome público nunha cronoloxía abre a páxina de perfil desa usuaria\n\n- corrección de múltiples erros e pequenas melloras\n- melloras nas traducións\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Recibe notificacións cando alguén que segues publica - preme na icona da campá no seu perfil! (Mastodon >3.3.0)\n- Os borradores en Tusky foron redeseñados para ser máis rápidos, amigables e con menos fallos.\n- Novo modo benestar que che permite limitar certas características engadidas a Tusky.\n- Tusky xa pode animar os emojis personalizados.\nRexistro completo dos cambios: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- As solicitudes de seguimento móstranse sempre no menú principal.\n- O selector para programar unha publicación ten un deseño consistente co resto da aplicación\nRexistro completo dos cambios: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/83.txt",
    "content": "Tusky v15.1\n\nEsta versión arranxa o problema coa descrición de imaxes\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/87.txt",
    "content": "Tusky v16.0\n\n- Cambiamos completamente a lóxica de carga da cronoloxía para facela máis rápida, con menos fallos e doada de manter.\n- Tusky pode animar os emojis personalizados en APNG & formato WebP Animado.\n- Arranxamos moitos problemas.\n- Soporte para Android 11\n- Novas traducións: Gaélico de Escocia, Galego, Ucraíno\n- Mellora nas traducións\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/89.txt",
    "content": "Tusky v17.0\n\n- \"Abrir como...\" agora está dispoñible no menú dos perfís da conta ao usar varias contas\n- O Acceso agora xestionase mediante WebView dentro da app\n- Soporte para Android 12\n- Soporte para a nova cofiguración da API das instancias de Mastodon\n- e un feixe de pequenas melloras e arranxos\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/91.txt",
    "content": "Tusky v18.0\n\n- Soporte para o novos tipos de notificación de Mastodon 3.5\n- A insignia de bot foi redeseñada e combina mellor co decorado seleccionado\n- Podes seleccionar texto na vista de detalles da publicación\n- Moitos arranxos adicionais, incluíndo o que non permitía acceder en Android <6\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/94.txt",
    "content": "Tusky 19.0\n\n- Soporte para Unified Push. Para activar a función tes que volver a acceder ás túas contas.\n- Agora aparece nas cronoloxías o número de respostas a unha publicación.\n- Podes recortar as imaxes cando escribes unha publicación.\n- Os perfís mostran a data na que foron creados.\n- Móstrase o título da lista na barra de ferramentas ao visualizala.\n- Arranxamos moitos fallos.\n- Melloras nas traducións.\n"
  },
  {
    "path": "fastlane/metadata/android/gl/changelogs/97.txt",
    "content": "Tusky 20.0\n\n- Nova icona da app por Dzuk https://dzuk.zone/\n- Podes seguir cancelos. Preme no cancelo e depois na icona da barra de ferramentas.\n- Soporte para Android 13\n- Cando escribes unha mensaxe podes seleccionar o idioma da publicación\n- Nos perfís, a lapela multimedia agora respecta o marcado como sensible e carga máis suavemente.\n- É posible establecer o foco nunha zona da imaxe antes de publicala\n- Nova opcións para mostrar o identificador de usuaria completo na barra de ferramentas\n"
  },
  {
    "path": "fastlane/metadata/android/gl/full_description.txt",
    "content": "Tusky é un cliente lixeiro para Mastodon, un servidor libre e de código aberto para a web social.\n\n• Material Design\n• Maioría das APIs de Mastodon implementadas\n• Soporte multi-conta\n• Decorado escuro e claro coa posibilidade de cambio automático segundo a hora do día\n• Borradores - compoñer toots e gardalos para máis tarde\n• Escoller entre varios estilos de emoji\n• Optimizado para todos os tamaños de pantalla\n• Completamente de código aberto - sen dependencias non-libres como os servizos de Google\n\nCoñece máis acerca de Mastodon, visita https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/gl/short_description.txt",
    "content": "Cliente multi conta para a rede social Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/gl/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/68.txt",
    "content": "टस्की v9.1\n\nयह रिलीज मस्तोडोन 3 के साथ संगतता सुनिश्चित करती है और प्रदर्शन तथा स्थिरता में सुधार करती है।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/short_description.txt",
    "content": "सोशल नेटवर्क मास्टोडन के लिए एक मल्टी अकाउंट क्लाइंट\n"
  },
  {
    "path": "fastlane/metadata/android/hi/title.txt",
    "content": "टस्की\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Támogatás bejegyzések szerkesztéséhez\n- Új beállítás az előnyben részesített olvasási irány állításához\n- Nagyobb médiaelőnézetek és új áfedés a leírásokkal rendelkező média jelzéséhez\n- Már lehetséges fiókokat hozzáadni listákhoz a profilnézetből is\nés sok más\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/103.txt",
    "content": "Tusky 22.0 beta 1\n\nÚj funkciók:\n\n- Trendi hashtag-ek megtekintése\n- Képleírás és fókuszpont szerkesztése\n- \"Frissítés\" menü az elérhetőségért\n- Mastodon v4 szűrők támogatása\n- Részletes különbségek mutatása, amikor egy bejegyzést szerkesztettek\n- Opció bejegyzés-statisztikák idővonalon való megjelenítésére\n\nJavítások:\n\n- Lejátszó vezérlőinek mutatása hangvisszajátszás közben\n- Bejegyzés hosszkalkuláció javítása\n- Mindig közzétesszük a képfeliratokat\n\nés még sok más\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/104.txt",
    "content": "Tusky 22.0 beta 2\n\nJavítások:\n\n- Javított értesítés-betöltési sebesség\n- Újra mutatjuk a 0/1/1+ a válaszoknál\n- Szűrőcímek mutatása, nem a kulcsszavaké a szűrt bejegyzéseken\n- Hibajavítás: egy bejegyzés megnyitása megnyithatott egy nem kapcsolódó hivatkozást\n- Mutassuk a \"Hozzáadás\" a megfelelő helyen, ha nincsenek szűrők\n- Különböző programleállások javítása\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/105.txt",
    "content": "Tusky 22.0 beta 3\n\nJavítások:\n\n- Szálak nézegetése közbeni programleállás javítása\n- Mastodon szűrők feldolgozása közbeni programleállás javítása\n- Profilokon a követési hivatkozások kattinthatóak\n- Androidos értesítés-kezelési frissítések\n  - Android értesítés a Mastodonról csak egyszer mutatandó\n  - Android értesítések Mastodon értesítési típus (követés, említés, megtolás, stb) szerint vannak csoportosítva\n  - Lehetséges értesítés-elhagyás megoldva\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/106.txt",
    "content": "Tusky 22.0 beta 4\n\nJavítások:\n\n- Több fiók használata esetén az értesítések újra történő lekérésének megoldása\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/107.txt",
    "content": "Tusky 22.0 beta 5\n\nJavítások:\n\n- APNG könytár vissza a régire a törött animált emojik javításáért\n- Értesítésjelző helyi mentése arra az esetre, ha a kiszolgáló nem támogatja az API-t\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/108.txt",
    "content": "Tusky 22.0 beta 6\n\nJavítások:\n\n- Értesítési fülön az olvasási pozíció gyakoribb mentése\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/109.txt",
    "content": "Tusky 22.0 beta 7\n\nJavítások:\n\n\n### Jelentős hibák\n\n- Minden fontos Mastodon értesítés lekérése, amikor Android értesítéseket hozunk létre\n- A \"Üzenetírás\" kattintása rossz fiókra vitt, megoldva\n- Annak biztosítása, hogy az \"utolsó olvasott értesítés azonosítója\" a helyes fiókba mentődjön\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/110.txt",
    "content": "Tusky 22.0\n\nÚj funkciók:\n\n- Felkapott hashtag-ek mutatása\n- Új hashtag-ek bekövetése\n- Jobb sorrendezés nyelvek választásakor\n- Bejegyzésverziók közötti különbségek mutatása\n- Mastodon v4 szűrők támogatása\n- Lehetőség bejegyzés-statisztikák mutatására az idővonalon\n- És sok más...\n\nJavítások:\n\n- Kiválasztott fül és pozíció megjegyzése\n- Értesítések megtartása az elolvasásig\n- Kevert balról jobbra és jobbról balra szöveg helyes mutatása a profilon\n- Bejegyzéshossz kiszámításának javítása\n- Képfeliratok publikálása minden esetben\n- És sok más..\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/111.txt",
    "content": "Tusky 23.0 beta 1\n\nÚj funkciók:\n\n- Új beállítás UI-szöveg nagyítására\n\nJavítások:\n\n- Fiókinfók helyes mentése\n- \"leküldési\" értesítések Android 11-nél régebbi eszközön\n- Androidos hibajavítás, ahol a szövegmezők \"elfelejtik\", hogy tudnak szöveget másolni\n- A \"különbségek\" mutatása a szerkesztési történetben nem túl nagy\n- Összeomlás elkerülése, ha a kiszolgáló nem ismeri a bejegyzés történetét\n- \"Törlés\" gomb hozzáadása, amikor szűrőt szerkesztünk\n- Nem kocka emojik helyes megjelenítése\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Az idővonalak szűrői szinkronizálódnak a szerverrel és bekerültek a fiók beállításaiba\n- A főképernyőn saját hashtaged lehet tabként\n- A listák szerkeszthetőek\n- Biztonság: TLS 1.0 és 1.1 eltávolítva, TLS 1.3 támogatása Android 6+-on\n- A szerkesztőnézet egyedi emojikat javasol a gépelés megkezdésekor\n- Új témabeállítás \"rendszertéma követése\"\n- Javított idővonalak\n- Új beállítások: Felülbírálható a rendszer nyelvbeállítása\n- Új fordítások: Cseh és Eszperantó\n- Rengeteg javítás\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Szavazás támogatása\n- Új gombok értesítések szűrésére és az összes törlésére\n- Tülkök törlése és újrafogalmazása\n- Új indikátor, mely mutatja a bot fiókokat (beállításokban kapcsolható)\n- Új fordítások: Norwegian, Bokmål és Slovenian.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Indíthatsz szavazást Tusky-ból\n- Fejlettebb keresés\n- Új opció a fiók beállításainál a tartalom-figyelmeztetések alapértelmezett mutatására\n- A navigációs fióknál az avataroknak lekerekített négyzet alakja van\n- Be lehet jelenteni olyan fiókokat is, akik még sosem posztoltak\n- A Tusky nem fog csatlakozni titkosítatlan kapcsolaton Android 6+-on\n- Egy rakás kisebb fejlesztés és bugfix\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/68.txt",
    "content": "Tusky v9.1\n\nEz a kiadás biztosítja a kompatibilitást a Mastodon 3-mal, valamint javítja a teljesítményt és a stabilitást.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Tülköket megjelölhetsz könyvjelzővel és ezeket listázhatod is.\n- Ütemezhetsz tülköket a Tuskyban. Az ütemezés legalább 5 perccel a jövőbe kell szóljon.\n- A fő képernyőhöz már listákat is hozzáadhatsz.\n- Posztolhatsz hangos csatolmányokat is.\n\nÉs sok egyéb apró fejlesztés és hibajavítás!\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- Értesítés új követési kérelemről akkor is, amikor a fiókod zárolva van\n- Új funkciók, melyek a beállításokban kapcsolhatóak:\n   - tabok közötti váltás csúsztatással\n   - megerősítés mutatása megtolás előtt\n   - link előnézet megjelenítése idővonalakon\n- Beszélgetések elnémíthatóak\n- A szavazások eredményét a szavazók száma alapján számoljuk a szavazatok száma helyett, így a többválaszos szavazások értelmezése könnyebb\n- Rengeteg hibajavítás (pl. tülkök írása)\n- Javított fordítás\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- Továbbfejlesztett kezelői felület - a füleket alulra is rakhatod\n- Ha egy felhasználót némítasz, külön dönthetsz arról, hogy a tőle érkező értesítéseket némítsd-e\n- Az új hashtag fülön annyi hashtaget követhetsz, amennyit csak akarsz\n- Továbbfejlesztettük a média leírások megjelenítését, így ez már nagyon hosszú leírásokra is jól működik\n    \nÖsszes változás: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- privát profilmegjegyzések támogatása (Mastodon 3.2.0 funkció)\n- adminisztrátori közlemények támogatása (Mastodon 3.1.0 funkció)\n\n- az éppen használt fiókod avatarja mostantól látszik az eszköztáron\n- az idővonalon egy profilra kattintva előjön a felhasználó profiloldala\n\n- rengeteg hibajavítás és apró fejlesztés\n- javított fordítások\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Értesítést kaphatsz, amikor egy követett felhasználó tülköl - csak kattints a csengő ikonra a profilján! (Mastodon 3.3.0 funkció)\n- A Tusky piszkozat funkcióját teljesen újraterveztük, hogy gyorsabb, felhasználóbarátabb, hibamentesebb legyen.\n- Az új jóllét üzemmód lehetővé teszi, hogy bizonyos Tusky funkciókat korlátozz.\n- A Tusky mostantól képes animálni az egyedi emojikat is.\nÖsszes változás: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- A követési kérelmeket mindig mutatjuk a főmenüben.\n- A posztok időzítésére használt időválasztó kinézete illeszkedik az app többi részéhez.\nÖsszes változtatás: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/83.txt",
    "content": "Tusky v15.1\n\nEz a kiadás javít egy képek feliratozása közben jelentkező összeomlást\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/87.txt",
    "content": "Tusky v16.0\n\n- Az idővonal betöltési logikáját teljesen újraírtuk, hogy gyorsabb, hibamentesebb és karbantarthatóbb legyen.\n- A Tusky már animálja az APNG és Animated WebP formátumú emodzsikat.\n- Sok hibajavítás\n- Android 11 támogatás\n- Új fordítások: skót, galíciai, ukrán\n- Javított fordítások\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/89.txt",
    "content": "Tusky v17.0\n\n- \"Megnyit, mint...\" már a fiókok profiljainak menüjében is elérhető, amikor több fiókot használsz\n- A bejelentkezés az appon belül már WebView-ban működik\n- Android 12 támogatása\n- új Mastodon szerverkonfigurációs API támogatása\n- sok más kisebb javítás és fejlesztés\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/91.txt",
    "content": "Tusky v18.0\n\n- Támogatás az új Mastodon 3.5 értesítési típusokhoz\n- A bot jelvény jobban néz ki és alkalmazkodik a választott témához\n- A szöveget már kiválaszthatod a bejegyzési részletek megtekintésénél is\n- Sok hibajavítás, beleértve egy olyat, mely megakadályozta a bejelentkezést Android 6-on vagy alatta\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/94.txt",
    "content": "Tusky 19.0\n\n- Egységes leküldés (Unified Push) támogatása. A támogatás aktiválásához újra jelentkezz be a fiókjaidba.\n- A bejegyzésekre érkezett válaszok száma már látható az idővonalon.\n- Bejegyzés szerkesztése közben meg lehet vágni a képeket.\n- A profilokon látható ezek létrehozásának időpontja.\n- Lista megtekintésekor ennek címe látható az eszköztáron.\n- Rengeteg hibajavítás\n- Fordítási javítások\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/97.txt",
    "content": "Tusky 20.0\n\n- Új App ikon, készítő Dzuk https://dzuk.zone/\n- A hashtagek már követhetőek. Kattints egy hashtagre aztán az ikonra az eszköztáron.\n- Android 13 támogatás\n- Új lenyíló a szerkesztőnézetben a bejegyzés nyelvének beállításához\n- A profil médiás füle már figyelembeveszi az érzékeny médiát is és finomabban töltődik be.\n- Már lehetséges egy kép fókuszpontját elküldés előtt beállítani\n- Új lehetőség a teljes felhasználói neved mutatására az eszköztáron\n"
  },
  {
    "path": "fastlane/metadata/android/hu/full_description.txt",
    "content": "A Tusky egy könnyűsúlyú kliens a Mastodonhoz, mely egy nyílt forráskódú közösségi hálózati kiszolgáló.\n\n• Material design\n• A legtöbb Mastodon API-t megvalósításra került\n• Többfiókos támogatás\n• Sötét és világos téma, valamint automatikus váltási lehetőség napszak szerint\n• Piszkozatok – tülkök készítése, és mentés későbbre\n• Emodzsi stílusok közötti választás\n• Minden képernyőméretre optimalizálva\n• Teljesen nyílt forráskód – nincsenek nem szabad függőségek, mint például a Google szolgáltatások\n\nTöbb információ a Mastodonról: https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/hu/short_description.txt",
    "content": "Többfiókos kliens a Mastodon közösségi hálóhoz\n"
  },
  {
    "path": "fastlane/metadata/android/hu/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Dukungan untuk mengedit postingan\n- Pengaturan baru untuk mengontrol arah bacaan yang diinginkan\n- Pratinjau media yang lebih besar dan tampilan overlay baru untuk menunjukkan media dengan deskripsi\n- Kini memungkinkan untuk menambahkan akun ke daftar dari profil mereka\ndan banyak lagi\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Filter timeline telah dipindahkan ke Preferensi Akun dan akan disinkronkan dengan server\n- Sekarang Anda dapat memiliki hashtag kustom sebagai tab di antarmuka utama\n- Daftar sekarang dapat diedit\n- Keamanan: dukungan untuk TLS 1.0 dan TLS 1.1 telah dihapus, dan dukungan untuk TLS 1.3 telah ditambahkan pada Android 6+\n- Tampilan tulisan sekarang akan menyarankan emoji kustom saat memulai mengetik\n- Pengaturan tema baru \"ikuti tema sistem\"\n- Aksesibilitas timeline yang ditingkatkan\n- Tusky sekarang akan mengabaikan notifikasi yang tidak diketahui dan tidak lagi mengalami crash\n- Pengaturan baru: Sekarang Anda dapat mengubah bahasa sistem dan mengatur bahasa yang berbeda di Tusky\n- Terjemahan baru: Ceko dan Esperanto\n- Banyak perbaikan dan peningkatan lainnya\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Dukungan untuk menampilkan jajak pendapat, voting, dan notifikasi jajak pendapat\n- Tombol baru untuk menyaring tab notifikasi dan menghapus semua notifikasi\n- Menghapus dan menyunting ulang toot Anda sendiri\n- Indikator baru yang menunjukkan jika akun adalah bot pada gambar profil (dapat dimatikan dalam preferensi)\n- Terjemahan baru: Norwegia Bokmål dan Slovenian.\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Kini Anda dapat membuat Polling dari Tusky\n- Pencarian yang ditingkatkan\n- Opsi baru dalam Preferensi Akun untuk selalu memperluas peringatan konten\n- Avatar di drawer navigasi sekarang memiliki bentuk kotak yang dibulatkan\n- Kini memungkinkan untuk melaporkan pengguna bahkan ketika mereka tidak pernah memposting status\n- Tusky sekarang akan menolak untuk terhubung melalui koneksi cleartext pada Android 6+\n- Banyak perbaikan kecil dan perbaikan bug lainnya\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/68.txt",
    "content": "Tusky v9.1\n\nRilis ini memastikan kompatibilitas dengan Mastodon 3 dan meningkatkan performa dan stabilitas.\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Anda sekarang dapat bookmark status & daftar bookmark Anda di Tusky.\n- Anda sekarang dapat menjadwalkan toot dengan Tusky. Perhatikan bahwa waktu yang Anda pilih harus setidaknya 5 menit di masa mendatang.\n- Anda sekarang dapat menambahkan daftar ke layar utama.\n- Anda sekarang dapat memposting lampiran audio dengan Tusky.\n\nDan banyak perbaikan kecil dan perbaikan bug lainnya!\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- Notifikasi tentang permintaan mengikuti baru ketika akun Anda terkunci\n- Fitur baru yang dapat dipilih di layar Preferensi:\n   - Nonaktifkan swipe antar tab\n   - Menampilkan dialog konfirmasi sebelum boosting sebuah toot\n   - Menampilkan pratinjau tautan dalam timeline\n- Percakapan sekarang dapat dimute\n- Hasil jajak pendapat sekarang akan dihitung berdasarkan jumlah pemilih dan bukan jumlah suara total yang membuat jajak pendapat multichoice lebih mudah dipahami\n- Banyak perbaikan bug, sebagian besar terkait dengan menyusun toot\n- Terjemahan yg diperbarui\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- Antarmuka utama yang ditingkatkan - sekarang Anda dapat memindahkan tab ke bagian bawah\n- Saat mem-mute pengguna, Anda sekarang dapat memutuskan apakah akan mem-mute notifikasi mereka\n- Anda sekarang dapat mengikuti sebanyak mungkin hashtag yang Anda inginkan dalam satu tab hashtag tunggal\n- Meningkatkan cara deskripsi media ditampilkan sehingga dapat bekerja bahkan untuk deskripsi yang sangat panjang\n    \nChangelog lengkap: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- Dukungan untuk catatan profil (fitur Mastodon 3.2.0)\n- Dukungan untuk pengumuman admin (fitur Mastodon 3.1.0)\n\n- Avatar akun yang dipilih sekarang akan ditampilkan di toolbar utama\n- Mengklik nama tampilan dalam timeline sekarang akan membuka halaman profil pengguna tersebut\n\n- Banyak perbaikan bug dan perbaikan kecil\n- Terjemahan yang ditingkatkan\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Dapatkan pemberitahuan saat pengguna yang diikuti memposting - klik ikon bel di profil mereka! (fitur Mastodon 3.3.0)\n- Fitur draf di Tusky telah sepenuhnya didesain ulang menjadi lebih cepat, lebih ramah pengguna, dan lebih sedikit buggy.\n- Mode kesejahteraan baru yang memungkinkan Anda membatasi fitur Tusky tertentu telah ditambahkan.\n- Tusky sekarang dapat menganimasikan emoji kustom.\nChangelog lengkap: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- Permintaan ikuti sekarang selalu ditampilkan di menu utama.\n- Pemilih waktu untuk menjadwalkan posting memiliki desain yang konsisten dengan aplikasi lainnya sekarang\nChangelog lengkap: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/83.txt",
    "content": "Tusky v15.1\n\nRilis ini memperbaiki crash saat memberi keterangan pada gambar\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/87.txt",
    "content": "Tusky v16.0\n\n- Logika pemuatan timeline telah sepenuhnya ditulis ulang agar lebih cepat, lebih sedikit buggy dan lebih mudah dipelihara.\n- Tusky sekarang dapat menganimasikan emoji khusus dalam format APNG & Animated WebP.\n- Banyak perbaikan bug\n- Dukungan untuk Android 11\n- Terjemahan baru: Gaelik Skotlandia, Galicia, Ukraina\n- Terjemahan yang ditingkatkan\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/89.txt",
    "content": "Tusky v17.0\n\n- \"Buka sebagai...\" kini tersedia di menu pada profil akun saat menggunakan beberapa akun\n- Login sekarang ditangani di WebView dalam aplikasi\n- Dukungan untuk Android 12\n- Dukungan untuk API konfigurasi instans Mastodon baru\n- dan banyak perbaikan dan peningkatan kecil lainnya\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/91.txt",
    "content": "Tusky v18.0\n\n- Dukungan untuk tipe notifikasi baru pada Mastodon 3.5\n- Lencana bot sekarang terlihat lebih baik dan menyesuaikan dengan tema yang dipilih\n- Teks sekarang dapat dipilih pada tampilan detail posting\n- Memperbaiki banyak bug, termasuk yang mencegah login di Android 6 dan lebih rendah\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/94.txt",
    "content": "Tusky 19.0\n\n- Dukungan untuk Unified Push. Untuk mengaktifkan dukungan ini, Anda harus masuk kembali ke akun Anda.\n- Jumlah tanggapan terhadap sebuah posting sekarang ditunjukkan di timeline.\n- Gambar sekarang dapat dengan dipotong saat menulis sebuah postingan.\n- Profil sekarang menunjukkan tanggal dibuatnya.\n- Saat melihat daftar, judul sekarang ditampilkan di toolbar.\n- Banyak perbaikan bug\n- Peningkatan terjemahan\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/97.txt",
    "content": "Tusky 20.0\n\n- Ikon Aplikasi Baru oleh Dzuk https://dzuk.zone/\n- Anda sekarang dapat mengikuti hashtag. Klik pada hashtag dan kemudian pada ikon di toolbar.\n- Dukungan untuk Android 13\n- Dropdown baru dalam tampilan tulis untuk mengatur bahasa posting\n- Tab media di profil sekarang menghormati media sensitif dan memuat lebih lancar.\n- Sekarang dimungkinkan untuk menetapkan titik fokus gambar sebelum memposting\n- Opsi baru untuk menampilkan nama pengguna lengkap Anda di toolbar\n"
  },
  {
    "path": "fastlane/metadata/android/id/full_description.txt",
    "content": "Tusky adalah klien ringan untuk Mastodon, server jejaring sosial gratis dan sumber terbuka.\n\n• Desain Material\n• Sebagian besar API Mastodon diimplementasikan\n• Dukungan Multi-Akun\n• Tema gelap dan terang dengan kemungkinan untuk beralih otomatis berdasarkan waktu hari\n• Draf - buat toot dan simpan untuk nanti\n• Pilih antara gaya emoji yang berbeda\n• Dioptimalkan untuk semua ukuran layar\n• Sepenuhnya open-source - tidak ada dependensi non-gratis seperti layanan Google\n\nUntuk mempelajari lebih lanjut tentang Mastodon, kunjungi https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/id/short_description.txt",
    "content": "Klien multi akun untuk jejaring sosial Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/id/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/is/changelogs/127.txt",
    "content": "Tusky 27.0\n\n- Tusky hefur verið endurhannað með Material 3\n- Stuðningur við stefnur varðandi tilkynningar (Mastodon 4.3 eiginleiki)\n- Myllumerki í enda færslna birtast nú á sérstakri stiku\n- Fullur stuðningur við samanbrjótanleg tæki\n\nSkoðaðu https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md til að sjá alla breytingaskrána\n"
  },
  {
    "path": "fastlane/metadata/android/is/changelogs/58.txt",
    "content": "Tusky útg. 6\n\n- Tímalínusíur hafa verið færðar í kjörstillingar notandaaðgangs og munu samstillast við vefþjón\n- Nú geturðu haft sérsniðið myllumerki sem flipa í aðalviðmóti\n- Hægt er að breyta listum\n- Öryggi: fjarlægður stuðningur við TLS 1.0 og TLS 1.1, bætt við stuðningi við TLS 1.3 á Android 6+\n- Semja-sýnin stingur núna upp á sérsniðnum tjáningartáknum þegar byrjað er að skrifa\n- Ný stilling á þema \"nota þema kerfis\"\n- Bætt aðgengi að tímalínu\n- Tusky mun núna hunsa óþekktar tilkynningar\n"
  },
  {
    "path": "fastlane/metadata/android/is/changelogs/61.txt",
    "content": "Tusky útg7.0\n\n- Stuðningur við birtingu kannana, atkvæðagreiðslu og tilkynningar vegna kannana\n- Nýjir hnappar til að sía tilkynningaflipa og til að eyða öllum tilkynningunum\n- Eyða og endurvinna eigin tíst\n- Nýtt merki á auðkennismynd sýnir hvort aðgangur sé róbót (hægt að slökkva á þessu í kjörstillingum)\n- Nýjar þýðingar: Norskt bókmál og Slóvenska.\n"
  },
  {
    "path": "fastlane/metadata/android/is/changelogs/67.txt",
    "content": "Tusky útg9.0\n\n- Nú geturðu útbúið kannanir í Tusky\n- Bætt leit\n- Nýr valkostur í kjörstillingum að fletta alltaf út aðvaranir vegna efnis\n- Auðkennismyndir í leiðsagnarsleða eru núna ferningslaga og rúnnaðar\n- Núna er hægt að kæra notendur án þess að þeir hafi sent inn stöðufærslu\n- Tusky mun núna neita að tengjast með ódulrituðum (cleartext) tengingum á Android 6+\n- Margar smærri endurbætur og lagfæringar á villum\n"
  },
  {
    "path": "fastlane/metadata/android/is/changelogs/68.txt",
    "content": "Tusky útg. 9.1\n\nÞessi útgáfa tryggir samhæfni við Mastodon 3 og bætir afköst og stöðugleika.\n"
  },
  {
    "path": "fastlane/metadata/android/is/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Þú getur núna bókamerkt stöðufærslur og gert lista með bókamerkjunum þínum í Tusky.\n- Þú getur núna sett tíst á áætlun í Tusky. Athugaðu að tíminn sem þú velur þarf að vera í það minnsta efti 5 mínútur.\n- Þú getur núna bætt listum á aðalskjáinn.\n- Þú getur núna sent in hljóðskrár sem viðhengi í Tusky.\n\nAuk hellings af smærri lagfæringum og bætingum!\n"
  },
  {
    "path": "fastlane/metadata/android/is/changelogs/72.txt",
    "content": "Tusky útg. 11.0\n\n- Tilkynningar um nýjar fylgjendabeiðnir þegar aðgangur þinn er í lás\n- Nýir eiginleikar sem hægt er að víxla af/á í kjörstillingum:\n   - strokur milli flipa óvirkar\n   - staðfesting áður en tíst er endurbirt\n   - birta forskoðun tengla á tímalínum\n- Hægt er að þagga niður í samtölum\n- Niðurstöður kannana reiknast núna út frá fjölda kjósenda en ekki atkvæðum \n- Margar villur lagaðar, flestar varðandi samningu tísta\n- Bættar þýðingar\n"
  },
  {
    "path": "fastlane/metadata/android/is/changelogs/74.txt",
    "content": "Tusky útg. 12.0\n\n- Bætt aðalviðmót - hægt að færa flipa neðst\n- Þegar þaggað er niður í notanda er núna hægt að ákveða hvort líka sé þaggað niður í tilkynningum frá honum\n- Nú er hægt að fylgjast með eins mörgum myllumerkjum og maður vill í hverjum myllumerkis-flipa\n- Bett leið við að birta lýsingar á myndefni, þannig að núna virka mjög langar lýsingar\n    \nFull breytingaskrá: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/is/changelogs/77.txt",
    "content": "Tusky útg. 13.0\n\n- stuðningur við minnispunkta í sniðum (Mastodon 3.2.0 eiginleiki)\n- stuðningur við tilkynningar frá stjórnendum (Mastodon 3.1.0 eiginleiki)\n\n- auðkennismynd úr völdum aðgangi birist núna í aðalverkfærastikunni\n- smellt á birtingarnafn á tímalínu opnar núna notandasniðssíðu þess notanda\n\n- hellingur að villulagfæringum og minni betrumbótum\n- bættar þýðingar\n"
  },
  {
    "path": "fastlane/metadata/android/is/changelogs/80.txt",
    "content": "Tusky útg. 14.0\n\n- Fáðu tilkynningu þegar notandi sem þú fylgir birtir færslu - smelltu á bjöllutáknið í sniðinu hans! (Mastodon 3.3.0 eiginleiki)\n- Gerð draga í Tusky hefur verið endurhönnuð til að verða fljótlegri, notendavænni og gallalaus.\n- Bætt hefur verið við sérstökum vellíðunarham til að takmarka ákveðna eiginleika Tusky.\n- Tusky getur núna hreyft sérsniðin tjáningartákn.\nFull breytingaskrá: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/is/changelogs/82.txt",
    "content": "Tusky útg. 15.0\n\n- Fylgjendabeiðnir eru núna alltaf birtar í aðalvalmyndinni.\n- Val tíma áætlaðra færslna hefur verið endurhönnuð til samræmis við aðra hluta forritsins.\nFull breytingaskrá: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/is/changelogs/83.txt",
    "content": "Tusky útg.15.1\n\nÞessi útgáfa lagfærir hrun þegar skýringatexti er settur á myndefni\n"
  },
  {
    "path": "fastlane/metadata/android/is/changelogs/87.txt",
    "content": "Tusky útg.16.0\n\n- Aðferðin við hleðslu tímalínu hefur verið endurskrifuð til að vera hraðari og einfaldari í viðhaldi.\n- Tusky getur núna hreyft sérsniðin emoji-tákn á APNG & Animated WebP sniði.\n- Mikið af smávægilegum göllum leystir\n- Stuðningur við Android 11\n- Nýjar þýðingar: Skosk gelíska, Galisíska, Úkraínska\n- Bættar þýðingar\n"
  },
  {
    "path": "fastlane/metadata/android/is/changelogs/89.txt",
    "content": "Tusky útg.17.0\n\n- \"Opna sem...\" er núna líka á valmyndinni í notendasniðum þegar verið er að nota marga aðganga\n- Innskráning er núna meðhöndluð í WebView innan forritsins\n- Stuðningur við Android 12\n- Stuðningur við API-kerfisviðmót fyrir nýja uppsetningu Mastodon-tilvika\n- og mökkur af smærri endurbótum og lagfæringum\n"
  },
  {
    "path": "fastlane/metadata/android/is/full_description.txt",
    "content": "Tusky er léttkeyrandi forrit fyrir Mastodon, frjálsa og opna samfélagsnetsþjóninn.\n\n• Material Design hönnun\n• Flestar Mastodon API-skipanir\n• Margir notendaaðgangar\n• Dökk og ljós þemu með möguleika á sjálfvirkti skiptingu eftir tíma sólarhrings\n• Drög - semja tíst og senda síðar\n• Val milli mismunandi stíla emoji-tákna \n• Bestað fyrir allar skjástærðir\n• Algerlega frjáls hugbúnaður - ekki háð ófrjálsum tilföngum eins og t.d. Google-þjónustum\n\nTil að vita meira um Mastodon, kíktu á https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/is/short_description.txt",
    "content": "Margnotenda forrit fyrir Mastodon samfélagsnetið\n"
  },
  {
    "path": "fastlane/metadata/android/is/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Supporto per la modifica dei toot\n- Nuova impostazione per selezionare la direzione di lettura preferita\n- Anteprima dei media più grande e nuovo overlay per indicare i media con una descrizione\n- È ora possibile account alle liste dal loro profilo\ne molto altro\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/123.txt",
    "content": "Tusky 26\n\n- Il colore primario blu è stato leggermente cambiato per un contrasto migliore.\n- Il contenuto della tab \"Notifiche\" ora viene salvato in cache per un miglior comportamento offline.\n- Nuova preferenza dell'account \"Privacy delle risposte predefinita\".\n- Diversi miglioramenti per la stabilità e le prestazioni\nVedi https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md per il changelog completo\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/124.txt",
    "content": "Tusky 26.1\n\n- Nelle preferenze \"Privacy risposte\" dell'account ora ci sono due nuove opzioni addizionali: \"Stessa privacy predefinita del post\" e \"Diretto\".\n- Tusky ora include certificati root ISRG per continuare a funzionare su Android 7 e sui server che usano Let's Encrypt.\n- Corretto un bug in cui alle volte Tusky mostrava timelines e notifiche per diversi account.\nVedi https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md per il changelog completo\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/127.txt",
    "content": "Tusky 27.0\n\n- Tusky è stato riprogettato con Material 3\n- Supporto per le Impostazioni delle notifiche (funzione di Mastodon 4.3)\n- Gli hashtag alla fine del post ora vengono mestruati in una barra separata\n- Completo supporto per i dispositivi pieghevoli\n\nVedi https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md per la lista completa delle modifiche\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/131.txt",
    "content": "Tusky 28.0\n\n- Supporto per Android 15 e schermi edge-to-edge\n- Migliorata l'affidabilità delle notifiche push\n- Le risposte ora sono indicate chiaramente nelle timeline\n- Diversi miglioramenti nella resa visiva delle notifiche nella tab Notifiche\n- Le carte di anteprima dei link hanno un nuovo aspetto e supportano la funzionalità fediverse:creator\n\nVedi https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md per il changelog completo\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/133.txt",
    "content": "Tusky 29.0\n\n- Nuove icone\n- Lo stile dei sondaggi è migliorato ed è stato aggiunto un pulsante \"Mostra risultati\"\n- Supporto per il l'azione del filtro \"sfoca\" (funzione di Mastodon 4.4)\n- La qualità delle immagini è migliorata\n- Un dialogo aggiuntivo previente la chiusura del dialogo di avviso per aggiungere testo alternativo\n- Ricondivisioni e preferiti confermati da un tasto, invece che da una tendina\n\nVedi https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md per le tutte le modifiche\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- I filtri della timeline sono stati spostati in Preferenze Utente e si sincronizzeranno con il server\n- Ora è possibile avere un hashtag personalizzato come scheda nell'interfaccia principale\n- Le liste possono ora essere modificate\n- Sicurezza: rimosso il supporto per TLS 1.0 e TLS 1.1.1, e aggiunto il supporto per TLS 1.3 su Android 6+.\n- La vista della composizione suggerirà ora le emojis personalizzate quando si inizia a digitare\n- Nuova impostazione del tema \"Segui il tema del sistema\"\n- Migliorata accessibilità della timeline\n- Tusky ignorerà le notifiche ignote e non andrà in crash\n- Nuova impostazione: puoi selezionare una lingua su Tusky anche se differente da quella delle impostazioni del telefono\n- Nuove traduzioni: ceco ed esperanto\n- Molti altri miglioramenti e correzioni\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Supporto per la visualizzazione di sondaggi, voti e relative notifiche\n- Nuovi bottoni per filtrare le notifiche ed eliminarle tutte\n- Cancella e riscrivi i tuoi toots\n- Nuovo indicatore che mostra sull'immagine del profilo se un account è un bot (può essere disattivato nelle preferenze)\n- Nuove traduzioni: Norvegese Bokmål e sloveno.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Ora puoi creare sondaggi da Tusky\n- Ricerca migliorata\n- Nuova opzione in Preferenze Account per espandere sempre i contenuti sensibili\n- Gli avatar nel cassetto di navigazione ora hanno una forma quadrata arrotondata\n- Ora è possibile segnalare gli utenti anche quando non hanno mai pubblicato uno stato\n- Tusky ora rifiuterà di connettersi tramite connessioni in chiaro su Android 6+\n- Molti altri piccoli miglioramenti e correzioni di bug\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/68.txt",
    "content": "Tusky v9.1\n\nQuesta versione assicura la compatibiliità con Mastodon 3 e migliora prestazioni e stabilità.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Ora puoi contrassegnare gli stati ed elencare i tuoi segnalibri in Tusky.\n- Ora puoi programmare i tuoi toot con Tusky. Tieni presente che il tempo selezionato deve essere di almeno 5 minuti in futuro.\n- Ora puoi aggiungere elenchi alla schermata principale.\n- Ora puoi pubblicare allegati audio con Tusky.\n\nE molti altri piccoli miglioramenti e correzioni di bug!\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- Interfaccia principale migliorata - ora puoi spostare le schede in basso\n- Quando si disattiva l'audio di un utente, ora è possibile anche decidere se disattivare l'audio delle sue notifiche\n- Ora puoi seguire tutti gli hashtag che desideri in una singola scheda hashtag\n- Migliorata la modalità di visualizzazione delle descrizioni dei media in modo che funzioni anche per descrizioni molto lunghe\n\nLog delle modifiche completo: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- supporto per le note del profilo (funzionalità di Mastodon 3.2.0)\n- supporto per gli annunci dell'amministratore (funzionalità di Mastodon 3.1.0)\n\n- l'avatar del tuo account selezionato verrà ora mostrato nella barra degli strumenti principale\n- facendo clic sul nome visualizzato in una timeline si aprirà ora la pagina del profilo di quell'utente\n\n- molte correzioni di bug e piccoli miglioramenti\n- traduzioni migliorate\n"
  },
  {
    "path": "fastlane/metadata/android/it/full_description.txt",
    "content": "Tusky è un client leggero per Mastodon, un server di social network libero e open source.\n\n• Material Design\n• Implementa la maggior parte delle API di Mastodon\n• Supporto multi-account\n• Tema scuro e chiaro con possibilità di modificarlo automaticamente in base all'ora del giorno\n• Bozze - componi i toots e salvali per dopo\n• Scegli tra diversi stili di emoji\n• Ottimizzato per gli schermi di tutte le dimensioni\n• Completamente open source - nessuna dipendenza non libera come i servizi di Google\n\nPer saperne di più su Mastodon, visita https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/it/short_description.txt",
    "content": "Un client multi account per il social network Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/it/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/ja/changelogs/68.txt",
    "content": "Tusky v9.1\n\nこのリリースでは、Mastodon 3との互換性が確保され、パフォーマンスと安定性が向上しています。\n"
  },
  {
    "path": "fastlane/metadata/android/ja/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Tuskyでブックマークの登録、表示が行えるようになりました。\n- You can now schedule toots with Tusky. Note that the time you select has to be at least 5 minutes in the future.\n- You can now add lists to the main screen.\n- Tuskyで音声ファイルを投稿出来るようになりました。\n\nその他、多くの細かな改善とバグの修正を行いました！\n"
  },
  {
    "path": "fastlane/metadata/android/ja/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- メインインタフェースの改善 - タブを下部に移動できるようになりました\n- ユーザーをミュートする際、通知もミュートすることができるようになりました\n"
  },
  {
    "path": "fastlane/metadata/android/ja/full_description.txt",
    "content": "Tuskyは、自由でオープンソースのソーシャルネットワークサーバーであるMastodon用の動作の高速なクライアントです。\n\n• マテリアルデザイン\n• ほとんどのMastodon APIに対応\n• マルチアカウント対応\n• 時刻に基づいて自動変更可能なダークテーマとライトテーマ\n• 下書き - トゥートを作成し、保存しておく\n• 異なる絵文字形式を選択可能\n• すべての画面サイズに最適化\n• 完全にオープンソース - Googleサービスのような自由でない依存関係はありません\n\nMastodonの詳細についてはこちらをご覧ください：https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/ja/short_description.txt",
    "content": "複数アカウントで利用可能なMastodonクライアント\n"
  },
  {
    "path": "fastlane/metadata/android/ja/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/kab/short_description.txt",
    "content": "Asnas isefraken aget-imiḍanen n uẓeṭṭa n tmetti Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/kab/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- 타임라인 필터를 계정 설정으로 이동/서버와 동기화 기능 추가\n- 메인 인터페이스의 탭으로 커스텀 해시태그에 관련된 게시물을 모아보는 기능 추가\n- 리스트 수정 기능 추가\n- 보안: TLS 1.0과 TLS 1.1 지원 종료, Android 6 이상에 대해 TLS 1.3 지원 추가\n- 게시물 작성 화면에서, 수동으로 커스텀 이모지 입력 시 입력 제안 표시 기능 추가\n- 테마 설정을 시스템 기본값에 따르게 할 수 있습니다. \n- 타임라인 접근성 향상\n- 알 수 없는 알림으로 인해 강제 종료되는 문제 수정\n- 설정 추가: 어플리케이션 언어를 시스템 언어 이외의 다른 언어로 설정 가능\n- 번역 추가: 체코어, 에스페란토\n- 기타 자잘한 기능 향상과 버그 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- 투표 기능 부분적 지원\n- 알림 필터, 알림 지우기 버튼 추가\n- 툿 지우고 다시 쓰기 기능 추가\n- 계정 아바타에 봇 구분자 표시 기능 추가 (설정에서 비활성화 가능)\n- 번역 추가: 노르웨이어(보크몰), 슬로베니아어.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- 이제 Tusky에서 투표를 만들 수 있습니다.\n- 검색 기능이 개선되었습니다.\n- 이제 계정 설정에서 컨텐츠 경고(CW)를 항상 연 상태로 설정할 수 있습니다.\n- 네비게이션 바의 프로필 이미지가 사각형으로 바뀌었습니다.\n- 이제 툿이 없는 이용자를 신고할 수 있습니다.\n- 안드로이드 6 이상에서 일반 텍스트를 통한 연결을 거부하기 시작합니다.\n- 그 외 자잘한 기능 개선과 버그를 해결하였습니다\n"
  },
  {
    "path": "fastlane/metadata/android/ko/full_description.txt",
    "content": "Tusky는, 무료 오픈 소스 SNS인 Mastodon에 접속하기 위한 가벼운 클라이언트입니다.\n\n• 머터리얼 디자인\n• Mastodon API을 대거 활용\n• 다중 계정 지원\n• 밝은 테마/어두운 테마 지원. 시간대에 따라 자동 변경 가능\n• 쓰던 게시물을 임시 저장\n• 여러 이모지 스타일 중에서 선호하는 모양 선택 가능\n• 다양한 화면 크기 지원\n• 100% 오픈 소스 - Google 서비스와 같은 상용 구성 요소를 배제\n\nMastodon에 대한 자세한 사항은 https://joinmastodon.org/ 를 참조하세요\n"
  },
  {
    "path": "fastlane/metadata/android/ko/short_description.txt",
    "content": "Mastodon 유저를 위한 다중 계정 클라이언트\n"
  },
  {
    "path": "fastlane/metadata/android/ko/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/lv/short_description.txt",
    "content": "Vairāku kontu klients Mastodon sociālajam tīklam\n"
  },
  {
    "path": "fastlane/metadata/android/lv/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Støtte for postendringer \n- Ny innstilling for å styre ønsket leseretning \n- Større mediaforhåndsvisninger og et nytt overlegg for å indikere media med beskrivelse \n- Det er nå mulig å legge til kontoer til lister ifra dere profil\nog mye mer\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/103.txt",
    "content": "Tusky 22.0 beta 1\n\nFunksjoner som\n\n- Se trendy emneknagger\n- Endre bildebeskrivelser og fokuspunkt\n- \"oppdateringmeny\" for tilgjengelighet\n- Support Mastodon v4 filtre\n- Vis detaljerte endringer når en post har blitt endret\n- Mulighet til å vise poststatistikk i tidslinjen\n\nFikser som:\n\n- Vis avspillingskontroll mens lyd blir avspillt\n- Riktig postlengdekalkulasjon\n- Publisér alltid bildetekster\n\nog mye mer\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/104.txt",
    "content": "Tusky 22.0 beta 2\n\nNye fikser:\n\n- Forbedret fart for lasting av varler\n- 0/1/1+ vises igjen for svar\n- Vis filtertitler ikke filterord på filtrede poster\n- Fikset en bug som ved åpning av status kunne åpne en urelatert lenke\n- Vis \"legg til\"-knappen på riktig plass når det ikke er noen filtre\n- Fikse diverse krasj\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/105.txt",
    "content": "Tusky 22.0 beta 3 \n \nFikser som: \n \n- Fikset krasj ved visning av en tråd \n- Fikset krasj ved behandilg av Mastodonfiltre \n- Lenker i beskrivelser av følgere/følgerforespørsler er klikkbare \n- Android varselsoppdateringer \n  - Androidvarsler for mastodonvarsler skal bare bli vist én gang\n  - Androidvarsler blir gruppert etter mastodonvarselstype (følger, nevnt, delt osv)\n  - Mulighet for savnede varsler har blitt fjernet.\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/106.txt",
    "content": "Tusky 22.0 beta 4 \n \nFikser: \n \n- Fikset gjentagene henting av varsler dersom flere kontoer er konfigurért\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/107.txt",
    "content": "Tusky 22.0 beta 5 \n \nFikser: \n \n- Tilbakestillt APNG-bibliotek for å fikse ødelagte animerte emoji \n- Lagre lokal kopi av varslingsmerker hvis serveren ikke støtter APIet\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/108.txt",
    "content": "Tusky 22.0 beta 6 \n \nFikser: \n \n- Lagre leseposisjon i varslingsfanen oftere\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/109.txt",
    "content": "Tusky 22.0 beta 7 \n \nFikser: \n  \n### Betydningsfulle bugfikser \n   \n- Hent alle forblivende Mastodonvarsler når androidvarsler lages \n- Hvis du klikker på \"Skriv\" fra et varsel ble feil konto valgt \n- Sikkerstille at \"Sist lest ID\" er lagret till rett konto\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/110.txt",
    "content": "Tusky 22.0 \n  \nNye funksjoner:  \n  \n- Vis trendy emneknagger  \n- Følge nye emneknagger \n- Bedre rekkefølge ved valg av språk \n- Vis forskjellen mellom versoner av en tut  \n- Støtter nå mastodon v4 filtre \n- Mulighet til å vise poststatistikk i tidslinjen \n- Og mere...  \n  \nFikser: \n \n- Husk valgt fane og posisjon\n- Behold varsler til de er lest\n- Riktig visning av mikset HTV og VTH tekst i profiler \n- Riktig postlengdeberegning \n- Publisér alltid bildebeskrivelser \n- Og mer.\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/111.txt",
    "content": "Tusky 23.0 beta 1 \n  \nNye funksjoner: \n  \n- Ny instilling for å skalére tekst i brukergrenesnittet. \n  \nFikser:  \n \n- Lagre kontoinformasjon korrekt  \n- \"Pull\" varsler på enheter som har androidversjoner <= 11  \n- Unnvik androidbug der hvor tekstfelt kunne \"glemme\" at de kann klippe/lime  \n- Vise \"differ\" i endringshistorien blir ikke forlenget over skjermkanten  \n- Ikke krasj dersom tjeneren din ikke har postendringshistorie  \n- Legg til en \"Slette\"-knapp ved endring av et filter  \n- Vis ikke-firkantede emojier riktig\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Tidslinjefiltre er flyttet til kontoinnstillinger, og vil nå synkroniseres med server\n- Du kan nå legge til emneknagger som egne faner\n- Lister kan nå endres\n- Sikkerhet: Fjernet støtte for TLS 1.0 og TLS 1.1, og la til støtte for TLS 1.3 på Android 6+\n- Når du komponerer et toot vil det foreslås emojis mens du skriver\n- Ny applikasjonstemainnstilling \"Bruk systeminnstillinger\"\n- Forbedret tilgjengelighet i tidslinjen\n- Mange andre forbedringer og feilrettinger\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Støtte for avstemninger.\n- Nye knapper for å filtrere varslinger, og for å slette alle varslinger\n- Slett og skriv dine egne toots på nytt\n- Bot-kontoer er nå markert (markeringen kan skrus av)\n- Nye språk: Norsk (bokmål) og slovensk.\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Du kan nå opprette avstemninger fra Tusky\n- Forbedret søk\n- Det er nå mulig å alltid utvide innholdsadvarsler.\n- Kontobilder har alltid runde kanter\n- Det er nå mulig å rapportere bruker som aldri har publisert et toot\n- Tusky vil ikke lenger koble til over HTTP på Android 6 og nyere\n- Flere mindre forbedringer og feilrettinger\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/68.txt",
    "content": "Tusky v9.1\n\nDenne versjonen sørger for kompatibilitet med Mastodon 3, og forbedrer ytelse og stabilitet.\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Du kan nå legge til statuser som bokmerker, og se bokmerkene i Tusky.\n- Du kan nå planlegge et toot for publisering i framtiden.\n- Du kan nå legge til lister på hovedskjermen.\n- Du kan nå publisere lydvedlegg med Tusky.\n\nI tillegg er det mange andre mindre forbedringer og feilrettinger!\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- Varsel om nye følgere når kontoen din er låst og nye følgere må godkjennes\n- Ny funksjonalitet som kan skrus av og på i innstillinger:\n   - Sveiping mellom faner\n   - Bekreftelsesdialog før boosting av et toot\n   - Forhåndsvisning av linker i tidslinjer\n- Samtaler kan nå bli dempet\n- Resultatet av avstemninger vil bli kalkulert basert på antall personer som har stemt og ikke på antall stemmer\n- Mange feilfikser, de fleste relatert til skriving av toots\n- Oppdaterte oversettelser\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- Fanene kan nå flyttes til bunnen av applikasjonen\n- Når en bruker dempes kan du også velge å dempe varslinger fra brukeren\n- Du kan følge så mange stikkord du ønsker i en enkelt stikkordfane\n- Forbedret måten mediabeskrivelser fungerer på slik at de også fungerer på veldig lange beskrivelser\n    \nKomplett endringslogg: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- støtte for profilnotater (Mastodon 3.2.0-funksjonalitet)\n- støtte for administratorkunngjøringer (Mastodon 3.1.0-funksjonalitet)\n\n- avataren som tilhører valgt konto vil nå vises på hovedverktøylinjen\n- trykk på en brukers visningsnavn i tidslinjen vil åpne profilen til brukeren\n\n- mange feilrettinger og mindre forbedringer\n- forbedrede oversettelser\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Mulighet for å bli varslet dersom en bruker du følger publiserer en ny toot - trykk på bjelle-ikonet på profilen deres (krever Mastodon 3.3.0)\n- Ny og forbedret kladd-funksjonalitet.\n- Velværemodus: Kan brukes til å begrense utvalgt funksjonalitet i Tusky. Du kan aktivere velværemodus i innstillinger.\n- Støtte for animerte emojis. Dette er skrudd av som standard, men du kan skru det på i innstillinger.\n- Komplett endringelogg: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- Følgeforespørsler vises nå alltid i hovedmenyen\n- Designet på tidsvelgeren som brukes for planlegge toots er likt som resten av appen\nFull liste med endringer: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/83.txt",
    "content": "Tusky v15.1\n\nDenne versjonen retter en programfeil ved skriving av bildetekst\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/87.txt",
    "content": "Tusky v16.0\n\n- Tidslinjelogikken er skrevet om, og er nå raskere, med færre feil og enklere å vedlikeholde\n- Tusky kan nå animere egendefinerte emojis i formatene APNG og Animated WebP\n- Mange feilrettinger\n- Støtte for Android 11\n- Nye oversettelser: Skotsk-gælisk, galisisk, ukrainsk\n- Oppdaterte oversettelser\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/89.txt",
    "content": "Tusky v17.0\n\n- \"Åpne som...\" er nå også tilgjengelig i profil-menyen når flere profiler er i bruk\n- Innlogging blir nå gjort ved hjelp av WebView i applikasjonen\n- Støtte for Android 12\n- Støtte for Mastodons nye instanskonfigurasjons-APIet\n- og mange andre små fikser og forbedringer\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/91.txt",
    "content": "Tusky v18.0\n\n- Støtte for Mastodon 3.5-varslingstyper\n- Bot-symbolet ser nå bedre ut og endrer seg basert på valgt tema\n- Det er nå mulig å markere tekst i skjermbildet som viser innleggsdetaljer\n- Fikset flere feil, inkludert en som hindret innlogging på Android 6 og eldre versjoner\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/94.txt",
    "content": "Tusky 19.0\n\n- Støtte for Unified Push. For å aktivisere dette må du logg inne på kontoene dine på nytt.\n- Antall tilbakemeldinger på et innlegg vises nå i tidslinjene.\n- Bilder kan nå beskjæres når innlegget opprettes.\n- Dato nå en profil ble opprettes vises.\n- Visning av liste viser nå navnet på listen i verktøylinjen.\n- En mengde feilfikser.\n- Oppdaterte oversettelser.\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/97.txt",
    "content": "Tusky 20.0\n\n- Nytt applikasjonsikon av Dzuk https://dzuk.zone/\n- Du kan nå følge stikkord. Klikk på et stikkord, og deretter ikonet i verktøylinjen.\n- Støtte for Android 13\n- Ny nedtrekksliste for å konfigurere hvilket språk et innlegg er skrevet på\n- Media-fanen i profilvisning håndterer nå sensitivt media og laster fortere\n- Det er nå mulig å sette fokuspunkt på et bilde før det publiseres\n- Mulighet for å vise ditt fulle navn på verktøylinjen\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/full_description.txt",
    "content": "Tusky er en lettvektsklient for Mastodon, et gratis/libre sosialt nettverk basert på åpen kildekode.\n\n• Material Design\n• Støtter det meste av Mastodon-funksjonalitet\n• Støtte for flere samtidige kontoer\n• Mørkt og lyst fargetema med muligheten for å bytte automatisk på bestemte tider på døgnet\n• Kladder - skriv toots, og lagre dem til senere\n• Velg mellom forskjellige emoji-stiler\n• Optimalisert for alle skjermstørrelser\n• Fullstendig åpen kildekode - ingen lukkede avhengigheter, som Google-tjenester\n\nOm du vil vite mer om Mastodon, gå til https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/short_description.txt",
    "content": "En multikonto-klient for det sosiale nettverket Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- berichten bewerken is nu mogelijk\n- nieuwe instellingen ivm je favoriete leesrichting\n- grotere previews van media en een nieuwe aanduiding voor media met beschrijving\n- accounts kunnen nu meteen op hun profiel aan lijsten toegevoegd worden\nen veel meer\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Timeline filters have moved to Account Preferences and will sync with the server\n- You can now have a custom hashtag as tab in the main interface\n- Lists can now be edited\n- Security: removed support for TLS 1.0 and TLS 1.1, and added support for TLS 1.3 on Android 6+\n- The compose view will now suggest custom emojis when starting to type\n- New theme setting \"follow system theme\"\n- Improved timeline accessibility\n- Tusky will now ignore unknown notifications and no longer crash\n- New setting: You can now override the system language and set a different language in Tusky\n- New translations: Czech and Esperanto\n- A lot of other improvements and fixes\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/61.txt",
    "content": "\n\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- You can now create Polls from Tusky\n- Improved search\n- New option in Account Preferences to always expand content warnings\n- Avatars in the navigation drawer have now a rounded square shape\n- It is now possible to report users even when they never posted a status\n- Tusky will now refuse to connect over cleartext connections on Android 6+\n- A lot of other small improvements and bug fixes\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/68.txt",
    "content": "Tusky v9.1\n\nDeze versie garandeert compatibiliteit met Mastodon 3 en verbetert prestaties en stabiliteit.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- You can now bookmark statuses & list your bookmarks in Tusky.\n- You can now schedule toots with Tusky. Note that the time you select has to be at least 5 minutes in the future.\n- You can now add lists to the main screen.\n- You can now post audio attachments with Tusky.\n\nAnd a lot of other small improvements and bug fixes!\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- Notifications about new follow requests when your account is locked\n- New features that can be toggled on the Preferences screen:\n   - disable swiping between tabs\n   - show a confirmation dialog before boosting a toot\n   - show link previews in timelines\n- Conversations can now be muted\n- Poll results will now be calculated based on the number of voters and not on the number of total votes which makes multichoice polls easier to understand\n- A lot of bugfixes, most of them related to composing toots\n- Improved translations\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- Improved main interface - you can now move the tabs to the bottom\n- When muting a user, you can now also decide whether to mute their notifications\n- You can now follow as many hashtags as you want in one single hashtag tab\n- Improved the way media descriptions are displayed so it works even for super long descriptions\n    \nFull changelog: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- support for profile notes (Mastodon 3.2.0 feature)\n- support for admin announcements (Mastodon 3.1.0 feature)\n\n- the avatar of your selected account will now be shown in the main toolbar\n- clicking the display name in a timeline will now open the profile page of that user\n\n- a lot of bug fixes and small improvements\n- improved translations\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Get notified when a followed user posts - click the bell icon on their profile! (Mastodon 3.3.0 feature)\n- The draft feature in Tusky has been completely redesigned to be faster, more user friendly and less buggy.\n- A new wellbeing mode that allows you to limit certain Tusky features has been added.\n- Tusky can now animate custom emojis.\nFull changelog: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- Follow requests are now always shown in the main menu.\n- The time picker for scheduling a post has a design consistent with the rest of the app now\nFull changelog: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/83.txt",
    "content": "Tusky v15.1\n\nThis release fixes a crash when captioning images\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/87.txt",
    "content": "Tusky v16.0\n\n- The timeline loading logic has been completely rewritten in order to be faster, less buggy and easier to maintain.\n- Tusky can now animate custom emojis in APNG & Animated WebP format.\n- A lot of bugfixes\n- Support for Android 11\n- New translations: Scottish Gaelic, Galician, Ukrainian\n- Improved translations\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/89.txt",
    "content": "Tusky v17.0\n\n- \"Open as...\" is now also available in the menu on account profiles when using multiple accounts\n- Login is now handled in a WebView within the app\n- Support for Android 12\n- support for the new Mastodon instance configuration API\n- and a lot of other small fixes and improvements\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/91.txt",
    "content": "Tusky v18.0\n\n- Support for new Mastodon 3.5 notification types\n- The bot badge now looks better and adjusts to the selected theme\n- Text can now be selected on the post detail view\n- Fixed a lot of bugs, including one that prevented logins on Android 6 and lower\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/94.txt",
    "content": "Tusky 19.0\n\n- Support for Unified Push. To activate the support you will have to relogin into your accounts.\n- The number of responses to a post is now indicated in timelines.\n- Images can now by cropped while composing a post.\n- Profiles now show the date when they were created.\n- When viewing a list the title is now displayed in the toolbar.\n- A lot of bugfixes\n- Translation improvements\n"
  },
  {
    "path": "fastlane/metadata/android/nl/full_description.txt",
    "content": "Tusky is een lichtgewicht app voor Mastodon, een vrij en open-source decentraal sociaal netwerk.\n\n• Material design\n• Meeste Mastodon-API's worden ondersteund\n• Meerdere accounts in één app\n• Donker en licht thema, met de optie om automatisch tijdens zonsop- en ondergang te wisselen\n• Concepten - schrijf berichten en bewaar ze voor later\n• Kies tussen verschillende emojistijlen \n• Geoptimaliseerd voor verschillende schermgroottes\n• Volledig open-source - geen niet-vrije afhankelijkheden zoals Google-services\n\nGa naar https://joinmastodon.org om meer over Mastodon te leren.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/short_description.txt",
    "content": "Een multi-accountclient voor het sociale netwerk Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/nl/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Wsparcie dla edycji postów\n- Nowe ustawienie preferowanego kierunku czytania\n- Większe podglądy multimediów oraz nowa nakładka wskazująca na opis\n- Możliwość dodawania kont do listy bezpośrednio z ich profilu\nI więcej\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Filtry zostały przeniesione do Ustawień konta i synchronizują się z serwerem\n- Można ustawić własny hashtag jako zakładkę w głównym interfejsie\n- Listy mogą być edytowane\n- Usunięto wsparcie dla TLS 1.0 i 1.1, dodano wsparcie dla TLS 1.3 dla Android 6+\n- Widok tworzenia wpisów sugeruje teraz niestandardowe emoji\n- Nowe ustawienie motywu \"Użyj motywu systemu\"\n- Ulepszona przystępność osi czasu\n- Aplikacja ignoruje nieznane typy powiadomień oraz nie będzie się zawieszać z ich powodu\n- Możliwość ustawić inny język niż systemowy\n- Nowe tłumaczenia: czeski i esperanto\n- Wiele innych ulepszeń i poprawek\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Wsparcie dla wyświetlania ankiet, głosowania i powiadomień o ankietach\n- Nowy przycisk dla filtrowania powiadomień i usuwania wszystkich powiadomień\n- Możesz usunąć i napisać ponownie własne wpisy\n- Przy ikonach kont ustawionych jako bot pojawia się mała ikonka robota (opcję można wyłączyć w preferencjach)\n- Nowe tłumaczenia: Norweski Bokmål i Słoweński.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Możesz teraz tworzyć ankiety z poziomu Tusky\n- Ulepszone wyszukiwanie\n- Nowa opcja w Ustawieniach konta która zawsze rozwija ostrzeżenia o zawartości\n- Awatary w szufladzie nawigacji mają teraz kształt zaokrąglonego kwadratu\n- Teraz możliwe jest zgłaszanie osób nawet wtedy, kiedy nic jeszcze nie wysyłali.\n- Tusky nie pozwoli na połączenia przez cleartext na Androidzie 6+\n- Wiele innych małych ulepszeń i poprawek\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/68.txt",
    "content": "Tusky v9.1\n\nTa aktualizacja zapewnia kompatybilność z Mastodonem 3 i poprawia wydajność i stabilność aplikacji.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Dodano wsparcie dla zakładek. Możesz teraz dodawać wpisy do zakładek i przeglądać zakładki w Tusky.\n- Możesz teraz zaplanować wpisy w Tusky. (Uwaga: wybrany czas do wysłania zaplanowanego wpisu musi wynosić przynajmniej 5 minut)\n- Możesz teraz dodawać listy do ekranu głównego.\n- Możesz teraz załączać pliki audio do wpisów.\n\nPlus wiele innych małych ulepszeń i poprawek!\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- Powiadomienia o nowych prośbach o obserwowanie kiedy Twoje konto jest zablokowane\n- Nowe funkcje, które mogą być przełączone na ekranie Ustawień:\n\t- wyłącz przesuwanie pomiędzy kartami\n\t- pokaż potwierdzenie przed podbiciem\n\t- pokaż podgląd linku na osi czasu\n- Rozmowy mogą być teraz wyciszone\n- Wyniki ankiet są teraz przeliczane na podstawie liczby głosujących, a nie łącznej liczby wszystkich głosów\n- Dużo poprawek błędów, większość z nich dotyczy wpisów\n- Poprawiono tłumaczenia\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- Ulepszony interfejs - teraz można przenieść zakładki na dół ekranu\n- Podczas wyciszania użytkownika można teraz wyciszyć wysłane przez niego powiadomienia\n- Można teraz obserwować kilka hashtagów w jednej zakładce\n- Ulepszono sposób, w jaki są wyświetlane opisy załączników\n\nPełna lista zmian: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- Wsparcie dla opisów profilów (Funkcja dostępna w Mastodonie 3.2.0)\n- Wsparcie dla ogłoszeń od administracji (Funkcja dostępna w Mastodonie 3.1.0)\n\n- Zdjęcie profilowe wybranego konta widnieje teraz w głównym pasku nawigacyjnym\n- Kliknięcie nazwy użytkownika na osi czasu teraz otwiera profil tego użytkownika\n\n- Wiele małych poprawek\n- Ulepszone tłumaczenia\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Otrzymaj powiadomienie gdy użytkownik, którego obserwujesz, prześle wpis - kliknij na ikonkę dzwonka na ich profilu! (Funkcja dostępna w Mastodonie 3.3.0)\n- Szkice zostały przeprojektowane, by ułatwić ich używanie.\n- Nowy tryb samopoczucia, który pozwala Ci limitować niektóre funkcje.\n- Dodano funkcję animowania niestandardowych emoji.\nPełna lista zmian: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- Prośby o zezwolenie na obserwowanie są teraz wyświetlane na menu głównym\n- Design wyboru czasu wysłania zaplanowanych wpisów jest bardziej zgodny z resztą aplikacji\nPełna lista zmian: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/83.txt",
    "content": "Tusky v15.1\n\nTo wydanie naprawia błąd aplikacji przy dodawaniu opisów do zdjęć\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/87.txt",
    "content": "Tusky v16.0\n\n- Logika ładowania osi czasu została przepisana w celu przyspieszenia jej i naprawienia błędów.\n- Tusky wspiera teraz animowane emotikony w formatach APNG i Animated WebP.\n- Mnóstwo poprawek\n- Wsparcie dla Androida 11\n- Nowe tłumaczenia: Gaelicki szkocki, galicyjski, ukraiński\n- Ulepszone tłumaczenia\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/89.txt",
    "content": "Tusky v17.0\n\n- \"Otwórz jako...\" teraz jest także dostępne w menu na profilach kont gdy używane jest kilka kont\n- Login teraz jest obsługiwany w WebView w aplikacji\n- Wsparcie dla Androida 12\n- Wsparcie nowego API konfiguracji instancji Mastodon\n- i wiele innych małych poprawek i ulepszeń\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/91.txt",
    "content": "Tusky v18.0\n\n- Wsparcie dla nowych rodzajów powiadomień w Mastodon 3.5\n- Nowy wygląd plakietek botów dopasowujący się do wybranego motywu\n- Możliwość zaznaczenia tekstu w szczegółowym widoku postów\n- Wprowadzenie wielu poprawek, w tym naprawienie błędu uniemożliwjającego logowanie na urządzeniach z systemem Android 6 i niższym\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/94.txt",
    "content": "Tusky 19.0\n\n- Wsparcie dla Unified Push. Aby aktywować wsparcie należy zalogować się ponownie na swoje konta.\n- Ilość odpowiedzi na wpis jest teraz pokazywana na osiach czasu.\n- Obrazki mogą teraz być przycinane podczas tworzenia wpisu.\n- Profile pokazują teraz datę, w której zostały stworzone.\n- Nazwa przeglądanej listy jest teraz pokazywana na górnym pasku.\n- Mnóstwo poprawek\n- Ulepszone tłumaczenia\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/97.txt",
    "content": "Tusky 20.0\n- Nowa ikona aplikacji autorstwa Dzuka https://dzuk.zone/\n- Można teraz obserwować hashtagi. Kliknij na hashtag, a następnie na ikonę na pasku narzędzi.\n- Wsparcie Androida 13\n- Nowe menu w widoku kompozycji, umożliwiające ustawienie języka wpisu\n- Zakładka z multimediami w profilach szanuje teraz wrażliwe media i ładuje się płynniej.\n- Możliwe jest teraz ustawienie punktu centralnego obrazu przed opublikowaniem wpisu\n- Nowa opcja pokazywania pełnej nazwy użytkownika na pasku narzędzi\n"
  },
  {
    "path": "fastlane/metadata/android/pl/full_description.txt",
    "content": "Tusky jest lekkim klientem dla Mastodona, darmowej i otwartoźródłowej sieci społecznościowej.\n\n• Material Design\n• Wsparcie dla większości API Mastodona\n• Wsparcie kilku kont na raz\n• Ciemny i jasny motyw z możliwością automatycznej zmiany bazując na porze dnia\n• Szkice - stwórz wpis i zachowaj go na później\n• Wybierz między różnymi stylami emoji\n• Zoptymalizowany dla wszystkich rozmiarów ekranu\n• W pełni open-source - bez niewolnych elementów np. serwisów Google\n\nBy dowiedzieć się więcej o sieci Mastodon, zobacz stronę https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/pl/short_description.txt",
    "content": "Klient do sieci Mastodon wspierający kilka kont na raz\n"
  },
  {
    "path": "fastlane/metadata/android/pl/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Suporte a edição de toots\n- Nova configuração para controlar a direção de leitura preferida\n- Pré-visualizações de mídia maiores e uma novo indicador de mídias com descrição\n- Agora é possível adicionar contas a listas diretamente de seus perfis\ne muito mais\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Filtros de timeline movidos para \"Preferências da conta\" sincronizando com servidor\n- Agora você pode ter uma hashtag personalizada como aba\n- Suporte a edição de listas\n- O compositor vai sugerir emojis personalizados ao digitar\n- Nova configuração de tema \"seguir tema do sistema\"\n- Acessibilidade da timeline melhorada\n- Notificações desconhecidas serão ignoradas\n- Nova opção: substituir o idioma do sistema por outro\n- Novas traduções: Tcheco e Esperanto\n- Muitas outras melhorias\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Suporte para enquetes: exibição, votação e notificação\n- Novos botões para filtrar notificações e excluí-las\n- Exclua e rascunhe seus toots\n- Novo indicador que mostra na foto de perfil se uma conta é um robô (pode ser desativado nas preferências)\n- Novas traduções: Norueguês Bokmål e Esloveno.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Agora você pode criar enquetes no Tusky\n- Pesquisa melhorada\n- Nova opção nas preferências da conta: \"Sempre expandir toots com Aviso de Conteúdo\"\n- Avatares em formato quadrado arredondado\n- Agora é possível denunciar usuários mesmo sem toots\n- Tusky se recusará a se conectar através de conexões de texto claro em Android 6+\n- Muitas outras pequenas melhorias e correções de bugs\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/68.txt",
    "content": "Tusky v9.1\n\nEsta atualização garante compatibilidade com Mastodon 3 e melhora a performance e estabilidade.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Pra quem não aguenta mais perder toots no meio dos favoritos, o Salvos chegou!\n- Agora dá para agendar toots, porém é necessário agendá-los para ao menos 5 minutos depois, certo?\n- Utilidade pública: Finalmente poderemos adicionar listas na barrinha do Tusky!\n- Filosofou no áudio de uma conversa e quer compartilhar com o fediverso? Você já pode anexar áudios nos toots, só não se esqueça de descrevê-los!\n\nE muitas outras pequenas melhorias e correções de bugs!\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- Notificações de seguidores pendentes quando a conta está trancada! FINALMENTE, POVO!\n- Novas funcionalidades na aba de preferências:\n   * desativar gesto que alterna entre abas\n   * diálogo de confirmação antes de dar boost\n   * mostrar ou não prévia de links nas linhas alheias\n- Conversas agora podem ser silenciadas\n- Enquetes agora serão calculadas por número de votantes, o que facilitará o entendimento das enquetes de múltiplas opções\n- E algumas correções a mais\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/74.txt",
    "content": "Tusky v.12.0\n\n- Interface principal melhorada - agora você pode mover as abas para baixo!\n- Ao silenciar um usuário, você poderá decidir se deve silenciar as notificações também\n- Agora dá para acompanhar quantas hashtags quiser em uma única aba!\n- A exibição da descrição de mídia foi melhorada e funcionará até com descrições super longas\nNão se esqueça de descrever suas mídias para tornar o fediverso mais inclusivo!\n\nChangelog completo: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- Suporte à função de nota pessoal sobre o perfil (novidade do Mastodon 3.2.0)\n- Suporte à função de Comunicados da administração (novidade do Mastodon 3.1.0)\n\n- O avatar de sua conta selecionada agora ficará visível no cantinho da barra de títulos\n- Tocar no nome de exibição na linha do tempo abrirá o perfil em questão\n\n- O desenvolvedor pegou o mata-moscas e fez um monte de pequenas melhorias e correções\n- Tradução atualizada\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Receba notificação quando a pessoa amada tootar - toca no sininho e aproveita! (novidade do Mastodon 3.3.0)\n- Rascunhos no Tusky foi completamente redesenhado e agora está mais chique!\n- Foi adicionado funções de bem-estar que permite limitar certas coisinhas no Tusky.\n- Tusky consegue animar os emojis personalizados \nPara ver mais: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- Seguidores Pendentes agora ficará fixo no menu principal! \n- O relógio para agendar toots ficou mais bonitinho e combina melhor com o resto do Tusky\nPara ver mais: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/83.txt",
    "content": "Tusky v15.1\n\nEsta atualização corrige aquele inconveniente ao descrever imagens\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/87.txt",
    "content": "Tusky v16.0\n\n- A lógica de carregamento da linha do tempo foi completamente reescrita para ser mais rápida, menos bugada e mais fácil de manter.\n- Tusky pode agora animar emojis personalizados no formato APNG & WebP Animated.\n- Muitas correções de bugs\n- Suporte para Android 11\n- Novas traduções: gaélico escocês, galego, ucraniano\n- Traduções melhoradas\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/89.txt",
    "content": "Tusky v17.0\n\n- \"Abrir como...\" agora também está disponível no menu dos perfis de conta ao usar várias contas\n- O login agora é feito em um WebView dentro do aplicativo\n- Suporte para Android 12\n- suporte para a nova API de configuração de instância Mastodon\n- e muitas outras pequenas correções e melhorias\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/91.txt",
    "content": "Tusky v18.0\n\n- Suporte para novos tipos de notificação Mastodon 3.5\n- O emblema do bot agora parece melhor e se ajusta ao tema selecionado\n- O texto agora pode ser selecionado na exibição de detalhes do toot\n- Corrigido muitos bugs, incluindo um que impedia logins no Android 6 e inferior\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/94.txt",
    "content": "Tusky 19.0\n\n- Suporte para Unified Push. Para ativar o suporte, você terá que fazer login novamente em suas contas.\n- O número de respostas a uma postagem agora é indicado nas linhas do tempo.\n- As imagens agora podem ser cortadas ao compor uma postagem.\n- Os perfis agora mostram a data em que foram criados.\n- Ao visualizar uma lista, o título agora é exibido na barra de ferramentas.\n- Muitas correções de bugs\n- Melhorias na tradução\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/97.txt",
    "content": "Tusky 20.0\n\n- Novo ícone do aplicativo por Dzuk https://dzuk.zone/\n- Agora você pode seguir hashtags. Clique em uma hashtag e depois no ícone na barra de ferramentas.\n- Suporte ao Android 13\n- novo menu suspenso na composição para definir o idioma do toot\n- A guia de mídia nos perfis agora respeita mídia sensível e carrega de maneira mais suave.\n- Agora é possível definir o ponto de foco de uma imagem antes de postar\n- Nova opção para mostrar seu nome de usuário completo na barra de ferramentas\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/full_description.txt",
    "content": "Tusky é um leve cliente para Mastodon, um servidor de rede social de código aberto e livre.\n\n• Design Material\n• Maioria das APIS do Mastodon implementadas\n• Suporte a várias contas\n• Tema diurno e noturno, com possibilidade de troca automática de acordo com o horário\n• Rascunhos - Componha seus toots e salve-os para mais tarde\n• Escolha entre diferentes estilos de emoji\n• Otimizado para todos os tamanhos de tela\n• Código totalmente aberto - Sem dependências não-livres como Google Play Services\n\nPara ler mais sobre Mastodon, visite https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/short_description.txt",
    "content": "Um cliente multi-contas para a rede social Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Suporte para edição de publicações\n- Nova opção para controlar a direção de leitura preferida\n- Pré-visualização maiores para ficheiros multimédia e uma nova sobreposição para identificar ficheiros multimédia com descrição\n- Já é possível adicionar contas a listas através dos perfils das contas\ne muito mais\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/103.txt",
    "content": "Tusky 22.0 beta 1\n\nFuncionalidades incluem:\n\n- Ver hashtags em destaque\n- Editar descrição e ponto de foco das imagens\n- Menu de atualização para melhorar acessibilidade\n- Suporte para os filtros da versão 4 do Mastodon\n- Mostrar alterações detalhadas quando uma publicação é editada\n- Opção para mostrar estatísticas das publicações na timeline\n\nCorreções incluem:\n\n- Mostrar controlos do leitor durante reprodução\n- Cálculo correto do comprimento da publicação\n- Publicar sempre legendas das imagens\n\ne muito mais\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/104.txt",
    "content": "Tusky 22.0 beta 2\n\nCorreções incluem:\n\n- Melhoramentos na velocidade de carregamento das notificações\n- Reintrodução da mostragem 0/1/1+ para respostas\n- Mostrar título dos filtros, em vez das palavras-chave dos filtros, nas publicações filtradas\n- Corrigido um erro que poderia abrir um link não relacionado ao abrir uma publicação\n- Mostrar botão \"Adicionar\" no local correto quando não há filtros\n- Falhas diversas corrigidas\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/117.txt",
    "content": "Tusky 24.1\n\n- O ecrã vai permanecer ligado enquanto um vídeo é reproduzido.\n- Vazamento de memória corrigido. Isto deve melhorar a estabilidade e a performance.\n- Os emojis são corretamente contabilizados como um caracter quando se escreve uma publicação.\n- Corrigida uma falha que fazia a aplicação fechar inesperadamente quando texto era selecionado nalguns dispositivos.\n- Os ícones nos textos de ajuda das timelines vazias agora estarão sempre alinhados corretamente.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/131.txt",
    "content": "Tusky 28.0\n\n- Suporte para Android 15 e modo \"edge-to-edge\"\n- Melhorias na fiabilidade das notificações push\n- Respostas na timeline passam a ser marcadas claramente como tal\n- Várias melhorias na forma como as notificações são mostradas no separador de notificações\n- As pré-visualizações geradas para links receberam um novo design e agora suportam a funcionalidade \"fediverse:creator\"\n\nAceda a https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md para a lista completa de alterações\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Os filtros de timeline passaram para \"Preferências da Conta\" e sincronizam com servidor\n- Pode ter uma hashtag personalizada como separador\n- Suporte a edição de listas\n- O editor sugere emojis personalizados ao escrever\n- Nova configuração: \"seguir tema do sistema\"\n- Melhor acessibilidade da timeline\n- O Tusky ignora notificações desconhecidas, deixando de crashar\n- Nova opção: trocar o idioma do sistema por outro\n- Novas traduções\n- Muitas outras melhorias e correções\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Suporte para mostragem de votações, para votação e notificação de votações\n- Botões novos para filtrar notificações e excluí-las\n- Exclua e rascunhe os seus toots\n- Novo indicador que mostra, na foto de perfil, se uma conta é um bot (pode ser desativado nas preferências)\n- Novas traduções: Norueguês, Bokmål e Esloveno.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Agora pode criar votações no Tusky\n- Pesquisa melhorada\n- Nova opção em \"Preferências da Conta\": \"Expandir sempre os toots com Aviso de Conteúdo\"\n- Avatars em formato quadrado com cantos arredondados\n- Agora é possível denunciar utilizadores, mesmo que não tenham toots\n- O Tusky vai recusar a ligação através de ligações simples (não encriptadas) em Android 6+\n- Muitas outras pequenas melhorias e correções de bugs\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/68.txt",
    "content": "Tusky v9.1\n\nEsta atualização garante compatibilidade com Mastodon 3 e melhora a performance e estabilidade.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Agora é possível adicionar toots aos favoritos e ver a lista de favoritos no Tusky.\n- Já pode agendar toots, no entanto é necessário agendá-los para pelo menos 5 minutos depois do momento da escrita.\n- Já pode adicionar listas na barra lateral do Tusky!\n- Já pode partilhar ficheiros de som nos teus toots!\n\nE muitas outras pequenas melhorias e correções de bugs!\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- Notificações de seguidores pendentes quando a conta está trancada!\n- Novas funcionalidades nas \"Preferências\":\n   * desativação do gesto que alterna entre separadores\n   * diálogo de confirmação antes de dar boost\n   * mostragem da pré-visualização de links nas timelines\n- As conversas agora podem ser silenciadas\n- As votações passam a ser calculadas pelo número de votantes e não pelo número de votos\n- Várias correções relacionadas com a escrita de toots\n - Traduções melhoradas\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/74.txt",
    "content": "Tusky v.12.0\n\n- Interface principal melhorada - passa a ser possível mover os separadores para baixo!\n- Ao silenciar um utilizador, pode também escolher se também pretende silenciar as notificações\n- Agora dá para seguir quantas hashtags quiser num único separador!\n- A exibição da descrição dos conteúdos multimédia foi melhorada para suportar descrições super longas\n\nRegisto completo de alterações: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- Suporte para anotações em perfis (novidade do Mastodon 3.2.0)\n- Suporte para anúncios do(s) administrador(es) de instâncias (novidade do Mastodon 3.1.0)\n\n- O avatar da sua conta selecionada passa a ficar visível na barra de ferramentas principal (canto superior esquerdo)\n- Tocar no nome de utilizador na timeline abrirá o perfil em questão\n\n- Várias pequenas melhorias e correções\n- Traduções melhoradas\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Receba notificações quando um utilizador que segue publicar um toot - basta clicar no ícone do sino (novidade do Mastodon 3.3.0)\n- O suporte para rascunhos do Tusky foi reescrito para ser mais rápido, simples e menos propenso a erros.\n- Foi adicionado uma funcionalidade de bem-estar, que permite limitar algumas funcionalidades no Tusky.\n- O Tusky já consegue animar os emojis personalizados \nRegisto completo de alterações: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- O menu principal passa a mostrar uma opção para ver os utilizadores que pediram para o seguir!\n- O relógio para agendar toots ganhou um aspeto mais consistente com o resto do Tusky\nRegisto completo de alterações: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/83.txt",
    "content": "Tusky v15.1\n\nO Tusky já não crasha ao adicionar descrição às imagens\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/87.txt",
    "content": "Tusky v16.0\n\n- O algoritmo de carregamento da timeline foi completamente reescrito para ser mais rápida, mais estável e mais fácil de manter.\n- O Tusky passa a poder animar emojis personalizados no formato APNG & WebP Animated.\n- Muitas correções de bugs\n- Suporte para Android 11\n- Novas traduções: gaélico escocês, galego, ucraniano\n- Traduções melhoradas\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/89.txt",
    "content": "Tusky v17.0\n\n- \"Abrir como...\" está disponível no menu de perfis de contas quando estão várias contas configuradas\n- O login passa a ser feito numa WebView dentro da aplicação\n- Suporte para Android 12\n- Suporte para a nova API de configuração de instâncias do Mastodon\n- Várias pequenas melhorias e correções\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/91.txt",
    "content": "Tusky v18.0\n\n- Suporte para o novo tipo de notificações do Mastodon 3.5\n- Agora o simbolo do bot tem melhor qualidade e ajusta-se ao tema selecionado\n- Agora é possivel selecionar o texto na visualização dos detalhes da publicação\n- Corrigidos muitos erros, incluindo um que impedia o login no Android 6 e anteriores\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/full_description.txt",
    "content": "Tusky é um cliente leve para Mastodon, um servidor de rede social de código aberto e livre.\n\n• Design Material\n• Maioria das APIs do Mastodon implementadas\n• Suporte para várias contas\n• Temas diurno e noturno, com possibilidade de troca automática de acordo com o horário\n• Rascunhos - Escreva os seus toots e guarde-os para mais tarde\n• Escolha entre estilos diferentes de emoji\n• Otimizado para todos os tamanhos de ecrã\n• Código totalmente aberto, sem dependências não-livres como Google Play Services\n\nPara ler mais sobre o Mastodon, visite o endereço https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/short_description.txt",
    "content": "Um cliente multi-contas para a rede social Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Поддержка редактирования постов\n- Новая настройка для управления желаемым направлением чтения\n- Увеличены предпросмотр медиа и новый оверлей для указания медиа с описанием\n- Теперь можно добавлять аккаунты в списки из их профиля \nи многое другое\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/103.txt",
    "content": "Tusky 22.0 beta 1\n\nОсобенности включают:\n\n- Просмотр модных хэштегов\n- Редактирование подписи изображений и точки фокусировки\n- Меню \"Обновить\" для доступности\n- Поддержка фильтров Mastodon v4\n- Показывать подробные различия при правке поста\n- Возможность отображения статистики постов в ленте\n\nИсправления включают:\n\n- Показ элементов управления плеером во время воспроизведения аудио\n- Корректное вычисление длины поста\n- Всегда публиковать подписи к изображениям\n\nи многое другое\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/104.txt",
    "content": "Tusky 22.0 beta 2\n\nИсправления включают:\n\n- Улучшена скорость загрузки уведомлений\n- Восстановлены отображения 0/1/1+ для ответов\n- Показываются названия фильтров, а не ключевые слова фильтров, в отфильтрованных постах\n- Исправлена ошибка, из-за которой при открытии статуса открывалась не связанная с ним ссылка\n- Отображение кнопки \"Добавить\" в правильном месте при отсутствии фильтров\n- Исправлены различные сбои\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/105.txt",
    "content": "Tusky 22.0 beta 3\n\nИсправления включают:\n\n- Исправлен сбой при просмотре темы\n- Исправлена ошибка при обработке фильтров Mastodon\n- Ссылки в биографиях уведомлений о запросах на следовании/подписки стали кликабельными\n- Обновления уведомлений для Android\n- Уведомление Android для уведомления Mastodon должно быть показано только один раз\n- Уведомления Android сгруппированы по типу уведомлений Mastodon (подписался, упомянул, продвинул и т.д.)\n- Устранена возможность пропуска уведомлений\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/106.txt",
    "content": "Tusky 22.0 beta 4\n\nИсправления:\n\n- Исправлено повторное получение уведомлений при настройке нескольких учетных записей\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/107.txt",
    "content": "Tusky 22.0 beta 5\n\nИсправления:\n\n- Откатились от библиотеки APNG, чтобы исправить неработающие анимированные эмодзи\n- Сохранение локальной копии маркера уведомления в случае, если сервер не поддерживает API\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/108.txt",
    "content": "Tusky 22.0 beta 6\n\nИсправления:\n\n- Чаще сохранять позицию чтения на вкладке \"Уведомления\"\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/109.txt",
    "content": "Tusky 22.0 beta 7\n\nИсправления:\n\n\n### Значительные исправления ошибок\n\n- Получение всех оставшихся уведомлений Mastodon при создании уведомлений для Android\n- При нажатии кнопки \"Написать\" в уведомлении устанавливалась неправильная учетная запись\n- Убедитесь, что \"идентификатор последнего прочитанного уведомления\" сохраняется в правильной учетной записи\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/110.txt",
    "content": "Таски 22.0\n\nНовые возможности:\n\n- Просмотр модных хэштегов\n- Следите за новыми хэштегами\n- Улучшенное упорядочивание при выборе языков\n- Показывать разницу между версиями поста\n- Поддержка фильтров Mastodon v4\n- Возможность отображения статистики постов в ленте\n- И многое другое...\n\nИсправления:\n\n- Запоминание выбранной вкладки и позиции\n- Сохранение уведомлений до прочтения\n- Корректное отображение смешанного справа-на-лево и слева-на-право текста в профилях\n- Правильный расчет длины сообщения\n- Всегда публиковать подписи к изображениям\n- И многое другое...\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/111.txt",
    "content": "Tusky 23.0 beta 1\n\nНовые возможности:\n\n- Новое предпочтение для масштабирования текста пользовательского интерфейса\n\nИсправления:\n\n- Корректное сохранение информации об аккаунте\n- \"Тянущие\" уведомления на устройствах под управлением Android версии <= 11\n- Работа над ошибкой Android, когда текстовые поля могли \"забыть\", что их можно копировать/вставлять\n- Просмотр \"отличий\" в истории редактирования не будет выходить за край экрана\n- Не падает, если на вашем сервере нет истории редактирования сообщений\n- Добавить кнопку \"Удалить\" при редактировании фильтра\n- Корректное отображение неквадратных эмодзи\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/112.txt",
    "content": "Tusky 23.0 beta 2\n\nИсправления:\n\n- Возможный сбой при редактировании полей профиля\n- Увеличенное контекстное меню при редактировании описаний изображений\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/113.txt",
    "content": "Таски 23.0\n\nНовые возможности:\n\n- Новая настройка  для масштабирования текста пользовательского интерфейса\n\nИсправления:\n\n- Корректное сохранение информации об аккаунте\n- \"Тянущие\" уведомления на устройствах под управлением Android версии <= 11\n- Ошибка Android, когда текстовые поля могли \"забыть\", что их можно копировать/вставлять\n- Просмотр изменений в истории редактирования не выходит за край экрана\n- Не падает, если на вашем сервере нет истории редактирования сообщений\n- Корректное отображение неквадратных эмодзи\n- Возможный сбой при редактировании полей профиля\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/115.txt",
    "content": "Таски 24.0\n\n- Блок-кавычки и блоки кода в сообщениях теперь выглядят красивее.\n- Восстановлено старое поведение вкладки уведомлений.\n- Значки ролей теперь отображаются в профилях.\n- Улучшен видеоплеер. Теперь можно выбирать скорость воспроизведения.\n- Новая опция темы, позволяющая использовать черную тему в соответствии с дизайном системы.\n- Новый вид просмотра популярных постов доступен как в меню, так и в виде пользовательской вкладки.\n\nА также множество других улучшений и исправлений!\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Фильтры ленты перенесены в настройки учетной записи и будут синхронизироваться с сервером.\n- Теперь вы можете иметь собственный хэштег-вкладку\n- Списки можно редактировать\n- Безопасность: удалена поддержка TLS 1.0 и TLS 1.1, добавлена поддержка TLS 1.3 на Android 6+.\n- При составлении сообщения теперь предлагаются пользовательские эмодзи.\n- Новая настройка темы \"следовать теме системы\"\n- Улучшена доступность ленты\n- Tusky теперь игнорирует неизвестные уведомления\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Добавлена поддержка отображения опросов, голосования и уведомлений об опросе.\n- Новые кнопки для фильтрации вкладки уведомлений и удаления всех уведомлений\n- удалить и перерисовать свои собственные слова\n- новый индикатор, который показывает, является ли аккаунт ботом на изображении профиля (можно отключить в настройках)\n- Новые переводы: норвежский букмол и словенский.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Создавайте опросы прямо в приложении\n- Улучшенный поиск\n- Новая настройка в параметрах аккаунта для раскрытия \"чувствительных\" постов по умолчанию\n- Аватары в левом меню теперь имеют форму закруглённого квадрата\n- Отныне вы можете жаловаться на пользователей, не написавших ни единого поста\n- В Android 6+ Tusky больше не будет подключаться по незащищённому соединению\n- Прочие различные исправления и улучшения\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/68.txt",
    "content": "Tusky v9.1\n\nЭтот релиз обеспечивает совместимость с Mastodon 3, повышает производительность и стабильность.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Теперь вы можете добавлять статусы в закладки и просматривать списки закладок в Tusky.\n- Теперь вы можете отправлять отложенные посты из Tusky. Учтите, что время отправки должно быть не менее, чем на пять минут позже текущего.\n- Теперь вы можете добавлять списки на главный экран.\n- Теперь вы можете публиковать аудио-вложения из Tusky.\n\nИ множество других мелких улучшений и исправлений!\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- Уведомления о новых запросах на подписку при заблокированном аккаунте\n- Новые функции, доступные для включения в настройках:\n   - отключение перелистывания вкладок\n   - запрашивать подтверждение для репостов\n   - показывать предпросмотр ссылок в ленте\n- Возможность заглушить диалоги\n- Результаты опросов теперь рассчитываются на основе числа голосов, а не общего числа проголосовавших. Опросы с множественным выбором теперь проще понять\n- Множество исправлений\n- Улучшения перевода\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- Улучшен основной интерфейс - вы теперь можете перенести вкладки вниз\n- При глушении пользователя теперь можно решить, скрывать ли уведомления от него\n- Можно подписываться на любое количество тегов в одной вкладке\n- Улучшен способ отображения описания медиа, так что теперь это работает и с очень длиными описаниями\n    \nПолный список изменений: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- поддержка заметок профиля (функция Mastodon 3.2.0)\n- поддержка объявлений администратора (функция Mastodon 3.1.0)\n\n- аватар выбранной вами учётной записи теперь будет отображаться на главной панели инструментов\n- щелчок по отображаемому имени на временной шкале теперь откроет страницу профиля этого пользователя\n\n- множество исправлений ошибок и небольших улучшений\n- улучшенные переводы\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Показ уведомлений о публикации сообщений подписанных пользователей - щёлкните значок колокольчика в их профиле! (Особенность Mastodon 3.3.0)\n- Функция черновика в Tusky была полностью переработана для скорости, удобства и стабильности.\n- Новый режим благополучия, ограничивающий определённые функции Tusky.\n- Анимация пользовательских смайлов.\nПолный список изменений: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- Запросы на подписку теперь всегда отображаются в главном меню.\n- Средство выбора времени для планирования публикации теперь имеет дизайн, совместимый с остальной частью приложения.\nПолный список изменений: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/83.txt",
    "content": "Tusky v15.1\n\nВ этом выпуске исправлена ошибка при создании подписей к изображениям\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/87.txt",
    "content": "Tusky v16.0\n\n- Логика загрузки временной шкалы была полностью переписана, чтобы быть быстрее, меньше ошибок и проще в обслуживании.\n- Tusky теперь может анимировать собственные смайлики в формате APNG и Animated WebP.\n- Множество исправлений\n- Поддержка Android 11\n- Новые переводы: шотландский гэльский, галисийский, украинский\n- Улучшенные переводы\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/89.txt",
    "content": "Таски v17.0\n\n- \"Открыть как...\" теперь также доступен в меню профилей учетных записей при использовании нескольких учетных записей\n- Вход в систему теперь осуществляется в WebView внутри приложения\n- Поддержка Android 12\n- поддержка нового API конфигурации экземпляров Mastodon\n- и множество других мелких исправлений и улучшений\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/91.txt",
    "content": "Таски v18.0\n\n- Поддержка новых типов уведомлений Mastodon 3.5\n- Значок бота теперь выглядит лучше и подстраивается под выбранную тему\n- Текст теперь можно выбрать в окне деталей сообщения\n- Исправлено множество ошибок, включая ту, которая не позволяла войти в систему на Android 6 и ниже\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/94.txt",
    "content": "Таски 19.0\n\n- Поддержка Unified Push. Чтобы активировать поддержку, вам придется заново войти в свои аккаунты.\n- Количество ответов на пост теперь отображается в ленте.\n- Изображения теперь можно обрезать при создании поста.\n- В профилях теперь отображается дата их создания.\n- При просмотре списка заголовок теперь отображается на панели инструментов.\n- Множество исправлений\n- Улучшения перевода\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/97.txt",
    "content": "Таски 20.0\n\n- Новая иконка приложения от Dzuk https://dzuk.zone/\n- Теперь вы можете следить за хэштегами. Нажмите на хэштег, а затем на иконку в панели инструментов.\n- Поддержка Android 13\n- новый выпадающий список в окне создания сообщения для установки языка сообщения\n- Вкладка медиа в профилях теперь учитывает чувствительные медиа и загружается более плавно.\n- Теперь можно установить точку фокусировки изображения перед публикацией\n- Новая опция отображения полного имени пользователя на панели инструментов\n"
  },
  {
    "path": "fastlane/metadata/android/ru/full_description.txt",
    "content": "Tusky – это легковесный клиент для Mastodon, свободной социальной сети с открытым кодом сервера.\n\n• Дизайн в стиле Material\n• Поддержка большинства возможностей Mastodon\n• Поддержка нескольких аккаунтов одновременно\n• Тёмная и светлая темы с возможностью автопереключения в зависимости от времени суток\n• Черновики: начните создавать пост и сохраните его на потом\n• Выбор между различными наборами эмодзи\n• Приложение оптимизировано под различные размеры экрана\n• Открытый исходный код, никаких проприетарных компонентов, вроде сервисов Google.\n\nЧтобы узнать больше о Mastodon, перейдите на https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/ru/short_description.txt",
    "content": "Клиент для социальной сети Mastodon с поддержкой нескольких аккаунтов\n"
  },
  {
    "path": "fastlane/metadata/android/ru/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/sa/changelogs/72.txt",
    "content": "टस्की v११।०\n"
  },
  {
    "path": "fastlane/metadata/android/sa/changelogs/74.txt",
    "content": "टस्की v१२.०\n\n-  संशोधितमुख्यमाध्यमः - पीठिकाः अधोऽपि स्थापयितुं शक्यते \n-  कस्मैचिन्मूकत्वप्रदानप्रक्रियायां, सूचनाश्च निःशब्दा भवेन्न वेति चेतुं शक्यते \n-  सम्प्रति नैकानि निश्रेणिचिह्नानि यथेच्छया एकस्यामेव पीठिकायां योक्तुं शक्यते\n-  सामग्रीविवरणविधिः संशोधितः येन दीर्घतरविवरणमपि योक्तुं शक्यते\n\nसर्वाणि परिवर्तनपत्राणि  https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/sa/full_description.txt",
    "content": "टस्कीति लघुग्राहिका मास्टोडन् इत्यस्य कृते, यदनावृतस्रोतो निःशुल्कसामाजिकजालवितारकम् ।\n\n* वस्तुपरिकल्पना\n* अधिकांशमास्टोडोनीयाः अनुप्रयोगविधिलेखनमाध्यमाः युक्ताः\n* बहुव्यक्तित्वलेखासाहाय्यम्\n* अन्धकारप्रबन्धः प्रदीप्तिप्रबन्धोऽपि समयानुसारेण स्वचालितविपरिवर्तनञ्च\n* विकर्षाः - दौत्यं लिखित्वा भविष्यते रक्ष्यताम्\n* नैका भावचिह्नशैल्योऽवचीयन्ताम्\n* सर्वाकारयुक्तेभ्यः पटलेभ्यः सरलीकृतम्\n* पूर्णत्वेनाऽनावृत्तस्रोतस्तथा च न सशुल्काधीनत्वं गुगलसेवासदृशम्\n\nमास्टोडोन् इत्यस्य विषयेऽधिकं ज्ञातुमत्र गम्यताम् : https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/sa/short_description.txt",
    "content": "एका बहुग्राहिका मास्टोडोन् इति सामाजिकलसञ्जालेभ्यः\n"
  },
  {
    "path": "fastlane/metadata/android/sa/title.txt",
    "content": "टस्की\n"
  },
  {
    "path": "fastlane/metadata/android/si/title.txt",
    "content": "ටුස්කි\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Teraz z Tusky môžete vytvárať ankety\n- Vylepšené vyhľadávanie\n- Nová možnost v nastaveniach účtu umožňuje automaticky rozbaľovať varovania obsahu\n- Avatary v navigačnom menu majú odteraz zaokrúhlené rohy\n- Odteraz je možné nahlásiť používateľa aj keď ešte nenapísali žiadny príspevok\n- Tusky bude odteraz odmietať nešifrované spojenie na Androidu 6+\n- Veľa ďalších malých vylepšení a opráv\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/68.txt",
    "content": "Tusky v9.1\n\nToto vydanie zaisťuje kompatibilitu s Mastodon 3 a vylepšuje výkon a stabilitu.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/short_description.txt",
    "content": "Viacúčtový klient pre sociálnu sieť Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/sk/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/sl/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Podpira naknadno urejanje\n- Nove nastavitve, ki urejajo želeno smer branja\n- Večji predogledi datotek in nova prosojnica za opisovanje datotek\n- Račune je zdaj mogoče dodajati na sezname iz profila\nin še veliko več\n"
  },
  {
    "path": "fastlane/metadata/android/sl/changelogs/103.txt",
    "content": "Tusky 22.0 beta 1\n\nFunkcije vsebujejo:\n\n- Ogled aktualnih ključnikov\n- Urejanje opisov datotek in osrednjih točk\n- “Osveži“ meni za dostopnost\n- Podpora Mastodon v4 filtrov\n- Prikaz natančnih sprememb po urejanju objave\n- Možnost prikaza statistike objav na časovnici\n\nIzboljšave vsebujejo:\n\n- Prikaz kontrolne plošče med zvočnim predvajanjem\n- Pravilne izračune dolžine objave\n- Vsakokratno objavljanje opisa datotek\n\nIn še veliko več\n"
  },
  {
    "path": "fastlane/metadata/android/sl/changelogs/104.txt",
    "content": "Tusky 22.0 beta 2\n\nNovosti:\n\n- Izboljšana hitrost nalaganja obvestil\n- Obnovljen prikaz 0/1/1+ za odgovore\n- Prikaz filtriranih naslovo namesto ključnih besed filtrov na objavah s filtri\n- Razrešitev napake, pri kateri je odpiranje statusa lahko povzročilo odprtje druge povezave\n- Prikaz gumba “Dodaj“ na ustreznih mestih brez filtrov\n- Razrešitev raznih napak\n"
  },
  {
    "path": "fastlane/metadata/android/sl/full_description.txt",
    "content": "Tusky je lahek odjemalec za Mastodon, brezplačen in odprtokoden družabni omrežni strežnik\n\n• Načrtovanje materialov\n• Vsebuje večino Mastodonovih API-jev\n• Podpira več profilov\n• Temna in svetla tema z možnostjo samodejnega preklapljanja glede na čas v dnevu\n• Osnutki - sestavite toote in jih shranite za pozneje\n• Izbira med različnimi slogi smeškotov\n• Optimizirano za vse velikosti ekranov\n• Popolnoma odprtokoden - brez odvisnosti od Googlovih storitev\n\nZa več informacij o Mastodonu obiščite https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/sl/short_description.txt",
    "content": "Odjemalec z več računi za družabno omrežje Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/sl/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Stöd för inläggsredigering\n- Ny inställning för att styra önskad läsriktning\n- Större mediaförhandsvisningar och ett nytt överlägg för att indikera media med beskrivning\n– Det är nu möjligt att lägga till konton till listor från sin profil\noch mycket mer\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/103.txt",
    "content": "Tusky 22.0 beta 1\n\nFunktioner inklusive:\n\n- Se trendiga hashtaggar\n- Redigera bildbeskrivningar och fokuspunkt\n- \"Uppdatera\"-menyn för tillgänglighet\n- Stöd Mastodon v4-filter\n- Visa detaljerade skillnader när ett inlägg redigeras\n- Möjlighet att visa inläggsstatistik i tidslinjen\n\nFixar inkluderar:\n\n- Visa spelarkontroller under ljuduppspelning\n- Korrekt beräkning av stolplängd\n- Publicera alltid bildtexter\n\noch mycket mer\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/104.txt",
    "content": "Tusky 22.0 beta 2\n\nFixar inkluderar:\n\n- Förbättrad aviseringshastighet\n- Återställ visar 0/1/1+ för svar\n- Visa filtertitlar, inte filtersökord, på filtrerade inlägg\n- Fixade en bugg där öppnande av en status kunde öppna en orelaterade länk\n- Visa \"Lägg till\"-knappen på rätt plats när det inte finns några filter\n- Fixade diverse krascher\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/105.txt",
    "content": "Tusky 22.0 beta 3\n\nFixar inkluderar:\n\n- Fixade en krasch vid visning av en tråd\n- Fixat kraschbehandling av Mastodon-filter\n- Länkar i bios för meddelanden om följ/följ-förfrågningar är klickbara\n- Uppdateringar av Android-aviseringar\n   - Android-avisering för en Mastodon-avisering bör endast visas en gång\n   - Android-aviseringar grupperas efter Mastodon-meddelandetyp (följ, nämn, boost, etc)\n   - Potentialen för saknade aviseringar har tagits bort\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/106.txt",
    "content": "Tusky 22.0 beta 4\n\nFixar:\n\n- Fixade upprepad hämtning av meddelanden om konfigurerad med flera konton\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/107.txt",
    "content": "Tusky 22.0 beta 5\n\nFixar:\n\n- Återställt APNG-bibliotek för att fixa trasiga animerade emojis\n- Spara lokal kopia av meddelandemarkören om servern inte stöder API\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/108.txt",
    "content": "Tusky 22.0 beta 6\n\nFixar:\n\n- Spara läsposition på Aviseringar fliken oftare\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/109.txt",
    "content": "Tusky 22.0 beta 7\n\nFixar:\n\n\n### Betydande buggfixar\n\n- Hämta alla utestående Mastodon aviseringar när du skapar Android-aviseringar\n- Om du klickar på \"Skriv\" från ett meddelande ställs fel konto in\n- Se till att \"senast lästa meddelande-ID\" är sparat på rätt konto\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/110.txt",
    "content": "Tusky 22.0\n\nNya egenskaper:\n\n- Se trendiga hashtaggar\n- Följ nya hashtaggar\n- Bättre ordning vid val av språk\n- Visa skillnaden mellan versioner av ett inlägg\n- Stöd Mastodon v4-filter\n- Möjlighet att visa inläggsstatistik i tidslinjen\n- Och mer...\n\nFixar:\n\n- Kom ihåg vald flik och position\n- Behåll aviseringar tills de läses\n- Visa blandad RTL- och LTR-text korrekt i profiler\n- Korrekt beräkning av stolplängd\n- Publicera alltid bildtexter\n- Och mer...\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/111.txt",
    "content": "Tusky 23.0 beta 1\n\nNya funktioner:\n\n- Ny inställning för att skala UI-text\n\nFixar:\n\n- Sparar kontoinformation korrekt\n- \"pull\"-meddelanden på enheter som kör Android-versioner <= 11\n- Undvik Android-bugg där textfält kan \"glömma\" att de kan kopiera/klistra in\n- Att visa \"diffs\" i redigeringshistoriken kommer inte att sträcka sig utanför skärmkanten\n- Krascha inte om din server inte har någon inläggsredigeringshistorik\n- Lägg till en \"Radera\"-knapp när du redigerar ett filter\n- Visa icke-fyrkantiga emoji korrekt\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/112.txt",
    "content": "Tusky 23.0 beta 2\n\nFixar:\n\n- Potentiell krasch vid redigering av profilfält\n- Överdimensionerad snabbmeny när du redigerar bildbeskrivningar\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/113.txt",
    "content": "Tusky 23.0\n\nNya funktioner:\n\n- Ny inställning för att skala UI-text\n\nFixar:\n\n- Sparar kontoinformation korrekt\n- \"pull\"-meddelanden på enheter som kör Android-versioner <= 11\n- Android-bugg där textfält kan \"glömma\" att de kan kopiera/klistra in\n- Att visa ändringar i redigeringshistoriken kommer inte att sträcka sig utanför skärmkanten\n- Krascha inte om din server inte har någon inläggsredigeringshistorik\n- Visa icke-fyrkantiga emojis korrekt\n- Potentiell krasch vid redigering av profilfält\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/115.txt",
    "content": "Tusky 24.0\n\n– Blockcitat och kodblock i inlägg ser nu snyggare ut.\n- Det gamla beteendet för meddelandefliken har återställts.\n- Rollbrickor visas nu på profiler.\n– Videospelaren har förbättrats. Du kan nu välja uppspelningshastighet.\n- Nytt temaalternativ för att använda det svarta temat när du följer systemdesignen.\n- En ny vy för att se trendiga inlägg är tillgänglig både i menyn och som anpassad flik.\n\nOch många andra förbättringar och korrigeringar!\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/117.txt",
    "content": "Tusky 24.1\n\n- Skärmen förblir på igen medan en video spelas upp.\n- En minnesläcka har åtgärdats. Detta bör förbättra stabilitet och prestanda.\n- Emojis räknas nu korrekt som 1 tecken när du skriver ett inlägg.\n- Fixade en krasch när text valdes på vissa enheter.\n- Ikonerna i hjälptexterna för tomma tidslinjer kommer nu alltid att vara korrekt justerade.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/119.txt",
    "content": "Tusky 25\n\n- Stöd för Mastodon översättning API\n- Visa språk för inlägg\n- Förbättrade skärmövergångar\n- Filter inställningar har flyttats till kontoinställningar\n- Poststatistik har nu stabil position\n- Mycket av stabilitet och prestandaförbättringar under huven\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Tidslinjefilter har flyttats till kontoinställningar och kommer att synkroniseras med servern\n- Du kan nu ha en anpassad hashtagg som flik i huvudgränssnittet\n- Listor kan nu redigeras\n- Säkerhet: tog bort stödet för TLS 1.0 och TLS 1.1 och lade till stöd för TLS 1.3 på Android 6+\n- Skrivvyn kommer nu att föreslå anpassade emojis när du börjar skriva\n- Ny temainställning \"följ systemtema\"\n- Förbättrad tillgänglighet till tidslinjen\n- Tusky kommer nu att ignorera okända meddelanden och inte längre krascha\n- Ny inställning: Du kan nu åsidosätta systemspråket och ställa in ett annat språk i Tusky\n- Nya översättningar: tjeckiska och esperanto\n– Många andra förbättringar och fixar\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Stöd för att visa undersökningar, rösta och notifikationer\n- Nya knappar för ett filtrera notifikationsfliken och att ta bort alla notifieringar\n- Radera & skriv ny toot\n- Ny indikator som visar om kontot är en bot vid profilbilden (kan stängas av under inställningar)\n- Nya översättningar: Norska (Bokmål) and Slovenska.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Du kan nu skapa omröstningar från Tusky\n- Förbättrad sökning\n- Nytt alternativ i Kontoinställningar för att alltid utöka innehållsvarningar\n- Avatarer i navigeringslådan har nu en rundad fyrkantig form\n– Det är nu möjligt att rapportera användare även när de aldrig lagt upp en status\n- Tusky kommer nu att vägra ansluta över klartextanslutningar på Android 6+\n– Många andra små förbättringar och buggfixar\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/68.txt",
    "content": "Tusky v9.1\n\nDenna release garanterar kompatibilitet med Mastodon 3 och ökar prestanda och stabilitet.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Du kan nu bokmärka inlägg & lista dina bokmärken i Tusky.\n- Du kan nu schemalägga inlägg med Tusky. Observera att tiden du väljer måste vara minst 5 minuter framåt i tiden.\n- Du kan nu fästa listor på huvudvyn.\n- Du kan nu skicka ljudbilagor med Tusky.\n\nOch många andra mindre förbättringar och buggfixar!\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- Aviseringar om nya följningsförfrågningar när ditt konto är låst\n- Nya funktioner som kan växlas på skärmen Inställningar:\n    - inaktivera svepning mellan flikarna\n    - visa en bekräftelsedialog innan du förstärker en tut\n    - visa länkförhandsvisningar i tidslinjer\n– Konversationer kan nu stängas av\n- Omröstningsresultat kommer nu att beräknas baserat på antalet väljare och inte på antalet totala röster, vilket gör flervalsundersökningar lättare att förstå\n– Många buggfixar, de flesta relaterade till att komponera tutter\n- Förbättrade översättningar\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/74.txt",
    "content": "Tusky v12.0 \n \n- Förbättrat gränssnitt - nu kan du flytta flikarna till botten \n- Nu kan du när du tystar en användare också bestämma om du vill tysta deras aviseringar \n- Nu kan du följa så många hashtaggar du vill i en enda hashtagg-flik \n- Sättet mediebeskrivningar visas på har förbättrats så de fungerar även för superlånga beskrivningar \n     \nHela ändringsloggen: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- stöd för profilanteckningar (Mastodon 3.2.0-funktion)\n- stöd för adminmeddelanden (Mastodon 3.1.0-funktion)\n\n- avataren för ditt valda konto kommer nu att visas i huvudverktygsfältet\n- genom att klicka på visningsnamnet i en tidslinje öppnas nu användarens profilsida\n\n- många buggfixar och små förbättringar\n- förbättrade översättningar\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Få ett meddelande när en användare gör inlägg - klicka på klockikonen på sin profil! (Mastodon 3.3.0-funktion)\n- Draft-funktionen i Tusky har gjorts om helt för att vara snabbare, mer användarvänlig och mindre buggig.\n- Ett nytt välmåendeläge som låter dig begränsa vissa Tusky-funktioner har lagts till.\n- Tusky kan nu animera anpassade emojis.\nFullständig ändringslogg: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- Följ förfrågningar visas nu alltid i huvudmenyn.\n– Tidsväljaren för att schemalägga ett inlägg har en design som överensstämmer med resten av appen nu\nFullständig ändringslogg: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/83.txt",
    "content": "Tusky v15.1\n\nDen här versionen fixar en krasch vid bildtextning\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/87.txt",
    "content": "Tusky v16.0\n\n– Tidslinjens laddningslogik har skrivits om helt för att vara snabbare, mindre buggig och lättare att underhålla.\n- Tusky kan nu animera anpassade emojis i APNG & Animated WebP-format.\n- Många buggfixar\n- Stöd för Android 11\n- Nya översättningar: skotsk gaeliska, galiciska, ukrainska\n- Förbättrade översättningar\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/89.txt",
    "content": "Tusky v17.0\n\n- \"Öppna som...\" finns nu även tillgängligt i menyn på kontoprofiler vid användning av flera konton\n- Inloggning hanteras nu i en WebView i appen\n- Stöd för Android 12\n- stöd för det nya Mastodon-instanskonfigurations-API:et\n- och många andra småfixar och förbättringar\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/91.txt",
    "content": "Tusky v18.0\n\n- Stöd för nya Mastodon 3.5-meddelandetyper\n- Bot-märket ser nu bättre ut och anpassar sig till det valda temat\n- Text kan nu väljas i inläggets detaljvy\n- Fixade många buggar, inklusive en som förhindrade inloggningar på Android 6 och lägre\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/94.txt",
    "content": "Tusky 19.0\n\n- Stöd för Unified Push. För att aktivera stöd behöver du logga in igen till dina konton.\n- Antalet svar på ett inlägg visas nu i tidslinjer.\n- Bilder kan nu beskäras medan du skriver ett inlägg.\n- Profiler visar nu datum då de skapades.\n- När en lista visas,syns också dess titel i verktygsraden.\n- Många buggfixar\n- Förbättrade översättningar\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/97.txt",
    "content": "Tusky 20.0\n\n- Ny appikon av Dzuk https://dzuk.zone/\n- Du kan nu följa hashtaggar. Tryck på en hashtagg och sen på ikonen i verktygsraden\n- Stöd för Android 13\n- Ny rullgardinsmeny för att ställa in vilket språk inlägget är skrivet på\n- Mediafliken i profilvyn hanterar nu känsligt media och laddar snabbare\n- Det går nu att sätta fokuspunkt för en bild innan den publiceras\n- Nytt alternativ för att visa ditt fullständiga namn i verktygsraden\n"
  },
  {
    "path": "fastlane/metadata/android/sv/full_description.txt",
    "content": "Tusky är en lättviktig klient för Mastodon, en fri/libre server för det sociala nätverket med öppen källkod. \n\n • Materialdesign\n • De flesta av Mastodons API:er är implementerade\n • Multi-konto stöd\n • Mörkt och ljust tema med möjlighet att automatiskt växla baserat på tid på dagen\n • Utkast - skapa tootar och spara dem för senare\n • Välj mellan olika emoji-stilar\n • Optimerat för alla skärmstorlekar\n • Helt öppen källkod - inga oavhängiga beroenden som Google-tjänster\n\nFör att lära dig mer om Mastodon, besök https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/sv/short_description.txt",
    "content": "En klient med stöd för flera konton för det sociala nätverket Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/sv/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/ta/short_description.txt",
    "content": "மஸ்டொடான் சமூகத் தளத்திற்கான செயலி\n"
  },
  {
    "path": "fastlane/metadata/android/ta/title.txt",
    "content": "டஸ்க்கி\n"
  },
  {
    "path": "fastlane/metadata/android/th/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- การแจ้งเตือนเกี่ยวกับคำขอติดตามใหม่หากบัญชีของคุณไม่เป็นสาธารณะ(ล็อก)\n- คุณสมบัติใหม่ที่สามารถ toggled  ได้ในหน้าจอการตั้งค่า:\n    - ปิดการใช้งานการปัดระหว่างแท็บ\n    - แสดงข้อความยืนยันก่อนที่จะบูสต์ Toot\n    - แสดงตัวอย่างลิงก์ในไทม์ไลน์\n- สามารถปิดเสียงการสนทนาได้ในขณะนี้ (ไม่สนใจการส)\n- ผลลัพธ์โพลจะคำนวณตามจำนวนผู้โหวตและไม่ได้อยู่ในคะแนนรวม ทำให้โพลหลายตัวเลือกง่ายต่อการเข้าใจ\n- แก้ไขบั๊กจำนวนมาก ส่วนใหญ่เกี่ยวข้องกับการเขียน Toot\n- ปรับปรุงการแปล\n"
  },
  {
    "path": "fastlane/metadata/android/th/full_description.txt",
    "content": "Tusky เป็นไคลเอ็นต์ที่มีน้ำหนักเบาสำหรับ Mastodon ซึ่งเป็นเซิร์ฟเวอร์เครือข่ายโซเชียลที่ฟรีและโอเพนซอร์ส\n\n• Material Design\n• Most Mastodon APIs implemented\n• รองรับการใช้งานแบบหลายบัญชี\n• ชุดรูปแบบมืดและสว่าง สามารถสลับอัตโนมัติตามเวลาของวัน\n• แบบร่าง - เขียน Toot และบันทึกไว้เพื่อใช้ในภายหลัง\n• เลือกรูปแบบเอโมจิที่แตกต่างกันได้\n• ปรับให้เหมาะสมสำหรับทุกขนาดหน้าจอ\n• โอเพ่นซอร์สสมบูรณ์ - ไม่มีการขึ้นต่อกันอย่างไม่อิสระ เช่น บริการ Google ฯลฯ\n\nหากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ Mastodon โปรดเยี่ยมชมที่ https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/th/short_description.txt",
    "content": "ไคลเอ็นต์แบบหลายบัญชีสำหรับเครือข่ายสังคม Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/th/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Sonradan düzenleme desteği\n- Tercih edilen okuma yönünü kontrol etmek için yeni ayar\n- Daha büyük medya önizlemeleri ve medyayı açıklama ile gösteren yeni bir kaplama\n- Artık hesapları profillerinden listelere eklemek mümkün\nve çok daha fazlası\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/103.txt",
    "content": "Tusky 22.0 beta 1\n\nDahil olan özellikler:\n\n- Trend etiketleri görüntüleyin\n- Görüntü açıklamalarını ve odak noktasını düzenleme\n- Erişilebilirlik için \"Yenile\" menüsü\n- Mastodon v4 süzgeçlerini destekleyin\n- Bir gönderi düzenlendiğinde ayrıntılı farkları gösterme\n- Gönderi istatistiklerini zaman çizelgesinde gösterme seçeneği\n\nDüzeltmeler dahil:\n\n- Ses çalma sırasında oynatıcı kontrollerini gösterme\n- Doğru gönderi uzunluğu hesaplaması\n- Görsel başlıklarını her zaman yayınlayın\n\nve çok daha fazlası\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/104.txt",
    "content": "Tusky 22.0 beta 2\n\nDüzeltmeler dahil:\n\n- Bildirim yükleme hızı iyileştirildi\n- Yanıtlar için 0/1/1+ göstermeyi geri yükle\n- Süzgeçlenen gönderilerde süzgeç anahtar kelimelerini değil, süzgeç başlıklarını gösterme\n- Bir durum açıldığında ilgisiz bir bağlantının açılmasına neden olan bir hata düzeltildi\n- Süzgeç olmadığında \"Ekle\" düğmesini doğru yerde göster\n- Çeşitli çökmeler düzeltildi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/105.txt",
    "content": "Tusky 22.0 beta 3\n\nDüzeltmeler dahil:\n\n- Bir ileti dizisini görüntülerken oluşan çökme düzeltildi\n- Mastodon süzgeçlerini işleme çökmesi düzeltildi\n- Takip/takip isteği bildirimlerinin biyografilerindeki bağlantılar tıklanabilir\n- Android Bildirimleri güncellemeleri\n  - Mastodon bildirimi için Android bildirimi yalnızca bir kez gösterilmeli\n  - Android bildirimleri Mastodon bildirim türüne göre gruplandırılmıştır (takip et, bahset, destekle, vb.)\n  - Bildirimleri kaçırma potansiyeli ortadan kaldırıldı\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/106.txt",
    "content": "Tusky 22.0 beta 4\n\nDüzeltmeler:\n\n- Birden fazla hesapla yapılandırıldığında bildirimlerin tekrar tekrar alınması düzeltildi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/107.txt",
    "content": "Tusky 22.0 beta 5\n\nDüzeltmeler:\n\n- Bozuk animasyonlu emojileri düzeltmek için APNG kütüphanesi geri alındı\n- Sunucunun API'yi desteklememesi durumunda bildirim işaretleyicisinin yerel kopyasını kaydetme\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/108.txt",
    "content": "Tusky 22.0 beta 6\n\nDüzeltmeler:\n\n- Bildirimler sekmesindeki okuma konumunu daha sık kaydetme\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/109.txt",
    "content": "Tusky 22.0 beta 7\n\nDüzeltmeler:\n\n\n### Önemli hata düzeltmeleri\n\n- Android bildirimleri oluştururken tüm bekleyen Mastodon bildirimlerini getirin\n- Bir bildirimden “Oluştur”a tıklandığında yanlış hesap ayarlanır\n- “Son okunan bildirim kimliğinin” doğru hesaba kaydedildiğinden emin olun\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/110.txt",
    "content": "Tusky 22.0\n\nYeni özellikler:\n\n- Trend hashtag'leri görüntüleyin\n- Yeni hashtag'leri takip edin\n- Dil seçerken daha iyi sıralama\n- Bir gönderinin sürümleri arasındaki farkı gösterme\n- Mastodon v4 filtrelerini destekleyin\n- Gönderi istatistiklerini zaman çizelgesinde gösterme seçeneği\n- Ve daha fazlası...\n\nDüzeltmeler:\n\n- Seçilen sekmeyi ve konumu hatırla\n- Okunana kadar bildirimleri saklayın\n- Profillerde karışık RTL ve LTR metinlerini doğru şekilde görüntüleme\n- Doğru gönderi uzunluğu hesaplaması\n- Görsel başlıklarını her zaman yayınlayın\n- Ve daha fazlası...\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/111.txt",
    "content": "Tusky 23.0 beta 1\n\nYeni özellikler:\n\n- Kullanıcı arayüzü metnini ölçeklendirmek için yeni tercih\n\nDüzeltmeler:\n\n- Hesap bilgilerini doğru şekilde kaydedin\n- Android sürümleri <= 11 olan cihazlarda \"çekme\" bildirimleri\n- Metin alanlarının kopyala/yapıştır yapabildiklerini \"unutabildikleri\" Android hatası üzerinde çalışın\n- Düzenleme geçmişinde \"farkları\" görüntülemek ekran kenarından taşmayacak\n- Sunucunuzun gönderi düzenleme geçmişi yoksa çökmeyin\n- Bir filtreyi düzenlerken \"Sil\" düğmesi ekleme\n- Kare olmayan emojiyi doğru gösterme\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/112.txt",
    "content": "Tusky 23.0 beta 2\n\nDüzeltmeler:\n\n- Profil alanları düzenlenirken olası çökme\n- Resim açıklamalarını düzenlerken büyük boyutlu içerik menüsü\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/113.txt",
    "content": "Tusky 23.0\n\nYeni özellikler:\n\n- Kullanıcı arayüzü metnini ölçeklendirmek için yeni tercih\n\nDüzeltmeler:\n\n- Hesap bilgilerini doğru şekilde kaydedin\n- Android sürümleri <= 11 olan cihazlarda “çekme” bildirimleri\n- Metin alanlarının kopyalama/yapıştırma yapabildiklerini \"unutmalarına\" neden olan Android hatası\n- Düzenleme geçmişindeki değişikliklerin görüntülenmesi ekran kenarından taşmayacak\n- Sunucunuzun gönderi düzenleme geçmişi yoksa çökmeyin\n- Kare olmayan emojiyi doğru gösterme\n- Profil alanları düzenlenirken olası çökme\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/115.txt",
    "content": "Tusky 24.0\n\n- Gönderilerdeki çıkışlar ve kod blokları artık daha güzel görünüyor.\n- Bildirim sekmesinin eski davranışı geri yüklendi.\n- Rol rozetleri artık profillerde gösteriliyor.\n- Video oynatıcı geliştirildi. Artık oynatma hızını seçebilirsiniz.\n- Sistem tasarımını takip ederken siyah temayı kullanmak için yeni tema seçeneği.\n- Trend gönderileri görmek için yeni bir görünüm hem menüde hem de özel sekme olarak mevcuttur.\n\nDaha birçok iyileştirme ve düzeltme!\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/117.txt",
    "content": "Tusky 24.1\n\n- Bir video oynatılırken ekran tekrar açık kalacaktır.\n- Bir bellek sızıntısı düzeltildi. Bu, kararlılığı ve performansı artıracaktır.\n- Bir gönderi oluştururken emojiler artık doğru şekilde 1 karakter olarak sayılıyor.\n- Bazı cihazlarda metin seçildiğinde oluşan çökme düzeltildi.\n- Boş zaman çizelgelerinin yardım metinlerindeki simgeler artık her zaman doğru şekilde hizalanacak.\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/119.txt",
    "content": "Tusky 25\n\n- Mastodon çeviri API'sini destekleyin\n- Gönderi dilini göster\n- Geliştirilmiş ekran geçişleri\n- Süzgeç ayarları hesap tercihlerine taşındı\n- Gönderi istatistikleri artık sabit konuma sahip\n- Kaputun altında birçok kararlılık ve performans iyileştirmesi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/123.txt",
    "content": "Tusky 26\n\n- Mavi ana renk daha iyi kontrast için biraz değiştirildi\n- Bildirimler sekmesinin içeriği artık daha iyi çevrimdışı davranış için önbelleğe alınıyor.\n- Yeni hesap tercihi \"varsayılan yanıt gizliliği\"\n- Kaputun altında birçok kararlılık ve performans iyileştirmesi\nTüm değişiklik günlüğü için https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md adresine bakın\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/124.txt",
    "content": "Tusky 26.1\n\n- \"Yanıt gizliliği\" hesap tercihinin artık iki ek seçeneği var: \"Varsayılan gönderi gizliliğini eşleştir\" ve \"Doğrudan\".\n- Tusky artık Android 7'de ve Let's Encrypt kullanan sunucularda çalışmaya devam etmek için ISRG kök sertifikalarını içeriyor.\n- Tusky'nin bazen hesapların zaman çizelgelerini ve/veya bildirimlerini karıştırmasına neden olan bir hatayı düzeltir.\nTüm değişiklik günlüğü için https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md adresine bakın\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Zaman akışı filtreleri Hesap Tercihlerine taşındı ve sunucuyla eşitlendi\n- Artık ana arayüzde özel etiketler sekmesi ne sahip olabilirsiniz\n- Listeler artık düzenlenebilir\n- Güvenlik: TLS 1.0 ve TLS 1.1 desteği kaldırıldı ve Android 6+'da TLS 1.3 desteği eklendi\n- Oluşturma görünümü artık yazmaya başladığınızda özel emojiler önerecektir\n- Yeni tema ayarı \"sistem temasını izle\"\n- Geliştirilmiş zaman akışı erişilebilirliği\n- Tusky artık bilinmeyen bildirimleri görmezden gelecek ve artık çökmeyecek\n- Yeni ayar: Şimdi sistem dilinden faklı bir dile ayarlayabilirsiniz\n- Yeni çeviriler: Çek ve Esperanto\n- Diğer bir çok geliştirme ve düzeltme\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Anket, oylama ve anket bildirimlerini görüntüleme desteği\n- Bildirim sekmesini filtrelemek ve tüm bildirimleri silmek için yeni düğmeler\n- Tootlarınızı silin ve yeniden tasarlayın\n- Bir hesabın profil görüntüsünde bot olup olmadığını gösteren yeni bir gösterge (ayarlardan devre dışı bırakılabilir)\n- Yeni çeviriler: Norveççe Bokmål ve Slovence.\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Artık Tusky'den Anket oluşturabilirsiniz\n- Arama geliştirildi\n- İçerik tercihlerini her zaman genişletmek için Hesap Tercihlerinde yeni seçenek\n- Navigasyon çekmecesindeki avatarlar artık yuvarlatılmış kare şeklinde\n- Artık kullanıcıları hiç durum bildirmemiş olsalar bile bildirmek mümkün.\n- Tusky şimdi Android 6+ üzerindeki cleartext bağlantılarına bağlanmayı reddedecek\n- Diğer birçok küçük iyileştirme ve hata düzeltmeleri\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/68.txt",
    "content": "Tusky v9.1\n\nBu sürüm, Mastodon 3 ile uyumluluğu sağlar ve performansı ve kararlılığı artırır.\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Artık durumları yer imlerine ekleyebilir ve yer imlerinizi Tusky'de listeleyebilirsiniz.\n- Artık Tusky ile tootları planlayabilirsiniz. Seçtiğiniz zamanın gelecekte en az 5 dakika olması gerektiğini unutmayın.\n- Artık ana ekrana listeler ekleyebilirsiniz.\n- Artık Tusky ile ses ekleri gönderebilirsiniz.\n\nVe diğer birçok küçük iyileştirme ve hata düzeltmesi!\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- Hesabınız kilitlendiğinde yeni takip istekleriyle ilgili bildirimler\nTercihler ekranından değiştirilebilen yeni özellikler:\n   - sekmeler arası kaydırmayı kapat\n   - durumu boost etmeden önce onay iletişim kutusu göster\n   - zaman çizelgesinde bağlantı önizlemeleri göster\n- Konuşmalar artık sessize alınabilir\n- Sonuçlar, çok oylu anketlerin anlaşılmasını kolaylaştıran toplam oy sayısına göre değil, oy veren sayısına göre hesaplanacaktır\n- Çoğu durumla ilgili hata birçok düzeltmesi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- Geliştirilmiş ana arayüz - artık sekmeleri aşağıya taşıyabilirsiniz\n- Bir kullanıcıyı sustururken, artık bildirimlerini devre dışı bırakıp bırakmayacağınıza da karar verebilirsiniz\n- Artık tek bir hashtag sekmesinden istediğiniz kadar hashtag'i takip edebilirsiniz\n- Medya açıklamalarının görüntülenme şekli iyileştirildi, böylece süper uzun açıklamalarla bile çalışıyor\n    \nTam değişiklik günlüğü: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- profil notları için destek (Mastodon 3.2.0 özelliği)\n- yönetici duyuruları için destek (Mastodon 3.1.0 özelliği)\n\n- seçtiğiniz hesabın görseli artık ana araç çubuğunda gösterilecek\n- bir zaman çizelgesindeki görünen isme tıkladığınızda artık o kullanıcının profil sayfasını açacaktır\n\n- bir sürü hata düzeltmesi ve küçük iyileştirmeler\n- geliştirilmiş çeviriler\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Takip edilen bir kullanıcı ileti gönderdiğinde bildirim alın - profilindeki zil simgesine tıklayın! (Mastodon 3.3.0 feature)\n- Tusky'deki taslak özelliği, daha hızlı, daha kullanıcı dostu ve daha az hatalı olacak şekilde tamamen yeniden tasarlandı.\n- Belirli Tusky özelliklerini sınırlamanıza izin veren yeni bir refah modu eklendi.\n- Tusky artık özel emojileri oynatabilir.\nTam değişiklik günlüğü: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- Takip istekleri artık her zaman ana menüde gösterilmektedir.\n- Bir gönderiyi anlamak için zaman seçici, artık uygulamanın geri kalanıyla tutarlı bir tasarıma sahip\nTam değişiklik günlüğü: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/83.txt",
    "content": "Tusky v15.1\n\nBu sürüm, resimlere başlık eklenirken oluşan bir çökmeyi düzeltir\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/87.txt",
    "content": "Tusky v16.0\n\n- Zaman akışı yükleme mantığı, daha hızlı, daha az hatalı ve bakımı daha kolay olması için tamamen yeniden yazılmıştır.\n- Tusky artık özel emojileri APNG ve Animasyonlu WebP formatında oynatılabilir.\n- Birçok hata düzeltmesi\n- Android 11 desteği\n- Yeni çeviriler: Scottish Gaelic, Galician, Ukrainian\n- İyileştirilmiş çeviriler\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/89.txt",
    "content": "Tusky v17.0\n\n-Olarak aç...\" artık birden fazla hesap kullanırken hesap profilleri menüsünde de mevcut\n- Giriş artık uygulama içindeki bir web görünümünde gerçekleştiriliyor\n- Android 12 desteği \n- yeni Mastodon örnek yapılandırma API'sı desteği\n- ve diğer birçok küçük düzeltme ve iyileştirme\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/91.txt",
    "content": "Tusky v18.0\n\n- Yeni Mastodon 3.5 bildirim tipleri için destek\n- Bot rozeti artık daha iyi görünüyor ve seçilen temaya göre ayarlanıyor\n- Metin artık gönderi ayrıntısı görünümünde seçilebilir\n- Android 6 ve daha düşük sürümlerde oturum açmayı engelleyen bir hata da dahil olmak üzere birçok hata düzeltildi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/94.txt",
    "content": "Tusky 19.0\n\n- Birleşik Besleme için Destek. Desteği etkinleştirmek için hesaplarınıza yeniden giriş yapmanız gerekir.\n- Bir gönderiye verilen yanıtların sayısı artık zaman akışında belirtilmiştir.\n- Görüntüler artık bir gönderi oluştururken kırpılabilir.\n- Profiller artık oluşturuldukları tarihi gösterir.\n- Bir listeyi görüntülerken başlık artık araç çubuğunda görüntülenir.\n- Birçok hata düzeltmesi\n- Çeviri iyileştirmeleri\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/97.txt",
    "content": "Tusky 20.0\n\n- Dzuk'tan yeni Uygulama simgesi https://dzuk.zone/\n- Artık etiketleri takip edebilirsiniz. Bir etiket'e ve ardından araç çubuğundaki simgeye tıklayın.\n- Android 13 Desteği \n- bir gönderinin dilini ayarlamak için oluşturma görünümünde yeni açılır menü\n- Profiller'deki medya sekmesi artık hassas medyaya uyumlu ve daha yumuşak yükleniyor.\n- Göndermeden önce bir görüntünün odak noktasını ayarlamak artık mümkün\n- Araç çubuğunda tam kullanıcı adınızı göstermek için yeni seçenek\n"
  },
  {
    "path": "fastlane/metadata/android/tr/full_description.txt",
    "content": "Tusky, ücretsiz ve açık kaynaklı bir sosyal ağ sunucusu olan Mastodon için hafif bir istemcidir.\n\n• Materyal Tasarım\n• Çoğu Mastodon API'si uygulandı\n• Çoklu hesap desteği\n• Gün içinde karanlık ve aydınlık tema arasında otomatik geçiş imkanı\n• Taslak - toot oluşturun ve daha sonra kullanmak üzere saklayın\n• Farklı ifade stilleri arasında seçim yapma imkanı\n• Tüm ekran boyutları için optimize edilmiş arayüz\n• Tamamen açık kaynak - Google servisleri gibi özgür olmayan bağımlılıklar yok\n\nMastodon hakkında daha fazla bilgi edinmek için https://joinmastodon.org/ adresini ziyaret edin\n"
  },
  {
    "path": "fastlane/metadata/android/tr/short_description.txt",
    "content": "Mastodon sosyal ağı için çok hesaplı bir istemci\n"
  },
  {
    "path": "fastlane/metadata/android/tr/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Підтримка редагування дописів\n- Нове налаштування для керування бажаним напрямком читання\n- Більші прев'ю медіа та новий вигляд позначення медіа з описом\n- З'явилася можливість додавати облікові записи до списків з їхнього профілю\nта багато іншого\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/103.txt",
    "content": "Tusky 22.0 beta 1\n\nВключено функції:\n\n- Перегляд популярних хештегів\n- Редагування описів зображень та точки фокусування\n- Меню \"Оновити\" для доступності\n- Підтримка фільтрів Mastodon v4\n- Показ докладних розбіжностей під час редагування допису\n- Можливість показу статистики дописів у стрічці часу\n\nВиправлення:\n\n- Показ елементів керування програвачем під час відтворення аудіо\n- Коректне обчислення довжини допису\n- Завжди публікувати підписи до зображень\n\nта багато іншого\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/104.txt",
    "content": "Tusky 22.0 beta 2\n\nВиправлення:\n\n- Покращено швидкість завантаження сповіщень\n- Відновлено показ 0/1/1+ для відповідей\n- Показ заголовків фільтрів, а не ключових слів у відфільтрованих повідомленнях\n- Виправлено помилку, коли після відкриття статусу могло відкриватися незв'язане з ним посилання\n- Кнопка \"Додати\" показується в правильному місці, коли немає фільтрів\n- Усунено різноманітні збої\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/105.txt",
    "content": "Tusky 22.0 beta 3\n\nВиправлення:\n\n- Усунуто збій під час перегляду гілки\n- Виправлено обробку збоїв у фільтрах Mastodon\n- Посилання в біо на сповіщення про запити на підписку/стеження можна натиснути\n- Оновлення сповіщень Android\n  - Сповіщення Android для сповіщень Mastodon з'являється лише один раз\n  - Сповіщення Android групуються за типами сповіщень Mastodon (стеження, згадки, поширення тощо)\n  - Усунуто ймовірність зникнення сповіщень\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/106.txt",
    "content": "Tusky 22.0 beta 4\n\nВиправлення:\n\n- Виправлено повторне отримання сповіщень, якщо налаштовано кілька облікових записів\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/107.txt",
    "content": "Tusky 22.0 beta 5\n\nВиправлення:\n\n- Відкотили бібліотеку APNG для виправлення несправних анімованих емодзі\n- Збереження локальної копії маркера сповіщень на випадок, якщо сервер не підтримує API\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/108.txt",
    "content": "Tusky 22.0 beta 6\n\nВиправлення:\n\n- Частіше збереження позиції читання на вкладці Сповіщення\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/109.txt",
    "content": "Tusky 22.0 beta 7\n\nВиправлення:\n\n\n### Значні виправлення помилок\n\n- Під час створення сповіщень Mastodon для Android виводитиме всі сповіщення Mastodon, що залишилися без відповіді\n- Натискання кнопки \"Створити\" у сповіщенні могло призвести до встановлення неправильного облікового запису\n- \"ID останнього прочитаного сповіщення\" відтепер зберігатиметься в правильному обліковому записі\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/110.txt",
    "content": "Tusky 22.0\n\nНові функції:\n\n- Перегляд популярних хештегів\n- Стеження за новими хештегами\n- Краще впорядкування вибору мов\n- Показ різниці між версіями допису\n- Підтримка фільтрів Mastodon v4\n- Можливість показу статистики дописів у стрічці\n- Та інше...\n\nВиправлення:\n\n- Запам'ятовування вибраної вкладки та позиції\n- Збереження сповіщень до прочитання\n- Правильний показ змішаного RTL і LTR тексту в профілях\n- Правильне обчислення довжини допису\n- Підписи зображень публікуються завжди\n- Та інше...\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/111.txt",
    "content": "Tusky 23.0 beta 1\n\nНові функції:\n\n- Новий параметр масштабу тексту\n\nВиправлення:\n\n- Правильне збереження інформації про обліковий запис\n- Сповіщення \"потягнути\" на пристроях з Android <= 11\n- Усунено помилку в Android, коли з текстових полів не можна копіювати/вставляти\n- Перегляд \"розбіжностей\" історії змін не виходитиме за межі екрана\n- Якщо на вашому сервері немає історії зміни повідомлень не стається збоїв\n- Додано кнопку \"Видалити\" за зміни фільтра\n- Правильний показ неквадратних емодзі\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/112.txt",
    "content": "Tusky 23.0 beta 2\n\nВиправлено:\n\n- Потенційний збій під час редагування полів профілю\n- Завелике контекстне меню під час редагування описів зображень\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/113.txt",
    "content": "Tusky 23.0\n\nНове:\n\n- Новий параметр масштабу тексту\n\nВиправлення:\n\n- Правильне збереження інформації про обліковий запис\n- Сповіщення \"потягнути\" на пристроях з Android <= 11\n- Усунено помилку в Android, коли з текстових полів не можна копіювати/вставляти\n- Перегляд розбіжностей історії змін не виходитиме за межі екрана\n- Якщо на вашому сервері немає історії зміни повідомлень не стається збоїв\n- Правильний показ неквадратних емодзі\n- Потенційний збій під час редагування полів профілю\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/115.txt",
    "content": "Tusky 24.0\n\n- Блок-цитати та блоки коду в дописах тепер приємніші на вигляд.\n- Відновлено стару поведінку вкладки сповіщень.\n- У профілях тепер показані бейджики ролей.\n- Покращено роботу відеопрогравача. З'явилася можливість вибору швидкості відтворення.\n- Нова опція теми для використання чорної теми при дотриманні дизайну системи.\n- Новий вид для перегляду популярних дописів доступний як в меню, так і у вигляді кастомної вкладки.\n\nІ багато інших покращень та виправлень!\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/117.txt",
    "content": "Tusky 24.1\n\n- Екран залишатиметься увімкненим під час відтворення відео.\n- Виправлено витік пам'яті. Це повинно поліпшити стабільність і швидкодію.\n- Емодзі тепер коректно рахуються як 1 символ під час написання повідомлення.\n- Виправлено збій при виборі тексту на деяких пристроях.\n- Піктограми в текстах довідки порожніх часових шкал тепер завжди будуть правильно вирівняні.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/119.txt",
    "content": "Tusky 25\n\n- Підтримка API перекладів Mastodon translation\n- Показ мови домену\n- Покращені переходи між екранами\n- Налаштування фільтрів перенесено до налаштувань облікового запису\n- Статистика дописів тепер має стабільну позицію\n- Значне поліпшення стабільності та швидкодії під капотом\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/123.txt",
    "content": "Tusky 26\n\n- Синій основний колір було дещо змінено для кращої контрастності\n- Вміст вкладки сповіщень тепер кешується для кращої роботи офлайн.\n- Новий параметр облікового запису \"приватність відповідей типово\"\n- Значні поліпшення стабільності та швидкодії\nПовний список змін дивіться на https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/124.txt",
    "content": "Tusky 26.1\n\n- У налаштуваннях облікового запису «Приватність відповідей» тепер є дві додаткові опції: «Відповідати приватності дописів усталено» і «Безпосередньо».\n- Tusky тепер включає кореневі сертифікати ISRG, щоб продовжувати працювати на Android 7 і серверах, які використовують Let's Encrypt.\n- Виправлено помилку, через яку Tusky іноді плутав стрічки та/або сповіщення про облікові записи.\nСписок змін доступний за посиланням https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/127.txt",
    "content": "Tusky 27.0\n\n- Tusky було перероблено з урахуванням Material 3\n- Підтримка правил сповіщень (функція Mastodon 4.3)\n- Хештеги в кінці дописів відтепер показані в окремому рядку\n- Повна підтримка складних пристроїв\n\nСписок усіх змін: https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/131.txt",
    "content": "Tusky 28.0\n\n- Підтримка Android 15 та режиму від краю до краю\n- Підвищено точність push-сповіщень\n- Відповіді у стрічці тепер чітко позначені як такі\n- Кілька покращень показу сповіщень на вкладці сповіщень\n- Картки попереднього перегляду посилань отримали новий дизайн і тепер підтримують функцію fediverse:creator\n\nСписок усіх змін: https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/58.txt",
    "content": "Tusky v6.0\n\n- Фільтри стрічки в Налаштуваннях облікового запису та їхня синхронізація з сервером\n- Можна мати власний хештег вкладкою основного інтерфейсу\n- Списки можна редагувати\n- Безпека: вилучено підтримку TLS 1.0 та TLS 1.1 та додано підтримку TLS 1.3 на Android 6+\n- Пропонування власних смайлів, під час введення\n- «Слідувати системній темі»\n- Поліпшено доступність стрічки\n- Нехтування невідомими сповіщеннями без збоїв\n- Можна змінювати мову\n- Нові переклади: чеська та есперанто\n- Інше\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/61.txt",
    "content": "Tusky v7.0\n\n- Підтримка показу опитувань, голосування та повідомлень про опитування\n- Нові кнопки фільтрування вкладки сповіщень та видалення всіх сповіщень\n- видалити та переробити власні дмухи\n- новий індикатор, який показує, чи є обліковий запис ботом на зображенні профілю (можна вимкнути в налаштуваннях)\n- Нові переклади: норвезька букмол та словенська.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Тепер ви можете створювати опитування з Tusky\n- Вдосконалено пошук\n- Новий параметр налаштувань облікового запису — завжди розгортати попередження щодо вмісту\n- Аватари в навігаційній панелі тепер мають округлу квадратну форму\n- Тепер можна повідомляти про користувачів, навіть якщо вони ніколи не розміщували статус\n- Tusky тепер відмовиться під'єднуватись через незахищене з’єднання на Android 6+\n- Багато інших невеликих удосконалень та виправлень\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/68.txt",
    "content": "Tusky v9.1\n\nЦей випуск забезпечує сумісність з Mastodon 3, підвищує продуктивність і стабільність.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/70.txt",
    "content": "Tusky v10.0\n\n- Тепер ви можете закріпити статус і перелічити свої закладки в Tusky.\n- Тепер ви можете запланувати дмухи з Tusky. Зверніть увагу, що час, який ви вибираєте, має бути не раніше 5 хвилин у майбутньому.\n- Тепер ви можете додати списки на головний екран.\n- Тепер ви можете розмістити аудіовкладення з Tusky.\n\nІ багато інших невеликих поліпшень та виправлень помилок!\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- Сповіщення про нові запити, коли ваш обліковий запис заблоковано\n- Нові функції, які можна перемикати на екрані налаштувань:\n    - вимкнути перекидання між вкладками\n    - показ діалогового вікна підтвердження, перед дмухом\n    - показ попереднього перегляду посилання в стрічці\n- Розмови тепер можна приглушити\n- Вдосконалено голосування\n- Виправлено помилки, більшість з яких пов'язані зі створенням дмухів\n- Поліпшено переклади\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- Вдосконалено основний інтерфейс — тепер ви можете переміщувати вкладки вниз\n- Заглушивши користувача, ви також можете вирішити, чи ігнорувати його сповіщення\n- Тепер ви можете відстежувати скільки завгодно хештегів на окремій вкладці хештегів\n- Поліпшено спосіб показу описів медіа, тому він працює навіть для наддовгих описів\n    \nЖурнал усіх змін: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- підтримка приміток профілю (функція Mastodon 3.2.0)\n- підтримка повідомлень адміністратора (функція Mastodon 3.1.0)\n\n- аватар вибраного облікового запису тепер з'явиться на головній панелі інструментів\n- натискання показуваного імені в стрічці відкриє сторінку профілю цього користувача\n\n- багато виправлень та невеликих удосконалень\n- вдосконалено переклади\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Отримуйте сповіщення, коли користувач, який стежить за дописами, клацне піктограму дзвоника в його профілі! (Функція Mastodon 3.3.0)\n- Функція чернетки в Tusky була повністю перероблена, щоб стати швидшою, зручнішою для користувачів і з меншою кількістю помилок.\n- Додано новий режим добробуту, який дозволяє обмежити певні функції Tusky.\n- Tusky тепер може анімувати власні смайли.\nПовний журнал змін: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- Запити на підписку тепер завжди показано в головному меню.\n- Тепер вибір часу для планування публікації має дизайн, який відповідає решті програми\nЖурнал усіх змін: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/83.txt",
    "content": "Tusky v15.1\n\nУ цьому випуску виправлено збої під час захоплення зображень\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/87.txt",
    "content": "Tusky v16.0\n\n- Повністю переписано логіку завантаження подій для пришвидшення роботи, зменшення вад та полегшення підтримки.\n- Tusky тепер може анімувати користувацькі емоджі у форматі APNG та Animated WebP.\n- Виправлено багато помилок\n- Підтримка для Android 11\n- Нові переклади: шотландською гельською, галісійською, українською мовами\n- Удосконалено переклади\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/89.txt",
    "content": "Tusky v17.0\n\n- «Відкрити як...» тепер також доступно в меню профілів облікових записів за користування кількома обліковими записами\n- Тепер вхід обробляється у WebView у застосунку\n- Підтримка Android 12\n- підтримка нового API конфігурації сервера Mastodon\n- і багато інших дрібних виправлень і вдосконалень\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/91.txt",
    "content": "Tusky v18.0\n\n- Підтримка нових типів сповіщень Mastodon 3.5\n- Кращий вигляд позначки бота і розширений вибір тем\n- Текст тепер можна вибрати у докладному поданні допису\n- Виправлено безліч помилок, включно з тою, яка перешкоджала входу на Android 6 і старіших\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/94.txt",
    "content": "Tusky 19.0\n\n- Підтримка Unified Push. Щоб активувати підтримку, вам потрібно повторно увійти в обліковий запис.\n- Кількість відповідей на допис тепер вказана у стрічках.\n- Зображення тепер можуть обрізатися під час складання допису.\n- Профілі тепер показують дату їхнього створення.\n- Під час перегляду списку назва відтепер показана на панелі інструментів.\n- Усунення помилок\n- Покращення перекладу\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/97.txt",
    "content": "Tusky 20.0\n\n- Нова піктограма застосунку від Dzuk https://dzuk.zone/\n- Додано можливість слідкувати за хештегами. Натисніть на нього, а потім на піктограму на панелі інструментів.\n- Підтримка Android 13\n- новий спадний список у вікні створення допису для вибору мови допису\n- Вкладка «Медіа» у профілях завантажується плавніше для чутливих носіїв.\n- З'явилася можливість установити фокусувати зображення перед оприлюдненням\n- Нова опція показу вашого повного імені користувача на панелі інструментів\n"
  },
  {
    "path": "fastlane/metadata/android/uk/full_description.txt",
    "content": "Tusky — це легкий клієнт для Mastodon, безплатної соціальної мережі з відкритим кодом сервера.\n\n• Дизайн в стилі Material\n• Підтримка більшості можливостей Mastodon\n• Підтримка кількох облікових записів\n• Темна та світла теми з можливістю автоперемикання залежно від часу доби\n• Чернетки — почніть створювати допис і збережіть його на потім\n• Вибір між різними наборами емодзі\n• Застосунок оптимізовано для різних розмірів екрана\n• Відкритий джерельний код, ніяких не вільних складників, як-от служб Google.\n\nЩоб дізнатися більше про Mastodon, відвідайте https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/uk/short_description.txt",
    "content": "Клієнт соціальної мережі Mastodon з підтримкою кількох облікових записів\n"
  },
  {
    "path": "fastlane/metadata/android/uk/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- Hỗ trợ sửa tút\n- Thêm cài đặt cách đọc\n- Xem trước media và lớp phủ mới để biểu thị phương tiện có mô tả\n- Cho phép thêm tài khoản vào danh sách hồ sơ\nvà còn nữa\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/103.txt",
    "content": "Tusky 22.0\n\nTính năng:\n\n- Hiện hashtag nổi bật\n- Sửa mô tả ảnh và trọng tâm ảnh\n- Menu \"Làm tươi\"\n- Hỗ trợ bộ lọc Mastodon v4\n- Hiện thông tin khi một tút có sửa đổi\n- Tùy chọn hiện số tương tác trên bảng tin\n\nSửa lỗi:\n\n- Hiện nút điều khiển khi phát âm thanh\n- Lỗi độ dài tút\n- Luôn đăng mô tả ảnh\n\nvà nhiều nữa\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/104.txt",
    "content": "Tusky 22.0 beta 2\n\nFixes including:\n\n- Improved notification loading speed\n- Restore showing 0/1/1+ for replies\n- Show filter titles, not filter keywords, on filtered posts\n- Fixed a bug where opening a status could open an unrelated link\n- Show \"Add\" button in correct place when there are no filters\n- Fixed assorted crashes\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/105.txt",
    "content": "Tusky 22.0 beta 3\n\nFixes including:\n\n- Fixed crash when viewing a thread\n- Fixed crash processing Mastodon filters\n- Links in bios of follow/follow request notifications are clickable\n- Android Notifications updates\n  - Android notification for a Mastodon notification should only be shown once\n  - Android notifications are grouped by Mastodon notification type (follow, mention, boost, etc)\n  - Potential for missing notifications has been removed\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/106.txt",
    "content": "Tusky 22.0 beta 4\n\nFixes:\n\n- Fixed repeated fetch of notifications if configured with multiple accounts\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/107.txt",
    "content": "Tusky 22.0 beta 5\n\nFixes:\n\n- Rolled back APNG library to fix broken animated emojis\n- Save local copy of notification marker in case server does not support the API\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/108.txt",
    "content": "Tusky 22.0 beta 6\n\nFixes:\n\n- Save reading position in the Notifications tab more frequently\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/109.txt",
    "content": "Tusky 22.0 beta 7\n\nFixes:\n\n\n### Significant bug fixes\n\n- Fetch all outstanding Mastodon notifications when creating Android notifications\n- Clicking \"Compose\" from a notification would set the wrong account\n- Ensure \"last read notification ID\" is saved to the correct account\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/110.txt",
    "content": "Tusky 22.0\n\nTính năng mới:\n- Xem hashtag xu hướng\n- Theo dõi hashtag\n- Chọn ngôn ngữ dễ hơn\n- Xem lịch sử sửa tút\n- Hỗ trợ bộ lọc Mastodon v4\n- Hiện số tương tác tút trên bảng tin\n- Còn nữa...\n\nSửa:\n- Nhớ tab đã chọn và vị trí\n- Giữ thông báo cho tới khi đọc\n- Nội dung RTL và LTR trên hồ sơ\n- Tính toán độ dài tút\n- Luôn đăng mô tả ảnh\n- Còn nữa...\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/111.txt",
    "content": "Tusky 23.0 beta 1\n\nMới:\n\n- Tăng cỡ chữ\n\nSửa:\n\n- Lưu đúng thông tin tài khoản\n- \"đẩy\" thông báo trên Android 11 trở xuống\n- Sửa lỗi Android quên copy/paste\n- Hiện \"diffs\" trong lịch sử sửa tút\n- Sửa lỗi crash\n- Thêm nút \"Xóa\" khi sửa bộ lọc\n- Hiện đúng emoji không vuông\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/112.txt",
    "content": "Tusky 23.0 beta 2\n\nSửa:\n\n- Sửa crash khi sửa hồ sơ\n- Mở rộng menu khi sửa mô tả hình ảnh\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/113.txt",
    "content": "Tusky 23.0\n\nMới:\n- Thu phóng chữ trên giao diện\n\nSửa:\n- Lưu thông tin tài khoản chính xác\n- \"đẩy\" thông báo trên Android 11\n- Lỗi copy/paste không được\n- Xem lịch sử sửa tút\n- Không crash khi máy chủ của bạn không có lịch sử sửa\n- Hiện emoji không vuông chính xác\n- Lỗi crash khi sửa hồ sơ\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/115.txt",
    "content": "Tusky 24.0\n\n- Blockquotes đẹp hơn.\n- Tab thông báo trở về như cũ.\n- Hiện huy hiệu vai trò trên hồ sơ.\n- Cải thiện trình phát video. Cho chọn tốc độ phát.\n- Thêm chủ đề đen.\n- Hiện những tút thịnh hành.\n\nVà các cải thiện khác!\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/117.txt",
    "content": "Tusky 24.1\n\n- Màn hình đứng im khi phát video.\n- Sửa lỗi memory leak.\n- Emoji được tính như 1 ký tự.\n- Sửa lỗi crash khi chọn text.\n- Canh đều biểu tượng trợ giúp.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/119.txt",
    "content": "Tusky 25\n\n- Hỗ trợ Mastodon Dịch API\n- Hiện ngôn ngữ tút\n- Cải thiện chuyển đổi màn hình\n- Cài đặt bộ lọc được chuyển sang tùy chọn tài khoản\n- Thống kê bài viết bây giờ đã có vị trí ổn định\n- Rất nhiều cải tiến về độ ổn định và hiệu suất bên trong\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/123.txt",
    "content": "Tusky 26\n\n- Giảm màu xanh chủ đề để tăng độ tương phản\n-Lưu cache nội dung tab thông báo\n- Thêm \"chế độ trả lời mặc định\"\n- Rất nhiều cải tiến về độ ổn định và hiệu suất\nXem https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md để biết thêm\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/124.txt",
    "content": "Tusky 26.1\n\n- The \"Reply privacy\" account preference now has two additional options: \"Match default post privacy\" and \"Direct\".\n- Tusky now includes ISRG root certificates to keep working on Android 7 and servers that use Let's Encrypt.\n- Fixes a bug where Tusky sometimes mixes up timelines and/or notifications of accounts.\nSee https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md for the full changelog\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/127.txt",
    "content": "Tusky 27.0\n\n- Tusky được thiết kế lại với Material 3\n- Hỗ trợ chính sách thông báo (tính năng có từ Mastodon 4.3)\n- Hashtag ở cuối tút sẽ được phân chia riêng rẽ\n- Hỗ trợ thiết bị gập\n\nXem https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md để biết chi tiết\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/131.txt",
    "content": "Tusky 28.0\n\n- Hỗ trợ Android 15 và chế độ tràn viền\n- Cải thiện thông báo đẩy\n- Cải thiện tab thông báo\n- Làm nổi bật lượt trả lời trên bảng tin\n- Thiết kế lại Xem trước liên kết và hỗ trợ tính năng fediverse:creator\n\nXem đầy đủ https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/133.txt",
    "content": "Tusky 29.0\n\n- Bộ biểu tượng mới\n- Cải thiện bố cục bình chọn và thêm nút \"hiện kết quả\"\n- Hỗ trợ hành động lọc \"che mờ\" (tính năng Mastodon 4.4)\n- Cải thiện chất lượng hiển thị hình ảnh\n- Thêm hộp thoại bổ sung nhắc thêm mô tả hình ảnh\n- Cải thiện hộp thoại xác nhận Đăng lại và Thích\n\nXem https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md để biết thêm thông tin\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/58.txt",
    "content": "Tusky 6.0\n\n- Tùy chỉnh hashtag\n- Chỉnh sửa danh sách\n- Bảo mật\n- Gợi ý emoji\n- Cài đặt chủ đề mới\n- Bỏ qua các thông chưa biết\n- Thiết lập ngôn ngữ khác\n- Bản dịch mới: Czech và Esperanto\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/61.txt",
    "content": "Tusky 7.0\n\n- Hỗ trợ hiển thị bình chọn\n- Thêm nút mới trên tab\n- xóa và viết lại tút\n- Hiển thị danh tính Bot\n- Bản dịch mới: Norwegian Bokmål và Slovenian.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/67.txt",
    "content": "Tusky v9.0\n\n- Tạo bình chọn\n- Cải thiện tìm kiếm\n- Cài đặt mở rộng nội dung nhạy cảm\n- Thêm bo viền cho ảnh đại diện\n- Thêm tính năng báo cáo\n- Fix cleartext connections trên Android 6+\n- Cải thiện và sửa lỗi\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/68.txt",
    "content": "Tusky 9.1\n\nCải tiến sự tương thích với Mastodon 3 cũng như giao diện đồ họa.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/70.txt",
    "content": "Tusky 10.0\n\n- Bạn có thể lưu tút với Tusky.\n- Bạn có thể lên lịch đăng tút với Tusky.\n- Bạn có thể thêm danh sách.\n- Bạn có thể đăng tập tin âm thanh với Tusky.\n\nNhiều cải thiện nhỏ và sửa lỗi khác!\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/72.txt",
    "content": "Tusky 11.0\n\n- Thông báo yêu cầu theo dõi mới\n- Thêm tính năng trong màn hình Cài Đặt\n- Có thể ẩn cuộc đối thoại\n- Cải thiện thuật toán Bình Chọn\n- Sửa lỗi liên quan khi viết tút\n- Cải thiện bản dịch\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/74.txt",
    "content": "Tusky 12.0\n\n- Cải thiện giao diện - giờ bạn có thể chuyển tab lên trên\n- Khi ẩn ai đó, bạn có thể chọn ẩn thông báo từ họ hay không\n- Tab Hashtag giờ đã hiện tất cả hashtag\n- Cải thiện phần mô tả đa phương tiện\n- Thêm ngôn ngữ: Irish, Hindi, Vietnamese và Thai\n    \nFull changelog: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- Hỗ trợ ghi chú về một ai đó (tính năng Mastodon 3.2.0)\n- Hỗ trợ hiện thông báo máy chủ (tính năng Mastodon 3.1.0)\n- Ảnh đại diện của tài khoản từ giờ sẽ hiện trên thanh menu chính\n- Nhấn vào tên ai đó trên bảng tin sẽ chuyển tới trang cá nhân của họ\n- Sửa lỗi linh tinh và cải thiện hiệu năng\n- Trau dồi bản dịch\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- Thông báo khi người bạn theo dõi đăng tút - click vào biểu tượng cái chuông trên trang cá nhân của họ! (Mastodon 3.3.0)\n- Tút Nháp: được thiết kế lại toàn bộ, giúp nhanh hơn, dễ dùng hơn và ít lỗi hơn.\n- Chế độ Cai Nghiện: cho phép bạn giới hạn một số tính năng của Tusky.\n- Hỗ trợ Emoji động: cho phép xem emoji động trong Tusky.\n- Ẩn Có Thời Hạn: có thể chặn người nào đó trong khoảng thời gian cho trước.\n- Sửa các lỗi vặt, đặc biệt là sự tương thích Pleroma.\n- Cải thiện bản dịch\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- Hiện yêu cầu theo dõi trên menu chính.\n- Cải thiện thời gian lên lịch tút với thiết kế thuận tiện hơn.\nFull changelog: https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/83.txt",
    "content": "Tusky v15.1\n\nSửa lỗi crash khi ghi chú cho hình\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/87.txt",
    "content": "Tusky v16.0\n\n- Viết lại hoàn toàn phương thức tải bảng tin để tải nhanh hơn, ít lỗi hơn và dễ bảo trì\n- Hỗ trợ emoji định dạng APNG & WebP động\n- Sửa nhiều lỗi khác\n- Hỗ trợ Android 11\n- Ngôn ngữ mới: Scottish Gaelic, Galician, Ukrainian\n- Cải thiện bản dịch\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/89.txt",
    "content": "Tusky v17.0\n\n- Hiện \"Mở bằng...\" trong menu Tài khoản kể cả khi dùng nhiều tài khoản\n- Hiện đăng nhập bằng WebView ngay trong app\n- Hỗ trợ Android 12\n- Hỗ trợ thiết lập API máy chủ Mastodon mới\n- Sửa lỗi nhỏ và cải thiện\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/91.txt",
    "content": "Tusky v18.0\n\n- Hỗ trợ những kiểu thông báo mới của Mastodon 3.5\n- Nhãn của tài khoản nhìn đẹp hơn và thay đổi theo chủ đề\n- Cho phép chọn và sao chép nội dung tút\n- Sửa lỗi chặn đăng nhập trên Android 6 trở xuống\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/94.txt",
    "content": "Tusky 19.0\n\n- Hỗ trợ Unified Push. Bạn cần đăng nhập lại để sử dụng được.\n- Hiện số lượng trả lời trên nút\n- Cắt ảnh khi viết tút\n- Hiện ngày tham gia Mastodon\n- Khi xem danh sách, tựa đề sẽ hiện trên toolbar\n- Sửa lỗi vặt\n- Cải thiện bản dịch\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/97.txt",
    "content": "Tusky 20.0\n\n- Biểu tượng app mới của Dzuk https://dzuk.zone/\n- Theo dõi hashtag. Nhấn vào một hashtag và sau đó nhấn vào biểu tượng trên thanh công cụ.\n- Hỗ trợ Android 13\n- Chọn ngôn ngữ của tút\n- Tab media trong hồ sơ hiện tôn trọng media nhạy cảm và tải mượt mà hơn.\n- Đặt điểm lấy nét của ảnh trước khi đăng\n- Tùy chọn mới để hiển thị tên người dùng đầy đủ của bạn trên thanh công cụ\n"
  },
  {
    "path": "fastlane/metadata/android/vi/full_description.txt",
    "content": "Tusky là ứng dụng di động nhỏ gọn dành cho Mastodon, một mạng xã hội tự do và mã nguồn mở.\n\n• Thiết kế tinh tế\n• Thực thi hầu hết Mastodon API\n• Hỗ trợ đăng nhập nhiều tài khoản\n• Giao diện sáng hoặc tối, tự động kích hoạt dựa theo thời gian của thiết bị\n• Viết và lưu nháp tút\n• Tùy chọn nhiều bộ Emoji khác nhau\n• Tối ưu hóa cho mọi kích cỡ màn hình\n• Mã nguồn mở hoàn toàn\n\nĐể tìm hiểu thêm Mastodon, truy cập https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/vi/short_description.txt",
    "content": "Một ứng dụng di động cho mạng xã hội Mastodon\n"
  },
  {
    "path": "fastlane/metadata/android/vi/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/100.txt",
    "content": "Tusky 21.0\n\n- 支持编辑嘟文\n- 控制偏首选阅读方向的新设置\n- 支持预览更大的媒体文件以及表明带描述媒体文件的新遮罩\n- 允许从账户的资料页将其添加到列表\n还有其他更多内容有待发现\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/58.txt",
    "content": "Tusky v6.0\n\n-时间轴过滤器已移至“账户首选项”，并将与服务器同步\n-现在，您可以在主界面中将自定义主题标签作为标签\n-现在可以编辑列表\n-安全性：删除了对 TLS 1.0 和 TLS 1.1 的支持，并在 Android 6+ 上添加了对 TLS 1.3 的支持\n-现在，撰写视图将在开始键入时建议自定义表情符号\n-新的主题设置“遵循系统主题”\n-改善了时间表的可访问性\n-Tusky 现在将忽略未知的通知，不再崩溃\n-新设置：您现在可以覆盖系统语言，并在 Tusky 中设置其他语言\n-新译文：捷克文和世界语\n-其他许多改进和修正\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/61.txt",
    "content": "Tusky v7.0\n\n-支持显示投票，投票和投票通知\n-新按钮可过滤通知标签并删除所有通知\n-删除并重新草拟自己的嘟文\n-新的指示器，用于在个人资料图片上显示账户是否为漫游器（可以在首选项中关闭）\n-新的翻译：挪威博克马尔语和斯洛文尼亚语。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/67.txt",
    "content": "Tusky v9.0\n\n-您现在可以从 Tusky 创建投票\n-改进了搜索\n-账户首选项中的新选项可始终扩展内容警告\n-导航抽屉中的头像现在具有圆角正方形\n-现在即使用户从未发布过状态，也可以报告他们\n-Tusky 现在将拒绝通过 Android 6+ 上的明文连接进行连接\n-其他许多小改进和错误修复\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/68.txt",
    "content": "Tusky v9.1\n\n此版本确保了与 Mastodon 3 的兼容性并提高了性能和稳定性。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/70.txt",
    "content": "Tusky v10.0\n\n-现在，您可以为状态添加书签并在 Tusky 中列出您的书签。\n-您现在可以使用 Tusky 来安排嘟文。请注意，您选择的时间必须至少为5分钟。\n-您现在可以将列表添加到主屏幕。\n-您现在可以使用 Tusky 发布音频附件。\n\n还有许多其他小的改进和错误修复！\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/72.txt",
    "content": "Tusky v11.0\n\n- 锁嘟开启时通知新关注请求\n- 新设置:\n   - 禁用标签页间滑动\n   - 转嘟前提示确认\n   - 在时间轴上显示链接预览\n- 对话可被隐藏\n- 投票结果现在用投票人数计算而非用票数计算，从而使得多选投票结果更容易理解\n- 许多Bug修复，其中主要是一些和发嘟文相关的 Bug\n- 改进翻译\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/74.txt",
    "content": "Tusky v12.0\n\n- 主界面改善，现在标签页可被放至底部\n- 隐藏用户时提供同时隐藏来自该用户的通知的选项\n- 同一标签页下可显示的话题数量现在不受限制\n- 改善媒体描述信息的显示方式，使其支持超长描述\n    \n完整更新日志：https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/77.txt",
    "content": "Tusky v13.0\n\n- 支持账号备注（Mastodon 3.2.0 特性）\n- 支持公告栏（Mastodon 3.1.0特性）\n\n- 当前账号的头像将在导航栏显示\n- 在时间线中点击账号名称后打开该用户的资料页\n\n- 其他许多小改进和错误修复\n- 改善翻译\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/80.txt",
    "content": "Tusky v14.0\n\n- 点击账号详情页的铃铛即可在该用户发送了新嘟文时得到通知！（Mastodon 3.3.0 新功能）\n- Tusky 的草稿功能已被重新设计，它现在更快、更友好，Bug也更少了。\n- 添加了健康模式，可限制特定的一些 Tusky 功能。\n- Tusky 现在可显示动态自定义Emoji。\n完整更新日志：https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/82.txt",
    "content": "Tusky v15.0\n\n- 关注请求将总在首页显示。\n- 预订嘟文时间选取器的设计风格现与 App 一致。\n完整更新日志：https://github.com/tuskyapp/Tusky/releases\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/83.txt",
    "content": "Tusky v15.1\n\n此版本修复了给图片添加标题时会崩溃的问题\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/87.txt",
    "content": "Tusky v16.0\n\n- 时间线加载逻辑完全重写，提升了流畅度、稳定性，更便于维护。\n- APNG 和动画 WebP 格式的动态自定义表情符号。\n- 修正大量 BUG\n- 支持 Android 11\n- 新增界面语言支持：苏格兰盖尔语、加利西亚语、乌克兰语\n- 改进翻译\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/89.txt",
    "content": "Tusky v17.0\n\n- 使用多个账户时，“打开为...”现在也可以在账户配置文件的菜单中使用。\n- 登录现在在内嵌的 WebView 中处理。\n- 支持 Android 12。\n- 支持新的 Mastodon 实例配置 API。\n- 一些其它小修复和改动\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/91.txt",
    "content": "Tusky v18.0\n\n- 支持新的 Mastodon 3.5 通知类型。\n- 机器人徽章现在看起来更棒，并将适应所选主题。\n- 嘟文详情视图上的文本现在可以被选择。\n- 修复了一些 bugs，其中有一个会阻止在 Android 6 及更低版本的设备上登录\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/94.txt",
    "content": "Tusky 19.0\n\n- 支持统一推送。 要激活支持，您必须重新登录您的账户。\n- 嘟文的回复数量现在显示在时间轴中。\n- 现在可以在撰写嘟文时裁剪图片。\n- 配置文件现在将显示创建日期。\n- 查看列表时，标题将显示在工具栏中。\n- 很多错误修正。\n- 翻译改进\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/97.txt",
    "content": "Tusky 20.0\n\n- 来自 Dzuk 的新图标 https://dzuk.zone/\n- 您现在可以关注主题标签。 点击主题标签后再点击工具栏中的图标即可。\n- 支持 Android 13\n- 撰写视图中用于设置嘟文语言的新下拉菜单\n- 配置文件中的媒体选项卡现在尊重敏感媒体且加载得更流畅。\n- 现在可以在发布前设置图片的焦点\n- 在工具栏中显示完整用户名的新选项\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/full_description.txt",
    "content": "Tusky 是 Mastodon（一个免费的开源社交网络服务器）的轻量级客户端。\n\n• MD 设计\n• 支持大多数 Mastodon API\n• 多账户支持\n• 深色和浅色主题，可以根据时间自动切换\n• 草稿 - 编写嘟文并将其保存以备后用\n• 选择不同的表情样式\n• 针对所有屏幕尺寸进行了优化\n• 完全开源 - 没有像 Google 服务这样的非自由依赖项\n\n要了解有关Mastodon的更多信息，请访问 https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/short_description.txt",
    "content": "社交网络 Mastodon 的多账户客户端\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/full_description.txt",
    "content": "Tusky 是 Mastodon（一個免費的開源社交網絡服務器）的輕量級客戶端。\n\n• MD 設計\n• 支援大多數 Mastodon API\n• 多帳戶支援\n• 深色和淺色主題，可以根據時間自動切換\n• 草稿 - 編寫嘟文並將其保存以備後用\n• 選擇不同的表情樣式\n• 針對所有屏幕尺寸進行了優化\n• 完全開源 - 沒有像 Google 服務這樣的非自由依賴項\n\n要了解有關 Mastodon 的更多信息，請訪問 https://joinmastodon.org/\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/short_description.txt",
    "content": "社交網絡 Mastodon 的多帳戶客戶端\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/title.txt",
    "content": "Tusky\n"
  },
  {
    "path": "gradle/libs.versions.toml",
    "content": "[versions]\nagp = \"8.10.0\"\nandroidx-activity = \"1.10.1\"\nandroidx-appcompat = \"1.7.0\"\nandroidx-browser = \"1.8.0\"\nandroidx-cardview = \"1.0.0\"\nandroidx-constraintlayout = \"2.2.1\"\nandroidx-core = \"1.16.0\"\nandroidx-drawerlayout = \"1.2.0\"\nandroidx-exifinterface = \"1.4.1\"\nandroidx-fragment = \"1.8.6\"\nandroidx-hilt = \"1.2.0\"\nandroidx-junit = \"1.2.1\"\nandroidx-lifecycle = \"2.9.0\"\nandroidx-media3 = \"1.6.1\"\nandroidx-paging = \"3.3.6\"\nandroidx-preference = \"1.2.1\"\nandroidx-recyclerview = \"1.4.0\"\nandroidx-sharetarget = \"1.2.0\"\nandroidx-splashscreen = \"1.2.0-beta02\"\nandroidx-swiperefresh-layout = \"1.1.0\"\nandroidx-testing = \"2.2.0\"\nandroidx-viewpager2 = \"1.1.0\"\nandroidx-work = \"2.10.1\"\nandroidx-room = \"2.7.1\"\nbouncycastle = \"1.70\"\nconscrypt = \"2.5.3\"\ncoroutines = \"1.10.2\"\ndiffx = \"1.1.2\"\nemoji2 = \"1.5.0\"\nfilemoji-compat = \"3.2.7\"\nglide = \"4.16.0\"\nglide-animation-plugin = \"3.0.4\"\nhilt = \"2.56.2\"\nkotlin = \"2.1.21\"\nimage-cropper = \"4.3.2\"\nmaterial = \"1.12.0\"\nmaterial-drawer = \"9.0.2\"\nmockito-inline = \"5.2.0\"\nmockito-kotlin = \"5.4.0\"\nmoshi = \"1.15.2\"\nnetworkresult-calladapter = \"1.2.0\"\nokhttp = \"4.12.0\"\nokio = \"3.11.0\"\nretrofit = \"3.0.0\"\nrobolectric = \"4.14.1\"\nsparkbutton = \"4.2.0\"\ntouchimageview = \"3.7.1\"\nturbine = \"1.2.0\"\nunified-push = \"2.4.0\"\nxmlwriter = \"1.0.4\"\n\n[plugins]\nandroid-application = { id = \"com.android.application\", version.ref = \"agp\" }\ngoogle-ksp = \"com.google.devtools.ksp:2.1.21-2.0.1\"\nhilt-android = { id = \"com.google.dagger.hilt.android\", version.ref = \"hilt\" }\nkotlin-android = { id = \"org.jetbrains.kotlin.android\", version.ref = \"kotlin\" }\nkotlin-parcelize = { id = \"org.jetbrains.kotlin.plugin.parcelize\", version.ref = \"kotlin\" }\nktlint = \"org.jlleitschuh.gradle.ktlint:12.2.0\"\nlicensee = \"app.cash.licensee:1.13.0\"\n\n[libraries]\nandroid-material = { module = \"com.google.android.material:material\", version.ref = \"material\" }\nandroidx-activity = { module = \"androidx.activity:activity\", version.ref = \"androidx-activity\" }\nandroidx-appcompat = { module = \"androidx.appcompat:appcompat\", version.ref = \"androidx-appcompat\" }\nandroidx-browser = { module = \"androidx.browser:browser\", version.ref = \"androidx-browser\" }\nandroidx-cardview = { module = \"androidx.cardview:cardview\", version.ref = \"androidx-cardview\" }\nandroidx-constraintlayout = { module = \"androidx.constraintlayout:constraintlayout\", version.ref = \"androidx-constraintlayout\" }\nandroidx-core-ktx = { module = \"androidx.core:core-ktx\", version.ref = \"androidx-core\" }\nandroidx-core-splashscreen = { module = \"androidx.core:core-splashscreen\", version.ref = \"androidx-splashscreen\" }\nandroidx-core-testing = { module = \"androidx.arch.core:core-testing\", version.ref = \"androidx-testing\" }\nandroidx-drawerlayout =  { group = \"androidx.drawerlayout\", name = \"drawerlayout\", version.ref = \"androidx-drawerlayout\" }\nandroidx-emoji2-core = { module = \"androidx.emoji2:emoji2\", version.ref = \"emoji2\" }\nandroidx-emoji2-views-core = { module = \"androidx.emoji2:emoji2-views\", version.ref = \"emoji2\" }\nandroidx-emoji2-view-helper = { module = \"androidx.emoji2:emoji2-views-helper\", version.ref = \"emoji2\" }\nandroidx-exifinterface = { module = \"androidx.exifinterface:exifinterface\", version.ref = \"androidx-exifinterface\" }\nandroidx-fragment-ktx = { module = \"androidx.fragment:fragment-ktx\", version.ref = \"androidx-fragment\" }\nandroidx-hilt-compiler = { module = \"androidx.hilt:hilt-compiler\", version.ref = \"androidx-hilt\" }\nandroidx-hilt-work = { module = \"androidx.hilt:hilt-work\", version.ref = \"androidx-hilt\" }\nandroidx-lifecycle-viewmodel-ktx = { module = \"androidx.lifecycle:lifecycle-viewmodel-ktx\", version.ref = \"androidx-lifecycle\" }\nandroidx-media3-exoplayer = { module = \"androidx.media3:media3-exoplayer\", version.ref = \"androidx-media3\" }\nandroidx-media3-datasource-okhttp = { module = \"androidx.media3:media3-datasource-okhttp\", version.ref = \"androidx-media3\" }\nandroidx-media3-ui = { module = \"androidx.media3:media3-ui\", version.ref = \"androidx-media3\" }\nandroidx-paging-runtime-ktx = { module = \"androidx.paging:paging-runtime-ktx\", version.ref = \"androidx-paging\" }\nandroidx-preference-ktx = { module = \"androidx.preference:preference-ktx\", version.ref = \"androidx-preference\" }\nandroidx-room-compiler = { module = \"androidx.room:room-compiler\", version.ref = \"androidx-room\" }\nandroidx-room-paging = { module = \"androidx.room:room-paging\", version.ref = \"androidx-room\" }\nandroidx-room-ktx = { module = \"androidx.room:room-ktx\", version.ref = \"androidx-room\" }\nandroidx-room-testing = { module = \"androidx.room:room-testing\", version.ref = \"androidx-room\" }\nandroidx-recyclerview = { module = \"androidx.recyclerview:recyclerview\", version.ref = \"androidx-recyclerview\" }\nandroidx-sharetarget = { module = \"androidx.sharetarget:sharetarget\", version.ref = \"androidx-sharetarget\" }\nandroidx-swiperefreshlayout = { module = \"androidx.swiperefreshlayout:swiperefreshlayout\", version.ref = \"androidx-swiperefresh-layout\" }\nandroidx-test-junit = { module = \"androidx.test.ext:junit\", version.ref = \"androidx-junit\" }\nandroidx-viewpager2 = { module = \"androidx.viewpager2:viewpager2\", version.ref = \"androidx-viewpager2\" }\nandroidx-work-runtime-ktx = { module = \"androidx.work:work-runtime-ktx\", version.ref = \"androidx-work\" }\nandroidx-work-testing = { module = \"androidx.work:work-testing\", version.ref = \"androidx-work\" }\nbouncycastle = { module = \"org.bouncycastle:bcprov-jdk15on\", version.ref = \"bouncycastle\" }\nconscrypt-android = { module = \"org.conscrypt:conscrypt-android\", version.ref = \"conscrypt\" }\nhilt-android = { group = \"com.google.dagger\", name = \"hilt-android\", version.ref = \"hilt\" }\nhilt-compiler = { group = \"com.google.dagger\", name = \"hilt-compiler\", version.ref = \"hilt\" }\ndiffx = { module = \"org.pageseeder.diffx:pso-diffx\", version.ref = \"diffx\" }\nfilemojicompat-core = { module = \"de.c1710:filemojicompat\", version.ref = \"filemoji-compat\" }\nfilemojicompat-defaults = { module = \"de.c1710:filemojicompat-defaults\", version.ref = \"filemoji-compat\" }\nfilemojicompat-ui = { module = \"de.c1710:filemojicompat-ui\", version.ref = \"filemoji-compat\" }\nglide-animation-plugin = { module = \"com.github.penfeizhou.android.animation:glide-plugin\", version.ref = \"glide-animation-plugin\" }\nglide-compiler = { module = \"com.github.bumptech.glide:ksp\", version.ref = \"glide\" }\nglide-core = { module = \"com.github.bumptech.glide:glide\", version.ref = \"glide\" }\nglide-okhttp3-integration = { module = \"com.github.bumptech.glide:okhttp3-integration\", version.ref = \"glide\" }\nkotlinx-coroutines-android = { module = \"org.jetbrains.kotlinx:kotlinx-coroutines-android\", version.ref = \"coroutines\" }\nkotlinx-coroutines-test = { module = \"org.jetbrains.kotlinx:kotlinx-coroutines-test\", version.ref = \"coroutines\" }\nimage-cropper = { module = \"com.github.CanHub:Android-Image-Cropper\", version.ref = \"image-cropper\" }\nmaterial-drawer-core = { module = \"com.mikepenz:materialdrawer\", version.ref = \"material-drawer\" }\nmaterial-drawer-iconics = { module = \"com.mikepenz:materialdrawer-iconics\", version.ref = \"material-drawer\" }\nmockito-kotlin = { module = \"org.mockito.kotlin:mockito-kotlin\", version.ref = \"mockito-kotlin\" }\nmockito-inline = { module = \"org.mockito:mockito-inline\", version.ref = \"mockito-inline\" }\nmockwebserver = { module = \"com.squareup.okhttp3:mockwebserver\", version.ref = \"okhttp\" }\nmoshi-core = { module = \"com.squareup.moshi:moshi\", version.ref = \"moshi\" }\nmoshi-adapters = { module = \"com.squareup.moshi:moshi-adapters\", version.ref = \"moshi\" }\nmoshi-kotlin-codegen = { module = \"com.squareup.moshi:moshi-kotlin-codegen\", version.ref = \"moshi\" }\nnetworkresult-calladapter = { module = \"at.connyduck:networkresult-calladapter\", version.ref = \"networkresult-calladapter\" }\nokhttp-core = { module = \"com.squareup.okhttp3:okhttp\", version.ref = \"okhttp\" }\nokhttp-logging-interceptor = { module = \"com.squareup.okhttp3:logging-interceptor\", version.ref = \"okhttp\" }\nokio = { module = \"com.squareup.okio:okio\", version.ref = \"okio\" }\nretrofit-converter-moshi = { module = \"com.squareup.retrofit2:converter-moshi\", version.ref = \"retrofit\" }\nretrofit-core = { module = \"com.squareup.retrofit2:retrofit\", version.ref = \"retrofit\" }\nrobolectric = { module = \"org.robolectric:robolectric\", version.ref = \"robolectric\" }\nsparkbutton = { module = \"at.connyduck.sparkbutton:sparkbutton\", version.ref = \"sparkbutton\" }\ntouchimageview = { module = \"com.github.MikeOrtiz:TouchImageView\", version.ref = \"touchimageview\" }\nturbine = { module = \"app.cash.turbine:turbine\", version.ref = \"turbine\" }\nunified-push = { module = \"com.github.UnifiedPush:android-connector\", version.ref = \"unified-push\" }\nxmlwriter = { module = \"org.pageseeder.xmlwriter:pso-xmlwriter\", version.ref = \"xmlwriter\" }\n\n[bundles]\nandroidx = [\"androidx-core-ktx\", \"androidx-appcompat\", \"androidx-fragment-ktx\", \"androidx-browser\", \"androidx-swiperefreshlayout\",\n    \"androidx-recyclerview\", \"androidx-exifinterface\", \"androidx-cardview\", \"androidx-preference-ktx\", \"androidx-sharetarget\",\n    \"androidx-emoji2-core\", \"androidx-emoji2-views-core\", \"androidx-emoji2-view-helper\", \"androidx-lifecycle-viewmodel-ktx\",\n    \"androidx-constraintlayout\", \"androidx-paging-runtime-ktx\", \"androidx-viewpager2\", \"androidx-work-runtime-ktx\",\n    \"androidx-core-splashscreen\", \"androidx-activity\", \"androidx-media3-exoplayer\", \"androidx-media3-datasource-okhttp\",\n    \"androidx-media3-ui\", \"androidx-drawerlayout\"]\nfilemojicompat = [\"filemojicompat-core\", \"filemojicompat-ui\", \"filemojicompat-defaults\"]\nglide = [\"glide-core\", \"glide-okhttp3-integration\", \"glide-animation-plugin\"]\nmaterial-drawer = [\"material-drawer-core\", \"material-drawer-iconics\"]\nmockito = [\"mockito-kotlin\", \"mockito-inline\"]\nmoshi = [\"moshi-core\", \"moshi-adapters\"]\nokhttp = [\"okhttp-core\", \"okhttp-logging-interceptor\"]\nretrofit = [\"retrofit-core\", \"retrofit-converter-moshi\"]\nroom = [\"androidx-room-ktx\", \"androidx-room-paging\"]\nxmldiff = [\"diffx\", \"xmlwriter\"]\n"
  },
  {
    "path": "gradle/verification-metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<verification-metadata xmlns=\"https://schema.gradle.org/dependency-verification\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"https://schema.gradle.org/dependency-verification https://schema.gradle.org/dependency-verification/dependency-verification-1.3.xsd\">\n   <configuration>\n      <verify-metadata>true</verify-metadata>\n      <verify-signatures>false</verify-signatures>\n      <trusted-artifacts>\n         <trust file=\".*-javadoc[.]jar\" regex=\"true\"/>\n         <trust file=\".*-sources[.]jar\" regex=\"true\"/>\n         <trust file=\"gradle-[0-9.]+-src.zip\" regex=\"true\"/>\n         <trust file=\"groovy-[a-z]*-?[0-9.]+.pom\" regex=\"true\"/>\n      </trusted-artifacts>\n   </configuration>\n   <components>\n      <component group=\"androidx.activity\" name=\"activity\" version=\"1.10.0\">\n         <artifact name=\"activity-1.10.0.aar\">\n            <sha256 value=\"c72301bc7307769cd6c3e0edb8da5837e7dea6fd89a5cdedfcfc87bd581850e1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"activity-1.10.0.module\">\n            <sha256 value=\"334315c325c3bad343fc5f70b7a5126e268ff0fea38b0f5dc068106a5286898f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.activity\" name=\"activity\" version=\"1.10.1\">\n         <artifact name=\"activity-1.10.1.aar\">\n            <sha256 value=\"b62b528c917de9be497eb6f88830197c20e9d21267c3916c613492e5ee837d4d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"activity-1.10.1.module\">\n            <sha256 value=\"893b73a4b16d19c0338675ad0b9fa5122d9c69c44f611871bd8c407d3be23a68\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.activity\" name=\"activity\" version=\"1.9.0\">\n         <artifact name=\"activity-1.9.0-sources.jar\">\n            <sha256 value=\"3b95a45ba13704e4872ba0f2755b13ab7013e7f7c08bb8a208417a2b66622e74\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"activity-1.9.0.aar\">\n            <sha256 value=\"46fc8e842d9a4e030dfd9e108c3bc08310f922bd7421f29f67dcaaa4adac3764\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"activity-1.9.0.module\">\n            <sha256 value=\"0750e6ebaaeee0fe793eb51a73691df0ddfa68b543e53e714be6e46c37f6a404\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.activity\" name=\"activity\" version=\"1.9.1\">\n         <artifact name=\"activity-1.9.1.aar\">\n            <sha256 value=\"39530cfc0b8ff3a593b6c94b42b12780bbae2a8f5ac70e7698c43734861de7f5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"activity-1.9.1.module\">\n            <sha256 value=\"bd1a8357e0e1b9c618cd8bf56488a53dd22d434e546980ef28c2e28f084a1496\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.activity\" name=\"activity\" version=\"1.9.2\">\n         <artifact name=\"activity-1.9.2.aar\">\n            <sha256 value=\"72751e5895b6fd600faf3ebdfd3c9b2faf70e8d17b413c0b66dad98ca64b2a77\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"activity-1.9.2.module\">\n            <sha256 value=\"4b62a37f484ff8109e59dea48ac77b4088d35c23914fa81af3c464d57f5e2b74\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.activity\" name=\"activity\" version=\"1.9.3\">\n         <artifact name=\"activity-1.9.3.aar\">\n            <sha256 value=\"7e45d2023dc17d715ffff3dc5792f798642c4ae11c948006b1752ab9edda5707\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"activity-1.9.3.module\">\n            <sha256 value=\"7e6a24dda205e1cb1e9c96fa35ff6f261608087f31d323d4cff42b9716d7ed57\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.activity\" name=\"activity-ktx\" version=\"1.10.0\">\n         <artifact name=\"activity-ktx-1.10.0.aar\">\n            <sha256 value=\"3b8e0c51e8aa1a32efb6b2d4181a67dc80784789c166bfe307f70ee44185d510\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"activity-ktx-1.10.0.module\">\n            <sha256 value=\"b905385b69b275b0b1bd3c765de9964e64e8fe105c23daa4a776bde66c2c3159\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.activity\" name=\"activity-ktx\" version=\"1.10.1\">\n         <artifact name=\"activity-ktx-1.10.1.aar\">\n            <sha256 value=\"f396f58dbd772c065b873696b74a3d4d087554b3766280e63b49b25dbb53ab16\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"activity-ktx-1.10.1.module\">\n            <sha256 value=\"7c183895189a27fd7aa59fdcf5029fa64fad28e9d39129a9cb30e40b5e4267ae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.activity\" name=\"activity-ktx\" version=\"1.8.1\">\n         <artifact name=\"activity-ktx-1.8.1.module\">\n            <sha256 value=\"bea2f811b8d8c1b8a835e11d3c68219097c597c458429d3ceafd728e0ca2c6d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.activity\" name=\"activity-ktx\" version=\"1.9.0\">\n         <artifact name=\"activity-ktx-1.9.0.aar\">\n            <sha256 value=\"290798b88ce24c897747f15cd25102005a941a2cf4d35efcb8ce2f162c21f589\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"activity-ktx-1.9.0.module\">\n            <sha256 value=\"2ee9817c674857b18c073558c9126a836126c8b046bc3cfda6d638efe8857cad\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.activity\" name=\"activity-ktx\" version=\"1.9.1\">\n         <artifact name=\"activity-ktx-1.9.1.aar\">\n            <sha256 value=\"9de8f7238206325cfd195c0f8667087646c7057c923a3ff156602da2568d553f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"activity-ktx-1.9.1.module\">\n            <sha256 value=\"0d757d51429b977169017542f264c86a977dde2747d6f6d6bed2daaca4fe4c83\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.activity\" name=\"activity-ktx\" version=\"1.9.2\">\n         <artifact name=\"activity-ktx-1.9.2.aar\">\n            <sha256 value=\"046c0d51a1d0a0dfd56f9af1f418f9cc3d08839a8c404302b60547aaf224dcb6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"activity-ktx-1.9.2.module\">\n            <sha256 value=\"42a9247b7683f5ace9fecadea68f2bbcd95ea58d45519bce26d76d739de218c0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.activity\" name=\"activity-ktx\" version=\"1.9.3\">\n         <artifact name=\"activity-ktx-1.9.3.aar\">\n            <sha256 value=\"e2da34f68cac557986280198e5c1546b8a245269b050b1cc90b56916dbf69201\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"activity-ktx-1.9.3.module\">\n            <sha256 value=\"31d0dab663d04d911a67588931f86b101131e11696bb72895a7e5603717ac241\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation\" version=\"1.0.0\">\n         <artifact name=\"annotation-1.0.0.jar\">\n            <sha256 value=\"0baae9755f7caf52aa80cd04324b91ba93af55d4d1d17dcc9a7b53d99ef7c016\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotation-1.0.0.pom\">\n            <sha256 value=\"a179c12db43d9c0300c9db63f4811db496504be5401b951d422b78490ad1e5b4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation\" version=\"1.1.0\">\n         <artifact name=\"annotation-1.1.0.pom\">\n            <sha256 value=\"2e9372ba7780ef44952adbf86b66e1f08682c1e5277c926185f6564a13799efe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation\" version=\"1.2.0\">\n         <artifact name=\"annotation-1.2.0.jar\">\n            <sha256 value=\"9029262bddce116e6d02be499e4afdba21f24c239087b76b3b57d7e98b490a36\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotation-1.2.0.module\">\n            <sha256 value=\"2efcab81ef91b211bacd206eaacd995a51f633a2e96b57a8fc00144c5f9c56b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation\" version=\"1.3.0\">\n         <artifact name=\"annotation-1.3.0.jar\">\n            <sha256 value=\"97dc45afefe3a1e421da42b8b6e9f90491477c45fc6178203e3a5e8a05ee8553\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotation-1.3.0.module\">\n            <sha256 value=\"9516c2ae44284ea0bd3d0eade0ee638879b708cbe31e3af92ba96c300604ebc3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation\" version=\"1.5.0\">\n         <artifact name=\"annotation-1.5.0-sources.jar\">\n            <sha256 value=\"321c0d46007a21b02c99b8b690afb9eec200c7fde0f60ab7e056c1d0c3024d42\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotation-1.5.0.module\">\n            <sha256 value=\"4c84feee2db891ff6b97d613a0d40ab96ce297b034a6927ca8479f09e82d7c2e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation\" version=\"1.6.0\">\n         <artifact name=\"annotation-1.6.0.module\">\n            <sha256 value=\"6146b6138643b2ac0590df509dd51abaea769c79fd7602eb217168fe5af78cd2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation\" version=\"1.7.0-beta01\">\n         <artifact name=\"annotation-1.7.0-beta01.module\">\n            <sha256 value=\"2a1e9e0bec82b27c6315a2a501a9bb71659b2f0245cdefd21f15b437f22555f9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotation-metadata-1.7.0-beta01.jar\">\n            <sha256 value=\"b11676837cad011a5285d6074418649107ef25eba17131517e9557ef8c9984ed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation\" version=\"1.8.0\">\n         <artifact name=\"annotation-1.8.0.module\">\n            <sha256 value=\"d590a0d8e02f405de749e8dc80b741dc503c6e3e4c9c016d614d76b65f0b59ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotation-metadata-1.8.0.jar\">\n            <sha256 value=\"fe70ace6f942a5fc29045bb2fe25b4e77bdc742dc69f76ed65b39c3ae185888e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation\" version=\"1.8.1\">\n         <artifact name=\"annotation-1.8.1.module\">\n            <sha256 value=\"e6386e85afdd865044e216575e493ed39a63a6325bd925379a21429c3941c8b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotation-metadata-1.8.1.jar\">\n            <sha256 value=\"fa5e67ffcc52a0413f4b39c2737b43c1ba6c6975b4bd4a4ea8627549e766285b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation\" version=\"1.9.1\">\n         <artifact name=\"annotation-1.9.1.module\">\n            <sha256 value=\"f204b05b728a97561718bc716242e47c629c0085a80ee74fca53d4d638bcbe3f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotation-metadata-1.9.1.jar\">\n            <sha256 value=\"38322afa7345c37e29c65ec8852178ae1c26e23096a0634d07a4a3893931f58c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation-experimental\" version=\"1.0.0\">\n         <artifact name=\"annotation-experimental-1.0.0.aar\">\n            <sha256 value=\"b219d2b568e7e4ba534e09f8c2fd242343df6ccbdfbbe938846f5d740e6b0b11\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotation-experimental-1.0.0.pom\">\n            <sha256 value=\"6b73ff6608f4b1d6cbab620b65708a382d0b39901cf4e6b0d16f84a1b04d7732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation-experimental\" version=\"1.1.0\">\n         <artifact name=\"annotation-experimental-1.1.0.aar\">\n            <sha256 value=\"0157de61a2064047896a058080f3fd67ba57ad9a94857b3f7a363660243e3f90\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotation-experimental-1.1.0.module\">\n            <sha256 value=\"0361d1526a4d7501255e19779e09e93cdbd07fee0e2f5c50b7a137432d510119\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation-experimental\" version=\"1.3.1\">\n         <artifact name=\"annotation-experimental-1.3.1-sources.jar\">\n            <sha256 value=\"d23e1a3f75f5cb1b45f900eb1a5bcc6accc2db841a4d3d9d334754e73ae60b2c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotation-experimental-1.3.1.module\">\n            <sha256 value=\"9b6974a7dfe26d3c209dd63e16f8ee2461b57a091789160ca1eb492bb1bf3f84\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation-experimental\" version=\"1.4.0\">\n         <artifact name=\"annotation-experimental-1.4.0.aar\">\n            <sha256 value=\"c6eb7e676011ec65b32428373d450debdfc45179c4f8b3a752174fb87c17b08a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotation-experimental-1.4.0.module\">\n            <sha256 value=\"5930ea7f21fcb6d0deb2ba32748a0ef7c8fd2c42384860582ba7cd20deb90379\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation-experimental\" version=\"1.4.1\">\n         <artifact name=\"annotation-experimental-1.4.1.aar\">\n            <sha256 value=\"6bd4c7c7476f8260cd3bdbb81183583e93fc9f790c27dea7dc314181cbf87aa0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotation-experimental-1.4.1.module\">\n            <sha256 value=\"2ac2f7106e12f263425b4a4dfc80989447fb895675fe902d86759aa74fd12b7d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation-jvm\" version=\"1.6.0\">\n         <artifact name=\"annotation-jvm-1.6.0.module\">\n            <sha256 value=\"3f5a8faa19de667e63dca9730ff8ef0e478e4bafb5feeb8258e5c086246dc90c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation-jvm\" version=\"1.7.0-beta01\">\n         <artifact name=\"annotation-jvm-1.7.0-beta01.jar\">\n            <sha256 value=\"e36b8e4b8393a4adc74e3d4ab22ad5a36396f0cea2e40b5734eae14937dfd224\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotation-jvm-1.7.0-beta01.module\">\n            <sha256 value=\"61514762e567b50287f2d8792698a5f46eb9a73a4b336f0e4e25dbd7a9c980dd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation-jvm\" version=\"1.8.0\">\n         <artifact name=\"annotation-jvm-1.8.0.jar\">\n            <sha256 value=\"9aab326d9492800991854360ac248f493ce7f7c3183519309b78ace9e240f6f6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotation-jvm-1.8.0.module\">\n            <sha256 value=\"e3cb4525539d0ed74bb238ef92c69eef22a80e422c0d2acbc51e6187febb0a13\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation-jvm\" version=\"1.8.1\">\n         <artifact name=\"annotation-jvm-1.8.1.jar\">\n            <sha256 value=\"9aab326d9492800991854360ac248f493ce7f7c3183519309b78ace9e240f6f6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotation-jvm-1.8.1.module\">\n            <sha256 value=\"c959e3b0cdc75c15efe01605fa56aa79f033e39238e150638b8fabde6aa121a0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.annotation\" name=\"annotation-jvm\" version=\"1.9.1\">\n         <artifact name=\"annotation-jvm-1.9.1.jar\">\n            <sha256 value=\"1e343917ebf27ba96fe4dc52b1cad7fd32b738fbc6355bb6cd5b3b305d7212d0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotation-jvm-1.9.1.module\">\n            <sha256 value=\"03fb659177c8618e47425925c11bc91f384703ea26c265be9b25cd79292b511c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.appcompat\" name=\"appcompat\" version=\"1.7.0\">\n         <artifact name=\"appcompat-1.7.0-sources.jar\">\n            <sha256 value=\"6e3d3af46fbd9cb51ce6feb791274a9c2da11b64ba7b967a5dd12915e0aa031a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"appcompat-1.7.0.aar\">\n            <sha256 value=\"67189713b30a3fab6971713cc5fab1cb7f022bcf648a257563715c91d719d584\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"appcompat-1.7.0.module\">\n            <sha256 value=\"38842af2b96c99540cc756337754b3030de08b029d4bf3aa06e4ecf741da68bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.appcompat\" name=\"appcompat-resources\" version=\"1.7.0\">\n         <artifact name=\"appcompat-resources-1.7.0.aar\">\n            <sha256 value=\"55b6778602680f3c288ce350a2c2d3dd158d97dbffc63476275826655582c388\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"appcompat-resources-1.7.0.module\">\n            <sha256 value=\"d7cca0b553ec109ef20ac70ae6438f584fc6bb5eb269a7f5b4098e02c6d687f9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.arch.core\" name=\"core-common\" version=\"2.1.0\">\n         <artifact name=\"core-common-2.1.0.pom\">\n            <sha256 value=\"83bbb3960eaabc600ac366c94cb59414e441532a1d6aa9388b0b8bfface5cf01\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.arch.core\" name=\"core-common\" version=\"2.2.0\">\n         <artifact name=\"core-common-2.2.0.jar\">\n            <sha256 value=\"65308a06b1c00ee186cb9e19321383f043b993813f1522c47f4a3e3303bdba41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-common-2.2.0.module\">\n            <sha256 value=\"edf4200cfdc2d946232252c99e5dcb9c61bb909eb5450b2613d1d4fdc974b981\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.arch.core\" name=\"core-runtime\" version=\"2.2.0\">\n         <artifact name=\"core-runtime-2.2.0.aar\">\n            <sha256 value=\"a1be5e0caa2b07623862af6ae21b3ab0718123245184d0e30dea81b53f990a47\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-runtime-2.2.0.module\">\n            <sha256 value=\"a8b17513949e5db6c9601c30be19df953762dd877512f1e2cfcfae81d2440944\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.arch.core\" name=\"core-testing\" version=\"2.2.0\">\n         <artifact name=\"core-testing-2.2.0-sources.jar\">\n            <sha256 value=\"0ded176aa10334727f36285385b28bf7cfd897dd49f3c841382b8bee2e2b7897\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-testing-2.2.0.aar\">\n            <sha256 value=\"85e1fe770ed673ecb8552eaadc23b96d8db0a14a10eaa7789518496e5d99362c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-testing-2.2.0.module\">\n            <sha256 value=\"3f4af097f3c6e5211b6716560ee25fce21c74e6c79ace9bc5241e20f75fef2a3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.browser\" name=\"browser\" version=\"1.8.0\">\n         <artifact name=\"browser-1.8.0-sources.jar\">\n            <sha256 value=\"6097e75478d6caf2afbe145c99f1df74ced667d5b7c7646663955ac43aeadf7a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"browser-1.8.0.aar\">\n            <sha256 value=\"2d6167b33bf6a064c37501501543702349e850ac62c732d1efa4e71063675456\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"browser-1.8.0.module\">\n            <sha256 value=\"b13a2b7c64c0f2f349a19df512360ed917a63f894fc3de297a1fde4fb287546c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.cardview\" name=\"cardview\" version=\"1.0.0\">\n         <artifact name=\"cardview-1.0.0-sources.jar\">\n            <sha256 value=\"ad7a28e7768893f8b33a8b7b275a92e33c125243ca4a9130a984c40e578e19b4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"cardview-1.0.0.aar\">\n            <sha256 value=\"1193c04c22a3d6b5946dae9f4e8c59d6adde6a71b6bd5d87fb99d82dda1afec7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"cardview-1.0.0.pom\">\n            <sha256 value=\"e64ef4e08b58358fe27b599e6fe80a1b153db014c644beee630ab271061c3e6c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.collection\" name=\"collection\" version=\"1.0.0\">\n         <artifact name=\"collection-1.0.0.jar\">\n            <sha256 value=\"9c8d117b5c2bc120a1cdfeb857e05b495b16c36013570372a708f7827e3ac9f9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"collection-1.0.0.pom\">\n            <sha256 value=\"a7913a5275ad68e555d2612ebe8c14c367b153e14ca48a1872a64899020e54ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.collection\" name=\"collection\" version=\"1.1.0\">\n         <artifact name=\"collection-1.1.0-sources.jar\">\n            <sha256 value=\"158ae7efee9c7394a241139ebf220751f8b812eda40269a38ef725dbe784b98d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"collection-1.1.0.jar\">\n            <sha256 value=\"632a0e5407461de774409352940e292a291037724207a787820c77daf7d33b72\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"collection-1.1.0.pom\">\n            <sha256 value=\"67e9066ca4acfdc6e3cc508293c31ba0398057ff118e4f70b1e1813c9a3456d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.collection\" name=\"collection\" version=\"1.2.0\">\n         <artifact name=\"collection-1.2.0.module\">\n            <sha256 value=\"6c4c0f9e7dab6d983858e67dd99a93af9d9f7d02ac1f8f648ce1fecc84afffa2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.collection\" name=\"collection\" version=\"1.4.0\">\n         <artifact name=\"collection-1.4.0.module\">\n            <sha256 value=\"2fd3b523e8276c0254c417b66d8e7fecc5b0b975af5d178afa7f5b813812cfab\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.collection\" name=\"collection\" version=\"1.4.2\">\n         <artifact name=\"collection-1.4.2.module\">\n            <sha256 value=\"0326d2cf5adbe592312810ca1f71c6c0cc30f753c43f07c7402361b788a7784c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"collection-metadata-1.4.2.jar\">\n            <sha256 value=\"28ccf80e14a1144710ab3af69fb7ca8037d938a07ee4dcdbc325b6c6c09c549c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.collection\" name=\"collection-jvm\" version=\"1.4.0\">\n         <artifact name=\"collection-jvm-1.4.0.jar\">\n            <sha256 value=\"d5cf7b72647c7995071588fe870450ff9c8f127f253d2d4851e161b800f67ae0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"collection-jvm-1.4.0.module\">\n            <sha256 value=\"21b0b02ea68abe418f3dd4e4d42876ecf3bd9a1cada458b460cae1cd9d58ef6d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.collection\" name=\"collection-jvm\" version=\"1.4.2\">\n         <artifact name=\"collection-jvm-1.4.2.jar\">\n            <sha256 value=\"984ce9bd780055eafb8a105aca3f514686bf7b1b6272ec7c645a98ce40fc7db4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"collection-jvm-1.4.2.module\">\n            <sha256 value=\"aad6b3536c0f0e570aa733d5141d70fa6b9b3add370f73a311ca4ca5dee25448\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.collection\" name=\"collection-ktx\" version=\"1.1.0\">\n         <artifact name=\"collection-ktx-1.1.0.jar\">\n            <sha256 value=\"2bfc54475c047131913361f56d0f7f019c6e5bee53eeb0eb7d94a7c499a05227\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"collection-ktx-1.1.0.pom\">\n            <sha256 value=\"721e76e74ee4158d3fe9759074b7eceed4ff7d84ed34a3faca5843fb874ac946\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.collection\" name=\"collection-ktx\" version=\"1.4.0\">\n         <artifact name=\"collection-ktx-1.4.0.jar\">\n            <sha256 value=\"c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"collection-ktx-1.4.0.module\">\n            <sha256 value=\"3770999ec32d1c082d1a34cf1d64d16d9eca9b6b1263c979954407f461fba82b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.collection\" name=\"collection-ktx\" version=\"1.4.2\">\n         <artifact name=\"collection-ktx-1.4.2.jar\">\n            <sha256 value=\"c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"collection-ktx-1.4.2.module\">\n            <sha256 value=\"8a68e297cd92c80789acc033e2b3d7cbd7941f9234335f00c037205df200bcf5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.compose.runtime\" name=\"runtime\" version=\"1.6.7\">\n         <artifact name=\"runtime-1.6.7.module\">\n            <sha256 value=\"2922f1c5cd195b2d852461cde71c0ed36877e4da5b5cd7cacceb3042fc2604ea\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.compose.runtime\" name=\"runtime-android\" version=\"1.6.7\">\n         <artifact name=\"runtime-android-1.6.7.module\">\n            <sha256 value=\"c05681960b711dc58160ca439e416819664e9fbdc3d681e977a7944a504dce02\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"runtime-release.aar\">\n            <sha256 value=\"096fc94de01f27bc783bb0b8984b49aeda688f6329f8393d42d4b6754beae7da\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.concurrent\" name=\"concurrent-futures\" version=\"1.0.0\">\n         <artifact name=\"concurrent-futures-1.0.0.pom\">\n            <sha256 value=\"4505b9a5e30a9418b59a9ad6702c3e4193aea6e691a3d03cf220c7640ad083e2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.concurrent\" name=\"concurrent-futures\" version=\"1.1.0\">\n         <artifact name=\"concurrent-futures-1.1.0-sources.jar\">\n            <sha256 value=\"cc06fb6045a6c066f50e237a3c2126bc88c16d358a57b3612ba633c9f530b0a0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"concurrent-futures-1.1.0.jar\">\n            <sha256 value=\"0ce067c514a0d1049d1bebdf709e344ed3266fe9744275682937cdcb13334e9e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"concurrent-futures-1.1.0.module\">\n            <sha256 value=\"77639a0b051e22510bad93affcea0ebd781ef124bf9b7621a95749937bcfcdfd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.concurrent\" name=\"concurrent-futures-ktx\" version=\"1.1.0\">\n         <artifact name=\"concurrent-futures-ktx-1.1.0.jar\">\n            <sha256 value=\"1968bf52039e38636aa6f114cd17d7256919d1e8997417716fef9d1da1f24d85\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"concurrent-futures-ktx-1.1.0.module\">\n            <sha256 value=\"69b79724566d49140846700690b8d2165231c577e93e66726a443e8f976bbe19\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.constraintlayout\" name=\"constraintlayout\" version=\"2.1.4\">\n         <artifact name=\"constraintlayout-2.1.4.aar\">\n            <sha256 value=\"0df714c0b51e54710ebf746eb469d333176bbb3cb29f80775dc3ca4eb3162512\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"constraintlayout-2.1.4.module\">\n            <sha256 value=\"1fd15b84220cf35693f57b235b84b9dd70f4c31ca8ad396383dec5a288d9df96\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.constraintlayout\" name=\"constraintlayout\" version=\"2.2.0\">\n         <artifact name=\"constraintlayout-2.2.0.aar\">\n            <sha256 value=\"c7c244100e68af49c99a6ad17694893c1be4fc55a6f539c8d78261dbbd2ce34a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"constraintlayout-2.2.0.module\">\n            <sha256 value=\"b968130636d2fcac654fa4012ddc36ab95a5ce044fb355ff75cbcea32e57bfa5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.constraintlayout\" name=\"constraintlayout\" version=\"2.2.1\">\n         <artifact name=\"constraintlayout-2.2.1.aar\">\n            <sha256 value=\"30f8d79b782d283a90f0b6f7369169d9cf560091537fdd6056d1daa9f3033763\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"constraintlayout-2.2.1.module\">\n            <sha256 value=\"21f350d98ea86b7c5561a8ae33f540c5188a4a8b6912999e63be06935b76e15f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.constraintlayout\" name=\"constraintlayout-core\" version=\"1.0.4\">\n         <artifact name=\"constraintlayout-core-1.0.4.jar\">\n            <sha256 value=\"3e477f4de231e58b25f5a992f3be45e97d332c34a39a9e3e7d4b78ae0ac2256f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"constraintlayout-core-1.0.4.module\">\n            <sha256 value=\"7cfe8d755d524185204c68fe512431aafa5487553adcf2356eec59eab9c64185\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.constraintlayout\" name=\"constraintlayout-core\" version=\"1.1.0\">\n         <artifact name=\"constraintlayout-core-1.1.0.jar\">\n            <sha256 value=\"a8b90d19f7d758f7cb8962491547cf57cb7837c31fe3b00e01c4e85df7bf4851\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"constraintlayout-core-1.1.0.module\">\n            <sha256 value=\"d8d1b4ae950996d17ff6a5601cd8d106c3a30ff2dcc96815a9f32220d1d82c5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.constraintlayout\" name=\"constraintlayout-core\" version=\"1.1.1\">\n         <artifact name=\"constraintlayout-core-1.1.1.jar\">\n            <sha256 value=\"3c2054328328831eb6e69b4014f6ef9faa117fd4b811929f3a91d3db375f2c02\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"constraintlayout-core-1.1.1.module\">\n            <sha256 value=\"d4ac5714d051734c2087a482a7dcd4fcc0b7f9e011c81d2cddf4b0f94580e30b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.coordinatorlayout\" name=\"coordinatorlayout\" version=\"1.1.0\">\n         <artifact name=\"coordinatorlayout-1.1.0.aar\">\n            <sha256 value=\"44a9e30abf56af1025c52a0af506fee9c4131aa55efda52f9fd9451211c5e8cb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"coordinatorlayout-1.1.0.pom\">\n            <sha256 value=\"a67c52c9ddfaff2ffb2fd4b97cd94fa382e837ea8a5874d029e0a04fa63e5caf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.core\" name=\"core\" version=\"1.1.0\">\n         <artifact name=\"core-1.1.0.aar\">\n            <sha256 value=\"76c7cfbe596fe3c09a6983bf1c89e889299c08ac9a3b52ce5182a088d056647e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-1.1.0.pom\">\n            <sha256 value=\"dae46132cdcd46b798425f7cb78fd65890869b6d26101ccdcd43461a4f51754c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.core\" name=\"core\" version=\"1.12.0\">\n         <artifact name=\"core-1.12.0.aar\">\n            <sha256 value=\"42ffa7ca47d7ba8fe1d874c57ef9c7111bc41a2b0c0c21518a39e07d222ded8b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-1.12.0.module\">\n            <sha256 value=\"2f63fbeda23ca0919738d09e406de661f21bac583d6e04a1797dcb77e3b6ae95\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.core\" name=\"core\" version=\"1.13.1\">\n         <artifact name=\"core-1.13.1.aar\">\n            <sha256 value=\"2c27de199535675005553066597a4b20fa1eea7c228ab4ef6b32b5fe39ca1f59\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-1.13.1.module\">\n            <sha256 value=\"2a10979bbb3bcd7b25b7f664ab4e9b016fabf2174a26768b677e12e4bea4c7c4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.core\" name=\"core\" version=\"1.15.0\">\n         <artifact name=\"core-1.15.0.aar\">\n            <sha256 value=\"432b85a1974076e14b487ece4a28c59a84f1b9efc3fc8be72cd7f05d32055e51\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-1.15.0.module\">\n            <sha256 value=\"e8a6c386e1765d870012fed2221173d4a2e8d2fd5aec732c51afb4a9f4684519\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.core\" name=\"core\" version=\"1.16.0\">\n         <artifact name=\"core-1.16.0.aar\">\n            <sha256 value=\"6bf03d39dbe3744acce227d3b697374c3625aae1025fbec8ad9fd7bd58bce431\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-1.16.0.module\">\n            <sha256 value=\"4ab4a3b0bc1664e3a2c60dec699af635778e15c6ee373971690948f073dd721e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.core\" name=\"core-ktx\" version=\"1.13.1\">\n         <artifact name=\"core-ktx-1.13.1-sources.jar\">\n            <sha256 value=\"b6646f76cd2d59210561dffb16b32a4e5fcca6de37ca027f1dae82bfb0cf6493\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-ktx-1.13.1.aar\">\n            <sha256 value=\"19ba50d094c7368ede1b4ccf1195ceb83e35970736593f823e5af716f8d05d70\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-ktx-1.13.1.module\">\n            <sha256 value=\"ab530b04e2fbe73205484899a3be56c90968873eb496fc52e5ea7596d91035d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.core\" name=\"core-ktx\" version=\"1.15.0\">\n         <artifact name=\"core-ktx-1.15.0.aar\">\n            <sha256 value=\"c72c97ff4a32308bcaf3061eea5ddf33455ce413cee4aa1d5c82440c5759d4bc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-ktx-1.15.0.module\">\n            <sha256 value=\"bee9b44664ff37e2e222ebcde4b30e38294a3f927451edc611fec7f454ffa442\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.core\" name=\"core-ktx\" version=\"1.16.0\">\n         <artifact name=\"core-ktx-1.16.0.aar\">\n            <sha256 value=\"1766dbd82f64a12dcd359ecb6f15f3cf35db4d66d22961a7c51b2ffc6468314c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-ktx-1.16.0.module\">\n            <sha256 value=\"89fb92ca127594cdcd11c5efb5ab0e8eb23466bc41b8df7579514d2fef6e1281\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.core\" name=\"core-splashscreen\" version=\"1.2.0-alpha01\">\n         <artifact name=\"core-splashscreen-1.2.0-alpha01-sources.jar\">\n            <sha256 value=\"5e82448d6f1c3aad499ff0f5f9d24602f880eb8d26fb13525821a3669b3466de\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-splashscreen-1.2.0-alpha01.aar\">\n            <sha256 value=\"d750a1bc1f3f6c4af748ff49eb4cbcacb3c22257c935f8076762508d1aa740f8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-splashscreen-1.2.0-alpha01.module\">\n            <sha256 value=\"dc11ea4e05d403739592d854f833860df7321d7f4262b40463ee54f51bce0107\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.core\" name=\"core-splashscreen\" version=\"1.2.0-alpha02\">\n         <artifact name=\"core-splashscreen-1.2.0-alpha02.aar\">\n            <sha256 value=\"fd85f37cbac803f3818bb0b4e763a5db93b8d61bd43ab8746164db82270168b1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-splashscreen-1.2.0-alpha02.module\">\n            <sha256 value=\"81c50181738c236c79de1867018a1ac25098ecf4a322fdd0864565d2b7d1af0c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.core\" name=\"core-splashscreen\" version=\"1.2.0-beta01\">\n         <artifact name=\"core-splashscreen-1.2.0-beta01.aar\">\n            <sha256 value=\"17bb4ccb914cc3d9f4bb9494d01ae3a9033bbde823b9cf38f8e4efbdec9745e7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-splashscreen-1.2.0-beta01.module\">\n            <sha256 value=\"442635de2017814f0bee00822b9bc90fa87f8f0d5c250de11ddc5efdeb4a6816\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.core\" name=\"core-splashscreen\" version=\"1.2.0-beta02\">\n         <artifact name=\"core-splashscreen-1.2.0-beta02.aar\">\n            <sha256 value=\"939b7c19a15db3416da3add98123dc29607a635915af004b98247cfdcc3efb4b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-splashscreen-1.2.0-beta02.module\">\n            <sha256 value=\"4c812b319aa8bde271df85dc2014c85b901f568de005990a92507bf7946090b4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.core\" name=\"core-viewtree\" version=\"1.0.0\">\n         <artifact name=\"core-viewtree-1.0.0.aar\">\n            <sha256 value=\"dc1b678d58ebcf2bfa1587be68ff826694ce3d221251b9ef30d4d4b36297e6de\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-viewtree-1.0.0.module\">\n            <sha256 value=\"11386cfa46cbbfddb6a4059f14354c00691cf65d3d63c3618818a83326ef3c7f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.cursoradapter\" name=\"cursoradapter\" version=\"1.0.0\">\n         <artifact name=\"cursoradapter-1.0.0.aar\">\n            <sha256 value=\"a81c8fe78815fa47df5b749deb52727ad11f9397da58b16017f4eb2c11e28564\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"cursoradapter-1.0.0.pom\">\n            <sha256 value=\"62d95c89850af21030b19f14d5f7ecd6d8bcc9a3014c59002ec99624caac8100\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.customview\" name=\"customview\" version=\"1.0.0\">\n         <artifact name=\"customview-1.0.0.pom\">\n            <sha256 value=\"ce9e47b87184f5bd5e139e9becd5b26476d42d78c31bf2fdedc37acb41b9ad49\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.customview\" name=\"customview\" version=\"1.1.0\">\n         <artifact name=\"customview-1.1.0.aar\">\n            <sha256 value=\"01f76ab043770a97b054046f9815717b82ce0355c02967d16c61981359dc189a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"customview-1.1.0.pom\">\n            <sha256 value=\"c814d435f73e9e6d169886d0eb96b5c5361feb48449fbbb315c908c03c588c94\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.customview\" name=\"customview-poolingcontainer\" version=\"1.0.0\">\n         <artifact name=\"customview-poolingcontainer-1.0.0.aar\">\n            <sha256 value=\"3584102fc49bf399c56e3b7be4bfe12000c46112320cd8cf85cc0a8f93f3e752\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"customview-poolingcontainer-1.0.0.module\">\n            <sha256 value=\"903034d5152dd2e0162b1468ea25a22e1ca384006b3d282d5a143cc760321a01\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-common\" version=\"8.10.0\">\n         <artifact name=\"databinding-common-8.10.0.jar\">\n            <sha256 value=\"66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-common-8.10.0.pom\">\n            <sha256 value=\"7d823d838a08815683bf4269e860af19bc87b4048d9b6c921396842a62d787ae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-common\" version=\"8.4.1\">\n         <artifact name=\"databinding-common-8.4.1.jar\">\n            <sha256 value=\"66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-common-8.4.1.pom\">\n            <sha256 value=\"0c21f50a67ebb4900579a631aba1e122d76a70bd65b23f7ee674aeae5f07f426\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-common\" version=\"8.4.2\">\n         <artifact name=\"databinding-common-8.4.2.jar\">\n            <sha256 value=\"66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-common-8.4.2.pom\">\n            <sha256 value=\"a711fbc4df49f063b3c54211f9c29c4498cfc99c64c136462049e60e965fb32b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-common\" version=\"8.5.0\">\n         <artifact name=\"databinding-common-8.5.0.jar\">\n            <sha256 value=\"66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-common-8.5.0.pom\">\n            <sha256 value=\"bf22c17278ec3454e096771f7c17a6ac615e5c630937696e82b6ede1193134d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-common\" version=\"8.5.1\">\n         <artifact name=\"databinding-common-8.5.1.jar\">\n            <sha256 value=\"66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-common-8.5.1.pom\">\n            <sha256 value=\"e24f92e9b0326d1f95051cb9fae98a1bfcd2e1618df906d423e4032dd895e551\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-common\" version=\"8.5.2\">\n         <artifact name=\"databinding-common-8.5.2.jar\">\n            <sha256 value=\"66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-common-8.5.2.pom\">\n            <sha256 value=\"a8292effd2b9bb92440e0369319f977f64e783c79db54bc4d554e1a9b498bd51\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-common\" version=\"8.6.0\">\n         <artifact name=\"databinding-common-8.6.0.jar\">\n            <sha256 value=\"66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-common-8.6.0.pom\">\n            <sha256 value=\"235e960cf842882f8f71f1fcf8dbc8adb1c612e3407faffc5db3950c2c29ad51\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-common\" version=\"8.6.1\">\n         <artifact name=\"databinding-common-8.6.1.jar\">\n            <sha256 value=\"66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-common-8.6.1.pom\">\n            <sha256 value=\"1d52b37e6a1a927f5c45daf3a54b77aaf3fe821b956817d8320ad978cf4739b2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-common\" version=\"8.7.0\">\n         <artifact name=\"databinding-common-8.7.0.jar\">\n            <sha256 value=\"66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-common-8.7.0.pom\">\n            <sha256 value=\"7ad4e6c0624c3b4781598616405304ba994e3fbecafec88a4a3a7b9fb886dda3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-common\" version=\"8.7.1\">\n         <artifact name=\"databinding-common-8.7.1.jar\">\n            <sha256 value=\"66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-common-8.7.1.pom\">\n            <sha256 value=\"054b8a1abcdf134924d4cd380987f4cdef7e45bdd2d63abae85b62f4c03b81d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-common\" version=\"8.7.2\">\n         <artifact name=\"databinding-common-8.7.2.jar\">\n            <sha256 value=\"66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-common-8.7.2.pom\">\n            <sha256 value=\"01019ff7f561bf64d569e8146d9b7a72c6242f2fdbeada01f8c82d52e6f426cf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-common\" version=\"8.7.3\">\n         <artifact name=\"databinding-common-8.7.3.jar\">\n            <sha256 value=\"66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-common-8.7.3.pom\">\n            <sha256 value=\"9fe3c348a32758fec3c896eb5a57a1f63ca2b895de3d867513b671e1ee220ea4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-common\" version=\"8.8.0\">\n         <artifact name=\"databinding-common-8.8.0.jar\">\n            <sha256 value=\"66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-common-8.8.0.pom\">\n            <sha256 value=\"d88785eb881894f5ba67dbe001ff9b5ac6aa2ebbbfd74ce1ef96d42bcf5919b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-common\" version=\"8.8.1\">\n         <artifact name=\"databinding-common-8.8.1.jar\">\n            <sha256 value=\"66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-common-8.8.1.pom\">\n            <sha256 value=\"29295abdad6355fbc52709a56e170a2e016b6579a5c743286b936468ee28ca4f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-common\" version=\"8.8.2\">\n         <artifact name=\"databinding-common-8.8.2.jar\">\n            <sha256 value=\"66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-common-8.8.2.pom\">\n            <sha256 value=\"631818d20de9d70338cc9dd3f03554f21d754ad2cf47bf5166979650eb6a6c8a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-common\" version=\"8.9.0\">\n         <artifact name=\"databinding-common-8.9.0.jar\">\n            <sha256 value=\"66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-common-8.9.0.pom\">\n            <sha256 value=\"2f3c42a4bd859a054c361e1b516461ba7f2d3f96812d8c7cf9da34f4aa8592d4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-common\" version=\"8.9.1\">\n         <artifact name=\"databinding-common-8.9.1.jar\">\n            <sha256 value=\"66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-common-8.9.1.pom\">\n            <sha256 value=\"7bdc9d12e1576cc22708caf9c2749a74809dad824d40d8daef0f151945f20a87\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-common\" version=\"8.9.2\">\n         <artifact name=\"databinding-common-8.9.2.jar\">\n            <sha256 value=\"66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-common-8.9.2.pom\">\n            <sha256 value=\"ef747437820d6300ff7fb04234f27dfc43a4931b76f1c61e72dd06bd7b0fad6f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-compiler-common\" version=\"8.10.0\">\n         <artifact name=\"databinding-compiler-common-8.10.0.jar\">\n            <sha256 value=\"2e92af258a74e870a76c1d2c8970f9ebdfb63156d0d515d78e64870bfc43fae9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-compiler-common-8.10.0.pom\">\n            <sha256 value=\"f1a93089ee285e5d8f92cab8b4a54a8f6f0a608df54bb1518e4ea101c0659865\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-compiler-common\" version=\"8.4.1\">\n         <artifact name=\"databinding-compiler-common-8.4.1.jar\">\n            <sha256 value=\"6a774892f0a035329a3160d3b72ae5b1f1b981d481ec55c1d147501ada3f2ffd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-compiler-common-8.4.1.pom\">\n            <sha256 value=\"cd2e2065016e5010563053905ff7e5fd161a4b69cb26a32f16ecbb47e1779658\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-compiler-common\" version=\"8.4.2\">\n         <artifact name=\"databinding-compiler-common-8.4.2.jar\">\n            <sha256 value=\"d08bf1bd322eccda3f8f71e04ef963a29b65bc040eba01daf1925d0f1e3bf14c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-compiler-common-8.4.2.pom\">\n            <sha256 value=\"6b233dc97a746b209261d151bcd9ffcd3da17c4013ab0c361417278965569487\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-compiler-common\" version=\"8.5.0\">\n         <artifact name=\"databinding-compiler-common-8.5.0.jar\">\n            <sha256 value=\"0fde528ce412d84bd12890c2bff98c4656446a6bd8340f80ce9cbf48b6b4d160\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-compiler-common-8.5.0.pom\">\n            <sha256 value=\"ead64e3315f2907c3f5e6e50a6a6e560c2b004aa67fac899cbf446761c208d7c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-compiler-common\" version=\"8.5.1\">\n         <artifact name=\"databinding-compiler-common-8.5.1.jar\">\n            <sha256 value=\"2bd7e88b6ed6b722262e4099935b36bba1df7b1cdf2fc0a95818fdd92abbd192\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-compiler-common-8.5.1.pom\">\n            <sha256 value=\"29fa526d62c250e7b4f233cdf455665c4b0665e201c249517b0a19a754dcfcce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-compiler-common\" version=\"8.5.2\">\n         <artifact name=\"databinding-compiler-common-8.5.2.jar\">\n            <sha256 value=\"92df800a9e506c608e6a52f4dc0e42d082730596a7a0e46eb2f2f0a98060e4c4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-compiler-common-8.5.2.pom\">\n            <sha256 value=\"086c06e5295d383db33e646c1191c2e67b99d75246cd19b2f7fc3183f83f424b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-compiler-common\" version=\"8.6.0\">\n         <artifact name=\"databinding-compiler-common-8.6.0.jar\">\n            <sha256 value=\"e097d6654265e535c42943f78d36cc0459bfca7101176098c1b08b9bdb7e9c74\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-compiler-common-8.6.0.pom\">\n            <sha256 value=\"8328ba1b32b266199f1bd4ffb2de1736f775cffde38ec129a888124cadb4318b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-compiler-common\" version=\"8.6.1\">\n         <artifact name=\"databinding-compiler-common-8.6.1.jar\">\n            <sha256 value=\"f61b78591752694b960d5fe8f97fde49a2fb3911647ffabd6d7d569237fc7362\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-compiler-common-8.6.1.pom\">\n            <sha256 value=\"d0aa43befdcd2937459394022746b0d25d07ab94b89e388cc5de758e36d9b31b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-compiler-common\" version=\"8.7.0\">\n         <artifact name=\"databinding-compiler-common-8.7.0.jar\">\n            <sha256 value=\"f4ccc0eafca4a47be5bf910209b986ac0921b6b5b52caa1bf4aa52900d244edd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-compiler-common-8.7.0.pom\">\n            <sha256 value=\"cd251f8aaa819526f94694d14577fc5433a818d03b14b180d9574eefc7182b4c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-compiler-common\" version=\"8.7.1\">\n         <artifact name=\"databinding-compiler-common-8.7.1.jar\">\n            <sha256 value=\"4ee1e07b933b5926d6ee7c4fad8cb86315757bc96b8d3ea49fa76c62ed32de19\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-compiler-common-8.7.1.pom\">\n            <sha256 value=\"e1032cdf1eedaf97bf3a453d49415817d39985b946f47a37920be826c6697861\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-compiler-common\" version=\"8.7.2\">\n         <artifact name=\"databinding-compiler-common-8.7.2.jar\">\n            <sha256 value=\"f81bcb0475f9098d54ed1141452258e4b93fe1a8a12b5e2ff7b93baca8e27114\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-compiler-common-8.7.2.pom\">\n            <sha256 value=\"d82dea7cd1a4221af81db3825a211904533b497adebc7ccdd861fa0044a9fd8d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-compiler-common\" version=\"8.7.3\">\n         <artifact name=\"databinding-compiler-common-8.7.3.jar\">\n            <sha256 value=\"b2431cbbe38d0a31e001b7c34f52f69a323fc9ec573b6afe5893daced5ab3285\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-compiler-common-8.7.3.pom\">\n            <sha256 value=\"1c7ba784aa79cdcf4e7ccb54986759804a68fa8cf8bffb32d0538fea0c1dd517\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-compiler-common\" version=\"8.8.0\">\n         <artifact name=\"databinding-compiler-common-8.8.0.jar\">\n            <sha256 value=\"bbc07bd90e2a8d122eed9b5377cb35d156c92c2798327746d742f5f0693a3587\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-compiler-common-8.8.0.pom\">\n            <sha256 value=\"4d1ff8e22b5c74396d5e0edebd4b203bebc4a0b655ef6cf2125c71af818c3663\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-compiler-common\" version=\"8.8.1\">\n         <artifact name=\"databinding-compiler-common-8.8.1.jar\">\n            <sha256 value=\"9034ce623649e3f6b2c14bce8d90000c25d2b2a1da22aaf8a961903bdecf73ca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-compiler-common-8.8.1.pom\">\n            <sha256 value=\"3526d9e30a77f31f6ef9e5b2ec082ae5fb06d1570ce3c4320284f4c05d731fd5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-compiler-common\" version=\"8.8.2\">\n         <artifact name=\"databinding-compiler-common-8.8.2.jar\">\n            <sha256 value=\"b3bd0ac8d2f85f311086d88f33b30927dd72dd7020f982ef9115d991ede80fa7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-compiler-common-8.8.2.pom\">\n            <sha256 value=\"b9fd4f2cf39aa2e47e4658a53da74c4b0f3713990c1a9a7236e7da129a6a0732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-compiler-common\" version=\"8.9.0\">\n         <artifact name=\"databinding-compiler-common-8.9.0.jar\">\n            <sha256 value=\"c04463a64bceaaf833345f3cea57c043b5fbc68823b51acd691e457987d70eed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-compiler-common-8.9.0.pom\">\n            <sha256 value=\"297468a408273873757ace70249845397e63fae2d62b4bdae82b2c898b5a8fb9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-compiler-common\" version=\"8.9.1\">\n         <artifact name=\"databinding-compiler-common-8.9.1.jar\">\n            <sha256 value=\"58c32bce4c3e6d523d306d1e39a1ae946cd610b6ed06661f461957bcec36c753\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-compiler-common-8.9.1.pom\">\n            <sha256 value=\"2ba39d96dd05fff70b5733fd86ee65e73c93dfaa023488c1da8047a3bb8b1c8b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"databinding-compiler-common\" version=\"8.9.2\">\n         <artifact name=\"databinding-compiler-common-8.9.2.jar\">\n            <sha256 value=\"1a0e56a5e6ca68e2525d89ad0c907ce27863251e6db4b99cc2a225cf95850c05\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"databinding-compiler-common-8.9.2.pom\">\n            <sha256 value=\"4a2ba129e5452569ee6c1a48876aa39cb8a8851a9b6d0e65c82f0d3c8d04a01a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"viewbinding\" version=\"8.10.0\">\n         <artifact name=\"viewbinding-8.10.0.aar\">\n            <sha256 value=\"233c9d672e2b37736777c39c2e3a8bff6e30f7dc5631b8bbd7b5e98fb34d2156\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewbinding-8.10.0.module\">\n            <sha256 value=\"ac0fa42b6383b5c77814cba32227c3d93bf045af4e464fa6631956e2f96bdf82\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"viewbinding\" version=\"8.4.1\">\n         <artifact name=\"viewbinding-8.4.1.aar\">\n            <sha256 value=\"f3d9d1bb36d0a0f4e7cd3cffc369196668664e2e5b1211e912ba1e5587ae7cb8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewbinding-8.4.1.module\">\n            <sha256 value=\"7d6c0745235dac264e21eccde01d0154ff7611b204353c3c0a8672d597aa3f4a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"viewbinding\" version=\"8.4.2\">\n         <artifact name=\"viewbinding-8.4.2.aar\">\n            <sha256 value=\"9ba75a680a9afc82cd0217940ede9cb53dc9d49bf931ace0ae973186f6b0954a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewbinding-8.4.2.module\">\n            <sha256 value=\"cd4423f1ec2218caacee040e819ecb741c4efa2357e813260f2d48bd2ffbc7d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"viewbinding\" version=\"8.5.0\">\n         <artifact name=\"viewbinding-8.5.0.aar\">\n            <sha256 value=\"225e1aeac33a9bdd32ffc5fba4d1c49f5d134e2df83b191d0d03971d0d8f2817\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewbinding-8.5.0.module\">\n            <sha256 value=\"a5b4944eb291d6a73f47741e13ff0ea59cca6c48535f92eb0c49a55ad4b4ce5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"viewbinding\" version=\"8.5.1\">\n         <artifact name=\"viewbinding-8.5.1.aar\">\n            <sha256 value=\"1bab4f926d15eb9214169022fe88bcca8d22bfa65d84b6480d949fcef7fac768\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewbinding-8.5.1.module\">\n            <sha256 value=\"2628bd81972522f889ae226977bd2e12ec9a04bd45160c87ab615efa8c7eca8a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"viewbinding\" version=\"8.5.2\">\n         <artifact name=\"viewbinding-8.5.2.aar\">\n            <sha256 value=\"2ba3cae7e59f8714babb15c18146a7af8fee4b782c16254e7a020ce51684670a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewbinding-8.5.2.module\">\n            <sha256 value=\"18322b43a3cf1a46e2c97d6ca6157809ec49e549c6c72a566455f47b9fb23dcb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"viewbinding\" version=\"8.6.0\">\n         <artifact name=\"viewbinding-8.6.0.aar\">\n            <sha256 value=\"a7edaf3d73ad364d967b837a81886ec3b40772ec61002bc8820e1c63d5d24f92\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewbinding-8.6.0.module\">\n            <sha256 value=\"ffee53afbb569a55abc5f040534ac57e9691d558f341cea70b44abbb7c5ee747\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"viewbinding\" version=\"8.6.1\">\n         <artifact name=\"viewbinding-8.6.1.aar\">\n            <sha256 value=\"5cf9086d41357dea5732ec9e6bc2c0767d2b67a13f526375f5ec5252ca9678c6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewbinding-8.6.1.module\">\n            <sha256 value=\"d0d63bc8eb17f98be2c894fb0b1817b0b9aa7a03d86fc76278a06542b44f3e3c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"viewbinding\" version=\"8.7.0\">\n         <artifact name=\"viewbinding-8.7.0.aar\">\n            <sha256 value=\"4d5c0263a3e4ce092efad26ff39ded337ed861bc8e65d6968d33a53203294e94\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewbinding-8.7.0.module\">\n            <sha256 value=\"de85b32abfeae3fcf0d6acdc3247a76dc63160c1ada76f9c83bb67ea59a7f524\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"viewbinding\" version=\"8.7.1\">\n         <artifact name=\"viewbinding-8.7.1.aar\">\n            <sha256 value=\"59c5d3b39fec58a4c0521ba41c2597890f691239b16fe3fc799df84a970bbcda\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewbinding-8.7.1.module\">\n            <sha256 value=\"3961375ac5c555a44b65112e90a5d7acd97b3af213ae2defd18677f76fc67c41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"viewbinding\" version=\"8.7.2\">\n         <artifact name=\"viewbinding-8.7.2.aar\">\n            <sha256 value=\"2a9c3409ec21257597a85a3d204b0c7ed06be5028ae57587daa94e90c91e1a01\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewbinding-8.7.2.module\">\n            <sha256 value=\"bd2d4251da125d7973e282792266e9039581b714d7a653d5e1c8d3fe6189e846\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"viewbinding\" version=\"8.7.3\">\n         <artifact name=\"viewbinding-8.7.3.aar\">\n            <sha256 value=\"6b024942805560c385b12523939ac49005bf7bbb169c84719e2d52640515c4a3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewbinding-8.7.3.module\">\n            <sha256 value=\"6d5c1bf6a7cbbbb08aeac482d5f4bfe4bab9b5764f8187a7d4613397f42b3c08\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"viewbinding\" version=\"8.8.0\">\n         <artifact name=\"viewbinding-8.8.0.aar\">\n            <sha256 value=\"cc6b2a949244e2af21a75c862ae2e5355d5790856b8a447b035a368d2009d759\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewbinding-8.8.0.module\">\n            <sha256 value=\"6ebc7f1605419970646bbf43143d8eecacf07ce9b329b64fb3e6186bedc50466\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"viewbinding\" version=\"8.8.1\">\n         <artifact name=\"viewbinding-8.8.1.aar\">\n            <sha256 value=\"da461ac01030b572b6d26b538908bacce88284f36af4b660e17a2342706ecb63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewbinding-8.8.1.module\">\n            <sha256 value=\"ad545855b12a8aec658585d65e1e2723577135712df5d48bc7db341689933be5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"viewbinding\" version=\"8.8.2\">\n         <artifact name=\"viewbinding-8.8.2.aar\">\n            <sha256 value=\"03d8edfd397d82f896d05e3a2475e2778542ef80d127b422f9ce769332b9b6f9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewbinding-8.8.2.module\">\n            <sha256 value=\"cb813e498cb92d6753eb982e37495a0a617d4bdeb5c3cdcdba032930658980bc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"viewbinding\" version=\"8.9.0\">\n         <artifact name=\"viewbinding-8.9.0.aar\">\n            <sha256 value=\"6a8e06338e2d355e2defb24021f8782defa1c5f612d2ed3c11cf36599b116f2d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewbinding-8.9.0.module\">\n            <sha256 value=\"f9f34e21fb56d47b7fbb95f677da5bed051df8b925ade35c54fcb0413350f0af\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"viewbinding\" version=\"8.9.1\">\n         <artifact name=\"viewbinding-8.9.1.aar\">\n            <sha256 value=\"59d8874e6a17c880979418a0088ded13be58e9419c09dc97d6d7864f9e77d51e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewbinding-8.9.1.module\">\n            <sha256 value=\"46aad32197e02e459b7a438ac83b6d6e006f6d9c315bc1cb484c93b45ce2c7f9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.databinding\" name=\"viewbinding\" version=\"8.9.2\">\n         <artifact name=\"viewbinding-8.9.2.aar\">\n            <sha256 value=\"179a0fde59934f4bd7e5c827a1ad4ebaf615f512e66397a1869d4211f6b93114\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewbinding-8.9.2.module\">\n            <sha256 value=\"7608c222488215ddd5659c82322a03d1e96ec4446f7c5a8b06ce90ca542066d4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.documentfile\" name=\"documentfile\" version=\"1.0.0\">\n         <artifact name=\"documentfile-1.0.0.aar\">\n            <sha256 value=\"865a061ef2fad16522f8433536b8d47208c46ff7c7745197dfa1eeb481869487\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"documentfile-1.0.0.pom\">\n            <sha256 value=\"013288a9317a552706ce625fb24493e8223288529223ec578cf855a5ae9c16e5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.drawerlayout\" name=\"drawerlayout\" version=\"1.2.0\">\n         <artifact name=\"drawerlayout-1.2.0-sources.jar\">\n            <sha256 value=\"b491d8d60a6309f572a15c402a3e819ef1b4725711202a7a8eaa8982295eaad5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"drawerlayout-1.2.0.aar\">\n            <sha256 value=\"f4ba16c51d5182497fe128e298af930f0ec6bd5497c7440a4c67042d15dd7702\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"drawerlayout-1.2.0.module\">\n            <sha256 value=\"b802e0828fa9948f561f01b041abac71278bfe987373a9a495abed9fe5b65035\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.dynamicanimation\" name=\"dynamicanimation\" version=\"1.0.0\">\n         <artifact name=\"dynamicanimation-1.0.0.aar\">\n            <sha256 value=\"ce005162c229bf308d2d5b12fb6cad0874069cbbeaccee63a8193bd08d40de04\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dynamicanimation-1.0.0.pom\">\n            <sha256 value=\"44ce22ee620d28f17301bcc60ad49b69b7d0596c2a87b054ad1e3feac7b4a898\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.emoji2\" name=\"emoji2\" version=\"1.4.0\">\n         <artifact name=\"emoji2-1.4.0-sources.jar\">\n            <sha256 value=\"5db44eec9cee653ba403f0e88a02ce41ab6301a0b7dd7cb35fc32f9747f2228b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"emoji2-1.4.0.aar\">\n            <sha256 value=\"433febd3434a45667176c76a64f3f205ca6335a6b544c5b5d57f25a38a375242\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"emoji2-1.4.0.module\">\n            <sha256 value=\"92be16cccb757f807bddd92f1fca95a038a810ccca051c4149c11682478954b8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.emoji2\" name=\"emoji2\" version=\"1.5.0\">\n         <artifact name=\"emoji2-1.5.0.aar\">\n            <sha256 value=\"43aaf98cc70c3f9e6e01c765285614f041319046a3ae4a735239b94055dda971\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"emoji2-1.5.0.module\">\n            <sha256 value=\"989ced50dd5367eb51711df17c8bc17d26b69791415cca6e4e15c4ebd1511b98\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.emoji2\" name=\"emoji2-views\" version=\"1.4.0\">\n         <artifact name=\"emoji2-views-1.4.0-sources.jar\">\n            <sha256 value=\"77ff753b82443e4584d84a0e80d9e49830f15ea3a28059c39955077d51f3f3b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"emoji2-views-1.4.0.aar\">\n            <sha256 value=\"fd2fbc9a678101498ebc21fa75e11a83e2b2743715230eef1dc1a77fa4bf4580\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"emoji2-views-1.4.0.module\">\n            <sha256 value=\"f496cced4c7b3a6854a7ba07b3d3a35226f1056a5359a9f9563a222e72591a42\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.emoji2\" name=\"emoji2-views\" version=\"1.5.0\">\n         <artifact name=\"emoji2-views-1.5.0.aar\">\n            <sha256 value=\"64aa3c495558a294cf04f0800382c5e8e21684c1b1aad416a49f2068f16b5446\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"emoji2-views-1.5.0.module\">\n            <sha256 value=\"4450dfed411645632b2f2f6698d146ff75965620be361cf484ca8f20d0d80bcc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.emoji2\" name=\"emoji2-views-helper\" version=\"1.4.0\">\n         <artifact name=\"emoji2-views-helper-1.4.0-sources.jar\">\n            <sha256 value=\"7c813c4fc93038ef7d262fd894c48f960f6d914f79d83407106ede1ab55b92a0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"emoji2-views-helper-1.4.0.aar\">\n            <sha256 value=\"ed5d3ed772a5fbf0d570f7526f585cd61a180e60f9372584c328a68e2cff3375\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"emoji2-views-helper-1.4.0.module\">\n            <sha256 value=\"248aa276fdba8116e656233cac3f3fd541444df2305de93e6813795fcd0ba26a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.emoji2\" name=\"emoji2-views-helper\" version=\"1.5.0\">\n         <artifact name=\"emoji2-views-helper-1.5.0.aar\">\n            <sha256 value=\"ae6c4d0c1b4711fbbce1fa6bd94c53f8eb129c8d2cd313cffa3a76fb9e33449a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"emoji2-views-helper-1.5.0.module\">\n            <sha256 value=\"9bbe5a13aae1758c0d1cd4b4751d4703776767c7abce092ba874650f3c4231eb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.exifinterface\" name=\"exifinterface\" version=\"1.3.7\">\n         <artifact name=\"exifinterface-1.3.7-sources.jar\">\n            <sha256 value=\"04c0a6d2ff9745ab9946ebcdd2cf35889e05c79e5218e8b59a57a98a2670dc74\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"exifinterface-1.3.7.aar\">\n            <sha256 value=\"0e8f1832266c5b0667ad3d3b1098e624e49a09075493a014a7e88af01fd30ad3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"exifinterface-1.3.7.module\">\n            <sha256 value=\"f70819519ecc320028345c7c0c318d8157055e83fc466c899cd344dd4f630a31\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.exifinterface\" name=\"exifinterface\" version=\"1.4.0\">\n         <artifact name=\"exifinterface-1.4.0.aar\">\n            <sha256 value=\"61bb7b7f3ec0d9be3d96b59f90f014abdb1f7bc30d87c662cd705fab635c727f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"exifinterface-1.4.0.module\">\n            <sha256 value=\"9470bd9b13ae6f8615fc6fb0493caf9364d7b751062d2e58b5b49d361810b34d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.exifinterface\" name=\"exifinterface\" version=\"1.4.1\">\n         <artifact name=\"exifinterface-1.4.1.aar\">\n            <sha256 value=\"17e17a6b86bb54074d3a7ecfa695ab920eaff4cf667a8371ed82e377580cfcf6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"exifinterface-1.4.1.module\">\n            <sha256 value=\"daa541df49e2f7978078cfa3a0f9f16272417aa91f3e2e003b5bda11e585a83f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.fragment\" name=\"fragment\" version=\"1.5.4\">\n         <artifact name=\"fragment-1.5.4.module\">\n            <sha256 value=\"af3260808dceb6532efc2d7215be45872c24a699dada7d77bff738ce3b85a7f0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.fragment\" name=\"fragment\" version=\"1.7.1\">\n         <artifact name=\"fragment-1.7.1-sources.jar\">\n            <sha256 value=\"e1f221e82d5d549dfc50151b5f80aab86dd62a3db71a5ca0b0a3bbabf91765df\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-1.7.1.aar\">\n            <sha256 value=\"7ddebe9d830a04963733dcb340cab4bac1e69dfca797a6d59aa7bc56282150af\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-1.7.1.module\">\n            <sha256 value=\"d6aea759c6903c44da1cbe5f770d5ed3cad0b38945535089bcfacfe705f57841\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.fragment\" name=\"fragment\" version=\"1.8.0\">\n         <artifact name=\"fragment-1.8.0-sources.jar\">\n            <sha256 value=\"dadc27ff90ff01cbe177b309fbbf105a1f7a154d52e716b0e9f93edb0fc18b6a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-1.8.0.aar\">\n            <sha256 value=\"7ff14d11a3167a854ac12e62aa6b5a68d230821664199244d1563cf30b5c6fd0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-1.8.0.module\">\n            <sha256 value=\"6aff4179065b190ab32f9d6439add487aaeabc502bb07df0cddae63aade1b62b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.fragment\" name=\"fragment\" version=\"1.8.1\">\n         <artifact name=\"fragment-1.8.1.aar\">\n            <sha256 value=\"81526b28c3e4b513760174ee26142c1372c9e13d1c8bf3a220830307aca1971f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-1.8.1.module\">\n            <sha256 value=\"96fbcf9d1072756b18645b01c84f9f5009d5345ec1340c5179b4598dcfa6b945\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.fragment\" name=\"fragment\" version=\"1.8.2\">\n         <artifact name=\"fragment-1.8.2.aar\">\n            <sha256 value=\"c14786bdad6e7b12289a70de7d4f6b68dc7920278044d8dbdefeb3c3a7172d3e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-1.8.2.module\">\n            <sha256 value=\"95eb2d91e1b8022f1d466add4b7d125742031226e03890b9a892b3a03199b13a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.fragment\" name=\"fragment\" version=\"1.8.3\">\n         <artifact name=\"fragment-1.8.3.aar\">\n            <sha256 value=\"67f34f197053fb465bad470cd3f0bf89be4f0ca12b7f7b7638b16d40e4c06d95\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-1.8.3.module\">\n            <sha256 value=\"d0bc415793a980fc2fcd2f2d78b24a3593d7f85855797076216cdd500f4d92c8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.fragment\" name=\"fragment\" version=\"1.8.4\">\n         <artifact name=\"fragment-1.8.4.aar\">\n            <sha256 value=\"3a7aaf157173f650d57d925d2f0581a99d5776f032eac6f83b5e85bcf83440e9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-1.8.4.module\">\n            <sha256 value=\"443aacf8efcc197f0cf6304eb34f8f432ac31f2be1141e992d84b6481c123684\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.fragment\" name=\"fragment\" version=\"1.8.5\">\n         <artifact name=\"fragment-1.8.5.aar\">\n            <sha256 value=\"1dcb3a05d1b4815951eb492d80e883add888d5f24429d6423a8ad7fae14f48cd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-1.8.5.module\">\n            <sha256 value=\"604b5e65496d8c88d5e6767e82db42dc79b74874b2ae426e4cab624867f101f3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.fragment\" name=\"fragment\" version=\"1.8.6\">\n         <artifact name=\"fragment-1.8.6.aar\">\n            <sha256 value=\"6d5aa4c135247a7f8b59ef5d0bb2990f3a8d6502f02c763c8d34df8a410a3731\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-1.8.6.module\">\n            <sha256 value=\"567576bcb6db841f36358f1646e167360b8725be05cfe284907b66b4b12bedd5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.fragment\" name=\"fragment-ktx\" version=\"1.7.1\">\n         <artifact name=\"fragment-ktx-1.7.1-sources.jar\">\n            <sha256 value=\"6c9da4629e5057aa9f7caf9c2f6f77da387b0dec681d3dd65662d33c0871f7ca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-ktx-1.7.1.aar\">\n            <sha256 value=\"8facb90718cf525eaffe6d1bd6145dff156d6ae51d3c1f8202cd058ef881f62a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-ktx-1.7.1.module\">\n            <sha256 value=\"8cc96d948489f9411c91796e5c7332ecfb070c2d0f4d65b7dc3e7978fa255bbd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.fragment\" name=\"fragment-ktx\" version=\"1.8.0\">\n         <artifact name=\"fragment-ktx-1.8.0-sources.jar\">\n            <sha256 value=\"6c9da4629e5057aa9f7caf9c2f6f77da387b0dec681d3dd65662d33c0871f7ca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-ktx-1.8.0.aar\">\n            <sha256 value=\"29b4003b3a4639aeb5df989c85aefbf861a83ac18493a1defb71c5c191b0afd5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-ktx-1.8.0.module\">\n            <sha256 value=\"76993ac6f4d410942f4355f7cf45d56a0f465c08a1dbbd71bb30ad03b082cefc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.fragment\" name=\"fragment-ktx\" version=\"1.8.1\">\n         <artifact name=\"fragment-ktx-1.8.1.aar\">\n            <sha256 value=\"1ecb98f6446d05d5316dd98e231963a4480a5b7d78abf97e5dc8d28bf6ddeea1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-ktx-1.8.1.module\">\n            <sha256 value=\"6550466bc60be60c9314b2a14879bd263fc0fb22d78a74d09e1c3b6becf13ec5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.fragment\" name=\"fragment-ktx\" version=\"1.8.2\">\n         <artifact name=\"fragment-ktx-1.8.2.aar\">\n            <sha256 value=\"b7d93849460d956c48905c33c280bd0dc8c075f2e050b54ddfedcd4c4a14950a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-ktx-1.8.2.module\">\n            <sha256 value=\"481916debe11dd09d9424cc92c9a98181351d6c8e9ef9ece2680ed6e085a4502\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.fragment\" name=\"fragment-ktx\" version=\"1.8.3\">\n         <artifact name=\"fragment-ktx-1.8.3.aar\">\n            <sha256 value=\"6349f112b40dd2849bb66bbed27d83c83893c9b061f5fc50c76e8b798ff71bd6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-ktx-1.8.3.module\">\n            <sha256 value=\"ba80da9231246f3a0adb5220bdc28d83959de194b1f20d0b2712b7c56fd5e209\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.fragment\" name=\"fragment-ktx\" version=\"1.8.4\">\n         <artifact name=\"fragment-ktx-1.8.4.aar\">\n            <sha256 value=\"da0b9913bded46fc8b9997cabc9eb6dc47f26d87d9a7790536ed0cba89baf614\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-ktx-1.8.4.module\">\n            <sha256 value=\"2f4289fca241e08db2caf2ee1aab93042998ece4c3e81bb5fe6c6c06634e670b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.fragment\" name=\"fragment-ktx\" version=\"1.8.5\">\n         <artifact name=\"fragment-ktx-1.8.5.aar\">\n            <sha256 value=\"8023b7963ec91db7d005d3e915faa78b5c1a2b3cadbfd90a1fd29eb299af494c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-ktx-1.8.5.module\">\n            <sha256 value=\"a15daf4272633025aed5c2e96073c5e904a147802c669db343237cb3b02ba9b9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.fragment\" name=\"fragment-ktx\" version=\"1.8.6\">\n         <artifact name=\"fragment-ktx-1.8.6.aar\">\n            <sha256 value=\"64fad5c91c5f3c59509a458e91045ae1277df29bf32c8dc19d0720b5bab405c2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fragment-ktx-1.8.6.module\">\n            <sha256 value=\"6f9027367f4a598903feba9c7c0652c9863ca763c39467615353db78eb184c91\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.hilt\" name=\"hilt-common\" version=\"1.2.0\">\n         <artifact name=\"hilt-common-1.2.0.jar\">\n            <sha256 value=\"6b09081fd5a10de569b4be6463b146f6045bb18919bf309aff064980b6310371\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-common-1.2.0.module\">\n            <sha256 value=\"285d6db73ad92ed742b32251bac75314d08e68c93aaee46d9dd5092e93b48ce9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.hilt\" name=\"hilt-compiler\" version=\"1.2.0\">\n         <artifact name=\"hilt-compiler-1.2.0.jar\">\n            <sha256 value=\"4369f2d0898ed1fa9d439d21655c964e15d13a3731dee893508ab5fad3a30be8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-compiler-1.2.0.module\">\n            <sha256 value=\"89c0b0a0e41c7948fe93933456ff115a8f1e196726096ee4f796af1a58bc7371\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.hilt\" name=\"hilt-work\" version=\"1.2.0\">\n         <artifact name=\"hilt-work-1.2.0-sources.jar\">\n            <sha256 value=\"e47952e0207c7011734ee0901a329e84da31942f7f45f761a1d8660e6b2a8b2e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-work-1.2.0.aar\">\n            <sha256 value=\"8f02b962a84b686e4a4749db40ec884d97a7439ff9191a9a26e46e69879e4bf8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-work-1.2.0.module\">\n            <sha256 value=\"fed81bb6537730631d9ff5344a3cdb184a43d742d6c68b79bec611bb03f63b67\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.interpolator\" name=\"interpolator\" version=\"1.0.0\">\n         <artifact name=\"interpolator-1.0.0.aar\">\n            <sha256 value=\"33193135a64fe21fa2c35eec6688f1a76e512606c0fc83dc1b689e37add7732a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"interpolator-1.0.0.pom\">\n            <sha256 value=\"0ddc07cc39699f48ecd9ec894b5830c0f09e22e82959294edf37217224c88b7b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.legacy\" name=\"legacy-support-core-utils\" version=\"1.0.0\">\n         <artifact name=\"legacy-support-core-utils-1.0.0.aar\">\n            <sha256 value=\"a7edcf01d5b52b3034073027bc4775b78a4764bb6202bb91d61c829add8dd1c7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"legacy-support-core-utils-1.0.0.pom\">\n            <sha256 value=\"8fd093008b3ee7c06e52c78da2af980a7b47b69b967fa91dad7af466f7a00a38\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common\" version=\"2.3.1\">\n         <artifact name=\"lifecycle-common-2.3.1.jar\">\n            <sha256 value=\"15848fb56db32f4c7cdc72b324003183d52a4884d6bf09be708ac7f587d139b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-2.3.1.module\">\n            <sha256 value=\"5fb7c8514d8c56cada5e29ef89dc0289e71942ab4cb0b2e6dca137b9dcb8fdd4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common\" version=\"2.5.1\">\n         <artifact name=\"lifecycle-common-2.5.1.jar\">\n            <sha256 value=\"20ad1520f625cf455e6afd7290988306d3a9886efa993e0860fbabf4bb3f7bda\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-2.5.1.module\">\n            <sha256 value=\"7d4bc2961cd5bd399e3621d434f0c453dd6cadf891f917a946cc291abdda8f1a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common\" version=\"2.6.2\">\n         <artifact name=\"lifecycle-common-2.6.2.jar\">\n            <sha256 value=\"f34831b6c71cd844e1d35d1be49d5e79447c5ab856346531b1e8676fda7374b1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-2.6.2.module\">\n            <sha256 value=\"0fa7f28f5cff8a406a4f7870b243cb0d6d7a7c20faa7a2becaff5907ae12f9cc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common\" version=\"2.8.1\">\n         <artifact name=\"lifecycle-common-2.8.1.module\">\n            <sha256 value=\"4442d73add4e6862086c8f979be651c0fa24f3a61f3e30368daaa9ce99fc57d6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-metadata-2.8.1.jar\">\n            <sha256 value=\"e26c6d7d04a490c6fdaa1415ac95797a7dcc7444be3f3ab3d9acad87dae4921c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common\" version=\"2.8.2\">\n         <artifact name=\"lifecycle-common-2.8.2.module\">\n            <sha256 value=\"bbf1250f00552c82871e283dc2af380b1bc2a1b52a207f012f5d8c849544b621\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-metadata-2.8.2.jar\">\n            <sha256 value=\"e26c6d7d04a490c6fdaa1415ac95797a7dcc7444be3f3ab3d9acad87dae4921c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common\" version=\"2.8.3\">\n         <artifact name=\"lifecycle-common-2.8.3.module\">\n            <sha256 value=\"056db8ab7dfcc25497051143d928e7cf8a11160f9fb217dbcd277a6fa34fe208\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-metadata-2.8.3.jar\">\n            <sha256 value=\"e26c6d7d04a490c6fdaa1415ac95797a7dcc7444be3f3ab3d9acad87dae4921c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common\" version=\"2.8.4\">\n         <artifact name=\"lifecycle-common-2.8.4.module\">\n            <sha256 value=\"8dc229f4d407b4abccddeab8f960188d4e554b82a03a4d92d35602de25d7a2db\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-metadata-2.8.4.jar\">\n            <sha256 value=\"e26c6d7d04a490c6fdaa1415ac95797a7dcc7444be3f3ab3d9acad87dae4921c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common\" version=\"2.8.5\">\n         <artifact name=\"lifecycle-common-2.8.5.module\">\n            <sha256 value=\"030b8df19e4978ac1be969c2a29a01bfc2cc56284f512639a0ad34c22da6c4f1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-metadata-2.8.5.jar\">\n            <sha256 value=\"e26c6d7d04a490c6fdaa1415ac95797a7dcc7444be3f3ab3d9acad87dae4921c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common\" version=\"2.8.6\">\n         <artifact name=\"lifecycle-common-2.8.6.module\">\n            <sha256 value=\"d028094512e093da990fafae46f86b14ec7341d7edfa45709de5512027c22d4a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-metadata-2.8.6.jar\">\n            <sha256 value=\"e26c6d7d04a490c6fdaa1415ac95797a7dcc7444be3f3ab3d9acad87dae4921c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common\" version=\"2.8.7\">\n         <artifact name=\"lifecycle-common-2.8.7.module\">\n            <sha256 value=\"0de78fc06ee5045d68fc7e81c313a2a3d53ac7d127f79f9bc95abf7be49e5764\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-metadata-2.8.7.jar\">\n            <sha256 value=\"e26c6d7d04a490c6fdaa1415ac95797a7dcc7444be3f3ab3d9acad87dae4921c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common\" version=\"2.9.0\">\n         <artifact name=\"lifecycle-common-2.9.0.module\">\n            <sha256 value=\"67a89ee16389d5eb31792d8ceaccc3cf200900c14c20bb947536e326c16ce0ad\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-metadata-2.9.0.jar\">\n            <sha256 value=\"0ee8e154c0d4ef0aca4815c4401043e50d1f6f1f6239823ef8abdb69d9b5ee79\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common-java8\" version=\"2.8.1\">\n         <artifact name=\"lifecycle-common-java8-2.8.1.jar\">\n            <sha256 value=\"c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-java8-2.8.1.module\">\n            <sha256 value=\"805ef2c1224fc13d426e586d37673b26c23e7b15593109d214306ea246aa86b0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common-java8\" version=\"2.8.2\">\n         <artifact name=\"lifecycle-common-java8-2.8.2.jar\">\n            <sha256 value=\"c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-java8-2.8.2.module\">\n            <sha256 value=\"391ec077deaa358a4955d6e63c6171d4bd514c46705d9b1972b9bd33f1d2e4dc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common-java8\" version=\"2.8.3\">\n         <artifact name=\"lifecycle-common-java8-2.8.3.jar\">\n            <sha256 value=\"c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-java8-2.8.3.module\">\n            <sha256 value=\"0a63c3ebc7470da088520775ed9de23a2053246e762f33453bae5fd0a0435979\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common-java8\" version=\"2.8.4\">\n         <artifact name=\"lifecycle-common-java8-2.8.4.jar\">\n            <sha256 value=\"c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-java8-2.8.4.module\">\n            <sha256 value=\"5bf8c01e20436728f1140e0b4db1b9ea4bef4b8f7e5c928e1fbcc937d5e07c79\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common-java8\" version=\"2.8.5\">\n         <artifact name=\"lifecycle-common-java8-2.8.5.jar\">\n            <sha256 value=\"c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-java8-2.8.5.module\">\n            <sha256 value=\"ad909ad7f6c8fc458d604d0124365e769ccde160394433aaef6cb5367d2259df\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common-java8\" version=\"2.8.6\">\n         <artifact name=\"lifecycle-common-java8-2.8.6.jar\">\n            <sha256 value=\"c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-java8-2.8.6.module\">\n            <sha256 value=\"a107541316cd2d471b4a58d7c38c6f2f9f816b53d3316cf42e5fb19d9b09ab3e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common-java8\" version=\"2.8.7\">\n         <artifact name=\"lifecycle-common-java8-2.8.7.jar\">\n            <sha256 value=\"c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-java8-2.8.7.module\">\n            <sha256 value=\"e27df2ab2f9c1c02fc16fe87e19da0ebb79b4b3f1e2bd2af17364bed59a0a2a9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common-java8\" version=\"2.9.0\">\n         <artifact name=\"lifecycle-common-java8-2.9.0.jar\">\n            <sha256 value=\"497dd84de9f2fd46324f25f9a3af032d3a23d087e87af515c4b19435f6d6a651\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-java8-2.9.0.module\">\n            <sha256 value=\"7de38d4c16978fd9276e6d51e7e85ecb446536298be6d57bb0aefe56bd8f0be3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common-jvm\" version=\"2.8.1\">\n         <artifact name=\"lifecycle-common-jvm-2.8.1-sources.jar\">\n            <sha256 value=\"99aa4aa1f4432d9dab6a8b07ac01c6c7eb0c0f813f4c727bc29e9e60a0059480\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-jvm-2.8.1.jar\">\n            <sha256 value=\"61c873a7327c946ec033c310bb98f3f92eeabcede0e1a5200ab8a1896483c7bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-jvm-2.8.1.module\">\n            <sha256 value=\"f9d3ee151ba951be2df50a9a45f237d8394bff2968edcc11e1014b8894583cbb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common-jvm\" version=\"2.8.2\">\n         <artifact name=\"lifecycle-common-jvm-2.8.2-sources.jar\">\n            <sha256 value=\"99aa4aa1f4432d9dab6a8b07ac01c6c7eb0c0f813f4c727bc29e9e60a0059480\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-jvm-2.8.2.jar\">\n            <sha256 value=\"61c873a7327c946ec033c310bb98f3f92eeabcede0e1a5200ab8a1896483c7bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-jvm-2.8.2.module\">\n            <sha256 value=\"46b20ea622920f2c083a1f96efb983a4a16823676daed7478aa6fce5e88c3a52\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common-jvm\" version=\"2.8.3\">\n         <artifact name=\"lifecycle-common-jvm-2.8.3.jar\">\n            <sha256 value=\"61c873a7327c946ec033c310bb98f3f92eeabcede0e1a5200ab8a1896483c7bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-jvm-2.8.3.module\">\n            <sha256 value=\"d054fb08ef9e789886cecb20bb4b96b7f5c43f1a4cfb87bf120046ff9619b337\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common-jvm\" version=\"2.8.4\">\n         <artifact name=\"lifecycle-common-jvm-2.8.4.jar\">\n            <sha256 value=\"61c873a7327c946ec033c310bb98f3f92eeabcede0e1a5200ab8a1896483c7bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-jvm-2.8.4.module\">\n            <sha256 value=\"d54d097f333f27f5ced2af419371ece43ac4530bed3be1a4e6603d8c105235a0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common-jvm\" version=\"2.8.5\">\n         <artifact name=\"lifecycle-common-jvm-2.8.5.jar\">\n            <sha256 value=\"61c873a7327c946ec033c310bb98f3f92eeabcede0e1a5200ab8a1896483c7bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-jvm-2.8.5.module\">\n            <sha256 value=\"05683d910dc541d06c4c97a4992b3e2971ae78c2b5cc35f6bf1d8e07de0e970e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common-jvm\" version=\"2.8.6\">\n         <artifact name=\"lifecycle-common-jvm-2.8.6.jar\">\n            <sha256 value=\"61c873a7327c946ec033c310bb98f3f92eeabcede0e1a5200ab8a1896483c7bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-jvm-2.8.6.module\">\n            <sha256 value=\"bfc71652d4c53fa2bcc4d415f35a1d9557719666a785a1ad615b641b1806e614\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common-jvm\" version=\"2.8.7\">\n         <artifact name=\"lifecycle-common-jvm-2.8.7.jar\">\n            <sha256 value=\"61c873a7327c946ec033c310bb98f3f92eeabcede0e1a5200ab8a1896483c7bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-jvm-2.8.7.module\">\n            <sha256 value=\"e487a4c007d6abf29d01083c33e28696cd42cffcf714489dc91e97c3d42c6060\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-common-jvm\" version=\"2.9.0\">\n         <artifact name=\"lifecycle-common-jvm-2.9.0.jar\">\n            <sha256 value=\"37d89b2101f074ac6c260917dabb185607645ee200aa3018c7c5bde70edcf184\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-common-jvm-2.9.0.module\">\n            <sha256 value=\"73fad6c31db3b94608ac90854736012c9c12cf3f42fa1438997280baac0520a6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata\" version=\"2.5.1\">\n         <artifact name=\"lifecycle-livedata-2.5.1.aar\">\n            <sha256 value=\"8ad18cf18a8f82d77b11aab49cf9b9b3d418e5f564b216e91d815cf038cefdfb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-2.5.1.module\">\n            <sha256 value=\"b5f4a08193d7802ac3574d91ef442ae31c633ff3095f1c4973c80d68908a48bc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata\" version=\"2.6.2\">\n         <artifact name=\"lifecycle-livedata-2.6.2.aar\">\n            <sha256 value=\"67359f609dfc2bf65da1270b23033f856064ec279f058e0a70c715f7c9003031\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-2.6.2.module\">\n            <sha256 value=\"19a287b46d1b1ffe297bee0df7dee5183aeba95600ec0de8742adeb5b67c8bab\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata\" version=\"2.8.1\">\n         <artifact name=\"lifecycle-livedata-2.8.1.aar\">\n            <sha256 value=\"1a280b5d6351515907aaa19d3179ec8076095985e979e323a5972bdc5d6b7945\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-2.8.1.module\">\n            <sha256 value=\"5e7fb36c1c4ce810bfaa3d41cd3ff44b86439c04e6c27cbbb209996cb6573e40\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata\" version=\"2.8.2\">\n         <artifact name=\"lifecycle-livedata-2.8.2.aar\">\n            <sha256 value=\"5b01d448a59caf922c5e9d9e9d1067f25a2b015fd5130e9baac9c86ed2464354\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-2.8.2.module\">\n            <sha256 value=\"f36fd960cae98fce668cf98ea57a33af120cdee0cfb275e94fca74663a4918f6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata\" version=\"2.8.3\">\n         <artifact name=\"lifecycle-livedata-2.8.3.aar\">\n            <sha256 value=\"fdbf70620b48550ab23fcf04d9ee59123bf8c31db26016ca74d3332a79444aee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-2.8.3.module\">\n            <sha256 value=\"c5eb3d6241a79b06ffc6fdf7cb53a4afb9cc01f6fce6ce1d1a4e4a5459e8b8f3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata\" version=\"2.8.4\">\n         <artifact name=\"lifecycle-livedata-2.8.4.aar\">\n            <sha256 value=\"847f99ae15ba72997b322ae909014a162e6c8dcf32752e6173799d94e6cdab14\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-2.8.4.module\">\n            <sha256 value=\"eacaa26c6b21639206da91b652cd724ee7a09fd854697b18deda65de24150a2b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata\" version=\"2.8.5\">\n         <artifact name=\"lifecycle-livedata-2.8.5.aar\">\n            <sha256 value=\"034ca56d2fed11a18eb22133b58a8d3a563d1cd8b56aab4f3c8dad6b9146ddc5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-2.8.5.module\">\n            <sha256 value=\"90bbc7f4f18489d06ac8a851a1145638ebd6af51eee9321ff64fcaad89bbb0b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata\" version=\"2.8.6\">\n         <artifact name=\"lifecycle-livedata-2.8.6.aar\">\n            <sha256 value=\"fe096b3e7ab829c1467d44a41805f1a9de61926bbda9c7be42aa2e7fa2de11ae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-2.8.6.module\">\n            <sha256 value=\"9ce5898949806f9ae136e3d98a323e1e0db51c8f8925c68c088a77fe7ef493e5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata\" version=\"2.8.7\">\n         <artifact name=\"lifecycle-livedata-2.8.7.aar\">\n            <sha256 value=\"703634525a67b1c6beaaab4f980dfa0bacdf7e143d0b5d51f5ac0d9404400290\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-2.8.7.module\">\n            <sha256 value=\"d72516cfce78bef654fe5df4c99b9dabd19780c95053268a6d5b4b0dda2d4323\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata\" version=\"2.9.0\">\n         <artifact name=\"lifecycle-livedata-2.9.0.aar\">\n            <sha256 value=\"46382ddfba348db97846cfa81d67d72304dc156bb96224358b429fe748bc6ab4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-2.9.0.module\">\n            <sha256 value=\"f3c8cb314e7a31e9e57ae5c28fc2d4c430237350b0806e87143f15855e4aaa29\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-core\" version=\"2.5.1\">\n         <artifact name=\"lifecycle-livedata-core-2.5.1.aar\">\n            <sha256 value=\"ee792103ca248bfaf150c45a93871e4cf7e8cebab990e0f62f7de5d4ff2f209f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-core-2.5.1.module\">\n            <sha256 value=\"3f388e9e078901970c2bfcfc02fecae948de4b46be5211919ae07d012ca2980d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-core\" version=\"2.6.2\">\n         <artifact name=\"lifecycle-livedata-core-2.6.2.aar\">\n            <sha256 value=\"2256780a3cff4a1e57fbb3d442557c17dc363ab8af105bcaf5261d8e2d5db949\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-core-2.6.2.module\">\n            <sha256 value=\"527d0e1ac467d1f47cc20ed7c30db170217299fabb868154cf5d1765e4e4dad9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-core\" version=\"2.8.1\">\n         <artifact name=\"lifecycle-livedata-core-2.8.1.aar\">\n            <sha256 value=\"ed204afc11b8db2b154bee54a2b1af28d46acc54dc05dce463b4fc61e3ee3995\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-core-2.8.1.module\">\n            <sha256 value=\"5e22f4a4769c06bb86da098a6d38fda8e625b2d656f1d0cd7144a90f8f018f4c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-core\" version=\"2.8.2\">\n         <artifact name=\"lifecycle-livedata-core-2.8.2.aar\">\n            <sha256 value=\"906199de52b28505def4ad5e5a250286e239cd858ef8007843b80754754bf4e2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-core-2.8.2.module\">\n            <sha256 value=\"f386a0f6bee8f0379c646989a45f93bf5cd1bfa4743690a6c62654a37f2f020a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-core\" version=\"2.8.3\">\n         <artifact name=\"lifecycle-livedata-core-2.8.3.aar\">\n            <sha256 value=\"01779694b1e822d2eeb9decec86f40dc2983806b985fb48ee116c860534e7ac5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-core-2.8.3.module\">\n            <sha256 value=\"419354ed1fcf98b7fad9dbdc9c60cb3772a46e734c10d6b54e1567916b263d15\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-core\" version=\"2.8.4\">\n         <artifact name=\"lifecycle-livedata-core-2.8.4.aar\">\n            <sha256 value=\"651f6d63e129e0be664a537bf79461848d384ef88ce46d4d575537da42e831d7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-core-2.8.4.module\">\n            <sha256 value=\"d846ec86fc3d27ac38583e9059cdc169268cb7e46a20f376b9c57fb873b2d3b9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-core\" version=\"2.8.5\">\n         <artifact name=\"lifecycle-livedata-core-2.8.5.aar\">\n            <sha256 value=\"9f09593796940800ee9aa2c9c09c703bbde3583ce36253119dc08a1c1e9d79d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-core-2.8.5.module\">\n            <sha256 value=\"c38eb48d70579fa8afab0a3a3c1ae39aac8d34da63879bb81385b12c4a16eebf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-core\" version=\"2.8.6\">\n         <artifact name=\"lifecycle-livedata-core-2.8.6.aar\">\n            <sha256 value=\"15d60e8355c3aa6d001721ba428f3c59dcd17b6bca96cbdea471cac6583c2ca7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-core-2.8.6.module\">\n            <sha256 value=\"824ca59b2eefd8db49300bea4ff69f28d61fc45a8af402e5515c89b2f5fb1c22\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-core\" version=\"2.8.7\">\n         <artifact name=\"lifecycle-livedata-core-2.8.7.aar\">\n            <sha256 value=\"d786e5e6f79b8fab026f09a2d4ae3de1d72875f7645a6b7be48f1d9ab384734b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-core-2.8.7.module\">\n            <sha256 value=\"b0a1da7f1fe36060ec7847f1972857a24b7db29e6cd4516e62c5520009d813c2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-core\" version=\"2.9.0\">\n         <artifact name=\"lifecycle-livedata-core-2.9.0.aar\">\n            <sha256 value=\"64f96b52c70895807f3020e2e8fa11f3ec2da9c157f62aae21a2c9d3b484a747\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-core-2.9.0.module\">\n            <sha256 value=\"0c1fb0b0edd007b017ebf5c5de3f5215eb7745e1270894554ebe81af4c4b8998\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-core-ktx\" version=\"2.6.1\">\n         <artifact name=\"lifecycle-livedata-core-ktx-2.6.1.module\">\n            <sha256 value=\"d8699c515516aee3a0613de951649d9f1e137d33fedf077be0a6aa9e01ae211f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-core-ktx\" version=\"2.8.1\">\n         <artifact name=\"lifecycle-livedata-core-ktx-2.8.1.aar\">\n            <sha256 value=\"875f86c77f83fc7581cb6e402da4ae3ab00a4daca7ba5ad5c64d46dd74016909\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-core-ktx-2.8.1.module\">\n            <sha256 value=\"e82b57a29ad49639557e59ae14833a046b664b6cd4c176f16aa7a7ff2180e027\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-core-ktx\" version=\"2.8.2\">\n         <artifact name=\"lifecycle-livedata-core-ktx-2.8.2.aar\">\n            <sha256 value=\"31617dc7d89886b3ac6e93e4a781fe3c1f9b0b29050d4fc87c89ffd5d6cc821e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-core-ktx-2.8.2.module\">\n            <sha256 value=\"58a4bc3ca72ec82edb7f41e3dff70bfde2ac8fe6404a4af5849f848b724a4522\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-core-ktx\" version=\"2.8.3\">\n         <artifact name=\"lifecycle-livedata-core-ktx-2.8.3.aar\">\n            <sha256 value=\"d6bedec258e3bfc86d2cba27fea4c03d82872057bfca2a4342461e6defb2d35e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-core-ktx-2.8.3.module\">\n            <sha256 value=\"4d73c52e4cc5e945350a9eead0521b846428c723111ef70bdb412aaaf45cf114\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-core-ktx\" version=\"2.8.4\">\n         <artifact name=\"lifecycle-livedata-core-ktx-2.8.4.aar\">\n            <sha256 value=\"d1c95016534918b0d759c5444ac0b07998b5a60d7d6fb62d21efb65799a69ea2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-core-ktx-2.8.4.module\">\n            <sha256 value=\"b5d4bf09f82f7e76f8ba553387e204892178c5156464168fa0c2fc78c76a50d2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-core-ktx\" version=\"2.8.5\">\n         <artifact name=\"lifecycle-livedata-core-ktx-2.8.5.aar\">\n            <sha256 value=\"d336a8526a5dded1efa2809d6f911659f87164ec5db20f3107c5de92c1194052\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-core-ktx-2.8.5.module\">\n            <sha256 value=\"8656deb35217fdbbd1ee7ceabfbc9be7083a0c5d129c359be4a92e6837d790b9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-core-ktx\" version=\"2.8.6\">\n         <artifact name=\"lifecycle-livedata-core-ktx-2.8.6.aar\">\n            <sha256 value=\"511ef0f66d839cff4e8998e57dec18e004a4ef99603d489e02537ad98a5ee621\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-core-ktx-2.8.6.module\">\n            <sha256 value=\"f711363c5832547611d416c8a3a0dc4e6362f4afb0450d22b9eb571656a7f8e5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-core-ktx\" version=\"2.8.7\">\n         <artifact name=\"lifecycle-livedata-core-ktx-2.8.7.aar\">\n            <sha256 value=\"b6e785e8532b155921310563a90fd262b5dacf6964aeea6cbbe412ac1da59460\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-core-ktx-2.8.7.module\">\n            <sha256 value=\"3d188bb622fcbb021d93cc007d3c477d4f402ae6f58b7fc46a441d0ab70678ad\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-core-ktx\" version=\"2.9.0\">\n         <artifact name=\"lifecycle-livedata-core-ktx-2.9.0.aar\">\n            <sha256 value=\"f265a665819e51322b3eea2a6ff2ab90186cadf1787a81dd8bef0ce93c4a600a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-core-ktx-2.9.0.module\">\n            <sha256 value=\"518914acacf1115df27c8807c2bcfaaaca30c43e8dfa3bf121707d2f6f0de0a0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-ktx\" version=\"2.8.1\">\n         <artifact name=\"lifecycle-livedata-ktx-2.8.1.aar\">\n            <sha256 value=\"538e0e732dbfbf05886c9f91f0f7871fa566c518631544b208d9ba38a8824f20\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-ktx-2.8.1.module\">\n            <sha256 value=\"5b28da2e5032b579b792bc9a8698b4ae0eda8ab48f00fa77123ed0885d6642c8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-ktx\" version=\"2.8.2\">\n         <artifact name=\"lifecycle-livedata-ktx-2.8.2.aar\">\n            <sha256 value=\"273e77a59829d88c1d38bb02dcb6f5417896235fe9b399281f821d9c45174732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-ktx-2.8.2.module\">\n            <sha256 value=\"34ac12793e78ac85e26050a59664c521205e785ef310b37fac6b48599dc04121\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-ktx\" version=\"2.8.3\">\n         <artifact name=\"lifecycle-livedata-ktx-2.8.3.aar\">\n            <sha256 value=\"2ed5472ef22e9d589bb892d46d5d3ad68cba699c009fc4f7aa7b0a0f330b5364\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-ktx-2.8.3.module\">\n            <sha256 value=\"f828adaff165aedabfd3e9f226b401b47cf731384323bedb3f2c604f71d9b573\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-ktx\" version=\"2.8.4\">\n         <artifact name=\"lifecycle-livedata-ktx-2.8.4.aar\">\n            <sha256 value=\"8e3eef107070b4f0dddcbde41432eedd42c65c205ef5e672f216a628f7050008\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-ktx-2.8.4.module\">\n            <sha256 value=\"7c7934ee84306a9d49247c9b7e6fd11551f6b1951c5f3f2c4a441bb0b38ed6e4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-ktx\" version=\"2.8.5\">\n         <artifact name=\"lifecycle-livedata-ktx-2.8.5.aar\">\n            <sha256 value=\"b3c775b736f55ca2994a75f408fd1f3ab8f5333e061ffae3aeb552b219205999\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-ktx-2.8.5.module\">\n            <sha256 value=\"51299cf4450ff94b2471859528519c4dd7f4e9061ba5ec019f4c5b989a367059\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-ktx\" version=\"2.8.6\">\n         <artifact name=\"lifecycle-livedata-ktx-2.8.6.aar\">\n            <sha256 value=\"137605f87a84f2c68d836a05f517c46cbe5fa3cf4622dc9eda6154ea05047ccc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-ktx-2.8.6.module\">\n            <sha256 value=\"d20f539f9f727c48a259dd604121b31383f9f780f88ecd262986c57385d47c75\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-ktx\" version=\"2.8.7\">\n         <artifact name=\"lifecycle-livedata-ktx-2.8.7.aar\">\n            <sha256 value=\"80af6960fb8b5d5b26bc04086613435e78a7c214be8b68b461bb79dedc431f76\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-ktx-2.8.7.module\">\n            <sha256 value=\"4190ab23e13bbcd6cc3f5d0737b45f83a4004104780a897cfd8697e02421c895\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-livedata-ktx\" version=\"2.9.0\">\n         <artifact name=\"lifecycle-livedata-ktx-2.9.0.aar\">\n            <sha256 value=\"578720de6d3a9f4bae022366b18bbada436f7dcc14e720200cefa2498c1e3dee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-livedata-ktx-2.9.0.module\">\n            <sha256 value=\"f18a3fbdd563fffacca4649243d34b508a4d467acd0b8e7d678a7f81af930591\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-process\" version=\"2.4.1\">\n         <artifact name=\"lifecycle-process-2.4.1.module\">\n            <sha256 value=\"e3aae3ed04b4744ff31452e98fd299e3adfd28d3b5723661d9678b92fa09ceb4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-process\" version=\"2.8.1\">\n         <artifact name=\"lifecycle-process-2.8.1.aar\">\n            <sha256 value=\"fa6325d0742b929c6c10dd5558c02ba07cf47d8f922c70169cc86c7e1a353977\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-process-2.8.1.module\">\n            <sha256 value=\"06d9fff7202f3bdcd1d85165238d35a1b8c538848f1cbd41b118ce4b3b8ddabe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-process\" version=\"2.8.2\">\n         <artifact name=\"lifecycle-process-2.8.2.aar\">\n            <sha256 value=\"613688bfb3eaac259cf429d804b674325bab5245b9562576e4511a765fec3b04\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-process-2.8.2.module\">\n            <sha256 value=\"7e76faf10ecb3fe8213b4c242f8fa9b80da7942c070b4758b7a7a4217c9a9453\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-process\" version=\"2.8.3\">\n         <artifact name=\"lifecycle-process-2.8.3.aar\">\n            <sha256 value=\"d3fa2257cd4cf512717dc08c13338872b136b97d2d510fce373b9cc391ea19b9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-process-2.8.3.module\">\n            <sha256 value=\"e34ce64204e8e92713e7f98366f942f01c07bd344426050dad2a1f5d74ff962d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-process\" version=\"2.8.4\">\n         <artifact name=\"lifecycle-process-2.8.4.aar\">\n            <sha256 value=\"98f9eb84b2750add14c43d6daae70678c13e20111292945f36af74199ae8469b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-process-2.8.4.module\">\n            <sha256 value=\"9bd086fb3d5d1fc929a417868e4fc922dab5401bca9dc069f8602154af81fb40\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-process\" version=\"2.8.5\">\n         <artifact name=\"lifecycle-process-2.8.5.aar\">\n            <sha256 value=\"a049060b3b645b6cdadf79b1c13218a2b743d1e1b08173623879810485ed6a87\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-process-2.8.5.module\">\n            <sha256 value=\"de6d3c74bb32baf81a66b3139e7d4adaba8688ad87537d06bfed65535bc65f25\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-process\" version=\"2.8.6\">\n         <artifact name=\"lifecycle-process-2.8.6.aar\">\n            <sha256 value=\"63a03b5d2f5bdda1dbd8e66e52db4120471f958ac6e1fa4ac89a00426a8b6fbb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-process-2.8.6.module\">\n            <sha256 value=\"72c20819f3c9390f91acd9df8fbc9e6246f1bef4e08fd51f790f01cda040ad2c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-process\" version=\"2.8.7\">\n         <artifact name=\"lifecycle-process-2.8.7.aar\">\n            <sha256 value=\"62e076a2de2d650a23bf79495419f8a4357ad8e9b28d801318d0fcdd6e35fa87\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-process-2.8.7.module\">\n            <sha256 value=\"98a1c08c10cfd4bdaa89e9c256a9b96c09cdd5bcfbb03a9260817a6d89cc2378\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-process\" version=\"2.9.0\">\n         <artifact name=\"lifecycle-process-2.9.0.aar\">\n            <sha256 value=\"c15ce972cc28936a596a9cd256b32f22768a61d5dd810fa56ba945522a0ee7a5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-process-2.9.0.module\">\n            <sha256 value=\"b2ed7677a2c4fb5735b03f141ebb1e22b2f0fbe13ac9eeefce8e9262b074bccc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime\" version=\"2.3.1\">\n         <artifact name=\"lifecycle-runtime-2.3.1.module\">\n            <sha256 value=\"2a7b90e5049b674b36bccfd68677b3a0b3178b3f7c2ef7ddf618d3895598c4ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime\" version=\"2.6.1\">\n         <artifact name=\"lifecycle-runtime-2.6.1.module\">\n            <sha256 value=\"a4cbb01a42d07047bd8d870017c96a1b0b7b4673320e86b66317a13be2ec10c7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime\" version=\"2.6.2\">\n         <artifact name=\"lifecycle-runtime-2.6.2.aar\">\n            <sha256 value=\"4867fd5279742fba8388821930cb2affe06d81a52814e7e41e70392ea0ef887c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-2.6.2.module\">\n            <sha256 value=\"ea0131846abe1fe9dea59ac6dfe1f0fb9d8b6d600c9eff9a1fd4ad5ee5e7cbc7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime\" version=\"2.8.1\">\n         <artifact name=\"lifecycle-runtime-2.8.1.aar\">\n            <sha256 value=\"d4ae4e8dc0ca6265b683d7b2333a102a3ee84ad97ccb9fbec4334f5cd0e3f54d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-2.8.1.module\">\n            <sha256 value=\"d0701961c5fdae079428dedd343b2ffd48ae68da5513b9977b35c5428657620b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-metadata-2.8.1.jar\">\n            <sha256 value=\"4ee784530e550754230395d4f4f56817c9fcbc08db4d645e77441f3dd82c56b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime\" version=\"2.8.2\">\n         <artifact name=\"lifecycle-runtime-2.8.2.aar\">\n            <sha256 value=\"d4ae4e8dc0ca6265b683d7b2333a102a3ee84ad97ccb9fbec4334f5cd0e3f54d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-2.8.2.module\">\n            <sha256 value=\"a4b8fc08f65e12449421766b83a15d41a4325f412348078d755c175e7102abc4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-metadata-2.8.2.jar\">\n            <sha256 value=\"4ee784530e550754230395d4f4f56817c9fcbc08db4d645e77441f3dd82c56b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime\" version=\"2.8.3\">\n         <artifact name=\"lifecycle-runtime-2.8.3.aar\">\n            <sha256 value=\"d4ae4e8dc0ca6265b683d7b2333a102a3ee84ad97ccb9fbec4334f5cd0e3f54d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-2.8.3.module\">\n            <sha256 value=\"bb03b4ef4bccd8a9e5fd384c84497745adf7d4c217e12cb15df8d9be4a629ef1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-metadata-2.8.3.jar\">\n            <sha256 value=\"4ee784530e550754230395d4f4f56817c9fcbc08db4d645e77441f3dd82c56b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime\" version=\"2.8.4\">\n         <artifact name=\"lifecycle-runtime-2.8.4.aar\">\n            <sha256 value=\"d4ae4e8dc0ca6265b683d7b2333a102a3ee84ad97ccb9fbec4334f5cd0e3f54d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-2.8.4.module\">\n            <sha256 value=\"247560c8e0bc40e729931f5ba64fa9c82a67824ad91fde7344f15d169543ee9b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-metadata-2.8.4.jar\">\n            <sha256 value=\"4ee784530e550754230395d4f4f56817c9fcbc08db4d645e77441f3dd82c56b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime\" version=\"2.8.5\">\n         <artifact name=\"lifecycle-runtime-2.8.5.module\">\n            <sha256 value=\"3e7625c1c6c7a4bcfa8874d9d977b4f155fc33f6f02ad6d941a42703110dc475\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-metadata-2.8.5.jar\">\n            <sha256 value=\"4ee784530e550754230395d4f4f56817c9fcbc08db4d645e77441f3dd82c56b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime\" version=\"2.8.6\">\n         <artifact name=\"lifecycle-runtime-2.8.6.module\">\n            <sha256 value=\"71f3bf687873f16efd84dacbe3a1f421d196950b22d9a30ef30a9119fa7c7ce0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-metadata-2.8.6.jar\">\n            <sha256 value=\"4ee784530e550754230395d4f4f56817c9fcbc08db4d645e77441f3dd82c56b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime\" version=\"2.8.7\">\n         <artifact name=\"lifecycle-runtime-2.8.7.module\">\n            <sha256 value=\"cb00e5cb9283b75948dcc0d27234fb6d72a80c34dcb7b3b8d493185e4316bf85\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-metadata-2.8.7.jar\">\n            <sha256 value=\"4ee784530e550754230395d4f4f56817c9fcbc08db4d645e77441f3dd82c56b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime\" version=\"2.9.0\">\n         <artifact name=\"lifecycle-runtime-2.9.0.module\">\n            <sha256 value=\"f31e0464e75dc733995ba52daa7b3b14eac5946cc5cb5d873c88f13d9bda6d33\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-metadata-2.9.0.jar\">\n            <sha256 value=\"9a0044847cf568a1009bb466c65469c57f380c7203d73e0cdcd750be323230dc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-android\" version=\"2.8.1\">\n         <artifact name=\"lifecycle-runtime-android-2.8.1.module\">\n            <sha256 value=\"bdb365a1573a5d4633b015448be6d6808d643f42d4b55fc54d8d035b34079f22\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-release.aar\">\n            <sha256 value=\"386b722ee6198ac7c1f3c6cb080839cc979436ca07c4be78259aff21e912b979\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-android\" version=\"2.8.2\">\n         <artifact name=\"lifecycle-runtime-android-2.8.2.module\">\n            <sha256 value=\"ca87b1aa11ada45b66f7d8c345a5df89fd0a678412db9a1720d02b2a5ea1c77e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-release.aar\">\n            <sha256 value=\"158f313c1a177a66b31c696997ea3c16ff1673a8ac95b844fa227ad742d204d5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-android\" version=\"2.8.3\">\n         <artifact name=\"lifecycle-runtime-android-2.8.3.module\">\n            <sha256 value=\"7f881812b61b2b4ecde7a5a463a3fd8005366d45db36f14e5b539a24095379f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-release.aar\">\n            <sha256 value=\"e761ff6f4f07093558b7cd370928f31d53b46ea91441f52dd535da96d4708c2b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-android\" version=\"2.8.4\">\n         <artifact name=\"lifecycle-runtime-android-2.8.4.module\">\n            <sha256 value=\"abddca8720af0793d384b543eff85be5a35a0ea42790f607c7a8d4079ea5f717\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-release.aar\">\n            <sha256 value=\"51de43d050709a1261204b67f5554d28b76bd7f01893a55debf7ad05cd2f4b44\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-android\" version=\"2.8.5\">\n         <artifact name=\"lifecycle-runtime-android-2.8.5.module\">\n            <sha256 value=\"bb1ea56a75d8ee3853ef062464482c93bd2435e70435181471f3598fa59652df\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-release.aar\">\n            <sha256 value=\"f0650a4c3bd2d8b28a16e6cea455ee2ec6d0e28b7102b05491ee3b291dbe7147\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-android\" version=\"2.8.6\">\n         <artifact name=\"lifecycle-runtime-android-2.8.6.module\">\n            <sha256 value=\"93374d66753dde11d9735d95e58f4fbc9c577b32418ce093e4a3822007f12571\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-release.aar\">\n            <sha256 value=\"b41eebdb5b950c3122e403d898a20f4a1d2a70eb8a81f07a552205142cdcd71c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-android\" version=\"2.8.7\">\n         <artifact name=\"lifecycle-runtime-android-2.8.7.module\">\n            <sha256 value=\"4d1b3881c98d42934cb8d5de7c8a9e12049549a5147718647d7be6ca6d958c46\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-release.aar\">\n            <sha256 value=\"b8eb997dd434d70eb97cbd6d1395b6337c6771717c7acd59f11c0853f3860284\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-android\" version=\"2.9.0\">\n         <artifact name=\"lifecycle-runtime-android-2.9.0.module\">\n            <sha256 value=\"b7ed9a5cc87eec1ab1f1d230f3d5e8deee2507c98a0088d349dc3576c0572927\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-release.aar\">\n            <sha256 value=\"d4223ae6a8447677267dff22863b6d6988ca68b4d27ca6d74b81046b04794257\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-desktop\" version=\"2.8.1\">\n         <artifact name=\"lifecycle-runtime-desktop-2.8.1-sources.jar\">\n            <sha256 value=\"6c0abf455450dd51021173fb8ef37e964d8d9256db132f82937ef55d5e726fba\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-desktop-2.8.1.module\">\n            <sha256 value=\"cc08ed61614f92914191fb835edc873474aef1f40e42b9f731417fc63bf20c1d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-desktop\" version=\"2.8.2\">\n         <artifact name=\"lifecycle-runtime-desktop-2.8.2-sources.jar\">\n            <sha256 value=\"6c0abf455450dd51021173fb8ef37e964d8d9256db132f82937ef55d5e726fba\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-desktop-2.8.2.module\">\n            <sha256 value=\"cc1e0192679467ed695987646a4e645d5060803f2913a687de71c5bc1186971c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-desktop\" version=\"2.8.3\">\n         <artifact name=\"lifecycle-runtime-desktop-2.8.3.module\">\n            <sha256 value=\"2cf901b9f0e7506028c3fb9cfec859c41765f9fb0b7636265f78b092612d1f9f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-desktop\" version=\"2.8.4\">\n         <artifact name=\"lifecycle-runtime-desktop-2.8.4.module\">\n            <sha256 value=\"7c6ad914c15a7c57909f37dc849c5adc21d4893a9622e303e2c843caa8341234\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-ktx\" version=\"2.8.1\">\n         <artifact name=\"lifecycle-runtime-ktx-2.8.1.module\">\n            <sha256 value=\"ba3c03415162e1e470165b1d1254852fb286cf232e68fec54c57c410ab0810f3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-ktx-metadata-2.8.1.jar\">\n            <sha256 value=\"92e90c3bd6cc2f66a15e9597cc015cd3a2f8767a9bd29d7feadaea4d44b2fccf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-ktx\" version=\"2.8.2\">\n         <artifact name=\"lifecycle-runtime-ktx-2.8.2.module\">\n            <sha256 value=\"3c7f723b662d1433797c659f48ddcdb53f3b2073b9dc9fd748941b67038d8969\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-ktx-metadata-2.8.2.jar\">\n            <sha256 value=\"92e90c3bd6cc2f66a15e9597cc015cd3a2f8767a9bd29d7feadaea4d44b2fccf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-ktx\" version=\"2.8.3\">\n         <artifact name=\"lifecycle-runtime-ktx-2.8.3.module\">\n            <sha256 value=\"69cd3410604687fec47106580987a1ec2dc71c3d5496c19ed30fd13c0d0cdbb9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-ktx-metadata-2.8.3.jar\">\n            <sha256 value=\"92e90c3bd6cc2f66a15e9597cc015cd3a2f8767a9bd29d7feadaea4d44b2fccf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-ktx\" version=\"2.8.4\">\n         <artifact name=\"lifecycle-runtime-ktx-2.8.4.module\">\n            <sha256 value=\"f43ec1472a2d416840befe910ddc95ef770a220d7e355a98686153384884f783\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-ktx-metadata-2.8.4.jar\">\n            <sha256 value=\"92e90c3bd6cc2f66a15e9597cc015cd3a2f8767a9bd29d7feadaea4d44b2fccf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-ktx\" version=\"2.8.5\">\n         <artifact name=\"lifecycle-runtime-ktx-2.8.5.module\">\n            <sha256 value=\"559f5f7cd82d07ddbdf0201b7af6e3d7e878f3c48b3f51857c8e054d27d6645c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-ktx-metadata-2.8.5.jar\">\n            <sha256 value=\"92e90c3bd6cc2f66a15e9597cc015cd3a2f8767a9bd29d7feadaea4d44b2fccf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-ktx\" version=\"2.8.6\">\n         <artifact name=\"lifecycle-runtime-ktx-2.8.6.module\">\n            <sha256 value=\"6ec7a45efb18ee4abf05302ab538a811e46ace1118a53089f82ec35f09e1d506\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-ktx-metadata-2.8.6.jar\">\n            <sha256 value=\"92e90c3bd6cc2f66a15e9597cc015cd3a2f8767a9bd29d7feadaea4d44b2fccf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-ktx\" version=\"2.8.7\">\n         <artifact name=\"lifecycle-runtime-ktx-2.8.7.module\">\n            <sha256 value=\"09c6dcf0fee2ad69c523db6c2a343168a8d9e9d27743cf84b69c757b7fcab243\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-ktx-metadata-2.8.7.jar\">\n            <sha256 value=\"92e90c3bd6cc2f66a15e9597cc015cd3a2f8767a9bd29d7feadaea4d44b2fccf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-ktx\" version=\"2.9.0\">\n         <artifact name=\"lifecycle-runtime-ktx-2.9.0.module\">\n            <sha256 value=\"df6ba56cb9ba2f180fe2f97d6863abadf9f7dba65eaf425757e0b9b83da61479\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-ktx-metadata-2.9.0.jar\">\n            <sha256 value=\"5d74d1e9c45d538aafc48b2313e598eff9b4a13bfee9f2f3d776f5274d5cde22\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-ktx-android\" version=\"2.8.1\">\n         <artifact name=\"lifecycle-runtime-ktx-android-2.8.1.module\">\n            <sha256 value=\"68b84f501ecca9c4bb4641a54674a90be85a6643aad9cd9ad56a0ac87909e00c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-ktx-release.aar\">\n            <sha256 value=\"6dabd1976b787a472cd8a5c0ebc8d7702cc9b9599137392111d2b42d4c58924b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-ktx-android\" version=\"2.8.2\">\n         <artifact name=\"lifecycle-runtime-ktx-android-2.8.2.module\">\n            <sha256 value=\"a8878864db938c7ffe778d9296e7a7b5066954c2321a93ce33de37974098e120\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-ktx-release.aar\">\n            <sha256 value=\"cfcfaeba10fce09a5d8a1451f8d894edc60ac00552ea956ad7f561d5848ba868\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-ktx-android\" version=\"2.8.3\">\n         <artifact name=\"lifecycle-runtime-ktx-android-2.8.3.module\">\n            <sha256 value=\"96af6feb02573fd517d5b4a7d6135cae8f0e0578a822bf88b213483985283c33\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-ktx-release.aar\">\n            <sha256 value=\"d3f5d1423bc6dc0c7343a72389425be4b6ef832ef461faf1542bbc624bdb3918\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-ktx-android\" version=\"2.8.4\">\n         <artifact name=\"lifecycle-runtime-ktx-android-2.8.4.module\">\n            <sha256 value=\"795c1516de5aa243fd3fb1cd30b959bf2381b84cdd7f0a63d5713b7587238c89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-ktx-release.aar\">\n            <sha256 value=\"be3258f14ab166c7cd3bcd983ecde6cb226f9dc510e94a7d5f866252ccc16cde\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-ktx-android\" version=\"2.8.5\">\n         <artifact name=\"lifecycle-runtime-ktx-android-2.8.5.module\">\n            <sha256 value=\"fe61e23c602b251ea4b5698fc37038ec430581da13f97ddd174c355ab782d7e7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-ktx-release.aar\">\n            <sha256 value=\"e5df297f908d8bf6874c34333c07cd99702f82e138285dc1bff3a3a413b3a0f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-ktx-android\" version=\"2.8.6\">\n         <artifact name=\"lifecycle-runtime-ktx-android-2.8.6.module\">\n            <sha256 value=\"18492a5fdb6153d0942b367d93677880074282e3f05d89ba5be7ab1fddb34949\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-ktx-release.aar\">\n            <sha256 value=\"7ab4028168bc871c47dc5efca4e5415bbe919ed5b04caad3d458a487ff368873\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-ktx-android\" version=\"2.8.7\">\n         <artifact name=\"lifecycle-runtime-ktx-android-2.8.7.module\">\n            <sha256 value=\"adc61521e894f163beee3aedc8c4c0dfb5991663b88ea1ea7798fac95694e17d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-ktx-release.aar\">\n            <sha256 value=\"b3d39c5dba5e207ef4c79d491a76500194c5ea6874157f05a15f01792c0cc4e7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-runtime-ktx-android\" version=\"2.9.0\">\n         <artifact name=\"lifecycle-runtime-ktx-android-2.9.0.module\">\n            <sha256 value=\"0fe1bc94930bcae1fb7db6cc5c3576e025a36ae3187352c12d48fefe05d9d680\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-runtime-ktx.aar\">\n            <sha256 value=\"333fa2ce6db70ac372b791dfeba99c02c0d97b1a8b4ab4a84d4762466d12b207\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-service\" version=\"2.8.1\">\n         <artifact name=\"lifecycle-service-2.8.1.aar\">\n            <sha256 value=\"94e1e1ffa817ffac23bb857b51981c92fbb97f8cc2c09f795b30f5e042308417\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-service-2.8.1.module\">\n            <sha256 value=\"c2ea282d707bf148949ba505c607e285f136b730047b5cb852a998eb4317861a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-service\" version=\"2.8.2\">\n         <artifact name=\"lifecycle-service-2.8.2.aar\">\n            <sha256 value=\"aa83b5973b845ee5350c0f4358ffb137be25b71fa9f5c2cc51198fb9eb0e5201\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-service-2.8.2.module\">\n            <sha256 value=\"e7d7985bcef0c6738de2f2ba6968c06d8ebdfc06e0298fc1e2c5b3df3a0bd7c2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-service\" version=\"2.8.3\">\n         <artifact name=\"lifecycle-service-2.8.3.aar\">\n            <sha256 value=\"d41c7191f8ead311c7f7f26acccf308ba56b7cfbfebb253c43831750b19aa9c8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-service-2.8.3.module\">\n            <sha256 value=\"751a1e0bf8bd6eb40f7abd44fb4bedf439840a55ce521522886194a109bdcebd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-service\" version=\"2.8.4\">\n         <artifact name=\"lifecycle-service-2.8.4.aar\">\n            <sha256 value=\"673b7586aa5149f9669c0a15d040bdab253e2de3efb31502ca7d8d462e41fbcb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-service-2.8.4.module\">\n            <sha256 value=\"5937f2fb3cb92a4b033d4132f6a21791af166ea33b8b7babaf4131bdbae7bce0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-service\" version=\"2.8.5\">\n         <artifact name=\"lifecycle-service-2.8.5.aar\">\n            <sha256 value=\"f81f0d2aea6c1e05fbb9a8c43776f402e26bbb7add01127e830e99ccadecfefc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-service-2.8.5.module\">\n            <sha256 value=\"8ef13cbec2dafe8117cc1708701526c76d6f2f032e6cb2fa9633e4dc52303fc4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-service\" version=\"2.8.6\">\n         <artifact name=\"lifecycle-service-2.8.6.aar\">\n            <sha256 value=\"b3d34d3f26ee0b912c03941ff9ef666973784074b3a19fedd832fc09882fb280\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-service-2.8.6.module\">\n            <sha256 value=\"f05ccb64ed7dfee999c17316376f8c93a18318378663c68e4bca70119d73a512\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-service\" version=\"2.8.7\">\n         <artifact name=\"lifecycle-service-2.8.7.aar\">\n            <sha256 value=\"1450e72eea2ec808b089b96abdc773ca03a4143e267f7aadd9aeb9a7c39afef1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-service-2.8.7.module\">\n            <sha256 value=\"23ebfcab9fb782516ac14aaec2f1d38ffdece88049bcb2f11fcb35a198a389a4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-service\" version=\"2.9.0\">\n         <artifact name=\"lifecycle-service-2.9.0.aar\">\n            <sha256 value=\"c78580ca38cd14e474323861ebe822d04c04231cb7e59b24de801406a511376a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-service-2.9.0.module\">\n            <sha256 value=\"c33c8748c13aaedf4c7c006bbce38b0da96ada0a300187451cf3739541a62ad0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel\" version=\"2.6.1\">\n         <artifact name=\"lifecycle-viewmodel-2.6.1.module\">\n            <sha256 value=\"2b406faea5c12f2b8df4b7a60931f846648f2e1f4d78361e198d1184f19a4797\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel\" version=\"2.8.1\">\n         <artifact name=\"lifecycle-viewmodel-2.8.1.aar\">\n            <sha256 value=\"43d28a6c6da9c1cb72bfb5cc1b511a7937b2db8b79d52f37d0b7f14c79b090dd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-2.8.1.module\">\n            <sha256 value=\"41bc1fd7d4f6884105fa96a5b372007c002e042c39f167e3903d3520f39a0c31\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-metadata-2.8.1.jar\">\n            <sha256 value=\"dd82d174a6da88070ebbe6fc842808e797424dd8605ff1d87f8d95b5bb992c08\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel\" version=\"2.8.2\">\n         <artifact name=\"lifecycle-viewmodel-2.8.2.aar\">\n            <sha256 value=\"43d28a6c6da9c1cb72bfb5cc1b511a7937b2db8b79d52f37d0b7f14c79b090dd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-2.8.2.module\">\n            <sha256 value=\"72985daed5ac9f371b7328787d853bac6a95792461c5fae6243fa61e3d3f5608\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-metadata-2.8.2.jar\">\n            <sha256 value=\"539281344ce8a81d33570be300d86bb872c7b719a6dd2ce494eacba438fb53ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel\" version=\"2.8.3\">\n         <artifact name=\"lifecycle-viewmodel-2.8.3.aar\">\n            <sha256 value=\"43d28a6c6da9c1cb72bfb5cc1b511a7937b2db8b79d52f37d0b7f14c79b090dd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-2.8.3.module\">\n            <sha256 value=\"d1672241104db11cc5792024aaaa991555e52ad3332b46145bf01ca1bd523d42\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-metadata-2.8.3.jar\">\n            <sha256 value=\"539281344ce8a81d33570be300d86bb872c7b719a6dd2ce494eacba438fb53ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel\" version=\"2.8.4\">\n         <artifact name=\"lifecycle-viewmodel-2.8.4.aar\">\n            <sha256 value=\"43d28a6c6da9c1cb72bfb5cc1b511a7937b2db8b79d52f37d0b7f14c79b090dd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-2.8.4.module\">\n            <sha256 value=\"7f43cc151ca2f3232effaad55c60964538b989d24f0b31b6d2b7cbae69b01d8e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-metadata-2.8.4.jar\">\n            <sha256 value=\"539281344ce8a81d33570be300d86bb872c7b719a6dd2ce494eacba438fb53ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel\" version=\"2.8.5\">\n         <artifact name=\"lifecycle-viewmodel-2.8.5.aar\">\n            <sha256 value=\"43d28a6c6da9c1cb72bfb5cc1b511a7937b2db8b79d52f37d0b7f14c79b090dd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-2.8.5.module\">\n            <sha256 value=\"52312179dcbeda0c27b4ac9020576fe4105b047ff457e74b6da42245fb774573\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-metadata-2.8.5.jar\">\n            <sha256 value=\"539281344ce8a81d33570be300d86bb872c7b719a6dd2ce494eacba438fb53ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel\" version=\"2.8.6\">\n         <artifact name=\"lifecycle-viewmodel-2.8.6.aar\">\n            <sha256 value=\"43d28a6c6da9c1cb72bfb5cc1b511a7937b2db8b79d52f37d0b7f14c79b090dd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-2.8.6.module\">\n            <sha256 value=\"4ff543709e085301767ab373a5bb853246d6521dc91014702efd767c4dc7a389\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-metadata-2.8.6.jar\">\n            <sha256 value=\"539281344ce8a81d33570be300d86bb872c7b719a6dd2ce494eacba438fb53ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel\" version=\"2.8.7\">\n         <artifact name=\"lifecycle-viewmodel-2.8.7.aar\">\n            <sha256 value=\"43d28a6c6da9c1cb72bfb5cc1b511a7937b2db8b79d52f37d0b7f14c79b090dd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-2.8.7.module\">\n            <sha256 value=\"f1d821fc18036dd20cc21ffbe02f547120bf0051e06ae9e1977140213c934372\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-metadata-2.8.7.jar\">\n            <sha256 value=\"539281344ce8a81d33570be300d86bb872c7b719a6dd2ce494eacba438fb53ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel\" version=\"2.9.0\">\n         <artifact name=\"lifecycle-viewmodel-2.9.0.aar\">\n            <sha256 value=\"cab404b05d5faed209104a2aef14c0cbb316ab9fabe4a8f037b043e5d2f43435\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-2.9.0.module\">\n            <sha256 value=\"e8a90f3642f71d6db034598c77bcdfc3f76e7c5f6db2bb986962dd42c40cd888\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-metadata-2.9.0.jar\">\n            <sha256 value=\"ad36d68d8c4dadf0b04c893349647bdd3b98054a5c00425e19c885ccaea264f9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-android\" version=\"2.8.1\">\n         <artifact name=\"lifecycle-viewmodel-android-2.8.1.module\">\n            <sha256 value=\"6731dc9056a3a533c10e42560e72e8748f2fca7a93092aeb0a11b4254e93c5ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-release.aar\">\n            <sha256 value=\"c312cc454cd006e69b8f80a990c871fef60098a748bf0dcfadf079aa7d526d4f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-android\" version=\"2.8.2\">\n         <artifact name=\"lifecycle-viewmodel-android-2.8.2.module\">\n            <sha256 value=\"6ba5e376f07ef5328e884814c98a979bf3870b0aac4b39de7d981599abfdd0b9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-release.aar\">\n            <sha256 value=\"e2f55a6e22af3f44a65469ef459e855fec7a77a454a1334315a1935b18ecda64\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-android\" version=\"2.8.3\">\n         <artifact name=\"lifecycle-viewmodel-android-2.8.3.module\">\n            <sha256 value=\"7c2dac235696b9ac575e1df0014e82a78c5ca8196bcc298a52accda4c72e351d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-release.aar\">\n            <sha256 value=\"bbf54dcc300c81ea91f5667ac0b85934b2cbcaffc0806d8389df146cc2148a5c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-android\" version=\"2.8.4\">\n         <artifact name=\"lifecycle-viewmodel-android-2.8.4.module\">\n            <sha256 value=\"0d8021a84da6bf03af8eb6a57b5f913e147f6aab9aa658e2cc82fd4673b94a9e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-release.aar\">\n            <sha256 value=\"6cfb15c56ae66279884be033a686fab068deae6856e497261057ad36458a7471\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-android\" version=\"2.8.5\">\n         <artifact name=\"lifecycle-viewmodel-android-2.8.5.module\">\n            <sha256 value=\"4e835ac37390f03c2a39c5a4989830280637176b584af523637f050cd2d05508\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-release.aar\">\n            <sha256 value=\"d761efb7065206e251f094d3e733af27ba901d2d1b180354c106d01bf63dae66\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-android\" version=\"2.8.6\">\n         <artifact name=\"lifecycle-viewmodel-android-2.8.6.module\">\n            <sha256 value=\"7e9dc89413cc7485b14621db5ccf1e130668f146368b0ffe66e0f30cd2aa6502\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-release.aar\">\n            <sha256 value=\"998e56ae2638881fb9519496b998f032e32fe3afed946b60636711b32a86f365\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-android\" version=\"2.8.7\">\n         <artifact name=\"lifecycle-viewmodel-android-2.8.7.module\">\n            <sha256 value=\"b04994ce67d6999438316ff41b2ddb84613a64b8f81399ef3074895ad81065dc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-release.aar\">\n            <sha256 value=\"e7e7043f66b077637563ff564a7fc6cee461d284a0f2485c050a2143abbd8920\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-android\" version=\"2.9.0\">\n         <artifact name=\"lifecycle-viewmodel-android-2.9.0.module\">\n            <sha256 value=\"874ba10c7bb1acd9662468ac15e27fcbf2556f1c282f875c6c07ad63c8672b03\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-release.aar\">\n            <sha256 value=\"fa9d7511a8fe0d5edc53099706d64f37621dcfeb9f2c557369ed83645fc87a23\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-desktop\" version=\"2.8.1\">\n         <artifact name=\"lifecycle-viewmodel-desktop-2.8.1-sources.jar\">\n            <sha256 value=\"0d8a81b0037fcd6beaea433263dc979ddd5d43f0c04f817a27e79c14fe0e7e81\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-desktop-2.8.1.module\">\n            <sha256 value=\"3a5568017c8170526a08874202081b00b7919194d534acb48f1630d1e900b14f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-desktop\" version=\"2.8.2\">\n         <artifact name=\"lifecycle-viewmodel-desktop-2.8.2-sources.jar\">\n            <sha256 value=\"84f8224b9a8aea3c4a7dbec363e4dd59383c0b30f6f2d46d98053932cb8f002f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-desktop-2.8.2.module\">\n            <sha256 value=\"67c8b7e0d90e19aa11309667f38a1aec57fb87c8d0291b7d4772b4f01ff6e6e3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-desktop\" version=\"2.8.3\">\n         <artifact name=\"lifecycle-viewmodel-desktop-2.8.3.module\">\n            <sha256 value=\"5ebb82116600ef2dbcb57b00c9da16072183091b16c04418f1e61a4872d897a7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-desktop\" version=\"2.8.4\">\n         <artifact name=\"lifecycle-viewmodel-desktop-2.8.4.module\">\n            <sha256 value=\"835c531b38b5eb195decbeff7c2ce1e06a712699acaa13ffcb974896913e8497\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-ktx\" version=\"2.8.1\">\n         <artifact name=\"lifecycle-viewmodel-ktx-2.8.1-sources.jar\">\n            <sha256 value=\"c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-ktx-2.8.1.aar\">\n            <sha256 value=\"601d1e15c772a72d82aa35bf2654e44472851204d844f42856d6ff8c07c4e608\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-ktx-2.8.1.module\">\n            <sha256 value=\"48efc6de5e504a183abc41011fade076b0b21812fcb315cbb2fa4874634ab3a4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-ktx\" version=\"2.8.2\">\n         <artifact name=\"lifecycle-viewmodel-ktx-2.8.2-sources.jar\">\n            <sha256 value=\"c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-ktx-2.8.2.aar\">\n            <sha256 value=\"b29dbe88d03faef613125339e8767e4e851b60789ddfd2fd141190d0b815a324\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-ktx-2.8.2.module\">\n            <sha256 value=\"3831834bb6851170557081e4a26a01591d3035af52a9b948ab14763584a0cc7a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-ktx\" version=\"2.8.3\">\n         <artifact name=\"lifecycle-viewmodel-ktx-2.8.3.aar\">\n            <sha256 value=\"e17b0cd40081a86ca3adcb8b135ee82f3dd842db42072eb2901c64a2773a6d75\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-ktx-2.8.3.module\">\n            <sha256 value=\"e4a8a54c3e823d4a8140391411e6006555e1b62963e1e7544f989d5c249d7e4a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-ktx\" version=\"2.8.4\">\n         <artifact name=\"lifecycle-viewmodel-ktx-2.8.4.aar\">\n            <sha256 value=\"ded10d9bf88ce360c4af744702b8457985830f5ce0df165aaf068d0021726c4c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-ktx-2.8.4.module\">\n            <sha256 value=\"eca77d835a0f0c9daa13d2c6717cdfe79ef7c6ca7ac71e674a6536f8119fa9b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-ktx\" version=\"2.8.5\">\n         <artifact name=\"lifecycle-viewmodel-ktx-2.8.5.aar\">\n            <sha256 value=\"7dd0d5f21a1833248d0525878baacc28258ee84f5377b43f895feeeeabcad5c3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-ktx-2.8.5.module\">\n            <sha256 value=\"2a696ef19350ab88258415094b9e4ae743cb916a9d640c1906fcf76e1ca3b88b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-ktx\" version=\"2.8.6\">\n         <artifact name=\"lifecycle-viewmodel-ktx-2.8.6.aar\">\n            <sha256 value=\"55407c45b043d61e4b58f1b03912a9bf9a46d4c528a7a075e396e20eae0ed042\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-ktx-2.8.6.module\">\n            <sha256 value=\"e5c806436a8f1a06519013e3e351eb96a73767a5e3990129c71cdeb652ffe3ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-ktx\" version=\"2.8.7\">\n         <artifact name=\"lifecycle-viewmodel-ktx-2.8.7.aar\">\n            <sha256 value=\"1acebb50df2f0c07f379d5e23a28f7794f70efb2b6c834acebe8c394784ee6d4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-ktx-2.8.7.module\">\n            <sha256 value=\"a99e3d0218ee92bda8f5c1ebf25d4832b301ef5810604e2e96e4b607ebf6a7f5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-ktx\" version=\"2.9.0\">\n         <artifact name=\"lifecycle-viewmodel-ktx-2.9.0.aar\">\n            <sha256 value=\"af42fd84f4e52b44dcabaf9ecf94120553929bc1a059beb2240a9ec1dbee814f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-ktx-2.9.0.module\">\n            <sha256 value=\"3d035842bc404807aedb69d6b6a8a6bcb42ba8ec1c5417f7f57377cd014e1800\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-savedstate\" version=\"2.8.1\">\n         <artifact name=\"lifecycle-viewmodel-savedstate-2.8.1-sources.jar\">\n            <sha256 value=\"e2a94fd97d7ecc72b7716dc98995fab44be80caf426d9fdb407b2109d4f853b1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-savedstate-2.8.1.aar\">\n            <sha256 value=\"9dd54a05fabc8029fbfbbc4a6b74f946d70523e84ee246f7098669423e426708\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-savedstate-2.8.1.module\">\n            <sha256 value=\"4aebd9a7241c65dbe62e8fb0af2b25057e2f1352b188d2dc4bf76707eb291a9f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-savedstate\" version=\"2.8.2\">\n         <artifact name=\"lifecycle-viewmodel-savedstate-2.8.2-sources.jar\">\n            <sha256 value=\"e2a94fd97d7ecc72b7716dc98995fab44be80caf426d9fdb407b2109d4f853b1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-savedstate-2.8.2.aar\">\n            <sha256 value=\"2dc62627f265fa750d440c0d8589443faf04f77dce8a7efce3b390c52b0fe8dc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-savedstate-2.8.2.module\">\n            <sha256 value=\"d8ea7b73e8c300339417d1fff1e9af396c819f8bd24ad189d455158e0ce78783\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-savedstate\" version=\"2.8.3\">\n         <artifact name=\"lifecycle-viewmodel-savedstate-2.8.3.aar\">\n            <sha256 value=\"839dd12453c4e05116732831ff49f210893cc99b7091bb9a124988911c537734\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-savedstate-2.8.3.module\">\n            <sha256 value=\"30e94513464dbd0a613e79196fdce2d0dbdaa44fe58397b9db4d5794c5ba4d99\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-savedstate\" version=\"2.8.4\">\n         <artifact name=\"lifecycle-viewmodel-savedstate-2.8.4.aar\">\n            <sha256 value=\"8357a7f75f1131d0487a116df67ffc2404043b916cf57a5a8886d6e861b95461\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-savedstate-2.8.4.module\">\n            <sha256 value=\"64449cc5b478333acf81ad4e9d21b485c2585f243c6e381367eba0a20533b5d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-savedstate\" version=\"2.8.5\">\n         <artifact name=\"lifecycle-viewmodel-savedstate-2.8.5.aar\">\n            <sha256 value=\"6f72f2e4fd1e78b255ca908444f39c71e978dc3b05f4bd7198b24c659deab0ec\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-savedstate-2.8.5.module\">\n            <sha256 value=\"2563ca48f10e613a8750208dff357913ecc5e9bb9547e420023023ac6882ae18\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-savedstate\" version=\"2.8.6\">\n         <artifact name=\"lifecycle-viewmodel-savedstate-2.8.6.aar\">\n            <sha256 value=\"33b1e94623c0dcc72b51ffa0df8a626927fc16afd25d11d792b2402e06edf7a5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-savedstate-2.8.6.module\">\n            <sha256 value=\"86b3655d41bec4f2c79144448c83c6ec71c3dd601342d5fdb8d347df0c4c9e24\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-savedstate\" version=\"2.8.7\">\n         <artifact name=\"lifecycle-viewmodel-savedstate-2.8.7.aar\">\n            <sha256 value=\"646f2a42d2884b02308fb19837089e2669835fe21ca6a5b60666d5eb94d081dd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-savedstate-2.8.7.module\">\n            <sha256 value=\"bab22c067f25577a6ac334e8682414818073e9f445038d19039c90f8716fbf6d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-savedstate\" version=\"2.9.0\">\n         <artifact name=\"lifecycle-viewmodel-savedstate-2.9.0.aar\">\n            <sha256 value=\"ae70b02386c0733b193644c58a42608ad3e4f8e7731eda859f7888405b5f36b9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-savedstate-2.9.0.module\">\n            <sha256 value=\"9e724daa2045fde8c2aacb0ba18a61a106c82c3c183210915b9f7eb328720ef1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-savedstate-metadata-2.9.0.jar\">\n            <sha256 value=\"a2dd6c663110202b15a31fa5a2b82479bb40725c48047f6b03fc497268555796\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.lifecycle\" name=\"lifecycle-viewmodel-savedstate-android\" version=\"2.9.0\">\n         <artifact name=\"lifecycle-viewmodel-savedstate-android-2.9.0.module\">\n            <sha256 value=\"42783d40d49423ca9f51c1a826f4c47371856854c8ad32ee2e9a168d0c61bb43\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lifecycle-viewmodel-savedstate-release.aar\">\n            <sha256 value=\"db367838716e55866823c6deed62fcec23fce487bf2a8fa565a36f149ab3d1ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.loader\" name=\"loader\" version=\"1.0.0\">\n         <artifact name=\"loader-1.0.0.aar\">\n            <sha256 value=\"11f735cb3b55c458d470bed9e25254375b518b4b1bad6926783a7026db0f5025\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"loader-1.0.0.pom\">\n            <sha256 value=\"c978d550808b47434aa49a63164110a50b55b0bcc6160a93a2e37d5110df8c5e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.localbroadcastmanager\" name=\"localbroadcastmanager\" version=\"1.0.0\">\n         <artifact name=\"localbroadcastmanager-1.0.0.aar\">\n            <sha256 value=\"e71c328ceef5c4a7d76f2d86df1b65d65fe2acf868b1a4efd84a3f34336186d8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"localbroadcastmanager-1.0.0.pom\">\n            <sha256 value=\"a000041f5a1f79283c5175e1bb60cf3683780f401c6a9d34fbe9751253fa6ff9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media\" name=\"media\" version=\"1.7.0\">\n         <artifact name=\"media-1.7.0.aar\">\n            <sha256 value=\"81a199ee87c6d3d59fb35f7dbec71b3f1d507128611099b6ac3a4b1c5a0bf1f9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media-1.7.0.module\">\n            <sha256 value=\"996f646284a2d981899cdac3282249e0e1f20ab82838a0875dc66bd264d24961\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-common\" version=\"1.3.1\">\n         <artifact name=\"media3-common-1.3.1.aar\">\n            <sha256 value=\"40cf8c6c07f75afd0b213d694fd7ac478c726a94e64fa7ac1833c17752f3e6f4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-common-1.3.1.module\">\n            <sha256 value=\"e03c4fa9d04188ffd7ca74ab2f8a2a0560afd24e151914c0af112c26d0e231af\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-common\" version=\"1.4.0\">\n         <artifact name=\"media3-common-1.4.0.aar\">\n            <sha256 value=\"82f09c4025bcdbe3c461eac52fdc145c39dfeb18147694a1e4301533259669ae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-common-1.4.0.module\">\n            <sha256 value=\"edd2208617351d8d0c853e5c040b81e7685f3918c856f20503f266c4f7cd6248\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-common\" version=\"1.4.1\">\n         <artifact name=\"media3-common-1.4.1.aar\">\n            <sha256 value=\"973e5e7b0ecf8e6c8cd825cab35145b84c56020af7c3ec52815e595ef71baa16\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-common-1.4.1.module\">\n            <sha256 value=\"ed4a5a918d5febf5c36f8f8bf86ed41ebd51c633f7f6e366a17daa0faab4a587\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-common\" version=\"1.5.1\">\n         <artifact name=\"media3-common-1.5.1.aar\">\n            <sha256 value=\"ee69fc48b9ea9c5e1381cbf89bcab96e254fd7bd1f31891642bb4e1c1f6c6fd7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-common-1.5.1.module\">\n            <sha256 value=\"c01afb3a57e3d171e41d98d71220ef9cbb7a508118a189d0c79e55c6337fb796\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-common\" version=\"1.6.0\">\n         <artifact name=\"media3-common-1.6.0.aar\">\n            <sha256 value=\"9b43a849309032353a29d85a8cde31cdff930c1c7539408c1a01f27c06e5d370\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-common-1.6.0.module\">\n            <sha256 value=\"4eb12ade6b8cc373a04f94d40ad967033d731b03ef2bca4ca7dbfdea1a67b8a2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-common\" version=\"1.6.1\">\n         <artifact name=\"media3-common-1.6.1.aar\">\n            <sha256 value=\"e92ea840d61c60154c28a8ec7003dbd569cd0e570792085bd175125728dccdaf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-common-1.6.1.module\">\n            <sha256 value=\"b699208200b5a6fe8a9d72ef87dfaef835ee8bb021d1f19d2bc76da428af59d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-container\" version=\"1.3.1\">\n         <artifact name=\"media3-container-1.3.1.aar\">\n            <sha256 value=\"c6103c11666e03ceabeb6454b5bf0b9b51fdc93647f84dd02ee869a9c086269e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-container-1.3.1.module\">\n            <sha256 value=\"1d3b35b97c19501ba3e0c0001511bef9526fc18d52f241471578922c99ee7f95\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-container\" version=\"1.4.0\">\n         <artifact name=\"media3-container-1.4.0.aar\">\n            <sha256 value=\"65b6d22c96dfb5ce76754b08f5b004ee0dbdbe60793c5eab9f95c1f54f95f4b0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-container-1.4.0.module\">\n            <sha256 value=\"a42c91b5411f9660a851c96f0a4eab7b9fb1d402a8280e2bfa48f4f26845458b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-container\" version=\"1.4.1\">\n         <artifact name=\"media3-container-1.4.1.aar\">\n            <sha256 value=\"65b6d22c96dfb5ce76754b08f5b004ee0dbdbe60793c5eab9f95c1f54f95f4b0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-container-1.4.1.module\">\n            <sha256 value=\"333a0fa420c00ef66bbbbdc8ec6cb24bcb85cf8b1d0c730aeb8dfce3bb5615fa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-container\" version=\"1.5.1\">\n         <artifact name=\"media3-container-1.5.1.aar\">\n            <sha256 value=\"b163c43acbb47244b3ffedc5f216f349cfc8ca9585d3b73b7f32b7228fd63dff\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-container-1.5.1.module\">\n            <sha256 value=\"369c92fe1ec4d80aa3bd9cbec4fe6757cc4bea24b3a4cddea328ad9629c56d5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-container\" version=\"1.6.0\">\n         <artifact name=\"media3-container-1.6.0.aar\">\n            <sha256 value=\"d49793f33066f75f900278c439d8393b335ac5e70d03b48f114ad19c6f9baff4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-container-1.6.0.module\">\n            <sha256 value=\"ac3cd2d0aa1e532e16a30413b5af80b32d359d989b5303774c43944e3b7f9e06\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-container\" version=\"1.6.1\">\n         <artifact name=\"media3-container-1.6.1.aar\">\n            <sha256 value=\"6b0b1e38875c2f2ac4efb3dcc02bb03bd031f4fe6763b624a4db66ac34338b36\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-container-1.6.1.module\">\n            <sha256 value=\"40c81d73d1337dcc7b7db7a7529a29c82dce5b68eaddf5321d486a08131e6445\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-database\" version=\"1.3.1\">\n         <artifact name=\"media3-database-1.3.1.aar\">\n            <sha256 value=\"8386d2c445d194268d4af2d63abb31b028da5f742fc38c6365bc2c40ab641383\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-database-1.3.1.module\">\n            <sha256 value=\"51df60a97ed7dcd7d35ecb174659bc0a9ee13ed9c15f239c888be28183f1e874\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-database\" version=\"1.4.0\">\n         <artifact name=\"media3-database-1.4.0.aar\">\n            <sha256 value=\"2170ae6448cd499fc570dafa81e5687ad813995b7c2b7ff6801acaaa9a88bb4a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-database-1.4.0.module\">\n            <sha256 value=\"c269666a693c4e701e5d68e70e21de83e804cd1f8ad4216393ec7162b4130667\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-database\" version=\"1.4.1\">\n         <artifact name=\"media3-database-1.4.1.aar\">\n            <sha256 value=\"2170ae6448cd499fc570dafa81e5687ad813995b7c2b7ff6801acaaa9a88bb4a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-database-1.4.1.module\">\n            <sha256 value=\"405dceb759e14d60667f536011c7c2ad43c39b63fa54939b68719f991c5f738f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-database\" version=\"1.5.1\">\n         <artifact name=\"media3-database-1.5.1.aar\">\n            <sha256 value=\"13bf4ccce6bc9e8ef8e04a62e90fa6c1589b89bee8633f0db9f61ae2c23f6ef6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-database-1.5.1.module\">\n            <sha256 value=\"21239585d06e7c673002e3da85ab6358ce427d64f8ab4253c932d2f4fbddb065\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-database\" version=\"1.6.0\">\n         <artifact name=\"media3-database-1.6.0.aar\">\n            <sha256 value=\"13bf4ccce6bc9e8ef8e04a62e90fa6c1589b89bee8633f0db9f61ae2c23f6ef6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-database-1.6.0.module\">\n            <sha256 value=\"205c8a758168fb77bf702a68938626fce4bce2bc9452c9b25079ffb9e3a2eba6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-database\" version=\"1.6.1\">\n         <artifact name=\"media3-database-1.6.1.aar\">\n            <sha256 value=\"13bf4ccce6bc9e8ef8e04a62e90fa6c1589b89bee8633f0db9f61ae2c23f6ef6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-database-1.6.1.module\">\n            <sha256 value=\"78994a4300bf47ca8214c80aeb698009cbb3b56edbd198228aa61c8bd599130a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-datasource\" version=\"1.3.1\">\n         <artifact name=\"media3-datasource-1.3.1.aar\">\n            <sha256 value=\"ad94437e3c3dc5b9fb4a5c2dc64aa912a91125519742ec2fc3ae9ebfacc62381\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-datasource-1.3.1.module\">\n            <sha256 value=\"5c33611613f1f65d0e05ca01fb989f3af7be992cd8daef61ef528b5e6243d75f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-datasource\" version=\"1.4.0\">\n         <artifact name=\"media3-datasource-1.4.0.aar\">\n            <sha256 value=\"1c0bb41ee88a6bfaf24720bbfe2d29a033abad21c30e0921efbdce6c1fa28842\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-datasource-1.4.0.module\">\n            <sha256 value=\"7821d1ff0fa35f567b37b184c63e3e0f453abf8b59cb757d3457a8b1e0ef2341\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-datasource\" version=\"1.4.1\">\n         <artifact name=\"media3-datasource-1.4.1.aar\">\n            <sha256 value=\"1c0bb41ee88a6bfaf24720bbfe2d29a033abad21c30e0921efbdce6c1fa28842\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-datasource-1.4.1.module\">\n            <sha256 value=\"52e072c78f2eb1d51b1b7a7de32282722362f1be05f4bd79f6b301f794e60899\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-datasource\" version=\"1.5.1\">\n         <artifact name=\"media3-datasource-1.5.1.aar\">\n            <sha256 value=\"b86cfb137a94bf471d6b2802415edd4fe66038dab6986682133786ca7dd43de2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-datasource-1.5.1.module\">\n            <sha256 value=\"a94825f509e053042c918b7e1b4b7752f5bafaf9ba2968c4c3350b6222c5af64\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-datasource\" version=\"1.6.0\">\n         <artifact name=\"media3-datasource-1.6.0.aar\">\n            <sha256 value=\"440195cd5ebca949f5e9a6a67341471a9b376ea8cccb95d990f126d462390603\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-datasource-1.6.0.module\">\n            <sha256 value=\"77cc1ca26e677ab5db7beeb757ce99a35db937982f50f53774c0c83c8cd17e94\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-datasource\" version=\"1.6.1\">\n         <artifact name=\"media3-datasource-1.6.1.aar\">\n            <sha256 value=\"440195cd5ebca949f5e9a6a67341471a9b376ea8cccb95d990f126d462390603\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-datasource-1.6.1.module\">\n            <sha256 value=\"8e22c73520f56c957af89a118543a17daab650c657919584f306b4497bcd37b1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-datasource-okhttp\" version=\"1.3.1\">\n         <artifact name=\"media3-datasource-okhttp-1.3.1-sources.jar\">\n            <sha256 value=\"35c112f4e1c6c02d13e4f714c14971fb59c236cad507ff7f4f5a879c993144f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-datasource-okhttp-1.3.1.aar\">\n            <sha256 value=\"f4a578fd98dffdc2b4578421378ee4a61700ee250721595beb549ebbdb530d8f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-datasource-okhttp-1.3.1.module\">\n            <sha256 value=\"5f566d63cc73d2f6d25d353339440e553e7a62b957c58efa5a8edecb48d382f6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-datasource-okhttp\" version=\"1.4.0\">\n         <artifact name=\"media3-datasource-okhttp-1.4.0.aar\">\n            <sha256 value=\"a1fefe3ac8b55086119eafe5631ffdaad492fce559a04f08c5915efcae5233fa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-datasource-okhttp-1.4.0.module\">\n            <sha256 value=\"128931bded89b902332374b252a24d681d68a09e6716b59f60fa0371a64fd8c6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-datasource-okhttp\" version=\"1.4.1\">\n         <artifact name=\"media3-datasource-okhttp-1.4.1.aar\">\n            <sha256 value=\"a1fefe3ac8b55086119eafe5631ffdaad492fce559a04f08c5915efcae5233fa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-datasource-okhttp-1.4.1.module\">\n            <sha256 value=\"4bde6bba18cd131e3027289e92de1ae22597b7d88b77ac831cc73cdcc2717e36\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-datasource-okhttp\" version=\"1.5.1\">\n         <artifact name=\"media3-datasource-okhttp-1.5.1.aar\">\n            <sha256 value=\"f778c8943d5e9fbc1bd271339a9ed7b2e8708e18b160e7cabd8f979c4e5d32bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-datasource-okhttp-1.5.1.module\">\n            <sha256 value=\"39f2c03eb7a0832872676e6d6cd0339a0118452528eefcef2d727cee9d6194f8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-datasource-okhttp\" version=\"1.6.0\">\n         <artifact name=\"media3-datasource-okhttp-1.6.0.aar\">\n            <sha256 value=\"75e3bf2517bcf0fc7a3b35a8b8bbaa6d91620fb3afa263bd0127846268f2b54f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-datasource-okhttp-1.6.0.module\">\n            <sha256 value=\"65b624811fc6ba151bfd5ed6ab4a57156e93d87eaa292e6ce6b69aea92e55df4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-datasource-okhttp\" version=\"1.6.1\">\n         <artifact name=\"media3-datasource-okhttp-1.6.1.aar\">\n            <sha256 value=\"75e3bf2517bcf0fc7a3b35a8b8bbaa6d91620fb3afa263bd0127846268f2b54f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-datasource-okhttp-1.6.1.module\">\n            <sha256 value=\"2f7baeededb31a6342161b262d2ecb6ef55b54c63a8f7251dc80df39eabf739e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-decoder\" version=\"1.3.1\">\n         <artifact name=\"media3-decoder-1.3.1.aar\">\n            <sha256 value=\"c4799cd411061a654ad9c73fbc3d1a95945fce40f1bbceaf219e17b8a56fa1c1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-decoder-1.3.1.module\">\n            <sha256 value=\"a9e432a7cd0722dfbf1f9d3dcf180103bf518826de12300825a391dc3c086442\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-decoder\" version=\"1.4.0\">\n         <artifact name=\"media3-decoder-1.4.0.aar\">\n            <sha256 value=\"f7d97c5a39dca3c3c21bc8a70145d931d8633ed0dae89198c370e7b7e3c3f183\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-decoder-1.4.0.module\">\n            <sha256 value=\"67bd2cb72f094944ba1fe38db95ce7f87c8cee0ee2588a8e564297fabe20bdce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-decoder\" version=\"1.4.1\">\n         <artifact name=\"media3-decoder-1.4.1.aar\">\n            <sha256 value=\"f7d97c5a39dca3c3c21bc8a70145d931d8633ed0dae89198c370e7b7e3c3f183\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-decoder-1.4.1.module\">\n            <sha256 value=\"c8a5ffe14418ce0ef005521c37bc9810a2bb01c2e5bd66874553788d14262512\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-decoder\" version=\"1.5.1\">\n         <artifact name=\"media3-decoder-1.5.1.aar\">\n            <sha256 value=\"6cd78cad4c1ef8aa16876fcd923eefc3894b538960798698a891cc7f419b8b34\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-decoder-1.5.1.module\">\n            <sha256 value=\"fc9f6c7dde342308ec395d3db7c517fb089c22978e0465f1eb870ee0570ee88f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-decoder\" version=\"1.6.0\">\n         <artifact name=\"media3-decoder-1.6.0.aar\">\n            <sha256 value=\"c4bbb24cd4b73ec2f03b748f57d843fae619fb28be8b689a407532a7477c26bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-decoder-1.6.0.module\">\n            <sha256 value=\"84470f7331ff2e9e2bcc897cdded6c6407a862e470dbc77c9f7985572e02f1e5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-decoder\" version=\"1.6.1\">\n         <artifact name=\"media3-decoder-1.6.1.aar\">\n            <sha256 value=\"c4bbb24cd4b73ec2f03b748f57d843fae619fb28be8b689a407532a7477c26bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-decoder-1.6.1.module\">\n            <sha256 value=\"68459b29a91ea9cce63af1c4906f04f1f8493ea4a08624c7ff96544f18255fef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-exoplayer\" version=\"1.3.1\">\n         <artifact name=\"media3-exoplayer-1.3.1-sources.jar\">\n            <sha256 value=\"c30282058a61aa6934ca6b2eaeb47383e233622fbda98977a8893c914f2d5907\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-exoplayer-1.3.1.aar\">\n            <sha256 value=\"00c4be0107fcb95ce62d5f255e0e07b169f25bfcda820054888e26a89bf0647f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-exoplayer-1.3.1.module\">\n            <sha256 value=\"048ba3612f9a1c88de968b27e345faaf831c71d77c7dcc1abc840cc9ac6fda76\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-exoplayer\" version=\"1.4.0\">\n         <artifact name=\"media3-exoplayer-1.4.0.aar\">\n            <sha256 value=\"8740011806c480923c7cd05d9a403cbddbbeaff60a70edf2f4219e09c61473b6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-exoplayer-1.4.0.module\">\n            <sha256 value=\"04ebdbc3774aaa8937581068741a527340a050f9da06c2d25105537a4070694a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-exoplayer\" version=\"1.4.1\">\n         <artifact name=\"media3-exoplayer-1.4.1.aar\">\n            <sha256 value=\"66cd0f99209191660823d32c8fc329e383a8a7ff33e0d676632387361abcba70\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-exoplayer-1.4.1.module\">\n            <sha256 value=\"4e153240eae009f97ef4e8aec012443a3ae792545c5354e51b1d232c97f2daae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-exoplayer\" version=\"1.5.1\">\n         <artifact name=\"media3-exoplayer-1.5.1.aar\">\n            <sha256 value=\"11bb9687acd2c0bdd0a99a32006c8ac632ac138ffd996ae7293f375514721b51\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-exoplayer-1.5.1.module\">\n            <sha256 value=\"d7b09ec60b5eee17041c7b7cd7233e6964db598ec73ae2037661691454430a75\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-exoplayer\" version=\"1.6.0\">\n         <artifact name=\"media3-exoplayer-1.6.0.aar\">\n            <sha256 value=\"35780e377e51a058717a2fcb5cedbc9dfa48c82278c6750fb0e55ea6a3eaea97\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-exoplayer-1.6.0.module\">\n            <sha256 value=\"cc94d825418f48becf383abf3bcaf8f1cb93a45b59fc491e0db32b2d84106983\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-exoplayer\" version=\"1.6.1\">\n         <artifact name=\"media3-exoplayer-1.6.1.aar\">\n            <sha256 value=\"5310778771e37b0c26b418de72e1cd04f676125b82db22fb6054343277cf4263\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-exoplayer-1.6.1.module\">\n            <sha256 value=\"3bc7d41ed16e6c87702fdfdcad86cb178a4cb70de4e80ffbb0a8eaf1d4d444da\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-extractor\" version=\"1.3.1\">\n         <artifact name=\"media3-extractor-1.3.1.aar\">\n            <sha256 value=\"54400e411960da947d85567bbce3e752fade6bcb7d075c122a4e2cd05379dc62\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-extractor-1.3.1.module\">\n            <sha256 value=\"1bc5f81099da08e99871eca3f2f2266806ef84a32499aeceb1dd6f8c80232329\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-extractor\" version=\"1.4.0\">\n         <artifact name=\"media3-extractor-1.4.0.aar\">\n            <sha256 value=\"113bdbb671ed8c47d922acc5f0a8f21931a2129eded95797c2e2f0e6f346ffa6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-extractor-1.4.0.module\">\n            <sha256 value=\"3670ba201f837bdce5ffaf4adc766a0d21cfd08db74efed5657513544c054eba\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-extractor\" version=\"1.4.1\">\n         <artifact name=\"media3-extractor-1.4.1.aar\">\n            <sha256 value=\"1f51e4633e1e6137f0a4b80552afc399e269208b700352f96543d4513be6bf28\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-extractor-1.4.1.module\">\n            <sha256 value=\"cac1d03702f3835342287bd40f47d80bd08d8cdbaf2d472df3fdc2e5f2138bc4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-extractor\" version=\"1.5.1\">\n         <artifact name=\"media3-extractor-1.5.1.aar\">\n            <sha256 value=\"f2a146209e040409ed2cea3daa74932011c3b4ac451427f1738569821b21d084\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-extractor-1.5.1.module\">\n            <sha256 value=\"86b2a4e43762808d57f331c25b5f7967bc7fab3cffe580563108f9149afd3d9b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-extractor\" version=\"1.6.0\">\n         <artifact name=\"media3-extractor-1.6.0.aar\">\n            <sha256 value=\"30fb6eac9e88e7988da46b2f758f4d3782958bd9a87b177c5a2245244dfb9c2d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-extractor-1.6.0.module\">\n            <sha256 value=\"de6cfa096ddb5641437799a9bb9c2be6ed42459f88b42c44d920891f2695ffd7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-extractor\" version=\"1.6.1\">\n         <artifact name=\"media3-extractor-1.6.1.aar\">\n            <sha256 value=\"eb882e90cfb0f3435fbbefafc69faff164dcf11b4c353d776443add90ac258b8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-extractor-1.6.1.module\">\n            <sha256 value=\"6fb55edb5e17ddddd28579d062fb15f2e5c280fdbe289ee5e3824e5cf6740f4c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-ui\" version=\"1.3.1\">\n         <artifact name=\"media3-ui-1.3.1-sources.jar\">\n            <sha256 value=\"c3d8d9a0c76996f07e9978e9e1176e344783b93ab3967d9c8b23ea414171a747\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-ui-1.3.1.aar\">\n            <sha256 value=\"a8d206f395838a06b82b0789e7200868dabb26b9c7207e98cc3b3196041c1c9d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-ui-1.3.1.module\">\n            <sha256 value=\"043282ebb04a9d29ce8777bebb4e3ff3b59b257f343348ee9a54b6456688eb0f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-ui\" version=\"1.4.0\">\n         <artifact name=\"media3-ui-1.4.0.aar\">\n            <sha256 value=\"4f1e2673d7cde52ee43ed613ba5aab55d11f1a709141bd280128f9f72f5c6a37\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-ui-1.4.0.module\">\n            <sha256 value=\"ec1f4eb5ac1199de7bb93b373e67d69c24d40e6f495b536af2d08fb88e5c8813\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-ui\" version=\"1.4.1\">\n         <artifact name=\"media3-ui-1.4.1.aar\">\n            <sha256 value=\"ea604f1a88fe691b1d4dab8ae3a3de110729341629dd69311ee83611e32c97b2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-ui-1.4.1.module\">\n            <sha256 value=\"4287c7a4a885b77f332dff61e1d0c81754dcd6be3918f0cbc1a7bb46ba9c1ede\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-ui\" version=\"1.5.1\">\n         <artifact name=\"media3-ui-1.5.1.aar\">\n            <sha256 value=\"01caff80faaf5cbc4304d70f971a41004865228b0e31188a34b9bd219bb1cdd8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-ui-1.5.1.module\">\n            <sha256 value=\"67d598c80cd09c09919ad6822af8d285b5bdcaafc5f92656d729e6b8a35e0ee6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-ui\" version=\"1.6.0\">\n         <artifact name=\"media3-ui-1.6.0.aar\">\n            <sha256 value=\"f8fb9f6b470fc0583a08b8e5b7e7be461bfc4dfef7dac5689a5148153f121885\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-ui-1.6.0.module\">\n            <sha256 value=\"387c37653d3d27e0b23bb3e7fd2270609b373141987bb528c0081ade97b0977b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.media3\" name=\"media3-ui\" version=\"1.6.1\">\n         <artifact name=\"media3-ui-1.6.1.aar\">\n            <sha256 value=\"f8fb9f6b470fc0583a08b8e5b7e7be461bfc4dfef7dac5689a5148153f121885\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"media3-ui-1.6.1.module\">\n            <sha256 value=\"f28c68380120bd86eadf77f7aad73da9d46f31d5ec7502cce55e0f798720bf0c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.multidex\" name=\"multidex\" version=\"2.0.1\">\n         <artifact name=\"multidex-2.0.1.aar\">\n            <sha256 value=\"42dd32ff9f97f85771b82a20003a8d70f68ab7b4ba328964312ce0732693db09\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"multidex-2.0.1.pom\">\n            <sha256 value=\"0f10b63cfd5292d16678077bdb78363447b832801936c401fc26e68293f2106f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-common\" version=\"3.3.0\">\n         <artifact name=\"paging-common-3.3.0.module\">\n            <sha256 value=\"43c88ded7e80da969b5546af45cb6d6b8cf4332c8c1bb3a2c203244a4f2c5c94\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-common-metadata-3.3.0.jar\">\n            <sha256 value=\"3a00bde031ca057829a9e5c1722322a7660379033498f2a1ec837f33506f7e2b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-common\" version=\"3.3.1\">\n         <artifact name=\"paging-common-3.3.1.module\">\n            <sha256 value=\"f1e7ab6593b27f8375e3024cfe090304ecde3c9f609ad7b54cec5c3cf52405a6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-common-metadata-3.3.1.jar\">\n            <sha256 value=\"9ea88a0001d572dec835f241f6c02aba008df49abbd7e704080e066350f378bb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-common\" version=\"3.3.2\">\n         <artifact name=\"paging-common-3.3.2.module\">\n            <sha256 value=\"f6f83465fc83bd6827f2f48b04f812384debb34884e3b1ec0080f19319aade3e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-common-metadata-3.3.2.jar\">\n            <sha256 value=\"2d7c273707ac2e40b439dfeaa545cc620a9e93fafcea7335bb53a7000eef6363\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-common\" version=\"3.3.4\">\n         <artifact name=\"paging-common-3.3.4.module\">\n            <sha256 value=\"50561908aa56a4f4ca4d6157aff0b8eb97a1f15bd19c8d959a891c082bcc2c4d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-common-metadata-3.3.4.jar\">\n            <sha256 value=\"2d7c273707ac2e40b439dfeaa545cc620a9e93fafcea7335bb53a7000eef6363\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-common\" version=\"3.3.5\">\n         <artifact name=\"paging-common-3.3.5.module\">\n            <sha256 value=\"408b2e24e46ca8edc916c71d79d61a2a2f7516f5112470a65824841d16edebcf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-common-metadata-3.3.5.jar\">\n            <sha256 value=\"2d7c273707ac2e40b439dfeaa545cc620a9e93fafcea7335bb53a7000eef6363\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-common\" version=\"3.3.6\">\n         <artifact name=\"paging-common-3.3.6.module\">\n            <sha256 value=\"95a30f2e54a12fce51e9f2f30cc111fab6b216e041dbd8c26d86629c18b57c76\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-common-metadata-3.3.6.jar\">\n            <sha256 value=\"a8099c7437bbf96bf5f4331dd425db9755b3d1818bdfa8eec07421430b7305f5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-common-android\" version=\"3.3.0\">\n         <artifact name=\"paging-common-android-3.3.0.module\">\n            <sha256 value=\"4a8ade98fe4a5bebc6ae4f54ebae9bc744d27e4b010893e651821a375aa6014d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-common-release.aar\">\n            <sha256 value=\"7c536689141a77b2c1611b549380acbe1a7b8a9571f3335a215f29ccf5e9b8ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-common-android\" version=\"3.3.1\">\n         <artifact name=\"paging-common-android-3.3.1.module\">\n            <sha256 value=\"c0b7ffd5df5d517345363228e69d77e93f7e60df5d974021886414b9b4cd1ad4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-common-release.aar\">\n            <sha256 value=\"a30e2342d1a6fe32cb058971326839da9879364800444b958e23e8d8ca214752\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-common-android\" version=\"3.3.2\">\n         <artifact name=\"paging-common-android-3.3.2.module\">\n            <sha256 value=\"7a4cc83ebbfce37155cbd9adae4a9d89c2642c849db285d74b40ad3659121d77\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-common-release.aar\">\n            <sha256 value=\"8d76f10f6184cb99112e07e5014ede03ac90b9cec366a6e10ef8de1ca984648a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-common-android\" version=\"3.3.4\">\n         <artifact name=\"paging-common-android-3.3.4.module\">\n            <sha256 value=\"0960bfac36ef24d42c1f49e61dfabb7f138ac9c658fa6b31621d0a7c9f3b8b1a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-common-release.aar\">\n            <sha256 value=\"018d0d1c9f0a97bbb56254075aeb2ab88149c2a9b9709fa3bcd95769f51dfeca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-common-android\" version=\"3.3.5\">\n         <artifact name=\"paging-common-android-3.3.5.module\">\n            <sha256 value=\"96e9b76a90f4097e19b9852146584d86a1768ede15047a282bbd970d7f34f211\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-common-release.aar\">\n            <sha256 value=\"977a7849d4d0b8a62d339025522b1d290d664806b6bb1c316ba65f208c6028b4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-common-android\" version=\"3.3.6\">\n         <artifact name=\"paging-common-android-3.3.6.module\">\n            <sha256 value=\"74889cfb53fac9c09e4af751201ca17e01ca229b51db87f109be1f36efd6585c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-common-release.aar\">\n            <sha256 value=\"792a0dd40a6d0c51f4935482d8aeb740136b80e60ae15cda7db2a24d37b669ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-common-ktx\" version=\"3.3.0\">\n         <artifact name=\"paging-common-ktx-3.3.0.jar\">\n            <sha256 value=\"c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-common-ktx-3.3.0.module\">\n            <sha256 value=\"55fce6187b33470c5500f2d2a943e467e65636e176f1dccebca04757ebd01358\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-common-ktx\" version=\"3.3.1\">\n         <artifact name=\"paging-common-ktx-3.3.1.jar\">\n            <sha256 value=\"c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-common-ktx-3.3.1.module\">\n            <sha256 value=\"8a00072d4994c3176510520675b252a298d7e55229aabe7db7f60abeccdaf375\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-common-ktx\" version=\"3.3.2\">\n         <artifact name=\"paging-common-ktx-3.3.2.jar\">\n            <sha256 value=\"c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-common-ktx-3.3.2.module\">\n            <sha256 value=\"4cb92f624ce57639a599597cfb9f2a12708263e4fb3c5c2fb0b79f3c93807b5c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-common-ktx\" version=\"3.3.4\">\n         <artifact name=\"paging-common-ktx-3.3.4.jar\">\n            <sha256 value=\"c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-common-ktx-3.3.4.module\">\n            <sha256 value=\"ce9ad6f6543254af88ef4dc871d86ce2166ed8d12a4dd640b66f08c63d7aedc3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-common-ktx\" version=\"3.3.5\">\n         <artifact name=\"paging-common-ktx-3.3.5.jar\">\n            <sha256 value=\"c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-common-ktx-3.3.5.module\">\n            <sha256 value=\"93df1798ddaba7b1b97035366939a5fc64677820223e4e8087775011c48e67a0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-common-ktx\" version=\"3.3.6\">\n         <artifact name=\"paging-common-ktx-3.3.6.jar\">\n            <sha256 value=\"c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-common-ktx-3.3.6.module\">\n            <sha256 value=\"5f2f50230e47bad2f07e216306fa8c697bb3238be929b362af8bb6ecc975acb6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-runtime\" version=\"3.3.0\">\n         <artifact name=\"paging-runtime-3.3.0.aar\">\n            <sha256 value=\"1f7d21f225e7a549224f54f23900d90e9b7e0594bf503a45b531b70f5f2dd257\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-runtime-3.3.0.module\">\n            <sha256 value=\"2a6df791d38dce5caeabb93c179e93e0f01f7e6358bb10efe390107d4192a786\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-runtime\" version=\"3.3.1\">\n         <artifact name=\"paging-runtime-3.3.1.aar\">\n            <sha256 value=\"2374c4855b29c842fbc336cee54b908396d50b9564353cb6b9b7cd8d482a5604\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-runtime-3.3.1.module\">\n            <sha256 value=\"cf424a3deec5d77dbfda39ed91f3674cedb31355bf2a3386ab520610756c995b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-runtime\" version=\"3.3.2\">\n         <artifact name=\"paging-runtime-3.3.2.aar\">\n            <sha256 value=\"4f316303fd1d1a31647417d2f20bb9b58550b7d3e7a6d6011b46bafc33c5b211\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-runtime-3.3.2.module\">\n            <sha256 value=\"6246c60020a30e253afc90e1d116f6358fac2723b96673d49613ebf410a86a6f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-runtime\" version=\"3.3.4\">\n         <artifact name=\"paging-runtime-3.3.4.aar\">\n            <sha256 value=\"82619dea596b2c377622b2a58a76470f7867546a6e9ea803e38526243322ab96\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-runtime-3.3.4.module\">\n            <sha256 value=\"a345d6671499734d6658e57b7c513ce63ed67a7a3503e04ee2efbd8de6615b45\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-runtime\" version=\"3.3.5\">\n         <artifact name=\"paging-runtime-3.3.5.aar\">\n            <sha256 value=\"4cb03d901314ec93b1be1779938208a959c8fe03aa4589aeb9472fc84cdd3476\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-runtime-3.3.5.module\">\n            <sha256 value=\"f667489006bac1859ac8c86a44e6c6bae42674697f85a45b19009a89c96754e1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-runtime\" version=\"3.3.6\">\n         <artifact name=\"paging-runtime-3.3.6.aar\">\n            <sha256 value=\"1f7c0dbf894f8623ad0716c45964340dd1913f3321958b1fc1a06b12bacee271\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-runtime-3.3.6.module\">\n            <sha256 value=\"7456ed4d2fbcf5b18a0a302ce2b6023300d3c81b835b8ed90cef447df19838ff\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-runtime-ktx\" version=\"3.3.0\">\n         <artifact name=\"paging-runtime-ktx-3.3.0-sources.jar\">\n            <sha256 value=\"c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-runtime-ktx-3.3.0.aar\">\n            <sha256 value=\"1c6fd2223f829478305e00a2edd9355966173bd2796e80914edb8ac7a21c6877\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-runtime-ktx-3.3.0.module\">\n            <sha256 value=\"f8cdcbe7028da4e38612c170afdea27a563ad62e7346ae947078fd9e72847f3d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-runtime-ktx\" version=\"3.3.1\">\n         <artifact name=\"paging-runtime-ktx-3.3.1.aar\">\n            <sha256 value=\"228558d79f2524457ab4b2ead4bd005b9f05fa95dc1830c2fc24ae3953ed4dae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-runtime-ktx-3.3.1.module\">\n            <sha256 value=\"3962ea77bc604daa9547aeb6c0fca47125d0dd1a51d45f9fcc0a87190b746ed7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-runtime-ktx\" version=\"3.3.2\">\n         <artifact name=\"paging-runtime-ktx-3.3.2.aar\">\n            <sha256 value=\"1c8bb4b1b290e9e1542ec58a2e0030f9dfdc6191238629f546714e2f5cdc9233\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-runtime-ktx-3.3.2.module\">\n            <sha256 value=\"003289949a16f616665d6531320d5983daa1f3d048e67c021551154a30b8f84e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-runtime-ktx\" version=\"3.3.4\">\n         <artifact name=\"paging-runtime-ktx-3.3.4.aar\">\n            <sha256 value=\"e7d67078361be01e3234dbb036b8faa3f6b5c01278d7c14fc0c63dc98cfb9242\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-runtime-ktx-3.3.4.module\">\n            <sha256 value=\"6e053eaeff1664264d43b819ee954a3acbb94b071777dd4bf35f2509717db9b6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-runtime-ktx\" version=\"3.3.5\">\n         <artifact name=\"paging-runtime-ktx-3.3.5.aar\">\n            <sha256 value=\"139e6e28e96660de239e5518b31a6d217cba5e965604a02f32c9bf54a36ffb34\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-runtime-ktx-3.3.5.module\">\n            <sha256 value=\"697be8f0dcde7759d27b95cd3907006a97ce76ada12ce1e330b7ba367d300b5d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.paging\" name=\"paging-runtime-ktx\" version=\"3.3.6\">\n         <artifact name=\"paging-runtime-ktx-3.3.6.aar\">\n            <sha256 value=\"d5ccceac2e75a26331295803d53d32d16d3951673f18c5a579892c7d905a9e2d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"paging-runtime-ktx-3.3.6.module\">\n            <sha256 value=\"211f71ee722c8693ce97cf0aeba72f4f146fb259e8948baf11a6ddb2a487993a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.preference\" name=\"preference\" version=\"1.2.1\">\n         <artifact name=\"preference-1.2.1.aar\">\n            <sha256 value=\"40ca8adfdb7effb61facb39bd9ca2e2f3a40d106743b0cd6dc9e21e8bedd4f85\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"preference-1.2.1.module\">\n            <sha256 value=\"b9a4dc6d8d232878f717dfac00c77bf384bbb52c26e4064f7bcaa966c10a2629\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.preference\" name=\"preference-ktx\" version=\"1.2.1\">\n         <artifact name=\"preference-ktx-1.2.1-sources.jar\">\n            <sha256 value=\"225d80f9fb06bbd4137a448cdbd094147c9893848e5dbbd959498c2b2b2de700\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"preference-ktx-1.2.1.aar\">\n            <sha256 value=\"872a5e3e07c0b8d21cb77769ab2f468b209ab6ec08231874401aecfea304a81c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"preference-ktx-1.2.1.module\">\n            <sha256 value=\"9532f2238b72155f8029f450c8cbe189b912a8dbffb32b6b9ffbdc2c7fd97b28\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.print\" name=\"print\" version=\"1.0.0\">\n         <artifact name=\"print-1.0.0.aar\">\n            <sha256 value=\"1d5c7f3135a1bba661fc373fd72e11eb0a4adbb3396787826dd8e4190d5d9edd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"print-1.0.0.pom\">\n            <sha256 value=\"62482c0594841bee24bb996abb6cb7b320a6a3b77dca9f0a0ba4fe3be5530aa7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.profileinstaller\" name=\"profileinstaller\" version=\"1.3.1\">\n         <artifact name=\"profileinstaller-1.3.1.aar\">\n            <sha256 value=\"d0e402ec31f24028a1dc7eb6a0a3f9d9635c1459392cd734396343b73d673948\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"profileinstaller-1.3.1.module\">\n            <sha256 value=\"cc7eed0ed4b669de84b852f78797a50018a4f30002e1e38aaa668af22ca5b460\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.profileinstaller\" name=\"profileinstaller\" version=\"1.4.0\">\n         <artifact name=\"profileinstaller-1.4.0.aar\">\n            <sha256 value=\"d502141fcce902430f62b674c32aecd0f75262e7ee2cd15c74adb617cd13130a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"profileinstaller-1.4.0.module\">\n            <sha256 value=\"39bf997a28d8eed2cb319819f6f352a1ba3a78b9c979004fbe05e26b8f7d160b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.recyclerview\" name=\"recyclerview\" version=\"1.3.2\">\n         <artifact name=\"recyclerview-1.3.2-sources.jar\">\n            <sha256 value=\"62c1fc5b9158b6500d604fb345d49c9f6698832260140ec2dde553b5ab20d34e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"recyclerview-1.3.2.aar\">\n            <sha256 value=\"005cf51510493a24fa48baae1a455a5258515391351a71717dd33cba95211966\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"recyclerview-1.3.2.module\">\n            <sha256 value=\"179fc4d2d022c0a8247e7612feab40b951bd8710f6b452e3ed6dc03a1e52769d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.recyclerview\" name=\"recyclerview\" version=\"1.4.0\">\n         <artifact name=\"recyclerview-1.4.0.aar\">\n            <sha256 value=\"0f32ccaffcda74c3f87f0b4cfe6ae78e8aa4eb3ad7dda4f2edf06eedc947a5cf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"recyclerview-1.4.0.module\">\n            <sha256 value=\"631d996322198595129c1d02805346361d811c06f25545fa8bbca567355f6f98\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.resourceinspection\" name=\"resourceinspection-annotation\" version=\"1.0.1\">\n         <artifact name=\"resourceinspection-annotation-1.0.1.jar\">\n            <sha256 value=\"8cff870ec6fb31db48a52f4a792335b4bf8de07e03bd37823181526433ccd5cb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"resourceinspection-annotation-1.0.1.module\">\n            <sha256 value=\"352a11a8d8a4c1bd6cd2c2fefff9c94ca954d7b5202a0656959db95297f6a2b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-common\" version=\"2.6.1\">\n         <artifact name=\"room-common-2.6.1.jar\">\n            <sha256 value=\"99326d3eeca4a64671bc8802f1e45f4e6b348e8c7faba230c3854d316809ffcf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-common-2.6.1.module\">\n            <sha256 value=\"0ea07ef7143ab5262cc0e48e82f3badd6adf164b3701ab2ac0f6f099e8f63d3b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-common\" version=\"2.7.0\">\n         <artifact name=\"room-common-2.7.0.module\">\n            <sha256 value=\"ec76c3bf85ad4589fd08c3522001affa78970eb7772107cb5e06ef60e37a74eb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-common-metadata-2.7.0.jar\">\n            <sha256 value=\"37a82a2dfcd131c150bfaae869be7cfc25daec3b135f42be170b28e4d96f8999\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-common\" version=\"2.7.1\">\n         <artifact name=\"room-common-2.7.1.module\">\n            <sha256 value=\"558b8530032e8e003ea0895d2792121e676b1a9e3a0c33aee460d00f927578d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-common-metadata-2.7.1.jar\">\n            <sha256 value=\"37a82a2dfcd131c150bfaae869be7cfc25daec3b135f42be170b28e4d96f8999\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-common-jvm\" version=\"2.7.0\">\n         <artifact name=\"room-common-jvm-2.7.0.jar\">\n            <sha256 value=\"b2a00b88c8b8d810d07ecbdf92fdff47db7f0ea884efe5c31cda7a526c9b1ae5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-common-jvm-2.7.0.module\">\n            <sha256 value=\"b29a34cc1e3375fd92029536ab2721f520a73b1c00000739f77e48ebce069eb3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-common-jvm\" version=\"2.7.1\">\n         <artifact name=\"room-common-jvm-2.7.1.jar\">\n            <sha256 value=\"b2a00b88c8b8d810d07ecbdf92fdff47db7f0ea884efe5c31cda7a526c9b1ae5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-common-jvm-2.7.1.module\">\n            <sha256 value=\"8cced43b29d6bc5d08599c53d7f47d84adc7577a117349b8fdea46203d888479\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-compiler\" version=\"2.6.1\">\n         <artifact name=\"room-compiler-2.6.1.jar\">\n            <sha256 value=\"2c103c27918e90b5b436d00f2024b057ab78af4325892e7bab78e7c6f8eed67c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-compiler-2.6.1.module\">\n            <sha256 value=\"32cee57602deb1320ef9f945a9ce3e91cfe652acba5844762297b9eaed12fff5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-compiler\" version=\"2.7.0\">\n         <artifact name=\"room-compiler-2.7.0.jar\">\n            <sha256 value=\"d908e892b10639d29320ea4d64bea1c403e05582a163598556d5ea23eb04b0cd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-compiler-2.7.0.module\">\n            <sha256 value=\"19d343145cae837bb012b24b2232da99dff773fdedc58588a687d270e03a1d63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-compiler\" version=\"2.7.1\">\n         <artifact name=\"room-compiler-2.7.1.jar\">\n            <sha256 value=\"d908e892b10639d29320ea4d64bea1c403e05582a163598556d5ea23eb04b0cd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-compiler-2.7.1.module\">\n            <sha256 value=\"4344b3fcf20a2eae350c37e10f31f26e142875c6e164b4f6f0d20790f4e8f3c3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-compiler-processing\" version=\"2.6.1\">\n         <artifact name=\"room-compiler-processing-2.6.1.jar\">\n            <sha256 value=\"6ce5f6c1aac61fc44595030cbf9e1c89cc29a29ea764472b4e4a49d272f0a7cd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-compiler-processing-2.6.1.module\">\n            <sha256 value=\"ff0671de4ba51085a23e97b3b58ecb498109e5ee0bd7fd4a72f2b7f9db765ca7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-compiler-processing\" version=\"2.7.0\">\n         <artifact name=\"room-compiler-processing-2.7.0.jar\">\n            <sha256 value=\"b9609e3e141575958a0217dee78610ab1e715709b75ef383e859fb96efb00df0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-compiler-processing-2.7.0.module\">\n            <sha256 value=\"afe60d5f7840609c81f3f78d8fe8899a47547d96d28784bd0e89f47775883375\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-compiler-processing\" version=\"2.7.1\">\n         <artifact name=\"room-compiler-processing-2.7.1.jar\">\n            <sha256 value=\"b9609e3e141575958a0217dee78610ab1e715709b75ef383e859fb96efb00df0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-compiler-processing-2.7.1.module\">\n            <sha256 value=\"cfcce5f075018432abe5609d4ff6f407573e892760c274e856952a56f3f2d8e9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-external-antlr\" version=\"2.7.0\">\n         <artifact name=\"room-external-antlr-2.7.0.jar\">\n            <sha256 value=\"6bf794bffe8de263826502511b4c7df0570312b6cc99312ca7fc6bdb0880ca1e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-external-antlr-2.7.0.module\">\n            <sha256 value=\"3167c334c4ef5b3ae6f47cff5dcd601411a8799c0d905fe0a3b6a3528c617d21\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-external-antlr\" version=\"2.7.1\">\n         <artifact name=\"room-external-antlr-2.7.1.jar\">\n            <sha256 value=\"6bf794bffe8de263826502511b4c7df0570312b6cc99312ca7fc6bdb0880ca1e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-external-antlr-2.7.1.module\">\n            <sha256 value=\"b784108f04274f75eec71f9d7dc38a0c41f10b5b17ef8fc97cc81c1447850783\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-ktx\" version=\"2.6.1\">\n         <artifact name=\"room-ktx-2.6.1-sources.jar\">\n            <sha256 value=\"3118f596d5c3e70a2f8934db3d9655a71753f8d313dff794ab6b3ee1bf967547\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-ktx-2.6.1.aar\">\n            <sha256 value=\"da4c0cba7efcafa29fbeab1db41984238f25c1a33612c1d60d63b995968d70ca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-ktx-2.6.1.module\">\n            <sha256 value=\"33ac3f42307328ac19d4fe52422337b1c1ae64db36e3933438312a48c3b3b631\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-ktx\" version=\"2.7.0\">\n         <artifact name=\"room-ktx-2.7.0.aar\">\n            <sha256 value=\"ffd0f84c0f2de9704a7cd1d36c8fb3c71f2a33bc667bcb2487844d71aea51db7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-ktx-2.7.0.module\">\n            <sha256 value=\"27a9c1c4ef9818e7383d40714862e33a5329c2c05538079f3ad5d8cc68f3533f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-ktx\" version=\"2.7.1\">\n         <artifact name=\"room-ktx-2.7.1.aar\">\n            <sha256 value=\"52dde3c7a5746621854aa2fd4047315cfd1abc6f962259410d0248a541a6cc9b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-ktx-2.7.1.module\">\n            <sha256 value=\"a7ebebee29b35a5269e74da8697bdd73b64fbe99b0c62bf08c661b0f56d4230b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-migration\" version=\"2.6.1\">\n         <artifact name=\"room-migration-2.6.1.jar\">\n            <sha256 value=\"0dd380522b6d55ab23902de873effc356e9a8e4fb8bd94dde963222d420a89b9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-migration-2.6.1.module\">\n            <sha256 value=\"3e85b971f8a5d94b3a81c440431691dd448256635009a2bd6925dd6dd1e3a42e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-migration\" version=\"2.7.0\">\n         <artifact name=\"room-migration-2.7.0.module\">\n            <sha256 value=\"0c4f1caf9152beb805c4731b1ec29cfb491d3e503cf35b923d1d52d574a68d48\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-migration-metadata-2.7.0.jar\">\n            <sha256 value=\"0fb60c3ce7bc28bf5d4c9dc9e0b6b33b2319061c2c3591698699bdac9896d897\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-migration\" version=\"2.7.1\">\n         <artifact name=\"room-migration-2.7.1.module\">\n            <sha256 value=\"999b533f749b92209a22cc9432447c20a3cf263fd501fcb3a31a02016a214b00\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-migration-metadata-2.7.1.jar\">\n            <sha256 value=\"0fb60c3ce7bc28bf5d4c9dc9e0b6b33b2319061c2c3591698699bdac9896d897\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-migration-jvm\" version=\"2.7.0\">\n         <artifact name=\"room-migration-jvm-2.7.0.jar\">\n            <sha256 value=\"8c5cec8f2d5da1cb9fde960fdd2253bbfc6be74f9a4a03ecdb82da17662231ac\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-migration-jvm-2.7.0.module\">\n            <sha256 value=\"23cae128562643562606b4e0756b0cdc92564b2a7bb5842f7fd04eb09b1081c0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-migration-jvm\" version=\"2.7.1\">\n         <artifact name=\"room-migration-jvm-2.7.1.jar\">\n            <sha256 value=\"8c5cec8f2d5da1cb9fde960fdd2253bbfc6be74f9a4a03ecdb82da17662231ac\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-migration-jvm-2.7.1.module\">\n            <sha256 value=\"1c58b1b8d70895f861fd9131948db9af74fb89adb6829405123c4b0bf0968f24\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-paging\" version=\"2.6.1\">\n         <artifact name=\"room-paging-2.6.1-sources.jar\">\n            <sha256 value=\"ae3b8198a108a5ee791412b649db773eaf60d88c0acc4a2a7a6fde1cf723e571\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-paging-2.6.1.aar\">\n            <sha256 value=\"ab1b21ff01eedf513255e1feb9de1858b69faf2000ec0ed13570e42f7f250489\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-paging-2.6.1.module\">\n            <sha256 value=\"cb3eee2cdc8e27ae986f975e65cc5410b50166cede9e21e91132ab9376dd072b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-paging\" version=\"2.7.0\">\n         <artifact name=\"room-paging-2.7.0.module\">\n            <sha256 value=\"aed6f61ac6cbd7af0ca35a23ca05030ab73d4b4e1eccf5d6ae9d3780b1d191fd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-paging-metadata-2.7.0.jar\">\n            <sha256 value=\"6f292a2e63b35cb2eb1a72c1ebc8a0f63053e733d84980b5bcde10b29ac2eb95\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-paging\" version=\"2.7.1\">\n         <artifact name=\"room-paging-2.7.1.module\">\n            <sha256 value=\"7701e13223498edcb48c867d4a4b09d0ccd50116efe20f0e21aa48c4b4509f6d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-paging-metadata-2.7.1.jar\">\n            <sha256 value=\"6f292a2e63b35cb2eb1a72c1ebc8a0f63053e733d84980b5bcde10b29ac2eb95\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-paging-android\" version=\"2.7.0\">\n         <artifact name=\"room-paging-android-2.7.0.module\">\n            <sha256 value=\"4652882d8d607b780ceea83712cdb677e7841e93c8ea2352fb1b53d4176cbc92\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-paging-release.aar\">\n            <sha256 value=\"6323213bc4af210c98d1c28b46ea253bc9a7e59de1c489b4a83ffc3ab97836ca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-paging-android\" version=\"2.7.1\">\n         <artifact name=\"room-paging-android-2.7.1.module\">\n            <sha256 value=\"083f17806be12cbd4a5b35122b3e8229497baf57f7ad687387dd8b5eaf18cf6e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-paging-release.aar\">\n            <sha256 value=\"a1e6b1ecb654baace6edd01d3246f8237cf6c8cd030f765f3678f2901fe7bce1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-runtime\" version=\"2.5.0\">\n         <artifact name=\"room-runtime-2.5.0.module\">\n            <sha256 value=\"e321db49bf5e8425effc158472b958c831f4c6974501382ff8c98f89d4ebad4d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-runtime\" version=\"2.6.1\">\n         <artifact name=\"room-runtime-2.6.1.aar\">\n            <sha256 value=\"69624fd7add6ce5bfcc12362cd427341d2910e277ed5a6fcc46132a4899114d0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-runtime-2.6.1.module\">\n            <sha256 value=\"828e4bead1b8d42ff17c41e74541133dc61a959b968f3c2a2221c24b3dac6c3b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-runtime\" version=\"2.7.0\">\n         <artifact name=\"room-runtime-2.7.0.module\">\n            <sha256 value=\"845bce3ed66b0d2de3e7dcd72c859e0b0efe295efe0d2b57e9fe29b617ad7964\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-runtime-metadata-2.7.0.jar\">\n            <sha256 value=\"c213db6a92762e5a922e45f91423711517b2653b60021dd51c3e8c94deabc44a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-runtime\" version=\"2.7.1\">\n         <artifact name=\"room-runtime-2.7.1.module\">\n            <sha256 value=\"b76d8a48f4768ea79f58c84f2e02058c6cec8181538ee8c772cc1def3a705b30\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-runtime-metadata-2.7.1.jar\">\n            <sha256 value=\"c213db6a92762e5a922e45f91423711517b2653b60021dd51c3e8c94deabc44a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-runtime-android\" version=\"2.7.0\">\n         <artifact name=\"room-runtime-android-2.7.0.module\">\n            <sha256 value=\"6a3dd8e44c3e2aad173c5a0fde2242d32eab7b6444a02aa6b6ee14f9ec08f44e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-runtime-release.aar\">\n            <sha256 value=\"8310b9ba101646bd78f9dd65a5c8ae8c82171bcfa8341fc646893c9e8cc9a850\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-runtime-android\" version=\"2.7.1\">\n         <artifact name=\"room-runtime-android-2.7.1.module\">\n            <sha256 value=\"84f8430b39033ec7fcd067fb6605398d5e88fdcdfbec65e5eade68f15a02363f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-runtime-release.aar\">\n            <sha256 value=\"86329ed71908608f37234ed909248c698e320c6805c8afe8f42e7dd657445026\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-testing\" version=\"2.6.1\">\n         <artifact name=\"room-testing-2.6.1-sources.jar\">\n            <sha256 value=\"e9c6087f3564e7eb41c21c15d00a5a2df6530203486cc672656638e215ff04ca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-testing-2.6.1.aar\">\n            <sha256 value=\"ea66d01428a8c8f26a0ee2259a96d7763dd0d3aef5321730790f8e9cfbe28360\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-testing-2.6.1.module\">\n            <sha256 value=\"f87f1b1f90673636e17480929d25e417747cbef90253d7e63333596fa88611da\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-testing\" version=\"2.7.0\">\n         <artifact name=\"room-testing-2.7.0.module\">\n            <sha256 value=\"dd03815e69a3f35bf22be8ad318cfa792face5062e921eac0bed38efe1680847\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-testing-metadata-2.7.0.jar\">\n            <sha256 value=\"3fadae313f7db436ed40c3ef925d08bf3395f66400a2c6eaf69f2f46b01ceff3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-testing\" version=\"2.7.1\">\n         <artifact name=\"room-testing-2.7.1.module\">\n            <sha256 value=\"98eece6b3b0f9d80b2841c37486fe166d3887e47771798808e6e7348d3a5df42\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-testing-metadata-2.7.1.jar\">\n            <sha256 value=\"3fadae313f7db436ed40c3ef925d08bf3395f66400a2c6eaf69f2f46b01ceff3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-testing-android\" version=\"2.7.0\">\n         <artifact name=\"room-testing-android-2.7.0.module\">\n            <sha256 value=\"6c9b38019e99b69f40003ce40189693fe3aee6453bcba05efbcb7ec4acb405ba\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-testing-release.aar\">\n            <sha256 value=\"34a6eb13bb7acae3063d209f0dbc3490e09044ddfe23a05d1c22ff4eb59e66be\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.room\" name=\"room-testing-android\" version=\"2.7.1\">\n         <artifact name=\"room-testing-android-2.7.1.module\">\n            <sha256 value=\"63f886d260de27f8f4223c80cb2ddea48176003a313e554bc1288ac5c6e3cf88\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"room-testing-release.aar\">\n            <sha256 value=\"734ae2879b3ed59c9d006d2054bb2cadaf8ddbe0e64c9a1830fd9d2df2f043e3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.savedstate\" name=\"savedstate\" version=\"1.2.0\">\n         <artifact name=\"savedstate-1.2.0-sources.jar\">\n            <sha256 value=\"27056b2a9cddc7e5dc73700771f4e8dddbbcbab52b6cb46e33edc9588337e1cd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"savedstate-1.2.0.module\">\n            <sha256 value=\"4247c23308abcb5d0ff8cdaf7dfd583f3c2a1016f68d13f1a41c21600b6fafd7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.savedstate\" name=\"savedstate\" version=\"1.2.1\">\n         <artifact name=\"savedstate-1.2.1.aar\">\n            <sha256 value=\"21a7d4bcf6bdb94ad7b9283801529300b4fbb8808ca4f191e0cdce6fd8e4705a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"savedstate-1.2.1.module\">\n            <sha256 value=\"5bb656fc760d9e3996b535160cbb4106033c9f736e9089e6ef4eb0c669785066\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.savedstate\" name=\"savedstate\" version=\"1.3.0\">\n         <artifact name=\"savedstate-1.3.0.aar\">\n            <sha256 value=\"85ea36f18a33c4acf6ed62747a1b4cbef191f218121ab37a51175d82c5be89ad\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"savedstate-1.3.0.module\">\n            <sha256 value=\"19d2501e044c61f224e24fec5869cbc9dbf2010920f64765905ef4d1941a5e6b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"savedstate-metadata-1.3.0.jar\">\n            <sha256 value=\"fb975509aa57fc58cd05d81e560916e6262a6a821a5056671c75b1a243d213bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.savedstate\" name=\"savedstate-android\" version=\"1.3.0\">\n         <artifact name=\"savedstate-android-1.3.0.module\">\n            <sha256 value=\"b1d6f10a9442ad3243ee7d4ba1074d4ab7019e19d72222a2654e8158bf7c06e6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"savedstate-release.aar\">\n            <sha256 value=\"210b6909bbd515dbf415905cbb220fca93a87fa546838f754077ebc8e0488590\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.savedstate\" name=\"savedstate-ktx\" version=\"1.2.1\">\n         <artifact name=\"savedstate-ktx-1.2.1.aar\">\n            <sha256 value=\"8553f87e7136c24ec5243560f48f1c32cba56daa77722f89589a5cafcb8f7894\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"savedstate-ktx-1.2.1.module\">\n            <sha256 value=\"94359184b2ba51c0f498a2b9055d37b372231ef9bcc54a4972ac99f0303afff1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.savedstate\" name=\"savedstate-ktx\" version=\"1.3.0\">\n         <artifact name=\"savedstate-ktx-1.3.0.aar\">\n            <sha256 value=\"45c5f6412840f50de7bf7d9b1c4a8c81ea236832487a1138cb320b8c997416f2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"savedstate-ktx-1.3.0.module\">\n            <sha256 value=\"dcf657881d46352128aa0bf48f32775b55e3661361ebf2d2c217ed117fad881f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.sharetarget\" name=\"sharetarget\" version=\"1.2.0\">\n         <artifact name=\"sharetarget-1.2.0-sources.jar\">\n            <sha256 value=\"4893309311e53712084d106e803d0a8196b7c4b74a255ea69e12ae80f20cfe5c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sharetarget-1.2.0.aar\">\n            <sha256 value=\"1d4e46d2c99b3ddf92163673cac212a4f0342ccf6827ff47606048b348ea78e3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sharetarget-1.2.0.module\">\n            <sha256 value=\"5a35f1e23888d0eee77bfe481b000710aaac14edf123a8485edbd8fbcd18e059\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.slidingpanelayout\" name=\"slidingpanelayout\" version=\"1.2.0\">\n         <artifact name=\"slidingpanelayout-1.2.0.aar\">\n            <sha256 value=\"5f53339be2a4f90a9abea3571dd59e70a8a49e7f15dd82974a3898b4652e8714\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"slidingpanelayout-1.2.0.module\">\n            <sha256 value=\"3531bf0081b78538589f7e840fc0f7c70a45c4d8a2d17fb2f0eaceee2a99b59b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.sqlite\" name=\"sqlite\" version=\"2.4.0\">\n         <artifact name=\"sqlite-2.4.0.aar\">\n            <sha256 value=\"bb7fa113112f7e4857496e222e3051d73a910add74bf40761e1bdae55b0216af\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sqlite-2.4.0.module\">\n            <sha256 value=\"b7b5f5fcb12a48f7fdeea82ef205721e3daf366fc77a843a77358def088f63fc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.sqlite\" name=\"sqlite\" version=\"2.5.0\">\n         <artifact name=\"sqlite-2.5.0.module\">\n            <sha256 value=\"3699481c9fc5879f42bc6f5f22fffcb6e5d23f75862e66f007eff631d7169779\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sqlite-metadata-2.5.0.jar\">\n            <sha256 value=\"cbb309763b5fe5ac5b1ecdd510e38c75d0bc97f145a9dca32324ffb58c3ce9ae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.sqlite\" name=\"sqlite-android\" version=\"2.5.0\">\n         <artifact name=\"sqlite-android-2.5.0.module\">\n            <sha256 value=\"dd3ec0b45d421d00b487cedad0da58a5de355e5bccc5bf5938a1474d1a5e06c4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sqlite-release.aar\">\n            <sha256 value=\"2b02be3aed8d2994021afe072185af94e29422ffe8066df88868efaca1161ef0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.sqlite\" name=\"sqlite-framework\" version=\"2.3.0\">\n         <artifact name=\"sqlite-framework-2.3.0.module\">\n            <sha256 value=\"0b21ef275c000fe14bc73dfbf7b7699a289f3dc813c758ef37848269113e1cad\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.sqlite\" name=\"sqlite-framework\" version=\"2.4.0\">\n         <artifact name=\"sqlite-framework-2.4.0.aar\">\n            <sha256 value=\"ca6e503322b2e60374c2b36c95c50b16709d9388fe36e80fb23de1fbf7a6eb95\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sqlite-framework-2.4.0.module\">\n            <sha256 value=\"15681e94286ebf7121d940765a222b9a7ada2a32a49baa1ad416ef04b6f0f780\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.sqlite\" name=\"sqlite-framework\" version=\"2.5.0\">\n         <artifact name=\"sqlite-framework-2.5.0.module\">\n            <sha256 value=\"156ea5562df341a063dcbe3e84036415ee81b7c9023a58a69358887e5deb04bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sqlite-framework-metadata-2.5.0.jar\">\n            <sha256 value=\"69859dc22be411215e587a6f84593c2488c522ecbbb700ed9df39c2b63f7700b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.sqlite\" name=\"sqlite-framework-android\" version=\"2.5.0\">\n         <artifact name=\"sqlite-framework-android-2.5.0.module\">\n            <sha256 value=\"467a3d0d860e0bcb016ad4fc71ab7e8b3b60c1373363db95b6293ec74eb41cc0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sqlite-framework-release.aar\">\n            <sha256 value=\"850de703d95b91f504774981a90fa829799cdfc9eab203692d24a0c40d7e71e7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.startup\" name=\"startup-runtime\" version=\"1.0.0\">\n         <artifact name=\"startup-runtime-1.0.0.module\">\n            <sha256 value=\"40effca0d6ee1fde32bc296897e54ebbcc4cf4aa29b0c531036cbd2a824a3c24\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.startup\" name=\"startup-runtime\" version=\"1.1.1\">\n         <artifact name=\"startup-runtime-1.1.1.aar\">\n            <sha256 value=\"e0a6329a371262fe4c450372b70fdaf33b769ef6917094723787cfce896b1dd3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"startup-runtime-1.1.1.module\">\n            <sha256 value=\"cfd96cf6450c6e2b697598924729ad9a0495c5a4fcf4ebee7e2f81b07e415865\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.swiperefreshlayout\" name=\"swiperefreshlayout\" version=\"1.1.0\">\n         <artifact name=\"swiperefreshlayout-1.1.0-sources.jar\">\n            <sha256 value=\"74e31bb677d99e9425f911f9f02341c7ed88eab57c15971fb17cb9cd1c9e826e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"swiperefreshlayout-1.1.0.aar\">\n            <sha256 value=\"2ce7906cd1dea05aec81975db22d54382359c05a21b2527ad848bc60f6b27293\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"swiperefreshlayout-1.1.0.pom\">\n            <sha256 value=\"0b8c55ce6910155a283ba98a6d094be6e0ef5e70a7371cd9fe9f71bf8ffd24ad\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.test\" name=\"annotation\" version=\"1.0.1\">\n         <artifact name=\"annotation-1.0.1-sources.jar\">\n            <sha256 value=\"2880a29fd9120527ab45afceb611b62c62f5464a655a12801df63e78ed9d50ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotation-1.0.1.aar\">\n            <sha256 value=\"c0754928effe1968c3a9a7b55d1dfc7ceb1e1e7c9f3f09f98afd42431f712492\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotation-1.0.1.pom\">\n            <sha256 value=\"39e978b32726354a67ea6efe8535ab6579f4760fd579c9deaacb347b0bff0c3e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.test\" name=\"core\" version=\"1.5.0\">\n         <artifact name=\"core-1.5.0-sources.jar\">\n            <sha256 value=\"505e01edc532ac8259ad52264bc0f004f42043c446b47957438e673f82fd1944\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-1.5.0.aar\">\n            <sha256 value=\"2c06715c0d0843cee2143ab8bb322bb3f34d5247630402fc8c1b6a0eafa15b9f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-1.5.0.pom\">\n            <sha256 value=\"18a6187c16b8d14b51b6a69e32de4a1416a0dc12cff3357d56fbe5feb70a15f2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.test\" name=\"core\" version=\"1.6.1\">\n         <artifact name=\"core-1.6.1.aar\">\n            <sha256 value=\"7a7af31c21785ddb7c4319c838847e6d4d9b5bb531f3a951481ec3b98780bf51\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-1.6.1.pom\">\n            <sha256 value=\"44d102e5879664a4a4e1006881f2e6d886af99db362d20cb9a659d997b32464b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.test\" name=\"monitor\" version=\"1.6.1\">\n         <artifact name=\"monitor-1.6.1-sources.jar\">\n            <sha256 value=\"50517fcf104a71f3d3c5d28802b2e82876f8e5a4b63457979d09b08f22481807\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"monitor-1.6.1.aar\">\n            <sha256 value=\"2985ce8556989baf7c84342e7f687713c037a39a922e614d1a3ddf1ca3777079\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"monitor-1.6.1.pom\">\n            <sha256 value=\"30c0dab3944d63721e2023b27ff35ef343130c9eb7b88f49f331b4e0f2ecfbce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.test\" name=\"monitor\" version=\"1.7.1\">\n         <artifact name=\"monitor-1.7.1.aar\">\n            <sha256 value=\"b31e7d7a3564f9d5504c86bed9bfb8fee429feb3d1b81ffd1f2c149948c51d19\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"monitor-1.7.1.pom\">\n            <sha256 value=\"41cebc18bbfee1fef5c0c06aaa1e3cb74658bc25bd720c80719d087da0ad02e7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.test\" name=\"monitor\" version=\"1.7.2\">\n         <artifact name=\"monitor-1.7.2.aar\">\n            <sha256 value=\"868cc120d10d024b886fa157e1e1eaee0e6a8e5d55e7f765ef41d8fc0fea775b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"monitor-1.7.2.pom\">\n            <sha256 value=\"388fe58cf6062ffcce209853ac5c006d1d6efee9ba76b16fabfb45a7f26521ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.test\" name=\"runner\" version=\"1.5.2\">\n         <artifact name=\"runner-1.5.2-sources.jar\">\n            <sha256 value=\"188f6e40732dda9451d70121a12a31f6411bb3ae598d58193e494ff27e111700\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"runner-1.5.2.aar\">\n            <sha256 value=\"36cd6bc876daa1f183ccd11f9898e094c71f06960fde85a373422959613a44d6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"runner-1.5.2.pom\">\n            <sha256 value=\"505c188f187d91d76623b7898261ea0137d902aa1a4e143d88cc2c23742b4ac1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.test\" name=\"runner\" version=\"1.6.1\">\n         <artifact name=\"runner-1.6.1.aar\">\n            <sha256 value=\"5bc564d0c35b55fd4b323d00a9fd16ac30d84d84a459f8d15896d4c87986c2a3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"runner-1.6.1.pom\">\n            <sha256 value=\"f275cf5ffced5a807d52f8e2c22259ae89f2fb8c38939fe64cbe4dd5515510d7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.test.espresso\" name=\"espresso-core\" version=\"3.5.1\">\n         <artifact name=\"espresso-core-3.5.1-sources.jar\">\n            <sha256 value=\"f12ec3d9ec4de40cfa901b1d397e4bb30caefe13e9029d44606ec39f2d9b6d9f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"espresso-core-3.5.1.aar\">\n            <sha256 value=\"34b0493f4e002f205d961e562add0c0c31bb0acc657e89d89d4b188ac13f242c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"espresso-core-3.5.1.pom\">\n            <sha256 value=\"f15bd19444eef421f74195cc7043343af2b091a0cdb05a02cb8fcaba8816b50e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.test.espresso\" name=\"espresso-core\" version=\"3.6.1\">\n         <artifact name=\"espresso-core-3.6.1.aar\">\n            <sha256 value=\"2495daa4d35cc0e6e6de4566d53a6e04cc13c316fe32c1a7ede13571ff11ffdd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"espresso-core-3.6.1.pom\">\n            <sha256 value=\"da9426b4af8e2c8d0fbcb28d1397868d92d5e07e1d3d88e37a9cee0f5ac2b764\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.test.espresso\" name=\"espresso-idling-resource\" version=\"3.5.1\">\n         <artifact name=\"espresso-idling-resource-3.5.1-sources.jar\">\n            <sha256 value=\"20e8d17706649666730eb05ce2b148a4295465aec765e4576856a1ab3164dc25\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"espresso-idling-resource-3.5.1.aar\">\n            <sha256 value=\"84fb8e2f5eda937771bee28582f5d2cfa61b0e9438d02041ca61b81e3dac3c87\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"espresso-idling-resource-3.5.1.pom\">\n            <sha256 value=\"c9acad1f91f46e9ef59b000a3e995c9da9d6949dfa77ab8a2dadfb26f295cee1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.test.espresso\" name=\"espresso-idling-resource\" version=\"3.6.1\">\n         <artifact name=\"espresso-idling-resource-3.6.1.aar\">\n            <sha256 value=\"bc63a8780f1c707724e389f530cb2e1a6847da97f6a8114604c002aba2fd86ca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"espresso-idling-resource-3.6.1.pom\">\n            <sha256 value=\"8dcb942e951ab2954e74003ddfcd4f899d26537d04be9209e10518069810645f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.test.ext\" name=\"junit\" version=\"1.1.5\">\n         <artifact name=\"junit-1.1.5-sources.jar\">\n            <sha256 value=\"751febaf516e08ff72749e693b2f5351c97af8a1451c23dcf18b522cd1940e96\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"junit-1.1.5.aar\">\n            <sha256 value=\"4307c0e60f5d701db9c59bcd9115af705113c36a9132fa3dbad58db1294e9bfd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"junit-1.1.5.pom\">\n            <sha256 value=\"4cff0df04cae25831e821ef2f9129245783460e98d0fd67d8f6824065a134c4e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.test.ext\" name=\"junit\" version=\"1.2.1\">\n         <artifact name=\"junit-1.2.1.aar\">\n            <sha256 value=\"7b146a73c545b983430d2fae0081df67c76722c19a9abd2904e131696a8c5b20\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"junit-1.2.1.pom\">\n            <sha256 value=\"983e474e47aafea0d078c4bd0b72aab1a292aceac198856371a02e1e1cb51751\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.test.services\" name=\"storage\" version=\"1.4.2\">\n         <artifact name=\"storage-1.4.2-sources.jar\">\n            <sha256 value=\"160b0c0c957fa33046d93942a0937b7d08bc09ccb51003e83c1e94f65b64034a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"storage-1.4.2.aar\">\n            <sha256 value=\"b34861f0cd920cb1089f08c3f27e5865b7f920284cc45f4ed12ef8d6980dac48\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"storage-1.4.2.pom\">\n            <sha256 value=\"9b6301b11212641fa2cea00e48a98d0bf6f9de9fa4eabfdb31828b9a97c3ad89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.test.services\" name=\"storage\" version=\"1.5.0\">\n         <artifact name=\"storage-1.5.0.aar\">\n            <sha256 value=\"d59621845cff5ff5e8a6906445ef1b2d83624d796cbfad9a52e86a3ab42f8c48\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"storage-1.5.0.pom\">\n            <sha256 value=\"81aa4b6bacb955c15edbe9bb2ed600b7e97d2c094b0369f4eec86eca3b23465d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.tracing\" name=\"tracing\" version=\"1.0.0\">\n         <artifact name=\"tracing-1.0.0-sources.jar\">\n            <sha256 value=\"a593c115d145df9cb9ae2226960da1d53ff8590eff1c285e7c9de2b6727d3c21\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracing-1.0.0.aar\">\n            <sha256 value=\"07b8b6139665b884a162eccf97891ca50f7f56831233bf25168ae04f7b568612\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracing-1.0.0.module\">\n            <sha256 value=\"fc8b21ebe5fa3a7c96ee098bcdcd00f077ebce73f243fa858e2b0671615f75d8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.tracing\" name=\"tracing\" version=\"1.1.0\">\n         <artifact name=\"tracing-1.1.0.aar\">\n            <sha256 value=\"5b78e2c618fc10b3d14decc01df76158f15954ad746aacf0607766721da081f6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracing-1.1.0.module\">\n            <sha256 value=\"b1fed4309623b6f20bc817d8fbd70e4ea7085e40647694cd399ae58d2f0049e3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.tracing\" name=\"tracing\" version=\"1.2.0\">\n         <artifact name=\"tracing-1.2.0.aar\">\n            <sha256 value=\"6faa90390d1fdbf0adb9a99bf99de67b94c6c6f35aea9510593a9d17973736a2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracing-1.2.0.module\">\n            <sha256 value=\"d0d8d486b6bd33206dbf3f1a6d167e9b43c268ea63c3321c886b1543ad05ece3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.tracing\" name=\"tracing-ktx\" version=\"1.2.0\">\n         <artifact name=\"tracing-ktx-1.2.0.aar\">\n            <sha256 value=\"c33f9cbd931e6190ca38aa09bf8a7a8a19391d4b0fb7a7605a6b59f2d42580d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracing-ktx-1.2.0.module\">\n            <sha256 value=\"39288b23c71a4391132aec9951f5e27f41727a2cdff69c6e4b4ece49f63e540c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.transition\" name=\"transition\" version=\"1.5.0\">\n         <artifact name=\"transition-1.5.0.aar\">\n            <sha256 value=\"0aa66a0ea406d25a1091f96a3b753b4b12e44fdc43b91ec52c17831e9c31f54b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"transition-1.5.0.module\">\n            <sha256 value=\"ad433467f5ede87ad2b3c59f7fe063984cf0720cdacd10591f5d8f84e3a4e095\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.vectordrawable\" name=\"vectordrawable\" version=\"1.1.0\">\n         <artifact name=\"vectordrawable-1.1.0.aar\">\n            <sha256 value=\"46fd633ac01b49b7fcabc263bf098c5a8b9e9a69774d234edcca04fb02df8e26\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"vectordrawable-1.1.0.pom\">\n            <sha256 value=\"5b0e2d5b2179e54804785cbc21ce5f473b5e1ddd55a57da482e94dcd39492bb2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.vectordrawable\" name=\"vectordrawable-animated\" version=\"1.1.0\">\n         <artifact name=\"vectordrawable-animated-1.1.0-sources.jar\">\n            <sha256 value=\"a3880c595965c55fd1bdee0554b99c66e9c28d3311b7ce6242189fc1f554fcf1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"vectordrawable-animated-1.1.0.aar\">\n            <sha256 value=\"76da2c502371d9c38054df5e2b248d00da87809ed058f3363eae87ce5e2403f8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"vectordrawable-animated-1.1.0.pom\">\n            <sha256 value=\"276a20116b705fb75b9003ee9496c56f6fd3b32375fb232472811eba60a040bd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.versionedparcelable\" name=\"versionedparcelable\" version=\"1.1.0\">\n         <artifact name=\"versionedparcelable-1.1.0.aar\">\n            <sha256 value=\"9a1d77140ac222b7866b5054ee7d159bc1800987ed2d46dd6afdd145abb710c1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"versionedparcelable-1.1.0.pom\">\n            <sha256 value=\"c729c7be0cc06323bda829d460666e79dbd43b799a21089a44bd3b293dc253b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.versionedparcelable\" name=\"versionedparcelable\" version=\"1.1.1\">\n         <artifact name=\"versionedparcelable-1.1.1.aar\">\n            <sha256 value=\"57e8d93260d18d5b9007c9eed3c64ad159de90c8609ebfc74a347cbd514535a4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"versionedparcelable-1.1.1.pom\">\n            <sha256 value=\"5f51e65873ca612de3838fa90d2ee95b8d040efd31b9c390a19bf94d615cdb2f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.viewpager\" name=\"viewpager\" version=\"1.0.0\">\n         <artifact name=\"viewpager-1.0.0.aar\">\n            <sha256 value=\"147af4e14a1984010d8f155e5e19d781f03c1d70dfed02a8e0d18428b8fc8682\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewpager-1.0.0.pom\">\n            <sha256 value=\"1f72f836339d03c6eb013f65075e76ca87075a577578eb4f95f74a3a5d253128\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.viewpager2\" name=\"viewpager2\" version=\"1.1.0\">\n         <artifact name=\"viewpager2-1.1.0-sources.jar\">\n            <sha256 value=\"2dfd4e7bd4009a7d0ad691f0bae351ef3bd2fdcb5fe3270b49216e47fb6262b9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewpager2-1.1.0.aar\">\n            <sha256 value=\"1934b5eff05c46215896b75bac065a7b63b13e3f0c8deacc0a9d54b207d9f53d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"viewpager2-1.1.0.module\">\n            <sha256 value=\"f4f492a0e9a3082e7de77d3eb1664b31c967e7b768d7e7586fbc493d36291a26\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.window\" name=\"window\" version=\"1.0.0\">\n         <artifact name=\"window-1.0.0.aar\">\n            <sha256 value=\"3212985be4127373ca4d0ea7f8b81a250ae2105e924f7940105d067a0f9ac130\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"window-1.0.0.module\">\n            <sha256 value=\"536773d2b2d65c26ce06b8c95e0fb415f1ad25d9b87330170f508689d3ad5ffb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.work\" name=\"work-runtime\" version=\"2.10.0\">\n         <artifact name=\"work-runtime-2.10.0.aar\">\n            <sha256 value=\"2ee10cd3345a7e6e37d50898fd0ebdd91e4a59267aa928effa8e507dae85c88b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"work-runtime-2.10.0.module\">\n            <sha256 value=\"465c1b4750092ebf0b031e06ecfd8011f7e15ace8dccb1e4c47d409f77becba0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.work\" name=\"work-runtime\" version=\"2.10.1\">\n         <artifact name=\"work-runtime-2.10.1.aar\">\n            <sha256 value=\"c5b97873987e50fbc19ddcab971a6a0f108087423a8cebd15c274db0d07e2245\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"work-runtime-2.10.1.module\">\n            <sha256 value=\"b79c3f92fbf9d3f19482472ad2c16ed1b590b542f26c55268e4991d3d1b8274a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.work\" name=\"work-runtime\" version=\"2.9.0\">\n         <artifact name=\"work-runtime-2.9.0.aar\">\n            <sha256 value=\"8b85f38aa826d902e8a88d2af9dc73a5f43f6618720485f16e742692c5a18f6f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"work-runtime-2.9.0.module\">\n            <sha256 value=\"94ac1c0cb2fa9e145e000e009ec22de8abecb70a654fd1cf8e9e8a0b02a7fd53\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.work\" name=\"work-runtime\" version=\"2.9.1\">\n         <artifact name=\"work-runtime-2.9.1.aar\">\n            <sha256 value=\"1be76486b894af179462941a39cab242b00d7235c3aeb4d756f45262b0c2e4a3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"work-runtime-2.9.1.module\">\n            <sha256 value=\"d544ed64c5cba1861f96f48acdf15f7a06894f3675a16aa815a99f3aa290946b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.work\" name=\"work-runtime-ktx\" version=\"2.10.0\">\n         <artifact name=\"work-runtime-ktx-2.10.0.aar\">\n            <sha256 value=\"8273692ccc17094d746cafd04b679f259cbf501b2ea8475e349fba24ed3976b9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"work-runtime-ktx-2.10.0.module\">\n            <sha256 value=\"80aa6dc6ec0cc210475c820a6d36dc8100d5da9aef7cccac081169a1a2502b04\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.work\" name=\"work-runtime-ktx\" version=\"2.10.1\">\n         <artifact name=\"work-runtime-ktx-2.10.1.aar\">\n            <sha256 value=\"7c9691b00b04aa92ec5fe03ef1738d168a86d2e2523af39e9e9e4761b997847d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"work-runtime-ktx-2.10.1.module\">\n            <sha256 value=\"bb5315eaf9f9cd93da3c6abd42546402ff9cfd960afe29c06bccb506368bfe87\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.work\" name=\"work-runtime-ktx\" version=\"2.9.0\">\n         <artifact name=\"work-runtime-ktx-2.9.0-sources.jar\">\n            <sha256 value=\"c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"work-runtime-ktx-2.9.0.aar\">\n            <sha256 value=\"3c2f9a0a51826f1ba747751d899d9857def9976c09f8ea90066b364abcb24a19\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"work-runtime-ktx-2.9.0.module\">\n            <sha256 value=\"49517d6afaa941627ecca80ae12bdd48d215a9c0222c8967babac7a9237e522a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.work\" name=\"work-runtime-ktx\" version=\"2.9.1\">\n         <artifact name=\"work-runtime-ktx-2.9.1.aar\">\n            <sha256 value=\"8f4cc53ac1879665b14d2f17ad4fbcb3045a4b74774250b99829b1c13f7b7728\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"work-runtime-ktx-2.9.1.module\">\n            <sha256 value=\"711fb95228d07347da52089dfb5d195c51a07dd75528ad51474c397196afb35c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.work\" name=\"work-testing\" version=\"2.10.0\">\n         <artifact name=\"work-testing-2.10.0.aar\">\n            <sha256 value=\"80eeb8a0ba60089ef0af4a006fa0a0be2b5b627497c332c2b07226f213261690\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"work-testing-2.10.0.module\">\n            <sha256 value=\"4a6dcc76dd6030f939904acb1f829c3056774ccd209ba3ede4a322b2191f7a14\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.work\" name=\"work-testing\" version=\"2.10.1\">\n         <artifact name=\"work-testing-2.10.1.aar\">\n            <sha256 value=\"96ee7b4577a50a83d5cd39bf1b98e5f66acce991de2fca4f3bbe0fb298c7da1b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"work-testing-2.10.1.module\">\n            <sha256 value=\"4dcf0587b80591b2f7a8c20083212c6f5e945e08fe947e927c1c7d01833dacf5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.work\" name=\"work-testing\" version=\"2.9.0\">\n         <artifact name=\"work-testing-2.9.0-sources.jar\">\n            <sha256 value=\"7ed3ec16b4203d209cec89f6e467d28359eba77de5cd9165b6430eea0a64eebf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"work-testing-2.9.0.aar\">\n            <sha256 value=\"b5dbe5a96430c0f6ba225f1b9d66ee3128408f73714b9919524510c9bf9f4efd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"work-testing-2.9.0.module\">\n            <sha256 value=\"b144f2d4de2f2ebe906ebd2cc5a208a97d06e1e84000bc209c947f280d80e7f4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"androidx.work\" name=\"work-testing\" version=\"2.9.1\">\n         <artifact name=\"work-testing-2.9.1.aar\">\n            <sha256 value=\"e9f7f54d8907f58912cb2020319351c43ea34e34c6f5eabd2433c531e9cde329\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"work-testing-2.9.1.module\">\n            <sha256 value=\"685e43a946f5bef2259be90cbd7e8bf16383d4e87e4d3840db8bc7d4de3d7dbe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"app.cash.licensee\" name=\"app.cash.licensee.gradle.plugin\" version=\"1.13.0\">\n         <artifact name=\"app.cash.licensee.gradle.plugin-1.13.0.pom\">\n            <sha256 value=\"e50cc03b32e3ff12a69ff5144ee3980d7580a96fc434846b7e5bb6c488bef2fb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"app.cash.licensee\" name=\"licensee-gradle-plugin\" version=\"1.13.0\">\n         <artifact name=\"licensee-gradle-plugin-1.13.0.jar\">\n            <sha256 value=\"b42f2d66d75c3ebcdf57f30aa0955424762f2df80e7b743922f6cdfec985daea\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"licensee-gradle-plugin-1.13.0.module\">\n            <sha256 value=\"7ea49de5191feb75e319253a10fd5bdf64063f208e6912d6b6742cd4cabb98cc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"app.cash.turbine\" name=\"turbine\" version=\"1.1.0\">\n         <artifact name=\"Turbine-metadata.jar\">\n            <sha256 value=\"ef32d46a2e2e04b748f8e105ebb96508ba2f7c0cf28f689a3160774f33bee22d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"turbine-1.1.0.module\">\n            <sha256 value=\"74c94344524b0ab306f2770f1daec40a273483652a492eae3b1bbf71dde4ce47\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"app.cash.turbine\" name=\"turbine\" version=\"1.2.0\">\n         <artifact name=\"Turbine-metadata.jar\">\n            <sha256 value=\"47d1bb42d67672735b0d12229c89ea25fdbdfb91f0de10b86511ce18ae175895\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"turbine-1.2.0.module\">\n            <sha256 value=\"722d2516c4d52721c5073b686db4b93a0016a54fbe809654a8bfc3c9b1f1b0a1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"app.cash.turbine\" name=\"turbine-jvm\" version=\"1.1.0\">\n         <artifact name=\"Turbine-jvm-sources.jar\">\n            <sha256 value=\"7fc495f7e1c208fd55d9945f1b5cda0db98b2a83b133ae0bf3a43679745b9282\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"Turbine-jvm.jar\">\n            <sha256 value=\"9b779f2390bc0e56c5f86cbf3552b0b41b53e4c2c2322b53ba1f796054026356\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"turbine-jvm-1.1.0.module\">\n            <sha256 value=\"ba7cc8f9f368b437ccb16a5af704167696cd4f00ea8e67ca7243acaff6c99cd3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"app.cash.turbine\" name=\"turbine-jvm\" version=\"1.2.0\">\n         <artifact name=\"Turbine-jvm.jar\">\n            <sha256 value=\"dcc2e85dbf7d4a0375eb9ff0d4587475e256914f7796aa6c006cc29b66b339da\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"turbine-jvm-1.2.0.module\">\n            <sha256 value=\"871a75a56657f942012f1dcc784c7a76fa9368a77988c7c5a57530769a96fe5a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"at.connyduck\" name=\"networkresult-calladapter\" version=\"1.1.0\">\n         <artifact name=\"networkresult-calladapter-1.1.0.jar\">\n            <sha256 value=\"61ab47bccfece072ad6f10ca5c775cfc7cb0625f747941e3bd92aaf8cd36f8e1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"networkresult-calladapter-1.1.0.module\">\n            <sha256 value=\"a71fdc421ba8c13bd1bbf7b9e6a4f3c7855c34c5881d9af3fd291101d6bdb727\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"at.connyduck\" name=\"networkresult-calladapter\" version=\"1.2.0\">\n         <artifact name=\"networkresult-calladapter-1.2.0.jar\">\n            <sha256 value=\"bfc30e6ee2d7d9a24ad341240e792e6e1abc6e46c30ac5f6f97354dadd718da7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"networkresult-calladapter-1.2.0.module\">\n            <sha256 value=\"90a3175b2f0f4234f88c607747767deb6f27135d113bf1b4960fda9568221a29\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"at.connyduck.sparkbutton\" name=\"sparkbutton\" version=\"4.2.0\">\n         <artifact name=\"sparkbutton-4.2.0-sources.jar\">\n            <sha256 value=\"449194742914537cb1907659e92d1d194a8c23bdfbf4bd82679b99774b3fefb3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sparkbutton-4.2.0.aar\">\n            <sha256 value=\"dfbf78d1ee8f633c59d3f928035729d3575ee9345317207848f1ad099e792433\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sparkbutton-4.2.0.module\">\n            <sha256 value=\"9dc4059c1d6233cc9c78a20b54a44b0a2b801da5b7fcefe2b7a5b695055172b2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"ch.qos.logback\" name=\"logback-classic\" version=\"1.3.5\">\n         <artifact name=\"logback-classic-1.3.5.jar\">\n            <sha256 value=\"9d68b9daf2fbb98a09b0445e0c64ac309d9d0e156b68510b63791397c97e32e4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"logback-classic-1.3.5.pom\">\n            <sha256 value=\"ec75ac871a3d1361dbb0f8db6d25035bab89a5ea973f184ab1efa91ceee846c5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"ch.qos.logback\" name=\"logback-core\" version=\"1.3.5\">\n         <artifact name=\"logback-core-1.3.5.jar\">\n            <sha256 value=\"b1f0ec393f2f5bbaf1decb61624de18386634c3197e9eed69d1c1234ddd756f3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"logback-core-1.3.5.pom\">\n            <sha256 value=\"1e0746253f03f7de6f5bbd154336aa4d758694210f69cfff6e8eb5f8efc35528\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"ch.qos.logback\" name=\"logback-parent\" version=\"1.3.5\">\n         <artifact name=\"logback-parent-1.3.5.pom\">\n            <sha256 value=\"11800a2d0a4bcd442964da561c11a11f16e44b89fea6b10a891a109228079f5b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.almworks.sqlite4java\" name=\"sqlite4java\" version=\"1.0.392\">\n         <artifact name=\"sqlite4java-1.0.392.jar\">\n            <sha256 value=\"243a64470fda0e86a6fddeb0af4c7aa9426ce84e68cbfe18d75ee5da4b7e0b92\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sqlite4java-1.0.392.pom\">\n            <sha256 value=\"139552c586a57bf6d98f87d6b7e23fef4db53cf74097be962f7868e3606c79d2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"signflinger\" version=\"8.10.0\">\n         <artifact name=\"signflinger-8.10.0.jar\">\n            <sha256 value=\"c1dca2c683634ee1a294298f9c7179578af6a86e080bdc40f961915bc5c8142f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"signflinger-8.10.0.pom\">\n            <sha256 value=\"7beffc5f086a9c65e7e3c26f43f770ec65355553c65cf6ef57556601cbe8e0f8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"signflinger\" version=\"8.4.1\">\n         <artifact name=\"signflinger-8.4.1.jar\">\n            <sha256 value=\"c1dca2c683634ee1a294298f9c7179578af6a86e080bdc40f961915bc5c8142f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"signflinger-8.4.1.pom\">\n            <sha256 value=\"2f90457ef7453e9a2bc0e1797c1e049db3eab2c1f4b0b6952677c7f093c76433\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"signflinger\" version=\"8.4.2\">\n         <artifact name=\"signflinger-8.4.2.jar\">\n            <sha256 value=\"c1dca2c683634ee1a294298f9c7179578af6a86e080bdc40f961915bc5c8142f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"signflinger-8.4.2.pom\">\n            <sha256 value=\"3b7e471c7a791b7d5a0bbe632ae029ae5d79835861fed14f9d2fec4c5970c5a2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"signflinger\" version=\"8.5.0\">\n         <artifact name=\"signflinger-8.5.0.jar\">\n            <sha256 value=\"c1dca2c683634ee1a294298f9c7179578af6a86e080bdc40f961915bc5c8142f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"signflinger-8.5.0.pom\">\n            <sha256 value=\"a5a43e06e4ab2bdf78fdc825e19a94f08937eb2941c2ab66867fef76961918d5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"signflinger\" version=\"8.5.1\">\n         <artifact name=\"signflinger-8.5.1.jar\">\n            <sha256 value=\"c1dca2c683634ee1a294298f9c7179578af6a86e080bdc40f961915bc5c8142f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"signflinger-8.5.1.pom\">\n            <sha256 value=\"98c5d425d6e6c17bfda601f855affb17483177879eb5bce938715f6bf8e7dd7f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"signflinger\" version=\"8.5.2\">\n         <artifact name=\"signflinger-8.5.2.jar\">\n            <sha256 value=\"c1dca2c683634ee1a294298f9c7179578af6a86e080bdc40f961915bc5c8142f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"signflinger-8.5.2.pom\">\n            <sha256 value=\"62c8ec50b943b7347c3dc5f0333851b52883155f0ccb04d642338d952ce0448a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"signflinger\" version=\"8.6.0\">\n         <artifact name=\"signflinger-8.6.0.jar\">\n            <sha256 value=\"c1dca2c683634ee1a294298f9c7179578af6a86e080bdc40f961915bc5c8142f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"signflinger-8.6.0.pom\">\n            <sha256 value=\"57d4a4f555625c085c51f18283bb6219cc5d6def1f6e24b4708da904aed81521\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"signflinger\" version=\"8.6.1\">\n         <artifact name=\"signflinger-8.6.1.jar\">\n            <sha256 value=\"c1dca2c683634ee1a294298f9c7179578af6a86e080bdc40f961915bc5c8142f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"signflinger-8.6.1.pom\">\n            <sha256 value=\"1f164d02dfe2ba3e015d02e3f24820de246592d917f1e00f91a1a769361af99d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"signflinger\" version=\"8.7.0\">\n         <artifact name=\"signflinger-8.7.0.jar\">\n            <sha256 value=\"c1dca2c683634ee1a294298f9c7179578af6a86e080bdc40f961915bc5c8142f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"signflinger-8.7.0.pom\">\n            <sha256 value=\"de76686bedf5d56b0d2e04adc7b204b6162a52b530360de4947634b9a4d67c60\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"signflinger\" version=\"8.7.1\">\n         <artifact name=\"signflinger-8.7.1.jar\">\n            <sha256 value=\"c1dca2c683634ee1a294298f9c7179578af6a86e080bdc40f961915bc5c8142f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"signflinger-8.7.1.pom\">\n            <sha256 value=\"542701447d6f00635f1be0c8b5c79b0d6fc4ac417ad8f614fea2a118ea106085\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"signflinger\" version=\"8.7.2\">\n         <artifact name=\"signflinger-8.7.2.jar\">\n            <sha256 value=\"c1dca2c683634ee1a294298f9c7179578af6a86e080bdc40f961915bc5c8142f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"signflinger-8.7.2.pom\">\n            <sha256 value=\"f8d973e56a41ef1ea484e5cfee6d9a205732ad31a8bf9c41a468dc1ffa0ab095\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"signflinger\" version=\"8.7.3\">\n         <artifact name=\"signflinger-8.7.3.jar\">\n            <sha256 value=\"c1dca2c683634ee1a294298f9c7179578af6a86e080bdc40f961915bc5c8142f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"signflinger-8.7.3.pom\">\n            <sha256 value=\"fc46c15cdfbcb219dad5d96ecec774022926ccff993263843beb2b532ba9da1f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"signflinger\" version=\"8.8.0\">\n         <artifact name=\"signflinger-8.8.0.jar\">\n            <sha256 value=\"c1dca2c683634ee1a294298f9c7179578af6a86e080bdc40f961915bc5c8142f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"signflinger-8.8.0.pom\">\n            <sha256 value=\"006d0fedd858c18f36a303e1de9fdf006907031bcf47f3640bcdc197bb3efb30\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"signflinger\" version=\"8.8.1\">\n         <artifact name=\"signflinger-8.8.1.jar\">\n            <sha256 value=\"c1dca2c683634ee1a294298f9c7179578af6a86e080bdc40f961915bc5c8142f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"signflinger-8.8.1.pom\">\n            <sha256 value=\"9f89e18669fb2e8914866fa9a402c2b662e8fb781c8fb2f29b83e86ec8c62334\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"signflinger\" version=\"8.8.2\">\n         <artifact name=\"signflinger-8.8.2.jar\">\n            <sha256 value=\"c1dca2c683634ee1a294298f9c7179578af6a86e080bdc40f961915bc5c8142f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"signflinger-8.8.2.pom\">\n            <sha256 value=\"d6c9634d64aae0ce84e2106f176f6075548103d3fd582354b8ca04491fbeeb67\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"signflinger\" version=\"8.9.0\">\n         <artifact name=\"signflinger-8.9.0.jar\">\n            <sha256 value=\"c1dca2c683634ee1a294298f9c7179578af6a86e080bdc40f961915bc5c8142f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"signflinger-8.9.0.pom\">\n            <sha256 value=\"380ad60305015c3c89357ca0e4a3f42182430e16cb27cc655aa3b875c2d1d138\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"signflinger\" version=\"8.9.1\">\n         <artifact name=\"signflinger-8.9.1.jar\">\n            <sha256 value=\"c1dca2c683634ee1a294298f9c7179578af6a86e080bdc40f961915bc5c8142f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"signflinger-8.9.1.pom\">\n            <sha256 value=\"b139893d5786ae41d301d2857a46bfd7fbf025f8c751bdae98a84313290705d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"signflinger\" version=\"8.9.2\">\n         <artifact name=\"signflinger-8.9.2.jar\">\n            <sha256 value=\"c1dca2c683634ee1a294298f9c7179578af6a86e080bdc40f961915bc5c8142f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"signflinger-8.9.2.pom\">\n            <sha256 value=\"603073d348b52bb0a043d1c8f694ad2cd3fac6bc892657224c9e77e1960addc9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"zipflinger\" version=\"8.10.0\">\n         <artifact name=\"zipflinger-8.10.0.jar\">\n            <sha256 value=\"ba1f32aa255abe4dab66571dd9195305d3027f261f9f4f465898b30cdffd09b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"zipflinger-8.10.0.pom\">\n            <sha256 value=\"a6a10605079cb967f6100d26f2d8b5800d683d32f51f8e9c76c2c718851bd557\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"zipflinger\" version=\"8.4.1\">\n         <artifact name=\"zipflinger-8.4.1.jar\">\n            <sha256 value=\"81dd485618a509a3235929b9eb13091d884452661de6ce5a45cc38b1c555421c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"zipflinger-8.4.1.pom\">\n            <sha256 value=\"1f52e3f76df70c4d40c0af93297ae37949aac8f8aab534edae0ab61f69b02660\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"zipflinger\" version=\"8.4.2\">\n         <artifact name=\"zipflinger-8.4.2.jar\">\n            <sha256 value=\"81dd485618a509a3235929b9eb13091d884452661de6ce5a45cc38b1c555421c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"zipflinger-8.4.2.pom\">\n            <sha256 value=\"25977ab325653fb5e3318b323dc697c331b83d015d5b209b8c463fee7861e11d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"zipflinger\" version=\"8.5.0\">\n         <artifact name=\"zipflinger-8.5.0.jar\">\n            <sha256 value=\"81dd485618a509a3235929b9eb13091d884452661de6ce5a45cc38b1c555421c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"zipflinger-8.5.0.pom\">\n            <sha256 value=\"be4acb90c8bc1dab0981469af66985878eba2abcdc748339e5405a23ba9ab021\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"zipflinger\" version=\"8.5.1\">\n         <artifact name=\"zipflinger-8.5.1.jar\">\n            <sha256 value=\"81dd485618a509a3235929b9eb13091d884452661de6ce5a45cc38b1c555421c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"zipflinger-8.5.1.pom\">\n            <sha256 value=\"1fad4601de2e952b310a47f56f5a5136ecdbdb368dbec5f353a9d0f6da172c35\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"zipflinger\" version=\"8.5.2\">\n         <artifact name=\"zipflinger-8.5.2.jar\">\n            <sha256 value=\"81dd485618a509a3235929b9eb13091d884452661de6ce5a45cc38b1c555421c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"zipflinger-8.5.2.pom\">\n            <sha256 value=\"4afd8e1ccea8df993683909bc1538f041deadb6a119f73dcb3d76d27e8ad0758\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"zipflinger\" version=\"8.6.0\">\n         <artifact name=\"zipflinger-8.6.0.jar\">\n            <sha256 value=\"81dd485618a509a3235929b9eb13091d884452661de6ce5a45cc38b1c555421c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"zipflinger-8.6.0.pom\">\n            <sha256 value=\"5c3cf039b36c0903a011d9f3b4d5342ccb2199c1e68daa1ac7901c399c1ca0f5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"zipflinger\" version=\"8.6.1\">\n         <artifact name=\"zipflinger-8.6.1.jar\">\n            <sha256 value=\"81dd485618a509a3235929b9eb13091d884452661de6ce5a45cc38b1c555421c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"zipflinger-8.6.1.pom\">\n            <sha256 value=\"e51dcd81706654f745e141d4531c37958df1ac47ee9cd756212bd61a7758c745\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"zipflinger\" version=\"8.7.0\">\n         <artifact name=\"zipflinger-8.7.0.jar\">\n            <sha256 value=\"81dd485618a509a3235929b9eb13091d884452661de6ce5a45cc38b1c555421c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"zipflinger-8.7.0.pom\">\n            <sha256 value=\"9f9c3c486ca9ba74f808154558b73945757bf8c12165ce8346f496cf38e87c9d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"zipflinger\" version=\"8.7.1\">\n         <artifact name=\"zipflinger-8.7.1.jar\">\n            <sha256 value=\"81dd485618a509a3235929b9eb13091d884452661de6ce5a45cc38b1c555421c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"zipflinger-8.7.1.pom\">\n            <sha256 value=\"401fed154fcca5171efd5ba5d8aefe7a4cc4fef89d0e8e28ecda1498f35924eb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"zipflinger\" version=\"8.7.2\">\n         <artifact name=\"zipflinger-8.7.2.jar\">\n            <sha256 value=\"81dd485618a509a3235929b9eb13091d884452661de6ce5a45cc38b1c555421c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"zipflinger-8.7.2.pom\">\n            <sha256 value=\"250ce405b21a039c65d3a0a44f0370cf599f8d1fe6410906d0d98f4f99bacfc9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"zipflinger\" version=\"8.7.3\">\n         <artifact name=\"zipflinger-8.7.3.jar\">\n            <sha256 value=\"81dd485618a509a3235929b9eb13091d884452661de6ce5a45cc38b1c555421c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"zipflinger-8.7.3.pom\">\n            <sha256 value=\"7a847e140903435558c84703a90a52fb5486c8b767e0c8b1ace913554b2a5b98\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"zipflinger\" version=\"8.8.0\">\n         <artifact name=\"zipflinger-8.8.0.jar\">\n            <sha256 value=\"81dd485618a509a3235929b9eb13091d884452661de6ce5a45cc38b1c555421c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"zipflinger-8.8.0.pom\">\n            <sha256 value=\"efaa8298484a0f6908be1790156e87ef9962255198a9588cb899e6db91be606f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"zipflinger\" version=\"8.8.1\">\n         <artifact name=\"zipflinger-8.8.1.jar\">\n            <sha256 value=\"81dd485618a509a3235929b9eb13091d884452661de6ce5a45cc38b1c555421c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"zipflinger-8.8.1.pom\">\n            <sha256 value=\"739546d67ef3756f7b0b9b400bbd811cc05fad4ae0d6fddd9d38f7ba171108f4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"zipflinger\" version=\"8.8.2\">\n         <artifact name=\"zipflinger-8.8.2.jar\">\n            <sha256 value=\"81dd485618a509a3235929b9eb13091d884452661de6ce5a45cc38b1c555421c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"zipflinger-8.8.2.pom\">\n            <sha256 value=\"148c7db9eb6e672f7a5d74914c38d2aa5a4ef466dc0beb6d4285eed77711ae9f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"zipflinger\" version=\"8.9.0\">\n         <artifact name=\"zipflinger-8.9.0.jar\">\n            <sha256 value=\"81dd485618a509a3235929b9eb13091d884452661de6ce5a45cc38b1c555421c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"zipflinger-8.9.0.pom\">\n            <sha256 value=\"eccd9789ae3d9c1d146c2ddc4bc8b7357b8d4928458053605b357e53871dabf6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"zipflinger\" version=\"8.9.1\">\n         <artifact name=\"zipflinger-8.9.1.jar\">\n            <sha256 value=\"81dd485618a509a3235929b9eb13091d884452661de6ce5a45cc38b1c555421c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"zipflinger-8.9.1.pom\">\n            <sha256 value=\"8e53cca7bf0ab800044c410179c4d08a0158d1bb35e152e329f632f81ec1570d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android\" name=\"zipflinger\" version=\"8.9.2\">\n         <artifact name=\"zipflinger-8.9.2.jar\">\n            <sha256 value=\"ba1f32aa255abe4dab66571dd9195305d3027f261f9f4f465898b30cdffd09b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"zipflinger-8.9.2.pom\">\n            <sha256 value=\"3cf626b9b15eee96fe7eacc8f59b0416ac0a647cd14f6b9a0bd6c01d11fae372\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.application\" name=\"com.android.application.gradle.plugin\" version=\"8.10.0\">\n         <artifact name=\"com.android.application.gradle.plugin-8.10.0.pom\">\n            <sha256 value=\"d963c3215f57862138debee928da7e43ac50e4f8232b299cd2e871c2e941937e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.application\" name=\"com.android.application.gradle.plugin\" version=\"8.4.1\">\n         <artifact name=\"com.android.application.gradle.plugin-8.4.1.pom\">\n            <sha256 value=\"7b31439a481ae18152bba5b3d416099c215cd6cbbd4ee48cac24d6ed53b2d4a5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.application\" name=\"com.android.application.gradle.plugin\" version=\"8.4.2\">\n         <artifact name=\"com.android.application.gradle.plugin-8.4.2.pom\">\n            <sha256 value=\"1f30c798b3a279a9b8703bc37d49d4fe6c329b743b99b8e0c74e7798f30f91e4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.application\" name=\"com.android.application.gradle.plugin\" version=\"8.5.0\">\n         <artifact name=\"com.android.application.gradle.plugin-8.5.0.pom\">\n            <sha256 value=\"3c76fdfc6feb259fa5a97f00f179d83ab8af62462730429a39742ec53bdff2d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.application\" name=\"com.android.application.gradle.plugin\" version=\"8.5.1\">\n         <artifact name=\"com.android.application.gradle.plugin-8.5.1.pom\">\n            <sha256 value=\"dd915d20ce7169b41d5617e6c45c0d42eb38eb5eda236ad29a7bd472354ec6ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.application\" name=\"com.android.application.gradle.plugin\" version=\"8.5.2\">\n         <artifact name=\"com.android.application.gradle.plugin-8.5.2.pom\">\n            <sha256 value=\"a049a1ce70b5c653cda692f883bccd9eb853b86c25cdce0e30d85882d2b1f383\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.application\" name=\"com.android.application.gradle.plugin\" version=\"8.6.0\">\n         <artifact name=\"com.android.application.gradle.plugin-8.6.0.pom\">\n            <sha256 value=\"6315ac5ffbcbfb9f5dd9d4f373b4504e4173cfb5f8d9f85c9b48c32d0c1a5899\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.application\" name=\"com.android.application.gradle.plugin\" version=\"8.6.1\">\n         <artifact name=\"com.android.application.gradle.plugin-8.6.1.pom\">\n            <sha256 value=\"3670136d79fa82cf01accde040139b0602d397e9f0a374559ba96f2ed596d96b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.application\" name=\"com.android.application.gradle.plugin\" version=\"8.7.0\">\n         <artifact name=\"com.android.application.gradle.plugin-8.7.0.pom\">\n            <sha256 value=\"ee1e59c02e097954baedab7129bc67d1c00d4927e80053cc2d3d930758623d05\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.application\" name=\"com.android.application.gradle.plugin\" version=\"8.7.1\">\n         <artifact name=\"com.android.application.gradle.plugin-8.7.1.pom\">\n            <sha256 value=\"bedfeb7f739f73689058ff884f62478b31fc8b4d0b99b13af1410f823004e547\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.application\" name=\"com.android.application.gradle.plugin\" version=\"8.7.2\">\n         <artifact name=\"com.android.application.gradle.plugin-8.7.2.pom\">\n            <sha256 value=\"b34094c9fd89bde872f0bcfa87d77efbe1d16f4b4a9cbcfae1dc48d9e355c835\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.application\" name=\"com.android.application.gradle.plugin\" version=\"8.7.3\">\n         <artifact name=\"com.android.application.gradle.plugin-8.7.3.pom\">\n            <sha256 value=\"9458d46617319576d37fbec2ec7330061ef4b666df8538a375bc53986229b914\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.application\" name=\"com.android.application.gradle.plugin\" version=\"8.8.0\">\n         <artifact name=\"com.android.application.gradle.plugin-8.8.0.pom\">\n            <sha256 value=\"f55b798d129f2cb451c6696c208209ff447b2036f56ed22f59db70c75c122e73\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.application\" name=\"com.android.application.gradle.plugin\" version=\"8.8.1\">\n         <artifact name=\"com.android.application.gradle.plugin-8.8.1.pom\">\n            <sha256 value=\"0a58984c78430586759862f05cea8f27d245ae39c97c594fc7598e6236d7dd71\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.application\" name=\"com.android.application.gradle.plugin\" version=\"8.8.2\">\n         <artifact name=\"com.android.application.gradle.plugin-8.8.2.pom\">\n            <sha256 value=\"54a49f69ee41919f39f00a7d74be36e686189801237002b520e28fc770092c2d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.application\" name=\"com.android.application.gradle.plugin\" version=\"8.9.0\">\n         <artifact name=\"com.android.application.gradle.plugin-8.9.0.pom\">\n            <sha256 value=\"c8802116e731a16c5e7b642ee675ef7915d71d132b5b4aa7f4ad9f1d75c13ad5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.application\" name=\"com.android.application.gradle.plugin\" version=\"8.9.1\">\n         <artifact name=\"com.android.application.gradle.plugin-8.9.1.pom\">\n            <sha256 value=\"3bb7b9d8fde0726cf1085c991bd04fa6075ffc21954eae974ed1ee7d7ff28ac7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.application\" name=\"com.android.application.gradle.plugin\" version=\"8.9.2\">\n         <artifact name=\"com.android.application.gradle.plugin-8.9.2.pom\">\n            <sha256 value=\"d087fd83e95cd3a11368aa37f4c7b7f8b8b0fc48cdc51c84ae3665716463010c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.databinding\" name=\"baseLibrary\" version=\"8.10.0\">\n         <artifact name=\"baseLibrary-8.10.0.jar\">\n            <sha256 value=\"794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"baseLibrary-8.10.0.pom\">\n            <sha256 value=\"bd76288b6185f7d3aa4e9887023368078e57d08f4dbe628b33ccdbae23d836e6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.databinding\" name=\"baseLibrary\" version=\"8.4.1\">\n         <artifact name=\"baseLibrary-8.4.1.jar\">\n            <sha256 value=\"794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"baseLibrary-8.4.1.pom\">\n            <sha256 value=\"8d6d83207f9ab92f4d0a62555c1562e6a70995c3ccb56ecd1417c70927fd7117\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.databinding\" name=\"baseLibrary\" version=\"8.4.2\">\n         <artifact name=\"baseLibrary-8.4.2.jar\">\n            <sha256 value=\"794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"baseLibrary-8.4.2.pom\">\n            <sha256 value=\"d169bf83ecc4cbb0e4dd621fc5f2267abdf57ced812981cd4205d0b49fa38c6a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.databinding\" name=\"baseLibrary\" version=\"8.5.0\">\n         <artifact name=\"baseLibrary-8.5.0.jar\">\n            <sha256 value=\"794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"baseLibrary-8.5.0.pom\">\n            <sha256 value=\"f609e4b4743e8edec514bc5d84d78abc324478817eb3dd529e1e731da4160019\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.databinding\" name=\"baseLibrary\" version=\"8.5.1\">\n         <artifact name=\"baseLibrary-8.5.1.jar\">\n            <sha256 value=\"794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"baseLibrary-8.5.1.pom\">\n            <sha256 value=\"54e3ee4ca2a39b85b8c8dcbaf80801285357657fd840ddd088e2b59706ba0b0a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.databinding\" name=\"baseLibrary\" version=\"8.5.2\">\n         <artifact name=\"baseLibrary-8.5.2.jar\">\n            <sha256 value=\"794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"baseLibrary-8.5.2.pom\">\n            <sha256 value=\"d32bbba1477cf375460c2e9730ec8f6fbc99832396b6ec316dea96101eb7d520\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.databinding\" name=\"baseLibrary\" version=\"8.6.0\">\n         <artifact name=\"baseLibrary-8.6.0.jar\">\n            <sha256 value=\"794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"baseLibrary-8.6.0.pom\">\n            <sha256 value=\"516ed20a2424e418fb046f8020b509b6468bcc5d971aa7d1d5f9846bf4fc7150\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.databinding\" name=\"baseLibrary\" version=\"8.6.1\">\n         <artifact name=\"baseLibrary-8.6.1.jar\">\n            <sha256 value=\"794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"baseLibrary-8.6.1.pom\">\n            <sha256 value=\"2de93fb6fa4bb5d14f0b9dc7a5f70cf8c27133b689df5b47c9fe4af99702fec2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.databinding\" name=\"baseLibrary\" version=\"8.7.0\">\n         <artifact name=\"baseLibrary-8.7.0.jar\">\n            <sha256 value=\"794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"baseLibrary-8.7.0.pom\">\n            <sha256 value=\"b29b9c863ad59ef788fd017e52cc530b9f71114dd25c11f0aefc1ec037530b9c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.databinding\" name=\"baseLibrary\" version=\"8.7.1\">\n         <artifact name=\"baseLibrary-8.7.1.jar\">\n            <sha256 value=\"794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"baseLibrary-8.7.1.pom\">\n            <sha256 value=\"3ef1746e09bd4810b3d4d0c5dcfd0ff20315b32ccbe75bb649bb086f3ecf6618\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.databinding\" name=\"baseLibrary\" version=\"8.7.2\">\n         <artifact name=\"baseLibrary-8.7.2.jar\">\n            <sha256 value=\"794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"baseLibrary-8.7.2.pom\">\n            <sha256 value=\"39c6d31e166b6d4ff4f6f0932df0799156680d57e25f713c58402a3009b3b13f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.databinding\" name=\"baseLibrary\" version=\"8.7.3\">\n         <artifact name=\"baseLibrary-8.7.3.jar\">\n            <sha256 value=\"794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"baseLibrary-8.7.3.pom\">\n            <sha256 value=\"dedfa191214825ff3e35438dd3071930c61f17f837873eb6eb1be9c2a43dec9e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.databinding\" name=\"baseLibrary\" version=\"8.8.0\">\n         <artifact name=\"baseLibrary-8.8.0.jar\">\n            <sha256 value=\"794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"baseLibrary-8.8.0.pom\">\n            <sha256 value=\"b54d2d2ef426b7e4550a8dc0379bf40160dcfca1b3d936954014417579a5cba3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.databinding\" name=\"baseLibrary\" version=\"8.8.1\">\n         <artifact name=\"baseLibrary-8.8.1.jar\">\n            <sha256 value=\"794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"baseLibrary-8.8.1.pom\">\n            <sha256 value=\"86d43dd0cdeeb6305bba8248ad48dbef5292ab65b9a034f6b917f22fc26b10e9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.databinding\" name=\"baseLibrary\" version=\"8.8.2\">\n         <artifact name=\"baseLibrary-8.8.2.jar\">\n            <sha256 value=\"794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"baseLibrary-8.8.2.pom\">\n            <sha256 value=\"6e3fc1574342395d1b41011f5392bcfa5dcb00549a6ab9444bc2e163a55dd2a1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.databinding\" name=\"baseLibrary\" version=\"8.9.0\">\n         <artifact name=\"baseLibrary-8.9.0.jar\">\n            <sha256 value=\"794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"baseLibrary-8.9.0.pom\">\n            <sha256 value=\"3aeb5e8276bebbbbe592c9ecc4ffbb3443a3a13f30a549715b8b28fcc7714d4e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.databinding\" name=\"baseLibrary\" version=\"8.9.1\">\n         <artifact name=\"baseLibrary-8.9.1.jar\">\n            <sha256 value=\"794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"baseLibrary-8.9.1.pom\">\n            <sha256 value=\"dad058f6692905d907f32b3dacf61685666b76b50d979723d13bf7b6dad85303\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.databinding\" name=\"baseLibrary\" version=\"8.9.2\">\n         <artifact name=\"baseLibrary-8.9.2.jar\">\n            <sha256 value=\"794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"baseLibrary-8.9.2.pom\">\n            <sha256 value=\"51a0b6a0a6c8634e89f60d759c485398840f18fd1f879273dcc1a052bfc0b10a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"annotations\" version=\"31.10.0\">\n         <artifact name=\"annotations-31.10.0.jar\">\n            <sha256 value=\"b25995fa7b220d35fbb8e325df071f8291691bfbaff9734c98e38f45ec2a73ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-31.10.0.pom\">\n            <sha256 value=\"49ab4c05bb1fa2a82fb849d7828254810e6ef47ab190028bca7c69a915c9cc2e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"annotations\" version=\"31.4.1\">\n         <artifact name=\"annotations-31.4.1.jar\">\n            <sha256 value=\"25e8825547de7146d08fa18f04ef934ee1e6aec52e4c97ffa510a8f0f44b07a0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-31.4.1.pom\">\n            <sha256 value=\"0ecb544939cb910df229096e8a6bbe9f05912e846ea36c885c39432f802bbdbc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"annotations\" version=\"31.4.2\">\n         <artifact name=\"annotations-31.4.2.jar\">\n            <sha256 value=\"25e8825547de7146d08fa18f04ef934ee1e6aec52e4c97ffa510a8f0f44b07a0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-31.4.2.pom\">\n            <sha256 value=\"85200d12613062f2bd913affeacb4a8bb1061762db3f6f51041eca8424f7a80e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"annotations\" version=\"31.5.0\">\n         <artifact name=\"annotations-31.5.0.jar\">\n            <sha256 value=\"b25995fa7b220d35fbb8e325df071f8291691bfbaff9734c98e38f45ec2a73ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-31.5.0.pom\">\n            <sha256 value=\"372cd3363009e54aae8b96fe2e7681234913ae966c696c0e5b065d3f628af342\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"annotations\" version=\"31.5.1\">\n         <artifact name=\"annotations-31.5.1.jar\">\n            <sha256 value=\"b25995fa7b220d35fbb8e325df071f8291691bfbaff9734c98e38f45ec2a73ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-31.5.1.pom\">\n            <sha256 value=\"fc2d1b33e72f1a5da891043822fd429ee402916f30528a066d584d34c6fa2816\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"annotations\" version=\"31.5.2\">\n         <artifact name=\"annotations-31.5.2.jar\">\n            <sha256 value=\"b25995fa7b220d35fbb8e325df071f8291691bfbaff9734c98e38f45ec2a73ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-31.5.2.pom\">\n            <sha256 value=\"6a41f14ff91181f36d6d25f417ed6f1b154d543cf9a16d1cce9ba97b4ebb4e1b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"annotations\" version=\"31.6.0\">\n         <artifact name=\"annotations-31.6.0.jar\">\n            <sha256 value=\"b25995fa7b220d35fbb8e325df071f8291691bfbaff9734c98e38f45ec2a73ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-31.6.0.pom\">\n            <sha256 value=\"18161b3862570c69cdf0eb5a795ce1be2be312367674e7d4d0385c47fc7ae540\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"annotations\" version=\"31.6.1\">\n         <artifact name=\"annotations-31.6.1.jar\">\n            <sha256 value=\"b25995fa7b220d35fbb8e325df071f8291691bfbaff9734c98e38f45ec2a73ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-31.6.1.pom\">\n            <sha256 value=\"216463d13eadbfe172ad795effdf3f85661614bbcad315b2201b38cfd87ceb9d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"annotations\" version=\"31.7.0\">\n         <artifact name=\"annotations-31.7.0.jar\">\n            <sha256 value=\"b25995fa7b220d35fbb8e325df071f8291691bfbaff9734c98e38f45ec2a73ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-31.7.0.pom\">\n            <sha256 value=\"8518f36df1ccd1b2458c64611a55cabbdce00a2e5cc8be4fbd573a6562bba542\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"annotations\" version=\"31.7.1\">\n         <artifact name=\"annotations-31.7.1.jar\">\n            <sha256 value=\"b25995fa7b220d35fbb8e325df071f8291691bfbaff9734c98e38f45ec2a73ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-31.7.1.pom\">\n            <sha256 value=\"fabdb9a0f984182fe2e896e8add165d951047d35dcc96a87fd54719184cbf417\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"annotations\" version=\"31.7.2\">\n         <artifact name=\"annotations-31.7.2.jar\">\n            <sha256 value=\"b25995fa7b220d35fbb8e325df071f8291691bfbaff9734c98e38f45ec2a73ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-31.7.2.pom\">\n            <sha256 value=\"80fbdde80a6b0ad120916ba48714b4629a4312106e01219ee1d671bb2908d8e5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"annotations\" version=\"31.7.3\">\n         <artifact name=\"annotations-31.7.3.jar\">\n            <sha256 value=\"b25995fa7b220d35fbb8e325df071f8291691bfbaff9734c98e38f45ec2a73ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-31.7.3.pom\">\n            <sha256 value=\"2208238d471c0ab92c6ac7a059a0a9ec835d5ae1392aaf0bb24e455b70fd6b4b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"annotations\" version=\"31.8.0\">\n         <artifact name=\"annotations-31.8.0.jar\">\n            <sha256 value=\"b25995fa7b220d35fbb8e325df071f8291691bfbaff9734c98e38f45ec2a73ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-31.8.0.pom\">\n            <sha256 value=\"8f8ad1bd1091eb56cd0841b24cc6b5dc712aabbed11b314abe958f0beba28685\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"annotations\" version=\"31.8.1\">\n         <artifact name=\"annotations-31.8.1.jar\">\n            <sha256 value=\"b25995fa7b220d35fbb8e325df071f8291691bfbaff9734c98e38f45ec2a73ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-31.8.1.pom\">\n            <sha256 value=\"2d4e3b32b9ff63d3b946888794be2c6127e59000479d308d1e5e4c15c32d8fb6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"annotations\" version=\"31.8.2\">\n         <artifact name=\"annotations-31.8.2.jar\">\n            <sha256 value=\"b25995fa7b220d35fbb8e325df071f8291691bfbaff9734c98e38f45ec2a73ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-31.8.2.pom\">\n            <sha256 value=\"39ff5fa61e6bfd7d97331fb5d4ba7dcd9fe606f887d8e98039e1f900134297d0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"annotations\" version=\"31.9.0\">\n         <artifact name=\"annotations-31.9.0.jar\">\n            <sha256 value=\"b25995fa7b220d35fbb8e325df071f8291691bfbaff9734c98e38f45ec2a73ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-31.9.0.pom\">\n            <sha256 value=\"d659b6f5ddfd26cdf3ac1b79e8e9d10e181006c4f8a60b3097506595f14f166e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"annotations\" version=\"31.9.1\">\n         <artifact name=\"annotations-31.9.1.jar\">\n            <sha256 value=\"b25995fa7b220d35fbb8e325df071f8291691bfbaff9734c98e38f45ec2a73ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-31.9.1.pom\">\n            <sha256 value=\"e9a963749b610e8b1a6b0bf137622cc40a1c8ce8016d153fe678b4bafb14a127\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"annotations\" version=\"31.9.2\">\n         <artifact name=\"annotations-31.9.2.jar\">\n            <sha256 value=\"b25995fa7b220d35fbb8e325df071f8291691bfbaff9734c98e38f45ec2a73ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-31.9.2.pom\">\n            <sha256 value=\"a275147e84ad1e356387442bb79a69f33e98bb24f1da8d32f8fe6c61bde2b347\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"common\" version=\"31.10.0\">\n         <artifact name=\"common-31.10.0.jar\">\n            <sha256 value=\"de8750cbaab04d6f20e53736c26933441727d75f4a7a81e33991d836f8a98b6f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"common-31.10.0.pom\">\n            <sha256 value=\"e3d2c995521a2ff30266105895e863d2411e1eeb9e04e80801e46504d666ef1c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"common\" version=\"31.4.1\">\n         <artifact name=\"common-31.4.1.jar\">\n            <sha256 value=\"37a718ab8453e4152aa75bb898aaad3d80473a9a69663f0c3d3cdb63b130cc3e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"common-31.4.1.pom\">\n            <sha256 value=\"2b5c7803cdb2712b908efb74c35aa1a5d31631beaae61f5a1e4f07325d2f02e9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"common\" version=\"31.4.2\">\n         <artifact name=\"common-31.4.2.jar\">\n            <sha256 value=\"ad5a602603bdc34688c71dd14de85ba72851cb393bcc6bcfc6d0ff46bd77a40a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"common-31.4.2.pom\">\n            <sha256 value=\"8011158cabb3ee615926342ec60c8f02e60193c7830110c81845af38eb06fe56\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"common\" version=\"31.5.0\">\n         <artifact name=\"common-31.5.0.jar\">\n            <sha256 value=\"a9247467a3a4db53d8e839be6c6ff114ba8f364a1034827d11391c5385cb3ddd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"common-31.5.0.pom\">\n            <sha256 value=\"68c1120187945862450b40d1c6ce1a2cc1454713b40a78268e887fb0aed9eb64\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"common\" version=\"31.5.1\">\n         <artifact name=\"common-31.5.1.jar\">\n            <sha256 value=\"064cb2b0ee064d7144d3279a8a38b2b47fa834e1a9fb08aad2b1d215779880b9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"common-31.5.1.pom\">\n            <sha256 value=\"cc910f177c506d2c63591c1b45ba8f330acfdd1d980438c8f7c94d0bd0d2b802\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"common\" version=\"31.5.2\">\n         <artifact name=\"common-31.5.2.jar\">\n            <sha256 value=\"ebfb15bf3c16b4037653c8180d0a0b7ae91522dbc43cccdd87049ff28234161a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"common-31.5.2.pom\">\n            <sha256 value=\"f1e2b1dafd06285b4dfd9060b8548453885240253889f3b60abb84e4904ae156\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"common\" version=\"31.6.0\">\n         <artifact name=\"common-31.6.0.jar\">\n            <sha256 value=\"9a73761122b6d08250b26f641df2d47dcd82c293b5f6c8e4ee5bb6ef85d1b2c8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"common-31.6.0.pom\">\n            <sha256 value=\"049ee7a0404218a1bd59b1fafefbfb93306dcb646b067c0839f78221ba985915\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"common\" version=\"31.6.1\">\n         <artifact name=\"common-31.6.1.jar\">\n            <sha256 value=\"4921a6610bf28f02911eb7d6e1ba498db98884e5f233e55272619a0841bd4c79\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"common-31.6.1.pom\">\n            <sha256 value=\"6dcf9d8c8ba22a80979d167751c795a7bf7402027927e0d00154b6495406718e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"common\" version=\"31.7.0\">\n         <artifact name=\"common-31.7.0.jar\">\n            <sha256 value=\"2877bbff38b2cbd18c4fa73400a84addb60adee695af94b984cf35dc2665e3b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"common-31.7.0.pom\">\n            <sha256 value=\"23773a38097291db47e657a04cc874d16d146b1e9e23928285a19b264cbe16d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"common\" version=\"31.7.1\">\n         <artifact name=\"common-31.7.1.jar\">\n            <sha256 value=\"9fa708ba82e614ce66c891a69e6babee3e9292ccc6db2dbeac5794e160a37746\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"common-31.7.1.pom\">\n            <sha256 value=\"27450987fcb098d7ba58ecb4b872a33f445327a4563a9a80f9f14d90572275d3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"common\" version=\"31.7.2\">\n         <artifact name=\"common-31.7.2.jar\">\n            <sha256 value=\"784f80506d177b770d513f4303315609893a984947ecea1c6e7f090cb66f3ca2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"common-31.7.2.pom\">\n            <sha256 value=\"82e6e7b88927263992d73e924dc585d1aab7dc1f83af18ad9843bb40bdf44b6e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"common\" version=\"31.7.3\">\n         <artifact name=\"common-31.7.3.jar\">\n            <sha256 value=\"abb5b2f28954ac09dcfb5d192e355af41236c8337afc08b16aa1adc0e8aebf63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"common-31.7.3.pom\">\n            <sha256 value=\"7d62df28d0bc98a9d6de5dd5cf9a52b587b9f4d38e46b022a98fcaa972e0c0c3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"common\" version=\"31.8.0\">\n         <artifact name=\"common-31.8.0.jar\">\n            <sha256 value=\"4d23784349911cf932018114bed291f52ca79c15e30be1076eb4660ae8c4301a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"common-31.8.0.pom\">\n            <sha256 value=\"2d196537e20eb01f8d54c454081d101ac7e7a300193786cd058f4800bb1df299\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"common\" version=\"31.8.1\">\n         <artifact name=\"common-31.8.1.jar\">\n            <sha256 value=\"4885101f979277c5436c2350e92afc5eef05cf3cce23562d83d842f1da548514\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"common-31.8.1.pom\">\n            <sha256 value=\"7d263643401b961b4201d6ec7cf09f9a324ea75162aa64947d8e1718aec4b871\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"common\" version=\"31.8.2\">\n         <artifact name=\"common-31.8.2.jar\">\n            <sha256 value=\"1f0be486d08e39a3fcfee663155f988ca88d3468c6aaafd541776fe8966dde78\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"common-31.8.2.pom\">\n            <sha256 value=\"7956cc152aa3ac2d65cf16e780a75f7f9490b044c909dcd118bff0bf77e8f434\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"common\" version=\"31.9.0\">\n         <artifact name=\"common-31.9.0.jar\">\n            <sha256 value=\"82d8ec5a0a29bc508b36cb06ec92868e7c1168d9871f7a8a18ca3e07f51edacc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"common-31.9.0.pom\">\n            <sha256 value=\"6ff2b788c3229156b68f0059f6557532c6104bbabca9442fe84a52cc8f2e43f8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"common\" version=\"31.9.1\">\n         <artifact name=\"common-31.9.1.jar\">\n            <sha256 value=\"23d3da3f5d341d7c660cd241a6199eafcdb6f48e89d730def4b78da256930416\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"common-31.9.1.pom\">\n            <sha256 value=\"7c960556629b5f258009c17fcd8b0793ef22f6cea09407cc6bb49a3158ff226b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"common\" version=\"31.9.2\">\n         <artifact name=\"common-31.9.2.jar\">\n            <sha256 value=\"2abaf6fc5590540de598719c4707bf1ae04ce7fef0b180c4a4e7378ce5ee8324\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"common-31.9.2.pom\">\n            <sha256 value=\"a583e879aaa64efd3a06c606f9aeff4497047dbcbaee4af06c64ef2fed779ac8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"dvlib\" version=\"31.10.0\">\n         <artifact name=\"dvlib-31.10.0.jar\">\n            <sha256 value=\"e3cf3fdc947788dee8d5baa76cb72a66571174bc4741edf0e3bab97a7ca90e1b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dvlib-31.10.0.pom\">\n            <sha256 value=\"de649938e8633d1d9f3f6364dc2de109e5a13d65bc92d1725d2d5711e2e4f543\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"dvlib\" version=\"31.4.1\">\n         <artifact name=\"dvlib-31.4.1.jar\">\n            <sha256 value=\"bf962bea906e1dc8a3273b8129999eaea3bb16fcb2b9deea1450dc6fb2ef9073\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dvlib-31.4.1.pom\">\n            <sha256 value=\"551675e33480c7df6b28c87c9655ab024cadd3dadc9311659ca4b1b8987ddb97\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"dvlib\" version=\"31.4.2\">\n         <artifact name=\"dvlib-31.4.2.jar\">\n            <sha256 value=\"bf962bea906e1dc8a3273b8129999eaea3bb16fcb2b9deea1450dc6fb2ef9073\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dvlib-31.4.2.pom\">\n            <sha256 value=\"340d38124a0dac119240f1fd9f08451afe8224e41f23fe619bc4568cb69d5491\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"dvlib\" version=\"31.5.0\">\n         <artifact name=\"dvlib-31.5.0.jar\">\n            <sha256 value=\"5ccc490258202850630c59eecb9d29a6c849bb17f10f4ca9017db649f72e481f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dvlib-31.5.0.pom\">\n            <sha256 value=\"8a4c9935c83097bff3af25c97b47039361840aab79fe2929e1f23f60abf68056\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"dvlib\" version=\"31.5.1\">\n         <artifact name=\"dvlib-31.5.1.jar\">\n            <sha256 value=\"5ccc490258202850630c59eecb9d29a6c849bb17f10f4ca9017db649f72e481f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dvlib-31.5.1.pom\">\n            <sha256 value=\"7b48e1d7773199fec1542f894a7dfa349dee01a76129844e05a0e2266a2da326\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"dvlib\" version=\"31.5.2\">\n         <artifact name=\"dvlib-31.5.2.jar\">\n            <sha256 value=\"5ccc490258202850630c59eecb9d29a6c849bb17f10f4ca9017db649f72e481f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dvlib-31.5.2.pom\">\n            <sha256 value=\"b7b1ebfe9a654df244de0c8f8ed31b6fe15197a38d1ed5be008696656b8ddec3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"dvlib\" version=\"31.6.0\">\n         <artifact name=\"dvlib-31.6.0.jar\">\n            <sha256 value=\"5ccc490258202850630c59eecb9d29a6c849bb17f10f4ca9017db649f72e481f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dvlib-31.6.0.pom\">\n            <sha256 value=\"059d1fa09874bad587aa301f3421bcc14beae6fe588fa2f00bc07fb65a80e048\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"dvlib\" version=\"31.6.1\">\n         <artifact name=\"dvlib-31.6.1.jar\">\n            <sha256 value=\"5ccc490258202850630c59eecb9d29a6c849bb17f10f4ca9017db649f72e481f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dvlib-31.6.1.pom\">\n            <sha256 value=\"cdae9198e9c2bf92c94683b009d6aad8310d14f62507e5ed52b58f93369a15d0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"dvlib\" version=\"31.7.0\">\n         <artifact name=\"dvlib-31.7.0.jar\">\n            <sha256 value=\"8fd3495a2ebb50b1aacb1b4362dc4a471b87462c1eaec43691bb56f895e9c636\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dvlib-31.7.0.pom\">\n            <sha256 value=\"efb60dd883ce77d14666af8240314b84cb8dfcff21f43d331b8449fe394c1218\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"dvlib\" version=\"31.7.1\">\n         <artifact name=\"dvlib-31.7.1.jar\">\n            <sha256 value=\"8fd3495a2ebb50b1aacb1b4362dc4a471b87462c1eaec43691bb56f895e9c636\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dvlib-31.7.1.pom\">\n            <sha256 value=\"57e60c729ec394fcadb901501306330561c379dc1483bdaa06ce29c3984d2ed6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"dvlib\" version=\"31.7.2\">\n         <artifact name=\"dvlib-31.7.2.jar\">\n            <sha256 value=\"8fd3495a2ebb50b1aacb1b4362dc4a471b87462c1eaec43691bb56f895e9c636\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dvlib-31.7.2.pom\">\n            <sha256 value=\"751f9ce31de69fab256dacc7c896d1277caecf8eff382f87146feb8af861ea40\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"dvlib\" version=\"31.7.3\">\n         <artifact name=\"dvlib-31.7.3.jar\">\n            <sha256 value=\"8fd3495a2ebb50b1aacb1b4362dc4a471b87462c1eaec43691bb56f895e9c636\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dvlib-31.7.3.pom\">\n            <sha256 value=\"feedfc890ebbfb2302fc6f3765e7c1fd5d3f481b13742f27adb600af04737bb6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"dvlib\" version=\"31.8.0\">\n         <artifact name=\"dvlib-31.8.0.jar\">\n            <sha256 value=\"e3cf3fdc947788dee8d5baa76cb72a66571174bc4741edf0e3bab97a7ca90e1b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dvlib-31.8.0.pom\">\n            <sha256 value=\"76580cca92bfa93d1d5cd8b6c41f4d21a0114e14f954a1d2c8932bd08f6cdf15\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"dvlib\" version=\"31.8.1\">\n         <artifact name=\"dvlib-31.8.1.jar\">\n            <sha256 value=\"e3cf3fdc947788dee8d5baa76cb72a66571174bc4741edf0e3bab97a7ca90e1b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dvlib-31.8.1.pom\">\n            <sha256 value=\"b603f8ad51f4faae426ec3efedc75cc9c7cb5130e69a446901ed9d2025d62035\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"dvlib\" version=\"31.8.2\">\n         <artifact name=\"dvlib-31.8.2.jar\">\n            <sha256 value=\"e3cf3fdc947788dee8d5baa76cb72a66571174bc4741edf0e3bab97a7ca90e1b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dvlib-31.8.2.pom\">\n            <sha256 value=\"b312bd6cbf30e4513ef22a45933630e89c14258d6002fdddb150846e16bfa2d6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"dvlib\" version=\"31.9.0\">\n         <artifact name=\"dvlib-31.9.0.jar\">\n            <sha256 value=\"e3cf3fdc947788dee8d5baa76cb72a66571174bc4741edf0e3bab97a7ca90e1b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dvlib-31.9.0.pom\">\n            <sha256 value=\"08dbc6e8599c9201eecea5b62540fb09c26cdf7c73ae60929f6853fa2d32a395\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"dvlib\" version=\"31.9.1\">\n         <artifact name=\"dvlib-31.9.1.jar\">\n            <sha256 value=\"e3cf3fdc947788dee8d5baa76cb72a66571174bc4741edf0e3bab97a7ca90e1b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dvlib-31.9.1.pom\">\n            <sha256 value=\"cdbab5a786ae11c69ce471497865dbe086b321b2565db7a6b8341899b9bc9a3f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"dvlib\" version=\"31.9.2\">\n         <artifact name=\"dvlib-31.9.2.jar\">\n            <sha256 value=\"e3cf3fdc947788dee8d5baa76cb72a66571174bc4741edf0e3bab97a7ca90e1b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dvlib-31.9.2.pom\">\n            <sha256 value=\"24c56fe010e17231935fc81b9e9f783da869b655d4878c1087267cfc2e631c15\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"play-sdk-proto\" version=\"31.10.0\">\n         <artifact name=\"play-sdk-proto-31.10.0.jar\">\n            <sha256 value=\"c6fc15a5c203064cfd2c8a176fdeac72ae0a2d743ec47a2e66a0238d8d870b6b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"play-sdk-proto-31.10.0.pom\">\n            <sha256 value=\"d24eda1bba5e44b345c35f0b352ba6cddee76d4056ef5b1bd322f0dae50093c5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"play-sdk-proto\" version=\"31.4.1\">\n         <artifact name=\"play-sdk-proto-31.4.1.jar\">\n            <sha256 value=\"68840b9dc064724dbe12844e0c59e325ac4dfaa818bf3262635bd5254010a29c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"play-sdk-proto-31.4.1.pom\">\n            <sha256 value=\"184970856b7258e1956978203d14aa68f36d09fd4a1978bb9b11808463ed6c7e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"play-sdk-proto\" version=\"31.4.2\">\n         <artifact name=\"play-sdk-proto-31.4.2.jar\">\n            <sha256 value=\"68840b9dc064724dbe12844e0c59e325ac4dfaa818bf3262635bd5254010a29c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"play-sdk-proto-31.4.2.pom\">\n            <sha256 value=\"d3759ae9bba0117cd0a09fb9dce965f7c637891e4c7ba8b4c5d05e651bbe7dc1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"play-sdk-proto\" version=\"31.5.0\">\n         <artifact name=\"play-sdk-proto-31.5.0.jar\">\n            <sha256 value=\"eccafb032ee4b76514db676a45cd4c5b0bd5be9ea7494f8debdac765e89bb92e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"play-sdk-proto-31.5.0.pom\">\n            <sha256 value=\"631ae63935470a8ea93696e248c3a37fbe35bcf2e3e941b1207875fff194ecb5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"play-sdk-proto\" version=\"31.5.1\">\n         <artifact name=\"play-sdk-proto-31.5.1.jar\">\n            <sha256 value=\"eccafb032ee4b76514db676a45cd4c5b0bd5be9ea7494f8debdac765e89bb92e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"play-sdk-proto-31.5.1.pom\">\n            <sha256 value=\"380975c9026a6d266f90defdfce8dbef2f5a73eb24aa698f562a09f2e0cf86cb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"play-sdk-proto\" version=\"31.5.2\">\n         <artifact name=\"play-sdk-proto-31.5.2.jar\">\n            <sha256 value=\"eccafb032ee4b76514db676a45cd4c5b0bd5be9ea7494f8debdac765e89bb92e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"play-sdk-proto-31.5.2.pom\">\n            <sha256 value=\"6ae5c24679e5107e8ba7afbaafeb3fba85074e9f4123a6f5d2230f79bdb1d8fc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"play-sdk-proto\" version=\"31.6.0\">\n         <artifact name=\"play-sdk-proto-31.6.0.jar\">\n            <sha256 value=\"2a0ff337c71b9bfb2a8d8d4fcdf63096b0b25203f764d6143fa2c24957abba7e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"play-sdk-proto-31.6.0.pom\">\n            <sha256 value=\"de77b21923f5804b3fd4619935c7c594be828672f28fa15c86c118c4fd7cc363\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"play-sdk-proto\" version=\"31.6.1\">\n         <artifact name=\"play-sdk-proto-31.6.1.jar\">\n            <sha256 value=\"2a0ff337c71b9bfb2a8d8d4fcdf63096b0b25203f764d6143fa2c24957abba7e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"play-sdk-proto-31.6.1.pom\">\n            <sha256 value=\"a81825cb47c6fdcfedcb8fd88cf8919b10b7a6b1f9e90369ead3ddaae345b4c5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"play-sdk-proto\" version=\"31.7.0\">\n         <artifact name=\"play-sdk-proto-31.7.0.jar\">\n            <sha256 value=\"ec265a10db9d8c94b48f05975228a0423020081ce599e0bb8cb529b3444e4394\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"play-sdk-proto-31.7.0.pom\">\n            <sha256 value=\"33ffc55328673edeeb0d41c45c97c5d89e2c06edf3cdf74d9e72be80711c29d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"play-sdk-proto\" version=\"31.7.1\">\n         <artifact name=\"play-sdk-proto-31.7.1.jar\">\n            <sha256 value=\"ec265a10db9d8c94b48f05975228a0423020081ce599e0bb8cb529b3444e4394\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"play-sdk-proto-31.7.1.pom\">\n            <sha256 value=\"cce353fb705854919bd4eb98c1981e85dbc39bf6f482e3a662c95c5358820b9c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"play-sdk-proto\" version=\"31.7.2\">\n         <artifact name=\"play-sdk-proto-31.7.2.jar\">\n            <sha256 value=\"ec265a10db9d8c94b48f05975228a0423020081ce599e0bb8cb529b3444e4394\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"play-sdk-proto-31.7.2.pom\">\n            <sha256 value=\"ab79ad879c70cf930850905c11009e0e3e46b2ae4967b0c6992c3c5b6330c898\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"play-sdk-proto\" version=\"31.7.3\">\n         <artifact name=\"play-sdk-proto-31.7.3.jar\">\n            <sha256 value=\"ec265a10db9d8c94b48f05975228a0423020081ce599e0bb8cb529b3444e4394\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"play-sdk-proto-31.7.3.pom\">\n            <sha256 value=\"4671cd7a984b797f818d8c69374c551b1d31f6c4cc068b50637b75d8d615e7f0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"play-sdk-proto\" version=\"31.8.0\">\n         <artifact name=\"play-sdk-proto-31.8.0.jar\">\n            <sha256 value=\"ec265a10db9d8c94b48f05975228a0423020081ce599e0bb8cb529b3444e4394\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"play-sdk-proto-31.8.0.pom\">\n            <sha256 value=\"732f290c9af49d94c02e70687b5a872700397a58fb80626d1bd7596703564744\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"play-sdk-proto\" version=\"31.8.1\">\n         <artifact name=\"play-sdk-proto-31.8.1.jar\">\n            <sha256 value=\"ec265a10db9d8c94b48f05975228a0423020081ce599e0bb8cb529b3444e4394\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"play-sdk-proto-31.8.1.pom\">\n            <sha256 value=\"e9ed1cde006085f7e2a58ddaf0d1a57d4cfa78828cc7df2ef5a2c32b2d96487a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"play-sdk-proto\" version=\"31.8.2\">\n         <artifact name=\"play-sdk-proto-31.8.2.jar\">\n            <sha256 value=\"ec265a10db9d8c94b48f05975228a0423020081ce599e0bb8cb529b3444e4394\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"play-sdk-proto-31.8.2.pom\">\n            <sha256 value=\"d7f09928d90a4b0c63524fadff4716674117bf09574d61c000689a8f4a8529ec\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"play-sdk-proto\" version=\"31.9.0\">\n         <artifact name=\"play-sdk-proto-31.9.0.jar\">\n            <sha256 value=\"c6fc15a5c203064cfd2c8a176fdeac72ae0a2d743ec47a2e66a0238d8d870b6b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"play-sdk-proto-31.9.0.pom\">\n            <sha256 value=\"4caab0c620a9b0cc1dca6d5bb62294142ced485fe613346e6e7ac765b497d736\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"play-sdk-proto\" version=\"31.9.1\">\n         <artifact name=\"play-sdk-proto-31.9.1.jar\">\n            <sha256 value=\"c6fc15a5c203064cfd2c8a176fdeac72ae0a2d743ec47a2e66a0238d8d870b6b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"play-sdk-proto-31.9.1.pom\">\n            <sha256 value=\"92d6fad2d9bc104639d6ea9f7dacd9324311851629848a960862867b4607fd0e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"play-sdk-proto\" version=\"31.9.2\">\n         <artifact name=\"play-sdk-proto-31.9.2.jar\">\n            <sha256 value=\"c6fc15a5c203064cfd2c8a176fdeac72ae0a2d743ec47a2e66a0238d8d870b6b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"play-sdk-proto-31.9.2.pom\">\n            <sha256 value=\"46f9d3e7f130df1b0ff1d6722fc884030dade8771422922558bad738c35d4ca7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"repository\" version=\"31.10.0\">\n         <artifact name=\"repository-31.10.0.jar\">\n            <sha256 value=\"cb9bcb7159b395d7ba9428206d0f914e670a2aa464f7c5227f5698441155d446\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"repository-31.10.0.pom\">\n            <sha256 value=\"d327e8a93f65fca90cd2c188da83883e50ca3e3689da7dfafe4797c718c939b6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"repository\" version=\"31.4.1\">\n         <artifact name=\"repository-31.4.1.jar\">\n            <sha256 value=\"438597d95beb6d2c3bf17e012c4f46d533660b4f9f36c6181f455ec45cc21c68\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"repository-31.4.1.pom\">\n            <sha256 value=\"db62b26da28d0e56f2c9aa8b48772b433afd3555cb7281bfc42376063e14d978\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"repository\" version=\"31.4.2\">\n         <artifact name=\"repository-31.4.2.jar\">\n            <sha256 value=\"438597d95beb6d2c3bf17e012c4f46d533660b4f9f36c6181f455ec45cc21c68\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"repository-31.4.2.pom\">\n            <sha256 value=\"282f74eb1f315cc63a29685865572585dd95aa479a3c53a85fb9beddcaf4dbdb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"repository\" version=\"31.5.0\">\n         <artifact name=\"repository-31.5.0.jar\">\n            <sha256 value=\"df2533e154b736a0a95e4804893aa59099552842bf9635cda3751be9e894a0e2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"repository-31.5.0.pom\">\n            <sha256 value=\"79363014583db7da814c01a6ffe89a83d75eced16ce5f09f2edd872dcfb0dfda\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"repository\" version=\"31.5.1\">\n         <artifact name=\"repository-31.5.1.jar\">\n            <sha256 value=\"df2533e154b736a0a95e4804893aa59099552842bf9635cda3751be9e894a0e2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"repository-31.5.1.pom\">\n            <sha256 value=\"0d58d4816327ac63af0349a64456030660826da565750f443a122e4b937c1196\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"repository\" version=\"31.5.2\">\n         <artifact name=\"repository-31.5.2.jar\">\n            <sha256 value=\"df2533e154b736a0a95e4804893aa59099552842bf9635cda3751be9e894a0e2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"repository-31.5.2.pom\">\n            <sha256 value=\"c158245c4fc680c7b6d91f6a6155facf4511f9acd35673bc69e162723cc2f20d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"repository\" version=\"31.6.0\">\n         <artifact name=\"repository-31.6.0.jar\">\n            <sha256 value=\"169c2e7a77aa30978879dbf8b30436671165872fcbdfdda6c735aaddb6710340\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"repository-31.6.0.pom\">\n            <sha256 value=\"fc898857af76feed5881a5da87053f801ad745ed6799ddbf9e9a098aa179c0cd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"repository\" version=\"31.6.1\">\n         <artifact name=\"repository-31.6.1.jar\">\n            <sha256 value=\"169c2e7a77aa30978879dbf8b30436671165872fcbdfdda6c735aaddb6710340\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"repository-31.6.1.pom\">\n            <sha256 value=\"5b2d52662a224ca490918d8d04ed75a702a28e32a4dccd39f5f4078c3b80be67\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"repository\" version=\"31.7.0\">\n         <artifact name=\"repository-31.7.0.jar\">\n            <sha256 value=\"169c2e7a77aa30978879dbf8b30436671165872fcbdfdda6c735aaddb6710340\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"repository-31.7.0.pom\">\n            <sha256 value=\"805fc1a91a8cd9a5b631b0e62877d9c01f31ff83f4e07ced6f0b834206c8a09f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"repository\" version=\"31.7.1\">\n         <artifact name=\"repository-31.7.1.jar\">\n            <sha256 value=\"169c2e7a77aa30978879dbf8b30436671165872fcbdfdda6c735aaddb6710340\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"repository-31.7.1.pom\">\n            <sha256 value=\"02c140cb1dd5b3fafe82efc1e0d430da8403f8e8da102014cad992f0d1e5d0f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"repository\" version=\"31.7.2\">\n         <artifact name=\"repository-31.7.2.jar\">\n            <sha256 value=\"169c2e7a77aa30978879dbf8b30436671165872fcbdfdda6c735aaddb6710340\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"repository-31.7.2.pom\">\n            <sha256 value=\"c4c64b2df80b1c2bdb22cf47454c582e2499079970d3bf26bb50df76889e03cc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"repository\" version=\"31.7.3\">\n         <artifact name=\"repository-31.7.3.jar\">\n            <sha256 value=\"169c2e7a77aa30978879dbf8b30436671165872fcbdfdda6c735aaddb6710340\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"repository-31.7.3.pom\">\n            <sha256 value=\"fcabf044c454c5a8c9949e9dec596ef5eaa1bef043b0e11a2c1954b298c7db04\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"repository\" version=\"31.8.0\">\n         <artifact name=\"repository-31.8.0.jar\">\n            <sha256 value=\"f9376c6812f8776a865b5e9a8177c50c27bfc03dbe29c26e46ad2976396cc856\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"repository-31.8.0.pom\">\n            <sha256 value=\"54898990dd0f84bca049d9f5758542ff820011b550078ed64be4bbfaffd1860b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"repository\" version=\"31.8.1\">\n         <artifact name=\"repository-31.8.1.jar\">\n            <sha256 value=\"f9376c6812f8776a865b5e9a8177c50c27bfc03dbe29c26e46ad2976396cc856\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"repository-31.8.1.pom\">\n            <sha256 value=\"70331ccdef89ed32be6a3937022860e1b69080f22d1a8c3b6cdbeea993006bfb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"repository\" version=\"31.8.2\">\n         <artifact name=\"repository-31.8.2.jar\">\n            <sha256 value=\"f9376c6812f8776a865b5e9a8177c50c27bfc03dbe29c26e46ad2976396cc856\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"repository-31.8.2.pom\">\n            <sha256 value=\"7897c2331b343bd0e4b5721c1dac6d1521600ac83818d5a4cf4eb7d355127749\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"repository\" version=\"31.9.0\">\n         <artifact name=\"repository-31.9.0.jar\">\n            <sha256 value=\"ee7331131b6d80dc83ea7d78fb6600847300733f2964d18861709c4d23075e08\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"repository-31.9.0.pom\">\n            <sha256 value=\"da81d196608e7ba610825de61c579c650e3994b7e1273588346edb8068b53438\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"repository\" version=\"31.9.1\">\n         <artifact name=\"repository-31.9.1.jar\">\n            <sha256 value=\"ee7331131b6d80dc83ea7d78fb6600847300733f2964d18861709c4d23075e08\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"repository-31.9.1.pom\">\n            <sha256 value=\"1b265e2c46d51055208e9e7f4c13d0190821e127503ad2848a71c81e7e1debfa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"repository\" version=\"31.9.2\">\n         <artifact name=\"repository-31.9.2.jar\">\n            <sha256 value=\"ee7331131b6d80dc83ea7d78fb6600847300733f2964d18861709c4d23075e08\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"repository-31.9.2.pom\">\n            <sha256 value=\"b0829b45fa6ddcd84ddf7f802a55c23ee2dfbd27de384905daaed60019f4f96c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdk-common\" version=\"31.10.0\">\n         <artifact name=\"sdk-common-31.10.0.jar\">\n            <sha256 value=\"c8408df75e04498a878f349ea8660ed84d1a4c15e971a021d73810d921279c11\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdk-common-31.10.0.pom\">\n            <sha256 value=\"7376b7c98793e20c27e9baf54edae2b151c4343ec79eb77c27342db3ad58ad72\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdk-common\" version=\"31.4.1\">\n         <artifact name=\"sdk-common-31.4.1.jar\">\n            <sha256 value=\"f38eba4bbfb6d541dc8c2be38c31e7389d0acdc354b234f258b6ee89e8ddce6d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdk-common-31.4.1.pom\">\n            <sha256 value=\"d1f7a3098bf5f1fa6f93add88c3972ec3f7781da4d7814b6cf7035a908623490\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdk-common\" version=\"31.4.2\">\n         <artifact name=\"sdk-common-31.4.2.jar\">\n            <sha256 value=\"f38eba4bbfb6d541dc8c2be38c31e7389d0acdc354b234f258b6ee89e8ddce6d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdk-common-31.4.2.pom\">\n            <sha256 value=\"a3a152875f17de4343bce9eff5cdd2274020d4167e0de8d2f184fc3d9fe95ad0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdk-common\" version=\"31.5.0\">\n         <artifact name=\"sdk-common-31.5.0.jar\">\n            <sha256 value=\"ca66994d093167e389b213247f414e6f9a94584db78c2e53c94b84fb60b60b9a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdk-common-31.5.0.pom\">\n            <sha256 value=\"197630c2b9aa43bac4786a490bd4235e99c30a9bf92c5d216920ae0710d9d24d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdk-common\" version=\"31.5.1\">\n         <artifact name=\"sdk-common-31.5.1.jar\">\n            <sha256 value=\"ca66994d093167e389b213247f414e6f9a94584db78c2e53c94b84fb60b60b9a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdk-common-31.5.1.pom\">\n            <sha256 value=\"ccdea30c2c34ac7ad7e49db08e41a5478de969fe6f1d3c320c60f97ffd7bebf1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdk-common\" version=\"31.5.2\">\n         <artifact name=\"sdk-common-31.5.2.jar\">\n            <sha256 value=\"ca66994d093167e389b213247f414e6f9a94584db78c2e53c94b84fb60b60b9a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdk-common-31.5.2.pom\">\n            <sha256 value=\"5896d84ce47c2887b5ac90f33211a9b20a7160f3f4d3d6aab369abcb701a32d7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdk-common\" version=\"31.6.0\">\n         <artifact name=\"sdk-common-31.6.0.jar\">\n            <sha256 value=\"ad66eec685eebe2e6ae4303e70c89f72317fa7d8cc2b39e36fdfa8645a2260fd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdk-common-31.6.0.pom\">\n            <sha256 value=\"1269e9f573fa00c9d477b527f67d5a7b842a28a5a870906ffe9cf5e4e0dd0150\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdk-common\" version=\"31.6.1\">\n         <artifact name=\"sdk-common-31.6.1.jar\">\n            <sha256 value=\"ad66eec685eebe2e6ae4303e70c89f72317fa7d8cc2b39e36fdfa8645a2260fd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdk-common-31.6.1.pom\">\n            <sha256 value=\"8c63e243c15464c529cbc774444c5b40b0af10186f23ac0b609c5d1f92f15399\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdk-common\" version=\"31.7.0\">\n         <artifact name=\"sdk-common-31.7.0.jar\">\n            <sha256 value=\"4fa44a7d9675df13da614dee512df90ad3e4308d0addb32ead99f57ce58f675f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdk-common-31.7.0.pom\">\n            <sha256 value=\"5d672fc342f6a6b51632806aebf7957653f538368fdc30312c60c5d8b09287ec\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdk-common\" version=\"31.7.1\">\n         <artifact name=\"sdk-common-31.7.1.jar\">\n            <sha256 value=\"4fa44a7d9675df13da614dee512df90ad3e4308d0addb32ead99f57ce58f675f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdk-common-31.7.1.pom\">\n            <sha256 value=\"010cbd1017e3fa8f2f0aa575e379147bda62f62e85b06e702ceb46bfd9801662\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdk-common\" version=\"31.7.2\">\n         <artifact name=\"sdk-common-31.7.2.jar\">\n            <sha256 value=\"4fa44a7d9675df13da614dee512df90ad3e4308d0addb32ead99f57ce58f675f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdk-common-31.7.2.pom\">\n            <sha256 value=\"6ec143961ab58c85aeb526984c282cd6f5d3c1d5e22fe7e7d4a63a167586616b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdk-common\" version=\"31.7.3\">\n         <artifact name=\"sdk-common-31.7.3.jar\">\n            <sha256 value=\"4fa44a7d9675df13da614dee512df90ad3e4308d0addb32ead99f57ce58f675f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdk-common-31.7.3.pom\">\n            <sha256 value=\"aa2c57c1c91cf7a91105e0ce4bbdda91451d3646b67d91d156955dbcf4c8c1d3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdk-common\" version=\"31.8.0\">\n         <artifact name=\"sdk-common-31.8.0.jar\">\n            <sha256 value=\"bbfcbccb1d63224a2704b1521a8b0293c6a1cdded3920572bfaac9a021a6de86\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdk-common-31.8.0.pom\">\n            <sha256 value=\"588c8ffe5b9fa2eef3fe4a852b4f753b353515c0d19ab615dcb4209cec9bfae2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdk-common\" version=\"31.8.1\">\n         <artifact name=\"sdk-common-31.8.1.jar\">\n            <sha256 value=\"bbfcbccb1d63224a2704b1521a8b0293c6a1cdded3920572bfaac9a021a6de86\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdk-common-31.8.1.pom\">\n            <sha256 value=\"a69c69f4e130d7d5110f8a5b2cd29ce76873e2c05433233f4c023c7e5a427d33\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdk-common\" version=\"31.8.2\">\n         <artifact name=\"sdk-common-31.8.2.jar\">\n            <sha256 value=\"bbfcbccb1d63224a2704b1521a8b0293c6a1cdded3920572bfaac9a021a6de86\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdk-common-31.8.2.pom\">\n            <sha256 value=\"ebf7894ee9f0d4dae19bd186c43290e2b2135a67bcc60a4fe29bef36e04793ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdk-common\" version=\"31.9.0\">\n         <artifact name=\"sdk-common-31.9.0.jar\">\n            <sha256 value=\"8943a58b67ac7fb1a0321e7a52a87cfaaec248d3912536c3d728a8dc071fff24\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdk-common-31.9.0.pom\">\n            <sha256 value=\"690c0a87605d12c6032c6d5833044fb08aad0af164d8c0db64251602aa7147f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdk-common\" version=\"31.9.1\">\n         <artifact name=\"sdk-common-31.9.1.jar\">\n            <sha256 value=\"8943a58b67ac7fb1a0321e7a52a87cfaaec248d3912536c3d728a8dc071fff24\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdk-common-31.9.1.pom\">\n            <sha256 value=\"d4b36804e30e8deb4e73ec81119517b66a802cf2db0556a7d237c6fa258d080c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdk-common\" version=\"31.9.2\">\n         <artifact name=\"sdk-common-31.9.2.jar\">\n            <sha256 value=\"8943a58b67ac7fb1a0321e7a52a87cfaaec248d3912536c3d728a8dc071fff24\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdk-common-31.9.2.pom\">\n            <sha256 value=\"ac5df79119886bcca9c893b1074d6d7d2e34abbf5e27f94b4a64698ec336e18e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdklib\" version=\"31.10.0\">\n         <artifact name=\"sdklib-31.10.0.jar\">\n            <sha256 value=\"af153d7550264b9f79ef4a02b0f8917ed4d5a276644ce8de39d7ecf66794de24\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdklib-31.10.0.pom\">\n            <sha256 value=\"e26b71c843eeeb94f28d566e3c9a3a2ba981b72859f775ef5121ba86d191b68a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdklib\" version=\"31.4.1\">\n         <artifact name=\"sdklib-31.4.1.jar\">\n            <sha256 value=\"51b499a01f398d6b671911f9d85b3114fde5e462f57b0040c5f0fcab1bdbfc22\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdklib-31.4.1.pom\">\n            <sha256 value=\"9d6bc666b2a3512d3c004e040f30501fba6c384384b784cc655a11dd9881a17d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdklib\" version=\"31.4.2\">\n         <artifact name=\"sdklib-31.4.2.jar\">\n            <sha256 value=\"51b499a01f398d6b671911f9d85b3114fde5e462f57b0040c5f0fcab1bdbfc22\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdklib-31.4.2.pom\">\n            <sha256 value=\"57d3df328b7f791a4434d606eeae5e388602429a56515d6f5f6ddb6bad52c49a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdklib\" version=\"31.5.0\">\n         <artifact name=\"sdklib-31.5.0.jar\">\n            <sha256 value=\"a87c7d95a6d9c329ddde828af3f213253140135c60a0bf025a9107b3c2123f20\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdklib-31.5.0.pom\">\n            <sha256 value=\"4070cd53a287e164d8eb8be3b2d0caddbb8d0667b470b211a1d01c4a5d6ac178\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdklib\" version=\"31.5.1\">\n         <artifact name=\"sdklib-31.5.1.jar\">\n            <sha256 value=\"a87c7d95a6d9c329ddde828af3f213253140135c60a0bf025a9107b3c2123f20\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdklib-31.5.1.pom\">\n            <sha256 value=\"821ef1bce7e8ef8b78eb60fedb45fb0521ada0649b06aa05e1fdb870c3bedd6c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdklib\" version=\"31.5.2\">\n         <artifact name=\"sdklib-31.5.2.jar\">\n            <sha256 value=\"a87c7d95a6d9c329ddde828af3f213253140135c60a0bf025a9107b3c2123f20\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdklib-31.5.2.pom\">\n            <sha256 value=\"c15e8d30766695289119b2399f25f3c75ac26bc018d140afca8980eebd7c8e51\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdklib\" version=\"31.6.0\">\n         <artifact name=\"sdklib-31.6.0.jar\">\n            <sha256 value=\"38101236bc1d48f36fb31970a3924750b1a0aea278b3f1427030fd5ef0a5a817\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdklib-31.6.0.pom\">\n            <sha256 value=\"5a54ee4780fc0b4b06eeec41a85855580366b7962b250c301c6ffab64f302b5b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdklib\" version=\"31.6.1\">\n         <artifact name=\"sdklib-31.6.1.jar\">\n            <sha256 value=\"31a2e1410bacd7e8a4647e397ccf914b686b3232296e4229128e3bad96706e24\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdklib-31.6.1.pom\">\n            <sha256 value=\"b7cd75c47e98dc4918e0599d9a14202f6ca6c358d0c214532fbb321767150468\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdklib\" version=\"31.7.0\">\n         <artifact name=\"sdklib-31.7.0.jar\">\n            <sha256 value=\"0a3f7097a4a00b384046b783b7053a59ec0bd92256ab84baa6bd807aa02858b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdklib-31.7.0.pom\">\n            <sha256 value=\"b58c113ceb362eef08e4724e497cfad6fe66f48ca36d9136eb9a11b3614559a3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdklib\" version=\"31.7.1\">\n         <artifact name=\"sdklib-31.7.1.jar\">\n            <sha256 value=\"0a3f7097a4a00b384046b783b7053a59ec0bd92256ab84baa6bd807aa02858b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdklib-31.7.1.pom\">\n            <sha256 value=\"a7dbb46181a0d039c54c48ff7bb485eb918b9de8f654f3c33b495dde5dadaa93\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdklib\" version=\"31.7.2\">\n         <artifact name=\"sdklib-31.7.2.jar\">\n            <sha256 value=\"0a3f7097a4a00b384046b783b7053a59ec0bd92256ab84baa6bd807aa02858b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdklib-31.7.2.pom\">\n            <sha256 value=\"9827d3ec1c15a8ac4f5ed8661c243accad145252772edad317f75a5b789b0a91\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdklib\" version=\"31.7.3\">\n         <artifact name=\"sdklib-31.7.3.jar\">\n            <sha256 value=\"0a3f7097a4a00b384046b783b7053a59ec0bd92256ab84baa6bd807aa02858b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdklib-31.7.3.pom\">\n            <sha256 value=\"6bfefbed5d2ba354b0c4d1154fa6086e74810d265d7ce0f981da514b8735912e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdklib\" version=\"31.8.0\">\n         <artifact name=\"sdklib-31.8.0.jar\">\n            <sha256 value=\"8c738d3c0aa407f446f91d30c0f4c9489fcaa0c69daf459e32f0931d968a9bfe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdklib-31.8.0.pom\">\n            <sha256 value=\"4cf815dc20d4357c6e150e421891462be9d444f966e755478c12f33a1acbb5b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdklib\" version=\"31.8.1\">\n         <artifact name=\"sdklib-31.8.1.jar\">\n            <sha256 value=\"8c738d3c0aa407f446f91d30c0f4c9489fcaa0c69daf459e32f0931d968a9bfe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdklib-31.8.1.pom\">\n            <sha256 value=\"01b3190ba19ed6f3415c423f9834b1c209fe7099a65aa9cae6ffced0ed2e9d56\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdklib\" version=\"31.8.2\">\n         <artifact name=\"sdklib-31.8.2.jar\">\n            <sha256 value=\"8c738d3c0aa407f446f91d30c0f4c9489fcaa0c69daf459e32f0931d968a9bfe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdklib-31.8.2.pom\">\n            <sha256 value=\"ab12d2e6d930d3154408aa35ca5a194cd51aafecd6881931b43ff32af2394e78\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdklib\" version=\"31.9.0\">\n         <artifact name=\"sdklib-31.9.0.jar\">\n            <sha256 value=\"ff07caebab7e58b2ea416967b422762cfa01e845c47b5215ef8d52b765ceff0e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdklib-31.9.0.pom\">\n            <sha256 value=\"6cf407eefb540b2d8c24420ebfc7e408c826a1439edcf60b52d76924983da23e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdklib\" version=\"31.9.1\">\n         <artifact name=\"sdklib-31.9.1.jar\">\n            <sha256 value=\"ee9d81187dab97900640c41e2ae30c0ebaf4572dd56a7d7e34447c93d794c2fd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdklib-31.9.1.pom\">\n            <sha256 value=\"cb4e4cd38a17c5302cca692b4ef12a39dcbca6ec34d9c6ce7991455c0aa4a820\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools\" name=\"sdklib\" version=\"31.9.2\">\n         <artifact name=\"sdklib-31.9.2.jar\">\n            <sha256 value=\"ee9d81187dab97900640c41e2ae30c0ebaf4572dd56a7d7e34447c93d794c2fd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sdklib-31.9.2.pom\">\n            <sha256 value=\"b61aaf853824012e54a61b1e0cb55d3694a5f788323cb8f4c6eda02c020da370\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"crash\" version=\"31.10.0\">\n         <artifact name=\"crash-31.10.0.jar\">\n            <sha256 value=\"cca97ac29a1329bd310a3e832b6e57f46227e501aa529c00a63df217c5d7df41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"crash-31.10.0.pom\">\n            <sha256 value=\"23d91c397ba0ef427068ead99e479192fbfc39fef4d05fd62b79bae16c72cd0d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"crash\" version=\"31.4.1\">\n         <artifact name=\"crash-31.4.1.jar\">\n            <sha256 value=\"2c5c26420967675c074bc7140831fe3bff5bbabc7fbbc08ba29fdc3eadcc9510\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"crash-31.4.1.pom\">\n            <sha256 value=\"d2b9646234c18314a40042a81e4f749a3ed7cc3a4a24fc0ffbcbdf1284ecf8d7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"crash\" version=\"31.4.2\">\n         <artifact name=\"crash-31.4.2.jar\">\n            <sha256 value=\"2c5c26420967675c074bc7140831fe3bff5bbabc7fbbc08ba29fdc3eadcc9510\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"crash-31.4.2.pom\">\n            <sha256 value=\"d8543c8b78b807f510ceceda53610f726caaddd3d706d6a5521ec2416c3eaa18\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"crash\" version=\"31.5.0\">\n         <artifact name=\"crash-31.5.0.jar\">\n            <sha256 value=\"2c5c26420967675c074bc7140831fe3bff5bbabc7fbbc08ba29fdc3eadcc9510\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"crash-31.5.0.pom\">\n            <sha256 value=\"8a55aa79961c628ffcf25f88d7f76001dbedf7b7910370daf47b8c4ca752189f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"crash\" version=\"31.5.1\">\n         <artifact name=\"crash-31.5.1.jar\">\n            <sha256 value=\"2c5c26420967675c074bc7140831fe3bff5bbabc7fbbc08ba29fdc3eadcc9510\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"crash-31.5.1.pom\">\n            <sha256 value=\"39726b0f23efdf41d1c484d3e8b059f87563cb5ba00c314827d1e1201d0a928f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"crash\" version=\"31.5.2\">\n         <artifact name=\"crash-31.5.2.jar\">\n            <sha256 value=\"2c5c26420967675c074bc7140831fe3bff5bbabc7fbbc08ba29fdc3eadcc9510\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"crash-31.5.2.pom\">\n            <sha256 value=\"add172ba73cd64b554bd0a208696354cfa4bc02d74199c6d84cf1cc3658276b9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"crash\" version=\"31.6.0\">\n         <artifact name=\"crash-31.6.0.jar\">\n            <sha256 value=\"2c5c26420967675c074bc7140831fe3bff5bbabc7fbbc08ba29fdc3eadcc9510\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"crash-31.6.0.pom\">\n            <sha256 value=\"46060d629289337574303feb613d9b80b85602ea1dc51c8c04c6cb099828f682\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"crash\" version=\"31.6.1\">\n         <artifact name=\"crash-31.6.1.jar\">\n            <sha256 value=\"2c5c26420967675c074bc7140831fe3bff5bbabc7fbbc08ba29fdc3eadcc9510\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"crash-31.6.1.pom\">\n            <sha256 value=\"36fa828e1dd2411671fc9eb1d0610c327b2ebe73049070eae134dafc1e84b3e6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"crash\" version=\"31.7.0\">\n         <artifact name=\"crash-31.7.0.jar\">\n            <sha256 value=\"cca97ac29a1329bd310a3e832b6e57f46227e501aa529c00a63df217c5d7df41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"crash-31.7.0.pom\">\n            <sha256 value=\"ea0b0ac54c21c8f60e3a0223d81ba90835dd99db2934c869eab988b5f6c23d90\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"crash\" version=\"31.7.1\">\n         <artifact name=\"crash-31.7.1.jar\">\n            <sha256 value=\"cca97ac29a1329bd310a3e832b6e57f46227e501aa529c00a63df217c5d7df41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"crash-31.7.1.pom\">\n            <sha256 value=\"2dc038e29d26bb3d1f4a3b8645a42e4bd6a42418820597b3de5fecf827be561d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"crash\" version=\"31.7.2\">\n         <artifact name=\"crash-31.7.2.jar\">\n            <sha256 value=\"cca97ac29a1329bd310a3e832b6e57f46227e501aa529c00a63df217c5d7df41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"crash-31.7.2.pom\">\n            <sha256 value=\"ac1042e2c131dbae52a2e6764c35786f18414e02aa416ac66d00254605733441\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"crash\" version=\"31.7.3\">\n         <artifact name=\"crash-31.7.3.jar\">\n            <sha256 value=\"cca97ac29a1329bd310a3e832b6e57f46227e501aa529c00a63df217c5d7df41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"crash-31.7.3.pom\">\n            <sha256 value=\"63693508ee9ed532e66fee129299dafba91a0f8d5164c1974be22a5af2e6df87\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"crash\" version=\"31.8.0\">\n         <artifact name=\"crash-31.8.0.jar\">\n            <sha256 value=\"cca97ac29a1329bd310a3e832b6e57f46227e501aa529c00a63df217c5d7df41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"crash-31.8.0.pom\">\n            <sha256 value=\"fd3e9f684cb0c1d62b1ff410f728a5d8f056a823d8d72571bed7d9d3f1d7b2d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"crash\" version=\"31.8.1\">\n         <artifact name=\"crash-31.8.1.jar\">\n            <sha256 value=\"cca97ac29a1329bd310a3e832b6e57f46227e501aa529c00a63df217c5d7df41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"crash-31.8.1.pom\">\n            <sha256 value=\"1de98e5ea75c82e4e06be79fd053bd91f4836b3b03c12fa4881ee6d03d2eef6e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"crash\" version=\"31.8.2\">\n         <artifact name=\"crash-31.8.2.jar\">\n            <sha256 value=\"cca97ac29a1329bd310a3e832b6e57f46227e501aa529c00a63df217c5d7df41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"crash-31.8.2.pom\">\n            <sha256 value=\"dc1fbbacd4a523809161eeb2f3cace1fc697c319dcf125f94f6b438483b1af4b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"crash\" version=\"31.9.0\">\n         <artifact name=\"crash-31.9.0.jar\">\n            <sha256 value=\"cca97ac29a1329bd310a3e832b6e57f46227e501aa529c00a63df217c5d7df41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"crash-31.9.0.pom\">\n            <sha256 value=\"3497e9713f0e749440e31c1fcbe5f79181cb34d354a625bd5c982f1ef905b8d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"crash\" version=\"31.9.1\">\n         <artifact name=\"crash-31.9.1.jar\">\n            <sha256 value=\"cca97ac29a1329bd310a3e832b6e57f46227e501aa529c00a63df217c5d7df41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"crash-31.9.1.pom\">\n            <sha256 value=\"39aecf06c5fb44deafd9fb2378e4c7ec0859e5e5552250b94040d89dfad073cc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"crash\" version=\"31.9.2\">\n         <artifact name=\"crash-31.9.2.jar\">\n            <sha256 value=\"cca97ac29a1329bd310a3e832b6e57f46227e501aa529c00a63df217c5d7df41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"crash-31.9.2.pom\">\n            <sha256 value=\"cbd6063ad6441c9fad930471b35b0c38dbf1e90e3feacd78af9b2ca0c7a9d956\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"protos\" version=\"31.10.0\">\n         <artifact name=\"protos-31.10.0.jar\">\n            <sha256 value=\"4ed1e3035425bc879b22375677906b987b1c632f40f2a83eaae84effd656cb3e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protos-31.10.0.pom\">\n            <sha256 value=\"a50a465c9e51edcdd40256eb47662e150b5a212345b65b758d8f998bc2ba25a1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"protos\" version=\"31.4.1\">\n         <artifact name=\"protos-31.4.1.jar\">\n            <sha256 value=\"3cc17200f904645251cf6f67c1281a70691428cde8f417b9b6c54acf89bf1a8a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protos-31.4.1.pom\">\n            <sha256 value=\"1e83c72c5c0c78aad51e5e2228c010db8f4cf60916476eab8e91f8a12e07e02b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"protos\" version=\"31.4.2\">\n         <artifact name=\"protos-31.4.2.jar\">\n            <sha256 value=\"3cc17200f904645251cf6f67c1281a70691428cde8f417b9b6c54acf89bf1a8a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protos-31.4.2.pom\">\n            <sha256 value=\"abfbc441e7115a0ad0960cb6d1930f9123815c4872998ceec00f9f82a9fd62ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"protos\" version=\"31.5.0\">\n         <artifact name=\"protos-31.5.0.jar\">\n            <sha256 value=\"577abea11afdffd14688aa5fb0eabce17c74bcff86ca455738484bd91afacfb6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protos-31.5.0.pom\">\n            <sha256 value=\"be963fccaf1e4a5a7f1b0d0712415fa36f3bfe61bf887e4edce1dcc3ccba1566\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"protos\" version=\"31.5.1\">\n         <artifact name=\"protos-31.5.1.jar\">\n            <sha256 value=\"17b9a03cc4b9694e89015450209e13d0c9582191dd0ea1b8f297d36d603745e6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protos-31.5.1.pom\">\n            <sha256 value=\"9887593af453d307ba9da98c624e049df1979f50eb95935ad2c8803dbccd8161\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"protos\" version=\"31.5.2\">\n         <artifact name=\"protos-31.5.2.jar\">\n            <sha256 value=\"17b9a03cc4b9694e89015450209e13d0c9582191dd0ea1b8f297d36d603745e6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protos-31.5.2.pom\">\n            <sha256 value=\"cc0c5b75047e2b77d5a4c81c0622aa93abae5092ba5a8ba1cc188fd9ab204cce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"protos\" version=\"31.6.0\">\n         <artifact name=\"protos-31.6.0.jar\">\n            <sha256 value=\"0cd13ddedc22dfe3535a4c6adc564d1fc380f695dd1fd74cf02130c510cfb573\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protos-31.6.0.pom\">\n            <sha256 value=\"fbd9376920e8fb1c31cc43bba27663ca907ad932addac7bc23ddba809775e4f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"protos\" version=\"31.6.1\">\n         <artifact name=\"protos-31.6.1.jar\">\n            <sha256 value=\"0cd13ddedc22dfe3535a4c6adc564d1fc380f695dd1fd74cf02130c510cfb573\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protos-31.6.1.pom\">\n            <sha256 value=\"f98cff9ef2c422bd50c1df02fcb02a16952b652a6ae5dcb12944ccef50c1c0b0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"protos\" version=\"31.7.0\">\n         <artifact name=\"protos-31.7.0.jar\">\n            <sha256 value=\"692cf981395fe171a2f229ff70cc6cc1ddf9e2261b28eadda2269d66e5509786\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protos-31.7.0.pom\">\n            <sha256 value=\"e9615dbdbd21b10381fb95c155eb6ccb8a87ca611901681217d6349bd9f9e914\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"protos\" version=\"31.7.1\">\n         <artifact name=\"protos-31.7.1.jar\">\n            <sha256 value=\"692cf981395fe171a2f229ff70cc6cc1ddf9e2261b28eadda2269d66e5509786\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protos-31.7.1.pom\">\n            <sha256 value=\"ca4bc64d72197df0ef4313c7f4413fd5c29ff33ea1f12ee876eaa29ff6bdeab8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"protos\" version=\"31.7.2\">\n         <artifact name=\"protos-31.7.2.jar\">\n            <sha256 value=\"692cf981395fe171a2f229ff70cc6cc1ddf9e2261b28eadda2269d66e5509786\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protos-31.7.2.pom\">\n            <sha256 value=\"714ecabb5aef6237bfb4c16eb48ead0d2896f2aeb7defd6722e518b7936bf716\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"protos\" version=\"31.7.3\">\n         <artifact name=\"protos-31.7.3.jar\">\n            <sha256 value=\"692cf981395fe171a2f229ff70cc6cc1ddf9e2261b28eadda2269d66e5509786\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protos-31.7.3.pom\">\n            <sha256 value=\"3942c672ca854b8425e899651cf023f6299c624817c52098034a4e5e42264bb4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"protos\" version=\"31.8.0\">\n         <artifact name=\"protos-31.8.0.jar\">\n            <sha256 value=\"79c77e99e9dda9c35f513efce33b203c3cd0ae6a12e2f8559a71b5f2d7878eda\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protos-31.8.0.pom\">\n            <sha256 value=\"80b59a298fe9520a37ff7220cb5c051229b0023ef25a098def3805e48353d83f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"protos\" version=\"31.8.1\">\n         <artifact name=\"protos-31.8.1.jar\">\n            <sha256 value=\"79c77e99e9dda9c35f513efce33b203c3cd0ae6a12e2f8559a71b5f2d7878eda\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protos-31.8.1.pom\">\n            <sha256 value=\"3d32044775e1580193231ccc2557ac099740c70150e10040fdf7ea377320c5f0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"protos\" version=\"31.8.2\">\n         <artifact name=\"protos-31.8.2.jar\">\n            <sha256 value=\"79c77e99e9dda9c35f513efce33b203c3cd0ae6a12e2f8559a71b5f2d7878eda\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protos-31.8.2.pom\">\n            <sha256 value=\"e6b7e7f2da2a02568c66dcf1db06af6c89f4fad4dc5c6b09094d803923ff8623\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"protos\" version=\"31.9.0\">\n         <artifact name=\"protos-31.9.0.jar\">\n            <sha256 value=\"dd20d4e47ca890b7c352f6f73c87c22f14c218083f1e5ebad9c013e8ba7e4af0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protos-31.9.0.pom\">\n            <sha256 value=\"ae97a1c390a4d6d709b8e022ed9ad75e607703ff2e4f2c9ec4d96be3380520c6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"protos\" version=\"31.9.1\">\n         <artifact name=\"protos-31.9.1.jar\">\n            <sha256 value=\"dd20d4e47ca890b7c352f6f73c87c22f14c218083f1e5ebad9c013e8ba7e4af0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protos-31.9.1.pom\">\n            <sha256 value=\"2e3f05c2f8b54773f7614a499e4995836e1fb1e82af564615af22af61d37c300\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"protos\" version=\"31.9.2\">\n         <artifact name=\"protos-31.9.2.jar\">\n            <sha256 value=\"dd20d4e47ca890b7c352f6f73c87c22f14c218083f1e5ebad9c013e8ba7e4af0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protos-31.9.2.pom\">\n            <sha256 value=\"957fa43da6268df97e5b4a5f7b6d11f555a2f1c629e1fd5fbb6f182aaefee37d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"shared\" version=\"31.10.0\">\n         <artifact name=\"shared-31.10.0.jar\">\n            <sha256 value=\"38d3fda1ac4cb0f8974a4868da1361a03cfab930e52e5729d99bade40382459c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shared-31.10.0.pom\">\n            <sha256 value=\"ff4c2b080e4efca8afc607128688b78b36e22eaac300da83841961660378b9cc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"shared\" version=\"31.4.1\">\n         <artifact name=\"shared-31.4.1.jar\">\n            <sha256 value=\"971e224c62bb2f05ca8f4f37ed29ac8f91914b39eb8ac620ba92a2e0ea38bc7d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shared-31.4.1.pom\">\n            <sha256 value=\"8f027527a471a500aa8889bafef452d02ffde5b9776b3acce80db5d7ea2733bc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"shared\" version=\"31.4.2\">\n         <artifact name=\"shared-31.4.2.jar\">\n            <sha256 value=\"971e224c62bb2f05ca8f4f37ed29ac8f91914b39eb8ac620ba92a2e0ea38bc7d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shared-31.4.2.pom\">\n            <sha256 value=\"407b3e55634f21acd256005d829e11aa88e6dba6a38ab01fdffea852bbc7bc54\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"shared\" version=\"31.5.0\">\n         <artifact name=\"shared-31.5.0.jar\">\n            <sha256 value=\"324fc4983b14469a8df19fa5c2cc1bd3d1fd729554825f3912d8dfad8b8734d3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shared-31.5.0.pom\">\n            <sha256 value=\"fb0179f5e5f88ed75849ee68ff014bdd2f80d69e8b4cff980c88d2fcb95647fd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"shared\" version=\"31.5.1\">\n         <artifact name=\"shared-31.5.1.jar\">\n            <sha256 value=\"324fc4983b14469a8df19fa5c2cc1bd3d1fd729554825f3912d8dfad8b8734d3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shared-31.5.1.pom\">\n            <sha256 value=\"062b5e13aa3fa16fb68e898fc21fb4ac35d62c38c015d4e8a62b9322d6d26e86\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"shared\" version=\"31.5.2\">\n         <artifact name=\"shared-31.5.2.jar\">\n            <sha256 value=\"324fc4983b14469a8df19fa5c2cc1bd3d1fd729554825f3912d8dfad8b8734d3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shared-31.5.2.pom\">\n            <sha256 value=\"96afac36fefd30269286b6ac574c960260bd172c7cda8349377e85c9af1562e7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"shared\" version=\"31.6.0\">\n         <artifact name=\"shared-31.6.0.jar\">\n            <sha256 value=\"188ec3cb881ed655df9311cc58701dcb32997365004e8aa6854acfb60f6e35e1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shared-31.6.0.pom\">\n            <sha256 value=\"aa3e39a171a0b1e10d55ea6306336d20fc16de72955185a4c2357d19fe8eed74\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"shared\" version=\"31.6.1\">\n         <artifact name=\"shared-31.6.1.jar\">\n            <sha256 value=\"188ec3cb881ed655df9311cc58701dcb32997365004e8aa6854acfb60f6e35e1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shared-31.6.1.pom\">\n            <sha256 value=\"8d2c6915bf747c5b9d6a7197b427055d79cc002c9266a90ebcc2de232b7c17ae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"shared\" version=\"31.7.0\">\n         <artifact name=\"shared-31.7.0.jar\">\n            <sha256 value=\"cad7bb8f96a047a5ef7a13b1c8303414229e9d507209646ec3b63a64861e1ce1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shared-31.7.0.pom\">\n            <sha256 value=\"0622d2bce4e630166bf12813e83854394171faf27593afd2da4be9c2d90910bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"shared\" version=\"31.7.1\">\n         <artifact name=\"shared-31.7.1.jar\">\n            <sha256 value=\"cad7bb8f96a047a5ef7a13b1c8303414229e9d507209646ec3b63a64861e1ce1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shared-31.7.1.pom\">\n            <sha256 value=\"74622000a48ee3d8be5000bd2ebc1dfb50f54586e35e8323b3f0f7f4e04c1426\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"shared\" version=\"31.7.2\">\n         <artifact name=\"shared-31.7.2.jar\">\n            <sha256 value=\"cad7bb8f96a047a5ef7a13b1c8303414229e9d507209646ec3b63a64861e1ce1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shared-31.7.2.pom\">\n            <sha256 value=\"1eb99da0d1a176d220be275ff004606410cb947a4d75414a68100524b3a8c388\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"shared\" version=\"31.7.3\">\n         <artifact name=\"shared-31.7.3.jar\">\n            <sha256 value=\"cad7bb8f96a047a5ef7a13b1c8303414229e9d507209646ec3b63a64861e1ce1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shared-31.7.3.pom\">\n            <sha256 value=\"5ea88c7af15770b495073b07efb7355965462f72549c993dfb19f3eeed9309f2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"shared\" version=\"31.8.0\">\n         <artifact name=\"shared-31.8.0.jar\">\n            <sha256 value=\"9b47359226c9b3436ac4fc921321c10718dd1854cbaa5775fbaf9433ff2c6960\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shared-31.8.0.pom\">\n            <sha256 value=\"4cd8e495a51f08b4d0ce99ce8d94b1670d8bf22464c92aebdfc75cd0140e4216\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"shared\" version=\"31.8.1\">\n         <artifact name=\"shared-31.8.1.jar\">\n            <sha256 value=\"9b47359226c9b3436ac4fc921321c10718dd1854cbaa5775fbaf9433ff2c6960\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shared-31.8.1.pom\">\n            <sha256 value=\"8aa87623f959efee3595c604a9299adb3dbeda8c1c78a47c5a46d46297455dfd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"shared\" version=\"31.8.2\">\n         <artifact name=\"shared-31.8.2.jar\">\n            <sha256 value=\"9b47359226c9b3436ac4fc921321c10718dd1854cbaa5775fbaf9433ff2c6960\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shared-31.8.2.pom\">\n            <sha256 value=\"52086fea45e0c0817c5e382e2b0d46426d52a9b0c039055303d29e733141fd56\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"shared\" version=\"31.9.0\">\n         <artifact name=\"shared-31.9.0.jar\">\n            <sha256 value=\"38d3fda1ac4cb0f8974a4868da1361a03cfab930e52e5729d99bade40382459c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shared-31.9.0.pom\">\n            <sha256 value=\"8ab9643d11ebb9144e181911fdaddccafc485e1bda3e06a6b21df14efb6df89f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"shared\" version=\"31.9.1\">\n         <artifact name=\"shared-31.9.1.jar\">\n            <sha256 value=\"38d3fda1ac4cb0f8974a4868da1361a03cfab930e52e5729d99bade40382459c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shared-31.9.1.pom\">\n            <sha256 value=\"904e9d993baab7f1033a2d649edaf7d0bac3384ef49324271029764bd0772941\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"shared\" version=\"31.9.2\">\n         <artifact name=\"shared-31.9.2.jar\">\n            <sha256 value=\"38d3fda1ac4cb0f8974a4868da1361a03cfab930e52e5729d99bade40382459c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shared-31.9.2.pom\">\n            <sha256 value=\"44c09e47e62a614d21deb2ddcdb554cdc934ecb474ce2f66c217eee1ea3aa528\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"tracker\" version=\"31.10.0\">\n         <artifact name=\"tracker-31.10.0.jar\">\n            <sha256 value=\"0fc55e4d215f4b021d881172acef82464061d962dfebb113a0540dc7045928e5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracker-31.10.0.pom\">\n            <sha256 value=\"9108105fb2cb939ea639e581e035b8c41cec28b0435f317d874ac064245db138\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"tracker\" version=\"31.4.1\">\n         <artifact name=\"tracker-31.4.1.jar\">\n            <sha256 value=\"542c6c0070a7df6254050532f2a14aa9db5553a0fc2cb203fdba7b721523e716\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracker-31.4.1.pom\">\n            <sha256 value=\"929ea75f2b2f52f687e65a0c6b5c70b797ae1094ce376f7691cc885d35e07c63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"tracker\" version=\"31.4.2\">\n         <artifact name=\"tracker-31.4.2.jar\">\n            <sha256 value=\"542c6c0070a7df6254050532f2a14aa9db5553a0fc2cb203fdba7b721523e716\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracker-31.4.2.pom\">\n            <sha256 value=\"759bcff005106e333240deee06449e2d19ccfe2c2be94288be7ee2c3c3d973cb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"tracker\" version=\"31.5.0\">\n         <artifact name=\"tracker-31.5.0.jar\">\n            <sha256 value=\"542c6c0070a7df6254050532f2a14aa9db5553a0fc2cb203fdba7b721523e716\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracker-31.5.0.pom\">\n            <sha256 value=\"1c59c8a4ed6581117025b062811579dc3e18817a9c6cef8350391a838051869e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"tracker\" version=\"31.5.1\">\n         <artifact name=\"tracker-31.5.1.jar\">\n            <sha256 value=\"542c6c0070a7df6254050532f2a14aa9db5553a0fc2cb203fdba7b721523e716\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracker-31.5.1.pom\">\n            <sha256 value=\"fbeb76154e5c70fb43fb1cae37c1a945ad37cb79fefdbc4892d6ed7e28e90c33\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"tracker\" version=\"31.5.2\">\n         <artifact name=\"tracker-31.5.2.jar\">\n            <sha256 value=\"542c6c0070a7df6254050532f2a14aa9db5553a0fc2cb203fdba7b721523e716\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracker-31.5.2.pom\">\n            <sha256 value=\"0e1c52a144155bf93cafa41d7477b4041c11154b935d26d4d10bdc53cb6ba374\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"tracker\" version=\"31.6.0\">\n         <artifact name=\"tracker-31.6.0.jar\">\n            <sha256 value=\"7e8f45aada8beda71c2976c15f1a316eaa00fd4a9683221311ced2bdbc026408\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracker-31.6.0.pom\">\n            <sha256 value=\"80f4b6092d5264c49d7d31e9e446f02aa78fa6c60f14911b23cc690d8c4b5b45\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"tracker\" version=\"31.6.1\">\n         <artifact name=\"tracker-31.6.1.jar\">\n            <sha256 value=\"7e8f45aada8beda71c2976c15f1a316eaa00fd4a9683221311ced2bdbc026408\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracker-31.6.1.pom\">\n            <sha256 value=\"646f9e35fe8783eb6668e70e37dff7c8d4162eed19197cde2ca4195f2a77d9fd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"tracker\" version=\"31.7.0\">\n         <artifact name=\"tracker-31.7.0.jar\">\n            <sha256 value=\"e1f954973a4733f76027a5f96fa45472dc3cc22d27b1dc93f3fe6a46a75681be\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracker-31.7.0.pom\">\n            <sha256 value=\"76faeb448ed76e96305e557cec2c0cb2414ff995c24c5e0a69cb61b032487ace\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"tracker\" version=\"31.7.1\">\n         <artifact name=\"tracker-31.7.1.jar\">\n            <sha256 value=\"e1f954973a4733f76027a5f96fa45472dc3cc22d27b1dc93f3fe6a46a75681be\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracker-31.7.1.pom\">\n            <sha256 value=\"b005e0bc93cc09aabaeff66fad74a227ff36dc7858d07e3236c5f0397efcf278\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"tracker\" version=\"31.7.2\">\n         <artifact name=\"tracker-31.7.2.jar\">\n            <sha256 value=\"e1f954973a4733f76027a5f96fa45472dc3cc22d27b1dc93f3fe6a46a75681be\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracker-31.7.2.pom\">\n            <sha256 value=\"72aaef7aedde425a94c6d5ccb74f507267e38edfb71aeaa9c83da015ec413067\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"tracker\" version=\"31.7.3\">\n         <artifact name=\"tracker-31.7.3.jar\">\n            <sha256 value=\"e1f954973a4733f76027a5f96fa45472dc3cc22d27b1dc93f3fe6a46a75681be\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracker-31.7.3.pom\">\n            <sha256 value=\"d5a83939370a74cba67e60df6cf1a73f77302562c26b131b26291cd805ff8b2f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"tracker\" version=\"31.8.0\">\n         <artifact name=\"tracker-31.8.0.jar\">\n            <sha256 value=\"07d6e5a771317e61eecb3a6b6e361d083f7ed03b06a58a210cfabd13ded9eebb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracker-31.8.0.pom\">\n            <sha256 value=\"20a60b8e019770cda0306baff6bb93c540bcc56c293d5ad5c21926735605cf5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"tracker\" version=\"31.8.1\">\n         <artifact name=\"tracker-31.8.1.jar\">\n            <sha256 value=\"07d6e5a771317e61eecb3a6b6e361d083f7ed03b06a58a210cfabd13ded9eebb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracker-31.8.1.pom\">\n            <sha256 value=\"7f048452e55ab4fd9a98a67bd58f852b2dba0a2dfb84da22bfe2867a035446e0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"tracker\" version=\"31.8.2\">\n         <artifact name=\"tracker-31.8.2.jar\">\n            <sha256 value=\"07d6e5a771317e61eecb3a6b6e361d083f7ed03b06a58a210cfabd13ded9eebb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracker-31.8.2.pom\">\n            <sha256 value=\"ae050670884945756f4e32b852461584ec95a801403ab1a4d7919e0675eb7bcd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"tracker\" version=\"31.9.0\">\n         <artifact name=\"tracker-31.9.0.jar\">\n            <sha256 value=\"0fc55e4d215f4b021d881172acef82464061d962dfebb113a0540dc7045928e5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracker-31.9.0.pom\">\n            <sha256 value=\"554db826fce6424b778d1dbf031273d9119df3f2eee5eaf3ffec6abff7a4ab63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"tracker\" version=\"31.9.1\">\n         <artifact name=\"tracker-31.9.1.jar\">\n            <sha256 value=\"0fc55e4d215f4b021d881172acef82464061d962dfebb113a0540dc7045928e5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracker-31.9.1.pom\">\n            <sha256 value=\"04e8c1c26a58b92421e338e548b279aa0c0e7383ba50837eb777413960451e9f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.analytics-library\" name=\"tracker\" version=\"31.9.2\">\n         <artifact name=\"tracker-31.9.2.jar\">\n            <sha256 value=\"0fc55e4d215f4b021d881172acef82464061d962dfebb113a0540dc7045928e5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tracker-31.9.2.pom\">\n            <sha256 value=\"6ad685c3103d452ef644358be6db8ded1c68e973807f5436ee755baa7ac5c88d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2\" version=\"8.10.0-12782657\">\n          <artifact name=\"aapt2-8.10.0-12782657-linux.jar\">\n              <sha256 value=\"53642b1a1f871aa2bc60b3227474e505f3c4c5dcec7bfabfb8347d8c57f3a87e\" origin=\"Generated by Gradle\"/>\n          </artifact>\n          <artifact name=\"aapt2-8.10.0-12782657-osx.jar\">\n              <sha256 value=\"918a214c20dd3a5be73b9b05c3c4d551b8d2eae82284015f7fd76b23b297351a\" origin=\"Generated by Gradle\"/>\n          </artifact>\n          <artifact name=\"aapt2-8.10.0-12782657-windows.jar\">\n              <sha256 value=\"98b6a0f2a749e2b48b236879a79da744245ddd3ba67988c618ca0298c46af2d9\" origin=\"Generated by Gradle\"/>\n          </artifact>\n         <artifact name=\"aapt2-8.10.0-12782657.pom\">\n            <sha256 value=\"e163efc25f56c4ecf31189999d83fe25b3c7b2bd2c7359f0eb0b0a3efbd6fe6f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2\" version=\"8.4.1-11315950\">\n         <artifact name=\"aapt2-8.4.1-11315950-linux.jar\">\n            <sha256 value=\"0436553853f613304254a570e67e24951da0b70d34e0594975a1d7df1e7af4a0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.4.1-11315950-osx.jar\">\n            <sha256 value=\"57c0267a21c00801cf315a42c10d56fb4b56cad54da262ba52d3e34578f21226\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.4.1-11315950-windows.jar\">\n            <sha256 value=\"db296595cfdfce6137c5815701d87233e3df1032db205b2e7e59358af5623a60\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.4.1-11315950.pom\">\n            <sha256 value=\"6f298435c09dc14a210ff063fa0d048891d62e618498340dcbdcfcf62684897f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2\" version=\"8.4.2-11315950\">\n         <artifact name=\"aapt2-8.4.2-11315950-linux.jar\">\n            <sha256 value=\"4857cca8b8210e986b56d38970f6a60dd05f04015e17c9606d8c8281dd926d6a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.4.2-11315950-osx.jar\">\n            <sha256 value=\"9baf76499cd5db78e3ccae6c5f5f5986a1901bfda91cfc49e7c8268158b0ed93\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.4.2-11315950-windows.jar\">\n            <sha256 value=\"d9ce24ff0706d3745ace54c97ec29b7b25cf8036602865e4afffb1ec7d6af02c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.4.2-11315950.pom\">\n            <sha256 value=\"bfed9acf31035df0fc41f43cf9c9812477c138a7900e736669c4aecaf72fcc29\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2\" version=\"8.5.0-11315950\">\n         <artifact name=\"aapt2-8.5.0-11315950-linux.jar\">\n            <sha256 value=\"0e307c068433efbc645a1864d4380bc79911cf5de311a976f92040cb218739dc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.5.0-11315950-osx.jar\">\n            <sha256 value=\"58d20fd3929e936db809b329998b4c37ff17c868a32a0b038c3db249f01ffe55\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.5.0-11315950-windows.jar\">\n            <sha256 value=\"eb563c350bae63dce8536c7136d9777429bd8a9d6a000cb670b2062dfce9b5a8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.5.0-11315950.pom\">\n            <sha256 value=\"7d0451a80567e9563e7937ebb775195373cf88793d209ea90a38fde3c44e9ef0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2\" version=\"8.5.1-11315950\">\n         <artifact name=\"aapt2-8.5.1-11315950-linux.jar\">\n            <sha256 value=\"38a6690b754f29be09e34340bf22fd7852e49adf6ccd3c9afb6117b14f70b79e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.5.1-11315950-osx.jar\">\n            <sha256 value=\"f43d100a99e8020d18bd9d0f08eb3e3cc19ed79430a0f98095047ef00ff1ad0b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.5.1-11315950-windows.jar\">\n            <sha256 value=\"451dbc858b97858efaf3440aa31b85266a40e054e07830a5fbef936254546543\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.5.1-11315950.pom\">\n            <sha256 value=\"3a4382d8c044049ac7459730790c980d35f5b52b8a3cf5b3ae36296fb1f0591a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2\" version=\"8.5.2-11315950\">\n         <artifact name=\"aapt2-8.5.2-11315950-linux.jar\">\n            <sha256 value=\"d8cfecdc9d6597b87b5694bb1f5322fac132ea69ee76cf74f1d83142ca021edb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.5.2-11315950-osx.jar\">\n            <sha256 value=\"fbcece1a033f344d2d47a711c8296beed7194516076fcb5c91a1d9a528ff212f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.5.2-11315950-windows.jar\">\n            <sha256 value=\"dd8fadbaf4e9fd349e8f783da51d3d1139fe2ca65e18ce4bad7d8c792724d721\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.5.2-11315950.pom\">\n            <sha256 value=\"d10e78f433aeea88d9df084d892f58176d781c5a2661e534538fa015dbc59135\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2\" version=\"8.6.0-11315950\">\n         <artifact name=\"aapt2-8.6.0-11315950-linux.jar\">\n            <sha256 value=\"682926cf101f021a5063911ed2caaec1408c17cc49683fd03552245187864395\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.6.0-11315950-osx.jar\">\n            <sha256 value=\"807a5a0c29ca128816508e81f032aa571941aff8d3c111d81b59920db4d39c44\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.6.0-11315950-windows.jar\">\n            <sha256 value=\"82113c86f4560b6fa30b144ea48120e60bbd26afaf09764951e716eceb7c7382\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.6.0-11315950.pom\">\n            <sha256 value=\"5d42c96e5d991df16eadc51460ae31471593e343b31955c3fc84280136c3523c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2\" version=\"8.6.1-11315950\">\n         <artifact name=\"aapt2-8.6.1-11315950-linux.jar\">\n            <sha256 value=\"955f14e61cac2e1d70a4703b1aa539ca4f348469ac64a155dcce47bda3de52c8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.6.1-11315950-osx.jar\">\n            <sha256 value=\"3efea26673d50fc3f2df69bb17f0cdc29967ce7b0865d208485292d1153a07e3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.6.1-11315950-windows.jar\">\n            <sha256 value=\"d7911de3afa8d5de1f1213f5244de7144093442d4fc20c8eb75d188ebe132ea5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.6.1-11315950.pom\">\n            <sha256 value=\"a0c80db33f6b7c3c2739d15244f11a9876a51944ba9999e928f85f349fb56493\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2\" version=\"8.7.0-12006047\">\n         <artifact name=\"aapt2-8.7.0-12006047-linux.jar\">\n            <sha256 value=\"bb218ee7aff7bde2fcdc52bd039dcbf01ed393162585c0e1a9ad237f376d8ad2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.7.0-12006047-osx.jar\">\n            <sha256 value=\"3a716d03ad195f4b8f8aa4b598c12f8f38093f6d2700451e8fb6bb4a489914c2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.7.0-12006047-windows.jar\">\n            <sha256 value=\"1b9ac0f4e6eebf445a7a7f8687b91a3faf1ab402c4ed019d15718dbdc093a778\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.7.0-12006047.pom\">\n            <sha256 value=\"478a35af4def06e01e3e93e23f09227736e430581e93cf029c78ed626559d2b8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2\" version=\"8.7.1-12006047\">\n         <artifact name=\"aapt2-8.7.1-12006047-linux.jar\">\n            <sha256 value=\"73176e9b5a08dab48e516cd1295ddade550d3ae7ced6e935ef29d0f68ae4ef68\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.7.1-12006047-osx.jar\">\n            <sha256 value=\"b09227fcee79b5fa159ea921bb0016022d0aa2fb6224ab0bff8692e7486a197a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.7.1-12006047-windows.jar\">\n            <sha256 value=\"bb842d4da19458fda61168a73676b16133daa6785aa767dcaa72f958a6e8e1fc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.7.1-12006047.pom\">\n            <sha256 value=\"51d2d3cbb71fb9dc764a8fdccf7e4a915350d22c26b7d9ab52e072e96ad6751c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2\" version=\"8.7.2-12006047\">\n         <artifact name=\"aapt2-8.7.2-12006047-linux.jar\">\n            <sha256 value=\"59dc25b21fcb8f367c3ba10708779e87f3a4be3822ef1a138e8b0e362b623970\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.7.2-12006047-osx.jar\">\n            <sha256 value=\"131281f087ab0ceacbeb076023301488caf2112b58534d11b5bd9761537cb249\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.7.2-12006047-windows.jar\">\n            <sha256 value=\"2778acffbe9c700258124ac373686800ea4ef2162ae1937919f977851937f0b6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.7.2-12006047.pom\">\n            <sha256 value=\"7679386c84b0ce323f1644daa55fe11f7b898767f0026e303d7cffc75d020641\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2\" version=\"8.7.3-12006047\">\n         <artifact name=\"aapt2-8.7.3-12006047-linux.jar\">\n            <sha256 value=\"028916a040b58f34c9c89984e1bc48f8da6581662014f2b66391860def8b9c36\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.7.3-12006047-osx.jar\">\n            <sha256 value=\"8cfca8d3fcb8ad45cf46e3780cdd4a64cb38c70ca45b442655de9f3e7d19efc1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.7.3-12006047-windows.jar\">\n            <sha256 value=\"9406af8e4742da01e4ce65773e23bda40ed5f599917b38cacc261c9ba0952331\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.7.3-12006047.pom\">\n            <sha256 value=\"a8e9619d38e53a2ab28848ac5a20faac0ed751d224a8a2523664ec9987f13f0f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2\" version=\"8.8.0-12006047\">\n         <artifact name=\"aapt2-8.8.0-12006047-linux.jar\">\n            <sha256 value=\"8f1b975a0e471b126098afaec8f4e3b1723fd64e09f0edd9660cc6ee1b02caff\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.8.0-12006047-osx.jar\">\n            <sha256 value=\"ae8be97baef5ba6bb6c8acb120c3ed65816fbb99cd961c6243d0b03892424ee0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.8.0-12006047-windows.jar\">\n            <sha256 value=\"712a75b3260114573b075d54eb112751513acc6b14fdd3cb10f988812c0683e3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.8.0-12006047.pom\">\n            <sha256 value=\"ee7f64dcc4f4821904da646db020220232a9ebe7c9ec698b9c37f3cbbc121730\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2\" version=\"8.8.1-12006047\">\n         <artifact name=\"aapt2-8.8.1-12006047-linux.jar\">\n            <sha256 value=\"659814d45f0487c0a238774accc751adeac78fcbd3417c26813f3c1421fa9fb5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.8.1-12006047-osx.jar\">\n            <sha256 value=\"9dc2f9d5ed6845fb31049312852cc7041e402fcc4bd0009789161c5c2345f963\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.8.1-12006047-window.jar\">\n            <sha256 value=\"437e6bc70d2e75172d65ac4d03d0563a4fda256b72a97b6c685a79ff5d4e94f6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.8.1-12006047.pom\">\n            <sha256 value=\"2b5eed4325d1153dc6cd0cf3e1148ca7290731ee59840603acdb3e33016fd041\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2\" version=\"8.8.2-12006047\">\n         <artifact name=\"aapt2-8.8.2-12006047-linux.jar\">\n            <sha256 value=\"be548b5ec223fc866ac8025bc782635531ded6f26f3681e2fec91c68e95608ba\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.8.2-12006047-osx.jar\">\n            <sha256 value=\"ed4dce04469f10ded1ddd753322217efcb72b201d0744a28869a5aedb1bf2c7e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.8.2-12006047-windows.jar\">\n            <sha256 value=\"8894041225d8701b60d7785e1353b6b5b94c8a1bed22616b96e0f636a9983bb3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.8.2-12006047.pom\">\n            <sha256 value=\"d60e5b2a85b2b5dc3488d8dbb9b3aace2b181456d621dde793f1961e2c47cf0f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2\" version=\"8.9.0-12782657\">\n         <artifact name=\"aapt2-8.9.0-12782657-linux.jar\">\n            <sha256 value=\"984ab36459db9eafae460cad648447e3d037aeae7423307364a4f53f093846f2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.9.0-12782657-osx.jar\">\n            <sha256 value=\"6773e3e7151e499ea01b1a5d684e9f259b8e2f32168c72beeba29287edb0347e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.9.0-12782657-windows.jar\">\n            <sha256 value=\"4af08cca3fa6f7196c6cb303bdd73aa7265a730d4a035f184b4e153525fbb6ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.9.0-12782657.pom\">\n            <sha256 value=\"232c8972629b4850a5ac8883d17dea13772b573e6f60130cb7277ece34d97ece\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2\" version=\"8.9.1-12782657\">\n         <artifact name=\"aapt2-8.9.1-12782657-linux.jar\">\n            <sha256 value=\"8cedaf4d9166beac9074d96eda54792158507f9e7aa65b0e4daa0e86aa511ded\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.9.1-12782657-osx.jar\">\n            <sha256 value=\"5973b799faa2ba3ff3b20cd93c4af43c09db2aa98ae6407eef9724690b2c3197\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.9.1-12782657-windows.jar\">\n            <sha256 value=\"0f49ba23d1adaae58bb074b28d7de39c8a32f923c9844a743596a12d76e3bccd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.9.1-12782657.pom\">\n            <sha256 value=\"07aa6af57431fe21c36cfb8497d2a6b63597c0f1ff4b270e4d71e81854cb5b89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2\" version=\"8.9.2-12782657\">\n         <artifact name=\"aapt2-8.9.2-12782657-linux.jar\">\n            <sha256 value=\"ffb7b7d419c7341dd013f2f87bfb0148f8bff0a2a47c222f54935b3b8f233605\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.9.2-12782657-osx.jar\">\n            <sha256 value=\"5d0aec6851fffbc9f6c8a8b50390c0bc976aa0ddf57a8a3a39061ed54b609ad1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.9.2-12782657-windows.jar\">\n            <sha256 value=\"a1c812cc3100ef5ae90d46c12b2b8288133691ab63c5ec7b0f9a5da23b26549e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-8.9.2-12782657.pom\">\n            <sha256 value=\"ea462f7f0d66a2bce906d761f51e391aeaea30bf790d8c4fe2082c747ef3be0b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2-proto\" version=\"8.10.0-12782657\">\n         <artifact name=\"aapt2-proto-8.10.0-12782657.jar\">\n            <sha256 value=\"ebbdd03a14aeb0172d8da82229c04ee2215242c4839e9af4035be6b0da574fb0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-proto-8.10.0-12782657.module\">\n            <sha256 value=\"b2ff68d750be802c2d72b6c187adbe52218f3b1a4784b43b30852356b7b7f553\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2-proto\" version=\"8.4.1-11315950\">\n         <artifact name=\"aapt2-proto-8.4.1-11315950.jar\">\n            <sha256 value=\"1a7dfab0f1dbfe6ce4d6fad3d05927d208f8c3087cbc0eb2b761aebf48ea06e4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-proto-8.4.1-11315950.module\">\n            <sha256 value=\"5c29e20b974943193b5b9e541d179f5ed4f456d081db2af1109270ddcbf2253f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2-proto\" version=\"8.4.2-11315950\">\n         <artifact name=\"aapt2-proto-8.4.2-11315950.jar\">\n            <sha256 value=\"66a589c25b2aa3d9b3daa96f07f262e3a157e43e50024234ff419b0578439645\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-proto-8.4.2-11315950.module\">\n            <sha256 value=\"91253e883c553a0ff8fb01cf693bb2f955f8baa679a2b7c014b21a9a2f35871a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2-proto\" version=\"8.5.0-11315950\">\n         <artifact name=\"aapt2-proto-8.5.0-11315950.jar\">\n            <sha256 value=\"b0c737bc5b14dc25b3a1d53559b661fef96e533fc34640b2a514b3518b53c06c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-proto-8.5.0-11315950.module\">\n            <sha256 value=\"fdfceac7227b99c6c53fa2d781b4435e6b2dadedfd35d3b252c91fc87c0025a5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2-proto\" version=\"8.5.1-11315950\">\n         <artifact name=\"aapt2-proto-8.5.1-11315950.jar\">\n            <sha256 value=\"2e998b3dbb552cf489ba6a77da16ad23547941feb5e569d9e9c3c3f71083e7ca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-proto-8.5.1-11315950.module\">\n            <sha256 value=\"9744f2997c17c8a5b52a606c3962b9721a9ea4266ba9b5a87eb41f2375ec4d48\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2-proto\" version=\"8.5.2-11315950\">\n         <artifact name=\"aapt2-proto-8.5.2-11315950.jar\">\n            <sha256 value=\"6a1476974aa0192e8c2fd337f36fd207f489c9abea010cd83416d215202af4e8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-proto-8.5.2-11315950.module\">\n            <sha256 value=\"b70ecc96c7bfb807976792aafaebc7487a9a12027cd915e31e9e6accef3f5a9f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2-proto\" version=\"8.6.0-11315950\">\n         <artifact name=\"aapt2-proto-8.6.0-11315950.jar\">\n            <sha256 value=\"aef44291bd37eeb2b914c27164fc8b48b1f8e33376211f1f0736cba35c0c71b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-proto-8.6.0-11315950.module\">\n            <sha256 value=\"0eb50d9ecdb583f3df0bec3014d443eab37a98bac66895156879bd7acfcfcb3a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2-proto\" version=\"8.6.1-11315950\">\n         <artifact name=\"aapt2-proto-8.6.1-11315950.jar\">\n            <sha256 value=\"f79359a88ad1734f249aadca886807b215f26055549c22f34dcea9a2313d14ea\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-proto-8.6.1-11315950.module\">\n            <sha256 value=\"949219215cea9fea44496ce16ec3c4733ae3f16a79753eecc0add24b11bc8b43\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2-proto\" version=\"8.7.0-12006047\">\n         <artifact name=\"aapt2-proto-8.7.0-12006047.jar\">\n            <sha256 value=\"fe17ba3348a29f8c41922ccaff0cf54ef4407c3e77407a9f87c1e555a1734c90\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-proto-8.7.0-12006047.module\">\n            <sha256 value=\"778c6de4039daf21900792aafcfa0de637482437e2cb10381488656a2b669749\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2-proto\" version=\"8.7.1-12006047\">\n         <artifact name=\"aapt2-proto-8.7.1-12006047.jar\">\n            <sha256 value=\"d7c66703abdc7b7b6117f644731be30cc6e39d4e0f312194a09738a0e55be614\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-proto-8.7.1-12006047.module\">\n            <sha256 value=\"581fed8085a40846faa62a0f51df7712133d0b86a9a2f70030de0b16006d9fa6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2-proto\" version=\"8.7.2-12006047\">\n         <artifact name=\"aapt2-proto-8.7.2-12006047.jar\">\n            <sha256 value=\"ca233d931f24f42ebd7e38ef4b0154f7ba928401eeba1a71d7114c2b8b152372\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-proto-8.7.2-12006047.module\">\n            <sha256 value=\"594057471678a1aefc0d2a5c87e9d061ada1139ea8fa605f98c6b79ada7fed3b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2-proto\" version=\"8.7.3-12006047\">\n         <artifact name=\"aapt2-proto-8.7.3-12006047.jar\">\n            <sha256 value=\"b32f7d4b2975ac9ee7f06054c18f1fea9da045dc1a61ff436ecf543480036302\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-proto-8.7.3-12006047.module\">\n            <sha256 value=\"bc49547f77b28769cdca84198d2fece1d6594a2918d11cab3cf4b1bb57915e2b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2-proto\" version=\"8.8.0-12006047\">\n         <artifact name=\"aapt2-proto-8.8.0-12006047.jar\">\n            <sha256 value=\"f3ab9095c97b4740e3e1394ad4769d8c9d2b9c0aefdfccfed120a53c2796afaf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-proto-8.8.0-12006047.module\">\n            <sha256 value=\"f6bc178e77b1b383a2c3d9493d3f283a41e2541ed24e5addd671fc2a7375ccc2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2-proto\" version=\"8.8.1-12006047\">\n         <artifact name=\"aapt2-proto-8.8.1-12006047.jar\">\n            <sha256 value=\"f1492834728c95300ad8d4ebb0e5f033f3139173b95b862e76302bd1a22adf17\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-proto-8.8.1-12006047.module\">\n            <sha256 value=\"5eb4abcc2c23497662d038b888312013bab21692bf6b69fcf57d98413ff869a5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2-proto\" version=\"8.8.2-12006047\">\n         <artifact name=\"aapt2-proto-8.8.2-12006047.jar\">\n            <sha256 value=\"d71f3a999203e6c97d37f810197e107c7237253f8429a007ec4d4438ffad6f00\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-proto-8.8.2-12006047.module\">\n            <sha256 value=\"631f33a0ae0af103e84a6a95eda6c447e0bb2cac7abeb015f8d2b2bdf971a5dd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2-proto\" version=\"8.9.0-12782657\">\n         <artifact name=\"aapt2-proto-8.9.0-12782657.jar\">\n            <sha256 value=\"6c7d6b4d5660dcf45035c51058a96518a189e16a8388d25543ba0d4ceb990996\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-proto-8.9.0-12782657.module\">\n            <sha256 value=\"87cd5cd5f69b6f3568f1b8329157aeb47dc6174300981a2c762589a9e9714bb8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2-proto\" version=\"8.9.1-12782657\">\n         <artifact name=\"aapt2-proto-8.9.1-12782657.jar\">\n            <sha256 value=\"0779df11a7c840e2857b96e509db3cbda73ceb2582575887ad647133984a6683\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-proto-8.9.1-12782657.module\">\n            <sha256 value=\"e7c87861b4a1a4b751a52021d392ad9bd47b606bcdc96ebf6403b2282db80645\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aapt2-proto\" version=\"8.9.2-12782657\">\n         <artifact name=\"aapt2-proto-8.9.2-12782657.jar\">\n            <sha256 value=\"cfbafb9b5ed4b3ae666cf08595d4fcb5784ff5b2f312d982ca378b7f0e47bdaf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aapt2-proto-8.9.2-12782657.module\">\n            <sha256 value=\"096b724fc978d96667a9e70cbbaf954b7fb0d54649e0c9ae8c16c3a84e5945a2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aaptcompiler\" version=\"8.10.0\">\n         <artifact name=\"aaptcompiler-8.10.0.jar\">\n            <sha256 value=\"f6bc4c8c1449df12bf5e0fff933930b1d93279dd05eeadb9b8790177bc16a9e1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aaptcompiler-8.10.0.module\">\n            <sha256 value=\"8edaed97ff95327014bb86f9b623d583d718513ac70a75ac96bd1a3675334063\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aaptcompiler\" version=\"8.4.1\">\n         <artifact name=\"aaptcompiler-8.4.1.jar\">\n            <sha256 value=\"476a4d68b56fba17d6da796f2b19ff7d176290bbb9bafee113fddf42c11595e0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aaptcompiler-8.4.1.module\">\n            <sha256 value=\"79b5577a1d92ca45f6ec064fc2a054b4d4573401c9577149c27a195a31f5029d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aaptcompiler\" version=\"8.4.2\">\n         <artifact name=\"aaptcompiler-8.4.2.jar\">\n            <sha256 value=\"c8089ca4458d0cca55cd4e296b6d39d9f9208d3ad5efee58dad59b0a17b4f902\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aaptcompiler-8.4.2.module\">\n            <sha256 value=\"b1295ea15c8c5ed90bbd4895970985b5a5fbb1fcfca8401012c2414f12d1af30\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aaptcompiler\" version=\"8.5.0\">\n         <artifact name=\"aaptcompiler-8.5.0.jar\">\n            <sha256 value=\"16de28453ec07879beeccb7c13c9ecde7cd1ceca578148db362b7f88cf3db311\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aaptcompiler-8.5.0.module\">\n            <sha256 value=\"60ad2c8c3d3e4edffe95c3ce604ba469c691b75126e80c3ccb9e86ce1f50b6b0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aaptcompiler\" version=\"8.5.1\">\n         <artifact name=\"aaptcompiler-8.5.1.jar\">\n            <sha256 value=\"670a3902165cf2033b90e64a4dbed8483809a2cae7d5bedcace3830960c176fd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aaptcompiler-8.5.1.module\">\n            <sha256 value=\"6d668e4604b0ff58709e49b015ececfa12f3c5204caf3e56f14eb3b6f568272e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aaptcompiler\" version=\"8.5.2\">\n         <artifact name=\"aaptcompiler-8.5.2.jar\">\n            <sha256 value=\"a9642f9431a2224253801be664b7afe09fb876c6628d17811594713b202a538e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aaptcompiler-8.5.2.module\">\n            <sha256 value=\"6db8d83acc790f3138b57c28b2d1dd5a6b691962ab23f79f7b2ccda58d0d0135\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aaptcompiler\" version=\"8.6.0\">\n         <artifact name=\"aaptcompiler-8.6.0.jar\">\n            <sha256 value=\"5bae15a299cf96de085a0caea785eb62c1b0ebd2ae41f75f00fc49aeb26314f0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aaptcompiler-8.6.0.module\">\n            <sha256 value=\"b05577f07c8985c31004e7ff931807d0b7e7b9206c86341602e3f44c3c58071d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aaptcompiler\" version=\"8.6.1\">\n         <artifact name=\"aaptcompiler-8.6.1.jar\">\n            <sha256 value=\"7e19ff3d47c3bd9b392596d71522af724053ef2a5ffe26b39f5b30e81e8883a1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aaptcompiler-8.6.1.module\">\n            <sha256 value=\"d22531adb533621f030b850cc72ce01816c5e2a11c29f10faf486217014b38ed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aaptcompiler\" version=\"8.7.0\">\n         <artifact name=\"aaptcompiler-8.7.0.jar\">\n            <sha256 value=\"ea4a886009444435f7a19fcaede1eaf180e8d85145f7c52a4ba87cbc356c563a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aaptcompiler-8.7.0.module\">\n            <sha256 value=\"defe216fab68536902ff684f1d5ba982959754da08d2960198c835cdf9eb4695\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aaptcompiler\" version=\"8.7.1\">\n         <artifact name=\"aaptcompiler-8.7.1.jar\">\n            <sha256 value=\"83829da7301a745059b5348ac1193a45c07ff9764d23fa8a7167a6dd3df1a637\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aaptcompiler-8.7.1.module\">\n            <sha256 value=\"aefdfe2e3930c726166301e185fd30ce219cca2b142d691fc63bb5dc3e433859\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aaptcompiler\" version=\"8.7.2\">\n         <artifact name=\"aaptcompiler-8.7.2.jar\">\n            <sha256 value=\"963f1a6d7f1361f23e453f4177ec1054faa5cd0d55e6f9f773d867f0885fc045\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aaptcompiler-8.7.2.module\">\n            <sha256 value=\"818f06a5d5a5e6488ef58482ffa2abebc7157a6fef619011be9b8c14060459df\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aaptcompiler\" version=\"8.7.3\">\n         <artifact name=\"aaptcompiler-8.7.3.jar\">\n            <sha256 value=\"47062eb9e5497e0742946528fd93c3886773dd2339059315f6316d5c05d7cdaf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aaptcompiler-8.7.3.module\">\n            <sha256 value=\"3df7be0fc664b16565428184c8cbb40c8f22322a233b4a8220dbbd6d399353af\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aaptcompiler\" version=\"8.8.0\">\n         <artifact name=\"aaptcompiler-8.8.0.jar\">\n            <sha256 value=\"4e3ab5dc919b404ae3056b7313cb240f3d83af7bc188f7152ecef59cf4a242c6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aaptcompiler-8.8.0.module\">\n            <sha256 value=\"114adffdbb35dfb5f12ca7edca15185b8092ac95728c94bcb3889031f9d4d393\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aaptcompiler\" version=\"8.8.1\">\n         <artifact name=\"aaptcompiler-8.8.1.jar\">\n            <sha256 value=\"beca54cf5f21f007dc3293de633b84d215a5f11230eec1b2d57c4202342fec2b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aaptcompiler-8.8.1.module\">\n            <sha256 value=\"38eff59df9da90871f50e825361568397b480be37556fbba7d9195a0bddbc6e2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aaptcompiler\" version=\"8.8.2\">\n         <artifact name=\"aaptcompiler-8.8.2.jar\">\n            <sha256 value=\"e76bf37f2ee34f125ba95ebc316569d39b6a8227b56e568cfb117755ca4818a6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aaptcompiler-8.8.2.module\">\n            <sha256 value=\"2c0374b4f8f1dec3ba3bb78c97a2f5327838e6ba7ec3ae7a3c1cbd4ef5a0ea77\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aaptcompiler\" version=\"8.9.0\">\n         <artifact name=\"aaptcompiler-8.9.0.jar\">\n            <sha256 value=\"599a93b5e24f5534b8b86c342c975f5a1ab3c065dbaf5e1774bb7e2b508a8b8e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aaptcompiler-8.9.0.module\">\n            <sha256 value=\"1d70cabf0385aaba83a8b3272df160e5556a5bf76b3096335445cd4a3a171f52\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aaptcompiler\" version=\"8.9.1\">\n         <artifact name=\"aaptcompiler-8.9.1.jar\">\n            <sha256 value=\"1e0a9b13fd38fdb08fdbe609e9def0d971de024471457360840e98486bc1629f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aaptcompiler-8.9.1.module\">\n            <sha256 value=\"a0a9d5863efdbd122ccd877559127dc8409fe96d620e8aea259d57bfefd7c888\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"aaptcompiler\" version=\"8.9.2\">\n         <artifact name=\"aaptcompiler-8.9.2.jar\">\n            <sha256 value=\"20b87ab9048ae93fd5eeb851563333bc612dfc9a819b81c6b1168bd600d5e160\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"aaptcompiler-8.9.2.module\">\n            <sha256 value=\"10e9352d9e53be98877e460bb748d8f62d8e5dae9d1b33ea6d8bb0a7dab0e5ad\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apksig\" version=\"8.10.0\">\n         <artifact name=\"apksig-8.10.0.jar\">\n            <sha256 value=\"c070ed1394629d74641aa0906f60b2ffa1ee77e6366a1f93437f59717b1aeb89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apksig-8.10.0.pom\">\n            <sha256 value=\"10c17df42b441b2866a0822c9966d80a6b4bf536c38dfed43df9d472c1a74b51\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apksig\" version=\"8.4.1\">\n         <artifact name=\"apksig-8.4.1.jar\">\n            <sha256 value=\"c4f6fdf2148490296f422a7eb37647ea11d1c3b02f1f2349c33ce257f3c29b1f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apksig-8.4.1.pom\">\n            <sha256 value=\"5ea065b142c34407796099de3200baeeaaf7b61ee46032eecb2c666c7cc68501\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apksig\" version=\"8.4.2\">\n         <artifact name=\"apksig-8.4.2.jar\">\n            <sha256 value=\"c4f6fdf2148490296f422a7eb37647ea11d1c3b02f1f2349c33ce257f3c29b1f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apksig-8.4.2.pom\">\n            <sha256 value=\"c00e6da8e67aded0afe97db4891f502516a85c8faf0aa521e93a4b596db44aae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apksig\" version=\"8.5.0\">\n         <artifact name=\"apksig-8.5.0.jar\">\n            <sha256 value=\"c4f6fdf2148490296f422a7eb37647ea11d1c3b02f1f2349c33ce257f3c29b1f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apksig-8.5.0.pom\">\n            <sha256 value=\"04a5679eaa93ca79497ac089b2de63f600e5041528bc694a235470852743e9da\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apksig\" version=\"8.5.1\">\n         <artifact name=\"apksig-8.5.1.jar\">\n            <sha256 value=\"c4f6fdf2148490296f422a7eb37647ea11d1c3b02f1f2349c33ce257f3c29b1f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apksig-8.5.1.pom\">\n            <sha256 value=\"3792084fc45bada50d6717e149048d440e74e25b006c00f6b4fdb27bd14dfc7f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apksig\" version=\"8.5.2\">\n         <artifact name=\"apksig-8.5.2.jar\">\n            <sha256 value=\"c4f6fdf2148490296f422a7eb37647ea11d1c3b02f1f2349c33ce257f3c29b1f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apksig-8.5.2.pom\">\n            <sha256 value=\"8383e5470bb20b1942a606c87c6dc573652aee3267080f956f95ef231b771ff5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apksig\" version=\"8.6.0\">\n         <artifact name=\"apksig-8.6.0.jar\">\n            <sha256 value=\"c070ed1394629d74641aa0906f60b2ffa1ee77e6366a1f93437f59717b1aeb89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apksig-8.6.0.pom\">\n            <sha256 value=\"dd1ef514b079d24fcdbec7e661cc517b83fe372f2bdad8a2b68c63a57478b128\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apksig\" version=\"8.6.1\">\n         <artifact name=\"apksig-8.6.1.jar\">\n            <sha256 value=\"c070ed1394629d74641aa0906f60b2ffa1ee77e6366a1f93437f59717b1aeb89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apksig-8.6.1.pom\">\n            <sha256 value=\"636220ab0cb12eb8e9b0ef58f478deff043afb5ac8fa9c0e7e3088c5a345b737\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apksig\" version=\"8.7.0\">\n         <artifact name=\"apksig-8.7.0.jar\">\n            <sha256 value=\"c070ed1394629d74641aa0906f60b2ffa1ee77e6366a1f93437f59717b1aeb89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apksig-8.7.0.pom\">\n            <sha256 value=\"1e84e836f04a7e4b239be8273ffaf6ddedbc2d8213912899dd79dfa6f2543132\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apksig\" version=\"8.7.1\">\n         <artifact name=\"apksig-8.7.1.jar\">\n            <sha256 value=\"c070ed1394629d74641aa0906f60b2ffa1ee77e6366a1f93437f59717b1aeb89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apksig-8.7.1.pom\">\n            <sha256 value=\"20a98136d955ea191ccd3a919feef168368248bb2cc67cfc63c97b4f7807fc58\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apksig\" version=\"8.7.2\">\n         <artifact name=\"apksig-8.7.2.jar\">\n            <sha256 value=\"c070ed1394629d74641aa0906f60b2ffa1ee77e6366a1f93437f59717b1aeb89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apksig-8.7.2.pom\">\n            <sha256 value=\"d1068e1c1d89fd53e654a76f99a836788a3ab72304324b6e2982b6d89d014791\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apksig\" version=\"8.7.3\">\n         <artifact name=\"apksig-8.7.3.jar\">\n            <sha256 value=\"c070ed1394629d74641aa0906f60b2ffa1ee77e6366a1f93437f59717b1aeb89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apksig-8.7.3.pom\">\n            <sha256 value=\"a68ba26d4a6e7a35bbee2fe514660146e6c2b217146b9c1a86b5b5abad99a3c9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apksig\" version=\"8.8.0\">\n         <artifact name=\"apksig-8.8.0.jar\">\n            <sha256 value=\"c070ed1394629d74641aa0906f60b2ffa1ee77e6366a1f93437f59717b1aeb89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apksig-8.8.0.pom\">\n            <sha256 value=\"248bf94e11f8f1ff364ba2e686076abbbaeeb1858e434a7c0ae7f00fdfbc03fc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apksig\" version=\"8.8.1\">\n         <artifact name=\"apksig-8.8.1.jar\">\n            <sha256 value=\"c070ed1394629d74641aa0906f60b2ffa1ee77e6366a1f93437f59717b1aeb89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apksig-8.8.1.pom\">\n            <sha256 value=\"0c1f3f9d59b6186171066bb206d6a1bcbe4f000224e9486b7accb151aa34344a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apksig\" version=\"8.8.2\">\n         <artifact name=\"apksig-8.8.2.jar\">\n            <sha256 value=\"c070ed1394629d74641aa0906f60b2ffa1ee77e6366a1f93437f59717b1aeb89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apksig-8.8.2.pom\">\n            <sha256 value=\"b59d8279bd18c0f0115c0eb67c682640f1241b2272da490425365f1187651a4b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apksig\" version=\"8.9.0\">\n         <artifact name=\"apksig-8.9.0.jar\">\n            <sha256 value=\"c070ed1394629d74641aa0906f60b2ffa1ee77e6366a1f93437f59717b1aeb89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apksig-8.9.0.pom\">\n            <sha256 value=\"60ea5254e62b78d889208431e2b9c44b99e40e335a3c2be5cb5ecdcaaf4099fe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apksig\" version=\"8.9.1\">\n         <artifact name=\"apksig-8.9.1.jar\">\n            <sha256 value=\"c070ed1394629d74641aa0906f60b2ffa1ee77e6366a1f93437f59717b1aeb89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apksig-8.9.1.pom\">\n            <sha256 value=\"56711c8461cb65fadc6a0ec69f0050181ae6449cfda7e1f3c84b015b8f9b093a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apksig\" version=\"8.9.2\">\n         <artifact name=\"apksig-8.9.2.jar\">\n            <sha256 value=\"c070ed1394629d74641aa0906f60b2ffa1ee77e6366a1f93437f59717b1aeb89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apksig-8.9.2.pom\">\n            <sha256 value=\"bed256eaedc203ab2b634cf0a48c4c9dcff1fdbaf99fa85f51f818ac4a8dfbf3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apkzlib\" version=\"8.10.0\">\n         <artifact name=\"apkzlib-8.10.0.jar\">\n            <sha256 value=\"29091c9457252f997ddfeafb33dd65a373ad45840128f945832d8eafd9118561\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apkzlib-8.10.0.pom\">\n            <sha256 value=\"1e7c9ca8ed64e5e20ae9c0e62938afa58c10982c2141d3c3fc62073f1865be87\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apkzlib\" version=\"8.4.1\">\n         <artifact name=\"apkzlib-8.4.1.jar\">\n            <sha256 value=\"1c1a67d6f4f186427ac166ebaa0dd867f595d5144fc925252b05ffb9d1a156b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apkzlib-8.4.1.pom\">\n            <sha256 value=\"5238627b86886ba5871dbd5b020ffa7ebda2f517b3ad0a6f4a928222c556ee80\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apkzlib\" version=\"8.4.2\">\n         <artifact name=\"apkzlib-8.4.2.jar\">\n            <sha256 value=\"1c1a67d6f4f186427ac166ebaa0dd867f595d5144fc925252b05ffb9d1a156b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apkzlib-8.4.2.pom\">\n            <sha256 value=\"a6c80e38efebb4fccbf23a0ff1045473f3d07c50b4b73764a8489b1581b581aa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apkzlib\" version=\"8.5.0\">\n         <artifact name=\"apkzlib-8.5.0.jar\">\n            <sha256 value=\"1c1a67d6f4f186427ac166ebaa0dd867f595d5144fc925252b05ffb9d1a156b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apkzlib-8.5.0.pom\">\n            <sha256 value=\"91427d8fa260a09a15d032d99ff862bb87c9f47470588385ddf2a0a40cf62985\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apkzlib\" version=\"8.5.1\">\n         <artifact name=\"apkzlib-8.5.1.jar\">\n            <sha256 value=\"1c1a67d6f4f186427ac166ebaa0dd867f595d5144fc925252b05ffb9d1a156b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apkzlib-8.5.1.pom\">\n            <sha256 value=\"6b7ac9baade27cb726f32738e6c55ea0c2badf3a60d30208a3dd51c2de2dd04a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apkzlib\" version=\"8.5.2\">\n         <artifact name=\"apkzlib-8.5.2.jar\">\n            <sha256 value=\"1c1a67d6f4f186427ac166ebaa0dd867f595d5144fc925252b05ffb9d1a156b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apkzlib-8.5.2.pom\">\n            <sha256 value=\"7412019ce024a3c392ec0b83733b546e007219626f386bffb297d4da60281d9d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apkzlib\" version=\"8.6.0\">\n         <artifact name=\"apkzlib-8.6.0.jar\">\n            <sha256 value=\"1c1a67d6f4f186427ac166ebaa0dd867f595d5144fc925252b05ffb9d1a156b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apkzlib-8.6.0.pom\">\n            <sha256 value=\"ffa4403c770cecde6df956e83280c050d9075ce4fc0352beadc439928cdc9080\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apkzlib\" version=\"8.6.1\">\n         <artifact name=\"apkzlib-8.6.1.jar\">\n            <sha256 value=\"1c1a67d6f4f186427ac166ebaa0dd867f595d5144fc925252b05ffb9d1a156b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apkzlib-8.6.1.pom\">\n            <sha256 value=\"f80fc5a7adf5860bdcc6d8be6aa3f55a4f8793099918560dd3697ab168f16d36\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apkzlib\" version=\"8.7.0\">\n         <artifact name=\"apkzlib-8.7.0.jar\">\n            <sha256 value=\"1c1a67d6f4f186427ac166ebaa0dd867f595d5144fc925252b05ffb9d1a156b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apkzlib-8.7.0.pom\">\n            <sha256 value=\"61e22c6e19d444126cb44d3dff3938d2ca9788419ed4879265919ae998ff657e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apkzlib\" version=\"8.7.1\">\n         <artifact name=\"apkzlib-8.7.1.jar\">\n            <sha256 value=\"1c1a67d6f4f186427ac166ebaa0dd867f595d5144fc925252b05ffb9d1a156b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apkzlib-8.7.1.pom\">\n            <sha256 value=\"ecfcccf0dc6ac540f6fedad40efc15f48fe5595c726d4460925089d6e23081c5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apkzlib\" version=\"8.7.2\">\n         <artifact name=\"apkzlib-8.7.2.jar\">\n            <sha256 value=\"1c1a67d6f4f186427ac166ebaa0dd867f595d5144fc925252b05ffb9d1a156b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apkzlib-8.7.2.pom\">\n            <sha256 value=\"f95a3562bab9fb2247d66515d7504d18001410386430368dec76f918c96768f9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apkzlib\" version=\"8.7.3\">\n         <artifact name=\"apkzlib-8.7.3.jar\">\n            <sha256 value=\"1c1a67d6f4f186427ac166ebaa0dd867f595d5144fc925252b05ffb9d1a156b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apkzlib-8.7.3.pom\">\n            <sha256 value=\"7c3ac37a12aef4137b7316edea35e5df32a61048d8bba8dd34903bc48531a7dd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apkzlib\" version=\"8.8.0\">\n         <artifact name=\"apkzlib-8.8.0.jar\">\n            <sha256 value=\"1c1a67d6f4f186427ac166ebaa0dd867f595d5144fc925252b05ffb9d1a156b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apkzlib-8.8.0.pom\">\n            <sha256 value=\"94f1e5759706cfe9ba380df48e59543b3b5a1555f805dab4da0134a084cda61e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apkzlib\" version=\"8.8.1\">\n         <artifact name=\"apkzlib-8.8.1.jar\">\n            <sha256 value=\"1c1a67d6f4f186427ac166ebaa0dd867f595d5144fc925252b05ffb9d1a156b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apkzlib-8.8.1.pom\">\n            <sha256 value=\"77a2b3387f35162eb7ccf8c578ec89e2f126a0ecaf34669b0fde197c0d377a80\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apkzlib\" version=\"8.8.2\">\n         <artifact name=\"apkzlib-8.8.2.jar\">\n            <sha256 value=\"1c1a67d6f4f186427ac166ebaa0dd867f595d5144fc925252b05ffb9d1a156b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apkzlib-8.8.2.pom\">\n            <sha256 value=\"5f0a4b0c60cb6891fafe69eb1e3a49439bdb1bbb839c2893e184125060e78c00\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apkzlib\" version=\"8.9.0\">\n         <artifact name=\"apkzlib-8.9.0.jar\">\n            <sha256 value=\"1c1a67d6f4f186427ac166ebaa0dd867f595d5144fc925252b05ffb9d1a156b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apkzlib-8.9.0.pom\">\n            <sha256 value=\"decdbad0376650f970a0645dd97a976ef74a2fb9aeb09323da0e0ec82ba6fc1d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apkzlib\" version=\"8.9.1\">\n         <artifact name=\"apkzlib-8.9.1.jar\">\n            <sha256 value=\"1c1a67d6f4f186427ac166ebaa0dd867f595d5144fc925252b05ffb9d1a156b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apkzlib-8.9.1.pom\">\n            <sha256 value=\"9c1e4ab684188db1f08eef1c6422527abc382d0da5e06670aaf062ee2d8080ed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"apkzlib\" version=\"8.9.2\">\n         <artifact name=\"apkzlib-8.9.2.jar\">\n            <sha256 value=\"1c1a67d6f4f186427ac166ebaa0dd867f595d5144fc925252b05ffb9d1a156b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apkzlib-8.9.2.pom\">\n            <sha256 value=\"15eb193f9bc609fdbf728e2ef354a0a34c0a044392c32e9830d72903fb39c5dc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder\" version=\"8.10.0\">\n         <artifact name=\"builder-8.10.0.jar\">\n            <sha256 value=\"88f0bf17c05c9faa578b5ebf676351cf00ebd3b1da538272b5d7200074d63248\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-8.10.0.module\">\n            <sha256 value=\"25d68df21ac90818b0755c3f84a0012894757ab91d9a8087ccd4b7e0bd7755da\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder\" version=\"8.4.1\">\n         <artifact name=\"builder-8.4.1.jar\">\n            <sha256 value=\"27f8cd73e0ad60c2276c5d4e3c95d6f003fd02edd182ed77692dbbd13947449c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-8.4.1.module\">\n            <sha256 value=\"4756386d6f1f1967e18739f9a7fddfc733fffda0c4643e5881a4a8467c1fdbdd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder\" version=\"8.4.2\">\n         <artifact name=\"builder-8.4.2.jar\">\n            <sha256 value=\"63868694a98cd0f7bf7c4effbf03da770f5b7e8cd734484f4e548f5dd6b9ca70\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-8.4.2.module\">\n            <sha256 value=\"eca844d401daf7da7be4ff2acfec69e7738890f3873cd25a633dc61d64ff2cf9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder\" version=\"8.5.0\">\n         <artifact name=\"builder-8.5.0.jar\">\n            <sha256 value=\"06ca45826dd49604dc05b5986dea2e59977b01cfba3fd476e6728f906e76facf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-8.5.0.module\">\n            <sha256 value=\"62613ff91cf6dcc7cd0b35c9039bea9a33949f55c5a001614e37c204e25c8a36\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder\" version=\"8.5.1\">\n         <artifact name=\"builder-8.5.1.jar\">\n            <sha256 value=\"55e1bd314b6b411f257ebc9551912db68bfe0137147193f84a32c7890ff1d7c2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-8.5.1.module\">\n            <sha256 value=\"b5ba2ee66219cfa435bccec1a7c262cf65e5986662e9b2fcbf9ff040002b1aab\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder\" version=\"8.5.2\">\n         <artifact name=\"builder-8.5.2.jar\">\n            <sha256 value=\"1acd72e5fbc20bb20841100b1a98fc1c60c9f1905baa11225022fd1506ed4762\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-8.5.2.module\">\n            <sha256 value=\"22c0d7efe2398050436bc29bd046e859280df981ed8503e6a5055c5ec5601dc9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder\" version=\"8.6.0\">\n         <artifact name=\"builder-8.6.0.jar\">\n            <sha256 value=\"ab79167052f619d7bfb337459b2d44acad9dde60f89a061c18af3c29fdf44bd4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-8.6.0.module\">\n            <sha256 value=\"fdc0f2ebb19231dcb7b30af717204fd0ba49d63e637087e451eec7606aba791d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder\" version=\"8.6.1\">\n         <artifact name=\"builder-8.6.1.jar\">\n            <sha256 value=\"bc4ee949f4ee95381c835487ebb6b1964889d6104b032397967d88b4f206e48d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-8.6.1.module\">\n            <sha256 value=\"458858250f513bffdb686aced000a8dacdef912bd091795b405d774e9b9949fa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder\" version=\"8.7.0\">\n         <artifact name=\"builder-8.7.0.jar\">\n            <sha256 value=\"89b5beb3396a8b4529bccc653b321a9cd968e25245be3b1c320189759abb6edf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-8.7.0.module\">\n            <sha256 value=\"bfd66c13382c4beb4a30722d4f58fef8e1cd43775c013f32ca0b3b92626f316f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder\" version=\"8.7.1\">\n         <artifact name=\"builder-8.7.1.jar\">\n            <sha256 value=\"4ae2cfc0dd51269e4b208482ee83c8f291e0ea487340279277e4782b7255f5b4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-8.7.1.module\">\n            <sha256 value=\"0de485a5927ec0a4ee323a1cf6f25811acfec7948f51a1892be02d398e78aa38\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder\" version=\"8.7.2\">\n         <artifact name=\"builder-8.7.2.jar\">\n            <sha256 value=\"f29f626ce9e41ddfaf305401397a884e5a31126a41fd18f40fdb61ca5461030c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-8.7.2.module\">\n            <sha256 value=\"11f58bffafd3a47926f70b24e290319c1ffe581a0a5c847811c9ecb0596e6ac6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder\" version=\"8.7.3\">\n         <artifact name=\"builder-8.7.3.jar\">\n            <sha256 value=\"2d0ac036986c0f256b9f327810c25c1dde6d5839956580d3283e0e0f146cb926\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-8.7.3.module\">\n            <sha256 value=\"890c58d6ab5ef7d0014daa8ddf38fd5b68aa4ad63c9bb4dd425da33ea64007b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder\" version=\"8.8.0\">\n         <artifact name=\"builder-8.8.0.jar\">\n            <sha256 value=\"02fd566a80f375faa764a89b03345d3b5e8a70d0ced199357ecb86374ed413a5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-8.8.0.module\">\n            <sha256 value=\"c9898d27dfe5f91f4b56d574d8ada65bc587516f9decfc902cf7017b613d009d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder\" version=\"8.8.1\">\n         <artifact name=\"builder-8.8.1.jar\">\n            <sha256 value=\"c702d45209e754936a3d5fa482519e8e811e01b359e624d207218a2043cd4bb6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-8.8.1.module\">\n            <sha256 value=\"79b049db0be36d56f8b518d71f2760c2641ab7fc417b3623f6a12502b45fb94e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder\" version=\"8.8.2\">\n         <artifact name=\"builder-8.8.2.jar\">\n            <sha256 value=\"47c5650d4c02e7101b26f6414703077ca2280cca1be2c4625cefc4a6e71c8b48\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-8.8.2.module\">\n            <sha256 value=\"1af563665a9598d8ce03fff2f7f78c5f3c80ea89e106c144042c8b823fe41243\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder\" version=\"8.9.0\">\n         <artifact name=\"builder-8.9.0.jar\">\n            <sha256 value=\"8d19b47c1d7abe3e4d6c98b29d77b7f5f9bad45b8fca3504d60ce21e50256dc6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-8.9.0.module\">\n            <sha256 value=\"4acf08db662190b3425f1f749398057aa4b8632f7329ad018197e3e40ba08e11\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder\" version=\"8.9.1\">\n         <artifact name=\"builder-8.9.1.jar\">\n            <sha256 value=\"066763c90b14fb82e9b18dd8cadd432981fdd2fcff927393d5230c44ad4ee252\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-8.9.1.module\">\n            <sha256 value=\"75f4054158cf476df4f75fbf66b9ba65149b71e530f7b4e40a815829f91f34d7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder\" version=\"8.9.2\">\n         <artifact name=\"builder-8.9.2.jar\">\n            <sha256 value=\"7dc1d36d12ee81300c5b1672aaae336d1c3cfe90a7b26b2b551389604150e53b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-8.9.2.module\">\n            <sha256 value=\"b1c4dab0d8522bc0344a313eb35c6af164e31ac8c3c8fd47f00bdeccbffc2eae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-model\" version=\"8.10.0\">\n         <artifact name=\"builder-model-8.10.0.jar\">\n            <sha256 value=\"39c65cd9eb4563e2d1278040e837cea31ad18b96deeb9410e89f8676ba587813\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-model-8.10.0.module\">\n            <sha256 value=\"c94a5ed83a430edb5de308df31655ad161d243e46c3bab5aefc8224b9d124519\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-model\" version=\"8.4.1\">\n         <artifact name=\"builder-model-8.4.1.jar\">\n            <sha256 value=\"6b011ed07ffb13526dd91c0c1fbaf57bd45f893d01f44ba9902b13765515791f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-model-8.4.1.module\">\n            <sha256 value=\"d2aff1a0123fde6c14208e0e8636788498b1959eb953310a6a45d3606d5bb098\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-model\" version=\"8.4.2\">\n         <artifact name=\"builder-model-8.4.2.jar\">\n            <sha256 value=\"8c94002357fe084f20440513685b31866e26f1e425dc6642a5f8c21522e39036\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-model-8.4.2.module\">\n            <sha256 value=\"886abeff84df16cfca31c161a4e07f75228960ee5ec9b236c6166b58317f437d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-model\" version=\"8.5.0\">\n         <artifact name=\"builder-model-8.5.0.jar\">\n            <sha256 value=\"a12b4a876c971b63ede6bdb7ec6d7706e8ad807c5fc094c693bd7c1bb7bf8b7e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-model-8.5.0.module\">\n            <sha256 value=\"5379ed0daf571c8e94ab48ad9f34d4c18a499dfb9cf86cecbd69c9bbf0b359df\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-model\" version=\"8.5.1\">\n         <artifact name=\"builder-model-8.5.1.jar\">\n            <sha256 value=\"b9b7c2cd0b66933207af48db77b36244761ed21555c683849e1e6ddb5ce2bf27\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-model-8.5.1.module\">\n            <sha256 value=\"4246f17cc5f30be6b3971b7cabd908abd49fee6ed7bdea81e65c657aa6bbe268\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-model\" version=\"8.5.2\">\n         <artifact name=\"builder-model-8.5.2.jar\">\n            <sha256 value=\"516de3ebed580152d500fd45073f66bf5b658778b7523507dff60c9a8d4286cd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-model-8.5.2.module\">\n            <sha256 value=\"b57030cbcbaa5e7230514b4e69a1e7dadab60fd35cbd4c59b38883b15e229d64\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-model\" version=\"8.6.0\">\n         <artifact name=\"builder-model-8.6.0.jar\">\n            <sha256 value=\"722fafaf8f3cc9ebcf2607930c7e8205fa0165a7d7d23d1cdfe7032d904dea97\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-model-8.6.0.module\">\n            <sha256 value=\"b5335e3e7b264bd42f154b0e4e2c740cfcc32dae86ff9399e043ec8c724312ae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-model\" version=\"8.6.1\">\n         <artifact name=\"builder-model-8.6.1.jar\">\n            <sha256 value=\"516e0ff378141532683fb3b16cb0e71517bf8b35388c27976fa90687289a8458\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-model-8.6.1.module\">\n            <sha256 value=\"a1e06a5bccb233e76fad4f37f0e351c04b6f9ceb3e3d188dc0c592698241b4ea\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-model\" version=\"8.7.0\">\n         <artifact name=\"builder-model-8.7.0.jar\">\n            <sha256 value=\"a96dc78cf39b4e569de90e8150b5efa66642d25908caf2890c603cc647a16c78\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-model-8.7.0.module\">\n            <sha256 value=\"f458c9c98443cee472f1b2154b9c0e67aaaa0580cd1bb3ae08cc34677377a947\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-model\" version=\"8.7.1\">\n         <artifact name=\"builder-model-8.7.1.jar\">\n            <sha256 value=\"0a9353bb9a6a89574c81863d5265c677d87179e99b6aaf8abd52ce8f818d1928\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-model-8.7.1.module\">\n            <sha256 value=\"a2cd6d9684c91c3e053f8b0066c405a90e92a7e1751f0f6cac8b5aae30648c1c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-model\" version=\"8.7.2\">\n         <artifact name=\"builder-model-8.7.2.jar\">\n            <sha256 value=\"46480100d75c396c2dcf046a4bb25ef3756f669bc4b3ced0b67441572d4c89d2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-model-8.7.2.module\">\n            <sha256 value=\"7fae8008757f01d74f3b61b1b2dd57663d63c03bc3acd0f6b8764698e5a8ffda\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-model\" version=\"8.7.3\">\n         <artifact name=\"builder-model-8.7.3.jar\">\n            <sha256 value=\"0018c7dd2cab696e07f140bb1dc8c0b0ec93b6bf195e9387043010ac894db7d7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-model-8.7.3.module\">\n            <sha256 value=\"b6147a8057863e2019475c06f40ed6f4c1c753a9334d753844d81d35f1075c7f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-model\" version=\"8.8.0\">\n         <artifact name=\"builder-model-8.8.0.jar\">\n            <sha256 value=\"b93c5bbf1880d43a3ee7e073d1520b1504388be4fd017bae020a8c34f15fdcf4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-model-8.8.0.module\">\n            <sha256 value=\"c97adcad7a6d5beb04c9cbb21c950809edbbe040cec6503e879402aedb72795e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-model\" version=\"8.8.1\">\n         <artifact name=\"builder-model-8.8.1.jar\">\n            <sha256 value=\"c313c28cf7ad1cdaafb2e314b9a4ec12e3d9826caac862756a90611b24f701d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-model-8.8.1.module\">\n            <sha256 value=\"3a24a0243f797651f94d4051acdca7e02e16e8abcbabe8478c06ffb9a8c3ceee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-model\" version=\"8.8.2\">\n         <artifact name=\"builder-model-8.8.2.jar\">\n            <sha256 value=\"a902f7cb0e1e74ad87782e8ddcb85620bd470137daf84d1b199f6fcf132ec8aa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-model-8.8.2.module\">\n            <sha256 value=\"a305f7d6e2e0c3487b53597c8c707605baf0c1e568128d14ab343aee8288aae2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-model\" version=\"8.9.0\">\n         <artifact name=\"builder-model-8.9.0.jar\">\n            <sha256 value=\"8400101bcb7baf914a70833d9bf0feab0debcb8572fb1949476ad809e241e94d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-model-8.9.0.module\">\n            <sha256 value=\"33585e2524ec71a8e3bac0e845bca506caa7a53470346813b83a9f023aaf00a2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-model\" version=\"8.9.1\">\n         <artifact name=\"builder-model-8.9.1.jar\">\n            <sha256 value=\"928eb46387b05d3ee00e2a4d87339c0657059947af249dfd71f73fd8b82453ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-model-8.9.1.module\">\n            <sha256 value=\"554a4f69b4fe617cb05cf428d278490b09572e10b7d7c10b43df940b9d755de3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-model\" version=\"8.9.2\">\n         <artifact name=\"builder-model-8.9.2.jar\">\n            <sha256 value=\"4c9d14c92e25b5e7bf22485bfbceb30ff15d85fe31fee9b7ef6ed39a1722799d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-model-8.9.2.module\">\n            <sha256 value=\"4389736c74f92c8f20b7631d3f6b9fc6b07fe0f864ce15eb14d9d34baa657ed5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-test-api\" version=\"8.10.0\">\n         <artifact name=\"builder-test-api-8.10.0.jar\">\n            <sha256 value=\"7c3a956b6f26a8e7bf120230dd9ce275cf3e599636587f566df164297341304c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-test-api-8.10.0.module\">\n            <sha256 value=\"1f24780f63c706c5e8848128b71b5abddfef4ab7bfc1e8ea3123c99c96671a3f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-test-api\" version=\"8.4.1\">\n         <artifact name=\"builder-test-api-8.4.1.jar\">\n            <sha256 value=\"0695ffddad94a68d505ecf49ad6a26470a4227dea6129fc19e4ea5bdd9a769b9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-test-api-8.4.1.module\">\n            <sha256 value=\"c4eb66b95ff2c191f878ba6b8c50fbb03540a0252b914e764886eeb74e50a215\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-test-api\" version=\"8.4.2\">\n         <artifact name=\"builder-test-api-8.4.2.jar\">\n            <sha256 value=\"fccc64f5021ac47adb4df373a20d8ed04b8982441142aa809b4697083cde0f79\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-test-api-8.4.2.module\">\n            <sha256 value=\"148b5b038e1b111d95c91259aab25d579b224185c022f4bec4e0988df26621bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-test-api\" version=\"8.5.0\">\n         <artifact name=\"builder-test-api-8.5.0.jar\">\n            <sha256 value=\"a4769c25ca5b540612d3e0e88254145c59dd053c76c2f106bc3f9cbc01954aae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-test-api-8.5.0.module\">\n            <sha256 value=\"e80e6ed8eec3d53e402c8a64da65a8c50c170d767102d9d949eb7f4fde3c97c7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-test-api\" version=\"8.5.1\">\n         <artifact name=\"builder-test-api-8.5.1.jar\">\n            <sha256 value=\"c5fc53d83ead1f4647b14c3ebb65a544c777531604cf1d80463f98e186073604\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-test-api-8.5.1.module\">\n            <sha256 value=\"3c99293667d5b9dac492a4c2ee7f3fbf8fe0eba0720224a9a5f2226489402b60\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-test-api\" version=\"8.5.2\">\n         <artifact name=\"builder-test-api-8.5.2.jar\">\n            <sha256 value=\"3efbe99c9f5e26c4ba1d9e2a6aab57e1e3a686ac990c8ad04b267d00a7ba32e0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-test-api-8.5.2.module\">\n            <sha256 value=\"a0e8e749700870ee009483eab7a5f44be9f66170062e7362a64b7cdc63ebb99a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-test-api\" version=\"8.6.0\">\n         <artifact name=\"builder-test-api-8.6.0.jar\">\n            <sha256 value=\"aa28511cfa5cb90eaa9b17c11ed6e1a86d54e4f6015d05981dd72418ea4c67d4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-test-api-8.6.0.module\">\n            <sha256 value=\"ddb1dc54f619cd82610c589f2becc1b0a330a28dafcb14a3e2928ef57b94503a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-test-api\" version=\"8.6.1\">\n         <artifact name=\"builder-test-api-8.6.1.jar\">\n            <sha256 value=\"8e80a157d368adf01629f5a306c78fed1fb1dcceee61c45795ae207d91bdab4c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-test-api-8.6.1.module\">\n            <sha256 value=\"742bcac6b559d1b5ee9f3c62366b44257a050cc77f39252b875efaf73c30f64b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-test-api\" version=\"8.7.0\">\n         <artifact name=\"builder-test-api-8.7.0.jar\">\n            <sha256 value=\"c32506113d10a5196b5e3f869802722c8f228c123086c04852f866cdf78c050d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-test-api-8.7.0.module\">\n            <sha256 value=\"273f0115511454a06698f1d2ea1d0777cab2ee00649da49e370341fae4a74af6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-test-api\" version=\"8.7.1\">\n         <artifact name=\"builder-test-api-8.7.1.jar\">\n            <sha256 value=\"cd1af920fe00ff42789cf7980dc93aa97dc91016f2b480981c2fd92376c0850d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-test-api-8.7.1.module\">\n            <sha256 value=\"a03c146d0c2e028c3a1c1fee0cb90f8bb658c968c9676327540573cfca13efac\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-test-api\" version=\"8.7.2\">\n         <artifact name=\"builder-test-api-8.7.2.jar\">\n            <sha256 value=\"fa32ff263053480c2d2023fd3a195b035dd0e98b93ee84fdd5997ee3a2c7a7ca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-test-api-8.7.2.module\">\n            <sha256 value=\"3ec7a0a1895379e42f8b83aed0de2900c602b5b9d93c05a594887f00a0a3f960\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-test-api\" version=\"8.7.3\">\n         <artifact name=\"builder-test-api-8.7.3.jar\">\n            <sha256 value=\"778dd9c17e559401c80db08ebcab67cb773a43de6657417b4320960d296b9b40\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-test-api-8.7.3.module\">\n            <sha256 value=\"ea2ca22f106b6fcde3af6e841f6d389782a6932c22bdc8084f7bd62ddc852d95\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-test-api\" version=\"8.8.0\">\n         <artifact name=\"builder-test-api-8.8.0.jar\">\n            <sha256 value=\"8c254a060ca8b7e8c5b94d1e8b1f1fd77034e740c38aec9ad4e4bd9306cc6446\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-test-api-8.8.0.module\">\n            <sha256 value=\"70de45c72d21b5e9f2ed7cc71d262635f14e6fb61e4e08e56bd39ae6718edb02\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-test-api\" version=\"8.8.1\">\n         <artifact name=\"builder-test-api-8.8.1.jar\">\n            <sha256 value=\"99de7ad6e191b9c729bb5427d54aca378389810c24fd18d794a73d09715862b6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-test-api-8.8.1.module\">\n            <sha256 value=\"348f94f85344c558b811e63e731914f9f888fed01747d24ed09b04cbb96d9e96\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-test-api\" version=\"8.8.2\">\n         <artifact name=\"builder-test-api-8.8.2.jar\">\n            <sha256 value=\"9dd5e458075d34d5f37a729f60f6db126eb63e4479820dd3cf6433119bdce573\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-test-api-8.8.2.module\">\n            <sha256 value=\"7533f9ba6b5ffb68b7661c05af58c85a5f87943a6ca7702f5d9119f457ed8041\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-test-api\" version=\"8.9.0\">\n         <artifact name=\"builder-test-api-8.9.0.jar\">\n            <sha256 value=\"1d517069c6f6621724e4b8a42b3ad9a9eec5c57cc8fe282f3282ffa489065245\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-test-api-8.9.0.module\">\n            <sha256 value=\"a754712d9ba2fe01173b0f30f3170946efd30a36e28bb44a447e4fe56a94ad32\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-test-api\" version=\"8.9.1\">\n         <artifact name=\"builder-test-api-8.9.1.jar\">\n            <sha256 value=\"3cd8bb666b56ba6021c7e3e8a12af9348df2e109a42ec4a6d6e87578a46936c3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-test-api-8.9.1.module\">\n            <sha256 value=\"4e9401b7411d3712c72da5747448a4d2eeaa867b626e6cc69cfdd179935f7fcf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"builder-test-api\" version=\"8.9.2\">\n         <artifact name=\"builder-test-api-8.9.2.jar\">\n            <sha256 value=\"cc8b03a689d59c0dcc998c516ae66270cf3a5777f441d71b8c5272c720907363\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"builder-test-api-8.9.2.module\">\n            <sha256 value=\"162e90e0edd504c328ce808d395d52d8296612cc4dbe6a8fda4698a2e97b2452\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"bundletool\" version=\"1.15.6\">\n         <artifact name=\"bundletool-1.15.6.jar\">\n            <sha256 value=\"f66992e537adb12ffa6d181cdc536d564b1c4b4b4c5972b4891706c6533a4641\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"bundletool-1.15.6.pom\">\n            <sha256 value=\"745894f1d15599871b1c3a6cc09f0da03268f1373ce937ce35942b933d6518e6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"bundletool\" version=\"1.16.0\">\n         <artifact name=\"bundletool-1.16.0.jar\">\n            <sha256 value=\"1ea2bf5274bbac7a3bb5618521d2fa11fb04e900e33a8a646029ec6332fc08c8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"bundletool-1.16.0.pom\">\n            <sha256 value=\"f2e8aad4455a42372462d5e18a26973d67571179a6757f3825f227e91af2f2db\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"bundletool\" version=\"1.17.1\">\n         <artifact name=\"bundletool-1.17.1.jar\">\n            <sha256 value=\"392fd3b099bd82b116c8772ab8fc4139984a91108a643f8dfc9ee29648818ad8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"bundletool-1.17.1.pom\">\n            <sha256 value=\"7cdd337644d523fe60cfb632410c6b7fb7d982eec53270ddbedff1c26333545d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"bundletool\" version=\"1.17.2\">\n         <artifact name=\"bundletool-1.17.2.jar\">\n            <sha256 value=\"166855cb81e10f2328a2931006f4801f422d8f4de5d717ec0f7f16fc2049a089\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"bundletool-1.17.2.pom\">\n            <sha256 value=\"f342d06b5180e6eaba076a2a18a8e7fd66ae9b5f048964afb6ef42a023fa3752\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"bundletool\" version=\"1.18.0\">\n         <artifact name=\"bundletool-1.18.0.jar\">\n            <sha256 value=\"b07f346383bac7d5ddbba2794ddc770565a83ae691d80332264d42dd9bfb4507\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"bundletool-1.18.0.pom\">\n            <sha256 value=\"d7230cbf765abbe27b85337d5c703aa01624ad519913e8dd5f782a1db57bf071\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle\" version=\"8.10.0\">\n         <artifact name=\"gradle-8.10.0.jar\">\n            <sha256 value=\"637b7a7ecb20533b6d2d5401bed07e20549eb700019c6257f137eca73a0cb419\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-8.10.0.module\">\n            <sha256 value=\"2336ba301cab3a5b0da13fb7afb54568dd92c323593f8adc76471fbe8d511b20\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle\" version=\"8.4.1\">\n         <artifact name=\"gradle-8.4.1.jar\">\n            <sha256 value=\"a1bee785b6bb2aeb43740ecc24956ea75336272c88b72fb108f17938a6d9cec9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-8.4.1.module\">\n            <sha256 value=\"792bc97d885734db69582610c4af119697b3ba8425b4f2de4297dc4aa3ab2d7d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle\" version=\"8.4.2\">\n         <artifact name=\"gradle-8.4.2.jar\">\n            <sha256 value=\"8c5c2e91872c44cceeb4c16f3134bea71ce94802866a515fee98e191332753b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-8.4.2.module\">\n            <sha256 value=\"707734318edd2ad1605a2e04d43e1ceb0e8aeb4880f2377641b65a7d5f38b990\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle\" version=\"8.5.0\">\n         <artifact name=\"gradle-8.5.0.jar\">\n            <sha256 value=\"0e8a3e285f9015baf4990fba1238bbceddf05e255967c3d5cec15b5deb52202c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-8.5.0.module\">\n            <sha256 value=\"2066397c8c3796db8e0b6fc5fe71cd99ae45ecef184d4b1a8e99de648db0d942\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle\" version=\"8.5.1\">\n         <artifact name=\"gradle-8.5.1.jar\">\n            <sha256 value=\"037a2f53cdd5d0a2c1cc66632f2fe7a23945cfafb7f9c274fe22a716eca3a796\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-8.5.1.module\">\n            <sha256 value=\"feff23df60b0b5bdf345abd3044d34a1aebdbbb067abfd50966783ffde5ae721\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle\" version=\"8.5.2\">\n         <artifact name=\"gradle-8.5.2.jar\">\n            <sha256 value=\"539d236f1213f9ab3cce8e95deb11df0086a7a5a48e9496d045c17362f36f94a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-8.5.2.module\">\n            <sha256 value=\"74ea833fd683716e4616fd81295206b34e523554ff8b1303aa7af821f6382d00\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle\" version=\"8.6.0\">\n         <artifact name=\"gradle-8.6.0.jar\">\n            <sha256 value=\"8671ef1cd3c0e525a7edd6e95d96b12b2599889ead15666ed98fb68887cae329\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-8.6.0.module\">\n            <sha256 value=\"6b1e46b0f33ddb1dc71b0413a0e59161379bc5232caecdb10971799f52048fcc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle\" version=\"8.6.1\">\n         <artifact name=\"gradle-8.6.1.jar\">\n            <sha256 value=\"9697733a215f2ed42e5b2fc4053484ec832eab29584ebced94d92c91090051c1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-8.6.1.module\">\n            <sha256 value=\"2988bbfa1dd0797c4d5642c8481e5130030db9329a84a69c3e854a9a99940505\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle\" version=\"8.7.0\">\n         <artifact name=\"gradle-8.7.0.jar\">\n            <sha256 value=\"1f56b870c409b61e79883aa4027a22c48cafc0cacd004f4def3f2dea1882faa5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-8.7.0.module\">\n            <sha256 value=\"8d0c836b0863bbd37a47dd7098917a437230c263685ea77f4b8bc599a9fa1354\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle\" version=\"8.7.1\">\n         <artifact name=\"gradle-8.7.1.jar\">\n            <sha256 value=\"349b8b685a0139989370cc2ba55041d333483df405b8b61d0c6b816b7bdaed5a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-8.7.1.module\">\n            <sha256 value=\"a04735c4dc9d8df4c79886c63530d8b95c5cf9fae8aa6d8829d97c8a5c6de243\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle\" version=\"8.7.2\">\n         <artifact name=\"gradle-8.7.2.jar\">\n            <sha256 value=\"906c95446d0c199baba6608e44b549242a0f32635fcd43afa65637caa2d493f6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-8.7.2.module\">\n            <sha256 value=\"669791dec873fb61f8e0938aa5945596ccb84a2071e409e55b5b5b15b6f6a414\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle\" version=\"8.7.3\">\n         <artifact name=\"gradle-8.7.3.jar\">\n            <sha256 value=\"abb4f9e92c9838bd9989ba05968ec892189e16e23f42adba2e063843da04070d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-8.7.3.module\">\n            <sha256 value=\"16f4c87b4f1b7b3b99b3dbc237dc0fe2c5a6b6a6b3143ba46e4a35b1db996a65\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle\" version=\"8.8.0\">\n         <artifact name=\"gradle-8.8.0.jar\">\n            <sha256 value=\"41aa3a813c43db97343646122a0f1a56bfe9e11962661adbb3c6edf5c02edf3c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-8.8.0.module\">\n            <sha256 value=\"323ce65d31a858ae6032cb0be6a95b6c904e4f8108c2af84e10b370a6621cd49\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle\" version=\"8.8.1\">\n         <artifact name=\"gradle-8.8.1.jar\">\n            <sha256 value=\"b1a04b22cd86b7c8e72ead579b43e0e2f1ea8f666d7aa546c06272ee0c77d411\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-8.8.1.module\">\n            <sha256 value=\"fe731ec59c4d940267ba6dcef1cacdb0dfcbe0861563661835201e3b981a3c64\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle\" version=\"8.8.2\">\n         <artifact name=\"gradle-8.8.2.jar\">\n            <sha256 value=\"32945fc1e6eb002995bba91e53ca92495b69075eecb485eee8716e81d0d67749\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-8.8.2.module\">\n            <sha256 value=\"d0749ccc4f9f2cdf0ebeb9282f842e00c62c8655679189141e38a78eefb8a702\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle\" version=\"8.9.0\">\n         <artifact name=\"gradle-8.9.0.jar\">\n            <sha256 value=\"5622311d167577317429ec057a626b191e721460a6aea5e2260812721052c81b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-8.9.0.module\">\n            <sha256 value=\"56212c6caa870817d0b649c1875067a487d5cab592e75ff920d36a3d74f5c6b9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle\" version=\"8.9.1\">\n         <artifact name=\"gradle-8.9.1.jar\">\n            <sha256 value=\"8aeaa7fa7bfbc9ade7746eb86d37dd5990118fbede400c9ebadc63d13cc6c880\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-8.9.1.module\">\n            <sha256 value=\"6ff4ff497b8f0789132252781c2cd4cabb8fbf0a1ef613f8ab133ba62efaa1e6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle\" version=\"8.9.2\">\n         <artifact name=\"gradle-8.9.2.jar\">\n            <sha256 value=\"6c313d24d07ac393cfc7db5d63c5029e7d20b278781c42b2d22adf9bcc7dba30\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-8.9.2.module\">\n            <sha256 value=\"048f328cf1d56f1e52d71be7d0115c5c9a900add50c939029c86275e0bca38b9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-api\" version=\"8.10.0\">\n         <artifact name=\"gradle-api-8.10.0.jar\">\n            <sha256 value=\"0ebe73be6a14469b963334d49727025c941952a701b89f53f0849d997a22c199\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-api-8.10.0.module\">\n            <sha256 value=\"c9b1264969fbe27d216f5cf302fe7766fd73f75058e59bdfad7e3c2051eb058f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-api\" version=\"8.4.1\">\n         <artifact name=\"gradle-api-8.4.1.jar\">\n            <sha256 value=\"dbb375af8d47cf6b6820a34ce5cdb2dc6efcf33220d874e19caa3321ae00da61\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-api-8.4.1.module\">\n            <sha256 value=\"e0d78dc9a6861a3b7599eb0d9415875ac68b934cee5988c86c4b6dc93b4eaac3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-api\" version=\"8.4.2\">\n         <artifact name=\"gradle-api-8.4.2.jar\">\n            <sha256 value=\"c54df7dbff5e2e23922e7bb7df9e77709a425853e1af081b1d0824f829d8ee51\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-api-8.4.2.module\">\n            <sha256 value=\"92ea3e08059f18a90bd2f85af97d9b8b223c6935b07cb4e7649390ee8b1909cc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-api\" version=\"8.5.0\">\n         <artifact name=\"gradle-api-8.5.0.jar\">\n            <sha256 value=\"dfbc62ea16b51e4d3a8417eb0af49c7e0516704e0d60a00f7c0ac8ca13e10db4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-api-8.5.0.module\">\n            <sha256 value=\"20189722d8d95111cde59c1d8c1bbc776891ac1a5de09421156b9e1c053bd1a2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-api\" version=\"8.5.1\">\n         <artifact name=\"gradle-api-8.5.1.jar\">\n            <sha256 value=\"8fdf516c334e0a2951e441c5d4aa039644bfeef69ecbcb80a12026cc430049e9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-api-8.5.1.module\">\n            <sha256 value=\"6e3a209e736106cf8e23e9d1f80d5ef3530385ec69fa341486a1bea0eb80e9d0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-api\" version=\"8.5.2\">\n         <artifact name=\"gradle-api-8.5.2.jar\">\n            <sha256 value=\"3aad984ecdd58f19c34ce8c5fe7ec1118eed364fd5e912beb191c805436f22b8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-api-8.5.2.module\">\n            <sha256 value=\"ede14e5fffa94e6002b9d2d27bdc17153f8049688a3b13f1d10314735e1106fe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-api\" version=\"8.6.0\">\n         <artifact name=\"gradle-api-8.6.0.jar\">\n            <sha256 value=\"f68924d59ae7cbcc46284892a3938b0e1413190b6fc8e9535ed7bc6179ba0d97\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-api-8.6.0.module\">\n            <sha256 value=\"41f6d69f8bdcd0ba9cf0b67ffd5a823215d070004f0e5c03ca5274439ae0aff1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-api\" version=\"8.6.1\">\n         <artifact name=\"gradle-api-8.6.1.jar\">\n            <sha256 value=\"07f76bf2f8f7b2f376cc86eabd4f8a8279182b6570f440e7843d066f02c5f556\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-api-8.6.1.module\">\n            <sha256 value=\"2995d8aade215eea0e420e4f33dbf644a0b8a47c64693e407c2cc5745adaecb3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-api\" version=\"8.7.0\">\n         <artifact name=\"gradle-api-8.7.0.jar\">\n            <sha256 value=\"09e441732c94c811b9f685d840edee4a986ee7b322e10abb6f0abdfd6c7c3382\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-api-8.7.0.module\">\n            <sha256 value=\"2d6df358428c87ab5e2562292044f8fccb8e9393663d447b6f2956cb317a19c0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-api\" version=\"8.7.1\">\n         <artifact name=\"gradle-api-8.7.1.jar\">\n            <sha256 value=\"681e1b439c9ca338c628fbde88b779f9e193a9b65e5f478732402be894d2c06f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-api-8.7.1.module\">\n            <sha256 value=\"dd08cd82925db5c3d0aba1bce55f35ae20b9e827df2751395044a85f080bd18d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-api\" version=\"8.7.2\">\n         <artifact name=\"gradle-api-8.7.2.jar\">\n            <sha256 value=\"a21ce89ae51a3f733337255c29b1d511204dd193ae5280f75a4d81d2154cbf52\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-api-8.7.2.module\">\n            <sha256 value=\"ca9874263be7e628184908af06d230ac64cb5ab5ca0afe45eb91a6bd1ce7c760\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-api\" version=\"8.7.3\">\n         <artifact name=\"gradle-api-8.7.3.jar\">\n            <sha256 value=\"869adf75ea8f5be7677850f4e70f221a407e7ef28934c58b1d8d1eb21d7fba45\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-api-8.7.3.module\">\n            <sha256 value=\"39ea4c088b295b8e234b92b7936b777650e71fbc20da87def782d9882e379d7f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-api\" version=\"8.8.0\">\n         <artifact name=\"gradle-api-8.8.0.jar\">\n            <sha256 value=\"efec89fd2051b195b68ff75150d2cd1a7a817c22acf64c605abf9e27a40590f3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-api-8.8.0.module\">\n            <sha256 value=\"ac45350138a2210af255cbaee8cdfb9d3aa7d833b4546738c36f20b16136bb1e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-api\" version=\"8.8.1\">\n         <artifact name=\"gradle-api-8.8.1.jar\">\n            <sha256 value=\"b7dea91d60dc201407e1b705d71a2cb4b61a1d8568765ca337f98856d138374a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-api-8.8.1.module\">\n            <sha256 value=\"53414a1a4f7472943aa48c5b101e282718efbb0bd71c82274a8a312a0e113f53\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-api\" version=\"8.8.2\">\n         <artifact name=\"gradle-api-8.8.2.jar\">\n            <sha256 value=\"0c931caddbeb567afbbe3a3489915a90618b4e5dbc6f43adbdd81f174c28c69a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-api-8.8.2.module\">\n            <sha256 value=\"8aa8bbc7e9d2d35afd0e9ce8688db1ecce9bb416635ebfd4881dbc5cf61e1874\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-api\" version=\"8.9.0\">\n         <artifact name=\"gradle-api-8.9.0.jar\">\n            <sha256 value=\"def07a7589acd9a40c65e289d0788c0eaee29fe48968307ed7020959641fe547\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-api-8.9.0.module\">\n            <sha256 value=\"e6f4e808c4cf11978a4610465cbe8b65ea80e5a932deb408ded8338000d573b4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-api\" version=\"8.9.1\">\n         <artifact name=\"gradle-api-8.9.1.jar\">\n            <sha256 value=\"2befa7bb32ffc2d83a24bd8eac0edf5576f8a33cf51caf7752332b70ec1c25d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-api-8.9.1.module\">\n            <sha256 value=\"18f90a1b9835bc1d0ac6ff9a6ddd364120529056de8cfe93138ad1093bbf89c1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-api\" version=\"8.9.2\">\n         <artifact name=\"gradle-api-8.9.2.jar\">\n            <sha256 value=\"b63622110f239b02c9155a32c67aa7bf7c7afe54957ef2c961e3a3277c4db28f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-api-8.9.2.module\">\n            <sha256 value=\"8a6f9929d7f52757fc28ff3d197359f339f917cc18d2b15e8730b37340b7339e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-settings-api\" version=\"8.10.0\">\n         <artifact name=\"gradle-settings-api-8.10.0.jar\">\n            <sha256 value=\"7cec39b5a895cc6a2a12f7fdae15de01bc160054acd0db01e7d5fe1b4254a8aa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-settings-api-8.10.0.module\">\n            <sha256 value=\"05de5f832890955c09585f5bc110af79b29cdec2af2e15ef5dc1b0d68559da78\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-settings-api\" version=\"8.4.1\">\n         <artifact name=\"gradle-settings-api-8.4.1.jar\">\n            <sha256 value=\"48fca54253cb93182afcb1173c1dbd9953aad7bf29b225b2e37ef9e1ddc01606\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-settings-api-8.4.1.module\">\n            <sha256 value=\"5f9ccca03508351f095a3765a434590a415d69eb9106c110829affe27b8bbd05\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-settings-api\" version=\"8.4.2\">\n         <artifact name=\"gradle-settings-api-8.4.2.jar\">\n            <sha256 value=\"80f945de76fa05578318dd0e5bfc9393583df0adb0425c0b384f50bfeb690c87\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-settings-api-8.4.2.module\">\n            <sha256 value=\"5b5c2545e0cc2458287b3147a379d8580a8ae39fa9bd173926526a919b6c4c4d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-settings-api\" version=\"8.5.0\">\n         <artifact name=\"gradle-settings-api-8.5.0.jar\">\n            <sha256 value=\"59ed9e273866bdd5beda9d6aa3bd2fdd9e8926d36b33614ab309261286f817f9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-settings-api-8.5.0.module\">\n            <sha256 value=\"5d3366c7b757cbd7287711439e4b97a2640d97d013e20d410887b3c98d52726f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-settings-api\" version=\"8.5.1\">\n         <artifact name=\"gradle-settings-api-8.5.1.jar\">\n            <sha256 value=\"82264c1cb460ffbdac88096cf71762723418b79cc331a49e561b6950df2dc1af\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-settings-api-8.5.1.module\">\n            <sha256 value=\"5e9afdbc02af2dcc707f8d0df76deec59c5a36c68923e7504106eb50ba32c77c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-settings-api\" version=\"8.5.2\">\n         <artifact name=\"gradle-settings-api-8.5.2.jar\">\n            <sha256 value=\"11f607850dac33267a60bf0bee1a55858731fffe001f800fe99bef88393c0b0f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-settings-api-8.5.2.module\">\n            <sha256 value=\"b57d71d8e3307b4f3802175451f3c341c48aa48feeacaf24e87450ea664a1f43\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-settings-api\" version=\"8.6.0\">\n         <artifact name=\"gradle-settings-api-8.6.0.jar\">\n            <sha256 value=\"b0d2a06d406e72aa8dea607d7c90815d7283d16a0cd8f86c434a6151b6e3373d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-settings-api-8.6.0.module\">\n            <sha256 value=\"bea1ed831066e77ad9b099e8210fa1d321c692b28421173b78421a154d9b96e4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-settings-api\" version=\"8.6.1\">\n         <artifact name=\"gradle-settings-api-8.6.1.jar\">\n            <sha256 value=\"7ca7dbd0be9120478990e25fb83cf083a3fc79bca9644e247cc5546358ce2982\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-settings-api-8.6.1.module\">\n            <sha256 value=\"ab3343832b233380134a11533a545a2a8fb718b6e8483c6d92630411335907be\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-settings-api\" version=\"8.7.0\">\n         <artifact name=\"gradle-settings-api-8.7.0.jar\">\n            <sha256 value=\"7ddfc77332dee3585243152238ff00ac47b1707a419c0f1448453a0498fb6836\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-settings-api-8.7.0.module\">\n            <sha256 value=\"52880868464ece10df7d3c636c2f7b4571f258e458f1a9473bc59db3d92d00c7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-settings-api\" version=\"8.7.1\">\n         <artifact name=\"gradle-settings-api-8.7.1.jar\">\n            <sha256 value=\"dbda239fee4f860c8d80e1cca433b959e68d3bc8c16837ba191d73c0fd302647\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-settings-api-8.7.1.module\">\n            <sha256 value=\"6650296e2da532ed1e3fccaf97713ec60445cfd2fe26ff783b7b6558af208072\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-settings-api\" version=\"8.7.2\">\n         <artifact name=\"gradle-settings-api-8.7.2.jar\">\n            <sha256 value=\"af6a1a17ccdc561be1041edfed136da2dddebaf722bc954e119f2e061a4838d4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-settings-api-8.7.2.module\">\n            <sha256 value=\"532e89558e33a7ea40d9f8f4348ade923f16661224c6457a0ca1cc64fa34aeed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-settings-api\" version=\"8.7.3\">\n         <artifact name=\"gradle-settings-api-8.7.3.jar\">\n            <sha256 value=\"8a8711ba27e0e8b725bd4b92b16b08d0ea364133364fdd2fd9b6be05f2aa8438\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-settings-api-8.7.3.module\">\n            <sha256 value=\"3181323998b479ffb707dc77b52a51c4d882ddd1eb45470ddf83937038ccae4f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-settings-api\" version=\"8.8.0\">\n         <artifact name=\"gradle-settings-api-8.8.0.jar\">\n            <sha256 value=\"059dca48b421d9c1ebe0dacd6f0aa62081c0a1d3857010a7912b05f438a0540b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-settings-api-8.8.0.module\">\n            <sha256 value=\"e4a8a83c8f7a4042ed4d4dff7540de4b23f7fbcb890b725de0e3515983326b7b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-settings-api\" version=\"8.8.1\">\n         <artifact name=\"gradle-settings-api-8.8.1.jar\">\n            <sha256 value=\"70b5065989037a1d59377de36a29cfbf16d489881ab391ae1feaffb65f2425ba\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-settings-api-8.8.1.module\">\n            <sha256 value=\"5c66d9d9637ffc5b116ffe468787f63128a86ef4494fba4e63b4359eba470881\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-settings-api\" version=\"8.8.2\">\n         <artifact name=\"gradle-settings-api-8.8.2.jar\">\n            <sha256 value=\"6b1a665f90cf02f5fcf214a0dda4da072e0195a6c64a90b98321512906c3258a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-settings-api-8.8.2.module\">\n            <sha256 value=\"5f1bc684317c4b97823117b958ec728a1193f896d7b1921f5782d5cbafeae21b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-settings-api\" version=\"8.9.0\">\n         <artifact name=\"gradle-settings-api-8.9.0.jar\">\n            <sha256 value=\"8243da80bce5a3c55a2960a4598cba8c45a4c5b43a5d3d19954c047920c36c67\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-settings-api-8.9.0.module\">\n            <sha256 value=\"66472fae745d1d83bb6744e416e3d22cea72eb0eb405aafbfd8f85eb719629af\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-settings-api\" version=\"8.9.1\">\n         <artifact name=\"gradle-settings-api-8.9.1.jar\">\n            <sha256 value=\"5e74a1d59b5039b65c344ec1e5a8afa878217d9a2338cc486c47be786b5915d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-settings-api-8.9.1.module\">\n            <sha256 value=\"73001102f28f9ed83a38efdf45c2fb3ff309d338affd37d3480f6c5f4b026c0e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"gradle-settings-api\" version=\"8.9.2\">\n         <artifact name=\"gradle-settings-api-8.9.2.jar\">\n            <sha256 value=\"a9454b5d1db19e004907a16d26c082b77f577cadc3ca87fd3e43f6834b6782a5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gradle-settings-api-8.9.2.module\">\n            <sha256 value=\"d0e1cd2789aefbb79edda9955e7ae6ddb31c04710874f962746a516e4e64bf6b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"manifest-merger\" version=\"31.10.0\">\n         <artifact name=\"manifest-merger-31.10.0.jar\">\n            <sha256 value=\"fe3527bc6fc69b9abc0466eff5ac530b3e423b493953eab29196f851b9a24727\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"manifest-merger-31.10.0.module\">\n            <sha256 value=\"22861a55d40325ccc9f756070095c386ce3351101ad2282b7a5666c8a26de5c3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"manifest-merger\" version=\"31.4.1\">\n         <artifact name=\"manifest-merger-31.4.1.jar\">\n            <sha256 value=\"437c35776f2eb292cdfb809ac79da0028bc8b943d7f1f5e5095f0ccf13b1c66e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"manifest-merger-31.4.1.module\">\n            <sha256 value=\"f0547bef8c8786e5653705a5cee7a97727d314c63a6d4bb7b07074a06bec017f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"manifest-merger\" version=\"31.4.2\">\n         <artifact name=\"manifest-merger-31.4.2.jar\">\n            <sha256 value=\"0b55cf1d17710a66cf0a229d6a560392a6320bcf7b6b3690e10cd90a4cad4694\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"manifest-merger-31.4.2.module\">\n            <sha256 value=\"c76f18554f5963e79eabadfdb4105fad99ad2a140cb5625117ebefa8df96fc1b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"manifest-merger\" version=\"31.5.0\">\n         <artifact name=\"manifest-merger-31.5.0.jar\">\n            <sha256 value=\"c3d7ff7cc87333c1fe34b5315bff14a85dede6bfb060d92ba483a99f7f39a4a4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"manifest-merger-31.5.0.module\">\n            <sha256 value=\"40db52f29158b5a16dc145cef02b3468cebbc1626e8b5a3805fdc5a0a9793c0d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"manifest-merger\" version=\"31.5.1\">\n         <artifact name=\"manifest-merger-31.5.1.jar\">\n            <sha256 value=\"5afe0e3263a37c158dd4288bcccaa09151fbb4cc2071fd6de706242af518847d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"manifest-merger-31.5.1.module\">\n            <sha256 value=\"0f9d9b5617852a601330cb3835f4e759ee74aa56c95310c1c28e77f52eb2418f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"manifest-merger\" version=\"31.5.2\">\n         <artifact name=\"manifest-merger-31.5.2.jar\">\n            <sha256 value=\"9dae7cd6914283fd7c441068b77061e5083ffa3d4ee0d4dd01e08d849ad255c8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"manifest-merger-31.5.2.module\">\n            <sha256 value=\"15effa3b657381147230b13546103995df04f07e584d7c6d1070903d38028445\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"manifest-merger\" version=\"31.6.0\">\n         <artifact name=\"manifest-merger-31.6.0.jar\">\n            <sha256 value=\"feadd86b560f0c580b699679e24e9000770e32be5547b0948348cdec50f4d835\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"manifest-merger-31.6.0.module\">\n            <sha256 value=\"ebf39808cf2d411961400abe7e06da3cf1ade0307e5bb110a8c64ecb4f5cb66f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"manifest-merger\" version=\"31.6.1\">\n         <artifact name=\"manifest-merger-31.6.1.jar\">\n            <sha256 value=\"aa963d4af45ab031c570783ce9286d2111eeb0b8c3bdf44e48ca90714cccb754\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"manifest-merger-31.6.1.module\">\n            <sha256 value=\"5ab814c5c62ae80a601e938b53139c10f14a89c30a5563c50ac452787371b0f6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"manifest-merger\" version=\"31.7.0\">\n         <artifact name=\"manifest-merger-31.7.0.jar\">\n            <sha256 value=\"ab92276434e5a61e86c590e7b19f2de161778fa275fc08a8eec84081e2703bb3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"manifest-merger-31.7.0.module\">\n            <sha256 value=\"12e8030d8b5334eb5a4ac3d0c10f50f48f5f7b4f8542966599dfa45f8b6c53d7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"manifest-merger\" version=\"31.7.1\">\n         <artifact name=\"manifest-merger-31.7.1.jar\">\n            <sha256 value=\"a748c09cfac12507b180e811fb3093f5b112f9b3774d57edf01c7423473d73e8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"manifest-merger-31.7.1.module\">\n            <sha256 value=\"ed38ea32b75a9db5a1c96f8b493dd90506939eae0dd0d686191a5832c299ccae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"manifest-merger\" version=\"31.7.2\">\n         <artifact name=\"manifest-merger-31.7.2.jar\">\n            <sha256 value=\"83e6bfbc795e161ee59609170e952e3591aea86c895c119ebea464ea53f9f500\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"manifest-merger-31.7.2.module\">\n            <sha256 value=\"5d896719b7cc3caedac356b8fc12ea38ddd0172de5689f3f7bb7693203469e98\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"manifest-merger\" version=\"31.7.3\">\n         <artifact name=\"manifest-merger-31.7.3.jar\">\n            <sha256 value=\"f1a6e56adbd557d6bf34447a62ff4680642c799c397a4bc14a81256bd961e6ab\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"manifest-merger-31.7.3.module\">\n            <sha256 value=\"f77ce53826d03b3a8bcd940f0c3ab2c7e5dc4df404f04858fc8724b26afe761c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"manifest-merger\" version=\"31.8.0\">\n         <artifact name=\"manifest-merger-31.8.0.jar\">\n            <sha256 value=\"bbee1472702040404d9e800ebf9aa884c671fde925e4e2ef3bde45acf5b79abd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"manifest-merger-31.8.0.module\">\n            <sha256 value=\"31a9860f694d2b9f54558295af7d2d9fda8ab26bfe8496d7daca9404fe38721f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"manifest-merger\" version=\"31.8.1\">\n         <artifact name=\"manifest-merger-31.8.1.jar\">\n            <sha256 value=\"591e9975a91f5e8e8186a601f992aefb9d06a5f271ed73d18f2fe3c1c4d78497\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"manifest-merger-31.8.1.module\">\n            <sha256 value=\"c6f0df5227045ff61307fe749add797d08d0d35c30f5f52523cfaa849cba096a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"manifest-merger\" version=\"31.8.2\">\n         <artifact name=\"manifest-merger-31.8.2.jar\">\n            <sha256 value=\"5f46751193f5c5af795376b0e6e992fe9e9b9f8216d9caafda6f010bb6f3862f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"manifest-merger-31.8.2.module\">\n            <sha256 value=\"7bf8088e7de5a684fe9d6595e108ed7ff69ae65b73a3f5f4243b977e5ee10c0c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"manifest-merger\" version=\"31.9.0\">\n         <artifact name=\"manifest-merger-31.9.0.jar\">\n            <sha256 value=\"fb6a049e4ee425a4f558ecebd94d71e1225946cb92888377b56b852d046e263a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"manifest-merger-31.9.0.module\">\n            <sha256 value=\"9546d3ba71fbe6af97768b8e8f6f57de792bf662260420efade9ff61c2335774\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"manifest-merger\" version=\"31.9.1\">\n         <artifact name=\"manifest-merger-31.9.1.jar\">\n            <sha256 value=\"f421d232516c489f34300e2120d18c66a623a5cb7a9e3a1ee836324c6e9b6128\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"manifest-merger-31.9.1.module\">\n            <sha256 value=\"6dca12c5f607ba63c1558d2fd7331326f53c514c4fdeacb4fe0961944686ca06\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"manifest-merger\" version=\"31.9.2\">\n         <artifact name=\"manifest-merger-31.9.2.jar\">\n            <sha256 value=\"6663749b34182327c15fa5d888f868b467765d19730629789fedd3ff8c404492\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"manifest-merger-31.9.2.module\">\n            <sha256 value=\"09df741cb3992587e14ff0cfa94dbdfd72189de2cef7be3b8989618f4e13520a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build\" name=\"transform-api\" version=\"2.0.0-deprecated-use-gradle-api\">\n         <artifact name=\"transform-api-2.0.0-deprecated-use-gradle-api.jar\">\n            <sha256 value=\"4de4a3d05e1c534c2db9e4588bf34082bb2bd232d8abb9727c430290ce225740\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"transform-api-2.0.0-deprecated-use-gradle-api.pom\">\n            <sha256 value=\"7c62f3856e8abca1d79257925f26c12668693f5d95904056bbac88605cfd8575\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build.jetifier\" name=\"jetifier-core\" version=\"1.0.0-beta10\">\n         <artifact name=\"jetifier-core-1.0.0-beta10.jar\">\n            <sha256 value=\"26abb4a13927d9062169c504c9e94fe80e9ae3a4f7b5ab8875ab007536a91f5e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"jetifier-core-1.0.0-beta10.module\">\n            <sha256 value=\"f0917589a42d276163f10040ab5842e91883dcbdb1d48bfd1f1fcaa72c1ca7b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.build.jetifier\" name=\"jetifier-processor\" version=\"1.0.0-beta10\">\n         <artifact name=\"jetifier-processor-1.0.0-beta10.jar\">\n            <sha256 value=\"c5067a7b928237a1271a5e9cb5710e9f80b4973293945bc51e3a4c864ea4bfed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"jetifier-processor-1.0.0-beta10.module\">\n            <sha256 value=\"36c25576b19993df360170528cc62b7246c37776d6158154a67cdf8fc2d58e13\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.ddms\" name=\"ddmlib\" version=\"31.10.0\">\n         <artifact name=\"ddmlib-31.10.0.jar\">\n            <sha256 value=\"387ce86bcc1292f661d7eff1c2d661a00615c58515ded87c679cb8b78b2e7331\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ddmlib-31.10.0.pom\">\n            <sha256 value=\"fa3887ea5d605084953c71d5fa642703ddd50149a3eb1b72bde525e8e7419f29\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.ddms\" name=\"ddmlib\" version=\"31.4.1\">\n         <artifact name=\"ddmlib-31.4.1.jar\">\n            <sha256 value=\"f98b88cfe0fe729d755f0bf6d5fc21e20f89aea9e630860dc0f75dcbec6fec0b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ddmlib-31.4.1.pom\">\n            <sha256 value=\"17b53d1f91e16af0a086206668d36f7bdc97f3c00382a21b12d03ce12e65e0a5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.ddms\" name=\"ddmlib\" version=\"31.4.2\">\n         <artifact name=\"ddmlib-31.4.2.jar\">\n            <sha256 value=\"f98b88cfe0fe729d755f0bf6d5fc21e20f89aea9e630860dc0f75dcbec6fec0b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ddmlib-31.4.2.pom\">\n            <sha256 value=\"67e58784d90b931e2fcdaf446f7e11bd1c39fad31403d68f5fa95bd75859281c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.ddms\" name=\"ddmlib\" version=\"31.5.0\">\n         <artifact name=\"ddmlib-31.5.0.jar\">\n            <sha256 value=\"c571c0224fe3e7e6607196d95cc3142fdc19f013e8f1510f68c7b4a686c53809\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ddmlib-31.5.0.pom\">\n            <sha256 value=\"e5a0906e9e236a09d633d230cbe988d37b69a6cd7d33435984414ecd25262121\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.ddms\" name=\"ddmlib\" version=\"31.5.1\">\n         <artifact name=\"ddmlib-31.5.1.jar\">\n            <sha256 value=\"c571c0224fe3e7e6607196d95cc3142fdc19f013e8f1510f68c7b4a686c53809\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ddmlib-31.5.1.pom\">\n            <sha256 value=\"1dd911a538e2ec0ce867aa9df2ab4cd81ea1be75e5f0db8521a8c50cc55c3ff3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.ddms\" name=\"ddmlib\" version=\"31.5.2\">\n         <artifact name=\"ddmlib-31.5.2.jar\">\n            <sha256 value=\"c571c0224fe3e7e6607196d95cc3142fdc19f013e8f1510f68c7b4a686c53809\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ddmlib-31.5.2.pom\">\n            <sha256 value=\"d96630909ae487d77e94969e15e00bdf4b9caf16183f7156ab1220d444909c41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.ddms\" name=\"ddmlib\" version=\"31.6.0\">\n         <artifact name=\"ddmlib-31.6.0.jar\">\n            <sha256 value=\"c571c0224fe3e7e6607196d95cc3142fdc19f013e8f1510f68c7b4a686c53809\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ddmlib-31.6.0.pom\">\n            <sha256 value=\"36776ce715246de41882b6550a6de16b6e8b684722df94e2effad91d9dff57f0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.ddms\" name=\"ddmlib\" version=\"31.6.1\">\n         <artifact name=\"ddmlib-31.6.1.jar\">\n            <sha256 value=\"c571c0224fe3e7e6607196d95cc3142fdc19f013e8f1510f68c7b4a686c53809\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ddmlib-31.6.1.pom\">\n            <sha256 value=\"36118a34844ef3353bc078a4a3f47088423428ad6ad1e8cd4ad01557a29ae8e9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.ddms\" name=\"ddmlib\" version=\"31.7.0\">\n         <artifact name=\"ddmlib-31.7.0.jar\">\n            <sha256 value=\"0d7ef53823f6a21b807f398f0d039a5dde184b58c5589625626ca4aa3d6108ed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ddmlib-31.7.0.pom\">\n            <sha256 value=\"c45e49892e1d33162ebbc3f1d45a57ac03b533db092351c80a11171ac7a60b7b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.ddms\" name=\"ddmlib\" version=\"31.7.1\">\n         <artifact name=\"ddmlib-31.7.1.jar\">\n            <sha256 value=\"0d7ef53823f6a21b807f398f0d039a5dde184b58c5589625626ca4aa3d6108ed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ddmlib-31.7.1.pom\">\n            <sha256 value=\"9da3d515a99fd808c0032b7a1d04a2714f8f217445b123e69f36b7aabc6a0195\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.ddms\" name=\"ddmlib\" version=\"31.7.2\">\n         <artifact name=\"ddmlib-31.7.2.jar\">\n            <sha256 value=\"0d7ef53823f6a21b807f398f0d039a5dde184b58c5589625626ca4aa3d6108ed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ddmlib-31.7.2.pom\">\n            <sha256 value=\"81ef96a59461b4b99d3120523671e16c8cf3cbfabd0118b19e7560b5970b609d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.ddms\" name=\"ddmlib\" version=\"31.7.3\">\n         <artifact name=\"ddmlib-31.7.3.jar\">\n            <sha256 value=\"0d7ef53823f6a21b807f398f0d039a5dde184b58c5589625626ca4aa3d6108ed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ddmlib-31.7.3.pom\">\n            <sha256 value=\"d3e758195895bb5ba17b406be5bdfd85b934579dbc536b332d17abfd280a9a06\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.ddms\" name=\"ddmlib\" version=\"31.8.0\">\n         <artifact name=\"ddmlib-31.8.0.jar\">\n            <sha256 value=\"ab1288e6ec107a377cbaa3d0c558160fffa5813f5f263c24de3270a5eb73aa98\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ddmlib-31.8.0.pom\">\n            <sha256 value=\"a8d2a7c08be37cf65fb40afd6173a037119859cff1c44a9494bb6ffd3bbd1e3a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.ddms\" name=\"ddmlib\" version=\"31.8.1\">\n         <artifact name=\"ddmlib-31.8.1.jar\">\n            <sha256 value=\"ab1288e6ec107a377cbaa3d0c558160fffa5813f5f263c24de3270a5eb73aa98\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ddmlib-31.8.1.pom\">\n            <sha256 value=\"308e32e6c7be75c54d01c02119ca2e1b0a531201611d153072daccca1f69f15b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.ddms\" name=\"ddmlib\" version=\"31.8.2\">\n         <artifact name=\"ddmlib-31.8.2.jar\">\n            <sha256 value=\"ab1288e6ec107a377cbaa3d0c558160fffa5813f5f263c24de3270a5eb73aa98\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ddmlib-31.8.2.pom\">\n            <sha256 value=\"83b1e6e593794ae9fd5193ad4d1d5935dad94009533b885a364a8bcd7b837dfb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.ddms\" name=\"ddmlib\" version=\"31.9.0\">\n         <artifact name=\"ddmlib-31.9.0.jar\">\n            <sha256 value=\"9cdca206e08fbc1f01daa1a0d64ead2a62b8ccc5941569f5181e27e4a6f5fba0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ddmlib-31.9.0.pom\">\n            <sha256 value=\"b7b14d346cc34221a1596e314bb9052b879a406857f3fd78defba71016af7cd7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.ddms\" name=\"ddmlib\" version=\"31.9.1\">\n         <artifact name=\"ddmlib-31.9.1.jar\">\n            <sha256 value=\"9cdca206e08fbc1f01daa1a0d64ead2a62b8ccc5941569f5181e27e4a6f5fba0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ddmlib-31.9.1.pom\">\n            <sha256 value=\"7cfcccb6e1542ac568e2de548383b169f451225a98ea337870a7ae570209c3e3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.ddms\" name=\"ddmlib\" version=\"31.9.2\">\n         <artifact name=\"ddmlib-31.9.2.jar\">\n            <sha256 value=\"9cdca206e08fbc1f01daa1a0d64ead2a62b8ccc5941569f5181e27e4a6f5fba0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ddmlib-31.9.2.pom\">\n            <sha256 value=\"7a149763d4861a0f19409c714b9e12eb1bf9d8288ab6420c8214ecf160273739\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.emulator\" name=\"proto\" version=\"31.10.0\">\n         <artifact name=\"proto-31.10.0.jar\">\n            <sha256 value=\"4087c62ad9191331d1f342d2a0b5d8bd9bb42bd325e397f6b7e5c63698bd35ad\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-31.10.0.pom\">\n            <sha256 value=\"fa34b2fce0f564add2d3f2c3d05390c05860d49a53bc431102315b12ea668ca8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.emulator\" name=\"proto\" version=\"31.4.1\">\n         <artifact name=\"proto-31.4.1.jar\">\n            <sha256 value=\"5994f35bcfe498aee92a82340b7600902439b1aa153b9398591105c4e00bb994\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-31.4.1.pom\">\n            <sha256 value=\"bb427aa329f1180f4ad90029cf10544e0b0ec6dece7f851aa8c54a4199cb55ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.emulator\" name=\"proto\" version=\"31.4.2\">\n         <artifact name=\"proto-31.4.2.jar\">\n            <sha256 value=\"5994f35bcfe498aee92a82340b7600902439b1aa153b9398591105c4e00bb994\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-31.4.2.pom\">\n            <sha256 value=\"46804df4a4d51b2beb86021b9dc5fbfef9863db2055356f99ff24e91e5b250e3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.emulator\" name=\"proto\" version=\"31.5.0\">\n         <artifact name=\"proto-31.5.0.jar\">\n            <sha256 value=\"5994f35bcfe498aee92a82340b7600902439b1aa153b9398591105c4e00bb994\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-31.5.0.pom\">\n            <sha256 value=\"55855aaee229b78b483f00c41636ab383f9b00fac90ebc79828a5ccc8264d3de\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.emulator\" name=\"proto\" version=\"31.5.1\">\n         <artifact name=\"proto-31.5.1.jar\">\n            <sha256 value=\"5994f35bcfe498aee92a82340b7600902439b1aa153b9398591105c4e00bb994\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-31.5.1.pom\">\n            <sha256 value=\"c91a95d6473f00419cc04ddb26e297994af0d79c419c7222d7af40b1f4e7d804\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.emulator\" name=\"proto\" version=\"31.5.2\">\n         <artifact name=\"proto-31.5.2.jar\">\n            <sha256 value=\"5994f35bcfe498aee92a82340b7600902439b1aa153b9398591105c4e00bb994\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-31.5.2.pom\">\n            <sha256 value=\"2dcebb9e4c5ce1fdb04b0c44285244122c23ba4126f151e08bc473002286d30d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.emulator\" name=\"proto\" version=\"31.6.0\">\n         <artifact name=\"proto-31.6.0.jar\">\n            <sha256 value=\"5994f35bcfe498aee92a82340b7600902439b1aa153b9398591105c4e00bb994\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-31.6.0.pom\">\n            <sha256 value=\"5b4b791b688f772173652cc17c7842a0470b47aa06e5ea45b554c1e613d3476d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.emulator\" name=\"proto\" version=\"31.6.1\">\n         <artifact name=\"proto-31.6.1.jar\">\n            <sha256 value=\"5994f35bcfe498aee92a82340b7600902439b1aa153b9398591105c4e00bb994\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-31.6.1.pom\">\n            <sha256 value=\"86923b41884bdb1fc8076737613f799b6d313b3a63b21e7143492be2327af895\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.emulator\" name=\"proto\" version=\"31.7.0\">\n         <artifact name=\"proto-31.7.0.jar\">\n            <sha256 value=\"e0c33c9785c5d425dca6870d8cf48fba9a8a17e3aabdaa775c7957722931aec8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-31.7.0.pom\">\n            <sha256 value=\"d2ef1ea49f5e35419ab07bc760ddf3305538b5708e2e35a1d20603fa77f1f5ea\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.emulator\" name=\"proto\" version=\"31.7.1\">\n         <artifact name=\"proto-31.7.1.jar\">\n            <sha256 value=\"e0c33c9785c5d425dca6870d8cf48fba9a8a17e3aabdaa775c7957722931aec8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-31.7.1.pom\">\n            <sha256 value=\"5b23ff882eac74a1ef9788098b89ae1b272f6fe51d75d339672c886ca60eecaa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.emulator\" name=\"proto\" version=\"31.7.2\">\n         <artifact name=\"proto-31.7.2.jar\">\n            <sha256 value=\"e0c33c9785c5d425dca6870d8cf48fba9a8a17e3aabdaa775c7957722931aec8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-31.7.2.pom\">\n            <sha256 value=\"2f5edb246a15be92fd13388e5011482bb7843516d74aa0a6b13e98fe6e16c863\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.emulator\" name=\"proto\" version=\"31.7.3\">\n         <artifact name=\"proto-31.7.3.jar\">\n            <sha256 value=\"e0c33c9785c5d425dca6870d8cf48fba9a8a17e3aabdaa775c7957722931aec8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-31.7.3.pom\">\n            <sha256 value=\"49f87080507ffe63c4ab0c730e3c87201489011390569c2f27be8d4f9eb79178\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.emulator\" name=\"proto\" version=\"31.8.0\">\n         <artifact name=\"proto-31.8.0.jar\">\n            <sha256 value=\"e0c33c9785c5d425dca6870d8cf48fba9a8a17e3aabdaa775c7957722931aec8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-31.8.0.pom\">\n            <sha256 value=\"37959a98326a27778764ade5ed4c4e9fb1a88e3d9c9aa3a17f8bf05794bc9e82\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.emulator\" name=\"proto\" version=\"31.8.1\">\n         <artifact name=\"proto-31.8.1.jar\">\n            <sha256 value=\"e0c33c9785c5d425dca6870d8cf48fba9a8a17e3aabdaa775c7957722931aec8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-31.8.1.pom\">\n            <sha256 value=\"735da58d34647d0de3c6d9429c823a902a4558258a9336eb4f4e8f7a7913b803\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.emulator\" name=\"proto\" version=\"31.8.2\">\n         <artifact name=\"proto-31.8.2.jar\">\n            <sha256 value=\"e0c33c9785c5d425dca6870d8cf48fba9a8a17e3aabdaa775c7957722931aec8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-31.8.2.pom\">\n            <sha256 value=\"dc640394571eb7277c762e9c1fd36c3841759781391b35b0caae4baeda70f860\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.emulator\" name=\"proto\" version=\"31.9.0\">\n         <artifact name=\"proto-31.9.0.jar\">\n            <sha256 value=\"0d8e5ac28de7e2687e3c3bdbc66620674f47d514bb0b0a9634d80f2cd878d8d5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-31.9.0.pom\">\n            <sha256 value=\"03cd5187391ef160edb857570bba5c7baa0f82537e7717ccca3392b178a2875d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.emulator\" name=\"proto\" version=\"31.9.1\">\n         <artifact name=\"proto-31.9.1.jar\">\n            <sha256 value=\"0d8e5ac28de7e2687e3c3bdbc66620674f47d514bb0b0a9634d80f2cd878d8d5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-31.9.1.pom\">\n            <sha256 value=\"09100ee4a66ca9e23613583963b9d9f07727710e4bc4d66d24be3c67868b158c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.emulator\" name=\"proto\" version=\"31.9.2\">\n         <artifact name=\"proto-31.9.2.jar\">\n            <sha256 value=\"0d8e5ac28de7e2687e3c3bdbc66620674f47d514bb0b0a9634d80f2cd878d8d5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-31.9.2.pom\">\n            <sha256 value=\"eea292edd8fc933acde29a62b0aa4236a5617eb149ad79220c3f7d6d0ff3f503\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"intellij-core\" version=\"31.10.0\">\n         <artifact name=\"intellij-core-31.10.0.jar\">\n            <sha256 value=\"8362004b686681cdc2b022ee1c86d2582c95c2f7a988b21ee5facc4a979312ca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"intellij-core-31.10.0.pom\">\n            <sha256 value=\"69cb3d106a613a80db8db7ee5fdc0359f3f6d4d86f0f1ffa0e111d80915e5aba\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"intellij-core\" version=\"31.4.1\">\n         <artifact name=\"intellij-core-31.4.1.jar\">\n            <sha256 value=\"025e5a282d9fb83a4e6073ff4ccd5a28e38f8a322a856d4aa29e4ad00bd377f4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"intellij-core-31.4.1.pom\">\n            <sha256 value=\"dc58aabaab1086cb5cbffc33a4e02044005387845865630243ad4e7a275f9d63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"intellij-core\" version=\"31.4.2\">\n         <artifact name=\"intellij-core-31.4.2.jar\">\n            <sha256 value=\"025e5a282d9fb83a4e6073ff4ccd5a28e38f8a322a856d4aa29e4ad00bd377f4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"intellij-core-31.4.2.pom\">\n            <sha256 value=\"20e5f3a00a4041b4ffeac8ce4feaccbe08defb8b8ad0857a2060d4caf9ba4101\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"intellij-core\" version=\"31.5.0\">\n         <artifact name=\"intellij-core-31.5.0.jar\">\n            <sha256 value=\"4805b8e2ef4ba140b7b3d77ea619a752ff112bbd88a01a59219e04c01f76365d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"intellij-core-31.5.0.pom\">\n            <sha256 value=\"42095dd38a1226c71246ef771b880e29c5bedb9e6e7cb7c883c5993afbe4e66e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"intellij-core\" version=\"31.5.1\">\n         <artifact name=\"intellij-core-31.5.1.jar\">\n            <sha256 value=\"4805b8e2ef4ba140b7b3d77ea619a752ff112bbd88a01a59219e04c01f76365d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"intellij-core-31.5.1.pom\">\n            <sha256 value=\"78031431f2b7ed82dfb34479d5c43c824788c36b82dc1ac274830dafc1655c03\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"intellij-core\" version=\"31.5.2\">\n         <artifact name=\"intellij-core-31.5.2.jar\">\n            <sha256 value=\"4805b8e2ef4ba140b7b3d77ea619a752ff112bbd88a01a59219e04c01f76365d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"intellij-core-31.5.2.pom\">\n            <sha256 value=\"84ebeede12e04097c86d44b7685fc1f5695061d45e441cc98c43a9c25eda3823\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"intellij-core\" version=\"31.6.0\">\n         <artifact name=\"intellij-core-31.6.0.jar\">\n            <sha256 value=\"4805b8e2ef4ba140b7b3d77ea619a752ff112bbd88a01a59219e04c01f76365d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"intellij-core-31.6.0.pom\">\n            <sha256 value=\"aa2a0e4b35581b10da468aca9aa1646acb501f5288634a6287d4ce8b8e6139d5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"intellij-core\" version=\"31.6.1\">\n         <artifact name=\"intellij-core-31.6.1.jar\">\n            <sha256 value=\"4805b8e2ef4ba140b7b3d77ea619a752ff112bbd88a01a59219e04c01f76365d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"intellij-core-31.6.1.pom\">\n            <sha256 value=\"28eb2db2a90cf4ccda8f94bb6fe3ee511ccef4e5ba58d4c1517ef90705cee01a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"intellij-core\" version=\"31.7.0\">\n         <artifact name=\"intellij-core-31.7.0.jar\">\n            <sha256 value=\"773beaca00b40d3e6924115d70e1db149f306521d24428d9152ff82f2e4b6abc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"intellij-core-31.7.0.pom\">\n            <sha256 value=\"27d5b25ce8baa8247db72b1b35152077fe76287b4240ccb59e51d087c064c7ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"intellij-core\" version=\"31.7.1\">\n         <artifact name=\"intellij-core-31.7.1.jar\">\n            <sha256 value=\"773beaca00b40d3e6924115d70e1db149f306521d24428d9152ff82f2e4b6abc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"intellij-core-31.7.1.pom\">\n            <sha256 value=\"18f7f8f0254578cb7427111bf94c20fce8a5ac378bf0f5234646977ff88c6b03\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"intellij-core\" version=\"31.7.2\">\n         <artifact name=\"intellij-core-31.7.2.jar\">\n            <sha256 value=\"773beaca00b40d3e6924115d70e1db149f306521d24428d9152ff82f2e4b6abc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"intellij-core-31.7.2.pom\">\n            <sha256 value=\"dd2c751c09f54d2fbb5342f537f043566a2400c8900bd3f7dfb5ad9bb3eedd81\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"intellij-core\" version=\"31.7.3\">\n         <artifact name=\"intellij-core-31.7.3.jar\">\n            <sha256 value=\"773beaca00b40d3e6924115d70e1db149f306521d24428d9152ff82f2e4b6abc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"intellij-core-31.7.3.pom\">\n            <sha256 value=\"fda46ade0cc1823c541c1efa3e3438e800920213ffe428d9ede53ea014e59b01\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"intellij-core\" version=\"31.8.0\">\n         <artifact name=\"intellij-core-31.8.0.jar\">\n            <sha256 value=\"773beaca00b40d3e6924115d70e1db149f306521d24428d9152ff82f2e4b6abc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"intellij-core-31.8.0.pom\">\n            <sha256 value=\"783f45bcbdb08ed81d46e98fbfae1d7cbc11f77e498ca2f4232ad9b68212d052\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"intellij-core\" version=\"31.8.1\">\n         <artifact name=\"intellij-core-31.8.1.jar\">\n            <sha256 value=\"773beaca00b40d3e6924115d70e1db149f306521d24428d9152ff82f2e4b6abc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"intellij-core-31.8.1.pom\">\n            <sha256 value=\"3792093bb8de8106ec0c961bcfb408ae83089cc78e59c5c219ea18214dd730ca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"intellij-core\" version=\"31.8.2\">\n         <artifact name=\"intellij-core-31.8.2.jar\">\n            <sha256 value=\"773beaca00b40d3e6924115d70e1db149f306521d24428d9152ff82f2e4b6abc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"intellij-core-31.8.2.pom\">\n            <sha256 value=\"4ee1b617521c3310b1a6c9e0eb2145a3a8766fc5bb05e628b86e9262a9fa6d7f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"intellij-core\" version=\"31.9.0\">\n         <artifact name=\"intellij-core-31.9.0.jar\">\n            <sha256 value=\"8ab8cadf840efa205abef22913f33892e644234ca7064180bdf7b6f559d85e7a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"intellij-core-31.9.0.pom\">\n            <sha256 value=\"315469f79e89e771d60e38b160744df49b97f0d57f88169ab1d59c17ede4bc6c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"intellij-core\" version=\"31.9.1\">\n         <artifact name=\"intellij-core-31.9.1.jar\">\n            <sha256 value=\"8ab8cadf840efa205abef22913f33892e644234ca7064180bdf7b6f559d85e7a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"intellij-core-31.9.1.pom\">\n            <sha256 value=\"0c468c010ab68f55cf96342f51761abb3d131b5f5363f1e53bf0649e0b315d7b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"intellij-core\" version=\"31.9.2\">\n         <artifact name=\"intellij-core-31.9.2.jar\">\n            <sha256 value=\"8ab8cadf840efa205abef22913f33892e644234ca7064180bdf7b6f559d85e7a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"intellij-core-31.9.2.pom\">\n            <sha256 value=\"d3813e02861e17683cb2202e870d28fd513ba1d96cbb5d38b2fe94a00dadb4fd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"kotlin-compiler\" version=\"31.10.0\">\n         <artifact name=\"kotlin-compiler-31.10.0.jar\">\n            <sha256 value=\"c4f8507055c02c367dbeefee4faf1e6b3148a5b543643ed1f22b228439bcbf1e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-31.10.0.pom\">\n            <sha256 value=\"b72f14a547f10882ff0a819ce9f554d499d760eff074b552b2a0c635dc4e7d1a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"kotlin-compiler\" version=\"31.4.1\">\n         <artifact name=\"kotlin-compiler-31.4.1.jar\">\n            <sha256 value=\"fd45a1e4a45c51b46920445586f71c92a8801cb0880bcc0f485144ffbfbc284f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-31.4.1.pom\">\n            <sha256 value=\"ab62e6a9583728a60fb57ab14b3866aef64e2ed97480306bc58d8e37070b6d50\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"kotlin-compiler\" version=\"31.4.2\">\n         <artifact name=\"kotlin-compiler-31.4.2.jar\">\n            <sha256 value=\"fd45a1e4a45c51b46920445586f71c92a8801cb0880bcc0f485144ffbfbc284f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-31.4.2.pom\">\n            <sha256 value=\"66001e0f67258ccbf4b03b9b4452adda35c2231f53e97d902647596bb9185bce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"kotlin-compiler\" version=\"31.5.0\">\n         <artifact name=\"kotlin-compiler-31.5.0.jar\">\n            <sha256 value=\"b1af44dd127b047e856e8c825fad69fbb0c5b9659d3420dc765688bc7a5384fc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-31.5.0.pom\">\n            <sha256 value=\"a141b77c4e4e9d76d0cd9bde4722c2eb5fee4a58dd73682d0c7376bd7d06777e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"kotlin-compiler\" version=\"31.5.1\">\n         <artifact name=\"kotlin-compiler-31.5.1.jar\">\n            <sha256 value=\"b1af44dd127b047e856e8c825fad69fbb0c5b9659d3420dc765688bc7a5384fc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-31.5.1.pom\">\n            <sha256 value=\"727eb3e58f9d64fe219a806414141fe3942c4de162690f9843c6e209a7b187b8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"kotlin-compiler\" version=\"31.5.2\">\n         <artifact name=\"kotlin-compiler-31.5.2.jar\">\n            <sha256 value=\"b1af44dd127b047e856e8c825fad69fbb0c5b9659d3420dc765688bc7a5384fc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-31.5.2.pom\">\n            <sha256 value=\"e925ec5fef14be3d48bbd5023e07787bb99392d9c3cc45db43b03424a3e6b16b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"kotlin-compiler\" version=\"31.6.0\">\n         <artifact name=\"kotlin-compiler-31.6.0.jar\">\n            <sha256 value=\"e9b4614ceddf7bad65fd547e9136f870379cf0e23be45616ca7bdebadb7702e4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-31.6.0.pom\">\n            <sha256 value=\"15c602033d5ad5373f4dbb7c435924391204a78d802794b69e7e7c15fe571604\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"kotlin-compiler\" version=\"31.6.1\">\n         <artifact name=\"kotlin-compiler-31.6.1.jar\">\n            <sha256 value=\"e9b4614ceddf7bad65fd547e9136f870379cf0e23be45616ca7bdebadb7702e4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-31.6.1.pom\">\n            <sha256 value=\"a5a73457a902a7163fed09cf1ef6bfdffc23d0fbc6082dbce6c1b8e005feb71d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"kotlin-compiler\" version=\"31.7.0\">\n         <artifact name=\"kotlin-compiler-31.7.0.jar\">\n            <sha256 value=\"1fb8b7885e43525ebe460bd55acafa1e43785e87fb89fcf47ba8709bce47f9b0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-31.7.0.pom\">\n            <sha256 value=\"a1f58c4a1afafc3331405542200df3d4f1d100cc0407c920ec1f143815a6f112\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"kotlin-compiler\" version=\"31.7.1\">\n         <artifact name=\"kotlin-compiler-31.7.1.jar\">\n            <sha256 value=\"1fb8b7885e43525ebe460bd55acafa1e43785e87fb89fcf47ba8709bce47f9b0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-31.7.1.pom\">\n            <sha256 value=\"04645a47d0b2decc92b0b0b6b4711be1086308f47b8144ad896a473269443fe4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"kotlin-compiler\" version=\"31.7.2\">\n         <artifact name=\"kotlin-compiler-31.7.2.jar\">\n            <sha256 value=\"1fb8b7885e43525ebe460bd55acafa1e43785e87fb89fcf47ba8709bce47f9b0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-31.7.2.pom\">\n            <sha256 value=\"dd6342d3b15cb39401754493cb710a43a8cd6a54c5317aa0c29f364890e35319\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"kotlin-compiler\" version=\"31.7.3\">\n         <artifact name=\"kotlin-compiler-31.7.3.jar\">\n            <sha256 value=\"1fb8b7885e43525ebe460bd55acafa1e43785e87fb89fcf47ba8709bce47f9b0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-31.7.3.pom\">\n            <sha256 value=\"51d50f36030139519bbd59bb478b39f60cbf411e0f11abb173632fb5547a9b77\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"kotlin-compiler\" version=\"31.8.0\">\n         <artifact name=\"kotlin-compiler-31.8.0.jar\">\n            <sha256 value=\"798b73b17b221465e5d7490ebe5fdabbcbdbe499e96022f663c97144f1bceb4e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-31.8.0.pom\">\n            <sha256 value=\"be77d4f1bfe114c6c0a575b46141d4771465f360bf1a0cc33dfe96926a0e652a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"kotlin-compiler\" version=\"31.8.1\">\n         <artifact name=\"kotlin-compiler-31.8.1.jar\">\n            <sha256 value=\"798b73b17b221465e5d7490ebe5fdabbcbdbe499e96022f663c97144f1bceb4e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-31.8.1.pom\">\n            <sha256 value=\"0c91f745bed1fa11a9645bcc3abd7d7fe320178f7226229f92342c479b7b33a6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"kotlin-compiler\" version=\"31.8.2\">\n         <artifact name=\"kotlin-compiler-31.8.2.jar\">\n            <sha256 value=\"798b73b17b221465e5d7490ebe5fdabbcbdbe499e96022f663c97144f1bceb4e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-31.8.2.pom\">\n            <sha256 value=\"6ee9f4b4112d7ebdc59e36c5a05f67402aa6a6978aa0cf22b03e5cf8d11b3db7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"kotlin-compiler\" version=\"31.9.0\">\n         <artifact name=\"kotlin-compiler-31.9.0.jar\">\n            <sha256 value=\"34a4183ced1797ebbcfad91eebcd9da464c8f14d3fbcf7c2889e3f67f76b65f2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-31.9.0.pom\">\n            <sha256 value=\"2209676a6f253f96f2009056a9b60973046054e993c73e58bf7f59ff880785ba\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"kotlin-compiler\" version=\"31.9.1\">\n         <artifact name=\"kotlin-compiler-31.9.1.jar\">\n            <sha256 value=\"34a4183ced1797ebbcfad91eebcd9da464c8f14d3fbcf7c2889e3f67f76b65f2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-31.9.1.pom\">\n            <sha256 value=\"1b4b9c1315bd0eb87226f5349652b1cc8aaa99ccdcabcdd910765e76d62464bd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.com-intellij\" name=\"kotlin-compiler\" version=\"31.9.2\">\n         <artifact name=\"kotlin-compiler-31.9.2.jar\">\n            <sha256 value=\"34a4183ced1797ebbcfad91eebcd9da464c8f14d3fbcf7c2889e3f67f76b65f2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-31.9.2.pom\">\n            <sha256 value=\"4cefe2ab003423cd3687ce59c0d1cde7e06806b45a7f237dc340346fb2d7ba9d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.org-jetbrains\" name=\"uast\" version=\"31.10.0\">\n         <artifact name=\"uast-31.10.0.jar\">\n            <sha256 value=\"aecca3539be9f07233e23b2cf52168d1145953a684c2290111a22e628d30e01f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"uast-31.10.0.pom\">\n            <sha256 value=\"f800bffaa62015ffa7c032bf3b11a78af50ee925b306197436aa0124abcbfa02\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.org-jetbrains\" name=\"uast\" version=\"31.4.1\">\n         <artifact name=\"uast-31.4.1.jar\">\n            <sha256 value=\"0df6547b37453f5ad2006179cd65b0ab7109b8f67b837d739509b2ff4f8310b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"uast-31.4.1.pom\">\n            <sha256 value=\"85cde9c4969abb0cb72bc81fedb7cf436d4c22752ba3b3c53e48eb093104af09\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.org-jetbrains\" name=\"uast\" version=\"31.4.2\">\n         <artifact name=\"uast-31.4.2.jar\">\n            <sha256 value=\"0df6547b37453f5ad2006179cd65b0ab7109b8f67b837d739509b2ff4f8310b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"uast-31.4.2.pom\">\n            <sha256 value=\"b34d785fbcba4d0daf4495c291669d07adf1a90a46a326779aaececa0aaaef62\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.org-jetbrains\" name=\"uast\" version=\"31.5.0\">\n         <artifact name=\"uast-31.5.0.jar\">\n            <sha256 value=\"3b11ae43800e0f82276664c313f9442c1a9ac208e3a0f01beb312e47079ccf8d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"uast-31.5.0.pom\">\n            <sha256 value=\"6d046c5db8e3ede52d1c788b335405edc27062785e67d150f3d43014d2923382\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.org-jetbrains\" name=\"uast\" version=\"31.5.1\">\n         <artifact name=\"uast-31.5.1.jar\">\n            <sha256 value=\"3b11ae43800e0f82276664c313f9442c1a9ac208e3a0f01beb312e47079ccf8d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"uast-31.5.1.pom\">\n            <sha256 value=\"ab0a997fafcc3a44c2374e3ddbd9cc84dc53d850eb81ee941b8cdb5fbf12480f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.org-jetbrains\" name=\"uast\" version=\"31.5.2\">\n         <artifact name=\"uast-31.5.2.jar\">\n            <sha256 value=\"3b11ae43800e0f82276664c313f9442c1a9ac208e3a0f01beb312e47079ccf8d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"uast-31.5.2.pom\">\n            <sha256 value=\"6760bb523e7aae682b86183d90f4285ba148ec16b2e0bc6b0cc3e8b6b305f014\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.org-jetbrains\" name=\"uast\" version=\"31.6.0\">\n         <artifact name=\"uast-31.6.0.jar\">\n            <sha256 value=\"f85e9b1673cc78353c21592407f02448dc7178b127eef2d8e1afa0addea161fb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"uast-31.6.0.pom\">\n            <sha256 value=\"def3eea82dfe936fa331441db3f72fad4cc6e1e5913f1c7500fbcb0c1afef00e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.org-jetbrains\" name=\"uast\" version=\"31.6.1\">\n         <artifact name=\"uast-31.6.1.jar\">\n            <sha256 value=\"f85e9b1673cc78353c21592407f02448dc7178b127eef2d8e1afa0addea161fb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"uast-31.6.1.pom\">\n            <sha256 value=\"f24bd6a33c1f4e876b70ddc25ba066cc4c96c2df389e2094f50c223df2fb192e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.org-jetbrains\" name=\"uast\" version=\"31.7.0\">\n         <artifact name=\"uast-31.7.0.jar\">\n            <sha256 value=\"46828281e96a3c52c14db267873b47121ad97758e654013cdb85e7bb6add92cf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"uast-31.7.0.pom\">\n            <sha256 value=\"fc375630ad680a54c457a5416cd61ba60f449a639be3ef5250a6db62feedc888\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.org-jetbrains\" name=\"uast\" version=\"31.7.1\">\n         <artifact name=\"uast-31.7.1.jar\">\n            <sha256 value=\"46828281e96a3c52c14db267873b47121ad97758e654013cdb85e7bb6add92cf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"uast-31.7.1.pom\">\n            <sha256 value=\"7ed2c3418c541317127b479911b64a5e472093200d68a0657abbfb0287058496\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.org-jetbrains\" name=\"uast\" version=\"31.7.2\">\n         <artifact name=\"uast-31.7.2.jar\">\n            <sha256 value=\"46828281e96a3c52c14db267873b47121ad97758e654013cdb85e7bb6add92cf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"uast-31.7.2.pom\">\n            <sha256 value=\"8d1f3c17d1f6708306ef40daed0af570314ccd332e697e658b59d6cc57c37297\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.org-jetbrains\" name=\"uast\" version=\"31.7.3\">\n         <artifact name=\"uast-31.7.3.jar\">\n            <sha256 value=\"46828281e96a3c52c14db267873b47121ad97758e654013cdb85e7bb6add92cf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"uast-31.7.3.pom\">\n            <sha256 value=\"b6ab37de5ae70b7a6b1141a564b596fe8aa42d5aec645c295e129a946be2b3d4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.org-jetbrains\" name=\"uast\" version=\"31.8.0\">\n         <artifact name=\"uast-31.8.0.jar\">\n            <sha256 value=\"b6a67a529e606161880f32b07467f42f4dd6acddfaa9a65cb0713f2dc02baf29\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"uast-31.8.0.pom\">\n            <sha256 value=\"713be27e539ea8077ebf730ec6e69686b62ed863f553dcaafd1c8443775d0c8b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.org-jetbrains\" name=\"uast\" version=\"31.8.1\">\n         <artifact name=\"uast-31.8.1.jar\">\n            <sha256 value=\"b6a67a529e606161880f32b07467f42f4dd6acddfaa9a65cb0713f2dc02baf29\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"uast-31.8.1.pom\">\n            <sha256 value=\"8b153e050b52fe0a8b700ba7e896196021197cc05b92c9567a53c89038efd030\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.org-jetbrains\" name=\"uast\" version=\"31.8.2\">\n         <artifact name=\"uast-31.8.2.jar\">\n            <sha256 value=\"b6a67a529e606161880f32b07467f42f4dd6acddfaa9a65cb0713f2dc02baf29\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"uast-31.8.2.pom\">\n            <sha256 value=\"7f51e8c3f36f820fed44b11b3feb32526ace1ab6e9b964ce59d9e913269912f6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.org-jetbrains\" name=\"uast\" version=\"31.9.0\">\n         <artifact name=\"uast-31.9.0.jar\">\n            <sha256 value=\"97e5dc2b0e09eccd34c127f2177d68305ddc1ffb4005576efde8e84ab591ac6c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"uast-31.9.0.pom\">\n            <sha256 value=\"1a9591af8cf3baddf9ccd44600e8350fa0dc488d466aa63f4a585244f8ffe77b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.org-jetbrains\" name=\"uast\" version=\"31.9.1\">\n         <artifact name=\"uast-31.9.1.jar\">\n            <sha256 value=\"97e5dc2b0e09eccd34c127f2177d68305ddc1ffb4005576efde8e84ab591ac6c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"uast-31.9.1.pom\">\n            <sha256 value=\"07c0bf72fe1406860411110b6c863f2f1cd51382a08a0efff6aecef15a6dca69\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.external.org-jetbrains\" name=\"uast\" version=\"31.9.2\">\n         <artifact name=\"uast-31.9.2.jar\">\n            <sha256 value=\"97e5dc2b0e09eccd34c127f2177d68305ddc1ffb4005576efde8e84ab591ac6c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"uast-31.9.2.pom\">\n            <sha256 value=\"43e1a85fdd3489471611d60f0693fe08bf2027099b3b2d424f51e297cca5f152\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.layoutlib\" name=\"layoutlib-api\" version=\"31.10.0\">\n         <artifact name=\"layoutlib-api-31.10.0.jar\">\n            <sha256 value=\"9b3c87ef6d48cde7188207df085cf7448561f575b788cb4a7addb94d255101a6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"layoutlib-api-31.10.0.pom\">\n            <sha256 value=\"1d434e7ae28dd4d1c59449aadb41f1d35aa9d15be8e378790da6b7b874c85b5c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.layoutlib\" name=\"layoutlib-api\" version=\"31.4.1\">\n         <artifact name=\"layoutlib-api-31.4.1.jar\">\n            <sha256 value=\"3c9064c3c3ab0e73f3a5953d1c11c57dbf57a3297957c1d7d460c92e14cf34b2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"layoutlib-api-31.4.1.pom\">\n            <sha256 value=\"645a10aa7565385dbe936ea700840bafa683756a4e7433fd8b0c5dda355131c2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.layoutlib\" name=\"layoutlib-api\" version=\"31.4.2\">\n         <artifact name=\"layoutlib-api-31.4.2.jar\">\n            <sha256 value=\"3c9064c3c3ab0e73f3a5953d1c11c57dbf57a3297957c1d7d460c92e14cf34b2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"layoutlib-api-31.4.2.pom\">\n            <sha256 value=\"488bd09f6c7a3e5933fca26ed79809ec5499779d44269d630fdd95175233c763\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.layoutlib\" name=\"layoutlib-api\" version=\"31.5.0\">\n         <artifact name=\"layoutlib-api-31.5.0.jar\">\n            <sha256 value=\"9271bf0b3fbde65e75a3e9c587701b8865d2f009ea159f2801ba98dbbc8ac360\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"layoutlib-api-31.5.0.pom\">\n            <sha256 value=\"3035fb799d6919ed513c6e9ba2401245ab046fb06b6b8b4273ecef995e886713\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.layoutlib\" name=\"layoutlib-api\" version=\"31.5.1\">\n         <artifact name=\"layoutlib-api-31.5.1.jar\">\n            <sha256 value=\"9271bf0b3fbde65e75a3e9c587701b8865d2f009ea159f2801ba98dbbc8ac360\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"layoutlib-api-31.5.1.pom\">\n            <sha256 value=\"0078ac68637e36b03287ae94c7e9c964f66b6ef91ed930d3a96ba4b0262e0a40\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.layoutlib\" name=\"layoutlib-api\" version=\"31.5.2\">\n         <artifact name=\"layoutlib-api-31.5.2.jar\">\n            <sha256 value=\"9271bf0b3fbde65e75a3e9c587701b8865d2f009ea159f2801ba98dbbc8ac360\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"layoutlib-api-31.5.2.pom\">\n            <sha256 value=\"a5dc26d86e0e1eef1b9e17bc9895c87bc8eff65171b1506dbbffe80707decfef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.layoutlib\" name=\"layoutlib-api\" version=\"31.6.0\">\n         <artifact name=\"layoutlib-api-31.6.0.jar\">\n            <sha256 value=\"98bae36ff051e114dd4eef5effa80fbe5e552944f4233ce892160da2cd9eeaed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"layoutlib-api-31.6.0.pom\">\n            <sha256 value=\"0813c8af30178ba615409cec258f942d204a43783dbe2acee1e92de7bc086f57\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.layoutlib\" name=\"layoutlib-api\" version=\"31.6.1\">\n         <artifact name=\"layoutlib-api-31.6.1.jar\">\n            <sha256 value=\"98bae36ff051e114dd4eef5effa80fbe5e552944f4233ce892160da2cd9eeaed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"layoutlib-api-31.6.1.pom\">\n            <sha256 value=\"ecd4315386803ba9d43b67b8fa6c92f049044501e045d32f4260d93f9c9a6a30\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.layoutlib\" name=\"layoutlib-api\" version=\"31.7.0\">\n         <artifact name=\"layoutlib-api-31.7.0.jar\">\n            <sha256 value=\"98bae36ff051e114dd4eef5effa80fbe5e552944f4233ce892160da2cd9eeaed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"layoutlib-api-31.7.0.pom\">\n            <sha256 value=\"39ce8a8dac6787055dd7293d0eec46c06828275a5c3020e807868199fb9ed92c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.layoutlib\" name=\"layoutlib-api\" version=\"31.7.1\">\n         <artifact name=\"layoutlib-api-31.7.1.jar\">\n            <sha256 value=\"98bae36ff051e114dd4eef5effa80fbe5e552944f4233ce892160da2cd9eeaed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"layoutlib-api-31.7.1.pom\">\n            <sha256 value=\"a6b1673ef8417a4e240168fccf56aa19434c4068825d18eeac791f5b24f7a3e0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.layoutlib\" name=\"layoutlib-api\" version=\"31.7.2\">\n         <artifact name=\"layoutlib-api-31.7.2.jar\">\n            <sha256 value=\"98bae36ff051e114dd4eef5effa80fbe5e552944f4233ce892160da2cd9eeaed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"layoutlib-api-31.7.2.pom\">\n            <sha256 value=\"56d7d917000f2a6a7c83cf389fe682e0a6b07cbcac2575fccdee0bf127277061\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.layoutlib\" name=\"layoutlib-api\" version=\"31.7.3\">\n         <artifact name=\"layoutlib-api-31.7.3.jar\">\n            <sha256 value=\"98bae36ff051e114dd4eef5effa80fbe5e552944f4233ce892160da2cd9eeaed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"layoutlib-api-31.7.3.pom\">\n            <sha256 value=\"b3d95df21356ce666d73cdba6a296524c9afff39bd1ff9150fd19db589f9a612\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.layoutlib\" name=\"layoutlib-api\" version=\"31.8.0\">\n         <artifact name=\"layoutlib-api-31.8.0.jar\">\n            <sha256 value=\"5a536627470541d1b7f1f41ac6f06adf5269f656ed3aab23f909aa0208a4738f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"layoutlib-api-31.8.0.pom\">\n            <sha256 value=\"53404ef21553d9bc7cd131c65a6321970add68e8b037e737b70794cd58efcfd5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.layoutlib\" name=\"layoutlib-api\" version=\"31.8.1\">\n         <artifact name=\"layoutlib-api-31.8.1.jar\">\n            <sha256 value=\"5a536627470541d1b7f1f41ac6f06adf5269f656ed3aab23f909aa0208a4738f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"layoutlib-api-31.8.1.pom\">\n            <sha256 value=\"d9ab3a19a0e9ee6d4567774b1d52dfd85ecb6fdd05be91c74529da7554f12d11\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.layoutlib\" name=\"layoutlib-api\" version=\"31.8.2\">\n         <artifact name=\"layoutlib-api-31.8.2.jar\">\n            <sha256 value=\"5a536627470541d1b7f1f41ac6f06adf5269f656ed3aab23f909aa0208a4738f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"layoutlib-api-31.8.2.pom\">\n            <sha256 value=\"46400c95fefab850c1b3fa146f082117f25cb7ceed50186326e8e45250a20a7b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.layoutlib\" name=\"layoutlib-api\" version=\"31.9.0\">\n         <artifact name=\"layoutlib-api-31.9.0.jar\">\n            <sha256 value=\"29232e6007625b569e82798d2d8f559d8941ece630fe276e842cd818ebf94b17\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"layoutlib-api-31.9.0.pom\">\n            <sha256 value=\"b90774af5589949a47431993a11fd3db44d8a048670d73dc908ceb54daa86c2f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.layoutlib\" name=\"layoutlib-api\" version=\"31.9.1\">\n         <artifact name=\"layoutlib-api-31.9.1.jar\">\n            <sha256 value=\"29232e6007625b569e82798d2d8f559d8941ece630fe276e842cd818ebf94b17\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"layoutlib-api-31.9.1.pom\">\n            <sha256 value=\"c8318c171d1a1832babdfbbcdc6fd27b1916b833ace2f58fc35df9fcc8058a39\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.layoutlib\" name=\"layoutlib-api\" version=\"31.9.2\">\n         <artifact name=\"layoutlib-api-31.9.2.jar\">\n            <sha256 value=\"29232e6007625b569e82798d2d8f559d8941ece630fe276e842cd818ebf94b17\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"layoutlib-api-31.9.2.pom\">\n            <sha256 value=\"6ad001cef7d58acfab03ce753dd45a97c286c3075c09fd43dfd4425e1e66fee4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint\" version=\"31.10.0\">\n         <artifact name=\"lint-31.10.0.jar\">\n            <sha256 value=\"17f891db6b9d045027093729336bfca342a81ce723eb3a7e3fee2fbb575c08e1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-31.10.0.pom\">\n            <sha256 value=\"94345724d88bdbd3120fe459634486413f840907d409fa534252a84fc289184c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint\" version=\"31.4.1\">\n         <artifact name=\"lint-31.4.1.jar\">\n            <sha256 value=\"4c8bbdfaa4fcddd5e8b8f3e9606057a1e5dd6ed8013a7bbc9ae2d4a7d950152c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-31.4.1.pom\">\n            <sha256 value=\"a1fe4b0c158fdd0b287ff5f0d5247c245f910f0536ed5ce6bbabba11a975e1d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint\" version=\"31.4.2\">\n         <artifact name=\"lint-31.4.2.jar\">\n            <sha256 value=\"4c8bbdfaa4fcddd5e8b8f3e9606057a1e5dd6ed8013a7bbc9ae2d4a7d950152c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-31.4.2.pom\">\n            <sha256 value=\"c94db770512556e8cf2613cb9bda52c2d0058ef58033291d246948be73abee1c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint\" version=\"31.5.0\">\n         <artifact name=\"lint-31.5.0.jar\">\n            <sha256 value=\"757cdbddfbbc40fc40f4e2c3c70afc17a0b376f3a9c497c76652484652b1bd42\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-31.5.0.pom\">\n            <sha256 value=\"192bde1106453961b990afe9df0e6890dfaaa68a6b464e279c1edba93469edb2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint\" version=\"31.5.1\">\n         <artifact name=\"lint-31.5.1.jar\">\n            <sha256 value=\"757cdbddfbbc40fc40f4e2c3c70afc17a0b376f3a9c497c76652484652b1bd42\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-31.5.1.pom\">\n            <sha256 value=\"c85903f00d2e578f4982abe3a95ebb56ffa0d95a4fe7af17015d3df37e45661f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint\" version=\"31.5.2\">\n         <artifact name=\"lint-31.5.2.jar\">\n            <sha256 value=\"757cdbddfbbc40fc40f4e2c3c70afc17a0b376f3a9c497c76652484652b1bd42\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-31.5.2.pom\">\n            <sha256 value=\"2b900b645a65c4a1df2550bf1b261301d44be6a9947aa0a0ef17f4f286d53208\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint\" version=\"31.6.0\">\n         <artifact name=\"lint-31.6.0.jar\">\n            <sha256 value=\"9b5a4f5c1c40753739f72500394d296f1142e58bd3406bd0c698ccb4b165b4b6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-31.6.0.pom\">\n            <sha256 value=\"5b02af76ee3e5d6f7894282b675b781207df714cbd21930f24117c0910d1d02c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint\" version=\"31.6.1\">\n         <artifact name=\"lint-31.6.1.jar\">\n            <sha256 value=\"9b5a4f5c1c40753739f72500394d296f1142e58bd3406bd0c698ccb4b165b4b6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-31.6.1.pom\">\n            <sha256 value=\"d2d7204a23f8737ac96f3e90d013dee633a561245a5a33df63e5a74cf1728f37\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint\" version=\"31.7.0\">\n         <artifact name=\"lint-31.7.0.jar\">\n            <sha256 value=\"253295daa71a4dc5964db12fba4260729169e9a9f9bef5e39e85773aca923e06\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-31.7.0.pom\">\n            <sha256 value=\"8fa3a162be4ca2b8bb1ebd194ecf9b8c24f7b6a7db8eac5cf50ed593a4da1655\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint\" version=\"31.7.1\">\n         <artifact name=\"lint-31.7.1.jar\">\n            <sha256 value=\"253295daa71a4dc5964db12fba4260729169e9a9f9bef5e39e85773aca923e06\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-31.7.1.pom\">\n            <sha256 value=\"8645bf07c068b8bdff3974fb3de61711ae5d13f7fe5d81b487b70f8acdafe71f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint\" version=\"31.7.2\">\n         <artifact name=\"lint-31.7.2.jar\">\n            <sha256 value=\"ca0c4787b1def7b3edc10651cb20162175e908880fb1fd50ac711bd2d22e2d01\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-31.7.2.pom\">\n            <sha256 value=\"43aee284fa5e7111c74e2f514f00a671fd9873799e20ea124d2224c51fdb6396\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint\" version=\"31.7.3\">\n         <artifact name=\"lint-31.7.3.jar\">\n            <sha256 value=\"ca0c4787b1def7b3edc10651cb20162175e908880fb1fd50ac711bd2d22e2d01\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-31.7.3.pom\">\n            <sha256 value=\"550bd46509769e91e7079362fe1c0adaa4ef8609aa2a40d763efb71c9b1080bc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint\" version=\"31.8.0\">\n         <artifact name=\"lint-31.8.0.jar\">\n            <sha256 value=\"4797077b5431223b419ad24823233e6c2280e4b5bb9fffaaf35ee13c8f46e709\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-31.8.0.pom\">\n            <sha256 value=\"b6d19593ccc93b3540b4e45637d026e5a8e69ad971bbab90b91731ae915d939f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint\" version=\"31.8.1\">\n         <artifact name=\"lint-31.8.1.jar\">\n            <sha256 value=\"4797077b5431223b419ad24823233e6c2280e4b5bb9fffaaf35ee13c8f46e709\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-31.8.1.pom\">\n            <sha256 value=\"17587f3e864349afadb92f1f2daa0fbd5174b1e0abedd66b8745e99cce41e5a8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint\" version=\"31.8.2\">\n         <artifact name=\"lint-31.8.2.jar\">\n            <sha256 value=\"4797077b5431223b419ad24823233e6c2280e4b5bb9fffaaf35ee13c8f46e709\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-31.8.2.pom\">\n            <sha256 value=\"e865abe038d3b79120c3295201cbfac30343c60cbeb2daf472ba7e4449ed2a1c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint\" version=\"31.9.0\">\n         <artifact name=\"lint-31.9.0.jar\">\n            <sha256 value=\"8f902e42f47a69cb77eb320ca90997bc0074057581b9937aed90eec85b9c21cb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-31.9.0.pom\">\n            <sha256 value=\"b3017ecede2734cb88af17fa55936b0ea7e034774cb3dc7cd39b66110213f905\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint\" version=\"31.9.1\">\n         <artifact name=\"lint-31.9.1.jar\">\n            <sha256 value=\"8f902e42f47a69cb77eb320ca90997bc0074057581b9937aed90eec85b9c21cb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-31.9.1.pom\">\n            <sha256 value=\"4f0d1b40dee2bbbb6d4a72ec8404dc30b05a8595e0802d52294bd72fe1fa986a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint\" version=\"31.9.2\">\n         <artifact name=\"lint-31.9.2.jar\">\n            <sha256 value=\"8f902e42f47a69cb77eb320ca90997bc0074057581b9937aed90eec85b9c21cb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-31.9.2.pom\">\n            <sha256 value=\"c03d9f2a0fc081aee3e3efe6570e26b7abb50124e55f9f3daada039d6769abe5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-api\" version=\"31.10.0\">\n         <artifact name=\"lint-api-31.10.0.jar\">\n            <sha256 value=\"6fee4bfdfd3cf049190eb2102d991d623f5d0c9e21e4bb54449ac518c7525487\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-api-31.10.0.pom\">\n            <sha256 value=\"c2fc9a845e7a86c4db8a3c06f8073800afb07fb37ce2e056e02b99b728fa77cc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-api\" version=\"31.4.1\">\n         <artifact name=\"lint-api-31.4.1.jar\">\n            <sha256 value=\"03046cddd2df9b0d25ae1f5260102922b9efc8118ad1c2566443a04e3008ee55\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-api-31.4.1.pom\">\n            <sha256 value=\"12f565e7c346b9ea1b2f227c9ecc23fadc1cbd4c9ae58c8ed208838052fc77cc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-api\" version=\"31.4.2\">\n         <artifact name=\"lint-api-31.4.2.jar\">\n            <sha256 value=\"03046cddd2df9b0d25ae1f5260102922b9efc8118ad1c2566443a04e3008ee55\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-api-31.4.2.pom\">\n            <sha256 value=\"b2a6b08f9f6bdd02174b59e87ae5484fb02a9f2f7161f37e60cfad18237af2c3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-api\" version=\"31.5.0\">\n         <artifact name=\"lint-api-31.5.0.jar\">\n            <sha256 value=\"b4a39c6cbb22f2f4e168c3104453cc06543f61c5db3d5e636d7b9af9efc2df26\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-api-31.5.0.pom\">\n            <sha256 value=\"2d2b2de211c3afd19df4c55ec25bb984ca978fbdd9ffda6d3e86dfdaa63d1f1b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-api\" version=\"31.5.1\">\n         <artifact name=\"lint-api-31.5.1.jar\">\n            <sha256 value=\"b4a39c6cbb22f2f4e168c3104453cc06543f61c5db3d5e636d7b9af9efc2df26\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-api-31.5.1.pom\">\n            <sha256 value=\"6c2fbbf90dd133cd9285805b60f55bc29d0d5e4fd2a9ded762a7705a086a6c26\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-api\" version=\"31.5.2\">\n         <artifact name=\"lint-api-31.5.2.jar\">\n            <sha256 value=\"b4a39c6cbb22f2f4e168c3104453cc06543f61c5db3d5e636d7b9af9efc2df26\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-api-31.5.2.pom\">\n            <sha256 value=\"d9b4050a9336ac43ac327bab90bf3afa2f083f52c103378e732a15e3c42b5bb4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-api\" version=\"31.6.0\">\n         <artifact name=\"lint-api-31.6.0.jar\">\n            <sha256 value=\"19d0976922d5685cbdf2a8497f323823004c85d97f23807b86388e2816259083\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-api-31.6.0.pom\">\n            <sha256 value=\"a361bb159873222c84875edeeac6a13ed697e3d2b4aaabcda10fb20ad3b71346\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-api\" version=\"31.6.1\">\n         <artifact name=\"lint-api-31.6.1.jar\">\n            <sha256 value=\"19d0976922d5685cbdf2a8497f323823004c85d97f23807b86388e2816259083\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-api-31.6.1.pom\">\n            <sha256 value=\"1e13b5bf2415f3621c03d2ffd1348c4efcd7c44f17d210bd14857c627ffc62a2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-api\" version=\"31.7.0\">\n         <artifact name=\"lint-api-31.7.0.jar\">\n            <sha256 value=\"9d9abffb20c8ea4c777e110b85f4f5067706e760aa6edf481abc0f0125e61811\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-api-31.7.0.pom\">\n            <sha256 value=\"466a567bc96d5865e6b776fb57880f8f5a8eaecbd2a84613876c75e592db02a8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-api\" version=\"31.7.1\">\n         <artifact name=\"lint-api-31.7.1.jar\">\n            <sha256 value=\"2dd9557bb7e510f3dd38a9f4c6038911e5c5833ff7914979ff1bc57a06bf89d6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-api-31.7.1.pom\">\n            <sha256 value=\"0a910c7c757c212d9fbbd324b48e636510bcf2ffc54c3d376bfd3bb3cfc1fd3e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-api\" version=\"31.7.2\">\n         <artifact name=\"lint-api-31.7.2.jar\">\n            <sha256 value=\"2dd9557bb7e510f3dd38a9f4c6038911e5c5833ff7914979ff1bc57a06bf89d6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-api-31.7.2.pom\">\n            <sha256 value=\"69402a198bad4b043edd043b2cb1d33849ccbf19a6b8b3495755e4afaf0c14e4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-api\" version=\"31.7.3\">\n         <artifact name=\"lint-api-31.7.3.jar\">\n            <sha256 value=\"94547c69afc5c8dc4c98901f0e08f707cdba0e4c4714ea657252f784629d5a5b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-api-31.7.3.pom\">\n            <sha256 value=\"c024786774fc7c40bc7c6a872bbe3013d8c7db7a5494e88963bcc86a85eb29cb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-api\" version=\"31.8.0\">\n         <artifact name=\"lint-api-31.8.0.jar\">\n            <sha256 value=\"54d45569a8bd02901f8848e3f5213dc3b1ace9291e0f82a5ba58d6d9750f7b24\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-api-31.8.0.pom\">\n            <sha256 value=\"3545a1cb6a7f3adc961679d4bf5f29a065fa1acd6fde444d964652ab7f897eaf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-api\" version=\"31.8.1\">\n         <artifact name=\"lint-api-31.8.1.jar\">\n            <sha256 value=\"54d45569a8bd02901f8848e3f5213dc3b1ace9291e0f82a5ba58d6d9750f7b24\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-api-31.8.1.pom\">\n            <sha256 value=\"4550f7cb49b60d389e15922d76cd6f4ce9ac67151d21a7d4647f06962f62aeb8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-api\" version=\"31.8.2\">\n         <artifact name=\"lint-api-31.8.2.jar\">\n            <sha256 value=\"54d45569a8bd02901f8848e3f5213dc3b1ace9291e0f82a5ba58d6d9750f7b24\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-api-31.8.2.pom\">\n            <sha256 value=\"3377adf7c9855c3341e76765b0a14237f0e3ea38a3a252f09e19218dc5ea38db\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-api\" version=\"31.9.0\">\n         <artifact name=\"lint-api-31.9.0.jar\">\n            <sha256 value=\"1cc62af37f454bb2489c1db1c77d4a39b38d47ebf78a387bbbf670ecec723447\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-api-31.9.0.pom\">\n            <sha256 value=\"faca62cfea05e21003d7549276b173661fd5ebefea8f9ed5f21b7c23148b291a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-api\" version=\"31.9.1\">\n         <artifact name=\"lint-api-31.9.1.jar\">\n            <sha256 value=\"1cc62af37f454bb2489c1db1c77d4a39b38d47ebf78a387bbbf670ecec723447\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-api-31.9.1.pom\">\n            <sha256 value=\"86548c3a38b90ca00ab8df343319176cf15fb34c4d7da33273cbef46198fdb62\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-api\" version=\"31.9.2\">\n         <artifact name=\"lint-api-31.9.2.jar\">\n            <sha256 value=\"1cc62af37f454bb2489c1db1c77d4a39b38d47ebf78a387bbbf670ecec723447\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-api-31.9.2.pom\">\n            <sha256 value=\"a24c2ab31e8592c407592af7fc601b061c0a03ba6a1036b73ba365b5baa1ff4f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-checks\" version=\"31.10.0\">\n         <artifact name=\"lint-checks-31.10.0.jar\">\n            <sha256 value=\"5241294f08d17dcc402b51ce72bfcf0279d277a2319101fd3b863b423aa8a4b2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-checks-31.10.0.pom\">\n            <sha256 value=\"0631b65f0446192e9b8b07f52c37fb810d2d83dd1102c0e796cf92afe9d9537a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-checks\" version=\"31.4.1\">\n         <artifact name=\"lint-checks-31.4.1.jar\">\n            <sha256 value=\"51ad2a41dcf521ad7bb0de716ab7f13a065e3cafe69e9d94c95b54f8589992c6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-checks-31.4.1.pom\">\n            <sha256 value=\"837582513ddbf393d00f6ef65daddbc1b92f0b5deca2c029b3d553c16d8f5619\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-checks\" version=\"31.4.2\">\n         <artifact name=\"lint-checks-31.4.2.jar\">\n            <sha256 value=\"51ad2a41dcf521ad7bb0de716ab7f13a065e3cafe69e9d94c95b54f8589992c6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-checks-31.4.2.pom\">\n            <sha256 value=\"3fb9cbd850c1dca47a8ed2145105f5842b106df8114749b559294408ccd044d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-checks\" version=\"31.5.0\">\n         <artifact name=\"lint-checks-31.5.0.jar\">\n            <sha256 value=\"5c80ce66f3babb7b663761a18211f741ca4f1009901b90b020c68003c288622b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-checks-31.5.0.pom\">\n            <sha256 value=\"a611f94ff777f236e7660d7bf74b9f430ccdfc19fbc0264813a94410bb2b1ca7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-checks\" version=\"31.5.1\">\n         <artifact name=\"lint-checks-31.5.1.jar\">\n            <sha256 value=\"5c80ce66f3babb7b663761a18211f741ca4f1009901b90b020c68003c288622b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-checks-31.5.1.pom\">\n            <sha256 value=\"553208119d221567dd0093291804f797a4b7c97b1b57dd666adce091c1446f9b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-checks\" version=\"31.5.2\">\n         <artifact name=\"lint-checks-31.5.2.jar\">\n            <sha256 value=\"d66f563b50954ab1bf9ff11bcabcdb774f504c4f4999612c83106d29c187bc72\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-checks-31.5.2.pom\">\n            <sha256 value=\"9c95b92b168286c710d9ca5846aed43c6db2e61d9b2555ca95a3fcad3b05a7e1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-checks\" version=\"31.6.0\">\n         <artifact name=\"lint-checks-31.6.0.jar\">\n            <sha256 value=\"9a856d4bb390b73fbfc83f48b7e9364100f9691c3692589f32a6d4c4be61c36c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-checks-31.6.0.pom\">\n            <sha256 value=\"2cd93fcf8bf9296c44c92f9f13760e052e3eac79d0f960309dfce6019551a6d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-checks\" version=\"31.6.1\">\n         <artifact name=\"lint-checks-31.6.1.jar\">\n            <sha256 value=\"a173f51fb5e4f3234c0b84941b0482cd597b07a7a22e921308039c8d0cf8c69d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-checks-31.6.1.pom\">\n            <sha256 value=\"c4f48c12021433b12581c2c93db64aa8e7be8267b4c0fe4cd18340fe4d1cec53\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-checks\" version=\"31.7.0\">\n         <artifact name=\"lint-checks-31.7.0.jar\">\n            <sha256 value=\"39d036733c84708b74bf88ca5ffa5b3a4e565f3ed348250c404aab876d344284\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-checks-31.7.0.pom\">\n            <sha256 value=\"a97920bf53bc384442a27d0e682139bd9fc44f1558bd4f319d1fb14e9d36bb0f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-checks\" version=\"31.7.1\">\n         <artifact name=\"lint-checks-31.7.1.jar\">\n            <sha256 value=\"e1677a80725c1da3f46fb8d2f7c0a5e21878ce807ac715de06f87a63ccac6041\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-checks-31.7.1.pom\">\n            <sha256 value=\"15d89aa814765085e2a96f8f35c9e217a9d050ea1e58602456b35ae0a040481b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-checks\" version=\"31.7.2\">\n         <artifact name=\"lint-checks-31.7.2.jar\">\n            <sha256 value=\"e1677a80725c1da3f46fb8d2f7c0a5e21878ce807ac715de06f87a63ccac6041\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-checks-31.7.2.pom\">\n            <sha256 value=\"bdfc7b648f689796054e6bbbe7bbf2a60e0c5e77885c0641c68d7f3553e21886\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-checks\" version=\"31.7.3\">\n         <artifact name=\"lint-checks-31.7.3.jar\">\n            <sha256 value=\"6c285320dadd7d590d89030227c766d752bfea1069976ef25d35a0fe15c1a6bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-checks-31.7.3.pom\">\n            <sha256 value=\"adf789e83491e70a45b241777805b4c282fe0941b64352f6d23b44a240ce6cec\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-checks\" version=\"31.8.0\">\n         <artifact name=\"lint-checks-31.8.0.jar\">\n            <sha256 value=\"4b918f8781563934a7c72faf434c806b09cde3cf41bc0b13782af35e03c600e9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-checks-31.8.0.pom\">\n            <sha256 value=\"0c27a8f72050c377207e46395556277150e7b07dc3fa03d7c5fe45bffd813e6a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-checks\" version=\"31.8.1\">\n         <artifact name=\"lint-checks-31.8.1.jar\">\n            <sha256 value=\"4b918f8781563934a7c72faf434c806b09cde3cf41bc0b13782af35e03c600e9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-checks-31.8.1.pom\">\n            <sha256 value=\"221194227ada158407e00c9740d83636ef13b4c44a69e5638f557aa851c1ed21\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-checks\" version=\"31.8.2\">\n         <artifact name=\"lint-checks-31.8.2.jar\">\n            <sha256 value=\"4b918f8781563934a7c72faf434c806b09cde3cf41bc0b13782af35e03c600e9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-checks-31.8.2.pom\">\n            <sha256 value=\"83c8052f99315ddb97e064e42c1782b8dac748cfe887328f3458dabe2ae6432a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-checks\" version=\"31.9.0\">\n         <artifact name=\"lint-checks-31.9.0.jar\">\n            <sha256 value=\"1dbec2077b0ac339c559753d80b45289c4831f49ed2a517ad6a94bb5a846597e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-checks-31.9.0.pom\">\n            <sha256 value=\"e7291148c0589ea42fe786629ded9c492d2dd1c5297809b8342987e54b9be3e3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-checks\" version=\"31.9.1\">\n         <artifact name=\"lint-checks-31.9.1.jar\">\n            <sha256 value=\"1dbec2077b0ac339c559753d80b45289c4831f49ed2a517ad6a94bb5a846597e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-checks-31.9.1.pom\">\n            <sha256 value=\"840cdad194e021562f70f6078727ad0144afb03b89d347692e80ca98b713ca83\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-checks\" version=\"31.9.2\">\n         <artifact name=\"lint-checks-31.9.2.jar\">\n            <sha256 value=\"1dbec2077b0ac339c559753d80b45289c4831f49ed2a517ad6a94bb5a846597e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-checks-31.9.2.pom\">\n            <sha256 value=\"2f57f5dfb7ced43d37bd74b216327b8cc0b783211c5dbf7dc53a99077215b4da\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-gradle\" version=\"31.10.0\">\n         <artifact name=\"lint-gradle-31.10.0.jar\">\n            <sha256 value=\"a42b6a41c436d90ca31a13d67afba1157b157efc892a7496f67432bf8a831cbd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-gradle-31.10.0.pom\">\n            <sha256 value=\"49140366fcc2339b11beae03d054fccebea7ffa6a5edf3d767ec9332940923d0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-gradle\" version=\"31.4.1\">\n         <artifact name=\"lint-gradle-31.4.1.jar\">\n            <sha256 value=\"ec188c62447a6c7cd781072577b04470d7a8c321de926a95f5c7f92342060fbe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-gradle-31.4.1.pom\">\n            <sha256 value=\"9bb40179435b5c937c3c00bc99cae4a4685eaf93fc559c8f2e904e4a8741dd49\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-gradle\" version=\"31.4.2\">\n         <artifact name=\"lint-gradle-31.4.2.jar\">\n            <sha256 value=\"ec188c62447a6c7cd781072577b04470d7a8c321de926a95f5c7f92342060fbe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-gradle-31.4.2.pom\">\n            <sha256 value=\"c30be922c04b04a2e92e86c822e0d454760c91cd9d6ab4bade0cb45143731012\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-gradle\" version=\"31.5.0\">\n         <artifact name=\"lint-gradle-31.5.0.jar\">\n            <sha256 value=\"ec188c62447a6c7cd781072577b04470d7a8c321de926a95f5c7f92342060fbe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-gradle-31.5.0.pom\">\n            <sha256 value=\"553d006beab96588b9708c3f708e656cf83fab51cf203f839cccde9c3cc4efa8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-gradle\" version=\"31.5.1\">\n         <artifact name=\"lint-gradle-31.5.1.jar\">\n            <sha256 value=\"ec188c62447a6c7cd781072577b04470d7a8c321de926a95f5c7f92342060fbe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-gradle-31.5.1.pom\">\n            <sha256 value=\"29e5a4111e73edbe1c0159d480e62b0d81fd1572d4697b23e9ce3b333371276a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-gradle\" version=\"31.5.2\">\n         <artifact name=\"lint-gradle-31.5.2.jar\">\n            <sha256 value=\"ec188c62447a6c7cd781072577b04470d7a8c321de926a95f5c7f92342060fbe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-gradle-31.5.2.pom\">\n            <sha256 value=\"7e5c2557302f45c38a32b4ff0359fa3f8a137010414c0cb32f6951470b5652de\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-gradle\" version=\"31.6.0\">\n         <artifact name=\"lint-gradle-31.6.0.jar\">\n            <sha256 value=\"ec188c62447a6c7cd781072577b04470d7a8c321de926a95f5c7f92342060fbe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-gradle-31.6.0.pom\">\n            <sha256 value=\"e63d157f1ff2bf68c51d315c749f9bd592e9474d034545ce2510b978381c726e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-gradle\" version=\"31.6.1\">\n         <artifact name=\"lint-gradle-31.6.1.jar\">\n            <sha256 value=\"ec188c62447a6c7cd781072577b04470d7a8c321de926a95f5c7f92342060fbe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-gradle-31.6.1.pom\">\n            <sha256 value=\"d0e43e7096841a7bf9d0f0d8017446408317ab2cb8b7d8467bc207c2b6b466a4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-gradle\" version=\"31.7.0\">\n         <artifact name=\"lint-gradle-31.7.0.jar\">\n            <sha256 value=\"ec188c62447a6c7cd781072577b04470d7a8c321de926a95f5c7f92342060fbe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-gradle-31.7.0.pom\">\n            <sha256 value=\"016c9d73c9939346781b782b1d72334b2b3b58b4bf611db88f2beb5df2762a98\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-gradle\" version=\"31.7.1\">\n         <artifact name=\"lint-gradle-31.7.1.jar\">\n            <sha256 value=\"ec188c62447a6c7cd781072577b04470d7a8c321de926a95f5c7f92342060fbe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-gradle-31.7.1.pom\">\n            <sha256 value=\"ffb722d6feef83cf7c94a668bf8ca65bbbbd46dc2b49c6b86e6de6b55d24c98e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-gradle\" version=\"31.7.2\">\n         <artifact name=\"lint-gradle-31.7.2.jar\">\n            <sha256 value=\"ec188c62447a6c7cd781072577b04470d7a8c321de926a95f5c7f92342060fbe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-gradle-31.7.2.pom\">\n            <sha256 value=\"4317b3486f4725aac63f701209c08686d650892ad98e9f9a5c733058feaf19ea\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-gradle\" version=\"31.7.3\">\n         <artifact name=\"lint-gradle-31.7.3.jar\">\n            <sha256 value=\"ec188c62447a6c7cd781072577b04470d7a8c321de926a95f5c7f92342060fbe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-gradle-31.7.3.pom\">\n            <sha256 value=\"bd462b7bc92341859686306c932f266945f868408b0db8dd241a0cacdd40499b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-gradle\" version=\"31.8.0\">\n         <artifact name=\"lint-gradle-31.8.0.jar\">\n            <sha256 value=\"ec188c62447a6c7cd781072577b04470d7a8c321de926a95f5c7f92342060fbe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-gradle-31.8.0.pom\">\n            <sha256 value=\"1dcc55eb7862f2510b6b6674e45e856d000808b021efb8a0efcbb7140b871785\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-gradle\" version=\"31.8.1\">\n         <artifact name=\"lint-gradle-31.8.1.jar\">\n            <sha256 value=\"ec188c62447a6c7cd781072577b04470d7a8c321de926a95f5c7f92342060fbe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-gradle-31.8.1.pom\">\n            <sha256 value=\"9436c915e72ee38fc1056e9c8664b50be6a6186a7fecfcdc6a2b4b3b7e73569c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-gradle\" version=\"31.8.2\">\n         <artifact name=\"lint-gradle-31.8.2.jar\">\n            <sha256 value=\"ec188c62447a6c7cd781072577b04470d7a8c321de926a95f5c7f92342060fbe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-gradle-31.8.2.pom\">\n            <sha256 value=\"b659de6d0fa7fe55bfe9f8fb0e9cad5543e8bf128eaadfe7ca704c151b8d6d99\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-gradle\" version=\"31.9.0\">\n         <artifact name=\"lint-gradle-31.9.0.jar\">\n            <sha256 value=\"b884bda63c54af4236240bb55b480dc9f4541469c9442ada7b7690f6d208fe66\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-gradle-31.9.0.pom\">\n            <sha256 value=\"7a05bb5998ee5a85c66e4b1168f3f778e5adf7fede23efc8260b255e1cc0084e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-gradle\" version=\"31.9.1\">\n         <artifact name=\"lint-gradle-31.9.1.jar\">\n            <sha256 value=\"b884bda63c54af4236240bb55b480dc9f4541469c9442ada7b7690f6d208fe66\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-gradle-31.9.1.pom\">\n            <sha256 value=\"9ba23611c11f1300edf990d7123a9283ee022f9f6be37bc5fb443f7ba1471f4c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-gradle\" version=\"31.9.2\">\n         <artifact name=\"lint-gradle-31.9.2.jar\">\n            <sha256 value=\"b884bda63c54af4236240bb55b480dc9f4541469c9442ada7b7690f6d208fe66\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-gradle-31.9.2.pom\">\n            <sha256 value=\"e5c64d935b5d17ae0f6d423e51b89e0f82a76290cd18f51b730c945d6a354e2d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-model\" version=\"31.10.0\">\n         <artifact name=\"lint-model-31.10.0.jar\">\n            <sha256 value=\"13303db0817e155a9e51f27ab4c805a0ca96f11acf86093df42b0880847cd313\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-model-31.10.0.pom\">\n            <sha256 value=\"61ce9345c35e738691f021b63584c20dfc934ad95cc7e9c2ad0c6d2e0b3d0ce0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-model\" version=\"31.4.1\">\n         <artifact name=\"lint-model-31.4.1.jar\">\n            <sha256 value=\"ae5b38460f3a59c0725930d779dbbb3372f08031a1a41faa59d9f8500b3e4641\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-model-31.4.1.pom\">\n            <sha256 value=\"a73daa05a2d8f447e4e4589ae6b64af24f111fd12f7a3c1fbecf894cab1d7c96\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-model\" version=\"31.4.2\">\n         <artifact name=\"lint-model-31.4.2.jar\">\n            <sha256 value=\"ae5b38460f3a59c0725930d779dbbb3372f08031a1a41faa59d9f8500b3e4641\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-model-31.4.2.pom\">\n            <sha256 value=\"60a7b8acb8608d38fa3d7c9b9f1af4e9dfca6b6dc1e9cd1625c4e5b99617437a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-model\" version=\"31.5.0\">\n         <artifact name=\"lint-model-31.5.0.jar\">\n            <sha256 value=\"ae5b38460f3a59c0725930d779dbbb3372f08031a1a41faa59d9f8500b3e4641\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-model-31.5.0.pom\">\n            <sha256 value=\"5ce2a4f527e15fe5be3e19a36cc4bf9865e002c901b2e12a5d63efdb357512ac\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-model\" version=\"31.5.1\">\n         <artifact name=\"lint-model-31.5.1.jar\">\n            <sha256 value=\"ae5b38460f3a59c0725930d779dbbb3372f08031a1a41faa59d9f8500b3e4641\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-model-31.5.1.pom\">\n            <sha256 value=\"59eda36de57963982ad86cd6fc800a17f79edbbd211ec947064e369a91847205\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-model\" version=\"31.5.2\">\n         <artifact name=\"lint-model-31.5.2.jar\">\n            <sha256 value=\"ae5b38460f3a59c0725930d779dbbb3372f08031a1a41faa59d9f8500b3e4641\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-model-31.5.2.pom\">\n            <sha256 value=\"5842ab4be85d5890c8948d527f3996d0c110f852af7aa5fe8f563c3ff6ea4afd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-model\" version=\"31.6.0\">\n         <artifact name=\"lint-model-31.6.0.jar\">\n            <sha256 value=\"3bb6186f775dce7a106391e24bcc3c8d270bccdf2f551b92161c6adc0bc2ecde\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-model-31.6.0.pom\">\n            <sha256 value=\"4e56fbd70970197587d12282c1754cbf270caae61fdbdc20aae1ee94d789fb0b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-model\" version=\"31.6.1\">\n         <artifact name=\"lint-model-31.6.1.jar\">\n            <sha256 value=\"3bb6186f775dce7a106391e24bcc3c8d270bccdf2f551b92161c6adc0bc2ecde\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-model-31.6.1.pom\">\n            <sha256 value=\"d58b8d1e08b862b6ca7f733fa5b190b3335956223e64657d4a8c42c353d155d6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-model\" version=\"31.7.0\">\n         <artifact name=\"lint-model-31.7.0.jar\">\n            <sha256 value=\"9f4c087a199174521d1bc7b8ff05ff1484f770f4518b7fd9f6dae6c261882dbd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-model-31.7.0.pom\">\n            <sha256 value=\"6ce2afe0bd9e56890a64c9ce97cc66d5782405ce1fe6554b7f62ca7ae48c978d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-model\" version=\"31.7.1\">\n         <artifact name=\"lint-model-31.7.1.jar\">\n            <sha256 value=\"9f4c087a199174521d1bc7b8ff05ff1484f770f4518b7fd9f6dae6c261882dbd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-model-31.7.1.pom\">\n            <sha256 value=\"168bb80c1bc60247e61d7d08a49b893c4dcda42c8444ec848ce080eb9719ed12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-model\" version=\"31.7.2\">\n         <artifact name=\"lint-model-31.7.2.jar\">\n            <sha256 value=\"9f4c087a199174521d1bc7b8ff05ff1484f770f4518b7fd9f6dae6c261882dbd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-model-31.7.2.pom\">\n            <sha256 value=\"d4cf21bf50ab6108a75f5b3d0cba2396fcc468485fb878ef4c699629dc32d6b6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-model\" version=\"31.7.3\">\n         <artifact name=\"lint-model-31.7.3.jar\">\n            <sha256 value=\"9f4c087a199174521d1bc7b8ff05ff1484f770f4518b7fd9f6dae6c261882dbd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-model-31.7.3.pom\">\n            <sha256 value=\"2eaa5ae36189ba929be77ca788f54599940285f25d0c142241ad8d7fdd44122a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-model\" version=\"31.8.0\">\n         <artifact name=\"lint-model-31.8.0.jar\">\n            <sha256 value=\"44df53687be1891d86a524d58b1ba74a9d066cc13245db37d9739ed14872f14d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-model-31.8.0.pom\">\n            <sha256 value=\"4a270750a2faf1b1ceedc30d0688db577e98fb708c0bf72eb785157244c8e375\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-model\" version=\"31.8.1\">\n         <artifact name=\"lint-model-31.8.1.jar\">\n            <sha256 value=\"44df53687be1891d86a524d58b1ba74a9d066cc13245db37d9739ed14872f14d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-model-31.8.1.pom\">\n            <sha256 value=\"c06149e2fffd697c5335e2c5b8dc5ac83dcaa0781278518eb3dc399f67844c0b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-model\" version=\"31.8.2\">\n         <artifact name=\"lint-model-31.8.2.jar\">\n            <sha256 value=\"44df53687be1891d86a524d58b1ba74a9d066cc13245db37d9739ed14872f14d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-model-31.8.2.pom\">\n            <sha256 value=\"26b9ec6bf929db074d2cd96f07df93e4f94e74a3ab075711e1f5c9275feb1a67\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-model\" version=\"31.9.0\">\n         <artifact name=\"lint-model-31.9.0.jar\">\n            <sha256 value=\"fd5c7d6609eaa2df61dee20dfed464072838e06d2fb2e82f434a8e0b97863374\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-model-31.9.0.pom\">\n            <sha256 value=\"b1d8fbd2dc1c679115ae2e1e4c4e5469b2c263c11e946ceae40e974a4ee1eb45\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-model\" version=\"31.9.1\">\n         <artifact name=\"lint-model-31.9.1.jar\">\n            <sha256 value=\"fd5c7d6609eaa2df61dee20dfed464072838e06d2fb2e82f434a8e0b97863374\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-model-31.9.1.pom\">\n            <sha256 value=\"883d51702dc0818bb2da48f8cbbaa24fddd788c4a18194ac99c090351d1986d6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-model\" version=\"31.9.2\">\n         <artifact name=\"lint-model-31.9.2.jar\">\n            <sha256 value=\"fd5c7d6609eaa2df61dee20dfed464072838e06d2fb2e82f434a8e0b97863374\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-model-31.9.2.pom\">\n            <sha256 value=\"8958b597bd989626129b8d041e9dc35ed448e449c88c06d05f33a3b04849547f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-typedef-remover\" version=\"31.10.0\">\n         <artifact name=\"lint-typedef-remover-31.10.0.jar\">\n            <sha256 value=\"4a3ba3babfd79e6fc67bcef647fb4ecfeaf59b481b108f7c2eba4d1c5c6dea8e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-typedef-remover-31.10.0.pom\">\n            <sha256 value=\"31e4c565e32a0884a9f19e0c108536abfb125500dc7e43356f57d092e3f986f6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-typedef-remover\" version=\"31.4.1\">\n         <artifact name=\"lint-typedef-remover-31.4.1.jar\">\n            <sha256 value=\"5b4f485215ca4d86ef2319fc398b5f2251e62f5446bc5fd0e00653648ddde318\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-typedef-remover-31.4.1.pom\">\n            <sha256 value=\"8577f8f9bbe5f606e48d4cf1131adb4fefbecd6ca78a1b40367d9f552ef9b8c1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-typedef-remover\" version=\"31.4.2\">\n         <artifact name=\"lint-typedef-remover-31.4.2.jar\">\n            <sha256 value=\"5b4f485215ca4d86ef2319fc398b5f2251e62f5446bc5fd0e00653648ddde318\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-typedef-remover-31.4.2.pom\">\n            <sha256 value=\"d3963b9803ffe4195ce3ea750543419f832a7618f51354f735e6990fd35109a0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-typedef-remover\" version=\"31.5.0\">\n         <artifact name=\"lint-typedef-remover-31.5.0.jar\">\n            <sha256 value=\"5b4f485215ca4d86ef2319fc398b5f2251e62f5446bc5fd0e00653648ddde318\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-typedef-remover-31.5.0.pom\">\n            <sha256 value=\"7c07d1764691da3b505fb6b0214f0660d9462277a21b341be24efbfb18340491\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-typedef-remover\" version=\"31.5.1\">\n         <artifact name=\"lint-typedef-remover-31.5.1.jar\">\n            <sha256 value=\"5b4f485215ca4d86ef2319fc398b5f2251e62f5446bc5fd0e00653648ddde318\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-typedef-remover-31.5.1.pom\">\n            <sha256 value=\"64c1ba92f9ced00d9d35ccf08fd3c8896582654624587ceb0ff0b598213362a5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-typedef-remover\" version=\"31.5.2\">\n         <artifact name=\"lint-typedef-remover-31.5.2.jar\">\n            <sha256 value=\"5b4f485215ca4d86ef2319fc398b5f2251e62f5446bc5fd0e00653648ddde318\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-typedef-remover-31.5.2.pom\">\n            <sha256 value=\"e4fa4a0fdc208932338aff0e29d9aad4199a30480277bc749d660d2f559a94a7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-typedef-remover\" version=\"31.6.0\">\n         <artifact name=\"lint-typedef-remover-31.6.0.jar\">\n            <sha256 value=\"5b4f485215ca4d86ef2319fc398b5f2251e62f5446bc5fd0e00653648ddde318\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-typedef-remover-31.6.0.pom\">\n            <sha256 value=\"a9e90fe440735b9b35375efe5751eee8921590d878da0ceb1a57acd5561052b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-typedef-remover\" version=\"31.6.1\">\n         <artifact name=\"lint-typedef-remover-31.6.1.jar\">\n            <sha256 value=\"5b4f485215ca4d86ef2319fc398b5f2251e62f5446bc5fd0e00653648ddde318\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-typedef-remover-31.6.1.pom\">\n            <sha256 value=\"764eda9f094a8b8fe095d60875997a861c227a46dfb299d4749f68a24ddee0c3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-typedef-remover\" version=\"31.7.0\">\n         <artifact name=\"lint-typedef-remover-31.7.0.jar\">\n            <sha256 value=\"5b4f485215ca4d86ef2319fc398b5f2251e62f5446bc5fd0e00653648ddde318\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-typedef-remover-31.7.0.pom\">\n            <sha256 value=\"242966a17e0f497ecf7f0f196f30dd1ebcf5e2fe021ef4e2e3b42d145e77aead\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-typedef-remover\" version=\"31.7.1\">\n         <artifact name=\"lint-typedef-remover-31.7.1.jar\">\n            <sha256 value=\"5b4f485215ca4d86ef2319fc398b5f2251e62f5446bc5fd0e00653648ddde318\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-typedef-remover-31.7.1.pom\">\n            <sha256 value=\"da9acabf5b6d519b7f4c9a673e6ff5e9fd7b10f2240824e17cba94d7fe30d1a9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-typedef-remover\" version=\"31.7.2\">\n         <artifact name=\"lint-typedef-remover-31.7.2.jar\">\n            <sha256 value=\"5b4f485215ca4d86ef2319fc398b5f2251e62f5446bc5fd0e00653648ddde318\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-typedef-remover-31.7.2.pom\">\n            <sha256 value=\"9f61fc76f3971b75befa367207129252fc5d329d66292a533b4e2f0e0fc5a736\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-typedef-remover\" version=\"31.7.3\">\n         <artifact name=\"lint-typedef-remover-31.7.3.jar\">\n            <sha256 value=\"5b4f485215ca4d86ef2319fc398b5f2251e62f5446bc5fd0e00653648ddde318\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-typedef-remover-31.7.3.pom\">\n            <sha256 value=\"12b06b1c9d9778781fe23368e723176f66f0e97641925580a2e80d2f870d2ce9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-typedef-remover\" version=\"31.8.0\">\n         <artifact name=\"lint-typedef-remover-31.8.0.jar\">\n            <sha256 value=\"5b4f485215ca4d86ef2319fc398b5f2251e62f5446bc5fd0e00653648ddde318\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-typedef-remover-31.8.0.pom\">\n            <sha256 value=\"dd87b49f13743be370eff04fb4cb8f6ead8a24665b47e0a42b569e8e60ea111c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-typedef-remover\" version=\"31.8.1\">\n         <artifact name=\"lint-typedef-remover-31.8.1.jar\">\n            <sha256 value=\"5b4f485215ca4d86ef2319fc398b5f2251e62f5446bc5fd0e00653648ddde318\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-typedef-remover-31.8.1.pom\">\n            <sha256 value=\"e56d50f2c05405793362edf767fe31c6e051a910b727ca5e655183a025b45ae1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-typedef-remover\" version=\"31.8.2\">\n         <artifact name=\"lint-typedef-remover-31.8.2.jar\">\n            <sha256 value=\"5b4f485215ca4d86ef2319fc398b5f2251e62f5446bc5fd0e00653648ddde318\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-typedef-remover-31.8.2.pom\">\n            <sha256 value=\"5a725750cfb0882ad8f228d69743cf9637fa065da0f71d34c765afb12b16b01c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-typedef-remover\" version=\"31.9.0\">\n         <artifact name=\"lint-typedef-remover-31.9.0.jar\">\n            <sha256 value=\"4a3ba3babfd79e6fc67bcef647fb4ecfeaf59b481b108f7c2eba4d1c5c6dea8e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-typedef-remover-31.9.0.pom\">\n            <sha256 value=\"61e8fed68c2549b89789429850355088cb336cdb9f8f9e00008e54fec3391723\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-typedef-remover\" version=\"31.9.1\">\n         <artifact name=\"lint-typedef-remover-31.9.1.jar\">\n            <sha256 value=\"4a3ba3babfd79e6fc67bcef647fb4ecfeaf59b481b108f7c2eba4d1c5c6dea8e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-typedef-remover-31.9.1.pom\">\n            <sha256 value=\"e60c1eced9f2ad6162642c8087c7e2f582f1e440516fe4dc9527f6aea2e4cb2c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.lint\" name=\"lint-typedef-remover\" version=\"31.9.2\">\n         <artifact name=\"lint-typedef-remover-31.9.2.jar\">\n            <sha256 value=\"4a3ba3babfd79e6fc67bcef647fb4ecfeaf59b481b108f7c2eba4d1c5c6dea8e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"lint-typedef-remover-31.9.2.pom\">\n            <sha256 value=\"708a18814706c687c6da91b88399f8bb01757d3e39ebede89ec01b70b8c93823\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib\" version=\"31.10.0\">\n         <artifact name=\"android-device-provider-ddmlib-31.10.0.jar\">\n            <sha256 value=\"89da8d3bc959585bd52f6ab6c06f2419d28f8ec61a164af2ee21e86db18c32ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-31.10.0.module\">\n            <sha256 value=\"76e7ca23296c9c54d3faef3f4066a153700c811d3c3b100228b448b20aa85b05\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib\" version=\"31.4.1\">\n         <artifact name=\"android-device-provider-ddmlib-31.4.1.jar\">\n            <sha256 value=\"a867f9be959ae8bf0bc2e773c93817559ee528b46ff733a37bc896687451b74e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-31.4.1.module\">\n            <sha256 value=\"9135fdb76500c2f2137edcc3c6de9ff1d6411fdf05f15c2d4d70d3ccc0f023d3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib\" version=\"31.4.2\">\n         <artifact name=\"android-device-provider-ddmlib-31.4.2.jar\">\n            <sha256 value=\"4ae4712c2234e572188f19ef556e4ffc0a36b6384c496c83b3fa3afff955d164\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-31.4.2.module\">\n            <sha256 value=\"7a98debf6e274ce6eea8ecea7e7a5686176c76fbc91e62ed3490c7690b1a94a8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib\" version=\"31.5.0\">\n         <artifact name=\"android-device-provider-ddmlib-31.5.0.jar\">\n            <sha256 value=\"1d7e69619536727e606adbe6b914fcc8554130d7a6257fccefe71e249d7aa321\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-31.5.0.module\">\n            <sha256 value=\"2dcb00d8111fa7de35122f3d0941fb2ba68e69b9464cc2f1c240f43e9dc83348\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib\" version=\"31.5.1\">\n         <artifact name=\"android-device-provider-ddmlib-31.5.1.jar\">\n            <sha256 value=\"120ce36cdf6196ade854059b08b1a882e06615060b53d2414812f30747f1ad75\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-31.5.1.module\">\n            <sha256 value=\"25813b70659460f360755036a548cfcc40897fe4c840571ce2c29faa87acd7af\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib\" version=\"31.5.2\">\n         <artifact name=\"android-device-provider-ddmlib-31.5.2.jar\">\n            <sha256 value=\"25da2ebf1c435c492f4de5bf44aba014e677a52ef8f0a6d0e9f6d9bb31feefbd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-31.5.2.module\">\n            <sha256 value=\"dc79f75ad43af44b0fffb948fb96a32383605b02455efef222af43f34c403776\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib\" version=\"31.6.0\">\n         <artifact name=\"android-device-provider-ddmlib-31.6.0.jar\">\n            <sha256 value=\"2c32f1a43eed32f81c060347a880e8f5fd7a76e28ffe4ca99a60da047090fe46\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-31.6.0.module\">\n            <sha256 value=\"aaa4fa945dce466623a9c2a2b8d517208a2036d96f572c593997cc841823d146\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib\" version=\"31.6.1\">\n         <artifact name=\"android-device-provider-ddmlib-31.6.1.jar\">\n            <sha256 value=\"6e1c56df820d30f689f9fca6111868e615ba5d41ed3fa5ea194b57a12d1af26c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-31.6.1.module\">\n            <sha256 value=\"05d8b86dd24ac960eca6d32a74ce21ac8e9e2fcd8104617f727228f3ba668632\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib\" version=\"31.7.0\">\n         <artifact name=\"android-device-provider-ddmlib-31.7.0.jar\">\n            <sha256 value=\"9287d43832fb8cfcce2db870a7485270d40eee66cd4502ed3117b2d35aaca192\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-31.7.0.module\">\n            <sha256 value=\"1eabd2c8bead66f018caca7965d23fe1f3738b8254e577eea4135d7c53ecb796\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib\" version=\"31.7.1\">\n         <artifact name=\"android-device-provider-ddmlib-31.7.1.jar\">\n            <sha256 value=\"e938841cc290f2320f75fce096c20944b241430da706b6cdf5f86373185afadd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-31.7.1.module\">\n            <sha256 value=\"2f6d47b853e4d9e0c8cb13ba80b8c91a37323353a0f3dad318f713f81e8a96ed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib\" version=\"31.7.2\">\n         <artifact name=\"android-device-provider-ddmlib-31.7.2.jar\">\n            <sha256 value=\"f8d08b03fd1fa0187aa020f5e66bbf009043b8fc4fee925ec4349ff1adc39086\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-31.7.2.module\">\n            <sha256 value=\"07798f8c0f1829a4f50d3d92d7cc962c1f19d598130df14a88a2b590403612dd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib\" version=\"31.7.3\">\n         <artifact name=\"android-device-provider-ddmlib-31.7.3.jar\">\n            <sha256 value=\"60cf666b057a3b3bb5063e29e226e211b8e0cc455a5625cdf898400034f59478\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-31.7.3.module\">\n            <sha256 value=\"8341b26c0b7a49e6ee0d45335de851ef579179aa38f3f32b6ccdf75a8f111ca8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib\" version=\"31.8.0\">\n         <artifact name=\"android-device-provider-ddmlib-31.8.0.jar\">\n            <sha256 value=\"292245de42ff462d8ebf377e8d45ce30535f1395c28b22339ea9adc977aa5d6a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-31.8.0.module\">\n            <sha256 value=\"6ce0ff00c401188ce65f15d3cead39adc9926efdbb8fe492ba160781cbd486d5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib\" version=\"31.8.1\">\n         <artifact name=\"android-device-provider-ddmlib-31.8.1.jar\">\n            <sha256 value=\"0c6084e91a3db473136088e5bc638116f85b8fd72201bb7c551dbc4de5d64688\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-31.8.1.module\">\n            <sha256 value=\"d55748d28eb4f166c590852e3851b144a4d2f2ae4a348208efb476a1a4a99dd1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib\" version=\"31.8.2\">\n         <artifact name=\"android-device-provider-ddmlib-31.8.2.jar\">\n            <sha256 value=\"8d273379f71ac6d6bf40064c27feaceb4433c73c01f15cc33c9bf176309cdda4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-31.8.2.module\">\n            <sha256 value=\"a30afefc917b7b76f92a31e451af4a099ccfbe051ad6556e6750335703ab0531\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib\" version=\"31.9.0\">\n         <artifact name=\"android-device-provider-ddmlib-31.9.0.jar\">\n            <sha256 value=\"82a7efd700808d9536ce728ab9711ee06d42772cdcf74f36dce3b84d6a1e61d0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-31.9.0.module\">\n            <sha256 value=\"95009fb58e9f39e07a83319b4dd1da44d974772e8cd46681b10035c629a9d2a3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib\" version=\"31.9.1\">\n         <artifact name=\"android-device-provider-ddmlib-31.9.1.jar\">\n            <sha256 value=\"e7a24c1f8fb5b8cf723d74d809d81d5d02067455d3edc3d438059822a218df49\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-31.9.1.module\">\n            <sha256 value=\"7e4808f5b3aa509c65237b5bfd20fde589affc6c8be8eff4d1208a54ff67f98d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib\" version=\"31.9.2\">\n         <artifact name=\"android-device-provider-ddmlib-31.9.2.jar\">\n            <sha256 value=\"dc8030546e50e2b63794263ab4f2c935d1d6ddb3e46d9d5be0b3b52d336e41ab\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-31.9.2.module\">\n            <sha256 value=\"460308a8b62bbc4194e870560bdc308887ca2f3af010f8f8b716c7a47cfd0b42\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib-proto\" version=\"31.10.0\">\n         <artifact name=\"android-device-provider-ddmlib-proto-31.10.0.jar\">\n            <sha256 value=\"047aecdd66e106137f77a52c442f1b83db7d6e8496899800251f206c7f39de65\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-proto-31.10.0.pom\">\n            <sha256 value=\"7cb8c242ef4a204166006d3d955f2af4eec491f7d7cb9f84fbba2923f43c37e7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib-proto\" version=\"31.4.1\">\n         <artifact name=\"android-device-provider-ddmlib-proto-31.4.1.jar\">\n            <sha256 value=\"da9f3f3dae26544c90668549584765d5854a87c425d2cfe577cd34d3600ea097\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-proto-31.4.1.pom\">\n            <sha256 value=\"b1fa32c46d8a9a291b010ed8747f924cbb15452cba3cdab3414de3ad6ae20c27\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib-proto\" version=\"31.4.2\">\n         <artifact name=\"android-device-provider-ddmlib-proto-31.4.2.jar\">\n            <sha256 value=\"da9f3f3dae26544c90668549584765d5854a87c425d2cfe577cd34d3600ea097\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-proto-31.4.2.pom\">\n            <sha256 value=\"eabda59558b7882dcabbc691c2a9aeab8e5b26547ed0f53fcdc4426ebe3363bb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib-proto\" version=\"31.5.0\">\n         <artifact name=\"android-device-provider-ddmlib-proto-31.5.0.jar\">\n            <sha256 value=\"da9f3f3dae26544c90668549584765d5854a87c425d2cfe577cd34d3600ea097\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-proto-31.5.0.pom\">\n            <sha256 value=\"464265365803ee569f8c6f4ebe0ffadfa7090c084e7d0405b6f88f2cebcb965b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib-proto\" version=\"31.5.1\">\n         <artifact name=\"android-device-provider-ddmlib-proto-31.5.1.jar\">\n            <sha256 value=\"da9f3f3dae26544c90668549584765d5854a87c425d2cfe577cd34d3600ea097\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-proto-31.5.1.pom\">\n            <sha256 value=\"e30afbebb94efd82a762c1f45735655b6c472b8abe6369c059bdd48621f579a6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib-proto\" version=\"31.5.2\">\n         <artifact name=\"android-device-provider-ddmlib-proto-31.5.2.jar\">\n            <sha256 value=\"da9f3f3dae26544c90668549584765d5854a87c425d2cfe577cd34d3600ea097\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-proto-31.5.2.pom\">\n            <sha256 value=\"24d9d603b2ea1ad5cbb832ef7ba8f705f9314e8ad39fbb9794e14b40ff666384\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib-proto\" version=\"31.6.0\">\n         <artifact name=\"android-device-provider-ddmlib-proto-31.6.0.jar\">\n            <sha256 value=\"da9f3f3dae26544c90668549584765d5854a87c425d2cfe577cd34d3600ea097\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-proto-31.6.0.pom\">\n            <sha256 value=\"6a80913ff24ae226ca559067482bd097ec0475adb1240fcee4628a7933b94dfe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib-proto\" version=\"31.6.1\">\n         <artifact name=\"android-device-provider-ddmlib-proto-31.6.1.jar\">\n            <sha256 value=\"da9f3f3dae26544c90668549584765d5854a87c425d2cfe577cd34d3600ea097\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-proto-31.6.1.pom\">\n            <sha256 value=\"78e3b00c5f833c17f7aca5942f006ca2b915bbd960f64d534a8d40a039bad9a2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib-proto\" version=\"31.7.0\">\n         <artifact name=\"android-device-provider-ddmlib-proto-31.7.0.jar\">\n            <sha256 value=\"da9f3f3dae26544c90668549584765d5854a87c425d2cfe577cd34d3600ea097\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-proto-31.7.0.pom\">\n            <sha256 value=\"8cee880f2a77d2d62247706d8d47fce5bb885c2933d61479f87dd3b8529c5d39\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib-proto\" version=\"31.7.1\">\n         <artifact name=\"android-device-provider-ddmlib-proto-31.7.1.jar\">\n            <sha256 value=\"da9f3f3dae26544c90668549584765d5854a87c425d2cfe577cd34d3600ea097\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-proto-31.7.1.pom\">\n            <sha256 value=\"7094106aa7c16065bf7e2371f2d096c365f30c5e6e5857854c3922f31b98ca7a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib-proto\" version=\"31.7.2\">\n         <artifact name=\"android-device-provider-ddmlib-proto-31.7.2.jar\">\n            <sha256 value=\"da9f3f3dae26544c90668549584765d5854a87c425d2cfe577cd34d3600ea097\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-proto-31.7.2.pom\">\n            <sha256 value=\"7dc7957ee1007844e48ad35052b261ec467c8e3d26734e798075d60e5d2dc6b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib-proto\" version=\"31.7.3\">\n         <artifact name=\"android-device-provider-ddmlib-proto-31.7.3.jar\">\n            <sha256 value=\"da9f3f3dae26544c90668549584765d5854a87c425d2cfe577cd34d3600ea097\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-proto-31.7.3.pom\">\n            <sha256 value=\"4ca12ac8e065e4f40029da4b6682c819904464e852b53aa817cc86844279ae4a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib-proto\" version=\"31.8.0\">\n         <artifact name=\"android-device-provider-ddmlib-proto-31.8.0.jar\">\n            <sha256 value=\"da9f3f3dae26544c90668549584765d5854a87c425d2cfe577cd34d3600ea097\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-proto-31.8.0.pom\">\n            <sha256 value=\"8e73552783517378952bc04bcafae34443b5ec01f5ace08571729e05e72ffe61\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib-proto\" version=\"31.8.1\">\n         <artifact name=\"android-device-provider-ddmlib-proto-31.8.1.jar\">\n            <sha256 value=\"da9f3f3dae26544c90668549584765d5854a87c425d2cfe577cd34d3600ea097\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-proto-31.8.1.pom\">\n            <sha256 value=\"34f22792e13119c95528718a436640993a0fe98da431eb7331259b89d9bd82b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib-proto\" version=\"31.8.2\">\n         <artifact name=\"android-device-provider-ddmlib-proto-31.8.2.jar\">\n            <sha256 value=\"da9f3f3dae26544c90668549584765d5854a87c425d2cfe577cd34d3600ea097\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-proto-31.8.2.pom\">\n            <sha256 value=\"4b968df8cafe5c0a35025b323669bd9d7debd5e95b2b72697ee0440b17b711aa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib-proto\" version=\"31.9.0\">\n         <artifact name=\"android-device-provider-ddmlib-proto-31.9.0.jar\">\n            <sha256 value=\"047aecdd66e106137f77a52c442f1b83db7d6e8496899800251f206c7f39de65\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-proto-31.9.0.pom\">\n            <sha256 value=\"7423c10fc017faddef5991791b658ba5045dced8d46178f30935267f09dffa9f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib-proto\" version=\"31.9.1\">\n         <artifact name=\"android-device-provider-ddmlib-proto-31.9.1.jar\">\n            <sha256 value=\"047aecdd66e106137f77a52c442f1b83db7d6e8496899800251f206c7f39de65\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-proto-31.9.1.pom\">\n            <sha256 value=\"0b4f58e2ff144ec9b308133ca636d12506b585f16e83531e58bcdf64e8ea63b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-ddmlib-proto\" version=\"31.9.2\">\n         <artifact name=\"android-device-provider-ddmlib-proto-31.9.2.jar\">\n            <sha256 value=\"047aecdd66e106137f77a52c442f1b83db7d6e8496899800251f206c7f39de65\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-ddmlib-proto-31.9.2.pom\">\n            <sha256 value=\"62368a3924d5348b8c4ccb0f7163d124ac4dcf7d4fa4225e4e51518bfce2606d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle\" version=\"31.10.0\">\n         <artifact name=\"android-device-provider-gradle-31.10.0.jar\">\n            <sha256 value=\"3f9d223d26fadb83deb4de9b67cc8484e277605408d9d939cc55084f4f150f46\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-31.10.0.module\">\n            <sha256 value=\"f6b5a31d022fef720bc455872e38b065cf85ba219ab0bc42c37beea0ebea8e91\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle\" version=\"31.4.1\">\n         <artifact name=\"android-device-provider-gradle-31.4.1.jar\">\n            <sha256 value=\"dea40b48ee3aef01cdd9fc4d71e34f07cbb9e510d8573fe884b9af1500586948\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-31.4.1.module\">\n            <sha256 value=\"a754e5d7547ce83716ef4d7b07c979a06c6040c9350cf780ef5257b27503ef2b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle\" version=\"31.4.2\">\n         <artifact name=\"android-device-provider-gradle-31.4.2.jar\">\n            <sha256 value=\"a2edf5626992d7345c5a31fa1699c96dee0ebce521983df2ff49e4ebd1e646cc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-31.4.2.module\">\n            <sha256 value=\"0a3ff959c7abf492228348e3a861bfd7f2b677ef32a711ef63277e12ad32fa11\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle\" version=\"31.5.0\">\n         <artifact name=\"android-device-provider-gradle-31.5.0.jar\">\n            <sha256 value=\"6e08736ccdb398283570a25989567d22796b107575446cb2d2e5dda7f6034361\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-31.5.0.module\">\n            <sha256 value=\"d9b43868f52a89c53fd3713295e2a3e9c3ce8a5067baf6251204714352fa85ff\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle\" version=\"31.5.1\">\n         <artifact name=\"android-device-provider-gradle-31.5.1.jar\">\n            <sha256 value=\"0e35c4d192e34a4f89471e36ba2cfa19e1283b63ed86ebd251dfcd7ca6044feb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-31.5.1.module\">\n            <sha256 value=\"c7b7f50fa4682e7f618599a837ec0fa4e02800640fae9f82f90de3baa92b45c6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle\" version=\"31.5.2\">\n         <artifact name=\"android-device-provider-gradle-31.5.2.jar\">\n            <sha256 value=\"eb292615531731486b20389bd82e5c96a671e046692ce5a4f08f48838c57d6a6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-31.5.2.module\">\n            <sha256 value=\"2cc3f00e29b566c6ee20fa95f6bea4abf6bbe3bb10c90e047b1ed16d0f774734\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle\" version=\"31.6.0\">\n         <artifact name=\"android-device-provider-gradle-31.6.0.jar\">\n            <sha256 value=\"02a69cb13054e7b120961f41a9d91475b525a687f8169b54494320ce255c52ff\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-31.6.0.module\">\n            <sha256 value=\"30ec9f29f87154872c21d61d1abf09f5feed51ec4ad1a2981a5e3de1269d4c08\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle\" version=\"31.6.1\">\n         <artifact name=\"android-device-provider-gradle-31.6.1.jar\">\n            <sha256 value=\"144a4e7db2aac9f987441c1f96acd576603a05fe356ebcc80732b46e782c44ba\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-31.6.1.module\">\n            <sha256 value=\"332f465d5e0eccb2165a1dd501e6c022805d467d7a5f3f4e38e140f763ea818e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle\" version=\"31.7.0\">\n         <artifact name=\"android-device-provider-gradle-31.7.0.jar\">\n            <sha256 value=\"b1f141b084e265e3f935afe5edeef5515e77dcf3e040fc969ea3fd1dcd0ed078\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-31.7.0.module\">\n            <sha256 value=\"272d5bfec13054ba762008305186ee94f669d8eb1e6260c107b38d4c46969e9c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle\" version=\"31.7.1\">\n         <artifact name=\"android-device-provider-gradle-31.7.1.jar\">\n            <sha256 value=\"bbe7f38336859bb23555bbd0631eabdc842e49764eab150fa2282f6c256c5d32\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-31.7.1.module\">\n            <sha256 value=\"b8e20b6155fb4131e9838bc04bbb2952193dbc729b34c4eca1b83fe864b1a3a3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle\" version=\"31.7.2\">\n         <artifact name=\"android-device-provider-gradle-31.7.2.jar\">\n            <sha256 value=\"ce2550367f833c6388110873d9ed1f3e843216a9b2c0a68a23ea0d4237eda02d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-31.7.2.module\">\n            <sha256 value=\"3687f13daafa479f1a2127269acb48e71b9deb98bf263243b69ad1341076ce15\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle\" version=\"31.7.3\">\n         <artifact name=\"android-device-provider-gradle-31.7.3.jar\">\n            <sha256 value=\"481a1b33e20083e5a70824ec34006b168d070c4a851378392b24b52a018c1ab8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-31.7.3.module\">\n            <sha256 value=\"2d7bb2165aa3a479b83f5bcf927e9171ae544fb91895805084dbc4d785fd8b29\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle\" version=\"31.8.0\">\n         <artifact name=\"android-device-provider-gradle-31.8.0.jar\">\n            <sha256 value=\"98a724636a064a57282130431dbf87e6879dae0a16b6505a9917f7c128ed98c5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-31.8.0.module\">\n            <sha256 value=\"fa9e10f670dd3da82add56eadbae57a9c82555272f34f8eefe3a363611500326\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle\" version=\"31.8.1\">\n         <artifact name=\"android-device-provider-gradle-31.8.1.jar\">\n            <sha256 value=\"f91ba01ad55b49904fc05cd3e7606eafe99a5994b07e42e2b8322824b1ffc8d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-31.8.1.module\">\n            <sha256 value=\"c2ca0d236fe1208b142385176f977d500fbccf42791eb7faaa37ccb6207945f5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle\" version=\"31.8.2\">\n         <artifact name=\"android-device-provider-gradle-31.8.2.jar\">\n            <sha256 value=\"ef8b780a4d7727dbad8a292eb15776a914f9a10ace10226342a4bd1329d13e51\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-31.8.2.module\">\n            <sha256 value=\"edb9b93011b035e0ae9d8b3f10f97063869b5c6f16e2b6aa6a488c1e597e3c99\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle\" version=\"31.9.0\">\n         <artifact name=\"android-device-provider-gradle-31.9.0.jar\">\n            <sha256 value=\"dea35096f5d497053000e87a34984472cc7402878c3bd5ccdb0d66e105db408f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-31.9.0.module\">\n            <sha256 value=\"b6ac1ae156c74ebdd084524dac0705c1310190519df9d60bfea4605d39809b1c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle\" version=\"31.9.1\">\n         <artifact name=\"android-device-provider-gradle-31.9.1.jar\">\n            <sha256 value=\"2a2264155bf0a33069a84d54f892bbfdc84b7f6eda93d3c3662f87903bcf3bf8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-31.9.1.module\">\n            <sha256 value=\"15e03bd1859a52f32834be0a9c009dd019ae1bf801ae980a680472a9a19a2fdf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle\" version=\"31.9.2\">\n         <artifact name=\"android-device-provider-gradle-31.9.2.jar\">\n            <sha256 value=\"c5d43d74895881e5e66f46b9d5837053e93a77beb436206f6447978057cf9197\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-31.9.2.module\">\n            <sha256 value=\"35776b9bc3b428e5b6282c0ae52661f2d2c798daab2fa84c73be02df641a2f39\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle-proto\" version=\"31.10.0\">\n         <artifact name=\"android-device-provider-gradle-proto-31.10.0.jar\">\n            <sha256 value=\"65a8291604bfde1f6f75ca8532a381439ec81fd958f32782ab0047fb61d9a7a1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-proto-31.10.0.pom\">\n            <sha256 value=\"7ab526b9f479533055b844c52aae0bf53ee9a2a27882f29c4e9acf46faf25d29\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle-proto\" version=\"31.4.1\">\n         <artifact name=\"android-device-provider-gradle-proto-31.4.1.jar\">\n            <sha256 value=\"ad2342bb1d6f95563400a322493ea1c229cb93df3944f1261b7399f718494049\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-proto-31.4.1.pom\">\n            <sha256 value=\"4acc834cfc40f273c3b7e28b05cd3ebc3287cf00dbecad809e6e7efbc8ae4f12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle-proto\" version=\"31.4.2\">\n         <artifact name=\"android-device-provider-gradle-proto-31.4.2.jar\">\n            <sha256 value=\"ad2342bb1d6f95563400a322493ea1c229cb93df3944f1261b7399f718494049\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-proto-31.4.2.pom\">\n            <sha256 value=\"ca7f7532783b7ceae88cb1990c0242b4d44ab50df4a380b690bee47c3d46a72c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle-proto\" version=\"31.5.0\">\n         <artifact name=\"android-device-provider-gradle-proto-31.5.0.jar\">\n            <sha256 value=\"ad2342bb1d6f95563400a322493ea1c229cb93df3944f1261b7399f718494049\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-proto-31.5.0.pom\">\n            <sha256 value=\"9e98f3ea1493cbd322fe5bac1deb3cc32f6672256370d78611c5967093788635\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle-proto\" version=\"31.5.1\">\n         <artifact name=\"android-device-provider-gradle-proto-31.5.1.jar\">\n            <sha256 value=\"ad2342bb1d6f95563400a322493ea1c229cb93df3944f1261b7399f718494049\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-proto-31.5.1.pom\">\n            <sha256 value=\"8987418ab5e78f1b36a6de6bc226fb877aa3790f92e9783d89c078a83e4249d0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle-proto\" version=\"31.5.2\">\n         <artifact name=\"android-device-provider-gradle-proto-31.5.2.jar\">\n            <sha256 value=\"ad2342bb1d6f95563400a322493ea1c229cb93df3944f1261b7399f718494049\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-proto-31.5.2.pom\">\n            <sha256 value=\"1cd835d8a88278313e60df569a6a6ea3da10d1dc8e768eaf0aaab0156b58d93b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle-proto\" version=\"31.6.0\">\n         <artifact name=\"android-device-provider-gradle-proto-31.6.0.jar\">\n            <sha256 value=\"ad2342bb1d6f95563400a322493ea1c229cb93df3944f1261b7399f718494049\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-proto-31.6.0.pom\">\n            <sha256 value=\"b26125f6f23197311628a064209286a330d5ee477bda663f25dacf6b2fc2275c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle-proto\" version=\"31.6.1\">\n         <artifact name=\"android-device-provider-gradle-proto-31.6.1.jar\">\n            <sha256 value=\"ad2342bb1d6f95563400a322493ea1c229cb93df3944f1261b7399f718494049\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-proto-31.6.1.pom\">\n            <sha256 value=\"75aee269c5dc695058e212bfe9b4065e534f7db55d6fe229aeb43ad95154e75a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle-proto\" version=\"31.7.0\">\n         <artifact name=\"android-device-provider-gradle-proto-31.7.0.jar\">\n            <sha256 value=\"ad2342bb1d6f95563400a322493ea1c229cb93df3944f1261b7399f718494049\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-proto-31.7.0.pom\">\n            <sha256 value=\"2baa931d4747055ff6ae9f80773ff3aa1c42fba0fadba1a1a61e17f6b401f6b4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle-proto\" version=\"31.7.1\">\n         <artifact name=\"android-device-provider-gradle-proto-31.7.1.jar\">\n            <sha256 value=\"ad2342bb1d6f95563400a322493ea1c229cb93df3944f1261b7399f718494049\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-proto-31.7.1.pom\">\n            <sha256 value=\"4d643403af6eab3af6c267390d744237b94d7077575c26b617650e528dc7be07\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle-proto\" version=\"31.7.2\">\n         <artifact name=\"android-device-provider-gradle-proto-31.7.2.jar\">\n            <sha256 value=\"ad2342bb1d6f95563400a322493ea1c229cb93df3944f1261b7399f718494049\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-proto-31.7.2.pom\">\n            <sha256 value=\"6fbc1881567a223d21f0c538169c45453aa04ee6686ab4b149321a36921d287f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle-proto\" version=\"31.7.3\">\n         <artifact name=\"android-device-provider-gradle-proto-31.7.3.jar\">\n            <sha256 value=\"ad2342bb1d6f95563400a322493ea1c229cb93df3944f1261b7399f718494049\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-proto-31.7.3.pom\">\n            <sha256 value=\"f3dace1d46b265cd8f8264ca7861612073c8db6299c99abdce6babac39ff75aa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle-proto\" version=\"31.8.0\">\n         <artifact name=\"android-device-provider-gradle-proto-31.8.0.jar\">\n            <sha256 value=\"ad2342bb1d6f95563400a322493ea1c229cb93df3944f1261b7399f718494049\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-proto-31.8.0.pom\">\n            <sha256 value=\"09878e8c57e606d529d60602a74258ea2a2c03342f7fb35ba8726396f306ee10\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle-proto\" version=\"31.8.1\">\n         <artifact name=\"android-device-provider-gradle-proto-31.8.1.jar\">\n            <sha256 value=\"ad2342bb1d6f95563400a322493ea1c229cb93df3944f1261b7399f718494049\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-proto-31.8.1.pom\">\n            <sha256 value=\"d88d10df5b712807590993b37920885407fa23ee8fc795e3b1187429e8707e59\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle-proto\" version=\"31.8.2\">\n         <artifact name=\"android-device-provider-gradle-proto-31.8.2.jar\">\n            <sha256 value=\"ad2342bb1d6f95563400a322493ea1c229cb93df3944f1261b7399f718494049\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-proto-31.8.2.pom\">\n            <sha256 value=\"25e9767aa67c9059043b1e3bad9cee81cc242c53dac5e79b7ad5015b8c621882\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle-proto\" version=\"31.9.0\">\n         <artifact name=\"android-device-provider-gradle-proto-31.9.0.jar\">\n            <sha256 value=\"65a8291604bfde1f6f75ca8532a381439ec81fd958f32782ab0047fb61d9a7a1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-proto-31.9.0.pom\">\n            <sha256 value=\"2bba190f8a241dd89a7733427356adb3e70b609471554ef9bcaac98467ee2e99\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle-proto\" version=\"31.9.1\">\n         <artifact name=\"android-device-provider-gradle-proto-31.9.1.jar\">\n            <sha256 value=\"65a8291604bfde1f6f75ca8532a381439ec81fd958f32782ab0047fb61d9a7a1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-proto-31.9.1.pom\">\n            <sha256 value=\"03641f5fe306bf7734307a389f60bf68873b12daaae88c15acad972adc22fc63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-gradle-proto\" version=\"31.9.2\">\n         <artifact name=\"android-device-provider-gradle-proto-31.9.2.jar\">\n            <sha256 value=\"65a8291604bfde1f6f75ca8532a381439ec81fd958f32782ab0047fb61d9a7a1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-gradle-proto-31.9.2.pom\">\n            <sha256 value=\"e72c8e345e8f57fb1c2d7847f0edbd3b468b52c68613d52595bed7c96ca3a042\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile\" version=\"31.10.0\">\n         <artifact name=\"android-device-provider-profile-31.10.0.jar\">\n            <sha256 value=\"bca45f05cb5a922da40f18fce56b26d928cfb65ba59b74bf1cddc0eef079f72d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-31.10.0.module\">\n            <sha256 value=\"98c42dfde9426e01b50da6807453fe74ecd7efda5faef5bb7cd24e3c12bead8c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile\" version=\"31.7.0\">\n         <artifact name=\"android-device-provider-profile-31.7.0.jar\">\n            <sha256 value=\"5784af2da9645ddc7aa0e7c0a08c24a9fac10ec8239d31c147ed7c4979ff579d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-31.7.0.module\">\n            <sha256 value=\"01acd8bf446a8f1f77f508956069e02bc26d851c2c972fcdcd616328bc2e7b38\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile\" version=\"31.7.1\">\n         <artifact name=\"android-device-provider-profile-31.7.1.jar\">\n            <sha256 value=\"03c765ad7bd10f78c8df8cd49de1704ecff76183e8a9f682bfc877d50b9366a0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-31.7.1.module\">\n            <sha256 value=\"f532cbe85c23ed28dfd249cb9e6affc6de77721449657b263a53e3ef90be8600\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile\" version=\"31.7.2\">\n         <artifact name=\"android-device-provider-profile-31.7.2.jar\">\n            <sha256 value=\"ee3768e1d71530381451eb6b614f4846fa3463ab4401ae5fd1bfa7f67fe1aa8f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-31.7.2.module\">\n            <sha256 value=\"e1c6b24cc1fce787a80ef9cc3d43c012b971247a0fef196c8d04f331e9353eb3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile\" version=\"31.7.3\">\n         <artifact name=\"android-device-provider-profile-31.7.3.jar\">\n            <sha256 value=\"3ac388cbd6dccc1c53f5f3b7e855d19f3f881bc426971b087553186caf4a0504\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-31.7.3.module\">\n            <sha256 value=\"bccda84bd3dcfb658dbf9214b49e31dd6c9fe42816cf8cf5a807f9c08fe6cf75\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile\" version=\"31.8.0\">\n         <artifact name=\"android-device-provider-profile-31.8.0.jar\">\n            <sha256 value=\"2e359ef70fb85302b8545419005288b039114e05a788d5cfe2af80afb4ed42b4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-31.8.0.module\">\n            <sha256 value=\"c8754b5e118835ff31a1e11f103c5d2543298aebbcd6c6a3f3471cd5d3a4b04b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile\" version=\"31.8.1\">\n         <artifact name=\"android-device-provider-profile-31.8.1.jar\">\n            <sha256 value=\"6453f9867bebab65e73f88b5840596faef5594fe216b979d5b4dcc1170750627\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-31.8.1.module\">\n            <sha256 value=\"9ce58c361fca7168e187c9d580b3a7e9637abd6f36ff5e6fd94d5c1a10a2ddf5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile\" version=\"31.8.2\">\n         <artifact name=\"android-device-provider-profile-31.8.2.jar\">\n            <sha256 value=\"38af4ec00c696d92c15a61084e963f807ca6b7b938a8b7fbe2a44eb7b5948e15\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-31.8.2.module\">\n            <sha256 value=\"85b2b15a72ce7fa66602cced3ee1e76c883b252abb26616b5327e110816fa5f4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile\" version=\"31.9.0\">\n         <artifact name=\"android-device-provider-profile-31.9.0.jar\">\n            <sha256 value=\"449ea2a41c7780466ab1100e6ca897c7edb1e2120036b4264d379746fdfc2917\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-31.9.0.module\">\n            <sha256 value=\"c3276a51bc39c7fcd518bd508825b541741958e8bcce686cd605764179483260\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile\" version=\"31.9.1\">\n         <artifact name=\"android-device-provider-profile-31.9.1.jar\">\n            <sha256 value=\"bf535a67a2e2413d523d1aa172fd7c9c06627a5dbf50594c563d3bd37b899d46\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-31.9.1.module\">\n            <sha256 value=\"83dda9ff1d92cdfcbb27197d7893877a9181c44d4eee955df5c0b08abe2f57bd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile\" version=\"31.9.2\">\n         <artifact name=\"android-device-provider-profile-31.9.2.jar\">\n            <sha256 value=\"0d2c9cfd5c5046d1e6d078cceb9e11af28d146fe37ce622506b024b851a82f68\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-31.9.2.module\">\n            <sha256 value=\"103d28805420cc9d58bf5b54602a7460962d8238b71287743dcd00633c8017cb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile-proto\" version=\"31.10.0\">\n         <artifact name=\"android-device-provider-profile-proto-31.10.0.jar\">\n            <sha256 value=\"3e7b098f6e3ecae31b6f7909c343b4ec09aa18d8a89f41bf92077ba4b056f453\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-proto-31.10.0.pom\">\n            <sha256 value=\"0297f800895a03f3fc33f75cdf4b239e32518c7f8f3222d51468a37f8001e650\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile-proto\" version=\"31.7.0\">\n         <artifact name=\"android-device-provider-profile-proto-31.7.0.jar\">\n            <sha256 value=\"10d100ced5d083714c1c68bbbb10bb375e8546f92ab0e4219c0e4a5ff298115e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-proto-31.7.0.pom\">\n            <sha256 value=\"ff58609abc657d958014504cfdeea41b7277c0d23ab0eb508a47eedee30f6796\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile-proto\" version=\"31.7.1\">\n         <artifact name=\"android-device-provider-profile-proto-31.7.1.jar\">\n            <sha256 value=\"10d100ced5d083714c1c68bbbb10bb375e8546f92ab0e4219c0e4a5ff298115e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-proto-31.7.1.pom\">\n            <sha256 value=\"010ef24b1ce6069dd8a00a2c96668a52853b9f5400102ee6722b35546968a283\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile-proto\" version=\"31.7.2\">\n         <artifact name=\"android-device-provider-profile-proto-31.7.2.jar\">\n            <sha256 value=\"10d100ced5d083714c1c68bbbb10bb375e8546f92ab0e4219c0e4a5ff298115e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-proto-31.7.2.pom\">\n            <sha256 value=\"34260b1fc073274016e0afa3a89ce40a74c09539ce283535ef4bb09fa9d4899a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile-proto\" version=\"31.7.3\">\n         <artifact name=\"android-device-provider-profile-proto-31.7.3.jar\">\n            <sha256 value=\"10d100ced5d083714c1c68bbbb10bb375e8546f92ab0e4219c0e4a5ff298115e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-proto-31.7.3.pom\">\n            <sha256 value=\"89b175084a37cc6f3875af5685c8882374f56cb6e3bd8dc44f897f5cdc6143e9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile-proto\" version=\"31.8.0\">\n         <artifact name=\"android-device-provider-profile-proto-31.8.0.jar\">\n            <sha256 value=\"10d100ced5d083714c1c68bbbb10bb375e8546f92ab0e4219c0e4a5ff298115e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-proto-31.8.0.pom\">\n            <sha256 value=\"d09032c2d045db216da986b1370aa150a04f0ad94d5061ad1febcd77766a8466\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile-proto\" version=\"31.8.1\">\n         <artifact name=\"android-device-provider-profile-proto-31.8.1.jar\">\n            <sha256 value=\"10d100ced5d083714c1c68bbbb10bb375e8546f92ab0e4219c0e4a5ff298115e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-proto-31.8.1.pom\">\n            <sha256 value=\"d6ca3d00c10b3ee1d72dc68b7c7687db6faab45699306a57f0b6430e11454bf1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile-proto\" version=\"31.8.2\">\n         <artifact name=\"android-device-provider-profile-proto-31.8.2.jar\">\n            <sha256 value=\"10d100ced5d083714c1c68bbbb10bb375e8546f92ab0e4219c0e4a5ff298115e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-proto-31.8.2.pom\">\n            <sha256 value=\"98d60d39c1d4c2946d81a8bf6a0d418010cde7095c28d7278cbc425ae60dd2bb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile-proto\" version=\"31.9.0\">\n         <artifact name=\"android-device-provider-profile-proto-31.9.0.jar\">\n            <sha256 value=\"3e7b098f6e3ecae31b6f7909c343b4ec09aa18d8a89f41bf92077ba4b056f453\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-proto-31.9.0.pom\">\n            <sha256 value=\"8d10996f1ba23c6a138431dea63b8a6391afe52ee744c9c37785c8a45d61192b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile-proto\" version=\"31.9.1\">\n         <artifact name=\"android-device-provider-profile-proto-31.9.1.jar\">\n            <sha256 value=\"3e7b098f6e3ecae31b6f7909c343b4ec09aa18d8a89f41bf92077ba4b056f453\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-proto-31.9.1.pom\">\n            <sha256 value=\"8f755210ec85fcba8168a266b613f478c3f0d7e512684adef86ff92c96f8682a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-device-provider-profile-proto\" version=\"31.9.2\">\n         <artifact name=\"android-device-provider-profile-proto-31.9.2.jar\">\n            <sha256 value=\"3e7b098f6e3ecae31b6f7909c343b4ec09aa18d8a89f41bf92077ba4b056f453\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-profile-proto-31.9.2.pom\">\n            <sha256 value=\"06bc3609c6181b32ce982d0753b39edb9ce21b1659540b2927967ce3655a761a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output\" version=\"31.10.0\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.10.0.jar\">\n            <sha256 value=\"4ac340df6cb050e28f704fa31729005e15ccc1de66983dcd9f47d7d34957a166\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.10.0.module\">\n            <sha256 value=\"060aee714c2b098d0d3d20c29676d4876fee8b0d71cd66bd88b280f198755adf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output\" version=\"31.4.1\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.4.1.jar\">\n            <sha256 value=\"1c047272109c223336a8cda7b37685a34658fabba2579e9cd6723fc454fc544e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.4.1.module\">\n            <sha256 value=\"53fa3eb5818f20f614d17c0035b5ac38fedebf782b0b584a978414be868ec145\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output\" version=\"31.4.2\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.4.2.jar\">\n            <sha256 value=\"63577a4528b610b7e441319ff2ec0c555cff0fe472b5d2df85e427f2e105ae65\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.4.2.module\">\n            <sha256 value=\"85a7752d410163a5b12fbefdb7ee67d4f2e9556c11be28b67e27e2fdce8efd02\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output\" version=\"31.5.0\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.5.0.jar\">\n            <sha256 value=\"74aa46e5df2a72310343c795461a3ebfdd54dc7612cd283bf2e81d15f8d393c1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.5.0.module\">\n            <sha256 value=\"e049d5dc8937d42bb1763ee0c2c21e80055cf001efd617d828a0eb845b15fb2f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output\" version=\"31.5.1\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.5.1.jar\">\n            <sha256 value=\"74009d3f7f201accb741402fdf4c4b652d36336fdee229ef09989d72ea7ae5b6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.5.1.module\">\n            <sha256 value=\"3de9f412f2f453e8765d11001d8517542980521d61483676943129ada2928a6a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output\" version=\"31.5.2\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.5.2.jar\">\n            <sha256 value=\"a93723abced5a61bbddcad01f5e1773832be13f9a7b509d5a5a682389faa0f57\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.5.2.module\">\n            <sha256 value=\"73a2443ee1752ec33eca52f954a9b648bbab94ef24641b447a9feed155b45a16\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output\" version=\"31.6.0\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.6.0.jar\">\n            <sha256 value=\"83512570f412db55e6261769e36b0fd170d7aa9fd4c2a03044eaa97a6ff3454f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.6.0.module\">\n            <sha256 value=\"84ccfd1d52d80c97cc8693814c391c73c30798f7facc89576824e02ece0d6401\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output\" version=\"31.6.1\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.6.1.jar\">\n            <sha256 value=\"d4b94f218c7cd5c5d25e2aa664daabd5425e4691cfdf32efc57017f465dfc91e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.6.1.module\">\n            <sha256 value=\"90115f71144d5fa21c4c5299a0f77eb0006bb1c7147f772a5f524cfdf949af7b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output\" version=\"31.7.0\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.7.0.jar\">\n            <sha256 value=\"f403cb0bdd7739e3923052d6ac6860809a413eca6715e7dffa01c74ca04b4421\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.7.0.module\">\n            <sha256 value=\"2f18e7e2c885a4b0d3f582a2a10d4d1f99254083487d414fe054eb3ebbed199c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output\" version=\"31.7.1\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.7.1.jar\">\n            <sha256 value=\"653e36c72e113d093a1ec471c4d49650a3ea512cc6d3af70b28209dab507e058\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.7.1.module\">\n            <sha256 value=\"f6593a845f260b7ba61453c48721b06c1d5f3eb96d4aa9307ddb6920b120db69\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output\" version=\"31.7.2\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.7.2.jar\">\n            <sha256 value=\"9e6c949dbbe76628f978ba2713d053c3c82a695cd95adfb276318925149044ad\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.7.2.module\">\n            <sha256 value=\"b288c6db01943e78321020e2bf9b335ef38b1fb26eed245453aaab1703b14da6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output\" version=\"31.7.3\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.7.3.jar\">\n            <sha256 value=\"22c56d78a129269399696172f292606fa305a5fea882a4d22469b11933285ef3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.7.3.module\">\n            <sha256 value=\"76e628a6e8ee342cc2ccc25bc4f3ede336f901e13d22129179c27e1fefd121d6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output\" version=\"31.8.0\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.8.0.jar\">\n            <sha256 value=\"432bbc36340be50ae7b24a7c410b7916f67daefa5695658470418b70d3e1ce33\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.8.0.module\">\n            <sha256 value=\"0dd696a07e654081fe769a6cf293d46d511714aaf884a98a4f931f221b644060\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output\" version=\"31.8.1\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.8.1.jar\">\n            <sha256 value=\"d2820bc5ad291434c14e5758b1f7ba1282c7edbaf047cdee926fd0b08dd58d80\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.8.1.module\">\n            <sha256 value=\"3c3636180b4af254b29b926767eae682dda626abcd207c29e004127167d5f74e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output\" version=\"31.8.2\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.8.2.jar\">\n            <sha256 value=\"d170b9c76cf06980a990f68bb535fb0e0ba4b91149c4b4ed926ff217522aa963\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.8.2.module\">\n            <sha256 value=\"c826c79c10f8551f1a08d6c97a7f0307bb8f4b08c31658e94d759f96ed02d4c6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output\" version=\"31.9.0\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.9.0.jar\">\n            <sha256 value=\"bb875d7f5006e362c9c6efdd24ac1476f54a89f4fafb2ea245440b3fd2cf9955\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.9.0.module\">\n            <sha256 value=\"624b2d3ba7bc228dc869b7c555234e8493deca64a920ea21fb051492d539483d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output\" version=\"31.9.1\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.9.1.jar\">\n            <sha256 value=\"b43b110b3ee0d1b4af97bc9e5b6a7956b492bfd19f2ed87bebef4eb8375b0a0a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.9.1.module\">\n            <sha256 value=\"40d208d365ef7313b8fe5dd492eae2218ebd0e48a61b068e389f6618f07ae2f5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output\" version=\"31.9.2\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.9.2.jar\">\n            <sha256 value=\"07a22ce6564f8e5e1501c659ab9621e878dbceb6f7b3cebfc7ce7dd547138350\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-31.9.2.module\">\n            <sha256 value=\"b76d797ed696f1fae5d61667bd86688cdb8378c95f31a63eb2bd92b0cc84af61\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output-proto\" version=\"31.10.0\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.10.0.jar\">\n            <sha256 value=\"6ba7e6ac2208d74c1bb5f1d1464abafc6a45d8710b20455a2dc02adf8726bc83\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.10.0.pom\">\n            <sha256 value=\"74ab49bf40964b9ee0fd94ae3a953a0000dab2c14eabf4bddc7453032e98c21f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output-proto\" version=\"31.4.1\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.4.1.jar\">\n            <sha256 value=\"38450694de6328c2c4cba696f9c04ecdd5ce6952355f68c3a22f9541d1d6546f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.4.1.pom\">\n            <sha256 value=\"fe86680b236db1f113d5ee5cc1f55bef7b9efd4149c79425e8ae10d5876b12e8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output-proto\" version=\"31.4.2\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.4.2.jar\">\n            <sha256 value=\"38450694de6328c2c4cba696f9c04ecdd5ce6952355f68c3a22f9541d1d6546f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.4.2.pom\">\n            <sha256 value=\"916d4ca5edbb226bf7d7e288f63ec430aee464f7c29e610c9bc72dc05fa5f205\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output-proto\" version=\"31.5.0\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.5.0.jar\">\n            <sha256 value=\"38450694de6328c2c4cba696f9c04ecdd5ce6952355f68c3a22f9541d1d6546f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.5.0.pom\">\n            <sha256 value=\"45c383683880e4d28571f137f6e7256371cccc8846b487df292cc0676123708c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output-proto\" version=\"31.5.1\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.5.1.jar\">\n            <sha256 value=\"38450694de6328c2c4cba696f9c04ecdd5ce6952355f68c3a22f9541d1d6546f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.5.1.pom\">\n            <sha256 value=\"addb25a0ff209fb7f98515ec9c8f42949b272bd485d4e4affbb82f8db55c0618\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output-proto\" version=\"31.5.2\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.5.2.jar\">\n            <sha256 value=\"38450694de6328c2c4cba696f9c04ecdd5ce6952355f68c3a22f9541d1d6546f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.5.2.pom\">\n            <sha256 value=\"2f2eeab39ca567e43d10f2688ef733e834401c8ab098bc3cf88ff84d6be7ba13\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output-proto\" version=\"31.6.0\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.6.0.jar\">\n            <sha256 value=\"38450694de6328c2c4cba696f9c04ecdd5ce6952355f68c3a22f9541d1d6546f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.6.0.pom\">\n            <sha256 value=\"5a48e660a346a1fbdc5b41d78e8f7e9757734c6d957d711316dab50aa8892c5d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output-proto\" version=\"31.6.1\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.6.1.jar\">\n            <sha256 value=\"38450694de6328c2c4cba696f9c04ecdd5ce6952355f68c3a22f9541d1d6546f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.6.1.pom\">\n            <sha256 value=\"70ff95eb2c5282823a8c98efb2c33ee6d2f21964b885ef485f192117438320c6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output-proto\" version=\"31.7.0\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.7.0.jar\">\n            <sha256 value=\"38450694de6328c2c4cba696f9c04ecdd5ce6952355f68c3a22f9541d1d6546f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.7.0.pom\">\n            <sha256 value=\"fb2b8756614d908678414ee96c6fb0a6155355277cbe239e099a2066167189d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output-proto\" version=\"31.7.1\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.7.1.jar\">\n            <sha256 value=\"38450694de6328c2c4cba696f9c04ecdd5ce6952355f68c3a22f9541d1d6546f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.7.1.pom\">\n            <sha256 value=\"d35dae8c264ce1e7df2fefb2a4b297ecd3a75b1a3bff78a6139c8f94861e9623\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output-proto\" version=\"31.7.2\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.7.2.jar\">\n            <sha256 value=\"38450694de6328c2c4cba696f9c04ecdd5ce6952355f68c3a22f9541d1d6546f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.7.2.pom\">\n            <sha256 value=\"1d954b8eca63af5a137aa218bd90669faa4b3d2e9f289a64114df0e8b23ac163\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output-proto\" version=\"31.7.3\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.7.3.jar\">\n            <sha256 value=\"38450694de6328c2c4cba696f9c04ecdd5ce6952355f68c3a22f9541d1d6546f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.7.3.pom\">\n            <sha256 value=\"aa87561ee38800bb1192d56a3edc60465dac6dbfa73a345a8ccb14b0f4e89447\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output-proto\" version=\"31.8.0\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.8.0.jar\">\n            <sha256 value=\"38450694de6328c2c4cba696f9c04ecdd5ce6952355f68c3a22f9541d1d6546f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.8.0.pom\">\n            <sha256 value=\"67043f267ca88f33cae22527b196d3652648f52d87032c9763f221934cff9f47\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output-proto\" version=\"31.8.1\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.8.1.jar\">\n            <sha256 value=\"38450694de6328c2c4cba696f9c04ecdd5ce6952355f68c3a22f9541d1d6546f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.8.1.pom\">\n            <sha256 value=\"094b4e37cf98888e21509794b9fe1378b2d5e64cbcbd3aaa0ba287eab063c5a4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output-proto\" version=\"31.8.2\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.8.2.jar\">\n            <sha256 value=\"38450694de6328c2c4cba696f9c04ecdd5ce6952355f68c3a22f9541d1d6546f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.8.2.pom\">\n            <sha256 value=\"6d10ee58ce018699af48a47a3300443b6d5a0b9a5c4449c26e3c5ff58afdea53\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output-proto\" version=\"31.9.0\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.9.0.jar\">\n            <sha256 value=\"6ba7e6ac2208d74c1bb5f1d1464abafc6a45d8710b20455a2dc02adf8726bc83\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.9.0.pom\">\n            <sha256 value=\"f48b0786afccb42d52f85e07b244e6d5319bbde76e3eea3e3fdc71f991003a2f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output-proto\" version=\"31.9.1\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.9.1.jar\">\n            <sha256 value=\"6ba7e6ac2208d74c1bb5f1d1464abafc6a45d8710b20455a2dc02adf8726bc83\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.9.1.pom\">\n            <sha256 value=\"8c63a7e3540b1d01831dcba48e455601f0cdee36a788d860bab04117b684db41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-additional-test-output-proto\" version=\"31.9.2\">\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.9.2.jar\">\n            <sha256 value=\"6ba7e6ac2208d74c1bb5f1d1464abafc6a45d8710b20455a2dc02adf8726bc83\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-additional-test-output-proto-31.9.2.pom\">\n            <sha256 value=\"36028acc4bae69b817fcfb094d84142fc2115a04caf9952ba142ace4ac74dce2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer\" version=\"31.10.0\">\n         <artifact name=\"android-test-plugin-host-apk-installer-31.10.0.jar\">\n            <sha256 value=\"953f8218403c00e1f7dc9bfa72d9273b7f754b8ce4521424c9b65c09841d72de\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-31.10.0.module\">\n            <sha256 value=\"53a256135096113bedd4b7a29cacaf7bcdcadef35912c857714ccdad7f87ec49\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer\" version=\"31.4.1\">\n         <artifact name=\"android-test-plugin-host-apk-installer-31.4.1.jar\">\n            <sha256 value=\"20ef9f61f8fb1d54a9e16f0c496c08c3bbd70fb03c06e2a561d7a464fc04dc0e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-31.4.1.module\">\n            <sha256 value=\"65a9f5416bdb01e7a17e94f6a4e47f20b2f4ac65557e8cbfcb3cf23268cf283b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer\" version=\"31.4.2\">\n         <artifact name=\"android-test-plugin-host-apk-installer-31.4.2.jar\">\n            <sha256 value=\"b278bfc7fb67a090756a795c7602c0a4800a9f39f58cfe77c4ba042810ee77b4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-31.4.2.module\">\n            <sha256 value=\"17de0d963ee172f41811581315a379ec4a9ce65326ddc9330f5afb0d2a6d64be\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer\" version=\"31.5.0\">\n         <artifact name=\"android-test-plugin-host-apk-installer-31.5.0.jar\">\n            <sha256 value=\"7af9b0f162cf66fc5cb534096e2999673c0e5dfad93dd9d0966751020fbeafb3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-31.5.0.module\">\n            <sha256 value=\"56e50e6c0416a6c2fa614b10dedccd817ef18d6607c659f76226eea971976dc0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer\" version=\"31.5.1\">\n         <artifact name=\"android-test-plugin-host-apk-installer-31.5.1.jar\">\n            <sha256 value=\"b231fbbb28e9f26badd3df7c863a29af014a53857dcd3bf4afd2ade346b8022b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-31.5.1.module\">\n            <sha256 value=\"f1ed6e49c686fb05e58b031743b74b2191b4e62f67f7596f3a9dee3acced50e0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer\" version=\"31.5.2\">\n         <artifact name=\"android-test-plugin-host-apk-installer-31.5.2.jar\">\n            <sha256 value=\"3d8001fc9f8c57064d1c2f3031dfadc6fee8a50abfe27fbcadf082df635b08b0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-31.5.2.module\">\n            <sha256 value=\"c2805f74992c24f8bdb31e0b5c8aefefd2eee086be80a679180d99a5208204c5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer\" version=\"31.6.0\">\n         <artifact name=\"android-test-plugin-host-apk-installer-31.6.0.jar\">\n            <sha256 value=\"c4708eb0349d2ba70377d919d644202e9549f5d590cc0b1aeb71599315dd8dfd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-31.6.0.module\">\n            <sha256 value=\"994399f0b7f9ae6d50959fd59f7da34a43fb3098a69fc56de8fcb01b2e3242f9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer\" version=\"31.6.1\">\n         <artifact name=\"android-test-plugin-host-apk-installer-31.6.1.jar\">\n            <sha256 value=\"cc57d107017d5321cd1966dafe12a3a7bd326aea2457fa0120519d073f8aa735\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-31.6.1.module\">\n            <sha256 value=\"0955ae7d8066580b0ab0c2e0101570976c3e0deef42dc16bffe5329c95a747f3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer\" version=\"31.7.0\">\n         <artifact name=\"android-test-plugin-host-apk-installer-31.7.0.jar\">\n            <sha256 value=\"db0e85e34aa43843613cdddac37f23ed6ee431eae97239e76b21392b3615084c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-31.7.0.module\">\n            <sha256 value=\"4646c2db0bd6cb5343f796da56f8bc02dee4a12e41f2179d848989be5a1a5f1f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer\" version=\"31.7.1\">\n         <artifact name=\"android-test-plugin-host-apk-installer-31.7.1.jar\">\n            <sha256 value=\"31d6cde997122cff1c808114813d54502bdbb0c01c1ae9e5bbee144b37be1de7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-31.7.1.module\">\n            <sha256 value=\"556b91b7512f216ca477d94dd3047242d91974fb4d0fd8cf94f338b602cbdc3e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer\" version=\"31.7.2\">\n         <artifact name=\"android-test-plugin-host-apk-installer-31.7.2.jar\">\n            <sha256 value=\"f70359ae39088d9babfc05d6986b824815d7d609c8614cfb202a93e422377c19\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-31.7.2.module\">\n            <sha256 value=\"a44700e73eeabc472ebb4778494627da47d82148d37efe08cd38cf485006fb78\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer\" version=\"31.7.3\">\n         <artifact name=\"android-test-plugin-host-apk-installer-31.7.3.jar\">\n            <sha256 value=\"9d6f35cfaea2bce5167761c680c5e4498ca46dbd8b2b027158cd4b0e2c818160\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-31.7.3.module\">\n            <sha256 value=\"fc5ffea00417f07992b3f825fd481823582405fb9523f74c62ec9a9c7a84ad59\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer\" version=\"31.8.0\">\n         <artifact name=\"android-test-plugin-host-apk-installer-31.8.0.jar\">\n            <sha256 value=\"a8f504c851598f5f7b3577c5587119cda0e6281631170c6a14a6520856afc8f5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-31.8.0.module\">\n            <sha256 value=\"b6c2250f338839511a1e0e78f7eb6807b7acc21538f32cc72462fd9ea68fca4b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer\" version=\"31.8.1\">\n         <artifact name=\"android-test-plugin-host-apk-installer-31.8.1.jar\">\n            <sha256 value=\"cedd4f2ed260e04993f12be1fd07dbfcf4263a420fbc343409d33c399eaa3edb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-31.8.1.module\">\n            <sha256 value=\"ada8ec6727366f267009880a93f910a47ba45c1479e98916564dc912a3a59033\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer\" version=\"31.8.2\">\n         <artifact name=\"android-test-plugin-host-apk-installer-31.8.2.jar\">\n            <sha256 value=\"27ba2966da17e0719a4176bf0f66c42d9fe0f9505becd7ed8576f02f61ccae35\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-31.8.2.module\">\n            <sha256 value=\"af1b39d391de0ba3fb42cc7141ff3204944a25ca42dd1d88fcb82c8f8cbbf71a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer\" version=\"31.9.0\">\n         <artifact name=\"android-test-plugin-host-apk-installer-31.9.0.jar\">\n            <sha256 value=\"6d1061c5e56cdfef570cd9fbe3d36babf34023096530e017fbd845256c5df3fe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-31.9.0.module\">\n            <sha256 value=\"5982f065bc818ffb4a13a5fc9590a5938b43885c31d51c79bdc6918f330a2478\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer\" version=\"31.9.1\">\n         <artifact name=\"android-test-plugin-host-apk-installer-31.9.1.jar\">\n            <sha256 value=\"aba79dd225a16a8afc97e7b9f2ab42fdbb49439846f2cc86ef75df4a1dc86b67\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-31.9.1.module\">\n            <sha256 value=\"4f5c609af0b2cf4ed4b292322a456b5345d2452a936cca1738ee6057b758b963\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer\" version=\"31.9.2\">\n         <artifact name=\"android-test-plugin-host-apk-installer-31.9.2.jar\">\n            <sha256 value=\"04d054e72dfde50be7f7756c4a5fded215b4d25f00b04ef19d2f2f4fd77211b6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-31.9.2.module\">\n            <sha256 value=\"262d7f10caa6a04460e380fb7cf0879832f634ba785791594f0adcd301a8c959\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer-proto\" version=\"31.10.0\">\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.10.0.jar\">\n            <sha256 value=\"45705d61b21006e8533e6cf8ab7958a7de6decace68ed6c09db8ade1216d859c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.10.0.pom\">\n            <sha256 value=\"bb041d9a79c436841b76b51518585c3959ec801ba1309d79a1dde1639c7e37cc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer-proto\" version=\"31.4.1\">\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.4.1.jar\">\n            <sha256 value=\"ced49aca4031aa2c57b51d3909ba815082e563c1d9a246bc23ede973782524f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.4.1.pom\">\n            <sha256 value=\"8f372d89f4724acb3106a8453b43894149287af94b4ca8c39dfe5cc331458066\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer-proto\" version=\"31.4.2\">\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.4.2.jar\">\n            <sha256 value=\"ced49aca4031aa2c57b51d3909ba815082e563c1d9a246bc23ede973782524f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.4.2.pom\">\n            <sha256 value=\"ff4127a1c8b7f55cdd12382c059ca2465317d98c126b1c20a8029eb3ed37dfa5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer-proto\" version=\"31.5.0\">\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.5.0.jar\">\n            <sha256 value=\"ced49aca4031aa2c57b51d3909ba815082e563c1d9a246bc23ede973782524f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.5.0.pom\">\n            <sha256 value=\"8a393c468956f56114b960c0601304684cf5728ab032b7cfbb7b9969e6f5de79\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer-proto\" version=\"31.5.1\">\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.5.1.jar\">\n            <sha256 value=\"ced49aca4031aa2c57b51d3909ba815082e563c1d9a246bc23ede973782524f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.5.1.pom\">\n            <sha256 value=\"c7b8975cddde4ad281d8a109ba373368d2aefbc2e60567bce4c1b4e0765fbc69\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer-proto\" version=\"31.5.2\">\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.5.2.jar\">\n            <sha256 value=\"ced49aca4031aa2c57b51d3909ba815082e563c1d9a246bc23ede973782524f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.5.2.pom\">\n            <sha256 value=\"c58f9be8b362d21b879868979ef637d6ce685a2a994b7ab7b127da3ad6b19e9c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer-proto\" version=\"31.6.0\">\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.6.0.jar\">\n            <sha256 value=\"543eb6c8d72b2ed7451f8e939d5d80890566f14bc26b7df9c8347506b258d7ae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.6.0.pom\">\n            <sha256 value=\"efdf535389587444a173a81d130a935910c1c1ff7a7787396095c2f26ea2ff08\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer-proto\" version=\"31.6.1\">\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.6.1.jar\">\n            <sha256 value=\"543eb6c8d72b2ed7451f8e939d5d80890566f14bc26b7df9c8347506b258d7ae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.6.1.pom\">\n            <sha256 value=\"efbd472878023e15d9cd936522d874dc5fd49be314212700f6b17a05817117c1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer-proto\" version=\"31.7.0\">\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.7.0.jar\">\n            <sha256 value=\"543eb6c8d72b2ed7451f8e939d5d80890566f14bc26b7df9c8347506b258d7ae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.7.0.pom\">\n            <sha256 value=\"dd28430b6e882f5cd8546e15de9b8c8c0ce4c2854b83cc4b0313828fff58688c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer-proto\" version=\"31.7.1\">\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.7.1.jar\">\n            <sha256 value=\"543eb6c8d72b2ed7451f8e939d5d80890566f14bc26b7df9c8347506b258d7ae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.7.1.pom\">\n            <sha256 value=\"664bb59bccbd7f868650896484c9255109cceea9edfc4899519827ed05437686\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer-proto\" version=\"31.7.2\">\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.7.2.jar\">\n            <sha256 value=\"543eb6c8d72b2ed7451f8e939d5d80890566f14bc26b7df9c8347506b258d7ae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.7.2.pom\">\n            <sha256 value=\"5a3edacf45a80edbac7462d5c2ba0f7222953b8111f67697cce8151f7f623fb1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer-proto\" version=\"31.7.3\">\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.7.3.jar\">\n            <sha256 value=\"543eb6c8d72b2ed7451f8e939d5d80890566f14bc26b7df9c8347506b258d7ae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.7.3.pom\">\n            <sha256 value=\"0b8d1ed982e7ab36e958a63bc975e5b31a98f6c6ba6f92fcafc22c692bb4a08f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer-proto\" version=\"31.8.0\">\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.8.0.jar\">\n            <sha256 value=\"543eb6c8d72b2ed7451f8e939d5d80890566f14bc26b7df9c8347506b258d7ae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.8.0.pom\">\n            <sha256 value=\"8e4207864959f56dc54f6e54b6dda9fea60db369ace119c965a6cff07935312b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer-proto\" version=\"31.8.1\">\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.8.1.jar\">\n            <sha256 value=\"543eb6c8d72b2ed7451f8e939d5d80890566f14bc26b7df9c8347506b258d7ae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.8.1.pom\">\n            <sha256 value=\"e9f9f0413001db9bfaac0252246a79c35e21d8bc5db5ac4bba63f0c671597a74\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer-proto\" version=\"31.8.2\">\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.8.2.jar\">\n            <sha256 value=\"543eb6c8d72b2ed7451f8e939d5d80890566f14bc26b7df9c8347506b258d7ae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.8.2.pom\">\n            <sha256 value=\"b8004c5b5802223dfa54f7ca5164f0b49bfd3143fa6a3b3f5cebf0f72aef6ec6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer-proto\" version=\"31.9.0\">\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.9.0.jar\">\n            <sha256 value=\"45705d61b21006e8533e6cf8ab7958a7de6decace68ed6c09db8ade1216d859c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.9.0.pom\">\n            <sha256 value=\"7e8363a92e0e41027acfce83aeef004c4a34ea9ccf09243ed17bad46618b0b55\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer-proto\" version=\"31.9.1\">\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.9.1.jar\">\n            <sha256 value=\"45705d61b21006e8533e6cf8ab7958a7de6decace68ed6c09db8ade1216d859c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.9.1.pom\">\n            <sha256 value=\"653321ba253b264ebb92d25db4ada3f7037ab49ba05e5b90af24482af8057035\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-apk-installer-proto\" version=\"31.9.2\">\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.9.2.jar\">\n            <sha256 value=\"45705d61b21006e8533e6cf8ab7958a7de6decace68ed6c09db8ade1216d859c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-apk-installer-proto-31.9.2.pom\">\n            <sha256 value=\"024701499398b9801de94ce739dcabe9bc284555869829ec3d8ca3f73765df93\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage\" version=\"31.10.0\">\n         <artifact name=\"android-test-plugin-host-coverage-31.10.0.jar\">\n            <sha256 value=\"397dd082b8a87caf83a3d5be28e8fa12348799ded2aa9e6063bfc7ea09f27ce2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-31.10.0.module\">\n            <sha256 value=\"6de2cbbc096e0e1409c9062ae081bdb43efb67462eaa0488ce46a0d8d86a385e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage\" version=\"31.4.1\">\n         <artifact name=\"android-test-plugin-host-coverage-31.4.1.jar\">\n            <sha256 value=\"0603d01e9ce8930dd76bbc9c7d0188b65a5e6407547828be00b347add2bf44d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-31.4.1.module\">\n            <sha256 value=\"782a0ba6b54b15bcd722551bd9c54b4b96b883388447141da5ad9ca434ffcb0b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage\" version=\"31.4.2\">\n         <artifact name=\"android-test-plugin-host-coverage-31.4.2.jar\">\n            <sha256 value=\"350b55eb82483861aa26ddd108735470b179c5ebd22885303d442c15eeb57b4f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-31.4.2.module\">\n            <sha256 value=\"56de4ebe47ce66ab45188099725b1f3fdf76844331143ad172245a64266c4c06\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage\" version=\"31.5.0\">\n         <artifact name=\"android-test-plugin-host-coverage-31.5.0.jar\">\n            <sha256 value=\"51c42f5a647f2e21ecb0abe022a31e13c38a0a0564727bfe3b9a17ec90603efa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-31.5.0.module\">\n            <sha256 value=\"ff23ac9e7cb06abfaac72cbdf49d88b11673a9957015e6906062e265b1f80897\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage\" version=\"31.5.1\">\n         <artifact name=\"android-test-plugin-host-coverage-31.5.1.jar\">\n            <sha256 value=\"1f7c90737e055923085173cd27834300a2f64cdf06401bcd1f5c12ccd48dea58\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-31.5.1.module\">\n            <sha256 value=\"af924c063347295c53ef67c8522b34b0d18a8d3af966659fd68f227cdeef5629\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage\" version=\"31.5.2\">\n         <artifact name=\"android-test-plugin-host-coverage-31.5.2.jar\">\n            <sha256 value=\"6b8c2dacddf0382599d61d8fdc36d115830687ca15179ba3627dce0bd911d14d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-31.5.2.module\">\n            <sha256 value=\"868354bea7a5a8f10242b4a9f72ff3249838e1912e00a8e0eb5344ce5cf0e9e7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage\" version=\"31.6.0\">\n         <artifact name=\"android-test-plugin-host-coverage-31.6.0.jar\">\n            <sha256 value=\"838309dd8950b2a8e8f9f5f4e1aa96bb2cbd3af8291036b6c2618bae6100a711\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-31.6.0.module\">\n            <sha256 value=\"e837f3501a7f4c621b4767f6ea3a41aa8f997a1ae4d6c42f54d2cab2fb3a8317\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage\" version=\"31.6.1\">\n         <artifact name=\"android-test-plugin-host-coverage-31.6.1.jar\">\n            <sha256 value=\"55f1467879ff32fa8d6631faf3246d0d998a8abd81e6b08444a8564c3ea0107f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-31.6.1.module\">\n            <sha256 value=\"173b0d06e573658fefc6f0628bde2b5570c4341876a7686f6b2e4247837e70b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage\" version=\"31.7.0\">\n         <artifact name=\"android-test-plugin-host-coverage-31.7.0.jar\">\n            <sha256 value=\"af458146eb53b346f6802f46bcea41be322738c020116a9e3edba8c774ddc12f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-31.7.0.module\">\n            <sha256 value=\"d3878dca2a624923e3b5a750a668d2f247c565aa88e4e1ea268099115122d016\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage\" version=\"31.7.1\">\n         <artifact name=\"android-test-plugin-host-coverage-31.7.1.jar\">\n            <sha256 value=\"95fb8c181178b413479979f72e4291513680d9e94c67f25b1170d5973b0462a2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-31.7.1.module\">\n            <sha256 value=\"1d9c2de90d0b5af9ac010bf5393a6a211b31bba510015ac1313fdc6d1015d815\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage\" version=\"31.7.2\">\n         <artifact name=\"android-test-plugin-host-coverage-31.7.2.jar\">\n            <sha256 value=\"6cb63c4a785c9620a5bfd5abd6f578d2b0fbfc7373abc8e10a91654d44973a67\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-31.7.2.module\">\n            <sha256 value=\"135fdd1a19aa86a5d1baae8082acdc4de7ac9912192d0d8393dc6de929621fe7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage\" version=\"31.7.3\">\n         <artifact name=\"android-test-plugin-host-coverage-31.7.3.jar\">\n            <sha256 value=\"a8fe3c4bb51374feee9b0f4d6f3009ed60dafa669c7308da6b18633b22129855\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-31.7.3.module\">\n            <sha256 value=\"0a3b47413c14c9e82256665acdaccd32e1bcd584de563340a474f4b231f66595\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage\" version=\"31.8.0\">\n         <artifact name=\"android-test-plugin-host-coverage-31.8.0.jar\">\n            <sha256 value=\"532c1fd2dec289ded63725b21c73c65b74eee2e86554840accaee75c01244193\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-31.8.0.module\">\n            <sha256 value=\"10461573a3437122216831cb3de64827d99a4a093d9b7f26ba12a963838a5386\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage\" version=\"31.8.1\">\n         <artifact name=\"android-test-plugin-host-coverage-31.8.1.jar\">\n            <sha256 value=\"cb157e5b1cd9df597d774b6dd3d2d47de934376f9cb404574990f9cf37b62278\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-31.8.1.module\">\n            <sha256 value=\"a30fb59173daebc1c8967ce4e3d1368b537043c1f8b609913827c8a6840e0da9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage\" version=\"31.8.2\">\n         <artifact name=\"android-test-plugin-host-coverage-31.8.2.jar\">\n            <sha256 value=\"7bc5746dc13d3e4a7a5da9a04f5c30a5082380356c351332f7f80914baa4340e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-31.8.2.module\">\n            <sha256 value=\"f0b98232fa18791b84aff8f680ff4c81f171675d049d9f385d669a132f8d4002\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage\" version=\"31.9.0\">\n         <artifact name=\"android-test-plugin-host-coverage-31.9.0.jar\">\n            <sha256 value=\"4b28c119db92efd80aedc4762a4ea9d1b3e4880a5ded3036fc92035ed8684253\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-31.9.0.module\">\n            <sha256 value=\"d2f71e900b9a9eb218ad17ba6452a214d2b7bd91fa650c06a3e7c63d9a7ad0f8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage\" version=\"31.9.1\">\n         <artifact name=\"android-test-plugin-host-coverage-31.9.1.jar\">\n            <sha256 value=\"ae32d1a3d3bf14c7a9cdc4bc723ac950748579da1d58ce6be22a3ed8caf5d932\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-31.9.1.module\">\n            <sha256 value=\"a41608afae7a2170f487d2fcb960c190506f08b23b3f6e36a1ed3842646551e8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage\" version=\"31.9.2\">\n         <artifact name=\"android-test-plugin-host-coverage-31.9.2.jar\">\n            <sha256 value=\"9b8917cd8e203075d02259df83fb56f93cce42859342654a1a1f4784875ca51b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-31.9.2.module\">\n            <sha256 value=\"07e5ed6415133759726768d1f69272c4ad185ef58b603f00b94c3290159e78fb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage-proto\" version=\"31.10.0\">\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.10.0.jar\">\n            <sha256 value=\"fa86719a3dc5de465f7e0c023184414c27f8fd53a34fd557289c0bf6df340244\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.10.0.pom\">\n            <sha256 value=\"076c2e5725abde9fd26ae191a5a4c76709e7d005f37ecccfcb064d178e8677e5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage-proto\" version=\"31.4.1\">\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.4.1.jar\">\n            <sha256 value=\"efb4d7014aaa7355246a07c2e437a2231fb252540ff1bce6872c88dc8da89d12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.4.1.pom\">\n            <sha256 value=\"f65a8e9c78e8cafb1604c4cfcd27935fce783c2d4325a314e5faef8942f1a46b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage-proto\" version=\"31.4.2\">\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.4.2.jar\">\n            <sha256 value=\"efb4d7014aaa7355246a07c2e437a2231fb252540ff1bce6872c88dc8da89d12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.4.2.pom\">\n            <sha256 value=\"9669d2ca886a05726cd7fbb908224457758156ea51f04c9725fcbc0a5f49656d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage-proto\" version=\"31.5.0\">\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.5.0.jar\">\n            <sha256 value=\"efb4d7014aaa7355246a07c2e437a2231fb252540ff1bce6872c88dc8da89d12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.5.0.pom\">\n            <sha256 value=\"d48104242b3cc77db79b05b1461a1fee066d4ae310793c70f32a4a6e228fd6da\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage-proto\" version=\"31.5.1\">\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.5.1.jar\">\n            <sha256 value=\"efb4d7014aaa7355246a07c2e437a2231fb252540ff1bce6872c88dc8da89d12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.5.1.pom\">\n            <sha256 value=\"baede4b0758d0f50cd5b0419bd76973f7754e516ae790a0fd4e56fd22bf3f51f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage-proto\" version=\"31.5.2\">\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.5.2.jar\">\n            <sha256 value=\"efb4d7014aaa7355246a07c2e437a2231fb252540ff1bce6872c88dc8da89d12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.5.2.pom\">\n            <sha256 value=\"74004edd6d800a2365bbcf98e0351acf0761d172082049be16a151169c2ebdd5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage-proto\" version=\"31.6.0\">\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.6.0.jar\">\n            <sha256 value=\"efb4d7014aaa7355246a07c2e437a2231fb252540ff1bce6872c88dc8da89d12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.6.0.pom\">\n            <sha256 value=\"f788d968d86100acbd0c694f5b30fed0326815ace69cdc00a379c8499789a79f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage-proto\" version=\"31.6.1\">\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.6.1.jar\">\n            <sha256 value=\"efb4d7014aaa7355246a07c2e437a2231fb252540ff1bce6872c88dc8da89d12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.6.1.pom\">\n            <sha256 value=\"a2bc70b161bc1b307772ba925ce32544a47539fde04a709b32088560abe9bed6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage-proto\" version=\"31.7.0\">\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.7.0.jar\">\n            <sha256 value=\"efb4d7014aaa7355246a07c2e437a2231fb252540ff1bce6872c88dc8da89d12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.7.0.pom\">\n            <sha256 value=\"2abfbd2f52e4a0bc561b3636f4952667bcd2b1e68d5b74b8f9e7039e8802cc7e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage-proto\" version=\"31.7.1\">\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.7.1.jar\">\n            <sha256 value=\"efb4d7014aaa7355246a07c2e437a2231fb252540ff1bce6872c88dc8da89d12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.7.1.pom\">\n            <sha256 value=\"83040168c021baf57944f0bc7ff7d18f3978441cd0df06c01087878ee298d339\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage-proto\" version=\"31.7.2\">\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.7.2.jar\">\n            <sha256 value=\"efb4d7014aaa7355246a07c2e437a2231fb252540ff1bce6872c88dc8da89d12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.7.2.pom\">\n            <sha256 value=\"cfde5cd9b5e8f5485aeddf04c55573c0f745bd1874c090d675bead557f2b02e4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage-proto\" version=\"31.7.3\">\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.7.3.jar\">\n            <sha256 value=\"efb4d7014aaa7355246a07c2e437a2231fb252540ff1bce6872c88dc8da89d12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.7.3.pom\">\n            <sha256 value=\"4ddcc6b6df4c92071035ae13f980e05f9bd2e6e3b6cc053e09e70b1d5373b1b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage-proto\" version=\"31.8.0\">\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.8.0.jar\">\n            <sha256 value=\"efb4d7014aaa7355246a07c2e437a2231fb252540ff1bce6872c88dc8da89d12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.8.0.pom\">\n            <sha256 value=\"0f42d5fbec1bcca8ddf1dd3c335c56b798c5d2575c834bbceed11920dbb067e7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage-proto\" version=\"31.8.1\">\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.8.1.jar\">\n            <sha256 value=\"efb4d7014aaa7355246a07c2e437a2231fb252540ff1bce6872c88dc8da89d12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.8.1.pom\">\n            <sha256 value=\"1b1edb05f6ae8a080208bf930ef68290ea9607518b2847dcec9f5e6dbedd1091\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage-proto\" version=\"31.8.2\">\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.8.2.jar\">\n            <sha256 value=\"efb4d7014aaa7355246a07c2e437a2231fb252540ff1bce6872c88dc8da89d12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.8.2.pom\">\n            <sha256 value=\"d24ce1f2f7c2ec64862e4e7af1f9b1b4e1e0f5d082cbef1befb37b277cf429ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage-proto\" version=\"31.9.0\">\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.9.0.jar\">\n            <sha256 value=\"fa86719a3dc5de465f7e0c023184414c27f8fd53a34fd557289c0bf6df340244\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.9.0.pom\">\n            <sha256 value=\"d14d1d40b4bb2f73214a55fdb897c2ac22c789630ea58969cadf81845027de7b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage-proto\" version=\"31.9.1\">\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.9.1.jar\">\n            <sha256 value=\"fa86719a3dc5de465f7e0c023184414c27f8fd53a34fd557289c0bf6df340244\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.9.1.pom\">\n            <sha256 value=\"9b9af28a7249494803c0f5d60d159cbe40bad50cdede3cff19b66ced64e5f070\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-coverage-proto\" version=\"31.9.2\">\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.9.2.jar\">\n            <sha256 value=\"fa86719a3dc5de465f7e0c023184414c27f8fd53a34fd557289c0bf6df340244\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-coverage-proto-31.9.2.pom\">\n            <sha256 value=\"4cce377fa23d85080ef6649a013a608d854a5393ec8f90b60b3190d2f6345db0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info\" version=\"31.10.0\">\n         <artifact name=\"android-test-plugin-host-device-info-31.10.0.jar\">\n            <sha256 value=\"4f784fe202e51a72156ed9b39b6e4602049029bd32aaf66f431f0d379b4ffc08\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-31.10.0.module\">\n            <sha256 value=\"81261b4d86e42eded450976a2d1624e050ea8aae1ce43aaff1676c46753ab1c7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info\" version=\"31.4.1\">\n         <artifact name=\"android-test-plugin-host-device-info-31.4.1.jar\">\n            <sha256 value=\"88e393ac6ddafd872be2723a9a435995b01a1d5df0cdea0c235850e6fd42c2d6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-31.4.1.module\">\n            <sha256 value=\"41119635a2e245c58b048c53c810fb43503576b4cc9cfa91ca807c8507b3b2a6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info\" version=\"31.4.2\">\n         <artifact name=\"android-test-plugin-host-device-info-31.4.2.jar\">\n            <sha256 value=\"9d63e4c7dbd7b0946e8583ea45e21e77ae25e322210217a1c5adc94ff7ce3ee3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-31.4.2.module\">\n            <sha256 value=\"3c77e4a76fe704ac74fb2525c225f73d59cd48afb721cb08c728aebcaae41254\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info\" version=\"31.5.0\">\n         <artifact name=\"android-test-plugin-host-device-info-31.5.0.jar\">\n            <sha256 value=\"bae03af4164b43c3b88ca78bbaa25f86a89e9950da0cf54c3ff0b9596d2176f2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-31.5.0.module\">\n            <sha256 value=\"39ea357e85a3a3045f13e4d3609b886481bb6015fbcd3b87b59079d8485b70fc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info\" version=\"31.5.1\">\n         <artifact name=\"android-test-plugin-host-device-info-31.5.1.jar\">\n            <sha256 value=\"ff9204af5097ecef9db701e7f24a7ef31cd861218b5f916c399ad2d93a87d9a6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-31.5.1.module\">\n            <sha256 value=\"a3bc86a6a6d56699cbb751e67842543bf3c7315f8e9541ffcf6dbae3dc899acb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info\" version=\"31.5.2\">\n         <artifact name=\"android-test-plugin-host-device-info-31.5.2.jar\">\n            <sha256 value=\"ff9a0c07845494a3a2847a30de48cab3dc79c2191be3c7376ca401e2feb93a24\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-31.5.2.module\">\n            <sha256 value=\"997bd8a5766d8f9dd46958daf281e7f3ca192a141c5cd2b64baa53c06a63200f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info\" version=\"31.6.0\">\n         <artifact name=\"android-test-plugin-host-device-info-31.6.0.jar\">\n            <sha256 value=\"50429a9d8e7051c2006038359b921dbb188d88b2318c6f643347bafab38e49b1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-31.6.0.module\">\n            <sha256 value=\"79fe3d1f3548fa73b3fe3f664fa94a1a0fcb8f7857d48764ab4262e5d498c6f2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info\" version=\"31.6.1\">\n         <artifact name=\"android-test-plugin-host-device-info-31.6.1.jar\">\n            <sha256 value=\"76bdd8d0b26ecc159729b8962b506dbf7465f11edf8d90e8755748232e5cf48b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-31.6.1.module\">\n            <sha256 value=\"99ba45e34bcbbc0a2cad910b06f3af430104276da3c7b6aa4a6d575f99df601e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info\" version=\"31.7.0\">\n         <artifact name=\"android-test-plugin-host-device-info-31.7.0.jar\">\n            <sha256 value=\"3933808185d5786b25186e1749f0cfb9125f980794b0e89b80c241eb90794cff\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-31.7.0.module\">\n            <sha256 value=\"baeb5c3e23a5723695b0985afcb028a30c2717a3113e191a2cb6c74f2d5a8ebc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info\" version=\"31.7.1\">\n         <artifact name=\"android-test-plugin-host-device-info-31.7.1.jar\">\n            <sha256 value=\"3f70d37d5e852c1422e0b3c2de61b7c88e99eaff1b0ca90e94d3abe96af48702\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-31.7.1.module\">\n            <sha256 value=\"2610b367ec6c97e4df2a3708326ce3bfecfab12a6d35c714d37442aff829c95a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info\" version=\"31.7.2\">\n         <artifact name=\"android-test-plugin-host-device-info-31.7.2.jar\">\n            <sha256 value=\"dd1f08c066607a1245787d439461cf8d4548411e0df8a36cee5e3deb767d7574\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-31.7.2.module\">\n            <sha256 value=\"cb148fb815ad1c0e95fc43cceaef418451fcd6e350b726e020be37e038e20dc7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info\" version=\"31.7.3\">\n         <artifact name=\"android-test-plugin-host-device-info-31.7.3.jar\">\n            <sha256 value=\"aae7600061eefd5fc5217278b00db9b2fd75005ccd64f6f19cdcb2523bc8ebc5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-31.7.3.module\">\n            <sha256 value=\"a770fb4a0fdb06f2309b12b3fa9470a8f20cd8c93914824b7cad1c96b86162ae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info\" version=\"31.8.0\">\n         <artifact name=\"android-test-plugin-host-device-info-31.8.0.jar\">\n            <sha256 value=\"55984fad708e9a401672c5d93a450cdaf0c357079c5c72817ff41c1c8381fb11\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-31.8.0.module\">\n            <sha256 value=\"862ae0e528dde0d124ede3c3d00824f7cd4bd58d2280c2b87ca525656c66cf4e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info\" version=\"31.8.1\">\n         <artifact name=\"android-test-plugin-host-device-info-31.8.1.jar\">\n            <sha256 value=\"44be9bd59c8fe3293494b110042eda9b14faf92a6a2c794253993183ad3cd26f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-31.8.1.module\">\n            <sha256 value=\"f74195e539dd65b517fce5ec82619cf7785650a7ab786df82d77843ee31affaf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info\" version=\"31.8.2\">\n         <artifact name=\"android-test-plugin-host-device-info-31.8.2.jar\">\n            <sha256 value=\"c86832c4d81dabd07418991a03cae0e9f38ede55b2a6e1b41ccf54011f68774b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-31.8.2.module\">\n            <sha256 value=\"e0bc24a16a7c3ce07fdaac88ba9dfa664acc090fc657888388dd4856fe80a0de\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info\" version=\"31.9.0\">\n         <artifact name=\"android-test-plugin-host-device-info-31.9.0.jar\">\n            <sha256 value=\"262e1933e8ad9f6b09338c861bab05cbc0a7836e3ec99b9e4449c509538af3a9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-31.9.0.module\">\n            <sha256 value=\"c37d87f6c954dad6898556f4d5af219dac193f0bbda12b305c25b3342074725e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info\" version=\"31.9.1\">\n         <artifact name=\"android-test-plugin-host-device-info-31.9.1.jar\">\n            <sha256 value=\"f52ac0274fb89939c1f5b1345dd1016c640b3c606dac4c358521fb8795558f29\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-31.9.1.module\">\n            <sha256 value=\"0f7879e2218a164355f00a3c175c8487f8ec985317a9b3da25271f3f2562c573\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info\" version=\"31.9.2\">\n         <artifact name=\"android-test-plugin-host-device-info-31.9.2.jar\">\n            <sha256 value=\"5bbc19d7cc3d92bdad8a2a1de4b6baa6d2cc6be18b259c6451da0f141d878240\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-31.9.2.module\">\n            <sha256 value=\"fa45cb171853f92ed77b761d93934dc85ccd669b15e068517fafea7189c8c077\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info-proto\" version=\"31.10.0\">\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.10.0.jar\">\n            <sha256 value=\"9683ac7648a7a41be9a1349f6981592944f627164898c3c8925a0beede8bb8bb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.10.0.pom\">\n            <sha256 value=\"5886a71c2f9bbd278ed51d6346ae2a5eaa21e37792dbd8b614962ab498bd2430\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info-proto\" version=\"31.4.1\">\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.4.1.jar\">\n            <sha256 value=\"4f5eccc1d47a981b3ff120e98a3de0988214108fe9dc7b068e95a6b686ada495\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.4.1.pom\">\n            <sha256 value=\"34df6c7afeaa0a951d0063c8a28b2122c52ab806c5c46a2a5b22993b62d0a0d3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info-proto\" version=\"31.4.2\">\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.4.2.jar\">\n            <sha256 value=\"4f5eccc1d47a981b3ff120e98a3de0988214108fe9dc7b068e95a6b686ada495\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.4.2.pom\">\n            <sha256 value=\"ad70c321107d1b6f4f59f31dfbc5d479621529821369eddf0481382be6f11057\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info-proto\" version=\"31.5.0\">\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.5.0.jar\">\n            <sha256 value=\"4f5eccc1d47a981b3ff120e98a3de0988214108fe9dc7b068e95a6b686ada495\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.5.0.pom\">\n            <sha256 value=\"859966cfca921409251c4f9ec9ad0b3b67fafdf6ed3a0bd278fff6fc4ab8552c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info-proto\" version=\"31.5.1\">\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.5.1.jar\">\n            <sha256 value=\"4f5eccc1d47a981b3ff120e98a3de0988214108fe9dc7b068e95a6b686ada495\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.5.1.pom\">\n            <sha256 value=\"6ff54e6adcd2432821d9c9a91dc8a77c35d4e277476db54fa3382b58e64823fa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info-proto\" version=\"31.5.2\">\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.5.2.jar\">\n            <sha256 value=\"4f5eccc1d47a981b3ff120e98a3de0988214108fe9dc7b068e95a6b686ada495\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.5.2.pom\">\n            <sha256 value=\"8e748ae11ecbfde970c1ee5f489f956d6b35133befb523aea5b75dec02600041\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info-proto\" version=\"31.6.0\">\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.6.0.jar\">\n            <sha256 value=\"4f5eccc1d47a981b3ff120e98a3de0988214108fe9dc7b068e95a6b686ada495\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.6.0.pom\">\n            <sha256 value=\"c85e5c42f11443dc5934f39e0dab629102d7cfcd4df6fc2dc082e852bfa4cc8f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info-proto\" version=\"31.6.1\">\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.6.1.jar\">\n            <sha256 value=\"4f5eccc1d47a981b3ff120e98a3de0988214108fe9dc7b068e95a6b686ada495\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.6.1.pom\">\n            <sha256 value=\"7467b180e83eb90a2781aa0b0ea90b030a4afed8c3798b7265645fc9718cfde1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info-proto\" version=\"31.7.0\">\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.7.0.jar\">\n            <sha256 value=\"4f5eccc1d47a981b3ff120e98a3de0988214108fe9dc7b068e95a6b686ada495\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.7.0.pom\">\n            <sha256 value=\"aaccb2bdb4915bc06270e6349aa4e24ad8827ac3448566c6990ab2151bb905e5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info-proto\" version=\"31.7.1\">\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.7.1.jar\">\n            <sha256 value=\"4f5eccc1d47a981b3ff120e98a3de0988214108fe9dc7b068e95a6b686ada495\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.7.1.pom\">\n            <sha256 value=\"cdbce0cf02f2aa59ac894655212ac9998a9f6e264605f5a61770e0f7da016e5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info-proto\" version=\"31.7.2\">\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.7.2.jar\">\n            <sha256 value=\"4f5eccc1d47a981b3ff120e98a3de0988214108fe9dc7b068e95a6b686ada495\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.7.2.pom\">\n            <sha256 value=\"74e0bffe4cbe25c7c288c1b04be6c043ae25c361a703a2d89df0c70c5212eb6d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info-proto\" version=\"31.7.3\">\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.7.3.jar\">\n            <sha256 value=\"4f5eccc1d47a981b3ff120e98a3de0988214108fe9dc7b068e95a6b686ada495\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.7.3.pom\">\n            <sha256 value=\"8e8b5a5e08d5857452073a0e3395eb33ad5e021c5f1fb76c0a95e318b0dd948b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info-proto\" version=\"31.8.0\">\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.8.0.jar\">\n            <sha256 value=\"4f5eccc1d47a981b3ff120e98a3de0988214108fe9dc7b068e95a6b686ada495\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.8.0.pom\">\n            <sha256 value=\"92f93ccfd092b22d327d49c6a1ff3b11068acba86f4987b536471dd061415b1c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info-proto\" version=\"31.8.1\">\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.8.1.jar\">\n            <sha256 value=\"4f5eccc1d47a981b3ff120e98a3de0988214108fe9dc7b068e95a6b686ada495\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.8.1.pom\">\n            <sha256 value=\"8c1d33a8998c2825c703cddbc90529d380195e10746eb262ea5f678e3b675818\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info-proto\" version=\"31.8.2\">\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.8.2.jar\">\n            <sha256 value=\"4f5eccc1d47a981b3ff120e98a3de0988214108fe9dc7b068e95a6b686ada495\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.8.2.pom\">\n            <sha256 value=\"e6b96c908d478a214294cb0ab51c809dc3c17dd75183497673996b23bc0deb72\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info-proto\" version=\"31.9.0\">\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.9.0.jar\">\n            <sha256 value=\"9683ac7648a7a41be9a1349f6981592944f627164898c3c8925a0beede8bb8bb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.9.0.pom\">\n            <sha256 value=\"dc280762cf6734b0d3f667effc1391e2e7d54951ed9ffde18f0fc7f3d3a575e8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info-proto\" version=\"31.9.1\">\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.9.1.jar\">\n            <sha256 value=\"9683ac7648a7a41be9a1349f6981592944f627164898c3c8925a0beede8bb8bb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.9.1.pom\">\n            <sha256 value=\"cb116d2b357a95ac8c1f8d354fc15346ffc7ccf54a88d898fd299131ebd59be0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-device-info-proto\" version=\"31.9.2\">\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.9.2.jar\">\n            <sha256 value=\"9683ac7648a7a41be9a1349f6981592944f627164898c3c8925a0beede8bb8bb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-device-info-proto-31.9.2.pom\">\n            <sha256 value=\"3e2d5d13e5fd163e24b0bef3ce86e688243032d74b3e104d9b606c4afc737e51\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control\" version=\"31.10.0\">\n         <artifact name=\"android-test-plugin-host-emulator-control-31.10.0.jar\">\n            <sha256 value=\"15d7eee27815c3342c34905c4c98b833aa4af3092f394949b8c9401ddebc6f9b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-31.10.0.module\">\n            <sha256 value=\"fe995911500e832335a76d560f1e742ec5ebd72b3645c965554539ddd3743b7b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control\" version=\"31.4.1\">\n         <artifact name=\"android-test-plugin-host-emulator-control-31.4.1.jar\">\n            <sha256 value=\"3ef68c87cee8b53e8eb94a09726861877c244159de8582b5819856f070b87185\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-31.4.1.module\">\n            <sha256 value=\"09135470b1da10b8a7ea77ae090dea8cbff9bd59ab653e2080f72d570125bcd8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control\" version=\"31.4.2\">\n         <artifact name=\"android-test-plugin-host-emulator-control-31.4.2.jar\">\n            <sha256 value=\"42c97ac7ed16cc85e7449761c854da9cb2fad629ef7d6dc991bf525a1a588daa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-31.4.2.module\">\n            <sha256 value=\"606724c21d5508c3d7d05565951f304dddfefea46a308640e4e926cf206f9383\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control\" version=\"31.5.0\">\n         <artifact name=\"android-test-plugin-host-emulator-control-31.5.0.jar\">\n            <sha256 value=\"18861f80dd6c8ebd906c9ca666cb602153be5239a6999d36fbbf6c6e88df616c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-31.5.0.module\">\n            <sha256 value=\"fc1fcd63dd6aa2d922b540d4f0e08281548a3668b36e4c3a28ddc4e88cd26cf6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control\" version=\"31.5.1\">\n         <artifact name=\"android-test-plugin-host-emulator-control-31.5.1.jar\">\n            <sha256 value=\"fe44b5ead65050a9b92ccc8e28bc5f3784981f0554eb81ef2f14bc18b623271e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-31.5.1.module\">\n            <sha256 value=\"1eebce3b26abf8a52cb5e755cf0dbd92f282943b1e48a341b2e39c9f4b4b09cb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control\" version=\"31.5.2\">\n         <artifact name=\"android-test-plugin-host-emulator-control-31.5.2.jar\">\n            <sha256 value=\"03fece6267d7ad2081cdd7a3d612f2be95097266b85eeb1af3e68e26ddbec5fc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-31.5.2.module\">\n            <sha256 value=\"7510d58e3c583c483468c614b41c13faf60479b10bd6f8697620ebe39fa23420\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control\" version=\"31.6.0\">\n         <artifact name=\"android-test-plugin-host-emulator-control-31.6.0.jar\">\n            <sha256 value=\"fc1d7c8696390242cca93ec24494938542fe82eee75ce57046db46ead594b963\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-31.6.0.module\">\n            <sha256 value=\"74fd10bc7a853b1e0bc9611717e5e9ea9b6d11181e116d0055396d2279c7e061\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control\" version=\"31.6.1\">\n         <artifact name=\"android-test-plugin-host-emulator-control-31.6.1.jar\">\n            <sha256 value=\"96b825bb80355d96ef8a582ee60983a5ceee270a29a133ad8ab8096838f72e6d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-31.6.1.module\">\n            <sha256 value=\"7d6cb82d151c3de93245d87c1c217ef54ac76927d2e74a4ae327372c78b4b542\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control\" version=\"31.7.0\">\n         <artifact name=\"android-test-plugin-host-emulator-control-31.7.0.jar\">\n            <sha256 value=\"001820f86e281b6f06fab23108dfa7feeab3a04efc262ad219e68aa8e4e69f5b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-31.7.0.module\">\n            <sha256 value=\"8fe9904c1a1502c6474860874e25fb654aa47ec6eba52a931ff36499ed326d7a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control\" version=\"31.7.1\">\n         <artifact name=\"android-test-plugin-host-emulator-control-31.7.1.jar\">\n            <sha256 value=\"92344d7ea68d2138d815b32b5c1c040bde2af656e0ce85ec1acd437d1ba64c22\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-31.7.1.module\">\n            <sha256 value=\"3d0736aa6a4f76e1f2edc8267c4af6aa519f9bc446bb9ecdf707363a8f4808d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control\" version=\"31.7.2\">\n         <artifact name=\"android-test-plugin-host-emulator-control-31.7.2.jar\">\n            <sha256 value=\"1d9273c49b5eab23a099de4cfde37d61243000e05dc08ca336a1bf500d211e19\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-31.7.2.module\">\n            <sha256 value=\"d4d88ed7913cb8891b669dcd609729b3c6ac813025ade290907b66e0c44d9cbb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control\" version=\"31.7.3\">\n         <artifact name=\"android-test-plugin-host-emulator-control-31.7.3.jar\">\n            <sha256 value=\"e8879d8bc5ae580d90597f02b18abf492506414bf3fd6fd88df1b485309c644a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-31.7.3.module\">\n            <sha256 value=\"e8831575ce572d9c54f9d309017584719444c954133090e430b346a7d8b173b8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control\" version=\"31.8.0\">\n         <artifact name=\"android-test-plugin-host-emulator-control-31.8.0.jar\">\n            <sha256 value=\"fb9ed2f45e8db010976611e25664b381e77973bc4ebcbe3b0c69f7abeee37ed2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-31.8.0.module\">\n            <sha256 value=\"d95c97096f6816016bc730b4e0753ef523583288a33bb1734a4dd875859f201e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control\" version=\"31.8.1\">\n         <artifact name=\"android-test-plugin-host-emulator-control-31.8.1.jar\">\n            <sha256 value=\"78d6baf520e804dde6e1d07e528d14810c889ce60f058512e24d15bb3bfdcae1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-31.8.1.module\">\n            <sha256 value=\"ec2553942b1b8135a47c82f5da99b04076b8c6f40adfcb457942121e731cf6d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control\" version=\"31.8.2\">\n         <artifact name=\"android-test-plugin-host-emulator-control-31.8.2.jar\">\n            <sha256 value=\"87c8c3c3a1b1e678529ce2f2f009294cb93eaa6f8f3dc7edd71ac2fac4220e72\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-31.8.2.module\">\n            <sha256 value=\"5418c00b5a44c20872012629da01cb812853a6880f943f3e19306867d0174526\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control\" version=\"31.9.0\">\n         <artifact name=\"android-test-plugin-host-emulator-control-31.9.0.jar\">\n            <sha256 value=\"c81b540373ef5d1b3180704b211b10929a2e0b9f22fc8a9e2ecf90980ebea606\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-31.9.0.module\">\n            <sha256 value=\"a6099d839c2a514cd790baffe52f7b203677e8459fc431583c021453c79aadfb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control\" version=\"31.9.1\">\n         <artifact name=\"android-test-plugin-host-emulator-control-31.9.1.jar\">\n            <sha256 value=\"e09ee2aafb3e20ce4038e20d121384f6ec154d678163081f15fbc33dab56010b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-31.9.1.module\">\n            <sha256 value=\"1269c3991c294dcbab1183a755918302d8bab94bcdd27f7900e728f4f3a1f232\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control\" version=\"31.9.2\">\n         <artifact name=\"android-test-plugin-host-emulator-control-31.9.2.jar\">\n            <sha256 value=\"8e34f7fda8bb13c6f9650f5673f3dde9abc425a3063f9079cf0ffe051ad81b4c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-31.9.2.module\">\n            <sha256 value=\"d665f58edce5ccb3aa9d6d7488fafffc3316e4bda17f4907092598b659ff5bdf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control-proto\" version=\"31.10.0\">\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.10.0.jar\">\n            <sha256 value=\"a4f34aae0f9ffa026dbf7151436dd7ae53becb72622b40f2c479cac8943d9319\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.10.0.pom\">\n            <sha256 value=\"9449c6d0f25394728641e824421dc418544cdf7d9432e25649758e586b3de1cf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control-proto\" version=\"31.4.1\">\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.4.1.jar\">\n            <sha256 value=\"aedec5ec4627d898cccdf42d8038db20eba4495753c53d1b0b378734491caf5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.4.1.pom\">\n            <sha256 value=\"1fe77471ac5251e84f36305aa5412c6b1446f523e8d8e22d98231c697e531c8a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control-proto\" version=\"31.4.2\">\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.4.2.jar\">\n            <sha256 value=\"aedec5ec4627d898cccdf42d8038db20eba4495753c53d1b0b378734491caf5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.4.2.pom\">\n            <sha256 value=\"61df273d792b92c8cbd0e87f47418c94b558ccb0ea566e196e37a9aaffa6a44c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control-proto\" version=\"31.5.0\">\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.5.0.jar\">\n            <sha256 value=\"aedec5ec4627d898cccdf42d8038db20eba4495753c53d1b0b378734491caf5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.5.0.pom\">\n            <sha256 value=\"d924e3818ea908bdd071cfd4c1cc19e8a002fbd361bd252647a0e3ee58cb3b80\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control-proto\" version=\"31.5.1\">\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.5.1.jar\">\n            <sha256 value=\"aedec5ec4627d898cccdf42d8038db20eba4495753c53d1b0b378734491caf5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.5.1.pom\">\n            <sha256 value=\"40f89601fced9a0793f9384901df27ee6b0b2e2c66b49ead85f6b0293dc88aac\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control-proto\" version=\"31.5.2\">\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.5.2.jar\">\n            <sha256 value=\"aedec5ec4627d898cccdf42d8038db20eba4495753c53d1b0b378734491caf5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.5.2.pom\">\n            <sha256 value=\"5640718f1f8ea74c05d293fcbab2a4ccf7fba3800a4122786240c688703eae75\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control-proto\" version=\"31.6.0\">\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.6.0.jar\">\n            <sha256 value=\"aedec5ec4627d898cccdf42d8038db20eba4495753c53d1b0b378734491caf5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.6.0.pom\">\n            <sha256 value=\"11bd8598aaf56115a4b908db26c359764d167c7cd5ad4f82f6d7e2fb61421786\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control-proto\" version=\"31.6.1\">\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.6.1.jar\">\n            <sha256 value=\"aedec5ec4627d898cccdf42d8038db20eba4495753c53d1b0b378734491caf5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.6.1.pom\">\n            <sha256 value=\"b40a428b3a269ba224fb5a7a0d0d2cc18e531201550ee4755b1d7047893a990b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control-proto\" version=\"31.7.0\">\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.7.0.jar\">\n            <sha256 value=\"aedec5ec4627d898cccdf42d8038db20eba4495753c53d1b0b378734491caf5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.7.0.pom\">\n            <sha256 value=\"0a5572253f79d38de61226bd6f4ff68afe6427f200cc3b1d7eb1df97c23b8c84\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control-proto\" version=\"31.7.1\">\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.7.1.jar\">\n            <sha256 value=\"aedec5ec4627d898cccdf42d8038db20eba4495753c53d1b0b378734491caf5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.7.1.pom\">\n            <sha256 value=\"506cb336c47f3e48ca865648ac42f8a1b3245f4f30ad00c4744f1a1177ba0ab6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control-proto\" version=\"31.7.2\">\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.7.2.jar\">\n            <sha256 value=\"aedec5ec4627d898cccdf42d8038db20eba4495753c53d1b0b378734491caf5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.7.2.pom\">\n            <sha256 value=\"7b094c6b7b4c832788793358f3f810eedfa85a4291c428c6232604dd0df4c951\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control-proto\" version=\"31.7.3\">\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.7.3.jar\">\n            <sha256 value=\"aedec5ec4627d898cccdf42d8038db20eba4495753c53d1b0b378734491caf5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.7.3.pom\">\n            <sha256 value=\"a27b4bc63f2f73f7a5b5b5775d381083fadd1d20fbfee0712a7130b88349aedd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control-proto\" version=\"31.8.0\">\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.8.0.jar\">\n            <sha256 value=\"aedec5ec4627d898cccdf42d8038db20eba4495753c53d1b0b378734491caf5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.8.0.pom\">\n            <sha256 value=\"44bafbf8fecde91888b07bf948fa17960a4f12b2104d691e8263cc04c831cdf7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control-proto\" version=\"31.8.1\">\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.8.1.jar\">\n            <sha256 value=\"aedec5ec4627d898cccdf42d8038db20eba4495753c53d1b0b378734491caf5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.8.1.pom\">\n            <sha256 value=\"31e3a8ad787f64ac5ec51a67e085a9538f644e9ea08752e0d5a9491296d0ead5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control-proto\" version=\"31.8.2\">\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.8.2.jar\">\n            <sha256 value=\"aedec5ec4627d898cccdf42d8038db20eba4495753c53d1b0b378734491caf5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.8.2.pom\">\n            <sha256 value=\"f052b3da9f330b5a67d9ad66e0c320845f4477fbb9f2b2b0f4de5f0b887b61c8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control-proto\" version=\"31.9.0\">\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.9.0.jar\">\n            <sha256 value=\"a4f34aae0f9ffa026dbf7151436dd7ae53becb72622b40f2c479cac8943d9319\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.9.0.pom\">\n            <sha256 value=\"3161fdb5e953e8e2b7086ba12bd3171948b191b9f75d849c6b84de53d5feaacb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control-proto\" version=\"31.9.1\">\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.9.1.jar\">\n            <sha256 value=\"a4f34aae0f9ffa026dbf7151436dd7ae53becb72622b40f2c479cac8943d9319\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.9.1.pom\">\n            <sha256 value=\"b78379687451d1dabdc212a949346a8ce6a40966cf4e23ddb5e209e3e1569d7d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-emulator-control-proto\" version=\"31.9.2\">\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.9.2.jar\">\n            <sha256 value=\"a4f34aae0f9ffa026dbf7151436dd7ae53becb72622b40f2c479cac8943d9319\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-emulator-control-proto-31.9.2.pom\">\n            <sha256 value=\"4a291f96a0af6910acd6fb772c92d97df567937faa5bca4d989492a1f4b5b94c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat\" version=\"31.10.0\">\n         <artifact name=\"android-test-plugin-host-logcat-31.10.0.jar\">\n            <sha256 value=\"cce7675777111d167ec1fd6e287bc373eec83619d67905a0538220c7a1ecf603\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-31.10.0.module\">\n            <sha256 value=\"6573a82cc628aaefbdeabdd2d27ab1d2865f0016312548be849dd8090ef8daed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat\" version=\"31.4.1\">\n         <artifact name=\"android-test-plugin-host-logcat-31.4.1.jar\">\n            <sha256 value=\"80b634bcf76e50497704da7e2281a96d3725bdc657dfbe252edf3897c5990f76\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-31.4.1.module\">\n            <sha256 value=\"c5f17631357f930020cb550727a8967b3f055f0462a477c913e76cf7afb6afd4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat\" version=\"31.4.2\">\n         <artifact name=\"android-test-plugin-host-logcat-31.4.2.jar\">\n            <sha256 value=\"e8f3205fa00ffd79649f883f4488b95b23766baa06f4dc6f05fdbcfd7d230e2a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-31.4.2.module\">\n            <sha256 value=\"4e550a912d3b2e9f40bcdba399f040ad3a99b1a24ee006017d492e0663bfc9ba\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat\" version=\"31.5.0\">\n         <artifact name=\"android-test-plugin-host-logcat-31.5.0.jar\">\n            <sha256 value=\"d552a451a44613debf90993d0ca048cc0e2700145b0a79f53ff0ac343a0cd4dc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-31.5.0.module\">\n            <sha256 value=\"073fd9597841ad9d9d4feedb9e727182f00af5c1906e856b9165ef9b19c88ec5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat\" version=\"31.5.1\">\n         <artifact name=\"android-test-plugin-host-logcat-31.5.1.jar\">\n            <sha256 value=\"55f576bb88033797bc121ea3706fa83eb6cb8b88525fec1c029566f6b0c0b6d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-31.5.1.module\">\n            <sha256 value=\"e6ba9e0c6e17ffab21bac9c5b7c6e6d0fa8c9cb0d2d58f5a766061a4f0ad0e17\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat\" version=\"31.5.2\">\n         <artifact name=\"android-test-plugin-host-logcat-31.5.2.jar\">\n            <sha256 value=\"fb9a39212aaf135282a11581635708c54a425d41acd56cd0aceb572f787158fb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-31.5.2.module\">\n            <sha256 value=\"53998a2dd0465cc8df928392dad5ace544677d01277011719c0d42d2687d949e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat\" version=\"31.6.0\">\n         <artifact name=\"android-test-plugin-host-logcat-31.6.0.jar\">\n            <sha256 value=\"48e77d757aaeb4193b8702bd0e04081a77258f7212c6688a2181111179239ab9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-31.6.0.module\">\n            <sha256 value=\"24127b2f0f73fc06f7b2e1994e2e19850410acdf7a5d188fb6ca8fcd982d4bf8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat\" version=\"31.6.1\">\n         <artifact name=\"android-test-plugin-host-logcat-31.6.1.jar\">\n            <sha256 value=\"d6c8f75a0897106e52a7c65601f53d9b7ca09c7f1933a7ec514fb35e6ed5109d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-31.6.1.module\">\n            <sha256 value=\"bb9cacee8bfba1d18b62c9b65343ab60c48208e87613a8f3f39e481797724e52\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat\" version=\"31.7.0\">\n         <artifact name=\"android-test-plugin-host-logcat-31.7.0.jar\">\n            <sha256 value=\"a7b79ab2f55a9a470415532bb5d9095be4e207b543010c973db74d7c8ff3c46d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-31.7.0.module\">\n            <sha256 value=\"2a30e442a2b26a1aa066fdc804b156f5e3f69f2939e306957ac0b36973c11c20\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat\" version=\"31.7.1\">\n         <artifact name=\"android-test-plugin-host-logcat-31.7.1.jar\">\n            <sha256 value=\"deda83444606b461cb11b5537bff53770c93f4ebc99d0c8437d6e17404ac153b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-31.7.1.module\">\n            <sha256 value=\"0f680daa02b2c89eb4784f042fab913bcb0d981e73a51d800e9c9388d2be4d97\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat\" version=\"31.7.2\">\n         <artifact name=\"android-test-plugin-host-logcat-31.7.2.jar\">\n            <sha256 value=\"88e3042727a865ad9b39a39d9bc4ef54aacbf89cb136aa34ea5553e62c6384fa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-31.7.2.module\">\n            <sha256 value=\"cc460ad95496e85990050356fa02b9763fe307409cf7431d7fa641e22b77bfae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat\" version=\"31.7.3\">\n         <artifact name=\"android-test-plugin-host-logcat-31.7.3.jar\">\n            <sha256 value=\"a66b846fe457f32fca5ec2af5c5de4a4650290017f86859481bcd2ee441892d4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-31.7.3.module\">\n            <sha256 value=\"9eb3c05697d26b2985ff50a26ce8858cd338336e0dd28dd60d42e81eb8863550\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat\" version=\"31.8.0\">\n         <artifact name=\"android-test-plugin-host-logcat-31.8.0.jar\">\n            <sha256 value=\"33858bade586b43f1a1cd8e747a742633d500be911ec5932cb2770e81f3d9863\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-31.8.0.module\">\n            <sha256 value=\"375eaa5de982d496bea94f0a4143815820e06c30ca65e03065db2258f27fcad7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat\" version=\"31.8.1\">\n         <artifact name=\"android-test-plugin-host-logcat-31.8.1.jar\">\n            <sha256 value=\"d6f9a15155d8eee14a9122b284a867aee299ef49eb4d634a4b5c8a66870eebc9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-31.8.1.module\">\n            <sha256 value=\"ed8b85b024368fc0b8b32990569432699f0f05c63463413ab5ecf0f15222edc4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat\" version=\"31.8.2\">\n         <artifact name=\"android-test-plugin-host-logcat-31.8.2.jar\">\n            <sha256 value=\"b0ba9a55d435be21f9191c24d46d57fd24976abad9c660ea080d7e3664afc5ae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-31.8.2.module\">\n            <sha256 value=\"08c054ff43520c85881529027d7a8404931ca69871a81839df1f0040bfbee47f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat\" version=\"31.9.0\">\n         <artifact name=\"android-test-plugin-host-logcat-31.9.0.jar\">\n            <sha256 value=\"836d7f28f94e78faaebf0cb505c7e3565d1ecb0591d4c30b9c5423176ee22b3c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-31.9.0.module\">\n            <sha256 value=\"3b1675255c631b9480318d9d1521fa14f647fcbacf36823b5f1d5619c42d1ca1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat\" version=\"31.9.1\">\n         <artifact name=\"android-test-plugin-host-logcat-31.9.1.jar\">\n            <sha256 value=\"f805bf8829151fce245bffc634b6bd9e667810630317fcf701a27b1703789317\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-31.9.1.module\">\n            <sha256 value=\"92da1edfe2d3166c7b22f6933cad514dce99962ccc3bcb63f73add4821ee72ab\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat\" version=\"31.9.2\">\n         <artifact name=\"android-test-plugin-host-logcat-31.9.2.jar\">\n            <sha256 value=\"16e2d6e4df19307b35015d53c5ebc80a177cc5396624d9d3bea79c1435d7a912\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-31.9.2.module\">\n            <sha256 value=\"693085221b934d1a57f72075c665d377dfe893cad31625883f1bcbfc918dda2a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat-proto\" version=\"31.10.0\">\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.10.0.jar\">\n            <sha256 value=\"c1f6ebbacdad559b6efe4eaa29561552b33156395f069cd9703fda09c462dea6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.10.0.pom\">\n            <sha256 value=\"130d236f8bf9a7e158314b390a08d682868370a11afe06d67d2ddf78a2f90ebd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat-proto\" version=\"31.4.1\">\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.4.1.jar\">\n            <sha256 value=\"9129024bd8e38353bca3eb26dfd8e3628e058d57d6e9d8451ffc35f016751e63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.4.1.pom\">\n            <sha256 value=\"db3154500bd1751edb430dd55ad05739facf4310742f215c8e057074c570d9a6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat-proto\" version=\"31.4.2\">\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.4.2.jar\">\n            <sha256 value=\"9129024bd8e38353bca3eb26dfd8e3628e058d57d6e9d8451ffc35f016751e63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.4.2.pom\">\n            <sha256 value=\"d7f3d32f920cc8d5ca0c65f68d96fe5b725d6dab8b3fe4c0ada93d27ded3448e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat-proto\" version=\"31.5.0\">\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.5.0.jar\">\n            <sha256 value=\"9129024bd8e38353bca3eb26dfd8e3628e058d57d6e9d8451ffc35f016751e63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.5.0.pom\">\n            <sha256 value=\"26893e645c359025731e50288408bc8876afcf84877c88c56ae13c17aeeefca2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat-proto\" version=\"31.5.1\">\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.5.1.jar\">\n            <sha256 value=\"9129024bd8e38353bca3eb26dfd8e3628e058d57d6e9d8451ffc35f016751e63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.5.1.pom\">\n            <sha256 value=\"60ec5dfee917c851ee59eeaad03e9b6613df26d35b5fcbb16c38d4da5eda02a0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat-proto\" version=\"31.5.2\">\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.5.2.jar\">\n            <sha256 value=\"9129024bd8e38353bca3eb26dfd8e3628e058d57d6e9d8451ffc35f016751e63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.5.2.pom\">\n            <sha256 value=\"8b6542ab33c3e2e5faf8676e1cb52fbd68a957fbcebdb2080f65eb7b72366fe3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat-proto\" version=\"31.6.0\">\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.6.0.jar\">\n            <sha256 value=\"9129024bd8e38353bca3eb26dfd8e3628e058d57d6e9d8451ffc35f016751e63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.6.0.pom\">\n            <sha256 value=\"5b536d7d28d75e6bef5387e0c588da43904c17e4dbf491d676a1d5d8d62a8ec4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat-proto\" version=\"31.6.1\">\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.6.1.jar\">\n            <sha256 value=\"9129024bd8e38353bca3eb26dfd8e3628e058d57d6e9d8451ffc35f016751e63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.6.1.pom\">\n            <sha256 value=\"3b2b0a226b14a2c0e5ad629d1062fbb29a6f19542c5f14fe0f898fff0121e48a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat-proto\" version=\"31.7.0\">\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.7.0.jar\">\n            <sha256 value=\"9129024bd8e38353bca3eb26dfd8e3628e058d57d6e9d8451ffc35f016751e63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.7.0.pom\">\n            <sha256 value=\"98483df35e5eb88acef4c08796add100723e1e04d5f1ba688d1734ef7fe2f0b2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat-proto\" version=\"31.7.1\">\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.7.1.jar\">\n            <sha256 value=\"9129024bd8e38353bca3eb26dfd8e3628e058d57d6e9d8451ffc35f016751e63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.7.1.pom\">\n            <sha256 value=\"b5589b96ad83f4c8132f9b058c7591c81baf852c6dae70b43fa71019fa1fcfd4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat-proto\" version=\"31.7.2\">\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.7.2.jar\">\n            <sha256 value=\"9129024bd8e38353bca3eb26dfd8e3628e058d57d6e9d8451ffc35f016751e63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.7.2.pom\">\n            <sha256 value=\"fc381c918c5f5d9ec3a3cff7b52076e74f02260599b3a29a47dc9b8df34680b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat-proto\" version=\"31.7.3\">\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.7.3.jar\">\n            <sha256 value=\"9129024bd8e38353bca3eb26dfd8e3628e058d57d6e9d8451ffc35f016751e63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.7.3.pom\">\n            <sha256 value=\"1ae54e5f93cd6e0d0f8f4fe2e41ccfeeb3f9ed996cc21ea7749420ebf9a23d83\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat-proto\" version=\"31.8.0\">\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.8.0.jar\">\n            <sha256 value=\"9129024bd8e38353bca3eb26dfd8e3628e058d57d6e9d8451ffc35f016751e63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.8.0.pom\">\n            <sha256 value=\"383ec84c33b4eef706584a18e93d5fed98d296d72b0ce1d8dab2b2ad1c4778b8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat-proto\" version=\"31.8.1\">\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.8.1.jar\">\n            <sha256 value=\"9129024bd8e38353bca3eb26dfd8e3628e058d57d6e9d8451ffc35f016751e63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.8.1.pom\">\n            <sha256 value=\"0ee3f4bcd2c9b50d7c623935355a09ef11271eaddbd2712ab3d6754a7a62c307\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat-proto\" version=\"31.8.2\">\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.8.2.jar\">\n            <sha256 value=\"9129024bd8e38353bca3eb26dfd8e3628e058d57d6e9d8451ffc35f016751e63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.8.2.pom\">\n            <sha256 value=\"d65b4ed044a23a1892090bad9ac0ca29a9c13d3dee81aaad9eecb348fffc31ab\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat-proto\" version=\"31.9.0\">\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.9.0.jar\">\n            <sha256 value=\"c1f6ebbacdad559b6efe4eaa29561552b33156395f069cd9703fda09c462dea6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.9.0.pom\">\n            <sha256 value=\"a128faf3ada2f9a4cff162c60fca90c310d8b251958f94ea1f915674667a842c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat-proto\" version=\"31.9.1\">\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.9.1.jar\">\n            <sha256 value=\"c1f6ebbacdad559b6efe4eaa29561552b33156395f069cd9703fda09c462dea6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.9.1.pom\">\n            <sha256 value=\"1b734e6ec68e4d20fcd2f33d0b1e0f11ccdf46147a1eeb45d04b3fc2a812dd2b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-logcat-proto\" version=\"31.9.2\">\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.9.2.jar\">\n            <sha256 value=\"c1f6ebbacdad559b6efe4eaa29561552b33156395f069cd9703fda09c462dea6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-logcat-proto-31.9.2.pom\">\n            <sha256 value=\"9b1bfde1a162f4d8bdfd158b5543c70c01a9f55f066a43d6b5a8aeb65b27d00b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention\" version=\"31.4.1\">\n         <artifact name=\"android-test-plugin-host-retention-31.4.1.jar\">\n            <sha256 value=\"7a21b8d83545e2c91925f6650e5c0a5eb80d8f29b233e42215a4fe30562b806d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-31.4.1.module\">\n            <sha256 value=\"2de2f29c0fb6cdabe61cfae61bec2dad9bbe5307c01276e350f9940c5e512ba1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention\" version=\"31.4.2\">\n         <artifact name=\"android-test-plugin-host-retention-31.4.2.jar\">\n            <sha256 value=\"be212be059e97ab0b08cee5a8e56b7e979ca3fdcacab5740e1b7c6cad4209a8f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-31.4.2.module\">\n            <sha256 value=\"c3327d23252090d42c7b331058a41a88a7a14d8158db42999107ba70c26e3308\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention\" version=\"31.5.0\">\n         <artifact name=\"android-test-plugin-host-retention-31.5.0.jar\">\n            <sha256 value=\"d86d6bb692a8b4405418e864a84ec2c7c3753ac59ed571e0c026eb122422d95e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-31.5.0.module\">\n            <sha256 value=\"cac9c85a012f6edd26f927fc847af097594010fb9179215123192538ce475ccf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention\" version=\"31.5.1\">\n         <artifact name=\"android-test-plugin-host-retention-31.5.1.jar\">\n            <sha256 value=\"fac13965e0d0c015a831100eeed58133299110aebdf71627c80c28bb46936596\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-31.5.1.module\">\n            <sha256 value=\"e6bff9fe73fb19061200bf22fef00f7805d1fe65caf9643eb4edf8d97e8bf3cc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention\" version=\"31.5.2\">\n         <artifact name=\"android-test-plugin-host-retention-31.5.2.jar\">\n            <sha256 value=\"30c11cea0964d5822ed50adbb7987ec5757ff8366bf696f1af7f800170b6307a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-31.5.2.module\">\n            <sha256 value=\"f167783c7fc79669fb2ebaf170f5cd7afbcd7f68f5444fab57e283468fd1638f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention\" version=\"31.6.0\">\n         <artifact name=\"android-test-plugin-host-retention-31.6.0.jar\">\n            <sha256 value=\"b55c2fe56f5ecde208fb132680df732e6526b953958993f39d07c83a8d980d17\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-31.6.0.module\">\n            <sha256 value=\"a8561715de0a5f69763d7e80bef75a83c9491894f482d22b0f339e40a6115529\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention\" version=\"31.6.1\">\n         <artifact name=\"android-test-plugin-host-retention-31.6.1.jar\">\n            <sha256 value=\"2db60f60bc9383e35ffba5d4e1fd0d9c5e22152a17d6fdbbc4ac3cdc4e59be0f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-31.6.1.module\">\n            <sha256 value=\"7899ea0e70302e868915ac031072102bc334cc2df42c198fea918ad7275692b8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention\" version=\"31.7.0\">\n         <artifact name=\"android-test-plugin-host-retention-31.7.0.jar\">\n            <sha256 value=\"600d910f31447a748ae0e94050df1db11fbde809c4b85b1c1c779ab6165f9734\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-31.7.0.module\">\n            <sha256 value=\"7a3429c1f59f7ce48279b1ab0a07aeadfffa1f4637948f2bb85e2a22aa1ae5f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention\" version=\"31.7.1\">\n         <artifact name=\"android-test-plugin-host-retention-31.7.1.jar\">\n            <sha256 value=\"8a7f3002348763b99515972ebfbc28e7736f3b336fdf81c31badcdc3b6a699dc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-31.7.1.module\">\n            <sha256 value=\"ee65a4a638b3cbefe55343ba82a37978c86ef2ce7111e517ef1948675c84e5f6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention\" version=\"31.7.2\">\n         <artifact name=\"android-test-plugin-host-retention-31.7.2.jar\">\n            <sha256 value=\"9de38040eb4994d62ef3e98c5609e818535d1d05c7c1ba2d7ac7471b5ada5cb2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-31.7.2.module\">\n            <sha256 value=\"c24a66ccc75a7ea2e0ce5f393aaeb356d1910db49de296fbe2e01f9be65d3134\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention\" version=\"31.7.3\">\n         <artifact name=\"android-test-plugin-host-retention-31.7.3.jar\">\n            <sha256 value=\"7a944a016315af54394934c63dfcc18bd649185338ed880b8379eb0a3b571fb8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-31.7.3.module\">\n            <sha256 value=\"0c72f03ea7248b9cf3146fd78c8dc4028e7d3a7f5a118e9913571609f8fa9717\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention\" version=\"31.8.0\">\n         <artifact name=\"android-test-plugin-host-retention-31.8.0.jar\">\n            <sha256 value=\"8e38bbbb00adce1788ad8fa7455fca2d2d738790d4fa3a383a08d5257efc01b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-31.8.0.module\">\n            <sha256 value=\"64f8c10aa42bafb0f8f4035828e7a95b61550eccef50d9381f24685f369f61d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention\" version=\"31.8.1\">\n         <artifact name=\"android-test-plugin-host-retention-31.8.1.jar\">\n            <sha256 value=\"2f570773b2d3f01bfcf59d8edb2ec4a4c83f49551f5da2790898b01441b4fc3a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-31.8.1.module\">\n            <sha256 value=\"3ef28f350abc9f62a4c1b37b174eab0d7539dadf889c5c4cf94260837f4799e2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention\" version=\"31.8.2\">\n         <artifact name=\"android-test-plugin-host-retention-31.8.2.jar\">\n            <sha256 value=\"03f592aefd743a9077a2e66229e99a5d04f3041c64e275ab59084e99eff5da02\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-31.8.2.module\">\n            <sha256 value=\"3218ea90a16968ee7c4e8295187fd71329e730cac01ac364880fe01a4951b6b1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention\" version=\"31.9.0\">\n         <artifact name=\"android-test-plugin-host-retention-31.9.0.jar\">\n            <sha256 value=\"cf6b4de5b03ec9f0ba3d379f3acd2fd441563bda8b67e8edb68c1b31d2ff345c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-31.9.0.module\">\n            <sha256 value=\"eb4b9133fe42e7bd073ee707926ba80138ef18e2839b5ddd12c7aaa767f902b1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention\" version=\"31.9.1\">\n         <artifact name=\"android-test-plugin-host-retention-31.9.1.jar\">\n            <sha256 value=\"4cd3a6aa39a283ae819481dc14b287b99a827e75a9a533ca508d3c1462666c64\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-31.9.1.module\">\n            <sha256 value=\"bcc6f327e24ab3e0e02afc3795ce73d8cf9bf6e13f8fd93877da1106146bff42\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention\" version=\"31.9.2\">\n         <artifact name=\"android-test-plugin-host-retention-31.9.2.jar\">\n            <sha256 value=\"a1ddefcb27f4edbb145686c14af1d08efe19b92bb957294f0002584f69c20478\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-31.9.2.module\">\n            <sha256 value=\"01d3860722e33a1402397cc89e8027f6874ce16a6f61131b7303c955f3e7c17a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention-proto\" version=\"31.4.1\">\n         <artifact name=\"android-test-plugin-host-retention-proto-31.4.1.jar\">\n            <sha256 value=\"3db8ed38ef49b694caea466ae22e3b36cedc9557b3589d0e07c0cdd83294591c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-proto-31.4.1.pom\">\n            <sha256 value=\"e2ee2ad4972cb0de9c6e6838dac3991ac8c9da0df5b66b27cded5098332b3e49\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention-proto\" version=\"31.4.2\">\n         <artifact name=\"android-test-plugin-host-retention-proto-31.4.2.jar\">\n            <sha256 value=\"3db8ed38ef49b694caea466ae22e3b36cedc9557b3589d0e07c0cdd83294591c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-proto-31.4.2.pom\">\n            <sha256 value=\"80bde90569b7e63c5dd4e6ab6206af53a7617620a8ab06d63c6b0a9248530db1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention-proto\" version=\"31.5.0\">\n         <artifact name=\"android-test-plugin-host-retention-proto-31.5.0.jar\">\n            <sha256 value=\"3db8ed38ef49b694caea466ae22e3b36cedc9557b3589d0e07c0cdd83294591c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-proto-31.5.0.pom\">\n            <sha256 value=\"278156ce3fc6273dc0c16e119d8be34ee4a165092cedb8e946de5113e2d3db9a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention-proto\" version=\"31.5.1\">\n         <artifact name=\"android-test-plugin-host-retention-proto-31.5.1.jar\">\n            <sha256 value=\"3db8ed38ef49b694caea466ae22e3b36cedc9557b3589d0e07c0cdd83294591c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-proto-31.5.1.pom\">\n            <sha256 value=\"a5aa599e17ae946f89a04426ce67253f9f35ca6db59ee6a7e31365ac648dc09e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention-proto\" version=\"31.5.2\">\n         <artifact name=\"android-test-plugin-host-retention-proto-31.5.2.jar\">\n            <sha256 value=\"3db8ed38ef49b694caea466ae22e3b36cedc9557b3589d0e07c0cdd83294591c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-proto-31.5.2.pom\">\n            <sha256 value=\"98ce4bec33f5bdbafc15365b6e1845ae6ca2a15df8a23b33c59ec27c1055a167\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention-proto\" version=\"31.6.0\">\n         <artifact name=\"android-test-plugin-host-retention-proto-31.6.0.jar\">\n            <sha256 value=\"3db8ed38ef49b694caea466ae22e3b36cedc9557b3589d0e07c0cdd83294591c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-proto-31.6.0.pom\">\n            <sha256 value=\"392cf25d3f7fd361063f330d3ebfddc6c898c7621f599e9bc1e729eac9a41262\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention-proto\" version=\"31.6.1\">\n         <artifact name=\"android-test-plugin-host-retention-proto-31.6.1.jar\">\n            <sha256 value=\"3db8ed38ef49b694caea466ae22e3b36cedc9557b3589d0e07c0cdd83294591c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-proto-31.6.1.pom\">\n            <sha256 value=\"6676e5c01e8b8e259c24912aad7131eab0be0fefe405e519cecea8e3e901a0c8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention-proto\" version=\"31.7.0\">\n         <artifact name=\"android-test-plugin-host-retention-proto-31.7.0.jar\">\n            <sha256 value=\"3db8ed38ef49b694caea466ae22e3b36cedc9557b3589d0e07c0cdd83294591c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-proto-31.7.0.pom\">\n            <sha256 value=\"0b41e450aed42f317a92228e872d7382ba7cffa6d511e5f11f1dbc6901afdc92\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention-proto\" version=\"31.7.1\">\n         <artifact name=\"android-test-plugin-host-retention-proto-31.7.1.jar\">\n            <sha256 value=\"3db8ed38ef49b694caea466ae22e3b36cedc9557b3589d0e07c0cdd83294591c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-proto-31.7.1.pom\">\n            <sha256 value=\"db6a429658c143b6ecc9ca8137c70caaa7550d8e9b5af5d514fcd2ff2f6a5230\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention-proto\" version=\"31.7.2\">\n         <artifact name=\"android-test-plugin-host-retention-proto-31.7.2.jar\">\n            <sha256 value=\"3db8ed38ef49b694caea466ae22e3b36cedc9557b3589d0e07c0cdd83294591c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-proto-31.7.2.pom\">\n            <sha256 value=\"9cc0f24315ff7b0bfd1f1b02005986c5b45231b4199b575d518eae37f497021c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention-proto\" version=\"31.7.3\">\n         <artifact name=\"android-test-plugin-host-retention-proto-31.7.3.jar\">\n            <sha256 value=\"3db8ed38ef49b694caea466ae22e3b36cedc9557b3589d0e07c0cdd83294591c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-proto-31.7.3.pom\">\n            <sha256 value=\"d362f8f50fbd1cdee8dc92f79f2e901ab82970d5d4e09a19ae17946c56c0884c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention-proto\" version=\"31.8.0\">\n         <artifact name=\"android-test-plugin-host-retention-proto-31.8.0.jar\">\n            <sha256 value=\"3db8ed38ef49b694caea466ae22e3b36cedc9557b3589d0e07c0cdd83294591c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-proto-31.8.0.pom\">\n            <sha256 value=\"f432549d044372a45a32c339bc6dd0aa00eac865800071a72a209e9f6ba07285\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention-proto\" version=\"31.8.1\">\n         <artifact name=\"android-test-plugin-host-retention-proto-31.8.1.jar\">\n            <sha256 value=\"3db8ed38ef49b694caea466ae22e3b36cedc9557b3589d0e07c0cdd83294591c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-proto-31.8.1.pom\">\n            <sha256 value=\"5c5f48feb037ac58fea0575c59873c02c585a421176efdad9cab3fa839cd1487\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention-proto\" version=\"31.8.2\">\n         <artifact name=\"android-test-plugin-host-retention-proto-31.8.2.jar\">\n            <sha256 value=\"3db8ed38ef49b694caea466ae22e3b36cedc9557b3589d0e07c0cdd83294591c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-proto-31.8.2.pom\">\n            <sha256 value=\"7dc708778336e612a2e772307e78270af69328c8ecd76cc3a9ff0619fa94bab5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention-proto\" version=\"31.9.0\">\n         <artifact name=\"android-test-plugin-host-retention-proto-31.9.0.jar\">\n            <sha256 value=\"08f1af96115b2bd02cd4b684e194f5c5c2763f01c8f59e011d9aeccb3fef1863\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-proto-31.9.0.pom\">\n            <sha256 value=\"1b74cbfae6effe91374d68ef90d0f72d9fecf29f89c8565a92ddadfd43fabb76\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention-proto\" version=\"31.9.1\">\n         <artifact name=\"android-test-plugin-host-retention-proto-31.9.1.jar\">\n            <sha256 value=\"08f1af96115b2bd02cd4b684e194f5c5c2763f01c8f59e011d9aeccb3fef1863\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-proto-31.9.1.pom\">\n            <sha256 value=\"2ea033e75b625155eaecfc367a12209f2bdf14df10ad38554a528ec96ef6d2de\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-host-retention-proto\" version=\"31.9.2\">\n         <artifact name=\"android-test-plugin-host-retention-proto-31.9.2.jar\">\n            <sha256 value=\"08f1af96115b2bd02cd4b684e194f5c5c2763f01c8f59e011d9aeccb3fef1863\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-host-retention-proto-31.9.2.pom\">\n            <sha256 value=\"bc6f29d54cf929019ab40489c75cb2829c8d915829fee46582b329c9a13522c4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle\" version=\"31.10.0\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.10.0.jar\">\n            <sha256 value=\"d4cb625c2b1e5658b79c4c8c6ddd65ed17b6644543ad3a67840b1684c94bea21\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.10.0.module\">\n            <sha256 value=\"4c5676cb71960a84cfd698aba48ac45668ca65d495cf7c4f9b9b6305f477f293\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle\" version=\"31.4.1\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.4.1.jar\">\n            <sha256 value=\"42c2a59ed10ca56f21eeb52dbaa436a1ecf121dfb97e484a1b545da8bb31173e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.4.1.module\">\n            <sha256 value=\"418c26c65eb6f9387397559c0fd57c55d7d7a3e3f8d175ad61a0a88c40b440c0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle\" version=\"31.4.2\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.4.2.jar\">\n            <sha256 value=\"7271df2e627abf36ec710a1466dd8c59b133dc1c709524057f750049273dd494\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.4.2.module\">\n            <sha256 value=\"87172d676a5aabfb597aab2ec4bafe4e7cac4c96257b467286a3f368a056e43b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle\" version=\"31.5.0\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.5.0.jar\">\n            <sha256 value=\"22bbd58eba2789edc2896cf79480c89dc07e8bbf7c88ecd82ace94b378160c10\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.5.0.module\">\n            <sha256 value=\"e457d39b02bc8f23cef89f0d070fd838771729ee09e8253e5f9bc012b35583d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle\" version=\"31.5.1\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.5.1.jar\">\n            <sha256 value=\"3213a233fc48172fa7f1c68b184040660e2cf927973fe8d9434ee9f418b8d991\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.5.1.module\">\n            <sha256 value=\"07f1ce21dc48e49d7eaee7c8c6aeec3fb3fbe1ce541958111f1521737be73867\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle\" version=\"31.5.2\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.5.2.jar\">\n            <sha256 value=\"1a5dcb694b9fbbbb04311d05dcc50dfc3f1e3337e7cc359db62ab93bc07062df\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.5.2.module\">\n            <sha256 value=\"dd503c86a71d2eee5db82b85a930eda7df9c181c942309f8af81bb2e2504cca9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle\" version=\"31.6.0\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.6.0.jar\">\n            <sha256 value=\"311c974300e3480acc21c81c19f50ddf4c73b1f20cacc194a6048a110f080202\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.6.0.module\">\n            <sha256 value=\"bb1405b2cac978a7c648ab99cf3f318335ba82e10c97cfef8b6a9c7fe2ccb161\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle\" version=\"31.6.1\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.6.1.jar\">\n            <sha256 value=\"099af6aa4ba4e88c130a63a43fc8b539448eaaefaca33df2e5f57c100b406be4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.6.1.module\">\n            <sha256 value=\"e763cfc7b58fd4c4fe02a34e3a4d7a30dcd4c2b8ed2c94926c7c4a3d360e8dea\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle\" version=\"31.7.0\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.7.0.jar\">\n            <sha256 value=\"0a6a00d5d8ec9d706ee3386fb652d7e4266781de70d287d678152ebdcefcd775\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.7.0.module\">\n            <sha256 value=\"14233f1c2c879e38e24a3513a9dc2897cdfd9dc1f237ed6f7b7c63a2bac28cae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle\" version=\"31.7.1\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.7.1.jar\">\n            <sha256 value=\"e963b79eaf4155258eed302105412de02af1d8a176dfb80fe9f339d81e5cec4e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.7.1.module\">\n            <sha256 value=\"92de678d606dd9c7e62d570b3344f741817f51b435866a2d39b7fbe2dd266ea4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle\" version=\"31.7.2\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.7.2.jar\">\n            <sha256 value=\"84719ba13556402922e4682000710d2dadf5d88979c5d9301848629eb8723726\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.7.2.module\">\n            <sha256 value=\"3d355b7488832a4e7d1030ec5d6e772aeafdad8a909e7ec1dcbe43eefc22893d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle\" version=\"31.7.3\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.7.3.jar\">\n            <sha256 value=\"bf558c1e3f6f3f6d9800f965c4fe4bf39553ec255473122211de1228f5897acf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.7.3.module\">\n            <sha256 value=\"f74ded347660a21c0cfb3cd5322409ca1bfb4caaa6221ceefbe566beace5665d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle\" version=\"31.8.0\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.8.0.jar\">\n            <sha256 value=\"d382225ccb9ad9dcbaade89f03c16c3201c2e6cd8cd9d9c50e60900cb829583d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.8.0.module\">\n            <sha256 value=\"3c4d13b01243d8ebb8ecf7fcd243ded2b61fbde161f3ed10c49decbf3e0e7bc8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle\" version=\"31.8.1\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.8.1.jar\">\n            <sha256 value=\"b8c1f46894b9c0194ad5a805bb4e2a5b946d794a0baa8a2042053cac09cc76dd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.8.1.module\">\n            <sha256 value=\"c9cbe4e4feadced6710a8fec019ef68fac163a823c81c23c1511504f53f55db7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle\" version=\"31.8.2\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.8.2.jar\">\n            <sha256 value=\"9285f9c67447896b5aa0c2b63ba362a10c8c3720e9008c25d2c191f9bd3e2797\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.8.2.module\">\n            <sha256 value=\"c50f605999ef1887d1c4822d1ea71f4890bcd13886d51db371997434687288b6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle\" version=\"31.9.0\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.9.0.jar\">\n            <sha256 value=\"3776958c120d6aee0434ebfc38b5c15c7ca16db2d06f5ccc65f507e425ba357b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.9.0.module\">\n            <sha256 value=\"51a382f073b02cfa1eb2050da13bb8210a3ba4cd1cfec6e7ff7e533739842e13\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle\" version=\"31.9.1\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.9.1.jar\">\n            <sha256 value=\"bd5f0a26feef38d0e995bd59d31516aac81ce41f0b201127978794401b8e6bdf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.9.1.module\">\n            <sha256 value=\"5884089d90d72251b4060c6df49b40c3d2e6592747d79e9adb18a1de8ae09cee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle\" version=\"31.9.2\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.9.2.jar\">\n            <sha256 value=\"db339184b9079768c096bca1db64fc55eb56b27d9ecea86e5265546205251195\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-31.9.2.module\">\n            <sha256 value=\"2a48bc2ebc524430103eca5bd9503491be45115655a691c8a2804a213628d6db\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle-proto\" version=\"31.10.0\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.10.0.jar\">\n            <sha256 value=\"d429b9312dffa0503381d1ee1b18a999bd901e7456612b2fb48c6a5d5a2caf88\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.10.0.pom\">\n            <sha256 value=\"a02b2d69595390390ba58495522387dad634c6c2bfbd3b76b9525d552d7ae7ac\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle-proto\" version=\"31.4.1\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.4.1.jar\">\n            <sha256 value=\"cbdf71bca60e14c30e7b2cf4b90f0f0a3e8c138f7cadd874b0d9c0ae082e0274\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.4.1.pom\">\n            <sha256 value=\"931443bdb0f1268cc3aa794643177d209efcd5a1afc6a0feae73b9f05d663f3a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle-proto\" version=\"31.4.2\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.4.2.jar\">\n            <sha256 value=\"cbdf71bca60e14c30e7b2cf4b90f0f0a3e8c138f7cadd874b0d9c0ae082e0274\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.4.2.pom\">\n            <sha256 value=\"8c4e853bb8739b51d966aa5d54f039f155db27bf5c5e695966c30d36ae2c87e6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle-proto\" version=\"31.5.0\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.5.0.jar\">\n            <sha256 value=\"cbdf71bca60e14c30e7b2cf4b90f0f0a3e8c138f7cadd874b0d9c0ae082e0274\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.5.0.pom\">\n            <sha256 value=\"a22a010610607be6a57334b8a44d4a185409583198c934e6ba36911b3ed3a559\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle-proto\" version=\"31.5.1\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.5.1.jar\">\n            <sha256 value=\"cbdf71bca60e14c30e7b2cf4b90f0f0a3e8c138f7cadd874b0d9c0ae082e0274\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.5.1.pom\">\n            <sha256 value=\"dde6129430768375a6b49ba9597d4044e5b957a7e028783427300368dd9ac553\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle-proto\" version=\"31.5.2\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.5.2.jar\">\n            <sha256 value=\"cbdf71bca60e14c30e7b2cf4b90f0f0a3e8c138f7cadd874b0d9c0ae082e0274\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.5.2.pom\">\n            <sha256 value=\"37592c960c6417ef6e07f70a7bdcb8b19abc6b8eaefc352e23ff38c0e072521e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle-proto\" version=\"31.6.0\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.6.0.jar\">\n            <sha256 value=\"cbdf71bca60e14c30e7b2cf4b90f0f0a3e8c138f7cadd874b0d9c0ae082e0274\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.6.0.pom\">\n            <sha256 value=\"1e55b558ab2e9531dda31256f4cd41e82341e14879e708a915b37c9ddc6b293d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle-proto\" version=\"31.6.1\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.6.1.jar\">\n            <sha256 value=\"cbdf71bca60e14c30e7b2cf4b90f0f0a3e8c138f7cadd874b0d9c0ae082e0274\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.6.1.pom\">\n            <sha256 value=\"8f51735afee2f720d2ef4642187a29a47eeedae4ee355c92fd7dd1f4ae76eab4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle-proto\" version=\"31.7.0\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.7.0.jar\">\n            <sha256 value=\"cbdf71bca60e14c30e7b2cf4b90f0f0a3e8c138f7cadd874b0d9c0ae082e0274\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.7.0.pom\">\n            <sha256 value=\"b9876bbf24d7b79dd8eefbc497cfa40b52d1f3d2f0f41fc2e1896d3041edb17e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle-proto\" version=\"31.7.1\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.7.1.jar\">\n            <sha256 value=\"cbdf71bca60e14c30e7b2cf4b90f0f0a3e8c138f7cadd874b0d9c0ae082e0274\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.7.1.pom\">\n            <sha256 value=\"4807b08e38aedd003b8eabf1840e4fa22cf1bedb51122d1d5af89ddb1ca921da\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle-proto\" version=\"31.7.2\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.7.2.jar\">\n            <sha256 value=\"cbdf71bca60e14c30e7b2cf4b90f0f0a3e8c138f7cadd874b0d9c0ae082e0274\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.7.2.pom\">\n            <sha256 value=\"cef361e14c4654e2972411d83cdb1c5cacd39248f07b400168de7f445febe67d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle-proto\" version=\"31.7.3\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.7.3.jar\">\n            <sha256 value=\"cbdf71bca60e14c30e7b2cf4b90f0f0a3e8c138f7cadd874b0d9c0ae082e0274\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.7.3.pom\">\n            <sha256 value=\"63e52f778588440bc6daa9aa31589ae9f52b3fa5b28adb510c739f0ff4b8d2bc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle-proto\" version=\"31.8.0\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.8.0.jar\">\n            <sha256 value=\"cbdf71bca60e14c30e7b2cf4b90f0f0a3e8c138f7cadd874b0d9c0ae082e0274\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.8.0.pom\">\n            <sha256 value=\"5da87de71b72d78a7c7067a19df918c4d2d44b1e7a7330c53bad18d9539306f6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle-proto\" version=\"31.8.1\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.8.1.jar\">\n            <sha256 value=\"cbdf71bca60e14c30e7b2cf4b90f0f0a3e8c138f7cadd874b0d9c0ae082e0274\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.8.1.pom\">\n            <sha256 value=\"2d956c6c4906cff330823bfa4911037ee355774474505b6d4fd819fbd08d466f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle-proto\" version=\"31.8.2\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.8.2.jar\">\n            <sha256 value=\"cbdf71bca60e14c30e7b2cf4b90f0f0a3e8c138f7cadd874b0d9c0ae082e0274\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.8.2.pom\">\n            <sha256 value=\"895df2ad4466e3dfafee4bbf851c79880a1c3f00232e2474eeaba5be84144afd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle-proto\" version=\"31.9.0\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.9.0.jar\">\n            <sha256 value=\"d429b9312dffa0503381d1ee1b18a999bd901e7456612b2fb48c6a5d5a2caf88\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.9.0.pom\">\n            <sha256 value=\"923673bc88e477035841bbc519e5fed6c7bf33282532f9de5a29701488c09944\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle-proto\" version=\"31.9.1\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.9.1.jar\">\n            <sha256 value=\"d429b9312dffa0503381d1ee1b18a999bd901e7456612b2fb48c6a5d5a2caf88\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.9.1.pom\">\n            <sha256 value=\"7430ab23557264a1f9d9480da55e1777d2a28a552d285590597187147686d619\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"android-test-plugin-result-listener-gradle-proto\" version=\"31.9.2\">\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.9.2.jar\">\n            <sha256 value=\"d429b9312dffa0503381d1ee1b18a999bd901e7456612b2fb48c6a5d5a2caf88\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-result-listener-gradle-proto-31.9.2.pom\">\n            <sha256 value=\"6091529c81a823fdcf1d9f0fc16310c5d7f7ef060640d75a60704676e5893795\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"utp-common\" version=\"31.10.0\">\n         <artifact name=\"utp-common-31.10.0.jar\">\n            <sha256 value=\"cde678a64b13041cdd2cc9dad1685990a1d090fb04ff5da2261ff75a83598106\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utp-common-31.10.0.pom\">\n            <sha256 value=\"7023e95907ae0e34712227bf94328827d71a600ddac585bc97e322f8b21fc1a8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"utp-common\" version=\"31.4.1\">\n         <artifact name=\"utp-common-31.4.1.jar\">\n            <sha256 value=\"bb150aea0c945d38f3360a7eb656d9e721b1cc6cddb36d50fe392cf7015762ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utp-common-31.4.1.pom\">\n            <sha256 value=\"f6a2b475d34fed77b61689ab9e54270d8c958cf29a0e79c55f029272a7a6522f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"utp-common\" version=\"31.4.2\">\n         <artifact name=\"utp-common-31.4.2.jar\">\n            <sha256 value=\"bb150aea0c945d38f3360a7eb656d9e721b1cc6cddb36d50fe392cf7015762ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utp-common-31.4.2.pom\">\n            <sha256 value=\"d046b94a89f3c570297106e467f282abd122a3fd6b7344bd736c0ae81fd4bd74\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"utp-common\" version=\"31.5.0\">\n         <artifact name=\"utp-common-31.5.0.jar\">\n            <sha256 value=\"bb150aea0c945d38f3360a7eb656d9e721b1cc6cddb36d50fe392cf7015762ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utp-common-31.5.0.pom\">\n            <sha256 value=\"2e3529810d646dacb01c45d62e31eda8df9b1acdbe20bf98dabc5435238d8b9b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"utp-common\" version=\"31.5.1\">\n         <artifact name=\"utp-common-31.5.1.jar\">\n            <sha256 value=\"bb150aea0c945d38f3360a7eb656d9e721b1cc6cddb36d50fe392cf7015762ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utp-common-31.5.1.pom\">\n            <sha256 value=\"0a36bb875f361d0d219eeff9ad533602408a9d28f7a1be55e202782e48a548de\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"utp-common\" version=\"31.5.2\">\n         <artifact name=\"utp-common-31.5.2.jar\">\n            <sha256 value=\"bb150aea0c945d38f3360a7eb656d9e721b1cc6cddb36d50fe392cf7015762ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utp-common-31.5.2.pom\">\n            <sha256 value=\"5bd59c54d2d4208c0fbbf378df8b206c38ac3d9f540c9dc757374a15c91bf28d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"utp-common\" version=\"31.6.0\">\n         <artifact name=\"utp-common-31.6.0.jar\">\n            <sha256 value=\"595702fb80bcd4373a1b9b438e5977687cba3c5fba6fa1a2936beef79b13ee9d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utp-common-31.6.0.pom\">\n            <sha256 value=\"8614d184b67478b7de369944e36657482a5303827c6425d4af90e4686b50df8c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"utp-common\" version=\"31.6.1\">\n         <artifact name=\"utp-common-31.6.1.jar\">\n            <sha256 value=\"595702fb80bcd4373a1b9b438e5977687cba3c5fba6fa1a2936beef79b13ee9d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utp-common-31.6.1.pom\">\n            <sha256 value=\"4c6c7d6d431c5fd61415f607a1d8d08b1e03be59186202058d309e54c252cfbe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"utp-common\" version=\"31.7.0\">\n         <artifact name=\"utp-common-31.7.0.jar\">\n            <sha256 value=\"595702fb80bcd4373a1b9b438e5977687cba3c5fba6fa1a2936beef79b13ee9d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utp-common-31.7.0.pom\">\n            <sha256 value=\"73459893dfa34052dab8984dda467edf1bc7ed4b9961c8ffd0c1c8b958f42a1b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"utp-common\" version=\"31.7.1\">\n         <artifact name=\"utp-common-31.7.1.jar\">\n            <sha256 value=\"595702fb80bcd4373a1b9b438e5977687cba3c5fba6fa1a2936beef79b13ee9d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utp-common-31.7.1.pom\">\n            <sha256 value=\"ce730a3bd09677d30738a2dbee0b1371dea4dfea3361986ada00ffdaa6063e88\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"utp-common\" version=\"31.7.2\">\n         <artifact name=\"utp-common-31.7.2.jar\">\n            <sha256 value=\"595702fb80bcd4373a1b9b438e5977687cba3c5fba6fa1a2936beef79b13ee9d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utp-common-31.7.2.pom\">\n            <sha256 value=\"944c5c164e2b530728183ad2df4a855c07edce52d18cdff779295a7ccdd8e2b8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"utp-common\" version=\"31.7.3\">\n         <artifact name=\"utp-common-31.7.3.jar\">\n            <sha256 value=\"595702fb80bcd4373a1b9b438e5977687cba3c5fba6fa1a2936beef79b13ee9d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utp-common-31.7.3.pom\">\n            <sha256 value=\"52b3ccadb9126afd7359c7c7b659922bdd056411ffa17ae9cc76fdd80205fa3f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"utp-common\" version=\"31.8.0\">\n         <artifact name=\"utp-common-31.8.0.jar\">\n            <sha256 value=\"595702fb80bcd4373a1b9b438e5977687cba3c5fba6fa1a2936beef79b13ee9d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utp-common-31.8.0.pom\">\n            <sha256 value=\"d0b06a6dde11874b5da6b7dbe9a8dfa5c5ebaca4bb562f4f9bb85cf406de4b14\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"utp-common\" version=\"31.8.1\">\n         <artifact name=\"utp-common-31.8.1.jar\">\n            <sha256 value=\"595702fb80bcd4373a1b9b438e5977687cba3c5fba6fa1a2936beef79b13ee9d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utp-common-31.8.1.pom\">\n            <sha256 value=\"6c44370b19a8ffb89ded7ee5c9ed142b996c178f8af58a80244ff15e1e332850\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"utp-common\" version=\"31.8.2\">\n         <artifact name=\"utp-common-31.8.2.jar\">\n            <sha256 value=\"595702fb80bcd4373a1b9b438e5977687cba3c5fba6fa1a2936beef79b13ee9d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utp-common-31.8.2.pom\">\n            <sha256 value=\"f71c627e786557ace97bb6db8d7adb3f74aa97cf9180e64ac4ebd3b71df0685a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"utp-common\" version=\"31.9.0\">\n         <artifact name=\"utp-common-31.9.0.jar\">\n            <sha256 value=\"cde678a64b13041cdd2cc9dad1685990a1d090fb04ff5da2261ff75a83598106\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utp-common-31.9.0.pom\">\n            <sha256 value=\"5a6007c60e5cd176e2e5e25e120b18cde92fcf5cfae18fd82fa25c2e5ae91cdd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"utp-common\" version=\"31.9.1\">\n         <artifact name=\"utp-common-31.9.1.jar\">\n            <sha256 value=\"cde678a64b13041cdd2cc9dad1685990a1d090fb04ff5da2261ff75a83598106\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utp-common-31.9.1.pom\">\n            <sha256 value=\"dcec2384ff7af11395d52ac7c52fd318f74d507574f3002d915df867ed32eb36\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.android.tools.utp\" name=\"utp-common\" version=\"31.9.2\">\n         <artifact name=\"utp-common-31.9.2.jar\">\n            <sha256 value=\"cde678a64b13041cdd2cc9dad1685990a1d090fb04ff5da2261ff75a83598106\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utp-common-31.9.2.pom\">\n            <sha256 value=\"006357d6a56ed35b423f323c3125c1dde8811a08ceebedd6924030a95a06c373\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.CanHub\" name=\"Android-Image-Cropper\" version=\"4.3.2\">\n         <artifact name=\"Android-Image-Cropper-4.3.2.aar\">\n            <sha256 value=\"970ebab04c4db12b56a8cf910e05c2155df243b43f2893768bb2ae1bdc3a467d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"Android-Image-Cropper-4.3.2.module\">\n            <sha256 value=\"4ec9f7fb834eaf3bbe3a586e48ca9262ddc8837735932dd3dffcf910e25a4243\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.MikeOrtiz\" name=\"TouchImageView\" version=\"3.6\">\n         <artifact name=\"TouchImageView-3.6.aar\">\n            <sha256 value=\"82f4d9cbe44b6b99e3af62733299da5bc4f25efba25da01d0b466856aae98f23\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"TouchImageView-3.6.module\">\n            <sha256 value=\"607d0ebabb05336bdb48aec46cfdae2f684f4ff1d0ea0c65d0a62e033e9d7698\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.MikeOrtiz\" name=\"TouchImageView\" version=\"3.7\">\n         <artifact name=\"TouchImageView-3.7.aar\">\n            <sha256 value=\"171efea56d1a738efa756a710a90d6096ecc7f45756381e283fd6a28c6caea2b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"TouchImageView-3.7.module\">\n            <sha256 value=\"6fab7c4ca2686574858118f24730ebd642534b41cc16ec1419bb28b5430796c0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.MikeOrtiz\" name=\"TouchImageView\" version=\"3.7.1\">\n         <artifact name=\"TouchImageView-3.7.1.aar\">\n            <sha256 value=\"97e7125a2ef080d56d2eae7638ccdb5fc65ab1df8665be3337e2cc19f80ec874\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"TouchImageView-3.7.1.module\">\n            <sha256 value=\"48d51e7368edab2102baaa88d01b465a77c80f978c04b5075e1ed25242e3b243\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.UnifiedPush\" name=\"android-connector\" version=\"2.4.0\">\n         <artifact name=\"android-connector-2.4.0.aar\">\n            <sha256 value=\"6ac50fd9acac605939bf818d0c2355ed783fbeef00ea351ed8e14cceb6ef2238\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-connector-2.4.0.module\">\n            <sha256 value=\"68e92058a57388f4513a0f87da4a6cf10fd1075e1fae55f75e7a3deaf63b8fff\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.bumptech.glide\" name=\"annotations\" version=\"4.16.0\">\n         <artifact name=\"annotations-4.16.0.jar\">\n            <sha256 value=\"c59e39b1b31b4d5592277cd90012149d740b569d4338f56443cac82c3fbda3d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-4.16.0.module\">\n            <sha256 value=\"9b918e3367e87d9a95899c306436df5e365ca2d04e4e9041740534fc8341c31f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.bumptech.glide\" name=\"disklrucache\" version=\"4.16.0\">\n         <artifact name=\"disklrucache-4.16.0-sources.jar\">\n            <sha256 value=\"0a4b3c7af0a83c4e2c798e2f77bcea48af5e76b86730e96ef38fd26488bfd9fa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"disklrucache-4.16.0.jar\">\n            <sha256 value=\"a227f6559c104aa5a5c88b0a70e9c7e3db6859e30b4774f3829121df9e627374\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"disklrucache-4.16.0.pom\">\n            <sha256 value=\"a5e8df6f1d227c3e9be16fcbdfd3f533b21d8d03e2682add771af8f7cbbda944\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.bumptech.glide\" name=\"gifdecoder\" version=\"4.16.0\">\n         <artifact name=\"gifdecoder-4.16.0-sources.jar\">\n            <sha256 value=\"b0ba03d12b7ac21ce8ba9d2c0f241cb53f035dc0b762d2ca8af6af1da03d8b15\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gifdecoder-4.16.0.aar\">\n            <sha256 value=\"955f872af4d2a321fea2a346fc472225a2b99524acc46781491712e39b6a214f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gifdecoder-4.16.0.pom\">\n            <sha256 value=\"30a608f777ca7720028c365dd670fb5c372d0e1151b9401680e3d09472db0017\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.bumptech.glide\" name=\"glide\" version=\"4.16.0\">\n         <artifact name=\"glide-4.16.0-sources.jar\">\n            <sha256 value=\"e2ea6d3e0707682b0109375dbe2a6fe2f7247c89b7519797e94cfb00249213b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"glide-4.16.0.aar\">\n            <sha256 value=\"89811c63dd266a4851fd1b79c6fc0c982996ece435f5ff483fb830ca6cb53cd4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"glide-4.16.0.pom\">\n            <sha256 value=\"e72c8e310d7a2b9cee5acdcdb92fd2ef6394eb72e56a96cacb5692404702e571\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.bumptech.glide\" name=\"ksp\" version=\"4.16.0\">\n         <artifact name=\"ksp-4.16.0.jar\">\n            <sha256 value=\"45693dedc64a3f27ce30c1af5c979a551a71604935ec67b80c143870fee7c229\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ksp-4.16.0.module\">\n            <sha256 value=\"3386cd0ef152e4e3873200db7b7870ac2cff3f7e44a24dffc0add17937d6ed82\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.bumptech.glide\" name=\"okhttp3-integration\" version=\"4.16.0\">\n         <artifact name=\"okhttp3-integration-4.16.0-sources.jar\">\n            <sha256 value=\"bc024edafa5f3ac16c9e54331c4e240eac3f99129103d1bb4eb4e0d9ca331dae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"okhttp3-integration-4.16.0.aar\">\n            <sha256 value=\"5d5da82d36e2d4d2c1b92dc2cbcca883d9c14c2be8257a6fe70bcc38b64e9a96\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"okhttp3-integration-4.16.0.pom\">\n            <sha256 value=\"c60137ec4e39d79217fa3acfb7d72cdc7c352be874fde306f992048e63435be5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.penfeizhou.android.animation\" name=\"apng\" version=\"2.23.0\">\n         <artifact name=\"apng-2.23.0-sources.jar\">\n            <sha256 value=\"a669e8da4927857f635a1b1ab1286df6bd955dfda38bd52a8f50d8ebb7dfb202\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apng-2.23.0.aar\">\n            <sha256 value=\"5586d8dfda1eed62b95cb01fe514beb1c525a57ebc02b9ad40f7aefbaf011232\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apng-2.23.0.pom\">\n            <sha256 value=\"768042a78f6364e574af9f854d35f69fbecf3c1c2fb32d22678b711731972fe1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.penfeizhou.android.animation\" name=\"apng\" version=\"3.0.2\">\n         <artifact name=\"apng-3.0.2.aar\">\n            <sha256 value=\"3bf4309bce9c8683d38d77cae8f4c9d7d9b0537c1af86362fe61bdecff5e48ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apng-3.0.2.module\">\n            <sha256 value=\"f4c26eaff2ca1a53b2391ef108364598d3becc89553677749a5f9368f6b12eb7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.penfeizhou.android.animation\" name=\"apng\" version=\"3.0.4\">\n         <artifact name=\"apng-3.0.4.aar\">\n            <sha256 value=\"3bf4309bce9c8683d38d77cae8f4c9d7d9b0537c1af86362fe61bdecff5e48ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"apng-3.0.4.module\">\n            <sha256 value=\"00426e1351d9d859390e073b1be67290f5c2232e67bc1eb0414a88f7bf48a6a1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.penfeizhou.android.animation\" name=\"avif\" version=\"3.0.2\">\n         <artifact name=\"avif-3.0.2.aar\">\n            <sha256 value=\"60c973d461a02c7c43648bcbe8be686b96792db0657caca7c2111481509b646b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"avif-3.0.2.module\">\n            <sha256 value=\"34480132bcbffa789e5a87558ad9109e42d62bd205e9f8467031d0b0cd06afd7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.penfeizhou.android.animation\" name=\"avif\" version=\"3.0.4\">\n         <artifact name=\"avif-3.0.4.aar\">\n            <sha256 value=\"60c973d461a02c7c43648bcbe8be686b96792db0657caca7c2111481509b646b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"avif-3.0.4.module\">\n            <sha256 value=\"6e46294c141ba56349ea476dffa87e2edfd87ec238a073c6c6c95878db4e1304\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.penfeizhou.android.animation\" name=\"awebp\" version=\"2.23.0\">\n         <artifact name=\"awebp-2.23.0-sources.jar\">\n            <sha256 value=\"199c074edeb96cf86e2f7101d86ac2577665ab6cf902c81073efd80ff27b2bd3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"awebp-2.23.0.aar\">\n            <sha256 value=\"9780e6e6935502f445d45fce4610e52f98a7f8bf723c82dfb91e2637281f7bf3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"awebp-2.23.0.pom\">\n            <sha256 value=\"3171babc67ca0341a3d3cb204ee728a93d058ccf27541cccab2ee8d968a56613\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.penfeizhou.android.animation\" name=\"awebp\" version=\"3.0.2\">\n         <artifact name=\"awebp-3.0.2.aar\">\n            <sha256 value=\"3745345de461a88193ab4833d14ad6797022f236486e8a2182533e3cb28d09e4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"awebp-3.0.2.module\">\n            <sha256 value=\"3eee2b26d6e7261dd7bcab88e599afdd64e3fd139caaca0fb62fc0bd7a38bf77\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.penfeizhou.android.animation\" name=\"awebp\" version=\"3.0.4\">\n         <artifact name=\"awebp-3.0.4.aar\">\n            <sha256 value=\"3745345de461a88193ab4833d14ad6797022f236486e8a2182533e3cb28d09e4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"awebp-3.0.4.module\">\n            <sha256 value=\"0d1b503e30ea12e332dc405c05d1eb2f0bf821b3846e3f0b0d9a029cfdf8420c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.penfeizhou.android.animation\" name=\"frameanimation\" version=\"2.23.0\">\n         <artifact name=\"frameanimation-2.23.0-sources.jar\">\n            <sha256 value=\"aaddbd8c47241141af5051950d9e41f2c3ff8914eb0ee165eda9735007628eb6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"frameanimation-2.23.0.aar\">\n            <sha256 value=\"7b132ee73c77bcb1bfe44ea8f6fe4ef1315c1993d98e0081af749f4ae0dafe3e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"frameanimation-2.23.0.pom\">\n            <sha256 value=\"9e3ef6d2f7155468c78096183c6f4b371e5c273b616edb15ffdc35b4a5c8697c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.penfeizhou.android.animation\" name=\"frameanimation\" version=\"3.0.2\">\n         <artifact name=\"frameanimation-3.0.2.aar\">\n            <sha256 value=\"e736712a3c508788c3b69ff834533c7285d0f241fdc0329500cfafbb9c721e5d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"frameanimation-3.0.2.module\">\n            <sha256 value=\"0e6baa323f92996117239940fd57833cd59db73d4a67262913b015207792827f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.penfeizhou.android.animation\" name=\"frameanimation\" version=\"3.0.4\">\n         <artifact name=\"frameanimation-3.0.4.aar\">\n            <sha256 value=\"fab0d0339cc3928a9a04d9481649709cac0e791bcd80d08b3b19faec6284d6b4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"frameanimation-3.0.4.module\">\n            <sha256 value=\"cb01d90c7c63ee9a24f30ebdc480e1f6fd7613a99af2ac64416a569def3edb6c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.penfeizhou.android.animation\" name=\"gif\" version=\"2.23.0\">\n         <artifact name=\"gif-2.23.0-sources.jar\">\n            <sha256 value=\"494c9a24deca27b7296710639eb1de7fa9c340e5b3dda744637203e085858434\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gif-2.23.0.aar\">\n            <sha256 value=\"d6325c7491ac1c85c0c33f97ce6075974c9db264e2b5b3d9d1377b87216ef71f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gif-2.23.0.pom\">\n            <sha256 value=\"fd29111e4591f079498765c66461b297a54fcbef75cd3b70c1d142b9d3186dc7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.penfeizhou.android.animation\" name=\"gif\" version=\"3.0.2\">\n         <artifact name=\"gif-3.0.2.aar\">\n            <sha256 value=\"71527821306cd7b8d8691cd3e9c5aabf45ff6e937c2c602241a5f5fac3f765d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gif-3.0.2.module\">\n            <sha256 value=\"f3e0dd7f9d2d233fa7348389eae80fc260a1cae881e8802f0e3632b2b966922a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.penfeizhou.android.animation\" name=\"gif\" version=\"3.0.4\">\n         <artifact name=\"gif-3.0.4.aar\">\n            <sha256 value=\"2c92c3d0e6a4b190fa1a74e2540314a1bacbda895c85a36cf8e6ea25a50ebaea\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gif-3.0.4.module\">\n            <sha256 value=\"e8fcb1e3e67925d5e35a3d425855576bd6999726446bf00eb360b7dedc02a757\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.penfeizhou.android.animation\" name=\"glide-plugin\" version=\"2.23.0\">\n         <artifact name=\"glide-plugin-2.23.0-sources.jar\">\n            <sha256 value=\"6e3a856d6f1957cd6b1cd8b935db6628793bf500f555b351dd1ba37f4723da53\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"glide-plugin-2.23.0.aar\">\n            <sha256 value=\"8725a62abd5efa7e3262f738e1dfef4c26b580fc4cd07037c51b2f4506cd17f3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"glide-plugin-2.23.0.pom\">\n            <sha256 value=\"b7e1db7b75a07490e6985a55b4b2dce4f6f46d8c659de9453985fd0d44e55b2f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.penfeizhou.android.animation\" name=\"glide-plugin\" version=\"3.0.2\">\n         <artifact name=\"glide-plugin-3.0.2.aar\">\n            <sha256 value=\"3a181f2d358854cae41f573d4427ec137446cd905528232b94acb4a5a04b8c92\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"glide-plugin-3.0.2.module\">\n            <sha256 value=\"4c0df1b99988441e0d99bbe18450e331a7576f21ab36e4714c31e33d8db6a6aa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.github.penfeizhou.android.animation\" name=\"glide-plugin\" version=\"3.0.4\">\n         <artifact name=\"glide-plugin-3.0.4.aar\">\n            <sha256 value=\"3a181f2d358854cae41f573d4427ec137446cd905528232b94acb4a5a04b8c92\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"glide-plugin-3.0.4.module\">\n            <sha256 value=\"a497d5a22065f74ee0ed189f583e2e412952fec4f66378e1d988a141aebb4dc1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.android\" name=\"annotations\" version=\"4.1.1.4\">\n         <artifact name=\"annotations-4.1.1.4.jar\">\n            <sha256 value=\"ba734e1e84c09d615af6a09d33034b4f0442f8772dec120efb376d86a565ae15\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-4.1.1.4.pom\">\n            <sha256 value=\"e4bb54753c36a27a0e5d70154a5034fedd8feac4282295034bfd483d6c7aae78\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.android.material\" name=\"material\" version=\"1.12.0\">\n         <artifact name=\"material-1.12.0.aar\">\n            <sha256 value=\"4a672941b626b9ab91ae893ed22598ea53ad69125c858c0a59fa9b90daa5cb08\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"material-1.12.0.module\">\n            <sha256 value=\"9ddba12b5c80444c45413f043b34fd3127c2493c506a9db1ecbfe63039d83e34\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.api.grpc\" name=\"proto-google-common-protos\" version=\"2.17.0\">\n         <artifact name=\"proto-google-common-protos-2.17.0.jar\">\n            <sha256 value=\"4ef1fe0c327fc1521d1d753b0b1c4a875a54bd14ebded3afff0ca395320b6ea9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-google-common-protos-2.17.0.pom\">\n            <sha256 value=\"3f028153a585c59f558b3e43a7c9809a601a8bb5e91061d6c658fffa24cb8e26\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.api.grpc\" name=\"proto-google-common-protos\" version=\"2.48.0\">\n         <artifact name=\"proto-google-common-protos-2.48.0.jar\">\n            <sha256 value=\"43ec7807459aaa4012e838a1be4ef2d590cf233305da60af5b54f08ec8cf2302\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"proto-google-common-protos-2.48.0.pom\">\n            <sha256 value=\"45eb927b22685fc11bfab69ce6ad3b439f72d816a3a7de46bd23f4ed19bf89c3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.auto\" name=\"auto-common\" version=\"0.11\">\n         <artifact name=\"auto-common-0.11.jar\">\n            <sha256 value=\"ec668cd50a3a66a5def17e6ae67423542e514181c0e9ab5b11959c0ac9c4222a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"auto-common-0.11.pom\">\n            <sha256 value=\"dee67bf309da1e0a241430de26bb7e762eff90de0826ff1c705d88208f5e1903\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.auto\" name=\"auto-common\" version=\"1.2.1\">\n         <artifact name=\"auto-common-1.2.1.jar\">\n            <sha256 value=\"f43f29fe2a6ebaf04b2598cdeec32a4e346d49a9404e990f5fc19c19f3a28d0e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"auto-common-1.2.1.pom\">\n            <sha256 value=\"13b4b50062949f8b1343927c581536d3bb051b8afea509aa6f902f4de28bc1b2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.auto\" name=\"auto-parent\" version=\"6\">\n         <artifact name=\"auto-parent-6.pom\">\n            <sha256 value=\"05f740c6648165db00cf618dd56c200c4725e358e6d54f5853e0bec15734ea0a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.auto\" name=\"auto-parent\" version=\"7\">\n         <artifact name=\"auto-parent-7.pom\">\n            <sha256 value=\"a46426fccb5d32705ad9cbbc996f786bd048cc8cbdd21db046500169f15a4356\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.auto.service\" name=\"auto-service\" version=\"1.1.1\">\n         <artifact name=\"auto-service-1.1.1.jar\">\n            <sha256 value=\"1f48f451503e623daba7d9ed368cca0f81e1e3815653a4560113e12c0129ebd5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"auto-service-1.1.1.pom\">\n            <sha256 value=\"0c53c2f87949b3be8f1c8c67bb76c08ed4f4beb8dbaa475c32ba593d46176317\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.auto.service\" name=\"auto-service-aggregator\" version=\"1.0\">\n         <artifact name=\"auto-service-aggregator-1.0.pom\">\n            <sha256 value=\"c97acb57d385e70257643123aa824c7d343613fe93035529c0868e949cb60461\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.auto.service\" name=\"auto-service-aggregator\" version=\"1.0.1\">\n         <artifact name=\"auto-service-aggregator-1.0.1.pom\">\n            <sha256 value=\"0481460db59903362b26fabd3bdcd5ec200750f9391bbb6502fe3c7dc2df3e4c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.auto.service\" name=\"auto-service-aggregator\" version=\"1.1.1\">\n         <artifact name=\"auto-service-aggregator-1.1.1.pom\">\n            <sha256 value=\"e2dc3e263a5db0cc8172fb2eb9bcd232acecfdc96e817103eab3c8d9f1900c6a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.auto.service\" name=\"auto-service-annotations\" version=\"1.0\">\n         <artifact name=\"auto-service-annotations-1.0.pom\">\n            <sha256 value=\"9797b771f59106b9ab87a8cdd98a142173ad8e4790fc5e6bfc79316d8732c701\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.auto.service\" name=\"auto-service-annotations\" version=\"1.0.1\">\n         <artifact name=\"auto-service-annotations-1.0.1.jar\">\n            <sha256 value=\"c7bec54b7b5588b5967e870341091c5691181d954cf2039f1bf0a6eeb837473b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"auto-service-annotations-1.0.1.pom\">\n            <sha256 value=\"e9bbf1b3d66ca18004a6a07a20dbfa10ca2ce8367348f741de2fe8fefce68cc2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.auto.service\" name=\"auto-service-annotations\" version=\"1.1.1\">\n         <artifact name=\"auto-service-annotations-1.1.1.jar\">\n            <sha256 value=\"16a76dd00a2650568447f5d6e3a9e2c809d9a42367d56b45215cfb89731f4d24\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"auto-service-annotations-1.1.1.pom\">\n            <sha256 value=\"1659fd0a25cea9fa9abfb18deb9d7b180cce3aceab16ff9e625461567e44a2df\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.auto.value\" name=\"auto-value-annotations\" version=\"1.10.4\">\n         <artifact name=\"auto-value-annotations-1.10.4-sources.jar\">\n            <sha256 value=\"61a433f015b12a6cf4ecff227c7748486ff8f294ffe9d39827b382ade0514d0a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"auto-value-annotations-1.10.4.jar\">\n            <sha256 value=\"e1c45e6beadaef9797cb0d9afd5a45621ad061cd8632012f85582853a3887825\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"auto-value-annotations-1.10.4.pom\">\n            <sha256 value=\"73a5b8515f85f88c4089f7ff4a43cd1795a481fdab93fa9050b13cfa1a8d25f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.auto.value\" name=\"auto-value-annotations\" version=\"1.11.0\">\n         <artifact name=\"auto-value-annotations-1.11.0.jar\">\n            <sha256 value=\"5a055ce4255333b3346e1a8703da5bf8ff049532286fdcd31712d624abe111dd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"auto-value-annotations-1.11.0.pom\">\n            <sha256 value=\"2aec16e34ea3e011621a0322f4f36f8f9bf988bb54462b5570976e89ea07b122\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.auto.value\" name=\"auto-value-annotations\" version=\"1.6.2\">\n         <artifact name=\"auto-value-annotations-1.6.2.jar\">\n            <sha256 value=\"b48b04ddba40e8ac33bf036f06fc43995fc5084bd94bdaace807ce27d3bea3fb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"auto-value-annotations-1.6.2.pom\">\n            <sha256 value=\"1c76cd462fc96e7aa96dc70ce82f0d54063d6df16db35c9c7d9cc0d1a99d3fff\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.auto.value\" name=\"auto-value-annotations\" version=\"1.6.3\">\n         <artifact name=\"auto-value-annotations-1.6.3.jar\">\n            <sha256 value=\"0e951fee8c31f60270bc46553a8586001b7b93dbb12aec06373aa99a150392c0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"auto-value-annotations-1.6.3.pom\">\n            <sha256 value=\"e1fc780f7ee025e662b3da72723dbe2ac8dac0a2f8920f265315c4e1be3d765c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.auto.value\" name=\"auto-value-parent\" version=\"1.10.4\">\n         <artifact name=\"auto-value-parent-1.10.4.pom\">\n            <sha256 value=\"bec3a19e4ddc8b6406672333cc505b9e0cb6b3558bb242314869bb6e1d688d30\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.auto.value\" name=\"auto-value-parent\" version=\"1.11.0\">\n         <artifact name=\"auto-value-parent-1.11.0.pom\">\n            <sha256 value=\"5a0d1d718552e8a45dcce0128d1b6b9623fa971a82cd245753233ba7208cb29d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.auto.value\" name=\"auto-value-parent\" version=\"1.6.2\">\n         <artifact name=\"auto-value-parent-1.6.2.pom\">\n            <sha256 value=\"27b640c82179f5cff62009c0b72033d9bc60f60e9902a66802274b7fe37fc81c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.auto.value\" name=\"auto-value-parent\" version=\"1.6.3\">\n         <artifact name=\"auto-value-parent-1.6.3.pom\">\n            <sha256 value=\"e59df5732b4cb34d5727181446f9ded9ce4425131a0a1062519eea196de4d8a1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.code.findbugs\" name=\"jsr305\" version=\"2.0.2\">\n         <artifact name=\"jsr305-2.0.2.jar\">\n            <sha256 value=\"1e7f53fa5b8b5c807e986ba335665da03f18d660802d8bf061823089d1bee468\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"jsr305-2.0.2.pom\">\n            <sha256 value=\"8bc2c4f67a6396a7333dece2d1f991ca7d0aea48b29592265e2239be91972579\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.code.findbugs\" name=\"jsr305\" version=\"3.0.2\">\n         <artifact name=\"jsr305-3.0.2-sources.jar\">\n            <sha256 value=\"1c9e85e272d0708c6a591dc74828c71603053b48cc75ae83cce56912a2aa063b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"jsr305-3.0.2.jar\">\n            <sha256 value=\"766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"jsr305-3.0.2.pom\">\n            <sha256 value=\"19889dbdf1b254b2601a5ee645b8147a974644882297684c798afe5d63d78dfe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.code.gson\" name=\"gson\" version=\"2.10.1\">\n         <artifact name=\"gson-2.10.1.jar\">\n            <sha256 value=\"4241c14a7727c34feea6507ec801318a3d4a90f070e4525681079fb94ee4c593\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gson-2.10.1.pom\">\n            <sha256 value=\"d2b115634f5c085db4b9c9ffc2658e89e231fdbfbe2242121a1cd95d4d948dd7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.code.gson\" name=\"gson\" version=\"2.11.0\">\n         <artifact name=\"gson-2.11.0.jar\">\n            <sha256 value=\"57928d6e5a6edeb2abd3770a8f95ba44dce45f3b23b7a9dc2b309c581552a78b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gson-2.11.0.pom\">\n            <sha256 value=\"c0e547bea998888e6e25c5886a90e762272bc88b5275343dd2c05ded6ca2e360\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.code.gson\" name=\"gson\" version=\"2.8.9\">\n         <artifact name=\"gson-2.8.9.jar\">\n            <sha256 value=\"d3999291855de495c94c743761b8ab5176cfeabe281a5ab0d8e8d45326fd703e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gson-2.8.9.pom\">\n            <sha256 value=\"afded6e6a690fbf3ad4ae65ada397f0a90a5f630b303d1b741b9c97926fdd4de\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.code.gson\" name=\"gson\" version=\"2.9.0\">\n         <artifact name=\"gson-2.9.0.jar\">\n            <sha256 value=\"c96d60551331a196dac54b745aa642cd078ef89b6f267146b705f2c2cbef052d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"gson-2.9.0.pom\">\n            <sha256 value=\"7190d0b07f278e9f4c603f44e543940f81cf1a2559f851c6f298c9bb2be2978c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.code.gson\" name=\"gson-parent\" version=\"2.10.1\">\n         <artifact name=\"gson-parent-2.10.1.pom\">\n            <sha256 value=\"4248e0882426c615182385d6086c3ef3262e769957189e29306280b85482b833\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.code.gson\" name=\"gson-parent\" version=\"2.11.0\">\n         <artifact name=\"gson-parent-2.11.0.pom\">\n            <sha256 value=\"8acb1f3b72a6f026916ac0735bad9aab0293d527edb7b365327def13a9367b7a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.code.gson\" name=\"gson-parent\" version=\"2.8.9\">\n         <artifact name=\"gson-parent-2.8.9.pom\">\n            <sha256 value=\"b16e026e63427c1972ad0fc68703ec379b1576e411ba49c32fa9a31ab0bbcffb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.code.gson\" name=\"gson-parent\" version=\"2.9.0\">\n         <artifact name=\"gson-parent-2.9.0.pom\">\n            <sha256 value=\"af781c9a5766ffea311a0df0536576a64decc661aa110c4de5c73ac8bf434424\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.crypto.tink\" name=\"tink\" version=\"1.7.0\">\n         <artifact name=\"tink-1.7.0.jar\">\n            <sha256 value=\"88970a456a08ba4c66b01b23e5846ca1095cc14e54cb48363e5d2e15a1307308\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tink-1.7.0.pom\">\n            <sha256 value=\"2aee3523715f8f2cd10b2603c8d19e561ac758310b7e2c9853946d2c5e7b4bf7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger\" version=\"2.28.3\">\n         <artifact name=\"dagger-2.28.3.jar\">\n            <sha256 value=\"f1dd23f8ae34a8e91366723991ead0d6499d1a3e9163ce550c200b02d76a872b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-2.28.3.pom\">\n            <sha256 value=\"265ba959a8e13c3a06133f04b539169c1018daffd4d33f53c453ab4cb386f570\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger\" version=\"2.48\">\n         <artifact name=\"dagger-2.48.jar\">\n            <sha256 value=\"1fa226d2b4a02cc80950fa4d49a4a235cc8eced499b581fc358a55446a83f579\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-2.48.pom\">\n            <sha256 value=\"75fd748573e58075b1306f7fae19cf5b02c0b0850908f765131b092a1156a944\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger\" version=\"2.51.1\">\n         <artifact name=\"dagger-2.51.1-sources.jar\">\n            <sha256 value=\"77e5cfde38b17973abca3f385bedf337e9f19a260665d5d8c447f34e46865cf6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-2.51.1.jar\">\n            <sha256 value=\"c3891a4c4a4e48682888ca321eaf8497004b286e1d9a2936867373219f7dd86d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-2.51.1.pom\">\n            <sha256 value=\"b74358f917a90d1ace285058b9588fc0545e85b4f6289059e77a7780e71de97d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger\" version=\"2.52\">\n         <artifact name=\"dagger-2.52.jar\">\n            <sha256 value=\"dfb8e83020786daefbd64335ce0e0ebf01646a1b407fb77a27e052baf42df458\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-2.52.pom\">\n            <sha256 value=\"5cb60843f46bbccf97bd832d5490d26ab192af2e663fad7e5971969bf20fb94e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger\" version=\"2.53\">\n         <artifact name=\"dagger-2.53.jar\">\n            <sha256 value=\"98a6b1673808fe8e6051bc212d002158a8141255753a99cdc06aa01be791580d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-2.53.pom\">\n            <sha256 value=\"57d60e278d0fd702c406284ba7f931193c0b953f47b3a990c7c76e424b0e0587\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger\" version=\"2.53.1\">\n         <artifact name=\"dagger-2.53.1.jar\">\n            <sha256 value=\"19680b0f42baa7f9414dacae8663244d323d084a6ee5594ad115a17f3be37c05\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-2.53.1.pom\">\n            <sha256 value=\"bba8c296600a1d4859cceec63d403c149c474935ead57a51337e443a56473244\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger\" version=\"2.54\">\n         <artifact name=\"dagger-2.54.jar\">\n            <sha256 value=\"7ab0d8278a532888de19025dc6ee70a80ecd4567778a6a7e7ec256a2073e40a3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-2.54.pom\">\n            <sha256 value=\"af43413fd91fc49532884ca32191ab31bec609c344d4939aece9d3efef699f81\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger\" version=\"2.55\">\n         <artifact name=\"dagger-2.55.jar\">\n            <sha256 value=\"adc6d9d27e33f8589bcfd3d9ddffc740c85cec3cf4e61b92aef8aa80100f08c0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-2.55.pom\">\n            <sha256 value=\"d17d162fb35c80a641ed62c0d56fedf2eb41cc5d06436c64e45a7ad82038fcda\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger\" version=\"2.56\">\n         <artifact name=\"dagger-2.56.jar\">\n            <sha256 value=\"43957d069c249a086e0bceb5be503d0bcafff7679f492d0d88642c8f9afb3b1f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-2.56.pom\">\n            <sha256 value=\"cc9c7b015128358a1f37e479a206b06dc7e5f1717d9e0e771847bf4d579e4b94\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger\" version=\"2.56.1\">\n         <artifact name=\"dagger-2.56.1.jar\">\n            <sha256 value=\"f85d2c6c5a1cef9f15a5801abb2a93c9cd16d1c8a9ff2ab01d60703d62e258d7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-2.56.1.pom\">\n            <sha256 value=\"1dd9ca58f16e7956b922b7d0181e2a0d08ba5e54013caebef379cd664b2d0100\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger\" version=\"2.56.2\">\n         <artifact name=\"dagger-2.56.2.jar\">\n            <sha256 value=\"e016933f0cbd5fb9978739a4241f57e31525573db0d9b8aa9b7e72aadc54f33e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-2.56.2.pom\">\n            <sha256 value=\"22341c621382ca5b83b12c3c671d1f59a4354a27db637060238b07d735a54231\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-compiler\" version=\"2.51.1\">\n         <artifact name=\"dagger-compiler-2.51.1.jar\">\n            <sha256 value=\"14cf2def1c4c8cd3b977840e297b463191d537cd1c8330992ca5c0b341a641ad\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-compiler-2.51.1.pom\">\n            <sha256 value=\"101708ef85b7ffd8b34e66a022dd9d6f92bb26130bee38b0049db680cdd06a5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-compiler\" version=\"2.52\">\n         <artifact name=\"dagger-compiler-2.52.jar\">\n            <sha256 value=\"498446a0474aa0a94da765ab8b78ff2516f676632e6220e555114c549579c35e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-compiler-2.52.pom\">\n            <sha256 value=\"960ef75577f2188e2710233bdb80609f1f4a47576c3577bcf04541b0d1ee5a0d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-compiler\" version=\"2.53\">\n         <artifact name=\"dagger-compiler-2.53.jar\">\n            <sha256 value=\"c2680f1341f1246e4cf650cf8bf5d2c832d93a2745b5093551eccad81da95ea0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-compiler-2.53.pom\">\n            <sha256 value=\"d795897f5d1d79c93923a64c956e5802b6599768c8cf68966d1d25a28d51c257\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-compiler\" version=\"2.53.1\">\n         <artifact name=\"dagger-compiler-2.53.1.jar\">\n            <sha256 value=\"acd6737e2b2b8fb5a5919e68463b611c6ee5477afd936c791f54b86aa7fd7047\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-compiler-2.53.1.pom\">\n            <sha256 value=\"44a51b163641b77594b7716524f3ff9c0edd4e86df2f569757ce1e7c93658355\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-compiler\" version=\"2.54\">\n         <artifact name=\"dagger-compiler-2.54.jar\">\n            <sha256 value=\"f3eab7ab8298f5d4816331b7e591aa461f3f90690ccd0d190f7d8a6084bd064d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-compiler-2.54.pom\">\n            <sha256 value=\"558d6a5d8024f0ae8302717a6999855040280fbaff24b2a29271c994cd524d9e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-compiler\" version=\"2.55\">\n         <artifact name=\"dagger-compiler-2.55.jar\">\n            <sha256 value=\"11f1e98acc379eebbc574252d89195431a1564240bfc29e0c152021138ad6eb5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-compiler-2.55.pom\">\n            <sha256 value=\"28b52c8a12be79d7782bd356f1d47be5ad5c0f6b72532328f168a5a93504336f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-compiler\" version=\"2.56\">\n         <artifact name=\"dagger-compiler-2.56.jar\">\n            <sha256 value=\"3f5f487f53bae2490497bf6020b54d6f4c2a1519e6cd9502c7a68d76861ba6f4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-compiler-2.56.pom\">\n            <sha256 value=\"01d6720f3e7f1d2b28893a9850ba2d5c23edfe998c71850b3ebb3d2d9828f3e9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-compiler\" version=\"2.56.1\">\n         <artifact name=\"dagger-compiler-2.56.1.jar\">\n            <sha256 value=\"afb380a81cc6486afd444b3fa2bc529da94c02788b3ea3688f6336cfdf748217\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-compiler-2.56.1.pom\">\n            <sha256 value=\"0ac2be655d951d8e6a2a76840f3cd6c1f997edc5b3bf2908025fdbc38180d9fd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-compiler\" version=\"2.56.2\">\n         <artifact name=\"dagger-compiler-2.56.2.jar\">\n            <sha256 value=\"05054a73ea20041e3d6dc807bf7924f20f74fc68c64cc19bfc7f5fb9028bf68f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-compiler-2.56.2.pom\">\n            <sha256 value=\"34b12df495a7b222f92dd9dac2b1a28e111cd489f9efa1c0fb93753ad979c1c9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-lint-aar\" version=\"2.51.1\">\n         <artifact name=\"dagger-lint-aar-2.51.1.aar\">\n            <sha256 value=\"df2cce8977dd5fd4039377f59cd01ae845d95ccf7de431e8a4b0671b5d40e017\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-lint-aar-2.51.1.pom\">\n            <sha256 value=\"22ff4f921c019307d62cdb7a2dd50ddc7d67dfeb2fe5dba3b607b7d7ab78dd85\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-lint-aar\" version=\"2.52\">\n         <artifact name=\"dagger-lint-aar-2.52.aar\">\n            <sha256 value=\"ef0a0cb49af7181d0b2edbbd332cba733a5e07b7d53a8aede109655b2701df1a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-lint-aar-2.52.pom\">\n            <sha256 value=\"a03609549cdab09de118d99d0bac37876d8b22a2364c18ebf4b07fde19263db8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-lint-aar\" version=\"2.53\">\n         <artifact name=\"dagger-lint-aar-2.53.aar\">\n            <sha256 value=\"9148af30ecd09a3ac6df69a39207b9402e860059f9163d526e5701d0f733d0f2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-lint-aar-2.53.pom\">\n            <sha256 value=\"d2babb62093673c0d797593f2082a02a488c071104c088c2d10eb5dcf52e800c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-lint-aar\" version=\"2.53.1\">\n         <artifact name=\"dagger-lint-aar-2.53.1.aar\">\n            <sha256 value=\"67efeca91ca336f5dff86f4abad4c768feb37e9209007e9875c010b34422b60c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-lint-aar-2.53.1.pom\">\n            <sha256 value=\"ff814784c9ec5f38507ceded02d3d2ec41d51e79b516dde928b3bec68fbac305\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-lint-aar\" version=\"2.54\">\n         <artifact name=\"dagger-lint-aar-2.54.aar\">\n            <sha256 value=\"3e4e0d15a0a9d3c1ad601749403728c52546505c772f52b58f6aa3f11d7ad21c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-lint-aar-2.54.pom\">\n            <sha256 value=\"413391633996ca1435a59985e5f3ca25190603e323d78d3b580777e04648d69c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-lint-aar\" version=\"2.55\">\n         <artifact name=\"dagger-lint-aar-2.55.aar\">\n            <sha256 value=\"68f4fa123dc99bf66d1d53a23c2894589cd835549bbabf01b1183a7da42119bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-lint-aar-2.55.pom\">\n            <sha256 value=\"d1ccb6755a0841c5b882c4a8333ea19e3e533542b1da351fb70ed411a89e01a4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-lint-aar\" version=\"2.56\">\n         <artifact name=\"dagger-lint-aar-2.56.aar\">\n            <sha256 value=\"a120f6a411276efe1ae4f06b461a0924c94c50943a171ec87a68829cf7d77be3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-lint-aar-2.56.pom\">\n            <sha256 value=\"2a75b1df063d665617d802aec270e9a0bbd6ed38f44b0e5e8665eb7cbd9131cb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-lint-aar\" version=\"2.56.1\">\n         <artifact name=\"dagger-lint-aar-2.56.1.aar\">\n            <sha256 value=\"c4ccb174ab5c5f5c6730518e7e8ae13c900bc2dea95dd83106c92b88dc3ccaf7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-lint-aar-2.56.1.pom\">\n            <sha256 value=\"c3d505d479961e73cbb8b515d299c96b540f6455f5edc1ffb99bcbe49f1a2f1f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-lint-aar\" version=\"2.56.2\">\n         <artifact name=\"dagger-lint-aar-2.56.2.aar\">\n            <sha256 value=\"9b841400f776c0ca8f424a5a4b630f45e265ed8e5d2abb3e4603d77cd0323994\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-lint-aar-2.56.2.pom\">\n            <sha256 value=\"ff000c2896bdd542fe10546d03c255cc1de1193a969616970c52946d37b7740e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-spi\" version=\"2.51.1\">\n         <artifact name=\"dagger-spi-2.51.1.jar\">\n            <sha256 value=\"deb52030b92b27c5dcd76b2c0747f1cf105b60939f6073b43eb06cfe7c9ba601\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-spi-2.51.1.pom\">\n            <sha256 value=\"6a5a7219b32842cdd9e81bec248fc27bf4951b9d8e82df589567c2a5a5bcdc7e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-spi\" version=\"2.52\">\n         <artifact name=\"dagger-spi-2.52.jar\">\n            <sha256 value=\"914d26e8764bc47e63990643a31c227543dbce47411d79a822f9e348159a4743\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-spi-2.52.pom\">\n            <sha256 value=\"3d7bda017e7783aedab7aac68dd333e81a3dd3fff84da42c1c6409b9cd985373\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-spi\" version=\"2.53\">\n         <artifact name=\"dagger-spi-2.53.jar\">\n            <sha256 value=\"701ee50a161374e340aacdb7d0a0867029d77015da01fea48227e08aca0eb272\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-spi-2.53.pom\">\n            <sha256 value=\"5f30bb3906b878874eb543148ad81823f46d385274e7e8ded8be2f4d4925f34d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-spi\" version=\"2.53.1\">\n         <artifact name=\"dagger-spi-2.53.1.jar\">\n            <sha256 value=\"d645593bf5be5185a121e28093f2a2305a92415e70a08e7018898abb258af0fc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-spi-2.53.1.pom\">\n            <sha256 value=\"50a900b2945debf83ae893e0c53ed3479f264fa1720a54d3a0bdce44725f0eec\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-spi\" version=\"2.54\">\n         <artifact name=\"dagger-spi-2.54.jar\">\n            <sha256 value=\"7a990e528ea259b439cdd12ec8164519d8b85a57939a8d7c56a3aaa707e3b269\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-spi-2.54.pom\">\n            <sha256 value=\"6cff4fc977447fe01cddb617aa423f7fcf825431191f89b9049380449742dd0d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-spi\" version=\"2.55\">\n         <artifact name=\"dagger-spi-2.55.jar\">\n            <sha256 value=\"ab0c8ed833fd6ede58146685a52aeff01c6a1a9232be99e77047a0163f147d5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-spi-2.55.pom\">\n            <sha256 value=\"af98178d0f0237dc5a0ca5ef65795a7931deeb80e55446f6c533bf2be8533584\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-spi\" version=\"2.56\">\n         <artifact name=\"dagger-spi-2.56.jar\">\n            <sha256 value=\"08659181d5456b6fc1219c3637e2a360d8422efe04ba541a8f75d497c3b39b4c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-spi-2.56.pom\">\n            <sha256 value=\"fb7331244125ca134834a9a879456cf2c60a50466b8b48d92d3ab357e877fd0c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-spi\" version=\"2.56.1\">\n         <artifact name=\"dagger-spi-2.56.1.jar\">\n            <sha256 value=\"8e790c266e8b0bcb126beb629e2b56d3ab25c2d6a7e7abeed9c5cf3d3f864718\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-spi-2.56.1.pom\">\n            <sha256 value=\"9cbc1bc8cc997f7b1d369e78e615ac58617610b258bdcf26017a792c7ee3b462\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"dagger-spi\" version=\"2.56.2\">\n         <artifact name=\"dagger-spi-2.56.2.jar\">\n            <sha256 value=\"14a7d83a113a07119adb65385f60d6f872b22aa4645b19fb5b18861fcab1a651\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"dagger-spi-2.56.2.pom\">\n            <sha256 value=\"ffbaa5986ead4b211df3aacccefcfb344bd4203b27c547dad809a7904cb45712\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-android\" version=\"2.51.1\">\n         <artifact name=\"hilt-android-2.51.1-sources.jar\">\n            <sha256 value=\"0d03f9e2a8d227073e6cf89206713941930460d0b9e1c99665c4b9a08e19464f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-android-2.51.1.aar\">\n            <sha256 value=\"ede664ffc5ead06bb3ad722cf27a2b172d77b68b65da29de8053e9eb7c8e1832\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-android-2.51.1.pom\">\n            <sha256 value=\"a82a80096058057162a3a720096d943fea78a657c9f49c25bdf151637cd0d52f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-android\" version=\"2.52\">\n         <artifact name=\"hilt-android-2.52.aar\">\n            <sha256 value=\"51efd04ac1bb0e81b56a8979b5a99c41e09a410aef6b86b1a25630db0c79c55d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-android-2.52.pom\">\n            <sha256 value=\"dcfa341b2a78bbb69950b1e1b85a1f63d43e4eddf7e9b301b7af1bd1807d67fc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-android\" version=\"2.53\">\n         <artifact name=\"hilt-android-2.53.aar\">\n            <sha256 value=\"e2de076ea051f544a76185fdb2d8b2f6fe124b3acbd1e53d2439654203264921\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-android-2.53.pom\">\n            <sha256 value=\"988f2d92ee853f00788d13105aca08d5858c8133efd266b1110becedef1adcb0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-android\" version=\"2.53.1\">\n         <artifact name=\"hilt-android-2.53.1.aar\">\n            <sha256 value=\"51c33357942ae141c05ad58207d1d8bbbe5e77986881ecb0e2523c29570e0674\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-android-2.53.1.pom\">\n            <sha256 value=\"2186612b5b232885dcef077d0e7780035053acdede60e84eca7f8b798c070b4f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-android\" version=\"2.54\">\n         <artifact name=\"hilt-android-2.54.aar\">\n            <sha256 value=\"1f7337855d2bd57c7de47bb5e4ee5712d6196126dd40bd8bec5a2fbae1494f4b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-android-2.54.pom\">\n            <sha256 value=\"45e459626cb77e76aa09d908e86ade4c35e3c0b67cb0e317148be2bf5c434136\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-android\" version=\"2.55\">\n         <artifact name=\"hilt-android-2.55.aar\">\n            <sha256 value=\"4a6247a9d3de2af734a85e5ffcea583b14cda48e087168ea626b631d85457272\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-android-2.55.pom\">\n            <sha256 value=\"1b9651f1d35ed10305e1897a9f5cd973bcd5e3bc569853357ed203a94140a260\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-android\" version=\"2.56\">\n         <artifact name=\"hilt-android-2.56.aar\">\n            <sha256 value=\"402ac5d80666d1851d05e62231cdac5a686025922e4ac129a1c5e112e28f466e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-android-2.56.pom\">\n            <sha256 value=\"49d40716f625ccf252ede981244b59ee165e141089907b3cd0ba8b30909e8b93\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-android\" version=\"2.56.1\">\n         <artifact name=\"hilt-android-2.56.1.aar\">\n            <sha256 value=\"96b7e375a7adf979fbd4c3bd02180dda9d29699dd9fe879549544fc7ef12171d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-android-2.56.1.pom\">\n            <sha256 value=\"62afe5330c2440161c403cc8cb74a5c199f6bfb195e7a9ec85cddca03e2c0c9b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-android\" version=\"2.56.2\">\n         <artifact name=\"hilt-android-2.56.2.aar\">\n            <sha256 value=\"df06e600034ac9de594b9bfc5a9f11f9e0fc220a14f69bb132b856784b406a30\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-android-2.56.2.pom\">\n            <sha256 value=\"4fff10ae4d03e39854a1f401a51120ba3fd84b4176603ab095c847711b8675e0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-android-gradle-plugin\" version=\"2.51.1\">\n         <artifact name=\"hilt-android-gradle-plugin-2.51.1.jar\">\n            <sha256 value=\"cef1273ccfacb7b29f0330a7eb5dcb85cc049fcdc14090027043146011fd3ff1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-android-gradle-plugin-2.51.1.pom\">\n            <sha256 value=\"f5f5d74345a70ed771aec0f7c5a50e2df802b92fb874666ffbf1c8ada4ea6b41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-android-gradle-plugin\" version=\"2.52\">\n         <artifact name=\"hilt-android-gradle-plugin-2.52.jar\">\n            <sha256 value=\"4bb6cc147bf7869ca3754d6dfaebe834c5637adb0babefa48cb091a9517babcb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-android-gradle-plugin-2.52.pom\">\n            <sha256 value=\"dac5bfad3299613626238a83247e157ef8c128d169bc3c774b02ca30c581d09d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-android-gradle-plugin\" version=\"2.53\">\n         <artifact name=\"hilt-android-gradle-plugin-2.53.jar\">\n            <sha256 value=\"34d4ffb18abe34ebe01e4c6d2b6e21a2aaedb86341e75133b5c96cde994a7ecc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-android-gradle-plugin-2.53.pom\">\n            <sha256 value=\"3afd7732ed4e36b58c8e97c4c84fcf8f7246435cba1aac3dfeb248bf33d94cd2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-android-gradle-plugin\" version=\"2.53.1\">\n         <artifact name=\"hilt-android-gradle-plugin-2.53.1.jar\">\n            <sha256 value=\"0f11363a09fc286ab812349491f96b992421b443739a84e4b79b0d60d23b0a06\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-android-gradle-plugin-2.53.1.pom\">\n            <sha256 value=\"103df0818f97f112fa72c70a52ad9506ceea117f75f5068236a3719c75c48c51\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-android-gradle-plugin\" version=\"2.54\">\n         <artifact name=\"hilt-android-gradle-plugin-2.54.jar\">\n            <sha256 value=\"ae5a0233596a68e5160df373c0ad7dcf92c7de5d830d5d38e24ad10e323d1f4a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-android-gradle-plugin-2.54.pom\">\n            <sha256 value=\"7643ece6dda2e24e16fe7fa2a2117b9f0c7d2ba4c0636282b1daa1c41a1f0434\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-android-gradle-plugin\" version=\"2.55\">\n         <artifact name=\"hilt-android-gradle-plugin-2.55.jar\">\n            <sha256 value=\"c1bd43b8a9925e7f5300e66400cfeb677602c3a5f6e58dce7844106b43612f03\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-android-gradle-plugin-2.55.pom\">\n            <sha256 value=\"11c8f7cf2dd8f505673b0239da74a3499d95cb945527327711e7ae9fbfa0cf96\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-android-gradle-plugin\" version=\"2.56\">\n         <artifact name=\"hilt-android-gradle-plugin-2.56.jar\">\n            <sha256 value=\"5f9d7f5711affbfdb85f7fcae585ca6bb59a82c08e99dc9b379dc275bb3915be\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-android-gradle-plugin-2.56.pom\">\n            <sha256 value=\"6a8131c75d89b5501a15f399c4812bf7ed22fde6a3022ee9df79c4ac7f40aff9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-android-gradle-plugin\" version=\"2.56.1\">\n         <artifact name=\"hilt-android-gradle-plugin-2.56.1.jar\">\n            <sha256 value=\"50c70921b31dc9f6355f55edb03962a0ba2d88757cf459ec276432532903b0b9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-android-gradle-plugin-2.56.1.pom\">\n            <sha256 value=\"5e388b74354d2a276a36db65a917ec380ef428c51e57f03a06150f857c1d5c03\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-android-gradle-plugin\" version=\"2.56.2\">\n         <artifact name=\"hilt-android-gradle-plugin-2.56.2.jar\">\n            <sha256 value=\"e59e152382f30def03c6c7f371bd8343e1925f7702b1fe5f9b7f442b4436c286\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-android-gradle-plugin-2.56.2.pom\">\n            <sha256 value=\"c7338f4fea1e8e771b8530ad3688f4a58ff768f4f60b49c559bd42ccc7105a92\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-compiler\" version=\"2.51.1\">\n         <artifact name=\"hilt-compiler-2.51.1.jar\">\n            <sha256 value=\"d8f07ad8d9aedf4ea2fe0aab486321a27609a848f2df72885c416734ec17ed1f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-compiler-2.51.1.pom\">\n            <sha256 value=\"8b47332c547fe098b1c83bd00f226cdc83076496e598b61f2ffa4b1e67eecd0f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-compiler\" version=\"2.52\">\n         <artifact name=\"hilt-compiler-2.52.jar\">\n            <sha256 value=\"436e3dd770f203584bb97730f8a3581e38e1f693336638926b1edd4759c5f18e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-compiler-2.52.pom\">\n            <sha256 value=\"11aca8a63c19b01902b219e0620264e2b47f5ce4107076a4c1b411ac9949fceb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-compiler\" version=\"2.53\">\n         <artifact name=\"hilt-compiler-2.53.jar\">\n            <sha256 value=\"351bd03d079a445a7903a7cb59209152460da559760aed26ba78968ccaf29c25\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-compiler-2.53.pom\">\n            <sha256 value=\"ba395c5c3b5cd625578bf4178cb9c9960a138d5d6e6be867d7a6e5326511db58\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-compiler\" version=\"2.53.1\">\n         <artifact name=\"hilt-compiler-2.53.1.jar\">\n            <sha256 value=\"60fede5902dbef2855f5b3707947f36f1137db9cef1a12104cc38fffdf4d1208\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-compiler-2.53.1.pom\">\n            <sha256 value=\"7210515699fef4fc53d1ec5b8935b7db5840b6d7cbbf61b79827f9f22dd8f09f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-compiler\" version=\"2.54\">\n         <artifact name=\"hilt-compiler-2.54.jar\">\n            <sha256 value=\"6e2e969a28c7cd88924545e14bdc43d593167488ff12f7fa3ec06489162dea33\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-compiler-2.54.pom\">\n            <sha256 value=\"571111d3bde4495a56a4ca7926fd47f75892ac5a8ea1a9565f1e0aa1e379b9a2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-compiler\" version=\"2.55\">\n         <artifact name=\"hilt-compiler-2.55.jar\">\n            <sha256 value=\"c04a85339fe5e1e0d5d9148026019f3918a6b928e8b7e08ea3c5ef776d84b6b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-compiler-2.55.pom\">\n            <sha256 value=\"2d56e2d61f8770fa23b9e4b153860cd4d42a48b81d7787a00f00fd508e4e9c19\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-compiler\" version=\"2.56\">\n         <artifact name=\"hilt-compiler-2.56.jar\">\n            <sha256 value=\"7aa45d9c402ba022ac660370926887b7c345c8e19d152780ad622d9823b71065\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-compiler-2.56.pom\">\n            <sha256 value=\"a29d1ece602be8f2258538b7081ba1b12ac045559c4f87f00634033863448951\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-compiler\" version=\"2.56.1\">\n         <artifact name=\"hilt-compiler-2.56.1.jar\">\n            <sha256 value=\"063554910c6e5638b3bb271d368611494d5e864c19df01065e87ca45522ffac1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-compiler-2.56.1.pom\">\n            <sha256 value=\"ef6d88d4e6f9e964434e9089145f70c2881b37c135af478343634175cb43122c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-compiler\" version=\"2.56.2\">\n         <artifact name=\"hilt-compiler-2.56.2.jar\">\n            <sha256 value=\"8ad0b03f2ebfa5a10fbc3cb3b43aa947718402dda7bf59429db2a0e57ccf1b4e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-compiler-2.56.2.pom\">\n            <sha256 value=\"31acd18c5f65d485b74faa1e4e140e9953a73af2b73e7d7230e23465bc1ee5f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-core\" version=\"2.51.1\">\n         <artifact name=\"hilt-core-2.51.1-sources.jar\">\n            <sha256 value=\"b813389b954ac99a5cc8b527a7bc7463f03500500009fa169092763605850d79\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-core-2.51.1.jar\">\n            <sha256 value=\"1e4941b1df1e0a71bdfe9cbaad803579b48de73eb2c95a87f8279591ea52704d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-core-2.51.1.pom\">\n            <sha256 value=\"43b90b168c0e6e9b80f20d281391c9e5989f2182a0bf0cfcfa68c6f26ff031ff\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-core\" version=\"2.52\">\n         <artifact name=\"hilt-core-2.52.jar\">\n            <sha256 value=\"127d691360558095948ef950191d7f0b10dbffadf0d47bf0ce9a75b0dc691947\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-core-2.52.pom\">\n            <sha256 value=\"b796b230d1d1e9519be9a0fdcb7ae1ac6c07ee1fd4f1c558945d6abdc7dbfbce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-core\" version=\"2.53\">\n         <artifact name=\"hilt-core-2.53.jar\">\n            <sha256 value=\"8f9c5b27e79bc58157930b4d52700cddeb5ee2bfd5802d17dcf79ee190b09f0e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-core-2.53.pom\">\n            <sha256 value=\"7fc7ee70e21a70e8077dca9337f122467a716a424a355561b69bd301e9c16a5e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-core\" version=\"2.53.1\">\n         <artifact name=\"hilt-core-2.53.1.jar\">\n            <sha256 value=\"9a10e8f916543223fff357821ef8b01a4b75847b2ea376c1fd177be02682acdc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-core-2.53.1.pom\">\n            <sha256 value=\"9c6d612b0b66dd685204999bb81e5edd0752d8658ed6017df3240587b3c8cd60\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-core\" version=\"2.54\">\n         <artifact name=\"hilt-core-2.54.jar\">\n            <sha256 value=\"292f43f9ca22d5b8ce25a5cde09f1a1953be39f513d0ddef14228be7ac536bb4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-core-2.54.pom\">\n            <sha256 value=\"890316a7afc8adf52590da1a0f810fa7d44b05018366417d81d2983b07357e0e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-core\" version=\"2.55\">\n         <artifact name=\"hilt-core-2.55.jar\">\n            <sha256 value=\"56872b5704b7bf650af3ecdba8aff9586cb354e83d9f16583d33d040c58d603c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-core-2.55.pom\">\n            <sha256 value=\"3d76b4da5e9b5656f939f46201f5d28397a60a1caa4ddd08b82965bd4090f30c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-core\" version=\"2.56\">\n         <artifact name=\"hilt-core-2.56.jar\">\n            <sha256 value=\"aed6a2c161bdbac49ad792cbdb09afb29faa7469619afc7759de5a78489507c1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-core-2.56.pom\">\n            <sha256 value=\"50bc339c8b703f66e5553dfcd3e44451c8c6b9d5bf571e50a1a856a334c3440d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-core\" version=\"2.56.1\">\n         <artifact name=\"hilt-core-2.56.1.jar\">\n            <sha256 value=\"2039675704a6e28307d0f6e73f3f3ab58ff0eb59d6339e9e5d7a9f0f1e45f9e7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-core-2.56.1.pom\">\n            <sha256 value=\"abb0876e0dca913fc66b245b8302fae993c1e86a4d0b10ae3d2d68743b3b88e3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger\" name=\"hilt-core\" version=\"2.56.2\">\n         <artifact name=\"hilt-core-2.56.2.jar\">\n            <sha256 value=\"6bb34ddd568e5bcc8f26f14340d933f69bff6af80c54fff4522cdd599a252585\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hilt-core-2.56.2.pom\">\n            <sha256 value=\"ca05a207ef6c847a402045fad615be2d1ec1a6946f0d957d929a128c014f3465\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger.hilt.android\" name=\"com.google.dagger.hilt.android.gradle.plugin\" version=\"2.51.1\">\n         <artifact name=\"com.google.dagger.hilt.android.gradle.plugin-2.51.1.pom\">\n            <sha256 value=\"25aecb846ed1054ca1226550e96e9a1695dfd7caa894ad7e7acb3824216d9459\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger.hilt.android\" name=\"com.google.dagger.hilt.android.gradle.plugin\" version=\"2.52\">\n         <artifact name=\"com.google.dagger.hilt.android.gradle.plugin-2.52.pom\">\n            <sha256 value=\"1ac9c26371dd1fe4f819f2969ceb0b50f96114a17d8e523dd2157f855e0625c4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger.hilt.android\" name=\"com.google.dagger.hilt.android.gradle.plugin\" version=\"2.53\">\n         <artifact name=\"com.google.dagger.hilt.android.gradle.plugin-2.53.pom\">\n            <sha256 value=\"feccfd4ade19661a46925f521a25bfff783c14fd5f375e347b78221623f1ef93\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger.hilt.android\" name=\"com.google.dagger.hilt.android.gradle.plugin\" version=\"2.53.1\">\n         <artifact name=\"com.google.dagger.hilt.android.gradle.plugin-2.53.1.pom\">\n            <sha256 value=\"9f61e3e1239a553a1986616b64d2e116ca6878fff39385a9868411a1e23c6cb8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger.hilt.android\" name=\"com.google.dagger.hilt.android.gradle.plugin\" version=\"2.54\">\n         <artifact name=\"com.google.dagger.hilt.android.gradle.plugin-2.54.pom\">\n            <sha256 value=\"d37a6c89d3c38e60fa7bc2a8b3103242c550742f0101542b01826a838d6ed020\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger.hilt.android\" name=\"com.google.dagger.hilt.android.gradle.plugin\" version=\"2.55\">\n         <artifact name=\"com.google.dagger.hilt.android.gradle.plugin-2.55.pom\">\n            <sha256 value=\"69db895bc2ae70c25b604a94f1d1c2518bc8af82ef7293aa79ccbcb203f2652e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger.hilt.android\" name=\"com.google.dagger.hilt.android.gradle.plugin\" version=\"2.56\">\n         <artifact name=\"com.google.dagger.hilt.android.gradle.plugin-2.56.pom\">\n            <sha256 value=\"ed6e99abf291c8fecd6f311fc1b5a73b90b7c92495f9aa6108e0be8638102a9e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger.hilt.android\" name=\"com.google.dagger.hilt.android.gradle.plugin\" version=\"2.56.1\">\n         <artifact name=\"com.google.dagger.hilt.android.gradle.plugin-2.56.1.pom\">\n            <sha256 value=\"2ea897fa9ac56a8127e379e17bded4ab982fea4641758cc522116834b2eb5a05\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.dagger.hilt.android\" name=\"com.google.dagger.hilt.android.gradle.plugin\" version=\"2.56.2\">\n         <artifact name=\"com.google.dagger.hilt.android.gradle.plugin-2.56.2.pom\">\n            <sha256 value=\"c397d87f782a1d9673d7fff99d829265c4c57d3c89eaa6a62d81b139467bd29e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"com.google.devtools.ksp.gradle.plugin\" version=\"2.0.0-1.0.22\">\n         <artifact name=\"com.google.devtools.ksp.gradle.plugin-2.0.0-1.0.22.pom\">\n            <sha256 value=\"50450fa2b0f0c57e7bc6daf7d4668115c48e169cd10530d39de14c5c2bce8fb0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"com.google.devtools.ksp.gradle.plugin\" version=\"2.0.0-1.0.23\">\n         <artifact name=\"com.google.devtools.ksp.gradle.plugin-2.0.0-1.0.23.pom\">\n            <sha256 value=\"912aa6bf99431d63d3ae57db92f5301c73980004d0d73d57e1022a580e349867\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"com.google.devtools.ksp.gradle.plugin\" version=\"2.0.0-1.0.24\">\n         <artifact name=\"com.google.devtools.ksp.gradle.plugin-2.0.0-1.0.24.pom\">\n            <sha256 value=\"0e055e570429eeaf758728196c356d81aba5681bf95c3384a29c126761baeeb3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"com.google.devtools.ksp.gradle.plugin\" version=\"2.0.10-1.0.24\">\n         <artifact name=\"com.google.devtools.ksp.gradle.plugin-2.0.10-1.0.24.pom\">\n            <sha256 value=\"a89e35f583e9b0aa4632d4a876cc9d00ec83a09b1a2274df91d9e34d944a0129\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"com.google.devtools.ksp.gradle.plugin\" version=\"2.0.20-1.0.24\">\n         <artifact name=\"com.google.devtools.ksp.gradle.plugin-2.0.20-1.0.24.pom\">\n            <sha256 value=\"87c29021ae0ae530f8172061ba407dcc3bd20f9fb83532a7026e0a378befb572\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"com.google.devtools.ksp.gradle.plugin\" version=\"2.0.20-1.0.25\">\n         <artifact name=\"com.google.devtools.ksp.gradle.plugin-2.0.20-1.0.25.pom\">\n            <sha256 value=\"cb3510768e58bfdb50aadd895dfe6307a5cf0476e5659db6d584581c1481bb2f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"com.google.devtools.ksp.gradle.plugin\" version=\"2.0.21-1.0.25\">\n         <artifact name=\"com.google.devtools.ksp.gradle.plugin-2.0.21-1.0.25.pom\">\n            <sha256 value=\"3f9d56d9e243f1f07f5c3efd93939012d5a28b4f1a938827171e00b30c4ba1f8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"com.google.devtools.ksp.gradle.plugin\" version=\"2.0.21-1.0.26\">\n         <artifact name=\"com.google.devtools.ksp.gradle.plugin-2.0.21-1.0.26.pom\">\n            <sha256 value=\"67625d5d775bbd79c2a4ee7058d0f219eb24041b3a0eaca5eb4a7a5c4c68442e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"com.google.devtools.ksp.gradle.plugin\" version=\"2.0.21-1.0.27\">\n         <artifact name=\"com.google.devtools.ksp.gradle.plugin-2.0.21-1.0.27.pom\">\n            <sha256 value=\"3b2d87a9d52af3770993d719b3429f0eb48448f489a5bf60c382d613ced34907\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"com.google.devtools.ksp.gradle.plugin\" version=\"2.0.21-1.0.28\">\n         <artifact name=\"com.google.devtools.ksp.gradle.plugin-2.0.21-1.0.28.pom\">\n            <sha256 value=\"586a5c4a648e5c2bcafc4e1cb1a7c135a0fe8959ef4a91f14115c77b6a7062b6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"com.google.devtools.ksp.gradle.plugin\" version=\"2.1.0-1.0.29\">\n         <artifact name=\"com.google.devtools.ksp.gradle.plugin-2.1.0-1.0.29.pom\">\n            <sha256 value=\"054d154158279087960a76d2c03c54ce9206a32c644756d001c1d4489695cc27\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"com.google.devtools.ksp.gradle.plugin\" version=\"2.1.10-1.0.29\">\n         <artifact name=\"com.google.devtools.ksp.gradle.plugin-2.1.10-1.0.29.pom\">\n            <sha256 value=\"aa0b27edc55ebf646e3e16128e75226cfd04e58035887633edba079706fe6dd9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"com.google.devtools.ksp.gradle.plugin\" version=\"2.1.10-1.0.30\">\n         <artifact name=\"com.google.devtools.ksp.gradle.plugin-2.1.10-1.0.30.pom\">\n            <sha256 value=\"3c5b01e97c9454b6a70951227e9ab656ed3257e3987893a7166a53e23121359a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"com.google.devtools.ksp.gradle.plugin\" version=\"2.1.10-1.0.31\">\n         <artifact name=\"com.google.devtools.ksp.gradle.plugin-2.1.10-1.0.31.pom\">\n            <sha256 value=\"4c244997e2af958f8cf4286eed17b288b4278ec74743dfc080a399e15818e931\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"com.google.devtools.ksp.gradle.plugin\" version=\"2.1.20-1.0.31\">\n         <artifact name=\"com.google.devtools.ksp.gradle.plugin-2.1.20-1.0.31.pom\">\n            <sha256 value=\"96b3f7e1ae799c9f4e981d4320e7bf4b3b17156445d6cd8cbd75c7d7fd42bffb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"com.google.devtools.ksp.gradle.plugin\" version=\"2.1.20-1.0.32\">\n         <artifact name=\"com.google.devtools.ksp.gradle.plugin-2.1.20-1.0.32.pom\">\n            <sha256 value=\"355e766ed1fcb7703c1788bc4ada7cb922e42db110b7410a649e782abd8d75f0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"com.google.devtools.ksp.gradle.plugin\" version=\"2.1.21-2.0.1\">\n         <artifact name=\"com.google.devtools.ksp.gradle.plugin-2.1.21-2.0.1.pom\">\n            <sha256 value=\"ba1951a3dab18a8bc2c939d7a230b0d953bc6ae362dd520a477cdf5cb14718e1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing\" version=\"2.0.0-1.0.22\">\n         <artifact name=\"symbol-processing-2.0.0-1.0.22.jar\">\n            <sha256 value=\"84f37b2e285cde853e1d9cf1307766641b8bf9e411e264d736d4381e97e1316d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-2.0.0-1.0.22.pom\">\n            <sha256 value=\"76ae10a3f07d2ea672f13189314e8572787858ed915ce5eed40724a7e4332cbc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing\" version=\"2.0.0-1.0.23\">\n         <artifact name=\"symbol-processing-2.0.0-1.0.23.jar\">\n            <sha256 value=\"2fbd636c0b76e2ff98e9fc182d4ade5a13ff1f995cb5b95b03c93782253712d7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-2.0.0-1.0.23.pom\">\n            <sha256 value=\"ce1ffbbe6140e0176dafd3aa86d9efad92d52127d46a4c1d4a68c79b73b0ed02\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing\" version=\"2.0.0-1.0.24\">\n         <artifact name=\"symbol-processing-2.0.0-1.0.24.jar\">\n            <sha256 value=\"9cb9cd874725a26408fe12a8c57a5964e8bb38645c550bbf70fd0a00f906d245\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-2.0.0-1.0.24.pom\">\n            <sha256 value=\"dc3d6dae31a1f049fd16428dd92d9fa5eaf288a70b9ec110dd98a89995f517a3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing\" version=\"2.0.10-1.0.24\">\n         <artifact name=\"symbol-processing-2.0.10-1.0.24.jar\">\n            <sha256 value=\"e5ecba0c086544d03f6c91bdff63f2b135532c50f654a72f60ccbed32fd4ed3d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-2.0.10-1.0.24.pom\">\n            <sha256 value=\"601a99a51a05c82292567136d22ba1425401cdf0509489d421a91cacc435465f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing\" version=\"2.0.20-1.0.24\">\n         <artifact name=\"symbol-processing-2.0.20-1.0.24.jar\">\n            <sha256 value=\"11b884411e738bce6a5e0d2ce29a715bc8c6016dcf5d42eb0e582195eeabb45c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-2.0.20-1.0.24.pom\">\n            <sha256 value=\"a9814f96e1af71b2af4c54377b9804872e8dc440d3adc91bb6cbcc10d3aad9a0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing\" version=\"2.0.20-1.0.25\">\n         <artifact name=\"symbol-processing-2.0.20-1.0.25.jar\">\n            <sha256 value=\"e71741ea913426a52532721991bda4a918a189b37256957331dc30fcf2dbeb11\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-2.0.20-1.0.25.pom\">\n            <sha256 value=\"d92ed489c77377d7c4683b9f96579a36341cfc47f3c25274f79bf378c62bd2a5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing\" version=\"2.0.21-1.0.25\">\n         <artifact name=\"symbol-processing-2.0.21-1.0.25.jar\">\n            <sha256 value=\"be1d8f9312b95056dfd91daad09bb2b05ee6eccd5b45ce7bd8cc84fe22d9e2da\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-2.0.21-1.0.25.pom\">\n            <sha256 value=\"8fbf8791066d41a15218f2619959f38ac133fe21b5cd228e76823e22fef8a966\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing\" version=\"2.0.21-1.0.26\">\n         <artifact name=\"symbol-processing-2.0.21-1.0.26.jar\">\n            <sha256 value=\"5a8e1358559232b2cd70575fed09d21d1510dee42e276eea51936a4769963675\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-2.0.21-1.0.26.pom\">\n            <sha256 value=\"254fe19311d2da41cd0708077c255f4205ec0fc64a1c07ee13b0b1afb8b44d8a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing\" version=\"2.0.21-1.0.27\">\n         <artifact name=\"symbol-processing-2.0.21-1.0.27.jar\">\n            <sha256 value=\"a8a921fcb415a789c19160ee7a787c13e086aed60c4662f233d864cbc3fb81aa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-2.0.21-1.0.27.pom\">\n            <sha256 value=\"55d2b78c0901ef7b978a45a0e4b977d1690b0b83a9b3bfcfd8e680a02db12db6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing\" version=\"2.0.21-1.0.28\">\n         <artifact name=\"symbol-processing-2.0.21-1.0.28.jar\">\n            <sha256 value=\"055154273db28809e98797ca6af910e7bf343c9da16e22d6b70348c004fde7cc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-2.0.21-1.0.28.pom\">\n            <sha256 value=\"d3aa0a259210c4374f9280dac2229173afba0e2a78196f6e4ddd4a3d46507ae8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing\" version=\"2.1.0-1.0.29\">\n         <artifact name=\"symbol-processing-2.1.0-1.0.29.jar\">\n            <sha256 value=\"7150a9ccf4e6d7276802364be35d6a29c2abbac6477e79ae19ef0e5b61a8d27a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-2.1.0-1.0.29.pom\">\n            <sha256 value=\"50d0a8f7c267afeccc6ac40080a34f151b788b91450302ad2c370038f30ef686\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing\" version=\"2.1.10-1.0.29\">\n         <artifact name=\"symbol-processing-2.1.10-1.0.29.jar\">\n            <sha256 value=\"56c41a8595d0561770ca7aa0dc7de0a095b655b8292a5e1ab02cc7ded4727cfd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-2.1.10-1.0.29.pom\">\n            <sha256 value=\"201208d13348abe23bc7b6194e081b427056cf8c98a907acbf64977f3039dbf7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing\" version=\"2.1.10-1.0.30\">\n         <artifact name=\"symbol-processing-2.1.10-1.0.30.jar\">\n            <sha256 value=\"3ca238093740dec09b5cb5c5cdbac2912c8f3fae11d58d6c9410b1f92a387776\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-2.1.10-1.0.30.pom\">\n            <sha256 value=\"a14a82f4447a68ff82e4fe0912e10ac68cd9d3d8e176723b07541ea3a0a0cd7e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing\" version=\"2.1.10-1.0.31\">\n         <artifact name=\"symbol-processing-2.1.10-1.0.31.jar\">\n            <sha256 value=\"48d180327648ec91440b2983f6e3a38f79e24216109ac120449a714eb3f3ddfe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-2.1.10-1.0.31.pom\">\n            <sha256 value=\"9426d49c45977097b8f13bf2620d864221d7ecafe0aa3b5d329db452133d6653\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing\" version=\"2.1.20-1.0.31\">\n         <artifact name=\"symbol-processing-2.1.20-1.0.31.jar\">\n            <sha256 value=\"52bd551d35445939edb82b0f4e52822c7547f906bc81e965999e67a921e5429e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-2.1.20-1.0.31.pom\">\n            <sha256 value=\"84c5ed359f7ab710f1663512ecd32a7379218f2699034e664fd94b73f5c95781\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing\" version=\"2.1.20-1.0.32\">\n         <artifact name=\"symbol-processing-2.1.20-1.0.32.jar\">\n            <sha256 value=\"daee0c2093f872aea7e9e6eeeb1835691e3730448087766c00aab494c091370c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-2.1.20-1.0.32.pom\">\n            <sha256 value=\"9db0fe02af094dfea132c788f1915cbefacb4639944be050a92119966b6857ca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing\" version=\"2.1.21-2.0.1\">\n         <artifact name=\"symbol-processing-2.1.21-2.0.1.jar\">\n            <sha256 value=\"9c2024b20f6c52c93e36851f1c770a320d0412caeaceef37c28d40e6e3fc2990\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-2.1.21-2.0.1.pom\">\n            <sha256 value=\"5e3dfd79fa9395c7f022125fad6e1024cecdaacabfa7ae5e720027dfe8691d9d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-aa-embeddable\" version=\"2.1.21-2.0.1\">\n         <artifact name=\"symbol-processing-aa-embeddable-2.1.21-2.0.1.jar\">\n            <sha256 value=\"4a9368bc06c9214c9d1fc12a1d842b7b577dbac04abaf14de778fb5751affc23\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-aa-embeddable-2.1.21-2.0.1.pom\">\n            <sha256 value=\"3ad648961c2f1044b32f5f6a47f26df0d4ae71bca40f00f5cc6d7668953c17c3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"1.9.0-1.0.13\">\n         <artifact name=\"symbol-processing-api-1.9.0-1.0.13.module\">\n            <sha256 value=\"7bf557c8c69d638cd03eee46df4e0e2a9c6b26851383fa581c541dfd2eabfe1a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"1.9.20-1.0.14\">\n         <artifact name=\"symbol-processing-api-1.9.20-1.0.14.module\">\n            <sha256 value=\"b351e1ea830783a903ecd55b100642ccf879b76db469d5d1b13b7bd757f36abb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"1.9.22-1.0.17\">\n         <artifact name=\"symbol-processing-api-1.9.22-1.0.17.jar\">\n            <sha256 value=\"3eec16833a02db45c4b55e1f76868567201499acce4b837fd2d3c84218da41cf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-api-1.9.22-1.0.17.module\">\n            <sha256 value=\"16eb5828140e6f9ff29333b7bd42421367ee4f4e1427af30c5d9711362f70904\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"1.9.24-1.0.20\">\n         <artifact name=\"symbol-processing-api-1.9.24-1.0.20.jar\">\n            <sha256 value=\"5d9fec20be7e2ef552dafe29283ea1a27bdba62a54895431d17966711e22060b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-api-1.9.24-1.0.20.module\">\n            <sha256 value=\"6904d1789d05b3df95de30e2c9eb24399bf23943d46368fbd3c3facbaccd0f0d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"2.0.0-1.0.22\">\n         <artifact name=\"symbol-processing-api-2.0.0-1.0.22.jar\">\n            <sha256 value=\"cec761da8521e0e369710c626ac048f77b891f65db0e1da1ad3d401901c901d5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-api-2.0.0-1.0.22.module\">\n            <sha256 value=\"8f1e2b6512c5d28ce351731a487a9b740675006ad9d3ff4e042d00b34e3cc4e2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"2.0.0-1.0.23\">\n         <artifact name=\"symbol-processing-api-2.0.0-1.0.23.jar\">\n            <sha256 value=\"62cb8519cb3bdb39b60251a3f10e8385a585afb28330b6947e193c76e8ad7268\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-api-2.0.0-1.0.23.module\">\n            <sha256 value=\"46829645cee8c87e89b26a447770bb46303ceccef9c3bd4fb4e969512936b651\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"2.0.0-1.0.24\">\n         <artifact name=\"symbol-processing-api-2.0.0-1.0.24.jar\">\n            <sha256 value=\"b0f93ad7657d84b39583321c726f8c05de685b516c0cadc8b53dd60d50c29008\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-api-2.0.0-1.0.24.module\">\n            <sha256 value=\"2933cb486b726249fe406c9233e32bfec0066b591f759e03400c5fe3011a7e0b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"2.0.10-1.0.24\">\n         <artifact name=\"symbol-processing-api-2.0.10-1.0.24.jar\">\n            <sha256 value=\"dd7dde070be54de66c7bdd4de04c43fb429e0c62bb132a6448cfa33653afb229\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-api-2.0.10-1.0.24.module\">\n            <sha256 value=\"bfc3a2147136a07c3920fda619eba073cb9381c5657fefb161cfd589948f9952\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"2.0.20-1.0.24\">\n         <artifact name=\"symbol-processing-api-2.0.20-1.0.24.jar\">\n            <sha256 value=\"600cceab10129692b9fa188d4105e3ca400206ab848dd1c08ea09dc76cd270ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-api-2.0.20-1.0.24.module\">\n            <sha256 value=\"65fe1c2eb26899390b1018808dda05e9d88aec4bed37f715b1f5b4677d16f2e9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"2.0.20-1.0.25\">\n         <artifact name=\"symbol-processing-api-2.0.20-1.0.25.jar\">\n            <sha256 value=\"bdd3a3e76ee21c958e0f2a62d717cc61665e6f5a0b141eff00e056eb9f58d8fe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-api-2.0.20-1.0.25.module\">\n            <sha256 value=\"5d7043218cdf26359bdfec4ba678aed794baaad4a7e040344d33a2ed928847ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"2.0.21-1.0.25\">\n         <artifact name=\"symbol-processing-api-2.0.21-1.0.25.jar\">\n            <sha256 value=\"17f0b1fe4c99bd8ff350d45076dae4722492b10c95f5f13f24ec133559433407\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-api-2.0.21-1.0.25.module\">\n            <sha256 value=\"85e605640a383a007158c601f00d1e7b6a0f4fb50ff57a68139d7b88761faec5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"2.0.21-1.0.26\">\n         <artifact name=\"symbol-processing-api-2.0.21-1.0.26.jar\">\n            <sha256 value=\"06c4bcb3eb40953d4435ece2232ad6b760868631968596ce666cf9f805729a5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-api-2.0.21-1.0.26.module\">\n            <sha256 value=\"6a3aa169c82aa817f46e2c34ad06a37552e37a1708f2b97332a8af6b7e5b608d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"2.0.21-1.0.27\">\n         <artifact name=\"symbol-processing-api-2.0.21-1.0.27.jar\">\n            <sha256 value=\"59e012645545f8d776b9622bd6ed258cfa33dee24f0fa8359f8734821eaedff1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-api-2.0.21-1.0.27.module\">\n            <sha256 value=\"0662b6e4647fe78600cd1fdca849ac2e3e95086b996799b0d17bc72b418dc392\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"2.0.21-1.0.28\">\n         <artifact name=\"symbol-processing-api-2.0.21-1.0.28.jar\">\n            <sha256 value=\"e38dd8199c65aae4bce9929bf39a563bf7658c600be5066c7e042cdd8de3137c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-api-2.0.21-1.0.28.module\">\n            <sha256 value=\"8324a417e092ca2728732edb8281ee91ad0861c1c6c694a4dd2e9d4e79f4e270\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"2.1.0-1.0.29\">\n         <artifact name=\"symbol-processing-api-2.1.0-1.0.29.jar\">\n            <sha256 value=\"35e126d0af791641dfbcb5102eed3744bc1f5b38ce70d6a7046e8f5bba6b998d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-api-2.1.0-1.0.29.module\">\n            <sha256 value=\"a7eec572ac92f0a607a54f6ebced75a7c6df2348175170a12b652417ac6b8960\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"2.1.10-1.0.29\">\n         <artifact name=\"symbol-processing-api-2.1.10-1.0.29.jar\">\n            <sha256 value=\"e845183d45ce465b67763c6b9eb2ef8c38de5b1889be7a94006b13c8d897025a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-api-2.1.10-1.0.29.module\">\n            <sha256 value=\"c17b15c8b4e93e509b63b2650ae543d9284a0b6995a37d1d6c40b79a90919009\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"2.1.10-1.0.30\">\n         <artifact name=\"symbol-processing-api-2.1.10-1.0.30.jar\">\n            <sha256 value=\"fcddb6957da80fef55dd05caf0a8d333d1b63fb740cb6e4b22097c8fbb66a036\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-api-2.1.10-1.0.30.module\">\n            <sha256 value=\"ac7c5c8516ff7fdc658c64e5e17f501a173d39c1eb09f2b88d217c8752ebe363\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"2.1.10-1.0.31\">\n         <artifact name=\"symbol-processing-api-2.1.10-1.0.31.jar\">\n            <sha256 value=\"3170c52186cb2096a47f538f09dd41e49ca1b3334d69ea83d6493d6f0365b7b4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-api-2.1.10-1.0.31.module\">\n            <sha256 value=\"6445d14b0910800b7efb62c7b0722abaed3373a143fc3fc0111cd6952173ed38\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"2.1.20-1.0.31\">\n         <artifact name=\"symbol-processing-api-2.1.20-1.0.31.jar\">\n            <sha256 value=\"772f85c725b380213d82b43d69b408992fd4dacaf9d33268e24269410ea09798\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-api-2.1.20-1.0.31.module\">\n            <sha256 value=\"e06080523867af0f302bcdcfaa1cd14f48d73b4106f39d97ed3bca87ac8bf0b9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"2.1.20-1.0.32\">\n         <artifact name=\"symbol-processing-api-2.1.20-1.0.32.jar\">\n            <sha256 value=\"f3a5b9283551671747662e6541bee4d186db41054d89591be060cb4d9af204ad\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-api-2.1.20-1.0.32.module\">\n            <sha256 value=\"f24fb26e5558c2026a589061e6954b0c4d72b405aa62ec448ac18dc89db33afd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-api\" version=\"2.1.21-2.0.1\">\n         <artifact name=\"symbol-processing-api-2.1.21-2.0.1.jar\">\n            <sha256 value=\"6b2134148c3bc9e9cf9cf239d45031a21cd789956a21592d1a3231fe8ae309af\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-api-2.1.21-2.0.1.module\">\n            <sha256 value=\"14ecb4776a8071e86129833319431399b2a69e6e9bfedcb2992538bdaca6cfc0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-cmdline\" version=\"2.0.0-1.0.22\">\n         <artifact name=\"symbol-processing-cmdline-2.0.0-1.0.22.jar\">\n            <sha256 value=\"9961400fb672e895e1c98963d493202207fd9918e38b3be27262be8b63e02d1d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-cmdline-2.0.0-1.0.22.pom\">\n            <sha256 value=\"4dd113b6e7cf8fdf69111597e4a98599ac9dad9d3cdf4b918bbe517916d58f45\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-cmdline\" version=\"2.0.0-1.0.23\">\n         <artifact name=\"symbol-processing-cmdline-2.0.0-1.0.23.jar\">\n            <sha256 value=\"96a0fc0cdfd60846a7a1558b205da04ca6ec81e9cd8137097813217db5cbab37\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-cmdline-2.0.0-1.0.23.pom\">\n            <sha256 value=\"c7fcd487c985d7227944962969c31086636f4744267740f0846ce8b295604058\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-cmdline\" version=\"2.0.0-1.0.24\">\n         <artifact name=\"symbol-processing-cmdline-2.0.0-1.0.24.jar\">\n            <sha256 value=\"34b66057ef120105aa4a9b736acff56cbea4b6db6ce93ac49ffa45cabcd2380d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-cmdline-2.0.0-1.0.24.pom\">\n            <sha256 value=\"7716e417af61cb989e4f0fa2346b23dc00a0df5f0e1d3979ac3171f331cd92be\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-cmdline\" version=\"2.0.10-1.0.24\">\n         <artifact name=\"symbol-processing-cmdline-2.0.10-1.0.24.jar\">\n            <sha256 value=\"d0eeeb66f49fb8309d23838ad619c1a271e6af6248b22f85badb0370fc834860\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-cmdline-2.0.10-1.0.24.pom\">\n            <sha256 value=\"109289cb3758ecf94bfafca0203eaf292cbfaddc18a3bc649e26f59882b8f2b8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-cmdline\" version=\"2.0.20-1.0.24\">\n         <artifact name=\"symbol-processing-cmdline-2.0.20-1.0.24.jar\">\n            <sha256 value=\"a8c51acad36e13584833ada9fb7bbbf2d910595c6aa56e35617edf0aaee125f2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-cmdline-2.0.20-1.0.24.pom\">\n            <sha256 value=\"a297b66b13d118db54938a28fefe757b7cf5fa6d1bfe6c9e60040027c140751a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-cmdline\" version=\"2.0.20-1.0.25\">\n         <artifact name=\"symbol-processing-cmdline-2.0.20-1.0.25.jar\">\n            <sha256 value=\"56dae1c971eee8b0ecf970223b79e2724596d62e25d36410aaab2ec242cc6622\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-cmdline-2.0.20-1.0.25.pom\">\n            <sha256 value=\"61dda1c62eaaafe0a595ae4a1f2eaae76160247435014d74cef7a3ebefb34597\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-cmdline\" version=\"2.0.21-1.0.25\">\n         <artifact name=\"symbol-processing-cmdline-2.0.21-1.0.25.jar\">\n            <sha256 value=\"9776dbaa7267f9130d2bf215a3bc2db56216552c4ba7024079ac4f3495a913be\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-cmdline-2.0.21-1.0.25.pom\">\n            <sha256 value=\"f00e04bd3aec23e2e119bd3a00db7d0b1a97a535a32dad3768864cf54f92128d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-cmdline\" version=\"2.0.21-1.0.26\">\n         <artifact name=\"symbol-processing-cmdline-2.0.21-1.0.26.jar\">\n            <sha256 value=\"43b0a1d0e18839b54bfc5f021ea1c5e9feb88723f12976137bbfe6d5be4839b8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-cmdline-2.0.21-1.0.26.pom\">\n            <sha256 value=\"55d220907bc7897d32c4b06673348d0b58766d1d538ffaaa6151faded4e56e93\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-cmdline\" version=\"2.0.21-1.0.27\">\n         <artifact name=\"symbol-processing-cmdline-2.0.21-1.0.27.jar\">\n            <sha256 value=\"3a70eda6930e3c1d46dd8158022065e1194c5bafba571de374370c0256682c73\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-cmdline-2.0.21-1.0.27.pom\">\n            <sha256 value=\"a02019457e07cc55254a1a8c65fc8b602c4ddcd232054ee5a2942004a7a8036f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-cmdline\" version=\"2.0.21-1.0.28\">\n         <artifact name=\"symbol-processing-cmdline-2.0.21-1.0.28.jar\">\n            <sha256 value=\"b8c67243ffb5ef411c868240acb124f22aa7b212215533b765d858ece61149b6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-cmdline-2.0.21-1.0.28.pom\">\n            <sha256 value=\"82bb8a911280a819b799b6bb2ec34461e268ef6a38cf35337ce7cda8e73bbe2e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-cmdline\" version=\"2.1.0-1.0.29\">\n         <artifact name=\"symbol-processing-cmdline-2.1.0-1.0.29.jar\">\n            <sha256 value=\"34c4d5c1c78577e62a1a292d4438ae6bfbb230d1ab56164feccf23abdeb9a96a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-cmdline-2.1.0-1.0.29.pom\">\n            <sha256 value=\"261fd00d9ecba3cd22e59ce01ee748faffb91dac0dbe4f9889f43c61f2cd8a94\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-cmdline\" version=\"2.1.10-1.0.29\">\n         <artifact name=\"symbol-processing-cmdline-2.1.10-1.0.29.jar\">\n            <sha256 value=\"b5c69be50ef939a21c23d1132457ce1566a0aced2c44cabceca8788320df58b8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-cmdline-2.1.10-1.0.29.pom\">\n            <sha256 value=\"6b5a1be7f56d291451ad1e4a44fd3c06da4511b3bc646e37ff3e3e46f747a886\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-cmdline\" version=\"2.1.10-1.0.30\">\n         <artifact name=\"symbol-processing-cmdline-2.1.10-1.0.30.jar\">\n            <sha256 value=\"f3380a43b2c16ab1817fc61f23a1eab97ced3d63520b83b75d164405e0d4b5fa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-cmdline-2.1.10-1.0.30.pom\">\n            <sha256 value=\"7e3e69b966c429b62a8452b9b76673eb79fd9017919feb0bdc3c27385f888acd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-cmdline\" version=\"2.1.10-1.0.31\">\n         <artifact name=\"symbol-processing-cmdline-2.1.10-1.0.31.jar\">\n            <sha256 value=\"d296b3f98c89076fc4dbd3c547cd40d3bab79e76bb10bfc8452785dbe00ea960\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-cmdline-2.1.10-1.0.31.pom\">\n            <sha256 value=\"8f77a27fc401d9a0f32ec590753487f46ef8792be2b21a910748e665ab8d136c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-cmdline\" version=\"2.1.20-1.0.31\">\n         <artifact name=\"symbol-processing-cmdline-2.1.20-1.0.31.jar\">\n            <sha256 value=\"6e24cc06aa5675b9a9b5ece03abc12580260cb0ce6c1c7e16a0091b133b6687b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-cmdline-2.1.20-1.0.31.pom\">\n            <sha256 value=\"da444148ccf3532eca278a4210542777e066764817e0c979490da22a8b99df0b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-cmdline\" version=\"2.1.20-1.0.32\">\n         <artifact name=\"symbol-processing-cmdline-2.1.20-1.0.32.jar\">\n            <sha256 value=\"244d8729a26e5bc27adcedb794fe24a6cb135b1475f10880c854ef1670bc0973\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-cmdline-2.1.20-1.0.32.pom\">\n            <sha256 value=\"e7cd137619b8c6df054d6ddf75e116ad14e219880354d34b7578d9fd2758d384\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-cmdline\" version=\"2.1.21-2.0.1\">\n         <artifact name=\"symbol-processing-cmdline-2.1.21-2.0.1.jar\">\n            <sha256 value=\"cb22ba6e9c5bb294acdd15d778107b16020b8e6cfd2d44c132e8123c92377f0c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-cmdline-2.1.21-2.0.1.pom\">\n            <sha256 value=\"98913ba5f17db14da36705f4b2753fd272772b73889d072475601767eb054421\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-common-deps\" version=\"2.0.0-1.0.22\">\n         <artifact name=\"symbol-processing-common-deps-2.0.0-1.0.22.jar\">\n            <sha256 value=\"9109a3cf75c157cda8e81a04da064fbe19d64e5844695d1a4ef357ce507ac28d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-common-deps-2.0.0-1.0.22.module\">\n            <sha256 value=\"8bb319bf72ba91e7f6709461d484527abb8623a0741faafa5cd03b164608de27\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-common-deps\" version=\"2.0.0-1.0.23\">\n         <artifact name=\"symbol-processing-common-deps-2.0.0-1.0.23.jar\">\n            <sha256 value=\"a747103929253e325d62f4a4564872cff110bba65ed8e63ad972047a76cecb40\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-common-deps-2.0.0-1.0.23.module\">\n            <sha256 value=\"62de7859e29bb3b926773108b84acca8d8fb68504f827dac40fe10308d5d760c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-common-deps\" version=\"2.0.0-1.0.24\">\n         <artifact name=\"symbol-processing-common-deps-2.0.0-1.0.24.jar\">\n            <sha256 value=\"22f0f50184f0f1162cb77aef8f057d409472e1bd7f4dc9cad1f2eae2243675cd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-common-deps-2.0.0-1.0.24.module\">\n            <sha256 value=\"cc645b4fcf4024372a6cb81ed4efe46e7ba4260a38b150d14ce90740f4609b7f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-common-deps\" version=\"2.0.10-1.0.24\">\n         <artifact name=\"symbol-processing-common-deps-2.0.10-1.0.24.jar\">\n            <sha256 value=\"42977e9ed74c021fa770e233b3174ade755efdec94ea9433bfdae3c135d3c7b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-common-deps-2.0.10-1.0.24.module\">\n            <sha256 value=\"9436d0db75279d953c8469fd8ed59ff64bdbe0ce65ff04c11d6c5d15e4e434eb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-common-deps\" version=\"2.0.20-1.0.24\">\n         <artifact name=\"symbol-processing-common-deps-2.0.20-1.0.24.jar\">\n            <sha256 value=\"a0b739afd1bbe6f1c83aa507e9a1b1e1958ef924307e4d2a80408965e29b9336\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-common-deps-2.0.20-1.0.24.module\">\n            <sha256 value=\"95987a8aba64d442c13af9dc0aa41befa33f3e0f13970b86817e4b1f4e7393ab\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-common-deps\" version=\"2.0.20-1.0.25\">\n         <artifact name=\"symbol-processing-common-deps-2.0.20-1.0.25.jar\">\n            <sha256 value=\"6c2972d213dabb64ba8dd8c14711c9034c13aa3cecf58f5ec8a8dce34bd4a4f0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-common-deps-2.0.20-1.0.25.module\">\n            <sha256 value=\"439c5490938285135f6d57729505129d68b1869d2954c54a4340273267d7b0e4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-common-deps\" version=\"2.0.21-1.0.25\">\n         <artifact name=\"symbol-processing-common-deps-2.0.21-1.0.25.jar\">\n            <sha256 value=\"5f9dcb87bf54d2dec19b8be2a6b370e9f6e5d034356f4523c8694f93c4d9eaed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-common-deps-2.0.21-1.0.25.module\">\n            <sha256 value=\"d0415b9954d29a81bfc4b1882e6753e52cfd23abe573ba98ec3b3b33588157ad\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-common-deps\" version=\"2.0.21-1.0.26\">\n         <artifact name=\"symbol-processing-common-deps-2.0.21-1.0.26.jar\">\n            <sha256 value=\"f54ddfbad5923a56fca59f2cffcffa4961488b33969935c25e9492f4de754ce4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-common-deps-2.0.21-1.0.26.module\">\n            <sha256 value=\"9831ed5a32d2242305f4608a33744b38989ead2a5b014a444020db0ae32f4a1f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-common-deps\" version=\"2.0.21-1.0.27\">\n         <artifact name=\"symbol-processing-common-deps-2.0.21-1.0.27.jar\">\n            <sha256 value=\"82304e1d07da39bf68ad7a191e955b439edd47a41aae09986a2b74cd0a5eb732\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-common-deps-2.0.21-1.0.27.module\">\n            <sha256 value=\"5131024c45abe1126c7fd24a37b630bec1b35f8e7a507a8aa9debf3fd8e9b232\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-common-deps\" version=\"2.0.21-1.0.28\">\n         <artifact name=\"symbol-processing-common-deps-2.0.21-1.0.28.jar\">\n            <sha256 value=\"df5e17b3443f2530c941cb871bc835a897c63699b7b6f20435996bbcc7d76ae9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-common-deps-2.0.21-1.0.28.module\">\n            <sha256 value=\"320680916f281b42f46f7361d40ed6011af5c14d31ff2651750bf9e2ed351f3a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-common-deps\" version=\"2.1.0-1.0.29\">\n         <artifact name=\"symbol-processing-common-deps-2.1.0-1.0.29.jar\">\n            <sha256 value=\"a74ff0e922fba5b27cd7ce49025c9ea4d73f824d2a3ac0c2697b39bc12da9b92\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-common-deps-2.1.0-1.0.29.module\">\n            <sha256 value=\"6740a5ef6fc6be1eea859bcc13efe97565b509b7d5677bb76404d28b2755af30\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-common-deps\" version=\"2.1.10-1.0.29\">\n         <artifact name=\"symbol-processing-common-deps-2.1.10-1.0.29.jar\">\n            <sha256 value=\"279548f7753d61c6db1cbb543ef8761ba6064436b25e6c3677f837b836966578\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-common-deps-2.1.10-1.0.29.module\">\n            <sha256 value=\"753946cb9f9fa37de8498c1ac18133f3411473c9090d3246377731d45df821aa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-common-deps\" version=\"2.1.10-1.0.30\">\n         <artifact name=\"symbol-processing-common-deps-2.1.10-1.0.30.jar\">\n            <sha256 value=\"7d07d8a2acc0cc28ee478775e59e0a1fd8a1d5b43fd171ed88f74bf644243c99\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-common-deps-2.1.10-1.0.30.module\">\n            <sha256 value=\"5dac8c7e9f00b0dbc2b9ae7a03831d3e9421da0d91cb5387fbc502ca3a46740c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-common-deps\" version=\"2.1.10-1.0.31\">\n         <artifact name=\"symbol-processing-common-deps-2.1.10-1.0.31.jar\">\n            <sha256 value=\"8e628ade7fa0020cc24df37ac511572e420b8bd2e45f83d38a60833240d90d25\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-common-deps-2.1.10-1.0.31.module\">\n            <sha256 value=\"3dcd1596fb8649da1ceda789534483cdef330a783fc5022c7457ed67c8263e4a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-common-deps\" version=\"2.1.20-1.0.31\">\n         <artifact name=\"symbol-processing-common-deps-2.1.20-1.0.31.jar\">\n            <sha256 value=\"aa2c8bce91f5d4f42df558cb63a09764c60798a21ccafb2e7b62308ddcdcd936\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-common-deps-2.1.20-1.0.31.module\">\n            <sha256 value=\"9529fcaae150d14a6c0601eebf69815049f3bf66ac1e59ce68ee7b7d4d979d41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-common-deps\" version=\"2.1.20-1.0.32\">\n         <artifact name=\"symbol-processing-common-deps-2.1.20-1.0.32.jar\">\n            <sha256 value=\"b54d22028fbaa483f8e6fe7342eeb1c15b793543961559fb4047d3819b9ad336\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-common-deps-2.1.20-1.0.32.module\">\n            <sha256 value=\"c0692b4bf731eb236097c9941feaccbd8f8577983a0bd72a54f8d042a2460582\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-common-deps\" version=\"2.1.21-2.0.1\">\n         <artifact name=\"symbol-processing-common-deps-2.1.21-2.0.1.jar\">\n            <sha256 value=\"01cdf52b59d3e206aa4fa62781d1505a5cbd98743c05b072f9c8cb9e6aa2e003\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-common-deps-2.1.21-2.0.1.module\">\n            <sha256 value=\"9b68f01415fc03d641f82e2e4b37de99e9dfdf4a585fb825b4601bb72caa594c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-gradle-plugin\" version=\"2.0.0-1.0.22\">\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.0-1.0.22.jar\">\n            <sha256 value=\"aa04d695caafd2ee1a1a061ae520a44e17594d5cce212c23337c6d1c52893988\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.0-1.0.22.module\">\n            <sha256 value=\"7a76f1dfb6d56a36d3840011c43a4327be05fb9e733371ba5151b5279296d475\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-gradle-plugin\" version=\"2.0.0-1.0.23\">\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.0-1.0.23.jar\">\n            <sha256 value=\"3180be531b862d8dd123aed3aa253018ee1ec32ac295e453b64203921396e203\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.0-1.0.23.module\">\n            <sha256 value=\"46708fe656329bef3d8e5cd831b4caebb8da848fd29be2434fa711731fd9c448\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-gradle-plugin\" version=\"2.0.0-1.0.24\">\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.0-1.0.24.jar\">\n            <sha256 value=\"cfd7cf2f7eedd7f2786ec3a04c0aca8a5dc12a5654bb8ea1c2ac9ec83441fee6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.0-1.0.24.module\">\n            <sha256 value=\"bbf2495066277c2d0f84068044b69449132cf664091333a503bbc9e16276b2ab\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-gradle-plugin\" version=\"2.0.10-1.0.24\">\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.10-1.0.24.jar\">\n            <sha256 value=\"c5f22869913f63ef43530d7b7548c75605ee94c521465a9d76258076cac79880\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.10-1.0.24.module\">\n            <sha256 value=\"9fb95606c52a4f5b9ef18eb687dc237851afb7a9a8b28a6222436986582ddb60\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-gradle-plugin\" version=\"2.0.20-1.0.24\">\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.20-1.0.24.jar\">\n            <sha256 value=\"ee0a4de3cfa8f50db62b7eab51e94ecd32923926d62036e2798e3401d2ea44a6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.20-1.0.24.module\">\n            <sha256 value=\"beb5e06bb431d4bcaa9d39849803eb6152cd57418b6bb70f401a7a67dc390ec5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-gradle-plugin\" version=\"2.0.20-1.0.25\">\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.20-1.0.25.jar\">\n            <sha256 value=\"4ce1fc1b6ea08c4eadc630768d608a624f556d65b056bea0f7b9789018105a41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.20-1.0.25.module\">\n            <sha256 value=\"fa02c4fd461f8a8c3b8f6a36eb9cd0416c9244183ad66d5cd9e205b08775559b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-gradle-plugin\" version=\"2.0.21-1.0.25\">\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.21-1.0.25.jar\">\n            <sha256 value=\"fef8b305e715bcb4a4b62fdcf067b3f55a85e936c040df96d96a2ac927db79b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.21-1.0.25.module\">\n            <sha256 value=\"16a1f26581708a8aeccd89ba9aab050b7e8bb5b9abb8b0904c686573ce2dc0b4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-gradle-plugin\" version=\"2.0.21-1.0.26\">\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.21-1.0.26.jar\">\n            <sha256 value=\"c01fa174ae428a44c77c543ab0fe6acad663f2ecaf9a89ff053f2099f43cf34e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.21-1.0.26.module\">\n            <sha256 value=\"80b917125ace91332acab5314ea5c762cf130bf4c64ba41351fa876351657c70\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-gradle-plugin\" version=\"2.0.21-1.0.27\">\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.21-1.0.27.jar\">\n            <sha256 value=\"8f078f289bb64571800814b524f9a7158c628fbd328fabf7acb82aa402f75fbd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.21-1.0.27.module\">\n            <sha256 value=\"668de58eea8789898abd455115b127c8ec527a131aa9ed39dd1ecc1541fcef95\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-gradle-plugin\" version=\"2.0.21-1.0.28\">\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.21-1.0.28.jar\">\n            <sha256 value=\"516eccca213995b76502c98d049643c26fc426ae309866d6a063f094a7a6fae6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-gradle-plugin-2.0.21-1.0.28.module\">\n            <sha256 value=\"3d54a0179bd22417a4ec1568038c17bd717865413aaceb58db4a3f3e1830fdbe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-gradle-plugin\" version=\"2.1.0-1.0.29\">\n         <artifact name=\"symbol-processing-gradle-plugin-2.1.0-1.0.29.jar\">\n            <sha256 value=\"d68d5a99bce275bafaeb108448b9ad473b1b062564b11f1ad65bd0b5b3942b92\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-gradle-plugin-2.1.0-1.0.29.module\">\n            <sha256 value=\"f46fa4335a8f7ac3c351d8e28f93cd2253071378b81bade36bba113425ff3f47\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-gradle-plugin\" version=\"2.1.10-1.0.29\">\n         <artifact name=\"symbol-processing-gradle-plugin-2.1.10-1.0.29.jar\">\n            <sha256 value=\"773757b4dcbb900035953661cbfbab6ad04ba5f87b3b5367dc81182bd24dd0ad\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-gradle-plugin-2.1.10-1.0.29.module\">\n            <sha256 value=\"51fc4546c209a33b7209b3547cace9f5d1cd0600362b802dc9a115e43a2c937b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-gradle-plugin\" version=\"2.1.10-1.0.30\">\n         <artifact name=\"symbol-processing-gradle-plugin-2.1.10-1.0.30.jar\">\n            <sha256 value=\"33d74c99fa408b2c13641012d03b69e541337f5848c93b147d72ce45e36d9679\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-gradle-plugin-2.1.10-1.0.30.module\">\n            <sha256 value=\"9c517e1a7e2e68c5f55fee6b0fe340fe8ba583c7e326ec56513a19ab0ed2b944\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-gradle-plugin\" version=\"2.1.10-1.0.31\">\n         <artifact name=\"symbol-processing-gradle-plugin-2.1.10-1.0.31.jar\">\n            <sha256 value=\"4e132d6c0ccffb69455c675022483ed6f29b2273554994f3eb8680a1d0bb009e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-gradle-plugin-2.1.10-1.0.31.module\">\n            <sha256 value=\"773709c4ce60e71d9f5984cd3b0a482ee590cd444fe265553dc3f8e2c4df848c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-gradle-plugin\" version=\"2.1.20-1.0.31\">\n         <artifact name=\"symbol-processing-gradle-plugin-2.1.20-1.0.31.jar\">\n            <sha256 value=\"d9ec244fa33e157424f1e0368cd016c4a23869dc2c51fb6b93af9a52ec482152\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-gradle-plugin-2.1.20-1.0.31.module\">\n            <sha256 value=\"eeaf1a6288ac2c98bbb19465aa97ee2c75924afd5d2befca3b7c3b8503fe3ffc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-gradle-plugin\" version=\"2.1.20-1.0.32\">\n         <artifact name=\"symbol-processing-gradle-plugin-2.1.20-1.0.32.jar\">\n            <sha256 value=\"a4664479cf27e3a30338cb3f76e0c6ee27b0c8f934965d69c590b11a0d70b0e1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-gradle-plugin-2.1.20-1.0.32.module\">\n            <sha256 value=\"7cbbc7626d30aa373d01df54e1f47042c732a0d39ca716fc2c5dee8a265973b9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.devtools.ksp\" name=\"symbol-processing-gradle-plugin\" version=\"2.1.21-2.0.1\">\n         <artifact name=\"symbol-processing-gradle-plugin-2.1.21-2.0.1.jar\">\n            <sha256 value=\"9e454cb92fd4adc2ffead59a09a8831fe066a64dd9e483da55d8d1af30071821\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"symbol-processing-gradle-plugin-2.1.21-2.0.1.module\">\n            <sha256 value=\"225c5da3feb329588368f7ce42cf3d65e5df2275f1efdb6e7174d036ffe56729\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_annotation\" version=\"2.19.1\">\n         <artifact name=\"error_prone_annotation-2.19.1.jar\">\n            <sha256 value=\"38c45cdaf993a7df6697703ca6ee00acbe376d3dade8d44daac3e33f039ca516\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"error_prone_annotation-2.19.1.pom\">\n            <sha256 value=\"2a01226a8509dbd2b6da8008aaacf6fb4f83198ee1f2666cbabd4a19a3f98197\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_annotation\" version=\"2.34.0\">\n         <artifact name=\"error_prone_annotation-2.34.0.jar\">\n            <sha256 value=\"99f8b53c75a50617d4f9bf45512eda82e7d8e9eb377471d822d3d4c4e034c510\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"error_prone_annotation-2.34.0.pom\">\n            <sha256 value=\"439962cc28110faaf17721c1ff4c588d31ec6f3a1a8bfad035b4215a4c408fdd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_annotations\" version=\"2.11.0\">\n         <artifact name=\"error_prone_annotations-2.11.0.pom\">\n            <sha256 value=\"0261ca01f2d2e9ac2ae2ece75d42c56323b385fb294b6bc943f62ef4e92ddf08\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_annotations\" version=\"2.15.0\">\n         <artifact name=\"error_prone_annotations-2.15.0.jar\">\n            <sha256 value=\"067047714349e7789a5bdbfad9d1c0af9f3a1eb28c55a0ee3f68e682f905c4eb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"error_prone_annotations-2.15.0.pom\">\n            <sha256 value=\"7bae617e32681ebbb289c203c905f646c2a0397598af786d961a54aaa3d2b1e6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_annotations\" version=\"2.18.0\">\n         <artifact name=\"error_prone_annotations-2.18.0.jar\">\n            <sha256 value=\"9e6814cb71816988a4fd1b07a993a8f21bb7058d522c162b1de849e19bea54ae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"error_prone_annotations-2.18.0.pom\">\n            <sha256 value=\"920135797dcca5917b5a5c017642a58d340a4cd1bcd12f56f892a5663bd7bddc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_annotations\" version=\"2.23.0\">\n         <artifact name=\"error_prone_annotations-2.23.0.jar\">\n            <sha256 value=\"ec6f39f068b6ff9ac323c68e28b9299f8c0a80ca512dccb1d4a70f40ac3ec054\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"error_prone_annotations-2.23.0.pom\">\n            <sha256 value=\"d5abb17f231b63bf009358fa640281b744810cb9587e5994977834959c07dbd8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_annotations\" version=\"2.25.0\">\n         <artifact name=\"error_prone_annotations-2.25.0-sources.jar\">\n            <sha256 value=\"fceb685146fad483d70fe78247e5e9b2a24af14fbae1f5ca940f58f8d2b05034\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"error_prone_annotations-2.25.0.jar\">\n            <sha256 value=\"47d91c141efd6b1d9231a322deca8f4c32dac8e940c6c38d768b36add221700d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"error_prone_annotations-2.25.0.pom\">\n            <sha256 value=\"b58d79dee1968d58dce9c5b03e42106d7dd4c07f7078eb393c671e58f23bf611\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_annotations\" version=\"2.26.1\">\n         <artifact name=\"error_prone_annotations-2.26.1.jar\">\n            <sha256 value=\"de25f2d9a2156529bd765f51d8efdfc0dfa7301e04efb9cc75b7f10cf5d0e0fb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"error_prone_annotations-2.26.1.pom\">\n            <sha256 value=\"aea7e991e2dfdcb47f5fbd508587535f7802bcb9e2fc2d4ebb50be41b684da9f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_annotations\" version=\"2.27.0\">\n         <artifact name=\"error_prone_annotations-2.27.0.jar\">\n            <sha256 value=\"24c923372c58e35d0b9f16a028929bb9aedc77521867c274f2bd0735df5ba1f5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"error_prone_annotations-2.27.0.pom\">\n            <sha256 value=\"4ca5a35d61235e16549ac346d1e34551cdf0fe27e84aa57e03cbeb255ea4e5da\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_annotations\" version=\"2.28.0\">\n         <artifact name=\"error_prone_annotations-2.28.0.jar\">\n            <sha256 value=\"f3fc8a3a0a4020706a373b00e7f57c2512dd26d1f83d28c7d38768f8682b231e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"error_prone_annotations-2.28.0.pom\">\n            <sha256 value=\"0ce909f13a568148476e5ee200f380f98c75ba08971aaf15db295eb77598ef3a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_annotations\" version=\"2.3.1\">\n         <artifact name=\"error_prone_annotations-2.3.1.pom\">\n            <sha256 value=\"3edce6b711ba368efe16b9b7aacb0214fbd648414cb9b965953a2e7ed89a819a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_annotations\" version=\"2.30.0\">\n         <artifact name=\"error_prone_annotations-2.30.0.jar\">\n            <sha256 value=\"144f3aefbd6e27daec55d3753b2c6b13c1afdaf0cf04816cdb564588ed92f1bd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"error_prone_annotations-2.30.0.pom\">\n            <sha256 value=\"f713849c23b34953e854565dce8aa795cae0c1416611b720c21461322c795f86\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_parent\" version=\"2.11.0\">\n         <artifact name=\"error_prone_parent-2.11.0.pom\">\n            <sha256 value=\"8283f0cb44c624a79d330b6fd80b8b8a715a68b3685c9a951c3de837d4540551\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_parent\" version=\"2.15.0\">\n         <artifact name=\"error_prone_parent-2.15.0.pom\">\n            <sha256 value=\"11dcacd17aaac69a99405273badfdaa5f9661d60d179b8a44f503958baa55f88\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_parent\" version=\"2.18.0\">\n         <artifact name=\"error_prone_parent-2.18.0.pom\">\n            <sha256 value=\"47f22e99c7bf466391def16f8377985e5d3ba6f5bbcf65853644805513e15fad\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_parent\" version=\"2.19.1\">\n         <artifact name=\"error_prone_parent-2.19.1.pom\">\n            <sha256 value=\"82f889260fe1d50ff6300f3b1977a7a80cd794f95f1b48ef210b85e4d16109cd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_parent\" version=\"2.23.0\">\n         <artifact name=\"error_prone_parent-2.23.0.pom\">\n            <sha256 value=\"f5470a4b3104fe309fbe94a80d16c3c54d20f748f4c5de4f68a428688f30cbd4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_parent\" version=\"2.25.0\">\n         <artifact name=\"error_prone_parent-2.25.0.pom\">\n            <sha256 value=\"56753de4bea7a20c29d699667f29f29727c0bbad5cf69973a994094718da75c5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_parent\" version=\"2.26.1\">\n         <artifact name=\"error_prone_parent-2.26.1.pom\">\n            <sha256 value=\"4a6ad00d31b0a5adcd9a4f605065d5b445fae4a04cbf827e5d1ac1077e2f814d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_parent\" version=\"2.27.0\">\n         <artifact name=\"error_prone_parent-2.27.0.pom\">\n            <sha256 value=\"fa81829d049559df6927f9c9a6fd6bbd09f8b50e6d4736ae72c8300b6c3d7654\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_parent\" version=\"2.28.0\">\n         <artifact name=\"error_prone_parent-2.28.0.pom\">\n            <sha256 value=\"accefdbb5416cef5fcd2ddc37db4f1fcb34a2193cc1a55dfe5970a131b3e7683\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_parent\" version=\"2.3.1\">\n         <artifact name=\"error_prone_parent-2.3.1.pom\">\n            <sha256 value=\"767525d9a81129cd081968382980336327be4162b1e2251a182911daa733c123\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_parent\" version=\"2.30.0\">\n         <artifact name=\"error_prone_parent-2.30.0.pom\">\n            <sha256 value=\"5e8834ccc0e5ed0c72f306c250b518e6ad10d075a9b7b910cf695cba1ee02a2d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"error_prone_parent\" version=\"2.34.0\">\n         <artifact name=\"error_prone_parent-2.34.0.pom\">\n            <sha256 value=\"9db673b33ad310735c6467dd6f6606290e609e867a62e5bad8f9b3365db7188e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.errorprone\" name=\"javac-shaded\" version=\"9-dev-r4023-3\">\n         <artifact name=\"javac-shaded-9-dev-r4023-3.jar\">\n            <sha256 value=\"65bfccf60986c47fbc17c9ebab0be626afc41741e0a6ec7109e0768817a36f30\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"javac-shaded-9-dev-r4023-3.pom\">\n            <sha256 value=\"7459fd63c1e73770ca44d37a7a685b731a946eb7cd701ccb284dcb0ce6de3f88\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.flatbuffers\" name=\"flatbuffers-java\" version=\"1.12.0\">\n         <artifact name=\"flatbuffers-java-1.12.0.jar\">\n            <sha256 value=\"3f8c088b4dd04a9858721f2e162508c94db0dd86f961e306ee63ef2eda871bf7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"flatbuffers-java-1.12.0.pom\">\n            <sha256 value=\"cb226baf546260770f21e8152a6aa88ba15230d739f750df480f2a668d43e0eb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.googlejavaformat\" name=\"google-java-format\" version=\"1.5\">\n         <artifact name=\"google-java-format-1.5.jar\">\n            <sha256 value=\"aa19ad7850fb85178aa22f2fddb163b84d6ce4d0035872f30d4408195ca1144e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"google-java-format-1.5.pom\">\n            <sha256 value=\"994510ba3b16fb02e5ca17e8fd6158e2702fe95a1359c80be547b86b76a7aad5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.googlejavaformat\" name=\"google-java-format-parent\" version=\"1.5\">\n         <artifact name=\"google-java-format-parent-1.5.pom\">\n            <sha256 value=\"13aaf29158343f8b9c7dd7d3f58610290b05ad29ea69c7b9504869e47fbf6319\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"failureaccess\" version=\"1.0.1\">\n         <artifact name=\"failureaccess-1.0.1.jar\">\n            <sha256 value=\"a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"failureaccess-1.0.1.pom\">\n            <sha256 value=\"e96042ce78fecba0da2be964522947c87b40a291b5fd3cd672a434924103c4b9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"failureaccess\" version=\"1.0.2\">\n         <artifact name=\"failureaccess-1.0.2.jar\">\n            <sha256 value=\"8a8f81cf9b359e3f6dfa691a1e776985c061ef2f223c9b2c80753e1b458e8064\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"failureaccess-1.0.2.pom\">\n            <sha256 value=\"19ebc6f4bdb4edbb3d07b6ee994f846b54ef295582a9b5634719ffa9f31d03b2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"guava\" version=\"30.1.1-jre\">\n         <artifact name=\"guava-30.1.1-jre.pom\">\n            <sha256 value=\"6d18c9188ad4b7855fb7fea6f1793754b41fa1747811ae1e3d753d6fcc9dcc59\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"guava\" version=\"32.0.1-jre\">\n         <artifact name=\"guava-32.0.1-jre.jar\">\n            <sha256 value=\"bd7fa227591fb8509677d0d1122cf95158f3b8a9f45653f58281d879f6dc48c5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"guava-32.0.1-jre.pom\">\n            <sha256 value=\"42c257f7f736d377b31afeeee978ab26d730cd70af60dde7662e182352e2482a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"guava\" version=\"32.1.3-android\">\n         <artifact name=\"guava-32.1.3-android.jar\">\n            <sha256 value=\"20e6ac8902ddf49e7806cc70f3054c8d91accb5eefdc10f3207e80e0a336b263\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"guava-32.1.3-android.module\">\n            <sha256 value=\"f8a87cef72c0e8027a6fae3cbdf0072a241ce6d8e760f96e7087b742a6605a61\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"guava-32.1.3-jre.jar\">\n            <sha256 value=\"6d4e2b5a118aab62e6e5e29d185a0224eed82c85c40ac3d33cf04a270c3b3744\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"guava\" version=\"33.0.0-android\">\n         <artifact name=\"guava-33.0.0-android.jar\">\n            <sha256 value=\"640535014a304c50221abad19d6b22a096f13119c7c447a655cc1e009a32208d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"guava-33.0.0-android.module\">\n            <sha256 value=\"15572b680b5dfcbef966d0120e6504129a8c7fbf600845df369d939317b82036\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"guava-33.0.0-jre.jar\">\n            <sha256 value=\"f4d85c3e4d411694337cb873abea09b242b664bb013320be6105327c45991537\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"guava\" version=\"33.0.0-jre\">\n         <artifact name=\"guava-33.0.0-jre.jar\">\n            <sha256 value=\"f4d85c3e4d411694337cb873abea09b242b664bb013320be6105327c45991537\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"guava-33.0.0-jre.module\">\n            <sha256 value=\"59a2dbd055d1baa762e78f1a5ba3ab973edd13fc27dcc1871105e2f797f682d3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"guava\" version=\"33.2.1-android\">\n         <artifact name=\"guava-33.2.1-android.jar\">\n            <sha256 value=\"6b55fbe6ffee621454c03df7bea720d189789e136391a524e29506ff40654180\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"guava-33.2.1-android.module\">\n            <sha256 value=\"2d6a278db032c3ea603afcf5984568d2b655660c27bced232fa4c2c69ed450bb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"guava-33.2.1-jre.jar\">\n            <sha256 value=\"452b2d9787b7d366fa8cf5ed9a1c40404542d05effa7a598da03bbbbb76d9f31\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"guava\" version=\"33.2.1-jre\">\n         <artifact name=\"guava-33.2.1-jre.jar\">\n            <sha256 value=\"452b2d9787b7d366fa8cf5ed9a1c40404542d05effa7a598da03bbbbb76d9f31\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"guava-33.2.1-jre.module\">\n            <sha256 value=\"d23eda6a1c2c0bd25f8a3346cddeec43b51f75bf819b931eaa98326ea6447422\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"guava\" version=\"33.3.1-android\">\n         <artifact name=\"guava-33.3.1-android.jar\">\n            <sha256 value=\"2c3e41d1b380f2044d257947a3aa82dabf3ae4b978622745254aa18b6cf89ab0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"guava-33.3.1-android.module\">\n            <sha256 value=\"6971614ddeee003e54d2b69c6b0c94ce8a5b5eba980d16455c81df9089a7acb7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"guava-33.3.1-jre.jar\">\n            <sha256 value=\"4bf0e2c5af8e4525c96e8fde17a4f7307f97f8478f11c4c8e35a0e3298ae4e90\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"guava\" version=\"33.3.1-jre\">\n         <artifact name=\"guava-33.3.1-android.jar\">\n            <sha256 value=\"2c3e41d1b380f2044d257947a3aa82dabf3ae4b978622745254aa18b6cf89ab0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"guava-33.3.1-jre.jar\">\n            <sha256 value=\"4bf0e2c5af8e4525c96e8fde17a4f7307f97f8478f11c4c8e35a0e3298ae4e90\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"guava-33.3.1-jre.module\">\n            <sha256 value=\"41858c84753fd96a6b7c51122fccef39558c91cc08264e08506bcf20e0e63733\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"guava-parent\" version=\"26.0-android\">\n         <artifact name=\"guava-parent-26.0-android.pom\">\n            <sha256 value=\"f8698ab46ca996ce889c1afc8ca4f25eb8ac6b034dc898d4583742360016cc04\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"guava-parent\" version=\"30.1.1-jre\">\n         <artifact name=\"guava-parent-30.1.1-jre.pom\">\n            <sha256 value=\"0422bd45ca2497bfa18aad2698324965ed70da0907b8a7d459b7ab3b5eed3834\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"guava-parent\" version=\"32.0.1-jre\">\n         <artifact name=\"guava-parent-32.0.1-jre.pom\">\n            <sha256 value=\"43ed0e36b353f41e5eb75cd756667c9e2df97cef06eb16066967158a1d034d2a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"guava-parent\" version=\"32.1.3-android\">\n         <artifact name=\"guava-parent-32.1.3-android.pom\">\n            <sha256 value=\"41fc26464fba8ab0b55b402676b45369e0aaa9ba8e0a5a5dec80452908ac97e1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"guava-parent\" version=\"33.0.0-android\">\n         <artifact name=\"guava-parent-33.0.0-android.pom\">\n            <sha256 value=\"5af483b78c49de78c49faedd2a58752784a44c8363f5e25e52e297814c09177a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"guava-parent\" version=\"33.0.0-jre\">\n         <artifact name=\"guava-parent-33.0.0-jre.pom\">\n            <sha256 value=\"040cc88c680b413d70ba9fc8371b36093021b10996aa3598621de767d418229a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"guava-parent\" version=\"33.2.1-android\">\n         <artifact name=\"guava-parent-33.2.1-android.pom\">\n            <sha256 value=\"5af287a2deb741f38c24a0b390a7a388faee5d7cf0edc4c7b7b98559a5f29fbf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"guava-parent\" version=\"33.2.1-jre\">\n         <artifact name=\"guava-parent-33.2.1-jre.pom\">\n            <sha256 value=\"9095f6d8ee3765950207510785830cc2280e781067915fa99cfe1740d4865c14\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"guava-parent\" version=\"33.3.1-android\">\n         <artifact name=\"guava-parent-33.3.1-android.pom\">\n            <sha256 value=\"6e11986ea7250b51f847157e2dc937f32a306804dfce0007a5e81ddb9b95c579\" origin=\"Generated by Conny Duck\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"guava-parent\" version=\"33.3.1-jre\">\n         <artifact name=\"guava-parent-33.3.1-jre.pom\">\n            <sha256 value=\"55441db27e8869dfefe053059bdf478bdc7e95585642bf391f0023345fd56287\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"listenablefuture\" version=\"1.0\">\n         <artifact name=\"listenablefuture-1.0-sources.jar\">\n            <sha256 value=\"3d1bd8d4a39b293612a40e547ec51d9ce34fa638d7adeae83871cdbe2923b161\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"listenablefuture-1.0.jar\">\n            <sha256 value=\"e4ad7607e5c0477c6f890ef26a49cb8d1bb4dffb650bab4502afee64644e3069\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"listenablefuture-1.0.pom\">\n            <sha256 value=\"53873caf26bc1ed8a567ea6c939ab2aaa3f47a5e32d5cade95ddf5080d23238a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.guava\" name=\"listenablefuture\" version=\"9999.0-empty-to-avoid-conflict-with-guava\">\n         <artifact name=\"listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar\">\n            <sha256 value=\"b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.pom\">\n            <sha256 value=\"18d4b1db26153d4e55079ce1f76bb1fe05cdb862ef9954a88cbcc4ff38b8679b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.j2objc\" name=\"j2objc-annotations\" version=\"1.3\">\n         <artifact name=\"j2objc-annotations-1.3.pom\">\n            <sha256 value=\"5faca824ba115bee458730337dfdb2fcea46ba2fd774d4304edbf30fa6a3f055\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.j2objc\" name=\"j2objc-annotations\" version=\"2.8\">\n         <artifact name=\"j2objc-annotations-2.8.jar\">\n            <sha256 value=\"f02a95fa1a5e95edb3ed859fd0fb7df709d121a35290eff8b74dce2ab7f4d6ed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"j2objc-annotations-2.8.pom\">\n            <sha256 value=\"37f87798b18385113c918bfa9e1276fe50735ef8fa849b5800c519d54dbf11f8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.j2objc\" name=\"j2objc-annotations\" version=\"3.0.0\">\n         <artifact name=\"j2objc-annotations-3.0.0.jar\">\n            <sha256 value=\"88241573467ddca44ffd4d74aa04c2bbfd11bf7c17e0c342c94c9de7a70a7c64\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"j2objc-annotations-3.0.0.pom\">\n            <sha256 value=\"23b3d039e168ad89dd114698e6dd7be383f4a2c577b8877d82c73a6515e74a17\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.jimfs\" name=\"jimfs\" version=\"1.1\">\n         <artifact name=\"jimfs-1.1.jar\">\n            <sha256 value=\"c4828e28d7c0a930af9387510b3bada7daa5c04d7c25a75c7b8b081f1c257ddd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"jimfs-1.1.pom\">\n            <sha256 value=\"efa86e5cd922f17b472fdfcae57234d8d4ac3e148b6250737dfce454af7a7a44\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.jimfs\" name=\"jimfs-parent\" version=\"1.1\">\n         <artifact name=\"jimfs-parent-1.1.pom\">\n            <sha256 value=\"c71555751e57e0ef912870e8ac9625ae782502a6a5b9c19ccf83b2a97d8b26bd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.protobuf\" name=\"protobuf-bom\" version=\"3.22.3\">\n         <artifact name=\"protobuf-bom-3.22.3.pom\">\n            <sha256 value=\"13a32dfb9de6fc1c3c3f7af53e4d5c77fd77d2b476bae38b74b7581cdee2e655\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.protobuf\" name=\"protobuf-bom\" version=\"3.24.4\">\n         <artifact name=\"protobuf-bom-3.24.4.pom\">\n            <sha256 value=\"04ecfd52c50df07a75551f9b09e0ef30630ee4237d091ca0eca71e5bfb78cce5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.protobuf\" name=\"protobuf-bom\" version=\"3.25.5\">\n         <artifact name=\"protobuf-bom-3.25.5.pom\">\n            <sha256 value=\"080e2984173238b50e064c226afffbb1b0233520295c790a7fd3d6ae4593f063\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.protobuf\" name=\"protobuf-java\" version=\"3.22.3\">\n         <artifact name=\"protobuf-java-3.22.3.jar\">\n            <sha256 value=\"59d388ea6a2d2d76ae8efff7fd4d0c60c6f0f464c3d3ab9be8e5add092975708\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protobuf-java-3.22.3.pom\">\n            <sha256 value=\"186ea794150f5b42aea7ec6041df373d1d8a8a831624f58a55debb6043ec7312\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.protobuf\" name=\"protobuf-java\" version=\"3.24.4\">\n         <artifact name=\"protobuf-java-3.24.4.jar\">\n            <sha256 value=\"e5655522be1aa5cc1f2f092aa036b0445157f294928eedf1332ac938c7b69686\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protobuf-java-3.24.4.pom\">\n            <sha256 value=\"3941221ca657819ddebd95fe8b740f470af7abf30460b13ea1c9ab79f10fab91\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.protobuf\" name=\"protobuf-java\" version=\"3.25.5\">\n         <artifact name=\"protobuf-java-3.25.5.jar\">\n            <sha256 value=\"8540247fad9e06baefa8fb45eb313802d019f485f14300e0f9d6b556ed88e753\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protobuf-java-3.25.5.pom\">\n            <sha256 value=\"e752032157a7a39be9be3786684075452a46cd586b2865abd33e707568a4c8af\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.protobuf\" name=\"protobuf-java-util\" version=\"3.22.3\">\n         <artifact name=\"protobuf-java-util-3.22.3.jar\">\n            <sha256 value=\"c615f76879dc5c303e4df5b94a6afa39534058c7545db2d483fd95d9f63c8bfe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protobuf-java-util-3.22.3.pom\">\n            <sha256 value=\"b44701b06a064865ec9b5614a93e9e28fadd7d4dfc4b460f21c819ef53dbe2d6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.protobuf\" name=\"protobuf-java-util\" version=\"3.24.4\">\n         <artifact name=\"protobuf-java-util-3.24.4.jar\">\n            <sha256 value=\"133c929e2cfe3990a105d18eaccc49122b2d2fb492b420ef02d5d9f937eaebb8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protobuf-java-util-3.24.4.pom\">\n            <sha256 value=\"9f0cec276d4d9d5a43d6e29cc2b024e46804c9386a96fa527eefd7bf7488e7f0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.protobuf\" name=\"protobuf-java-util\" version=\"3.25.5\">\n         <artifact name=\"protobuf-java-util-3.25.5.jar\">\n            <sha256 value=\"dacc58b2c3d2fa8d4bddc1acb881e78d6cf7c137dd78bc1d67f6aca732436a8d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protobuf-java-util-3.25.5.pom\">\n            <sha256 value=\"a09d190eaa6a79616bc5f4b5404e94b0cab559803a98c8a090c4099962f41f92\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.protobuf\" name=\"protobuf-kotlin\" version=\"3.24.4\">\n         <artifact name=\"protobuf-kotlin-3.24.4.jar\">\n            <sha256 value=\"508ca13d97b50f5404eaa37eb4493cb07884162eb7971bf924d8f803d4c21bb4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"protobuf-kotlin-3.24.4.pom\">\n            <sha256 value=\"3bb1e6ef94a6a436bd2ff66af0dd603c23ed3a2943b2fb899f83d9f8792d72a9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.protobuf\" name=\"protobuf-parent\" version=\"3.22.3\">\n         <artifact name=\"protobuf-parent-3.22.3.pom\">\n            <sha256 value=\"399133d7f6f57934dd76c4b18e86348f424532108daf4a01c8f820b8665f0929\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.protobuf\" name=\"protobuf-parent\" version=\"3.24.4\">\n         <artifact name=\"protobuf-parent-3.24.4.pom\">\n            <sha256 value=\"fb7ec0505876fdb9ec79510aced2d1eb04c3b8cfc690b589049757ca981cadb3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.protobuf\" name=\"protobuf-parent\" version=\"3.25.5\">\n         <artifact name=\"protobuf-parent-3.25.5.pom\">\n            <sha256 value=\"64cc0e3ad6e85f5aec8f9dcf9341d1379e9525364ff53e23e16d8d5824673ef7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.testing.platform\" name=\"android-device-provider-local\" version=\"0.0.9-alpha02\">\n         <artifact name=\"android-device-provider-local-0.0.9-alpha02.jar\">\n            <sha256 value=\"446d0fca4e3711e3e37219cf888ec12b4dec3f14999ee439735385fb787e914b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-local-0.0.9-alpha02.pom\">\n            <sha256 value=\"afd953a41e294a6094c02620c8e9a0ebc9a743a00ff44a9db5b84f29497730ba\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.testing.platform\" name=\"android-device-provider-local\" version=\"0.0.9-alpha03\">\n         <artifact name=\"android-device-provider-local-0.0.9-alpha03.jar\">\n            <sha256 value=\"667a4d35bbba87d3c86f5180dfa521fdbd7a4ef5c60d949154b0301f3e232e1b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-device-provider-local-0.0.9-alpha03.pom\">\n            <sha256 value=\"913b3aee95a71581a409038b1cca273ce835d3f2b8f2ab5a600bbed769ea6dfd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.testing.platform\" name=\"android-driver-instrumentation\" version=\"0.0.9-alpha02\">\n         <artifact name=\"android-driver-instrumentation-0.0.9-alpha02.jar\">\n            <sha256 value=\"a34731dc23ead15144ad100efac5726a7ed82c2ec8b889504d549ae72dff5029\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-driver-instrumentation-0.0.9-alpha02.pom\">\n            <sha256 value=\"722d8c31107b71baf78f11fb10e879c7158f4681d99bacade726147368dc6ade\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.testing.platform\" name=\"android-driver-instrumentation\" version=\"0.0.9-alpha03\">\n         <artifact name=\"android-driver-instrumentation-0.0.9-alpha03.jar\">\n            <sha256 value=\"507c632ec7db77bcb299b5519d59b14cc6243aac541767c632fdbeddc6226b07\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-driver-instrumentation-0.0.9-alpha03.pom\">\n            <sha256 value=\"02d5c14ad0995971a108819075a7175d10076bd7152772ced3442bb19c4c1b53\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.testing.platform\" name=\"android-test-plugin\" version=\"0.0.9-alpha02\">\n         <artifact name=\"android-test-plugin-0.0.9-alpha02.jar\">\n            <sha256 value=\"a87ed1c766c9a498cfc9280ca65d0c4853875b7ed7fa5ffd89428904eba1c0ff\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-0.0.9-alpha02.pom\">\n            <sha256 value=\"70eb4ad0de146f958eb5d99bdff8d72b7b07a5c27ac690c421ae45617e031e54\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.testing.platform\" name=\"android-test-plugin\" version=\"0.0.9-alpha03\">\n         <artifact name=\"android-test-plugin-0.0.9-alpha03.jar\">\n            <sha256 value=\"d6cb7e126f433037190bcd3c3b904b19ba842d46b17b0fd27c38cc4ccecbec90\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"android-test-plugin-0.0.9-alpha03.pom\">\n            <sha256 value=\"a82b9c10caaa8e5d1f3cdb63847a9b03ac9738a525b309ab70d4d1661edfea22\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.testing.platform\" name=\"core\" version=\"0.0.9-alpha02\">\n         <artifact name=\"core-0.0.9-alpha02.jar\">\n            <sha256 value=\"fe215abd101f29fb388535592e1f14bb4cf8501da6db84422ba1945ac4e26872\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-0.0.9-alpha02.pom\">\n            <sha256 value=\"963e12fc1a9e94ca091ded5aac611284d36cf0e309ee71882813b5a81183098a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.testing.platform\" name=\"core\" version=\"0.0.9-alpha03\">\n         <artifact name=\"core-0.0.9-alpha03.jar\">\n            <sha256 value=\"6e1806d015c416596f53a45a3100e25743c313a6e3fc4f52f24e8b257f2c82ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-0.0.9-alpha03.pom\">\n            <sha256 value=\"9f03da959b3261cc1eb9c8886bf8aed6f5d60bb95b8d8638bed55443ae620c2a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.testing.platform\" name=\"core-proto\" version=\"0.0.9-alpha02\">\n         <artifact name=\"core-proto-0.0.9-alpha02.jar\">\n            <sha256 value=\"6d8a8906774150f43a8fad08ca64e25c6070c39bd8a6fc13b2593f289242fe95\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-proto-0.0.9-alpha02.pom\">\n            <sha256 value=\"27ce7959427a2ffee48d0feb45128a3f36cc417ed8a822afa22822c8f5a58b25\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.testing.platform\" name=\"core-proto\" version=\"0.0.9-alpha03\">\n         <artifact name=\"core-proto-0.0.9-alpha03.jar\">\n            <sha256 value=\"d001eb0ccbbfc8cb9eaa193a358e63712974639775647be949ab232c2b29b407\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"core-proto-0.0.9-alpha03.pom\">\n            <sha256 value=\"3bb45280df1dd1c96b9a01724a614566b7d60d33453fcd52c2c741f9999c3a4e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.testing.platform\" name=\"launcher\" version=\"0.0.9-alpha02\">\n         <artifact name=\"launcher-0.0.9-alpha02.jar\">\n            <sha256 value=\"5423e8ca410fcdbcfb3286c18b8be080eaf4ee9bd796ead903e8c885ead16ec3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"launcher-0.0.9-alpha02.pom\">\n            <sha256 value=\"0f022a32490b76449f7404b0506dace458aeaa97c8300b34cfd5be1af1ac992b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.testing.platform\" name=\"launcher\" version=\"0.0.9-alpha03\">\n         <artifact name=\"launcher-0.0.9-alpha03.jar\">\n            <sha256 value=\"0012f980a059a0c4c216d0f1d0016867ab31eb8079e3f8f879f1f02b7be3a6e7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"launcher-0.0.9-alpha03.pom\">\n            <sha256 value=\"18b80f34a5e9fa1a5eec2250fd71e5465f2eb4b4d09e181940e38f1b6e064452\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.testparameterinjector\" name=\"test-parameter-injector\" version=\"1.18\">\n         <artifact name=\"test-parameter-injector-1.18.jar\">\n            <sha256 value=\"e5a7c649c54c412049908247ca5e25fe6921d746849c6017a84dc6044237a4b4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"test-parameter-injector-1.18.pom\">\n            <sha256 value=\"de05732fbdcb5b05e19985abc0a284e41be3ec685387d04f8488a5e6504ea08e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.testparameterinjector\" name=\"test-parameter-injector-parent\" version=\"1.18\">\n         <artifact name=\"test-parameter-injector-parent-1.18.pom\">\n            <sha256 value=\"b4aee6be3f6dfafa68309e9da4fb38af7fbc2f8c3e26197451f1db38dc4a85d0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.truth\" name=\"truth\" version=\"1.4.2\">\n         <artifact name=\"truth-1.4.2-sources.jar\">\n            <sha256 value=\"9e6e49a3d2eefcadc0294878cb19fa6c6da305f2939c422f3cbd8caf9efe80bb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"truth-1.4.2.jar\">\n            <sha256 value=\"14c297bc64ca8bc15b6baf67f160627e4562ec91624797e312e907b431113508\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"truth-1.4.2.pom\">\n            <sha256 value=\"8ec82a5568cf95890cc85ef30eb2941c42870c5136a3e0b18d50cb3956584000\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.truth\" name=\"truth\" version=\"1.4.3\">\n         <artifact name=\"truth-1.4.3.jar\">\n            <sha256 value=\"403c6f2b8f87011e729368d0230358ea492ca64b265f010040e37b831acf17b1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"truth-1.4.3.pom\">\n            <sha256 value=\"24cb026df29484105ab9288c493188b1cd29ecb47dc61254f5fb818b51b60280\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.truth\" name=\"truth\" version=\"1.4.4\">\n         <artifact name=\"truth-1.4.4.jar\">\n            <sha256 value=\"52c86cddadc31bc8457c1e15689fc6b75e2e97ce2a83d8b54b795d556d489f8c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"truth-1.4.4.pom\">\n            <sha256 value=\"def5ddc6bfa34a47dc33695db7309b8aca14fd5569dfd6d11ae9bc084318ee26\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.truth\" name=\"truth-parent\" version=\"1.4.2\">\n         <artifact name=\"truth-parent-1.4.2.pom\">\n            <sha256 value=\"1065626a84aaa9f228c37fc43b53c3e5901a344e2b31feea0115e10e7b130d17\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.truth\" name=\"truth-parent\" version=\"1.4.3\">\n         <artifact name=\"truth-parent-1.4.3.pom\">\n            <sha256 value=\"cc5bb8f448a2ddd130f55959ee6ba8b307a41b24c65a1c0bfd7d7a58bc0c55d2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.google.truth\" name=\"truth-parent\" version=\"1.4.4\">\n         <artifact name=\"truth-parent-1.4.4.pom\">\n            <sha256 value=\"29c973f0fce3172b1b18bc7c9be2fbdc7ea1f0fa0801639e477ea5b66eebb49d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.googlecode.juniversalchardet\" name=\"juniversalchardet\" version=\"1.0.3\">\n         <artifact name=\"juniversalchardet-1.0.3.jar\">\n            <sha256 value=\"757bfe906193b8b651e79dc26cd67d6b55d0770a2cdfb0381591504f779d4a76\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"juniversalchardet-1.0.3.pom\">\n            <sha256 value=\"7846399b35c7cd642a9b3a000c3e2d62d04eb37a4547b6933cc8b18bcc2f086b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle\" name=\"develocity-gradle-plugin\" version=\"3.17.4\">\n         <artifact name=\"develocity-gradle-plugin-3.17.4.jar\">\n            <sha256 value=\"e2b3f8a191b0b401b75c2c4542d3d1719814a4212e6920fae4f2f940678bfd99\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"develocity-gradle-plugin-3.17.4.module\">\n            <sha256 value=\"c2bce4ef3437b8cb31b5b00066094c67e33274dd846a17329dc4d5ceadcad56c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle\" name=\"develocity-gradle-plugin\" version=\"3.17.5\">\n         <artifact name=\"develocity-gradle-plugin-3.17.5.jar\">\n            <sha256 value=\"f92605eca13dc00ad8cb3c0d0317bdb7ad410bbce4cdfebf11a451f6a65a7040\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"develocity-gradle-plugin-3.17.5.module\">\n            <sha256 value=\"6a7182b1f298153cf2efdec39f3ecd3014624f76d4872a78b180c1f0ea363484\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle\" name=\"develocity-gradle-plugin\" version=\"3.17.6\">\n         <artifact name=\"develocity-gradle-plugin-3.17.6.jar\">\n            <sha256 value=\"a143df911b3e50055520ab70875829a28ba0039267c6282958b9970ba53fa981\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"develocity-gradle-plugin-3.17.6.module\">\n            <sha256 value=\"a856af3fd546e9caf3176f02849e29b649f2f6daa363b6556a9437c5e7f7d4e2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle\" name=\"develocity-gradle-plugin\" version=\"3.18\">\n         <artifact name=\"develocity-gradle-plugin-3.18.jar\">\n            <sha256 value=\"87100fa294347d4f32799b8bd720dd805bc95d50545badf901a0269e21e95053\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"develocity-gradle-plugin-3.18.module\">\n            <sha256 value=\"ffdec584ad7c7a77d9b6633e1fa8f9418c7c998cb625684849ec4c620e738f6a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle\" name=\"develocity-gradle-plugin\" version=\"3.18.1\">\n         <artifact name=\"develocity-gradle-plugin-3.18.1.jar\">\n            <sha256 value=\"0adf32afef4ae46a131367e393d18a5d9529750dfd1432287797a64b2c36c7ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"develocity-gradle-plugin-3.18.1.module\">\n            <sha256 value=\"eb84b59d32bc9581a025b0c5b24f8fad9248712f27ee275f54394a7e84cb186f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle\" name=\"develocity-gradle-plugin\" version=\"3.18.2\">\n         <artifact name=\"develocity-gradle-plugin-3.18.2.jar\">\n            <sha256 value=\"1cdc2770a1d01d99185a81a25b08bb749a0bc78aed6b3358e268060242e5719a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"develocity-gradle-plugin-3.18.2.module\">\n            <sha256 value=\"c8689b15d3fafbe7e143fa399e1bcce99bac7b10966a052e133fbfca6bbc02d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle\" name=\"develocity-gradle-plugin\" version=\"3.19\">\n         <artifact name=\"develocity-gradle-plugin-3.19.jar\">\n            <sha256 value=\"2d4cddc4cb19dba6badc669e22f01b225ab30022fc9b8238d5ad86f308c8bb91\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"develocity-gradle-plugin-3.19.module\">\n            <sha256 value=\"ac2318c8250f4dda48e71fe329bf7e59f6230df4ba95f697a9a868dd978a09b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle\" name=\"develocity-gradle-plugin\" version=\"3.19.1\">\n         <artifact name=\"develocity-gradle-plugin-3.19.1.jar\">\n            <sha256 value=\"be27ade2abaefd28e6dfbb608a7c27b6eed45f712d6ceb767d59399cb687873a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"develocity-gradle-plugin-3.19.1.module\">\n            <sha256 value=\"c25c585336a4be32fe2d0617f3025ed9e1d4f9d4b60c15cc35debb1052e9d22a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle\" name=\"develocity-gradle-plugin\" version=\"3.19.2\">\n         <artifact name=\"develocity-gradle-plugin-3.19.2.jar\">\n            <sha256 value=\"fc611e8858a901619831ea1d9efd289db7fea28a0ca3d091abdd363365d9512b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"develocity-gradle-plugin-3.19.2.module\">\n            <sha256 value=\"bff0b51873f825f0e2ed8e41ef5c8fa0d180cd4e1f6044aab5d27af5de7f22a9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle\" name=\"develocity-gradle-plugin\" version=\"4.0\">\n         <artifact name=\"develocity-gradle-plugin-4.0.jar\">\n            <sha256 value=\"5816f67983da700923e3dd62a899c31d6fda57459b0eaa694faf02be910ea3f2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"develocity-gradle-plugin-4.0.module\">\n            <sha256 value=\"d0a723f721ff2e2d8dc88a32e8cc795b43f8f188622776cbba02ca4c4b843aa2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle\" name=\"develocity-gradle-plugin\" version=\"4.0.1\">\n         <artifact name=\"develocity-gradle-plugin-4.0.1.jar\">\n            <sha256 value=\"62a98a9df9fbf8c16772787aa5a0009cedcf45c366a0969274bc3b3644c1de25\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"develocity-gradle-plugin-4.0.1.module\">\n            <sha256 value=\"d44233eda054e908dd223aa2f4130a640ce056e93c3ac16ec36978576aa1ff7e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle.develocity\" name=\"com.gradle.develocity.gradle.plugin\" version=\"3.17.4\">\n         <artifact name=\"com.gradle.develocity.gradle.plugin-3.17.4.pom\">\n            <sha256 value=\"e0032ae0d8d747734cbc55f81f49484ada02698067c5dda08a59ec2a7c6395b2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle.develocity\" name=\"com.gradle.develocity.gradle.plugin\" version=\"3.17.5\">\n         <artifact name=\"com.gradle.develocity.gradle.plugin-3.17.5.pom\">\n            <sha256 value=\"eaa04ccc3e8bdc4f96e53737e529e914fee8892b0a1c3d3e5162d47549fa58a1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle.develocity\" name=\"com.gradle.develocity.gradle.plugin\" version=\"3.17.6\">\n         <artifact name=\"com.gradle.develocity.gradle.plugin-3.17.6.pom\">\n            <sha256 value=\"1367bf3ce69aadcf21fdd901c24c24c2b2f0c8994ead97eb408a3001b6d08c44\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle.develocity\" name=\"com.gradle.develocity.gradle.plugin\" version=\"3.18\">\n         <artifact name=\"com.gradle.develocity.gradle.plugin-3.18.pom\">\n            <sha256 value=\"5ae27444a368bf149ceb326c26697296c54e496a7f2feffaeedc7a97d44e97e3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle.develocity\" name=\"com.gradle.develocity.gradle.plugin\" version=\"3.18.1\">\n         <artifact name=\"com.gradle.develocity.gradle.plugin-3.18.1.pom\">\n            <sha256 value=\"931673e0fe23765f8f1de5355908d37c194db395cde52b081bd0a92ea3de80a6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle.develocity\" name=\"com.gradle.develocity.gradle.plugin\" version=\"3.18.2\">\n         <artifact name=\"com.gradle.develocity.gradle.plugin-3.18.2.pom\">\n            <sha256 value=\"0095b536e4c60a1325946ccdb1a9fbbb97249df276d89bb0eb1ba698a8a64f3f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle.develocity\" name=\"com.gradle.develocity.gradle.plugin\" version=\"3.19\">\n         <artifact name=\"com.gradle.develocity.gradle.plugin-3.19.pom\">\n            <sha256 value=\"de27ff68a9ddb9d5595b94016bf4b06145707127d4aae5777b37a605ee85a11c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle.develocity\" name=\"com.gradle.develocity.gradle.plugin\" version=\"3.19.1\">\n         <artifact name=\"com.gradle.develocity.gradle.plugin-3.19.1.pom\">\n            <sha256 value=\"da629b064ab29dbf13cb2ed6289cc0674316378e1e2f4b7c8408195817b8204a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle.develocity\" name=\"com.gradle.develocity.gradle.plugin\" version=\"3.19.2\">\n         <artifact name=\"com.gradle.develocity.gradle.plugin-3.19.2.pom\">\n            <sha256 value=\"0edfdb01f51b884355ee3ad9fdaef06a4b0f479793cd88f4aa7a686793660e34\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle.develocity\" name=\"com.gradle.develocity.gradle.plugin\" version=\"4.0\">\n         <artifact name=\"com.gradle.develocity.gradle.plugin-4.0.pom\">\n            <sha256 value=\"e57cbc09bdf57a7df43ae0374db8e08dc3ab8dfae697dabe7161e35c94210e44\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.gradle.develocity\" name=\"com.gradle.develocity.gradle.plugin\" version=\"4.0.1\">\n         <artifact name=\"com.gradle.develocity.gradle.plugin-4.0.1.pom\">\n            <sha256 value=\"86eb48f1316630e320530a4902b60fd08327af834e4044f54e2afbd08ff864c2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.ibm.icu\" name=\"icu4j\" version=\"74.2\">\n         <artifact name=\"icu4j-74.2.jar\">\n            <sha256 value=\"95c055080e14c093ebeeba5b733e1a1be7a4af5854668c774cedf070d4240e43\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"icu4j-74.2.pom\">\n            <sha256 value=\"ad5c4681cffa8362fa63462515586e0a39492e86eeb3f2d8d8db8d527585463e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.ibm.icu\" name=\"icu4j\" version=\"75.1\">\n         <artifact name=\"icu4j-75.1.jar\">\n            <sha256 value=\"543e43a91d1499e331c711a756f833d6fb8cc019f9c9913c0bdf4d53009932d5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"icu4j-75.1.pom\">\n            <sha256 value=\"cd0baa47788b0f07c31d4a4932f618d4ca9ffd3003ae3dc2cade53df6708f020\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.ibm.icu\" name=\"icu4j-root\" version=\"74.2\">\n         <artifact name=\"icu4j-root-74.2.pom\">\n            <sha256 value=\"a0daf2ab7b3d63b093ae76dd2fd9858df27508cee3b29f00b7dd6d25a1fde9d6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.ibm.icu\" name=\"icu4j-root\" version=\"75.1\">\n         <artifact name=\"icu4j-root-75.1.pom\">\n            <sha256 value=\"27ea661f668a6fe14fa4716d26d7ae4ba94cb67232c6db8d00ef4ac03404f08a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.intellij\" name=\"annotations\" version=\"12.0\">\n         <artifact name=\"annotations-12.0.jar\">\n            <sha256 value=\"f8ab13b14be080fe2f617f90e55599760e4a1b4deeea5c595df63d0d6375ed6d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-12.0.pom\">\n            <sha256 value=\"faf82de0dc02e0c0ae327cd653f37255496b2e53fce280b3ab4cb34553a89086\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.mikepenz\" name=\"fastadapter\" version=\"5.5.1\">\n         <artifact name=\"fastadapter-5.5.1.aar\">\n            <sha256 value=\"dcb0efcf3bd0a231c4ae7705b8db13fbf4d95046ecaebc05f94b8f20d84fe69d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fastadapter-5.5.1.module\">\n            <sha256 value=\"117e399cf545f3199bb536bb60a1f816cba55a4ad05440d60dbdffdb5bf4572d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.mikepenz\" name=\"fastadapter\" version=\"5.7.0\">\n         <artifact name=\"fastadapter-5.7.0.aar\">\n            <sha256 value=\"6b871bcf1ea046c5530cb594a44d535d9ba5858876ebcb6a818ef7db7b532a5b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fastadapter-5.7.0.module\">\n            <sha256 value=\"6c08f903bedb28d92b0c62cc83045f10ff6ced2215958b3c3528d96384bc5e22\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.mikepenz\" name=\"fastadapter-extensions-expandable\" version=\"5.5.1\">\n         <artifact name=\"fastadapter-extensions-expandable-5.5.1.aar\">\n            <sha256 value=\"833755911f4721e0c8fd8644211e178df00256e7e179ed71b9a2a2811fd7b734\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fastadapter-extensions-expandable-5.5.1.module\">\n            <sha256 value=\"01b3ced001e936a98864e7c76fa7c845bdc90af1e3cbb0e6d96d6976552f36df\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.mikepenz\" name=\"fastadapter-extensions-expandable\" version=\"5.7.0\">\n         <artifact name=\"fastadapter-extensions-expandable-5.7.0.aar\">\n            <sha256 value=\"6f20a76b2f8d7d92f6d755f39d7cac8d9d43d3ccf052b33acaf4de6c88469433\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fastadapter-extensions-expandable-5.7.0.module\">\n            <sha256 value=\"7fa0dfcaa973c2e5b523cba35a55d65b8ac6280d8394656d5c140bae49f50d88\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.mikepenz\" name=\"google-material-typeface\" version=\"4.0.0.3-kotlin\">\n         <artifact name=\"google-material-typeface-4.0.0.3-kotlin-sources.jar\">\n            <sha256 value=\"a91846450b6dc24b835c5cdbee71905f57fc9ba0eb44627ebce081d20842a1e1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"google-material-typeface-4.0.0.3-kotlin.aar\">\n            <sha256 value=\"a2191656322598a5a2ccde0aa715afefdef3dc23291b71a76eebd7981692abb9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"google-material-typeface-4.0.0.3-kotlin.module\">\n            <sha256 value=\"d1c0cef8899de0de09bcf14fc366f81493411362ecb646a23c42b021fa6660fc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.mikepenz\" name=\"iconics-core\" version=\"5.3.2\">\n         <artifact name=\"iconics-core-5.3.2.aar\">\n            <sha256 value=\"dd59f711fc024015d5831a4672fd49d32ca67b5a3e9e7fa5bf9d881e780dd36e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"iconics-core-5.3.2.module\">\n            <sha256 value=\"19b08bd366faf91237209e498cf294079501f7f71c7b1720cd12deee04afc5aa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.mikepenz\" name=\"iconics-core\" version=\"5.4.0\">\n         <artifact name=\"iconics-core-5.4.0.aar\">\n            <sha256 value=\"2ae469c3731dba7c7ba210688c603fe8732eb3d65d0f005de1f2907c0acefc86\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"iconics-core-5.4.0.module\">\n            <sha256 value=\"bf025470faecf3c5c3dc0c39e222519b9fc9eac286b99c13a6ab82fda4bc645a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.mikepenz\" name=\"iconics-typeface-api\" version=\"5.3.2\">\n         <artifact name=\"iconics-typeface-api-5.3.2.aar\">\n            <sha256 value=\"2c492dba56b8d3cad3527f46175e7e5967bde99207afd7556d18755e46556ad8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"iconics-typeface-api-5.3.2.module\">\n            <sha256 value=\"f7aca8af9f3257ec0fdadddc854b537f5c970bdeab5e8a6d4db27075bca8b0f1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.mikepenz\" name=\"iconics-typeface-api\" version=\"5.4.0\">\n         <artifact name=\"iconics-typeface-api-5.4.0.aar\">\n            <sha256 value=\"2c359993e0999ab1d5727a81a8bf0aecb1176ff6b9cfaf4cecfa02abf816b4be\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"iconics-typeface-api-5.4.0.module\">\n            <sha256 value=\"5d188beccb313f101b16652635ea6946c50ca44a921e5da376d13a874f29102f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.mikepenz\" name=\"iconics-typeface-api\" version=\"5.5.0-b01\">\n         <artifact name=\"iconics-typeface-api-5.5.0-b01.aar\">\n            <sha256 value=\"258b2b1daee3fc1ea3d114ae48fb2005c8e58f5b6e61c1d91daf0c2ce654fc0d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"iconics-typeface-api-5.5.0-b01.module\">\n            <sha256 value=\"0b41a59343da6bb57616b9849652d7a04d8afb8deae1b1c8175b83461985c7e5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.mikepenz\" name=\"materialdrawer\" version=\"8.4.5\">\n         <artifact name=\"materialdrawer-8.4.5.aar\">\n            <sha256 value=\"f54a12caa991e23eccb284a2bcd9fb33d5782d8c5402b771b9f17e23675e4730\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"materialdrawer-8.4.5.module\">\n            <sha256 value=\"05d34eb0f3ba784b985a6d205c9952a1f4afc19c1ec16a9bdaa34066b10b94d6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.mikepenz\" name=\"materialdrawer\" version=\"9.0.2\">\n         <artifact name=\"materialdrawer-9.0.2.aar\">\n            <sha256 value=\"0a37cc680f8c77e660d76453524dd4fee3e4e01c38be2edffcf44f5c0e09fd85\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"materialdrawer-9.0.2.module\">\n            <sha256 value=\"785ec480ceb0bee8b03cf2fa4e8dbc8133b56ad0a9187a6f8d320398120b1063\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.mikepenz\" name=\"materialdrawer-iconics\" version=\"8.4.5\">\n         <artifact name=\"materialdrawer-iconics-8.4.5.aar\">\n            <sha256 value=\"4619cd9ba3df5a51241d5b50c227378b0512d591107330f0f8a20d6c5e86492a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"materialdrawer-iconics-8.4.5.module\">\n            <sha256 value=\"824509161c2fc38f0ff06b58ead89a36c3af73ddfe7ac514cbfa1d0f726003df\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.mikepenz\" name=\"materialdrawer-iconics\" version=\"9.0.2\">\n         <artifact name=\"materialdrawer-iconics-9.0.2.aar\">\n            <sha256 value=\"1151b35bef0759a4b523c1b9be3db7a8ff0a37ae115d07c06a314c119427d936\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"materialdrawer-iconics-9.0.2.module\">\n            <sha256 value=\"679890c4ee64b5763f57afa3551c19dcd2b520450d026503f8f77cf2bccef204\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.pinterest.ktlint\" name=\"ktlint-cli\" version=\"1.0.1\">\n         <artifact name=\"ktlint-cli-1.0.1.jar\">\n            <sha256 value=\"81889a9cab5da042aea48869b170299fec7d6f66773aa7d5245b8b8ccb8d0c89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ktlint-cli-1.0.1.module\">\n            <sha256 value=\"1013cec46eb04dba1f3aa4ac447b98d214866677b1bef672328bf077ff0d7755\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.pinterest.ktlint\" name=\"ktlint-cli-reporter-baseline\" version=\"1.0.1\">\n         <artifact name=\"ktlint-cli-reporter-baseline-1.0.1.jar\">\n            <sha256 value=\"2e7f0c581540a7674b05d36735bfcabe84b14b47de10f13f7f3738cc476f0bd4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ktlint-cli-reporter-baseline-1.0.1.module\">\n            <sha256 value=\"5a357f0a878f6bacad7e009aa446ae53cf72efbb795944009442d233bf75b6b2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.pinterest.ktlint\" name=\"ktlint-cli-reporter-checkstyle\" version=\"1.0.1\">\n         <artifact name=\"ktlint-cli-reporter-checkstyle-1.0.1.jar\">\n            <sha256 value=\"fb41b8b1f46987cceaac03b1ae526e132d284fd24c2573167369af7f3a672775\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ktlint-cli-reporter-checkstyle-1.0.1.module\">\n            <sha256 value=\"39aeb181903e8fafd651c87e2683a8d885c0b38c448b4dab86d4b6aece8beab8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.pinterest.ktlint\" name=\"ktlint-cli-reporter-core\" version=\"1.0.1\">\n         <artifact name=\"ktlint-cli-reporter-core-1.0.1.jar\">\n            <sha256 value=\"4e7319d32bd1d990fe0dae234582908d08e8514aef84e1dad83cb9a5a159ade3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ktlint-cli-reporter-core-1.0.1.module\">\n            <sha256 value=\"e466ea107dfe367b6da7bbe86b0ea856791bf1b5574e4c361b126a56d71de8b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.pinterest.ktlint\" name=\"ktlint-cli-reporter-format\" version=\"1.0.1\">\n         <artifact name=\"ktlint-cli-reporter-format-1.0.1.jar\">\n            <sha256 value=\"bd2e23533c2f9d625b7b2519439385802d80fc0764620c8bdc42a49e93370b64\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ktlint-cli-reporter-format-1.0.1.module\">\n            <sha256 value=\"fe66e4e160a2adbce020017c8e3201e2fcc0f9286f5642f4e4af222304766d89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.pinterest.ktlint\" name=\"ktlint-cli-reporter-html\" version=\"1.0.1\">\n         <artifact name=\"ktlint-cli-reporter-html-1.0.1.jar\">\n            <sha256 value=\"7243022af49f92d4ef495aee161adf65f6c4639997952980acf237988754e964\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ktlint-cli-reporter-html-1.0.1.module\">\n            <sha256 value=\"d59d01331d723cc44e70b1ca5ed72275bf3d278789559b8fe7bb9d6e05b6cb7a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.pinterest.ktlint\" name=\"ktlint-cli-reporter-json\" version=\"1.0.1\">\n         <artifact name=\"ktlint-cli-reporter-json-1.0.1.jar\">\n            <sha256 value=\"4ec9975b68dd950b41d15db343602fff448c858bac2e3643f85cdf5de2525bee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ktlint-cli-reporter-json-1.0.1.module\">\n            <sha256 value=\"825fe7ec674cff0c3a7b26bed198b986595467ba8b5e5dae90cfc43c2c9b46bd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.pinterest.ktlint\" name=\"ktlint-cli-reporter-plain\" version=\"1.0.1\">\n         <artifact name=\"ktlint-cli-reporter-plain-1.0.1.jar\">\n            <sha256 value=\"ab211bb3b9076f8cf4536fca39e757a7518fd2864151407cb025f0564bc59892\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ktlint-cli-reporter-plain-1.0.1.module\">\n            <sha256 value=\"6856c13679b833b95afdd77a76f68a4c35331edd53332303dafa4465ff219fe5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.pinterest.ktlint\" name=\"ktlint-cli-reporter-plain-summary\" version=\"1.0.1\">\n         <artifact name=\"ktlint-cli-reporter-plain-summary-1.0.1.jar\">\n            <sha256 value=\"404f6ea0c2b6fd6f19eb8a488a44b7fc0b4f8e116dccba2ea921c506fc4604be\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ktlint-cli-reporter-plain-summary-1.0.1.module\">\n            <sha256 value=\"580fcd1d4048928cd9230f6f2d52476c5ed794997589ec771fe5b0d34a8fe40d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.pinterest.ktlint\" name=\"ktlint-cli-reporter-sarif\" version=\"1.0.1\">\n         <artifact name=\"ktlint-cli-reporter-sarif-1.0.1.jar\">\n            <sha256 value=\"31e170b8ce281c8ac192f42fbd1efc521b9250c13ed67a5898b72c54d390c7b0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ktlint-cli-reporter-sarif-1.0.1.module\">\n            <sha256 value=\"7b02755b5d4c103c0e29f787a2910558ba943a371451265ba1b061bd564238d4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.pinterest.ktlint\" name=\"ktlint-cli-ruleset-core\" version=\"1.0.1\">\n         <artifact name=\"ktlint-cli-ruleset-core-1.0.1.jar\">\n            <sha256 value=\"218c602960994903a672d7a191dd01b6fd015a86b67145a470bb57deeb388f5a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ktlint-cli-ruleset-core-1.0.1.module\">\n            <sha256 value=\"25c84bf9e92d259b5077c27851bdd92ad4b8dd61227054c535f16c20edc20f54\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.pinterest.ktlint\" name=\"ktlint-logger\" version=\"1.0.1\">\n         <artifact name=\"ktlint-logger-1.0.1.jar\">\n            <sha256 value=\"4d11c82204f55940b6354a26c9a71bc3586f27528bcb294661b87964943c526f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ktlint-logger-1.0.1.module\">\n            <sha256 value=\"7041ce959fbfb388da63753cd1833b2fcb93b6ddc5c03a268e5aa807a6e6c37f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.pinterest.ktlint\" name=\"ktlint-rule-engine\" version=\"1.0.1\">\n         <artifact name=\"ktlint-rule-engine-1.0.1.jar\">\n            <sha256 value=\"38ea20553969a554ff2293b2c638869cf0dfef175edeed69ade8ff749b8a09dc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ktlint-rule-engine-1.0.1.module\">\n            <sha256 value=\"9168ba81f8d9eb855e09053c3133e1925323e7685317352a7f03c0677f12e3da\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.pinterest.ktlint\" name=\"ktlint-rule-engine-core\" version=\"1.0.1\">\n         <artifact name=\"ktlint-rule-engine-core-1.0.1.jar\">\n            <sha256 value=\"ee4417d9a9fe1d42c700b90acb68f0afb3bd5ab8a4c6cfa5d3733887631d654e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ktlint-rule-engine-core-1.0.1.module\">\n            <sha256 value=\"dae1a5b2c1efb042305e5b29879ba4181e2c14d8c5cb2a704a021d7a8f6ad4fe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.pinterest.ktlint\" name=\"ktlint-ruleset-standard\" version=\"1.0.1\">\n         <artifact name=\"ktlint-ruleset-standard-1.0.1.jar\">\n            <sha256 value=\"a19d94b7dc967d7433ff9e486037f9db7cfc6ba7739f62f9049f86f3a2fb0273\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ktlint-ruleset-standard-1.0.1.module\">\n            <sha256 value=\"fd6fc869b1a0df0a45d391fd0e768b0771a7e8d376da8e1dc801afe02aac2815\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup\" name=\"javapoet\" version=\"1.10.0\">\n         <artifact name=\"javapoet-1.10.0.pom\">\n            <sha256 value=\"1690340a222279f2cbadf373e88826fa20f7f3cc3ec0252f36818fed32701ab1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup\" name=\"javapoet\" version=\"1.13.0\">\n         <artifact name=\"javapoet-1.13.0.jar\">\n            <sha256 value=\"4c7517e848a71b36d069d12bb3bf46a70fd4cda3105d822b0ed2e19c00b69291\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"javapoet-1.13.0.pom\">\n            <sha256 value=\"54a34fa8502a46bc90efdb49262600591fa80bf9a34f5a4c798311aec16ca977\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup\" name=\"javawriter\" version=\"2.1.1\">\n         <artifact name=\"javawriter-2.1.1-sources.jar\">\n            <sha256 value=\"f57646206c5908c69342022c7b5ccbc15dbf605ce80421da3b96af9f86331e28\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"javawriter-2.1.1.jar\">\n            <sha256 value=\"f699823d0081f69cbb676c1845ea222e0ada79bc88a53e5d22d8bd02d328f57e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"javawriter-2.1.1.pom\">\n            <sha256 value=\"d47fc646324c22c66f2b0e0e743c850dde9a51990c53925e7501d960f2e8df84\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup\" name=\"javawriter\" version=\"2.5.0\">\n         <artifact name=\"javawriter-2.5.0.jar\">\n            <sha256 value=\"fcfb09fb0ea0aa97d3cfe7ea792398081348e468f126b3603cb3803f240197f0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"javawriter-2.5.0.pom\">\n            <sha256 value=\"e1abd7f1116cf5e0c59947693e2189208ec94296b2a3394c959e3511d399a7b0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup\" name=\"kotlinpoet\" version=\"1.14.2\">\n         <artifact name=\"kotlinpoet-1.14.2.jar\">\n            <sha256 value=\"102d5d8a289d961cd7f39204c264d272e4aad775e388d909f6050e14558aae9b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinpoet-1.14.2.module\">\n            <sha256 value=\"4eaf793bea0717db41a4b16a53d34fea2ed2c8c78d3625772c979d431a112e59\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup\" name=\"kotlinpoet\" version=\"1.17.0\">\n         <artifact name=\"kotlinpoet-1.17.0.module\">\n            <sha256 value=\"67285cc4a80b3cc79d9f81a3e357d00c4af7129c0490d24248a82cd5a18128e0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup\" name=\"kotlinpoet-javapoet\" version=\"1.14.2\">\n         <artifact name=\"kotlinpoet-javapoet-1.14.2.jar\">\n            <sha256 value=\"892aa78f3a3df30daaec099d06ef0b8e884e96111a9e14961cbf745aff371f1b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinpoet-javapoet-1.14.2.module\">\n            <sha256 value=\"013acffeeee7c5b2edc73cd8a393a8d2bddcfde4ccd4b23d32f1de12c3df9372\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup\" name=\"kotlinpoet-javapoet\" version=\"1.17.0\">\n         <artifact name=\"kotlinpoet-javapoet-1.17.0.jar\">\n            <sha256 value=\"0eecc28eb9e28530f25095ea8b31895e7d36bac1d02ce5b1ec43c6f458ae752a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinpoet-javapoet-1.17.0.module\">\n            <sha256 value=\"f78d5de34a6ca5fcb9944a5580b7d3a7f027d0d3c752741b54f07d73562bbc12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup\" name=\"kotlinpoet-jvm\" version=\"1.17.0\">\n         <artifact name=\"kotlinpoet-jvm-1.17.0.jar\">\n            <sha256 value=\"3133d4f48ce77766a6a8cc2e555d89164dfcefbd372f4ff43f89a7fed3586910\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinpoet-jvm-1.17.0.module\">\n            <sha256 value=\"a4345b833c6c7b0ea2f2dc9e01cf6a99cfe72f672165a8c003f14828561a7966\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup\" name=\"kotlinpoet-ksp\" version=\"1.13.2\">\n         <artifact name=\"kotlinpoet-ksp-1.13.2.jar\">\n            <sha256 value=\"d1de5e3d6f7405dc10cb14a43f39400ba75604e1cf86da1fe08e9007a8a17d08\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinpoet-ksp-1.13.2.module\">\n            <sha256 value=\"9e08d4f1957d630c380a291735a2fde6de5324b0906c640742f0ea5368eb5b08\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.moshi\" name=\"moshi\" version=\"1.15.1\">\n         <artifact name=\"moshi-1.15.1.jar\">\n            <sha256 value=\"46a1118fe1fc12723a575c94133fc8936dcc78d3f8873c0e70a055de9e5861a6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"moshi-1.15.1.module\">\n            <sha256 value=\"671f5355aba7d9fea64be14e371fc295c34dabf872d210924bf0db4291d6ef74\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.moshi\" name=\"moshi\" version=\"1.15.2\">\n         <artifact name=\"moshi-1.15.2.jar\">\n            <sha256 value=\"767f7592c6c61eb693549a26d333c121f5383826bd287b899867aa326dae55e4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"moshi-1.15.2.module\">\n            <sha256 value=\"d952c6dd91a7b426c3f0a51edc3f7ceb3490ac01ff18301527adfec7a7837dd9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.moshi\" name=\"moshi-adapters\" version=\"1.15.1\">\n         <artifact name=\"moshi-adapters-1.15.1.jar\">\n            <sha256 value=\"923f9fbc750db262877e9e5b3ae192c80c5b8fbeb1cc196885860a6e8adc4c3e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"moshi-adapters-1.15.1.module\">\n            <sha256 value=\"116a972453a8fa39cfc1fb8bab5e8396d4cd9036f1347148f0f4104183c58cd1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.moshi\" name=\"moshi-adapters\" version=\"1.15.2\">\n         <artifact name=\"moshi-adapters-1.15.2.jar\">\n            <sha256 value=\"efa90fb3419a5a88bd5e029cbafdcecce1812430b15cb86770f60eaf0b45c409\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"moshi-adapters-1.15.2.module\">\n            <sha256 value=\"21ee752081114b3623b7f7e2933160b7efacc9ce947d063863e2db188031da44\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.moshi\" name=\"moshi-kotlin-codegen\" version=\"1.15.1\">\n         <artifact name=\"moshi-kotlin-codegen-1.15.1.jar\">\n            <sha256 value=\"14ab79736dc806a245ad76354eb7d53e83bead1d87b092a6b07da6a3287a39ed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"moshi-kotlin-codegen-1.15.1.module\">\n            <sha256 value=\"520bd9f9a92040b1431c330acd2395aceba925028b720cd3e54bb58c61fae178\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.moshi\" name=\"moshi-kotlin-codegen\" version=\"1.15.2\">\n         <artifact name=\"moshi-kotlin-codegen-1.15.2.jar\">\n            <sha256 value=\"949ce943e0ee135bd41ba4abf08b3a1608d4378671de12388690b5432b4e8a3b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"moshi-kotlin-codegen-1.15.2.module\">\n            <sha256 value=\"58a293379f1cc6d69803d56cf883db1d144d25301b67a9706563fba198fc4511\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.okhttp3\" name=\"logging-interceptor\" version=\"4.12.0\">\n         <artifact name=\"logging-interceptor-4.12.0-sources.jar\">\n            <sha256 value=\"967335783f8af3fca7819f9f343f753243f2877c5480099e2084fe493af7da82\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"logging-interceptor-4.12.0.jar\">\n            <sha256 value=\"f3e8d5f0903c250c2b55d2f47fcfe008e80634385da8385161c7a63aaed0c74c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"logging-interceptor-4.12.0.module\">\n            <sha256 value=\"2e2148cd213b4f8f54d66d0548a228057e1f7b67332e0f979b1a1ce36b2276a7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.okhttp3\" name=\"mockwebserver\" version=\"4.12.0\">\n         <artifact name=\"mockwebserver-4.12.0-sources.jar\">\n            <sha256 value=\"99d5c408b6da5d40d00694136d875007dc336d78e954ddedd39201e1cc7fb311\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"mockwebserver-4.12.0.jar\">\n            <sha256 value=\"6784673687f4ac8f21679b9d4bc7cdb46e1a1ce1be9d3133b36bede59a741561\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"mockwebserver-4.12.0.module\">\n            <sha256 value=\"93e4696552118b6425462aed936edfd320c9fcedef0a82d5741c0a7d53c0cf74\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.okhttp3\" name=\"okhttp\" version=\"4.12.0\">\n         <artifact name=\"okhttp-4.12.0-sources.jar\">\n            <sha256 value=\"d91a769a4140e542cddbac4e67fcf279299614e8bfd53bd23b85e60c2861341c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"okhttp-4.12.0.jar\">\n            <sha256 value=\"b1050081b14bb7a3a7e55a4d3ef01b5dcfabc453b4573a4fc019767191d5f4e0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"okhttp-4.12.0.module\">\n            <sha256 value=\"607e220ff8215b929d829bbf54f332894f1459b4d795979aeafcbcc1cea54cf3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.okio\" name=\"okio\" version=\"3.10.2\">\n         <artifact name=\"okio-3.10.2.module\">\n            <sha256 value=\"3fde1f9fbf72c6c326d5e8a4b532f4fd9fda2dd0cb1442bca4e0c797d1412387\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"okio-metadata-3.10.2.jar\">\n            <sha256 value=\"de225dcb900f498d9c755187a44c74e37576bd893ada96b86db6110e27a59513\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.okio\" name=\"okio\" version=\"3.11.0\">\n         <artifact name=\"okio-3.11.0.module\">\n            <sha256 value=\"950058faacfc06a003c4f20152df854742279cb361e0427514d8c4e43740ddec\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"okio-metadata-3.11.0.jar\">\n            <sha256 value=\"5959880229d8a422652949d7c6b4dc35a4d539db0853b1d5cfaf286b66bb72db\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.okio\" name=\"okio\" version=\"3.6.0\">\n         <artifact name=\"okio-3.6.0.module\">\n            <sha256 value=\"6a47ac50364e6598459401fb86f9b6cfcdf637b9b3a3045b1cc33cbf4c408218\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"okio-metadata-3.6.0-all.jar\">\n            <sha256 value=\"2bbd3f0645a3ada7e6532b2e6db471af4861464e1a140f95f807dfd16aa049e3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.okio\" name=\"okio\" version=\"3.7.0\">\n         <artifact name=\"okio-3.7.0.module\">\n            <sha256 value=\"f3cae009f0b6c842fbbc52ce77542c19d19d56ee99a5e555647f0bafc9d50cfa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.okio\" name=\"okio\" version=\"3.9.0\">\n         <artifact name=\"okio-3.9.0.module\">\n            <sha256 value=\"68d1c879ff658931d02b3adbeafbb512e163c20a90cadf07d90c8dbea7e76210\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"okio-metadata-3.9.0.jar\">\n            <sha256 value=\"e518a59856273a1fce18ac7d13ddfc690defa6122d7e5cd00cae19b62d0347d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.okio\" name=\"okio\" version=\"3.9.1\">\n         <artifact name=\"okio-3.9.1.module\">\n            <sha256 value=\"9b90b4274a5ad602dd574d6d4b48903663b2de9a60b9fc3402248293d843e121\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"okio-metadata-3.9.1.jar\">\n            <sha256 value=\"99c8ebbc4995f29dd58b05d75583fcc8b957db21eeeb8c5d89733f0d34955897\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.okio\" name=\"okio-jvm\" version=\"3.10.2\">\n         <artifact name=\"okio-jvm-3.10.2.jar\">\n            <sha256 value=\"fd0a7e76c6731f00e920b7bc11c05d823a932045431add548e095de020a69ede\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"okio-jvm-3.10.2.module\">\n            <sha256 value=\"a780a424c571e287550128ae0033235626dffe216cb8db3b202464996ad968f0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.okio\" name=\"okio-jvm\" version=\"3.11.0\">\n         <artifact name=\"okio-jvm-3.11.0.jar\">\n            <sha256 value=\"2d22541a192f901a45c95274567d6957ac1ed613d49e41db4e5e5d86139cf022\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"okio-jvm-3.11.0.module\">\n            <sha256 value=\"00e61f69011375e78262f7f53e7a0a71f8eba3e49c0941d523db507ee9af7506\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.okio\" name=\"okio-jvm\" version=\"3.7.0\">\n         <artifact name=\"okio-jvm-3.7.0.jar\">\n            <sha256 value=\"d8b35adc28768f43ae5afe6a7d1aa2a878ba51e0b96a4f308811f3b1f5b13e55\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"okio-jvm-3.7.0.module\">\n            <sha256 value=\"6fae0201b0ae48a19606de006ffe9842d8d0fc2a1e434e0785cecd8b75abe474\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.okio\" name=\"okio-jvm\" version=\"3.9.0\">\n         <artifact name=\"okio-jvm-3.9.0-sources.jar\">\n            <sha256 value=\"b8ab886c9ed94b6d22fe177efab23f66b2fe0cbcfbf9902d226667038410e0b1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"okio-jvm-3.9.0.jar\">\n            <sha256 value=\"ddc386ff14bd25d5c934167196eaf45b18de4f28e1c55a4db37ae594cbfd37e4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"okio-jvm-3.9.0.module\">\n            <sha256 value=\"cf97284ec61bb51e6dfcbc7f2b6d9556c9b7b3e3cb22cc0e2d4f0eefbf36195b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.okio\" name=\"okio-jvm\" version=\"3.9.1\">\n         <artifact name=\"okio-jvm-3.9.1.jar\">\n            <sha256 value=\"fe6fe91378f9bfa7b08c3864828ce418005cf28acca12e8847eb65c565c37500\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"okio-jvm-3.9.1.module\">\n            <sha256 value=\"b0afa9192c42d7c463de38d6325936c6901d9e3b7149735ffd18a11df31034ab\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.retrofit2\" name=\"converter-moshi\" version=\"2.11.0\">\n         <artifact name=\"converter-moshi-2.11.0-sources.jar\">\n            <sha256 value=\"41b6c659c4401cbbf63d0787b78a13d52848b29f71ae9f4c69bfc9641cd88f47\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"converter-moshi-2.11.0.jar\">\n            <sha256 value=\"dbfae9dbde0b61e5c5671648c8d9fd486efae9ad07d573ed01bd0de4688d9b2c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"converter-moshi-2.11.0.module\">\n            <sha256 value=\"f2397c76f40fb873d4c9d1af830b44a25b72ef9829b026099e2913078b8df33e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.retrofit2\" name=\"converter-moshi\" version=\"3.0.0\">\n         <artifact name=\"converter-moshi-3.0.0.jar\">\n            <sha256 value=\"646beed03bd77e51dad0df6bd05c2a39cbc8562d8e1b9b8cf9126481781611a6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"converter-moshi-3.0.0.module\">\n            <sha256 value=\"eaaf79fabae9e7e4685f97388c2b01a53e393b10f6d9ff97682777a5b7a1035a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.retrofit2\" name=\"retrofit\" version=\"2.11.0\">\n         <artifact name=\"retrofit-2.11.0.jar\">\n            <sha256 value=\"9f4fbbce70728584fbeed38d4061f36d4477e89bca74b4e2ac8aeb6819b0fe43\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"retrofit-2.11.0.module\">\n            <sha256 value=\"e9bb2e201844c88e4750624f9114a6354b51b70948b44d5c6b4a94e8cd070a81\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.squareup.retrofit2\" name=\"retrofit\" version=\"3.0.0\">\n         <artifact name=\"retrofit-3.0.0.jar\">\n            <sha256 value=\"69c6a2d3451b6df9549a93fab744094ebf07a4b0ce4f453d6c8f575ef0fec9a1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"retrofit-3.0.0.module\">\n            <sha256 value=\"3de52829b898215534e86eda268da449ffcbf95b18703da529d99883277484f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.sun.activation\" name=\"all\" version=\"1.2.0\">\n         <artifact name=\"all-1.2.0.pom\">\n            <sha256 value=\"1d8518e3ac7532a104e4f7be77def37c982e530723c6bdb3d67708cce2b0c2c4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.sun.activation\" name=\"all\" version=\"1.2.1\">\n         <artifact name=\"all-1.2.1.pom\">\n            <sha256 value=\"360883bf64486ecef161b8f282f6503536dd1a670d53a0a871c8fb20170e6795\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.sun.activation\" name=\"javax.activation\" version=\"1.2.0\">\n         <artifact name=\"javax.activation-1.2.0.jar\">\n            <sha256 value=\"993302b16cd7056f21e779cc577d175a810bb4900ef73cd8fbf2b50f928ba9ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"javax.activation-1.2.0.pom\">\n            <sha256 value=\"f879b6e945854c6900b0dbee1c8384d7ab3de7e157fd7ac84937405c416d2a5e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.sun.istack\" name=\"istack-commons\" version=\"3.0.8\">\n         <artifact name=\"istack-commons-3.0.8.pom\">\n            <sha256 value=\"a0f0517e8512f0fbcc7b8295c12f6566a3d0c2d86d655639dc662ef8c0c7ebe5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.sun.istack\" name=\"istack-commons-runtime\" version=\"3.0.8\">\n         <artifact name=\"istack-commons-runtime-3.0.8.jar\">\n            <sha256 value=\"4ffabb06be454a05e4398e20c77fa2b6308d4b88dfbef7ca30a76b5b7d5505ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"istack-commons-runtime-3.0.8.pom\">\n            <sha256 value=\"c2e014d34cb84ed287d064986c45c305a4124228a7337eccf6c421d14d708f1c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.sun.xml.bind\" name=\"jaxb-bom-ext\" version=\"2.3.2\">\n         <artifact name=\"jaxb-bom-ext-2.3.2.pom\">\n            <sha256 value=\"1a7dec2b27e7e055744cdb8cf1b90def4fd473acd1b804eff098139358959bd7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.sun.xml.bind.mvn\" name=\"jaxb-parent\" version=\"2.3.2\">\n         <artifact name=\"jaxb-parent-2.3.2.pom\">\n            <sha256 value=\"20dd6dc34ab7549ac40da1d82e92222ec4347ad0ec0cb118ef6c5703bed53a18\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.sun.xml.bind.mvn\" name=\"jaxb-runtime-parent\" version=\"2.3.2\">\n         <artifact name=\"jaxb-runtime-parent-2.3.2.pom\">\n            <sha256 value=\"b24f8d51f184a68bc1b86d48c0e3cfefeb21a44ede1c5f7303c58ae0488533ec\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.sun.xml.bind.mvn\" name=\"jaxb-txw-parent\" version=\"2.3.2\">\n         <artifact name=\"jaxb-txw-parent-2.3.2.pom\">\n            <sha256 value=\"b55d3efa9b158f483a30e92c78ccb600f93314733d089eba9b74436f01b314a4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.sun.xml.fastinfoset\" name=\"FastInfoset\" version=\"1.2.16\">\n         <artifact name=\"FastInfoset-1.2.16.jar\">\n            <sha256 value=\"056f3a1e144409f21ed16afc26805f58e9a21f3fce1543c42d400719d250c511\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"FastInfoset-1.2.16.pom\">\n            <sha256 value=\"e147d258ab6e6691f70599a952400e6e6c7558f8c9c028dbe1be23178308e830\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"com.sun.xml.fastinfoset\" name=\"fastinfoset-project\" version=\"1.2.16\">\n         <artifact name=\"fastinfoset-project-1.2.16.pom\">\n            <sha256 value=\"90582425adc1f40b41362dafb95173931225acaa5e79620d5e6bd52f646292ba\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"commons-codec\" name=\"commons-codec\" version=\"1.10\">\n         <artifact name=\"commons-codec-1.10.jar\">\n            <sha256 value=\"4241dfa94e711d435f29a4604a3e2de5c4aa3c165e23bd066be6fc1fc4309569\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"commons-codec-1.10.pom\">\n            <sha256 value=\"bdb8db7012d112a6e3ea8fdb7c510b300d99eff0819d27dddba9c43397ea4cfb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"commons-codec\" name=\"commons-codec\" version=\"1.11\">\n         <artifact name=\"commons-codec-1.11.jar\">\n            <sha256 value=\"e599d5318e97aa48f42136a2927e6dfa4e8881dff0e6c8e3109ddbbff51d7b7d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"commons-codec-1.11.pom\">\n            <sha256 value=\"c1e7140d1dea8fdf3528bc1e3c5444ac0b541297311f45f9806c213ec3ee9a10\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"commons-codec\" name=\"commons-codec\" version=\"1.15\">\n         <artifact name=\"commons-codec-1.15.jar\">\n            <sha256 value=\"b3e9f6d63a790109bf0d056611fbed1cf69055826defeb9894a71369d246ed63\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"commons-codec-1.15.pom\">\n            <sha256 value=\"c86ee198a35a3715487860f419cbf642e7e4d9e8714777947dbe6a4e3a20ab58\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"commons-io\" name=\"commons-io\" version=\"2.13.0\">\n         <artifact name=\"commons-io-2.13.0.jar\">\n            <sha256 value=\"671eaa39688dac2ffaa4645b3c9980ae2d0ea2471e4ae6a5da199cd15ae23666\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"commons-io-2.13.0.pom\">\n            <sha256 value=\"db3fed64c2e1774ebfd6b1a749037732b149b9111dd7e6b985f08dda55470439\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"commons-io\" name=\"commons-io\" version=\"2.16.1\">\n         <artifact name=\"commons-io-2.16.1.jar\">\n            <sha256 value=\"f41f7baacd716896447ace9758621f62c1c6b0a91d89acee488da26fc477c84f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"commons-io-2.16.1.pom\">\n            <sha256 value=\"5777d292251c7895c04a4c57015683ec3b353a12486c9b3e7178e9b0b3c38fff\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"commons-io\" name=\"commons-io\" version=\"2.17.0\">\n         <artifact name=\"commons-io-2.17.0.jar\">\n            <sha256 value=\"4aa4ca48f3dfd30b78220b7881d8cb93eac4093ec94361b6befa9487998a550b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"commons-io-2.17.0.pom\">\n            <sha256 value=\"484a939fff5310b8cb5c6b9029c2dcf155d3f93b8b8d6285f3f56bb2ba09fc49\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"commons-logging\" name=\"commons-logging\" version=\"1.2\">\n         <artifact name=\"commons-logging-1.2.jar\">\n            <sha256 value=\"daddea1ea0be0f56978ab3006b8ac92834afeefbd9b7e4e6316fca57df0fa636\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"commons-logging-1.2.pom\">\n            <sha256 value=\"c91ab5aa570d86f6fd07cc158ec6bc2c50080402972ee9179fe24100739fbb20\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"de.c1710\" name=\"filemojicompat\" version=\"3.2.7\">\n         <artifact name=\"filemojicompat-3.2.7.aar\">\n            <sha256 value=\"490962a1a195a2c8a40e1d16649e22b56acfc6bc09388f565dbfacfed36851be\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"filemojicompat-3.2.7.module\">\n            <sha256 value=\"7c10f1aa937271d5f9e8ce1b26e21f1ab7f7c07eb89a7cf09caac851eae2d111\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"de.c1710\" name=\"filemojicompat-defaults\" version=\"3.2.7\">\n         <artifact name=\"filemojicompat-defaults-3.2.7.aar\">\n            <sha256 value=\"9e88f2479567f31eab6688066d1cf2c225537a3fde187638bcb35f163129c7d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"filemojicompat-defaults-3.2.7.module\">\n            <sha256 value=\"af601eb6b31e7f0527de638a166c894208321a9acdc79ecc06d16fcc44c22074\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"de.c1710\" name=\"filemojicompat-ui\" version=\"3.2.7\">\n         <artifact name=\"filemojicompat-ui-3.2.7.aar\">\n            <sha256 value=\"6f00896b039e4ab8cd9b7c68eda76f45bbffeeac3f4f14c0671336844a075082\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"filemojicompat-ui-3.2.7.module\">\n            <sha256 value=\"ca4cc1000d477aec96203dad26b1982e0b22dab59608f58c2f418aa3cd64bd7a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"dev.drewhamilton.poko\" name=\"poko-annotations\" version=\"0.15.0\">\n         <artifact name=\"poko-annotations-0.15.0.module\">\n            <sha256 value=\"66d7224d73cd1c350b7523e2d70c11e366fbea51d9cf61ff1099149de35d7fb0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"dev.drewhamilton.poko\" name=\"poko-annotations\" version=\"0.18.2\">\n         <artifact name=\"poko-annotations-0.18.2.module\">\n            <sha256 value=\"4868cdc15a321b11ab3c8c5b6eaac4d3dda8520851fcd2db234fc37aaeebe4ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"dev.drewhamilton.poko\" name=\"poko-annotations-jvm\" version=\"0.15.0\">\n         <artifact name=\"poko-annotations-jvm-0.15.0-sources.jar\">\n            <sha256 value=\"7a735dde85bad254b3b48a1e272de91640c80cf855fafbeee569ba66edeced6d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"poko-annotations-jvm-0.15.0.jar\">\n            <sha256 value=\"3bcb96770ac52075c431201e29fd5e67924435555df22f5e5ab2602b7b773635\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"poko-annotations-jvm-0.15.0.module\">\n            <sha256 value=\"b79c2f6f898fa8e1bf1415a85a14f98fd99f770e00b3e91e9ba6cf1d915bbbff\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"dev.drewhamilton.poko\" name=\"poko-annotations-jvm\" version=\"0.18.2\">\n         <artifact name=\"poko-annotations-jvm-0.18.2.jar\">\n            <sha256 value=\"e54daa81cd038929633aec59606022e1eaa3432a3ca673494bbf1ae55e42234d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"poko-annotations-jvm-0.18.2.module\">\n            <sha256 value=\"a060d70838ff686617f43125831d1057b281081af46d9942f0c0ae38cd607ba7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"info.picocli\" name=\"picocli\" version=\"4.7.5\">\n         <artifact name=\"picocli-4.7.5.jar\">\n            <sha256 value=\"e83a906fb99b57091d1d68ac11f7c3d2518bd7a81a9c71b259e2c00d1564c8e8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"picocli-4.7.5.pom\">\n            <sha256 value=\"7e4e8b0f4b7ca607520b20d2f1e58df4f934ca636cb1eba8289cff2f2956bfd8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.github.detekt.sarif4k\" name=\"sarif4k\" version=\"0.5.0\">\n         <artifact name=\"sarif4k-0.5.0.module\">\n            <sha256 value=\"e72a62f07b569d13a5d66ba837e74ac33c68cfef01c13f3adde183e7ae64ce89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.github.detekt.sarif4k\" name=\"sarif4k-jvm\" version=\"0.5.0\">\n         <artifact name=\"sarif4k-jvm-0.5.0-sources.jar\">\n            <sha256 value=\"e8c4b95152fbc5ffcde24bdaf55b69dad95394cda2b47cbad6bd11c8dfdfe5c9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sarif4k-jvm-0.5.0.jar\">\n            <sha256 value=\"ead041938323b34336138cf43e1875d8aff90b5e7e9411dbede3d201a327f1a7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sarif4k-jvm-0.5.0.module\">\n            <sha256 value=\"948a3bad5ce43582aad460366096ca50b491f68a86b586189deb3fa8350e76b1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.github.oshai\" name=\"kotlin-logging\" version=\"5.1.0\">\n         <artifact name=\"kotlin-logging-5.1.0.module\">\n            <sha256 value=\"dd3ab77e0ec3508ca08980b5426eda6623ce8a5b7d422f383da1607b8513e384\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.github.oshai\" name=\"kotlin-logging-jvm\" version=\"5.1.0\">\n         <artifact name=\"kotlin-logging-jvm-5.1.0-sources.jar\">\n            <sha256 value=\"88404db4ab59b6d234c3828f5605c3cc47ddd834b8b85ebce016eda32a043142\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-logging-jvm-5.1.0.jar\">\n            <sha256 value=\"0e918ecb22a61b99f1eb9acebd689fdaa9a76dc9fe972c360fd36299a92aa892\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-logging-jvm-5.1.0.module\">\n            <sha256 value=\"23991be08eafe5c7b97c0f211d0bf7f0cbfd4276d8630e874cc61f6930375dc6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-api\" version=\"1.57.0\">\n         <artifact name=\"grpc-api-1.57.0.jar\">\n            <sha256 value=\"8d2c384299f84ee8aa7f670f00e7cb26b87e231cf3091474307b32b76910f71c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-api-1.57.0.pom\">\n            <sha256 value=\"c3f054a7c8861647d0a55825b0a949f44fcfc9c64f479083d96813814c502612\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-api\" version=\"1.57.2\">\n         <artifact name=\"grpc-api-1.57.2.jar\">\n            <sha256 value=\"42b72e6572c084055ac3ce03e6efe433eb05ef620b3daf5136a4359fc72cc3e1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-api-1.57.2.pom\">\n            <sha256 value=\"c7df4551a64f0282a766e809514d4238450a7429055f9c7718881d16a310a026\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-api\" version=\"1.69.1\">\n         <artifact name=\"grpc-api-1.69.1.jar\">\n            <sha256 value=\"a8d3d6dcc71f3ab613d668842282b488bdd93d3e99a0ef5dca7eee6fa734c283\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-api-1.69.1.pom\">\n            <sha256 value=\"beaf2e475d5c45d0634d4d324bf84db2a8d6a92922971e6f7dc27e851c42907f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-context\" version=\"1.27.2\">\n         <artifact name=\"grpc-context-1.27.2.pom\">\n            <sha256 value=\"0f212b14ebd834cbed9bd8869a5d6c9c1798eceb512c7fcc28da89f6f8a4edd8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-context\" version=\"1.57.0\">\n         <artifact name=\"grpc-context-1.57.0.jar\">\n            <sha256 value=\"953fcacd82f531e69b76e3834f5830bad4c22ae84144e058d71dc80a7430275d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-context-1.57.0.pom\">\n            <sha256 value=\"ab264e82bfb6ab895f6016af8b3cc44495abc81e769c30fa5a9ae0ad16be6cc6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-context\" version=\"1.57.2\">\n         <artifact name=\"grpc-context-1.57.2.jar\">\n            <sha256 value=\"9b8ac88d9cef2819daffed7bdbd2f22680237d482c6c671fe02d36da3f08cf00\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-context-1.57.2.pom\">\n            <sha256 value=\"8927f77d6381e24487682708196a6ca728368b8fd7cebb104fd9324b6b124917\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-context\" version=\"1.69.1\">\n         <artifact name=\"grpc-context-1.69.1.jar\">\n            <sha256 value=\"45ef95b8c158a8b5bdd3acb67b9e682ef25414bb148f488ec847438ab64715d4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-context-1.69.1.pom\">\n            <sha256 value=\"6de29bceab25a1bd0be11eea8468d0e3f1c0c476d0a533215b4fde1c8284b570\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-core\" version=\"1.57.0\">\n         <artifact name=\"grpc-core-1.57.0.jar\">\n            <sha256 value=\"3bee48c73bc4c5b55bed79be0e484adf26ba56bebbe5798ddbf34714ef1e1cea\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-core-1.57.0.pom\">\n            <sha256 value=\"8184045f5791e00cf2cdbcf5e8846afd48f5cf7e5a4f38fb5b8303c7b2efe55b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-core\" version=\"1.57.2\">\n         <artifact name=\"grpc-core-1.57.2.jar\">\n            <sha256 value=\"5a10070abfeb4966ec4d580961dcc4e7f69fa83ab25242f92c1765efb07b8606\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-core-1.57.2.pom\">\n            <sha256 value=\"0a97201afe17874f035f8a25ffb970678e49aadf2992c7d97c6ff9fb1d5da211\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-core\" version=\"1.69.1\">\n         <artifact name=\"grpc-core-1.69.1.jar\">\n            <sha256 value=\"51352cadaecbf9a4a4aa42d93f6f1fc728f1fd01b051680383ed09e5631ffbd0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-core-1.69.1.pom\">\n            <sha256 value=\"968098f4a8451bbcd3d7b88c6a8ab5b7a74ef80dfdee7a6052f352fff783b2c5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-inprocess\" version=\"1.69.1\">\n         <artifact name=\"grpc-inprocess-1.69.1.jar\">\n            <sha256 value=\"b7c6ac0e3abf4b8d582610d632d79417bc3da81254e1a4bcf7f01e8db7bd55ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-inprocess-1.69.1.pom\">\n            <sha256 value=\"febb30a5cf238237d075a3923e893992183daf171a1eb434acf132114a5f7f8a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-netty\" version=\"1.57.0\">\n         <artifact name=\"grpc-netty-1.57.0.jar\">\n            <sha256 value=\"81d43f2d4ed18fa341bd840a3735f1403a70074a046e157e27f679b721b4c9ad\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-netty-1.57.0.pom\">\n            <sha256 value=\"ed9dfdd7b1ed4356afb3c5d1407dedb634c8602fb410479b480ad8c1139ee17b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-netty\" version=\"1.57.2\">\n         <artifact name=\"grpc-netty-1.57.2.jar\">\n            <sha256 value=\"9809d4c10c94d11e7b2946cdeb5b2884be20a09510289544f37569f02c877a21\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-netty-1.57.2.pom\">\n            <sha256 value=\"8b12161cf2aacfbf398fb5afc3b0d73a21af206ba50c3d8f7bf4f6c4b375ebf8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-netty\" version=\"1.69.1\">\n         <artifact name=\"grpc-netty-1.69.1.jar\">\n            <sha256 value=\"52a86ed66f78933e83d1a3fb7162ad1667489564c4556366b7a3579c7024a447\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-netty-1.69.1.pom\">\n            <sha256 value=\"8f06650cc91428cc513111bfebbeabf79994185d72444b02e5dfaca38be43714\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-protobuf\" version=\"1.57.0\">\n         <artifact name=\"grpc-protobuf-1.57.0.jar\">\n            <sha256 value=\"49f986d4eab12610fdba4a6890fca52d5eb653598916fdb863a366d5e28eecf7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-protobuf-1.57.0.pom\">\n            <sha256 value=\"c0dcb8c67fd01daa63256f0f8b68d3707ceb7ca85cdaab7a3c6c3ff460e13dd1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-protobuf\" version=\"1.57.2\">\n         <artifact name=\"grpc-protobuf-1.57.2.jar\">\n            <sha256 value=\"31630d8a9e9f08a959862015e30a4863908be3680c3a686f4c1f08d2ffeaf706\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-protobuf-1.57.2.pom\">\n            <sha256 value=\"c5e2292802053977f04610b170484a9a1ea6af1541c144b27d18840ac544fa9d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-protobuf\" version=\"1.69.1\">\n         <artifact name=\"grpc-protobuf-1.69.1.jar\">\n            <sha256 value=\"4c52ef948fb8987a3baa7d46ba362b7bf307dd3c51f29241cd5c598398a010df\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-protobuf-1.69.1.pom\">\n            <sha256 value=\"bf4ca76d2ace44d9694714fbcf3fd729c98ef2e5863ab920a483c052a22f4423\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-protobuf-lite\" version=\"1.57.0\">\n         <artifact name=\"grpc-protobuf-lite-1.57.0.jar\">\n            <sha256 value=\"2c507c02d981b84a21763d44e09af4f279881dd3e25be3080f6361258607f198\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-protobuf-lite-1.57.0.pom\">\n            <sha256 value=\"b023be7008849489f652eeff75fd0fe1aa9c905f671d344e16daafddf921819d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-protobuf-lite\" version=\"1.57.2\">\n         <artifact name=\"grpc-protobuf-lite-1.57.2.jar\">\n            <sha256 value=\"fc4917dc5d419ac810fb3f27523c14e75e1fe50372154fab29324215ee6a955a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-protobuf-lite-1.57.2.pom\">\n            <sha256 value=\"60778c1ea407a3ba0a7f0f09df099e8272278e8abc29822c9cf50e1a052f1b75\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-protobuf-lite\" version=\"1.69.1\">\n         <artifact name=\"grpc-protobuf-lite-1.69.1.jar\">\n            <sha256 value=\"c29f90fadf3c7620f9359a243c067dd85b73bd765b28f3d95df910ac2d331555\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-protobuf-lite-1.69.1.pom\">\n            <sha256 value=\"263f1f844d756c15db5fab8869965e33722b3f4fe907fe1c885a90e046461731\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-services\" version=\"1.57.2\">\n         <artifact name=\"grpc-services-1.57.2.jar\">\n            <sha256 value=\"057a43ba647833756ab2f851bac80a3b9f8dce026fc1ac1f17d4f315648f4172\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-services-1.57.2.pom\">\n            <sha256 value=\"747601a03a58a18979819ac52ceffc586b8f9c6a6b422e1723f326af48813eb9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-stub\" version=\"1.57.0\">\n         <artifact name=\"grpc-stub-1.57.0.jar\">\n            <sha256 value=\"6e6ee141539fa14d9fa479f7f511605544443c7e011e78e273cf9468aa183060\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-stub-1.57.0.pom\">\n            <sha256 value=\"6d4459487c621dff31510a88829063631e915d2dcc774d71928418116e59a88d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-stub\" version=\"1.57.2\">\n         <artifact name=\"grpc-stub-1.57.2.jar\">\n            <sha256 value=\"84d2af12719168f76375f2afdfd6eb5133a865edba9244d40e6b968e3adde1d3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-stub-1.57.2.pom\">\n            <sha256 value=\"2159e614a8794775eb98e2e1c85834ab4e5911be1c4a75c7163a993e9c892bac\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-stub\" version=\"1.69.1\">\n         <artifact name=\"grpc-stub-1.69.1.jar\">\n            <sha256 value=\"e39c63273d53052ebe9f638d8ae98176735ec567328d9a17092cddb6f239b8c2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-stub-1.69.1.pom\">\n            <sha256 value=\"f5ad8157ec40d8a2347632965d6a03d18a48ad4625f32eb64b37a7a470ce53bb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.grpc\" name=\"grpc-util\" version=\"1.69.1\">\n         <artifact name=\"grpc-util-1.69.1.jar\">\n            <sha256 value=\"dd597bd675eaa042f3e3578648d9050c813c4595c5de6869ef9ddbb449006031\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"grpc-util-1.69.1.pom\">\n            <sha256 value=\"d20d3468cb74d56be55ed3d46f63ca38ee4bca0918d9aad7277a448f6e07a5b4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-buffer\" version=\"4.1.110.Final\">\n         <artifact name=\"netty-buffer-4.1.110.Final.jar\">\n            <sha256 value=\"46d74e79125aacc055c31f18152fdc5d4a569aa8d60091203d0baa833973ac3c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-buffer-4.1.110.Final.pom\">\n            <sha256 value=\"710ac19cc01cd80df6be9a3faad3c222b4a1a32f4b55137be07b6099d5da3562\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-buffer\" version=\"4.1.93.Final\">\n         <artifact name=\"netty-buffer-4.1.93.Final.jar\">\n            <sha256 value=\"007c7d9c378df02d390567d0d7ddf542ffddb021b7313dbf502392113ffabb08\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-buffer-4.1.93.Final.pom\">\n            <sha256 value=\"83fbc54e2b73b86d55b208f618d1a2a156910ec146f7ece57565007b750add78\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-codec\" version=\"4.1.110.Final\">\n         <artifact name=\"netty-codec-4.1.110.Final.jar\">\n            <sha256 value=\"9eccce9a8d827bb8ce84f9c3183fec58bd1c96a51010cf711297746034af3701\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-codec-4.1.110.Final.pom\">\n            <sha256 value=\"a806bb536bb323665baff7cd1223f2b272a2d4717ab4f9b12361086daae5df3e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-codec\" version=\"4.1.93.Final\">\n         <artifact name=\"netty-codec-4.1.93.Final.jar\">\n            <sha256 value=\"990c378168dc6364c6ff569701f4f2f122fffe8998b3e189eba4c4d868ed1084\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-codec-4.1.93.Final.pom\">\n            <sha256 value=\"19cded267a070dff1abc9d029b552fad262acc1aba5c6c67b2278fca113a26ab\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-codec-http\" version=\"4.1.110.Final\">\n         <artifact name=\"netty-codec-http-4.1.110.Final.jar\">\n            <sha256 value=\"dc0d6af5054630a70ff0ef354f20aa7a6e46738c9fc5636ed3d4fe77e38bd48d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-codec-http-4.1.110.Final.pom\">\n            <sha256 value=\"51ae990af14a321db6d3d6884b917b7d4363eb60dddc0f1493b18021a142e7ad\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-codec-http\" version=\"4.1.93.Final\">\n         <artifact name=\"netty-codec-http-4.1.93.Final.jar\">\n            <sha256 value=\"dacf78ce78ab2d29570325db4cd2451ea589639807de95881a0fa7155a9e6b55\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-codec-http-4.1.93.Final.pom\">\n            <sha256 value=\"a3dafff071b6d284e8063d96843de2bb83cf3b889eae0cc9e0adb64a57a31b82\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-codec-http2\" version=\"4.1.110.Final\">\n         <artifact name=\"netty-codec-http2-4.1.110.Final.jar\">\n            <sha256 value=\"b546c75445a487bb7bcd5a94779caecce33582cf7be31b8b39fc0e65b1ee26fc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-codec-http2-4.1.110.Final.pom\">\n            <sha256 value=\"29d2f6c26c3cca9fe8393671707fe8ef9c3e31020a2dfe06b82c426499c25837\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-codec-http2\" version=\"4.1.93.Final\">\n         <artifact name=\"netty-codec-http2-4.1.93.Final.jar\">\n            <sha256 value=\"d96cc09045a1341c6d47494352aa263b87b72fb1d2ea9eca161aa73820bfe8bb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-codec-http2-4.1.93.Final.pom\">\n            <sha256 value=\"084433b42d541f7ac4b59287dd253285cfda3a3d65de72e7368bb7ec3d367271\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-codec-socks\" version=\"4.1.110.Final\">\n         <artifact name=\"netty-codec-socks-4.1.110.Final.jar\">\n            <sha256 value=\"976052a3c9bb280bc6d99f3a29e6404677cf958c3de05b205093d38c006b880c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-codec-socks-4.1.110.Final.pom\">\n            <sha256 value=\"ffe57b316191dd4f96bee66c5709c13cbdb4ecab085c010c8db0c6aa809abf6c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-codec-socks\" version=\"4.1.93.Final\">\n         <artifact name=\"netty-codec-socks-4.1.93.Final.jar\">\n            <sha256 value=\"0ea47b5ba23ca1da8eb9146c8fc755c1271414633b1e2be2ce1df764ba0fff2a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-codec-socks-4.1.93.Final.pom\">\n            <sha256 value=\"8cd816ed991a946041bab4cb24bd9c8e41ee0692512511f2d83cef538eb605d7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-common\" version=\"4.1.110.Final\">\n         <artifact name=\"netty-common-4.1.110.Final.jar\">\n            <sha256 value=\"9851ec66548b9e0d41164ce98943cdd4bbe305f68ddbd24eae52e4501a0d7b1a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-common-4.1.110.Final.pom\">\n            <sha256 value=\"7d417f5335304dae1ea08a06586038c83fe8ad84c1d35baa15ed11921cef7920\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-common\" version=\"4.1.93.Final\">\n         <artifact name=\"netty-common-4.1.93.Final.jar\">\n            <sha256 value=\"443bb316599fb16e3baeba2fb58881814d7ff0b7af176fe76e38071a6e86f8c0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-common-4.1.93.Final.pom\">\n            <sha256 value=\"42d883b13eb38cabf549616462c5f331f5333bf0c8fc9215744f83c0180a4f6b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-handler\" version=\"4.1.110.Final\">\n         <artifact name=\"netty-handler-4.1.110.Final.jar\">\n            <sha256 value=\"d5a08d7de364912e4285968de4d4cce3f01da4bb048d5c6937e5f2af1f8e148a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-handler-4.1.110.Final.pom\">\n            <sha256 value=\"4d43c13d14f5635a2f8b0d5094d7a31c509ee0f52c724eba0ef30cffe3ea1555\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-handler\" version=\"4.1.93.Final\">\n         <artifact name=\"netty-handler-4.1.93.Final.jar\">\n            <sha256 value=\"4e5f563ae14ed713381816d582f5fcfd0615aefb29203486cdfb782d8a00a02b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-handler-4.1.93.Final.pom\">\n            <sha256 value=\"84a1525cac0b4759efaef2997a47fe19b9b5642f9273fa0fd58a2e76c7a059fe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-handler-proxy\" version=\"4.1.110.Final\">\n         <artifact name=\"netty-handler-proxy-4.1.110.Final.jar\">\n            <sha256 value=\"ad54ab4fe9c47ef3e723d71251126db53e8db543871adb9eafc94446539eff52\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-handler-proxy-4.1.110.Final.pom\">\n            <sha256 value=\"c613cb4e7e06f42efa31db8d8b2a339ed8bf41f00c46d38d0909a4c06c656dcf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-handler-proxy\" version=\"4.1.93.Final\">\n         <artifact name=\"netty-handler-proxy-4.1.93.Final.jar\">\n            <sha256 value=\"2ac5f7fbefa0b73ef783889069344d5515505a14b2303be693c5002c486df2b4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-handler-proxy-4.1.93.Final.pom\">\n            <sha256 value=\"6dc50da0e67f597812874f81eaa45404f7d076b8199ea9088932a85c1b610245\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-parent\" version=\"4.1.110.Final\">\n         <artifact name=\"netty-parent-4.1.110.Final.pom\">\n            <sha256 value=\"685adaf373666fc15427c810f8aff3a4fe194a97c7ed74b69d07c548f0d42f1c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-parent\" version=\"4.1.93.Final\">\n         <artifact name=\"netty-parent-4.1.93.Final.pom\">\n            <sha256 value=\"b109cb76f375fedb8a9ef75ac58063170deb7ea2ddd024f466fef6dc65cdfcee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-resolver\" version=\"4.1.110.Final\">\n         <artifact name=\"netty-resolver-4.1.110.Final.jar\">\n            <sha256 value=\"a2e9b4ae7caa92fc5bd747e11d1dec20d81b18fc00959554302244ac5c56ce70\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-resolver-4.1.110.Final.pom\">\n            <sha256 value=\"655f34192e8c7618b3c5a79e488e4daa35def41b0d16d45fa36523c3b4c9f641\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-resolver\" version=\"4.1.93.Final\">\n         <artifact name=\"netty-resolver-4.1.93.Final.jar\">\n            <sha256 value=\"e59770b66e81822e5d111ac4e544d7eb0c543e0a285f52628e53941acd8ed759\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-resolver-4.1.93.Final.pom\">\n            <sha256 value=\"5b350c3c91e9e55d29cbe68cfe4ef2116cc1f0328677ebf9f615bab7082c79f4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-transport\" version=\"4.1.110.Final\">\n         <artifact name=\"netty-transport-4.1.110.Final.jar\">\n            <sha256 value=\"a42dd68390ca14b4ff2d40628a096c76485b4adb7c19602d5289321a0669e704\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-transport-4.1.110.Final.pom\">\n            <sha256 value=\"30f5da0e7646f1840d632f88615c8b9d8205499d68559b9c4547b3b04a0683cd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-transport\" version=\"4.1.93.Final\">\n         <artifact name=\"netty-transport-4.1.93.Final.jar\">\n            <sha256 value=\"a5a78019bc1cd43dbc3c7b7cdd3801912ca26d1f498fb560514fee497864ba96\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-transport-4.1.93.Final.pom\">\n            <sha256 value=\"0dd62a0eb3cb1ea001a4d0426e4f5c08df1c70d9265675bffa5c583613422d43\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-transport-native-unix-common\" version=\"4.1.110.Final\">\n         <artifact name=\"netty-transport-native-unix-common-4.1.110.Final.jar\">\n            <sha256 value=\"51717bb7471141950390c6713a449fdb1054d07e60737ee7dda7083796cdee48\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-transport-native-unix-common-4.1.110.Final.pom\">\n            <sha256 value=\"ea18ce04c9a97ac0c51f4e397b185229fd95997e90b11339adcf7c51946d53d8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.netty\" name=\"netty-transport-native-unix-common\" version=\"4.1.93.Final\">\n         <artifact name=\"netty-transport-native-unix-common-4.1.93.Final.jar\">\n            <sha256 value=\"774165a1c4dbaacb17f9c1ad666b3569a6a59715ae828e7c3d47703f479a53e7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"netty-transport-native-unix-common-4.1.93.Final.pom\">\n            <sha256 value=\"15bc25b67ff0a49272b270ef2b8cffd620057ca16cb29dff7ad5661adca2ae12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.opencensus\" name=\"opencensus-api\" version=\"0.31.0\">\n         <artifact name=\"opencensus-api-0.31.0.jar\">\n            <sha256 value=\"702ba55d78f39d55195dcf041fdfaab7a7490a9ac45013542487ed9e4d3a4d23\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"opencensus-api-0.31.0.pom\">\n            <sha256 value=\"9b479591e7c3e0ab45381fa043a91657815bdd8c3593af010c7ac36f4c905919\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.opencensus\" name=\"opencensus-proto\" version=\"0.2.0\">\n         <artifact name=\"opencensus-proto-0.2.0.jar\">\n            <sha256 value=\"0c192d451e9dd74e98721b27d02f0e2b6bca44b51563b5dabf2e211f7a3ebf13\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"opencensus-proto-0.2.0.pom\">\n            <sha256 value=\"b7087907920fc8a81534686b2f1a2b331127af97f015abbdb3786a51f3fa1e52\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.perfmark\" name=\"perfmark-api\" version=\"0.26.0\">\n         <artifact name=\"perfmark-api-0.26.0.jar\">\n            <sha256 value=\"b7d23e93a34537ce332708269a0d1404788a5b5e1949e82f5535fce51b3ea95b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"perfmark-api-0.26.0.module\">\n            <sha256 value=\"31d832332474ce48150f5bae003343319136f336afd1076a289029319e3ea97a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"io.perfmark\" name=\"perfmark-api\" version=\"0.27.0\">\n         <artifact name=\"perfmark-api-0.27.0.jar\">\n            <sha256 value=\"c7b478503ec524e55df19b424d46d27c8a68aeb801664fadd4f069b71f52d0f6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"perfmark-api-0.27.0.module\">\n            <sha256 value=\"9f6c4e6a62b8defd14173acdb7db293d086353b224923eef6293f58161893cca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"jakarta.activation\" name=\"jakarta.activation-api\" version=\"1.2.1\">\n         <artifact name=\"jakarta.activation-api-1.2.1.jar\">\n            <sha256 value=\"8b0a0f52fa8b05c5431921a063ed866efaa41dadf2e3a7ee3e1961f2b0d9645b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"jakarta.activation-api-1.2.1.pom\">\n            <sha256 value=\"42585cb07dda7f23aa04eb5e0940061944a246a67ad3d16942fbe569ff03cd31\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"jakarta.inject\" name=\"jakarta.inject-api\" version=\"2.0.1\">\n         <artifact name=\"jakarta.inject-api-2.0.1.jar\">\n            <sha256 value=\"f7dc98062fccf14126abb751b64fab12c312566e8cbdc8483598bffcea93af7c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"jakarta.inject-api-2.0.1.pom\">\n            <sha256 value=\"e7fd7232e96307a575b2494c9367d68cf43ec98244aace3ccc23e1773ffa6fda\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"jakarta.xml.bind\" name=\"jakarta.xml.bind-api\" version=\"2.3.2\">\n         <artifact name=\"jakarta.xml.bind-api-2.3.2.jar\">\n            <sha256 value=\"69156304079bdeed9fc0ae3b39389f19b3cc4ba4443bc80508995394ead742ea\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"jakarta.xml.bind-api-2.3.2.pom\">\n            <sha256 value=\"b537b388dbab4cc0690b9d2fb0c74124d672531734567acf6e53130eab131ad6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"jakarta.xml.bind\" name=\"jakarta.xml.bind-api-parent\" version=\"2.3.2\">\n         <artifact name=\"jakarta.xml.bind-api-parent-2.3.2.pom\">\n            <sha256 value=\"15a55b7d537c9f9970aead28d2af97c059f65ff6102f76bbd29f1247dd8a6dfb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"javax.annotation\" name=\"javax.annotation-api\" version=\"1.3.2\">\n         <artifact name=\"javax.annotation-api-1.3.2.jar\">\n            <sha256 value=\"e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"javax.annotation-api-1.3.2.pom\">\n            <sha256 value=\"46a4a251ca406e78e4853d7a2bae83282844a4992851439ee9a1f23716f06b97\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"javax.inject\" name=\"javax.inject\" version=\"1\">\n         <artifact name=\"javax.inject-1-sources.jar\">\n            <sha256 value=\"c4b87ee2911c139c3daf498a781967f1eb2e75bc1a8529a2e7b328a15d0e433e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"javax.inject-1.jar\">\n            <sha256 value=\"91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"javax.inject-1.pom\">\n            <sha256 value=\"943e12b100627804638fa285805a0ab788a680266531e650921ebfe4621a8bfa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"junit\" name=\"junit\" version=\"4.13.2\">\n         <artifact name=\"junit-4.13.2-sources.jar\">\n            <sha256 value=\"34181df6482d40ea4c046b063cb53c7ffae94bdf1b1d62695bdf3adf9dea7e3a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"junit-4.13.2.jar\">\n            <sha256 value=\"8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"junit-4.13.2.pom\">\n            <sha256 value=\"569b6977ee4603c965c1c46c3058fa6e969291b0160eb6964dd092cd89eadd94\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"net.bytebuddy\" name=\"byte-buddy\" version=\"1.14.15\">\n         <artifact name=\"byte-buddy-1.14.15.jar\">\n            <sha256 value=\"7472e3961992c12a9fd4f6d67c21de4280abe18f292704dd49d7338289f8acf5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"byte-buddy-1.14.15.pom\">\n            <sha256 value=\"d5639f8fe27cead33e6a4c789fad8e65f328f62bb79dad2bdd7ae6cc93b9454c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"net.bytebuddy\" name=\"byte-buddy\" version=\"1.14.9\">\n         <artifact name=\"byte-buddy-1.14.9-sources.jar\">\n            <sha256 value=\"4039b20d06895bf0449161dd5f1cbbc2e81004af196d5b42c5536b91db8e0315\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"byte-buddy-1.14.9.jar\">\n            <sha256 value=\"377352e253282bf86f731ac90ed88348e8f40a63ce033c00a85982de7e790e6f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"byte-buddy-1.14.9.pom\">\n            <sha256 value=\"2d6772910d16169bd4c9229e8a365cf54e192bc620cbcfa7f84271f5d115e815\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"net.bytebuddy\" name=\"byte-buddy-agent\" version=\"1.14.15\">\n         <artifact name=\"byte-buddy-agent-1.14.15.jar\">\n            <sha256 value=\"3ef6ec7175801361170067cc6902969f966d37c72bf9353d9cd282263b184064\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"byte-buddy-agent-1.14.15.pom\">\n            <sha256 value=\"6d29dda5f7eb50ca3ba3b0a12aef518cc56d8234a33442a5fa982b4b4480265e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"net.bytebuddy\" name=\"byte-buddy-agent\" version=\"1.14.9\">\n         <artifact name=\"byte-buddy-agent-1.14.9-sources.jar\">\n            <sha256 value=\"01ba24ea9e0c83e6e8a6d96d5476bd2860a26bc98994af747a6cbd7b015ca85f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"byte-buddy-agent-1.14.9.jar\">\n            <sha256 value=\"11ed107d4b78e55f8c3d34250494375081a29bc125a1f5c56db582ccdd48835f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"byte-buddy-agent-1.14.9.pom\">\n            <sha256 value=\"ab11e9a20231d1866a7d4035eb0b0075b80360d8cddc5d0a373c39584e9cd247\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"net.bytebuddy\" name=\"byte-buddy-parent\" version=\"1.14.15\">\n         <artifact name=\"byte-buddy-parent-1.14.15.pom\">\n            <sha256 value=\"26eaef08651ffa58ba290092ce3281782e29c0628a1b79fa5a3784f908b418ac\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"net.bytebuddy\" name=\"byte-buddy-parent\" version=\"1.14.9\">\n         <artifact name=\"byte-buddy-parent-1.14.9.pom\">\n            <sha256 value=\"66b8342251d35f2063e69316f63bafcb056342fe75e921c0f465c2d96593535e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"net.java\" name=\"jvnet-parent\" version=\"1\">\n         <artifact name=\"jvnet-parent-1.pom\">\n            <sha256 value=\"281440811268e65d9e266b3cc898297e214e04f09740d0386ceeb4a8923d63bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"net.java\" name=\"jvnet-parent\" version=\"3\">\n         <artifact name=\"jvnet-parent-3.pom\">\n            <sha256 value=\"30f5789efa39ddbf96095aada3fc1260c4561faf2f714686717cb2dc5049475a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"net.java.dev.jna\" name=\"jna\" version=\"5.6.0\">\n         <artifact name=\"jna-5.6.0.jar\">\n            <sha256 value=\"5557e235a8aa2f9766d5dc609d67948f2a8832c2d796cea9ef1d6cbe0b3b7eaf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"jna-5.6.0.pom\">\n            <sha256 value=\"5fe81b0255978f24616d37b10608b79498a5f3073e1d9b2038d8736a831f2608\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"net.java.dev.jna\" name=\"jna-platform\" version=\"5.6.0\">\n         <artifact name=\"jna-platform-5.6.0.jar\">\n            <sha256 value=\"9ecea8bf2b1b39963939d18b70464eef60c508fed8820f9dcaba0c35518eabf7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"jna-platform-5.6.0.pom\">\n            <sha256 value=\"1beb35cb4184e6c906a7e32eaebd852dd3da0a263962e99134ab945832394e28\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"net.ltgt.gradle.incap\" name=\"incap\" version=\"0.2\">\n         <artifact name=\"incap-0.2.jar\">\n            <sha256 value=\"b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"incap-0.2.pom\">\n            <sha256 value=\"1a4a08a1e88d32052cd82dc2f740b34d3048e2c0e6a7c2bfe2309ed00771f73a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"net.sf.jopt-simple\" name=\"jopt-simple\" version=\"4.9\">\n         <artifact name=\"jopt-simple-4.9.jar\">\n            <sha256 value=\"26c5856e954b5f864db76f13b86919b59c6eecf9fd930b96baa8884626baf2f5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"jopt-simple-4.9.pom\">\n            <sha256 value=\"7af7e2d8b24b4798f04c2b7da24c9fbd1b7557b4e017c2054481565916079092\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"net.sf.kxml\" name=\"kxml2\" version=\"2.3.0\">\n         <artifact name=\"kxml2-2.3.0.jar\">\n            <sha256 value=\"f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kxml2-2.3.0.pom\">\n            <sha256 value=\"31ce606f4e9518936299bb0d27c978fa61e185fd1de7c9874fe959a53e34a685\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"net.swiftzer.semver\" name=\"semver\" version=\"1.1.1\">\n         <artifact name=\"semver-1.1.1.jar\">\n            <sha256 value=\"f028546d70326b93314a4f448cfd217b50b801ec20313cd46028a94604f46d66\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"semver-1.1.1.pom\">\n            <sha256 value=\"320c1150c2c5dc40937423f9e888e10d9e8b2d4e1346c349864816ba2afe39ff\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.aomedia.avif.android\" name=\"avif\" version=\"1.0.1.262e11d\">\n         <artifact name=\"avif-1.0.1.262e11d.aar\">\n            <sha256 value=\"df43715694e185763e870602fb59fb6646629ebe49b539df2297119077eaacd6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"avif-1.0.1.262e11d.pom\">\n            <sha256 value=\"48851178963623421999e9e911455aace0ad53fcbfbead79c7a4f6965cc9a3f5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache\" name=\"apache\" version=\"13\">\n         <artifact name=\"apache-13.pom\">\n            <sha256 value=\"ff513db0361fd41237bef4784968bc15aae478d4ec0a9496f811072ccaf3841d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache\" name=\"apache\" version=\"15\">\n         <artifact name=\"apache-15.pom\">\n            <sha256 value=\"36c2f2f979ac67b450c0cb480e4e9baf6b40f3a681f22ba9692287d1139ad494\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache\" name=\"apache\" version=\"18\">\n         <artifact name=\"apache-18.pom\">\n            <sha256 value=\"7831307285fd475bbc36b20ae38e7882f11c3153b1d5930f852d44eda8f33c17\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache\" name=\"apache\" version=\"21\">\n         <artifact name=\"apache-21.pom\">\n            <sha256 value=\"af10c108da014f17cafac7b52b2b4b5a3a1c18265fa2af97a325d9143537b380\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache\" name=\"apache\" version=\"23\">\n         <artifact name=\"apache-23.pom\">\n            <sha256 value=\"bc10624e0623f36577fac5639ca2936d3240ed152fb6d8d533ab4d270543491c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache\" name=\"apache\" version=\"29\">\n         <artifact name=\"apache-29.pom\">\n            <sha256 value=\"3e49037174820bbd0df63420a977255886398954c2a06291fa61f727ac35b377\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache\" name=\"apache\" version=\"31\">\n         <artifact name=\"apache-31.pom\">\n            <sha256 value=\"555d0c9eaa69c042aff924927b9381e8f8174136d355eead445224452e6291cc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache\" name=\"apache\" version=\"33\">\n         <artifact name=\"apache-33.pom\">\n            <sha256 value=\"d78bd8524c5f8380a190a6525686629a95dfe512df21111383a6d8c0923a4415\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.commons\" name=\"commons-compress\" version=\"1.21\">\n         <artifact name=\"commons-compress-1.21.jar\">\n            <sha256 value=\"6aecfd5459728a595601cfa07258d131972ffc39b492eb48bdd596577a2f244a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"commons-compress-1.21.pom\">\n            <sha256 value=\"675bb023c9beedde3232949979b9742a5fea946280a55a1b462d4ca7801088cd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.commons\" name=\"commons-parent\" version=\"34\">\n         <artifact name=\"commons-parent-34.pom\">\n            <sha256 value=\"3a2e69d06d641d1f3b293126dc9e2e4ea6563bf8c36c87e0ab6fa4292d04b79c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.commons\" name=\"commons-parent\" version=\"35\">\n         <artifact name=\"commons-parent-35.pom\">\n            <sha256 value=\"7098a1ab8336ecd4c9dc21cbbcac869f82c66f64b8ac4f7988d41b4fcb44e49a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.commons\" name=\"commons-parent\" version=\"42\">\n         <artifact name=\"commons-parent-42.pom\">\n            <sha256 value=\"cd313494c670b483ec256972af1698b330e598f807002354eb765479f604b09c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.commons\" name=\"commons-parent\" version=\"52\">\n         <artifact name=\"commons-parent-52.pom\">\n            <sha256 value=\"75dbe8f34e98e4c3ff42daae4a2f9eb4cbcd3b5f1047d54460ace906dbb4502e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.commons\" name=\"commons-parent\" version=\"58\">\n         <artifact name=\"commons-parent-58.pom\">\n            <sha256 value=\"2d4b12e18899063abd7c75278b5fa97a3729d80878ceecb6a40d946e9c0d5590\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.commons\" name=\"commons-parent\" version=\"69\">\n         <artifact name=\"commons-parent-69.pom\">\n            <sha256 value=\"d50da9c39bdca823d618d1b4a03b73f196497fcb8616fd0da727c8623592a9bb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.commons\" name=\"commons-parent\" version=\"74\">\n         <artifact name=\"commons-parent-74.pom\">\n            <sha256 value=\"80eb61b0c87fdd826a069313b28b672da3f1885832da447b51e6e8a6197e7ecb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.httpcomponents\" name=\"httpclient\" version=\"4.5.14\">\n         <artifact name=\"httpclient-4.5.14.jar\">\n            <sha256 value=\"c8bc7e1c51a6d4ce72f40d2ebbabf1c4b68bfe76e732104b04381b493478e9d6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"httpclient-4.5.14.pom\">\n            <sha256 value=\"f18355af4cf80a8a4ef04ebd742a47e90a7eaf080c725b2095dbc4fc5dbdefb7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.httpcomponents\" name=\"httpclient\" version=\"4.5.6\">\n         <artifact name=\"httpclient-4.5.6.jar\">\n            <sha256 value=\"c03f813195e7a80e3608d0ddd8da80b21696a4c92a6a2298865bf149071551c7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"httpclient-4.5.6.pom\">\n            <sha256 value=\"7efc1241e73e7fbb268bfd33242d11ebd3ca07061d7d85f2962dc32a0f0b8855\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.httpcomponents\" name=\"httpcomponents-client\" version=\"4.5.14\">\n         <artifact name=\"httpcomponents-client-4.5.14.pom\">\n            <sha256 value=\"5bad1de4f101447659f89d089868ccbad64a68cc503d2d65410b51f6904aa061\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.httpcomponents\" name=\"httpcomponents-client\" version=\"4.5.6\">\n         <artifact name=\"httpcomponents-client-4.5.6.pom\">\n            <sha256 value=\"b042b41f2391edb00d35f7f4e509aed2123648c1d246ce58d0f7b905c9fe1f73\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.httpcomponents\" name=\"httpcomponents-core\" version=\"4.4.16\">\n         <artifact name=\"httpcomponents-core-4.4.16.pom\">\n            <sha256 value=\"f2d75a2c2d423ad18539bf21656d56f88a4091944a662fcaf159d5ae283db7f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.httpcomponents\" name=\"httpcomponents-parent\" version=\"10\">\n         <artifact name=\"httpcomponents-parent-10.pom\">\n            <sha256 value=\"caaf967d94afb21753f36082c6086206bd1f48825ff596932cceba72b65d39fa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.httpcomponents\" name=\"httpcomponents-parent\" version=\"11\">\n         <artifact name=\"httpcomponents-parent-11.pom\">\n            <sha256 value=\"a901f87b115c55070c7ee43efff63e20e7b02d30af2443ae292bf1f4e532d3aa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.httpcomponents\" name=\"httpcore\" version=\"4.4.16\">\n         <artifact name=\"httpcore-4.4.16.jar\">\n            <sha256 value=\"6c9b3dd142a09dc468e23ad39aad6f75a0f2b85125104469f026e52a474e464f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"httpcore-4.4.16.pom\">\n            <sha256 value=\"3cbad849b35dacfe6cec31adada2c623c026c3261141b0d26eec7e399c6cd7fa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.httpcomponents\" name=\"httpmime\" version=\"4.5.6\">\n         <artifact name=\"httpmime-4.5.6.jar\">\n            <sha256 value=\"0b2b1102c18d3c7e05a77214b9b7501a6f6056174ae5604e0e256776eda7553e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"httpmime-4.5.6.pom\">\n            <sha256 value=\"dfbfd6ffe2a784ca9817c46365aa7f8a578320b805bde39d6f55a0b09d8aa8ca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.maven\" name=\"maven\" version=\"3.9.9\">\n         <artifact name=\"maven-3.9.9.pom\">\n            <sha256 value=\"d24ed68923df210d085bb5d386d4336d12ede5473392e159d5e6e64497af6f39\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.maven\" name=\"maven-artifact\" version=\"3.9.9\">\n         <artifact name=\"maven-artifact-3.9.9.jar\">\n            <sha256 value=\"30f015d1c1a393e19c18cd4f43532089c36d4ca328608ce3dda78b74d3d31515\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"maven-artifact-3.9.9.pom\">\n            <sha256 value=\"65ddf76b92a707b9f1240eccbb4774b30d4c77778671291fd355e06d4d3a96df\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.maven\" name=\"maven-builder-support\" version=\"3.9.9\">\n         <artifact name=\"maven-builder-support-3.9.9.jar\">\n            <sha256 value=\"2ca4a967bdd12a9e85d40e012374f86e63d4a1030c199da4832e3d0a1c6770d8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"maven-builder-support-3.9.9.pom\">\n            <sha256 value=\"0ac318002f110571baa571ecf20697fec4767048d297e2688455b914d5030ffe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.maven\" name=\"maven-model\" version=\"3.9.9\">\n         <artifact name=\"maven-model-3.9.9.jar\">\n            <sha256 value=\"8f59b0a16fe9c933be749a60ae0705a0cb337bb5abaf38801b40b740ff775727\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"maven-model-3.9.9.pom\">\n            <sha256 value=\"1b48062b15387c1c4204157ae19a560919dfb5728b3e92a11e5503f222faab4a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.maven\" name=\"maven-model-builder\" version=\"3.9.9\">\n         <artifact name=\"maven-model-builder-3.9.9.jar\">\n            <sha256 value=\"a4377182ac2e5adfe16be3b3c81981a5ecddab014184de72ae1e522f04a77602\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"maven-model-builder-3.9.9.pom\">\n            <sha256 value=\"9d23af0e0f23224c203209d11b76ac6090a5a967d3d887a920a7a47b260c0bd8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.apache.maven\" name=\"maven-parent\" version=\"43\">\n         <artifact name=\"maven-parent-43.pom\">\n            <sha256 value=\"468a1262e9aaa5febf9d604e2836267f815351f2b4520f28fb17f53c71e33554\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.bitbucket.b_c\" name=\"jose4j\" version=\"0.7.0\">\n         <artifact name=\"jose4j-0.7.0.jar\">\n            <sha256 value=\"eb14f69c0395d4a106c6c46fe6dff080c4608ccabc99b1f03933d374383d9bbe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"jose4j-0.7.0.pom\">\n            <sha256 value=\"13128ccf90fb31f18d8109b484516649d5db0e47284d860e71a4cf3148153ed8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.bitbucket.b_c\" name=\"jose4j\" version=\"0.9.5\">\n         <artifact name=\"jose4j-0.9.5.jar\">\n            <sha256 value=\"808fb3166f3e67dad9811c331029ab1681242fd52b735bc3f33f281167fcc72e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"jose4j-0.9.5.pom\">\n            <sha256 value=\"bad024180a1b469cbd94e5f2db12841bcac5443d9545607f673cfde677c1d872\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.bouncycastle\" name=\"bcpkix-jdk18on\" version=\"1.77\">\n         <artifact name=\"bcpkix-jdk18on-1.77.jar\">\n            <sha256 value=\"1ac7fe8efd5b2f38cdc165be5a0675734fe44808dab92707201f03a535d6f1b8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"bcpkix-jdk18on-1.77.pom\">\n            <sha256 value=\"8fb0926f02e2c4b2dc52e47ebb093f92f1d3bb6f149c2a5cca5e2a648d2c498d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.bouncycastle\" name=\"bcpkix-jdk18on\" version=\"1.79\">\n         <artifact name=\"bcpkix-jdk18on-1.79.jar\">\n            <sha256 value=\"3639a24ddf9ba4b7eba0659b44770e91eba816421888e571f285aadefe532cd6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"bcpkix-jdk18on-1.79.pom\">\n            <sha256 value=\"35e49f4134de2ac326c3a50a25762cbb4db56f3802fa3f730cc85b653ad0987b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.bouncycastle\" name=\"bcprov-jdk15on\" version=\"1.70\">\n         <artifact name=\"bcprov-jdk15on-1.70-sources.jar\">\n            <sha256 value=\"0252e39814e4403b5d91a7386c3a5ac3e1fe65d43c2d25fed8d45e8eebab2696\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"bcprov-jdk15on-1.70.jar\">\n            <sha256 value=\"8f3c20e3e2d565d26f33e8d4857a37d0d7f8ac39b62a7026496fcab1bdac30d4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"bcprov-jdk15on-1.70.pom\">\n            <sha256 value=\"6df4b5b76d9062017664ad0ca285e57154ae803607cb89c970b39cc0e016abb0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.bouncycastle\" name=\"bcprov-jdk18on\" version=\"1.77\">\n         <artifact name=\"bcprov-jdk18on-1.77.jar\">\n            <sha256 value=\"dabb98c24d72c9b9f585633d1df9c5cd58d9ad373d0cd681367e6a603a495d58\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"bcprov-jdk18on-1.77.pom\">\n            <sha256 value=\"ad1382cfcd03bcdd8be13913c02f44fd469d0a76a53cf2caef5be180adc36b23\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.bouncycastle\" name=\"bcprov-jdk18on\" version=\"1.78.1\">\n         <artifact name=\"bcprov-jdk18on-1.78.1.jar\">\n            <sha256 value=\"add5915e6acfc6ab5836e1fd8a5e21c6488536a8c1f21f386eeb3bf280b702d7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"bcprov-jdk18on-1.78.1.pom\">\n            <sha256 value=\"28912d139f9eed141c394371fbe5ba6ffff91e78f1c9cb8348f944a24d204ed2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.bouncycastle\" name=\"bcprov-jdk18on\" version=\"1.79\">\n         <artifact name=\"bcprov-jdk18on-1.79.jar\">\n            <sha256 value=\"0d81ecc3124536b539bce9aa3fe9621b7f84c9cee371b635a5b31c78b79ab1da\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"bcprov-jdk18on-1.79.pom\">\n            <sha256 value=\"d8f1a06b149d746e9d98de54e2f7aa9b2eb613fb35ca67d8ae396ceaac661ee4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.bouncycastle\" name=\"bcutil-jdk18on\" version=\"1.77\">\n         <artifact name=\"bcutil-jdk18on-1.77.jar\">\n            <sha256 value=\"947673bcbc5a8dde2d2fa688a5b7598d0ca6e2a74a7ea30cd93f04f6b3ad68f8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"bcutil-jdk18on-1.77.pom\">\n            <sha256 value=\"163dfa6632ffb928a705ca83722350cacea49ccd623ce73645a5cc3b0fa9e6e8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.bouncycastle\" name=\"bcutil-jdk18on\" version=\"1.79\">\n         <artifact name=\"bcutil-jdk18on-1.79.jar\">\n            <sha256 value=\"c70b88ada58938cbc2f005d40329054078bcfa1149e6ffc03e9242eb6ab21836\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"bcutil-jdk18on-1.79.pom\">\n            <sha256 value=\"e24c1fb4cf1605405a6988e9e4d6e4b2e1f4393fc73a89a9452ae625ee311d02\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.checkerframework\" name=\"checker-compat-qual\" version=\"2.5.3\">\n         <artifact name=\"checker-compat-qual-2.5.3.jar\">\n            <sha256 value=\"d76b9afea61c7c082908023f0cbc1427fab9abd2df915c8b8a3e7a509bccbc6d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"checker-compat-qual-2.5.3.pom\">\n            <sha256 value=\"f7fcdac99eb33d169f6d52a35541c22ffd14f458abbcf56f9c49ee1486598c9c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.checkerframework\" name=\"checker-compat-qual\" version=\"2.5.5\">\n         <artifact name=\"checker-compat-qual-2.5.5.jar\">\n            <sha256 value=\"11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"checker-compat-qual-2.5.5.pom\">\n            <sha256 value=\"42f21ebd9183be049ee5afc822b345403a5da764037875734a039b0d6e0353be\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.checkerframework\" name=\"checker-qual\" version=\"2.5.8\">\n         <artifact name=\"checker-qual-2.5.8.pom\">\n            <sha256 value=\"33ac6a0f1341ae96647c7d4465f4aa3d24fe97d2697bcee2ceae6fc8b5ef2c3c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.checkerframework\" name=\"checker-qual\" version=\"3.33.0\">\n         <artifact name=\"checker-qual-3.33.0.jar\">\n            <sha256 value=\"e316255bbfcd9fe50d165314b85abb2b33cb2a66a93c491db648e498a82c2de1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"checker-qual-3.33.0.module\">\n            <sha256 value=\"e8521d75625d41272c767d262a153ac163cc505b66644a2ef705fa8949ffb4e5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.checkerframework\" name=\"checker-qual\" version=\"3.41.0\">\n         <artifact name=\"checker-qual-3.41.0.jar\">\n            <sha256 value=\"2f9f245bf68e4259d610894f2406dc1f6363dc639302bd566e8272e4f4541172\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"checker-qual-3.41.0.module\">\n            <sha256 value=\"b38672c17f455276b210ed3402ff92dce666770b1a8c610c7cc34ad54c532d20\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.checkerframework\" name=\"checker-qual\" version=\"3.42.0\">\n         <artifact name=\"checker-qual-3.42.0-sources.jar\">\n            <sha256 value=\"efb65eb479f61f53c6dcafbd42ed59dad09b0a0d5a7f44b7bc68df25c2dcf8fd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"checker-qual-3.42.0.jar\">\n            <sha256 value=\"ccaedd33af0b7894d9f2f3b644f4d19e43928e32902e61ac4d10777830f5aac7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"checker-qual-3.42.0.module\">\n            <sha256 value=\"e0fa622b7de63eae11047ef6e91b4c2ad0f1f0e13cb903ff52080a47f57a5746\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.checkerframework\" name=\"checker-qual\" version=\"3.43.0\">\n         <artifact name=\"checker-qual-3.43.0.jar\">\n            <sha256 value=\"3fbc2e98f05854c3df16df9abaa955b91b15b3ecac33623208ed6424640ef0f6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"checker-qual-3.43.0.module\">\n            <sha256 value=\"f8163327245ab8625532948c72a930548cd97f34d6c3fe860fa6aec5a34d79b4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.codehaus.groovy\" name=\"groovy\" version=\"3.0.17\">\n         <artifact name=\"groovy-3.0.17.jar\">\n            <sha256 value=\"9ed2a565a8592a9f63f410afed892d0ca6bec1ff96277ce4cc7f3e2e366e794f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"groovy-3.0.17.pom\">\n            <sha256 value=\"207afde880172806c0a3b20f122d9679f175f22d15b05e87f589f7255dd38362\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.codehaus.groovy\" name=\"groovy\" version=\"3.0.21\">\n         <artifact name=\"groovy-3.0.21.jar\">\n            <sha256 value=\"5cf3730c0c2c15c293f7750dd7114ed27a671fc940165bbae0378a281f5b2d5e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.codehaus.groovy\" name=\"groovy\" version=\"3.0.22\">\n         <artifact name=\"groovy-3.0.22.jar\">\n            <sha256 value=\"c92c92c4b9b183f9981ba7399f36592e5e3ad6f4cdac7101b5a22cc17998d13f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.codehaus.mojo\" name=\"animal-sniffer-annotations\" version=\"1.23\">\n         <artifact name=\"animal-sniffer-annotations-1.23.jar\">\n            <sha256 value=\"9ffe526bf43a6348e9d8b33b9cd6f580a7f5eed0cf055913007eda263de974d0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"animal-sniffer-annotations-1.23.pom\">\n            <sha256 value=\"5610db06b733641acbc7a0c48a80c40069db627bad043f8c7c8d7afb4f6a3d27\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.codehaus.mojo\" name=\"animal-sniffer-annotations\" version=\"1.24\">\n         <artifact name=\"animal-sniffer-annotations-1.24.jar\">\n            <sha256 value=\"c720e6e5bcbe6b2f48ded75a47bccdb763eede79d14330102e0d352e3d89ed92\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"animal-sniffer-annotations-1.24.pom\">\n            <sha256 value=\"88484f60a6ad4238a97febacf2b333e9e08c178b8f180a05a3edbff4a38a836e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.codehaus.mojo\" name=\"animal-sniffer-parent\" version=\"1.23\">\n         <artifact name=\"animal-sniffer-parent-1.23.pom\">\n            <sha256 value=\"6b7f054ab86a87f8e2599f35808b0989922e86b6cab13988021cd12640a4b404\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.codehaus.mojo\" name=\"animal-sniffer-parent\" version=\"1.24\">\n         <artifact name=\"animal-sniffer-parent-1.24.pom\">\n            <sha256 value=\"49ddab43c8361dc2ef0c1ff87cb590fa7231702ab9f62e26d512dc18a1f1cd04\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.codehaus.mojo\" name=\"mojo-parent\" version=\"74\">\n         <artifact name=\"mojo-parent-74.pom\">\n            <sha256 value=\"1472325a16f0b1bdabed21fa4839372964944610294ce2681b2059edc654f2b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.codehaus.mojo\" name=\"mojo-parent\" version=\"84\">\n         <artifact name=\"mojo-parent-84.pom\">\n            <sha256 value=\"2fe510618b2f60fcd5f2fb82bc4b2c2c344048d74f30be719fcb86829ee8ac30\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.codehaus.plexus\" name=\"plexus\" version=\"10\">\n         <artifact name=\"plexus-10.pom\">\n            <sha256 value=\"bba9c521064b9ca132ce97cc1cc7eb4afc2dbe32bc88cb872c88e99f6162301f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.codehaus.plexus\" name=\"plexus\" version=\"16\">\n         <artifact name=\"plexus-16.pom\">\n            <sha256 value=\"68d4eed65a3dbbc342ed80dd138fbe9c67cb7fb4c2abc4f5201cdb5b9f645868\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.codehaus.plexus\" name=\"plexus-interpolation\" version=\"1.27\">\n         <artifact name=\"plexus-interpolation-1.27.jar\">\n            <sha256 value=\"3fb4fb6143fdf964024c3cb738551524b9ea84e5c211cd660c559ad0703e5230\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"plexus-interpolation-1.27.pom\">\n            <sha256 value=\"d54fbcbc4399e352322874a4128b9d28fe9fe1583f89ec361de242ea38d33f9b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.codehaus.plexus\" name=\"plexus-utils\" version=\"3.5.1\">\n         <artifact name=\"plexus-utils-3.5.1.jar\">\n            <sha256 value=\"86e0255d4c879c61b4833ed7f13124e8bb679df47debb127326e7db7dd49a07b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"plexus-utils-3.5.1.pom\">\n            <sha256 value=\"94ff68edeb48204d12c99189c767164d3a9f778a1372d1dce11a41462e6236f2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.conscrypt\" name=\"conscrypt-android\" version=\"2.5.2\">\n         <artifact name=\"conscrypt-android-2.5.2-sources.jar\">\n            <sha256 value=\"d7b34504e1c77dbe866f08b1f12e0908c1c3456e8d7eabef1a819b78ac1ad406\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"conscrypt-android-2.5.2.aar\">\n            <sha256 value=\"42d18979caf53f5ef68548c76d4c98b41adb910a32ad9448133f9c5b20bd65a3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"conscrypt-android-2.5.2.pom\">\n            <sha256 value=\"bfdf7f13fb78550ffff265adc1d7d9b8e37dbdd60b3fd7bfd410ea2f768ed124\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.conscrypt\" name=\"conscrypt-android\" version=\"2.5.3\">\n         <artifact name=\"conscrypt-android-2.5.3.aar\">\n            <sha256 value=\"551ae4e301c571760d1791e647db6ed1dcb10d34dcae7aa12b67f220f2ce98d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"conscrypt-android-2.5.3.pom\">\n            <sha256 value=\"cf4156118651f7861d0aaac01d26eb3b8f616626d67059eb1274b2a4048b0ad0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.conscrypt\" name=\"conscrypt-openjdk-uber\" version=\"2.5.2\">\n         <artifact name=\"conscrypt-openjdk-uber-2.5.2.jar\">\n            <sha256 value=\"eaf537d98e033d0f0451cd1b8cc74e02d7b55ec882da63c88060d806ba89c348\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"conscrypt-openjdk-uber-2.5.2.pom\">\n            <sha256 value=\"b5fd548732f932545d777890eb995222bfe866232351be908137e39c3c672d8b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ec4j.core\" name=\"ec4j-core\" version=\"0.3.0\">\n         <artifact name=\"ec4j-core-0.3.0.jar\">\n            <sha256 value=\"cadef0207077074b11a12be442f89ab6cf93fbc2f848702d9371a9611414d558\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ec4j-core-0.3.0.pom\">\n            <sha256 value=\"fd1b5d4ca1511b3cbc9c91af75ef361228b4f9fb100192d3c865471844ddc6e9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ec4j.core\" name=\"ec4j-core-parent\" version=\"0.3.0\">\n         <artifact name=\"ec4j-core-parent-0.3.0.pom\">\n            <sha256 value=\"90a311043353c087db3ff2f34802967358a2e488245d887b39c21b66f73ede65\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.eclipse.ee4j\" name=\"project\" version=\"1.0.2\">\n         <artifact name=\"project-1.0.2.pom\">\n            <sha256 value=\"7495a07a797e88e43c3bc1a87421bd8b1fc55e32291fa18e4e32d8031ddc873f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.eclipse.ee4j\" name=\"project\" version=\"1.0.5\">\n         <artifact name=\"project-1.0.5.pom\">\n            <sha256 value=\"916b4794d8d8220a59a3fdf6a64dbe794aeb23395e888b81ae36a9b5a2c591a6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.eclipse.ee4j\" name=\"project\" version=\"1.0.6\">\n         <artifact name=\"project-1.0.6.pom\">\n            <sha256 value=\"4e7d8329d8da7dcf30779d824241be145f27108932f5a5a24eb907677bc8d72d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.eclipse.sisu\" name=\"org.eclipse.sisu.inject\" version=\"0.9.0.M3\">\n         <artifact name=\"org.eclipse.sisu.inject-0.9.0.M3.jar\">\n            <sha256 value=\"15335c4dcf082f599fb8eddcfb58d6a7e9a9c97de2883c257089a479b9b24522\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"org.eclipse.sisu.inject-0.9.0.M3.pom\">\n            <sha256 value=\"57ed17e057ba716cc1f1e5b2d4e014a68c3d50bd33498227a90f712519334dd4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.eclipse.sisu\" name=\"sisu-inject\" version=\"0.9.0.M3\">\n         <artifact name=\"sisu-inject-0.9.0.M3.pom\">\n            <sha256 value=\"2e436563d5caea351bce5f0863ebc6376405cb65a6f664b255faad9e72e3b854\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.glassfish.jaxb\" name=\"jaxb-bom\" version=\"2.3.2\">\n         <artifact name=\"jaxb-bom-2.3.2.pom\">\n            <sha256 value=\"a1018bb54678ed9f5acb2f7a4084e385ff510201f4e9dbf5f75dc6a675f66be7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.glassfish.jaxb\" name=\"jaxb-runtime\" version=\"2.3.2\">\n         <artifact name=\"jaxb-runtime-2.3.2.jar\">\n            <sha256 value=\"e6e0a1e89fb6ff786279e6a0082d5cef52dc2ebe67053d041800737652b4fd1b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"jaxb-runtime-2.3.2.pom\">\n            <sha256 value=\"9448a5ad7fa68a6083dfbe4f42c8c83e082b9202a105401fc68e944c26548b34\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.glassfish.jaxb\" name=\"txw2\" version=\"2.3.2\">\n         <artifact name=\"txw2-2.3.2.jar\">\n            <sha256 value=\"4a6a9f483388d461b81aa9a28c685b8b74c0597993bf1884b04eddbca95f48fe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"txw2-2.3.2.pom\">\n            <sha256 value=\"a79dd002fb038183ff286a2635be2e68c103b87e0e64717d8d44bfd017fd33ea\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.gradle.toolchains\" name=\"foojay-resolver\" version=\"0.8.0\">\n         <artifact name=\"foojay-resolver-0.8.0.jar\">\n            <sha256 value=\"f90e69351638e90b9ec9848e759d218635907c092541191150037b0b22e5140c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"foojay-resolver-0.8.0.module\">\n            <sha256 value=\"8c3ccf54da072c64a40e06882aaa652336cb29eec2ea230f06d6843abb384d51\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.gradle.toolchains\" name=\"foojay-resolver\" version=\"0.9.0\">\n         <artifact name=\"foojay-resolver-0.9.0.jar\">\n            <sha256 value=\"c284089a3f87557f76022d99f2df2836568aa48b3fe4e2922392d566ba814176\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"foojay-resolver-0.9.0.module\">\n            <sha256 value=\"86e5e5d503162586c0956fd02a2a69b76da7c0720f4ae023f366d191aa97b4b8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.gradle.toolchains.foojay-resolver-convention\" name=\"org.gradle.toolchains.foojay-resolver-convention.gradle.plugin\" version=\"0.8.0\">\n         <artifact name=\"org.gradle.toolchains.foojay-resolver-convention.gradle.plugin-0.8.0.pom\">\n            <sha256 value=\"3b672237bd9cc1e8e8ca86ef5a7920a678f69d04d2f4bfbd0c5a2e79d45c5cb5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.gradle.toolchains.foojay-resolver-convention\" name=\"org.gradle.toolchains.foojay-resolver-convention.gradle.plugin\" version=\"0.9.0\">\n         <artifact name=\"org.gradle.toolchains.foojay-resolver-convention.gradle.plugin-0.9.0.pom\">\n            <sha256 value=\"db7cf11bee6884efb28904139f62c00f8b45853e60c0f41715cf69576b6bfdf0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.hamcrest\" name=\"hamcrest-core\" version=\"1.3\">\n         <artifact name=\"hamcrest-core-1.3-sources.jar\">\n            <sha256 value=\"e223d2d8fbafd66057a8848cc94222d63c3cedd652cc48eddc0ab5c39c0f84df\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hamcrest-core-1.3.jar\">\n            <sha256 value=\"66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hamcrest-core-1.3.pom\">\n            <sha256 value=\"fde386a7905173a1b103de6ab820727584b50d0e32282e2797787c20a64ffa93\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.hamcrest\" name=\"hamcrest-integration\" version=\"1.3\">\n         <artifact name=\"hamcrest-integration-1.3-sources.jar\">\n            <sha256 value=\"0827a37533a135bfab9c27e0f4b6d6fb1394856e842ef20a1693d3bfeb061365\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hamcrest-integration-1.3.jar\">\n            <sha256 value=\"70f418efbb506c5155da5f9a5a33262ea08a9e4d7fea186aa9015c41a7224ac2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hamcrest-integration-1.3.pom\">\n            <sha256 value=\"42f0be9bf98c12dacdcb99dd141d83d4dc5bb7c37a6f26684cd3ff2287667fba\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.hamcrest\" name=\"hamcrest-library\" version=\"1.3\">\n         <artifact name=\"hamcrest-library-1.3-sources.jar\">\n            <sha256 value=\"1c0ff84455f539eb3c29a8c430de1f6f6f1ba4b9ab39ca19b195f33203cd539c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hamcrest-library-1.3.jar\">\n            <sha256 value=\"711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"hamcrest-library-1.3.pom\">\n            <sha256 value=\"1ceb4bfb0f098ae29b935044b2363e11323313fe3ed2055df8b79737d5056277\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.hamcrest\" name=\"hamcrest-parent\" version=\"1.3\">\n         <artifact name=\"hamcrest-parent-1.3.pom\">\n            <sha256 value=\"6d535f94efb663bdb682c9f27a50335394688009642ba7a9677504bc1be4129b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jdom\" name=\"jdom2\" version=\"2.0.6\">\n         <artifact name=\"jdom2-2.0.6.jar\">\n            <sha256 value=\"1345f11ba606d15603d6740551a8c21947c0215640770ec67271fe78bea97cf5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"jdom2-2.0.6.pom\">\n            <sha256 value=\"47b23a79fe336b741b82434c6e049d68165256e405e75c10921fd72fa8a65d8d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains\" name=\"annotations\" version=\"13.0\">\n         <artifact name=\"annotations-13.0.jar\">\n            <sha256 value=\"ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-13.0.pom\">\n            <sha256 value=\"965aeb2bedff369819bdde1bf7a0b3b89b8247dd69c88b86375d76163bb8c397\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains\" name=\"annotations\" version=\"23.0.0\">\n         <artifact name=\"annotations-23.0.0.jar\">\n            <sha256 value=\"7b0f19724082cbfcbc66e5abea2b9bc92cf08a1ea11e191933ed43801eb3cd05\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-23.0.0.pom\">\n            <sha256 value=\"c9490f655132328df2cfbcfdf743f53fc3916d6c1d10437175a6ca6e3a67771c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.compose.runtime\" name=\"runtime\" version=\"1.6.10\">\n         <artifact name=\"runtime-1.6.10.module\">\n            <sha256 value=\"e0c536361b4cbe06f5d740e15db166d34c005709e9a51c867c2cfdb7c98afbec\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.intellij.deps\" name=\"trove4j\" version=\"1.0.20200330\">\n         <artifact name=\"trove4j-1.0.20200330.jar\">\n            <sha256 value=\"c5fd725bffab51846bf3c77db1383c60aaaebfe1b7fe2f00d23fe1b7df0a439d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"trove4j-1.0.20200330.pom\">\n            <sha256 value=\"87721cbaa65a3c97d8b1ba9d207840f164c9fe38759fc9ea10ffe26565f8d3e9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"fus-statistics-gradle-plugin\" version=\"2.1.20\">\n         <artifact name=\"fus-statistics-gradle-plugin-2.1.20-gradle85.jar\">\n            <sha256 value=\"6674f29755d326addc756a2fdcabf2bb602f00004a0ed2db669da3df4e848006\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fus-statistics-gradle-plugin-2.1.20.module\">\n            <sha256 value=\"e8d564a23bc2037b3efb1c5b00ffb74ae44f99724577e2fc8d87ffbbc9cb9fb5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"fus-statistics-gradle-plugin\" version=\"2.1.21\">\n         <artifact name=\"fus-statistics-gradle-plugin-2.1.21-gradle85.jar\">\n            <sha256 value=\"fc0905810309a5ad3ea15dfbbe129a47e90db11215232364841b72044124e7b0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"fus-statistics-gradle-plugin-2.1.21.module\">\n            <sha256 value=\"76a323dafb588e0faee8e3148b910fb6ec3eb422fc10640106be5b7f06a9c7f3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-android-extensions-runtime\" version=\"2.0.0\">\n         <artifact name=\"kotlin-android-extensions-runtime-2.0.0-sources.jar\">\n            <sha256 value=\"418ea1adaaaf4537d180cc25e0b1c0d02a54fa3a38f88bd7625eb2307aa447dd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-android-extensions-runtime-2.0.0.jar\">\n            <sha256 value=\"787c67e147f66f9c274267af700750dcc3654721e40d174232b7e6f4c47bbe9c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-android-extensions-runtime-2.0.0.pom\">\n            <sha256 value=\"aaedf6b9f9057ed474e0c2768936798f29275251be88cf06e8e081f6603093b4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-android-extensions-runtime\" version=\"2.0.10\">\n         <artifact name=\"kotlin-android-extensions-runtime-2.0.10.jar\">\n            <sha256 value=\"2ea1ce278749483ae5604bc9aa755f1b610ecd752dd4c09a3e134cfc25a827f6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-android-extensions-runtime-2.0.10.pom\">\n            <sha256 value=\"f5a28892a0c557451fdb7e13190ecd270cee6246356cea39fca333d313ca48f8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-android-extensions-runtime\" version=\"2.0.20\">\n         <artifact name=\"kotlin-android-extensions-runtime-2.0.20.jar\">\n            <sha256 value=\"a72e14b4aee164e1e81d56169554a1514ec5c623574ae0ed589235e59fe9b68b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-android-extensions-runtime-2.0.20.pom\">\n            <sha256 value=\"b4795ede32ba6f1cd2243966d4ec00bd35b927ab21383a73f3032bae783733e2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-android-extensions-runtime\" version=\"2.0.21\">\n         <artifact name=\"kotlin-android-extensions-runtime-2.0.21.jar\">\n            <sha256 value=\"72188868a39c8254125252a3c02e2af5bc781d078e498376e07e9d24f28f8afa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-android-extensions-runtime-2.0.21.pom\">\n            <sha256 value=\"62b4023ef2167f8aeadc577c9b0964a5abe47ac9a8656242886a05be3f298514\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-android-extensions-runtime\" version=\"2.1.0\">\n         <artifact name=\"kotlin-android-extensions-runtime-2.1.0.jar\">\n            <sha256 value=\"2f7dedc794e036c18916bf84b3e0774bfb921422590793961ff011e0b0fe2ba7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-android-extensions-runtime-2.1.0.pom\">\n            <sha256 value=\"8a5bb0ff0296b8e112246efabcfdadbd2739fb93966968c9f047b6bb151e7100\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-android-extensions-runtime\" version=\"2.1.10\">\n         <artifact name=\"kotlin-android-extensions-runtime-2.1.10.jar\">\n            <sha256 value=\"14870ca72ecaaec180b19260d0668cdb86fe88dc799f565e5d64ca1423b5a54b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-android-extensions-runtime-2.1.10.pom\">\n            <sha256 value=\"e718289ad63441bde3c61ab25b907d9b3152b9a181120832305f309e4d0e8274\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-android-extensions-runtime\" version=\"2.1.20\">\n         <artifact name=\"kotlin-android-extensions-runtime-2.1.20.jar\">\n            <sha256 value=\"c9ffc2b6bfcdd8ce7ad1de77128bf0368f2cb06fdf20bd1415aa4439f10e22f5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-android-extensions-runtime-2.1.20.pom\">\n            <sha256 value=\"093c4983509f41ac9d0826e1a416ebb00a34d7731614ade781cebdd535804123\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-android-extensions-runtime\" version=\"2.1.21\">\n         <artifact name=\"kotlin-android-extensions-runtime-2.1.21.jar\">\n            <sha256 value=\"5c143d20cdc29967e2916e06948604e598ba9f11677fad4facae692be2e2a38a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-android-extensions-runtime-2.1.21.pom\">\n            <sha256 value=\"d5f3c2aabc0ffeffab91bfb6298a2ebb3f1d3b9828585b706c065b66309f54d2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-bom\" version=\"1.8.0\">\n         <artifact name=\"kotlin-bom-1.8.0.pom\">\n            <sha256 value=\"681f9878548c0a149c678092fd8b1f4cc7c5c41ba1b24397101c1073a6c76dda\" origin=\"Generated by Conny Duck\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-bom\" version=\"1.8.21\">\n         <artifact name=\"kotlin-bom-1.8.21.pom\">\n            <sha256 value=\"43f52cd839d8fd872f240491d38fa7df170a87a36e105e700dd939d15572a8ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-bom\" version=\"1.8.22\">\n         <artifact name=\"kotlin-bom-1.8.22.pom\">\n            <sha256 value=\"c8d794eb761888d34369e677de8eaba0b01f9e8a756cfbff53215ccfa5c58c3f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-bom\" version=\"1.9.20\">\n         <artifact name=\"kotlin-bom-1.9.20.pom\">\n            <sha256 value=\"ec72aeeff33f86dbdfa59505c8349ba82d928ce282af5a1de3d890ebe007345d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-bom\" version=\"1.9.24\">\n         <artifact name=\"kotlin-bom-1.9.24.pom\">\n            <sha256 value=\"0b45f87ae7a9487fd8390f77f2996d5a258192008fb6cea27b7cea78cf74eaff\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-bom\" version=\"2.0.21\">\n         <artifact name=\"kotlin-bom-2.0.21.pom\">\n            <sha256 value=\"d547e0de25422d963e22c7a944f3b5de943c6a498295b52dbffe3d2895cd9be8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-common\" version=\"2.0.0\">\n         <artifact name=\"kotlin-build-common-2.0.0.jar\">\n            <sha256 value=\"26868d37837621259993cd8b4587bfffae86b17e4f211d5baa0bf605248a2412\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-common-2.0.0.pom\">\n            <sha256 value=\"370f9ceb7c9621495447874109c586f58308b945b9d921d87af5bbb48df54d35\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-common\" version=\"2.0.10\">\n         <artifact name=\"kotlin-build-common-2.0.10.jar\">\n            <sha256 value=\"9a86ab79cf77e1475bf38d48f66acb78f9b193647fc6fde764e236565ee0286b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-common-2.0.10.pom\">\n            <sha256 value=\"474c27fd00d586118b08caa728d6f936d1157cef734517699be92f8c839f8643\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-common\" version=\"2.0.20\">\n         <artifact name=\"kotlin-build-common-2.0.20.jar\">\n            <sha256 value=\"36f0d75ce9af89064d9db4fd21e22c55077200fe4e3ae7d99e344498267aa0db\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-common-2.0.20.pom\">\n            <sha256 value=\"10e858c5a080c4ddb55b1d06bee8d5e846b86105f56b0e40f288e3fa61961172\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-common\" version=\"2.0.21\">\n         <artifact name=\"kotlin-build-common-2.0.21.jar\">\n            <sha256 value=\"70b98749c30973d3b762108bdfb991392078b3087308acd3c1ad33aa0f46215d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-common-2.0.21.pom\">\n            <sha256 value=\"a8d3fb86e9367206240a1dbee8b3010ad7913fea18fbd46dbf6101f98be3e15d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-common\" version=\"2.1.0\">\n         <artifact name=\"kotlin-build-common-2.1.0.jar\">\n            <sha256 value=\"3a5d34e8b1ed8b80ee22d54488c2a425cf7b685481916d726ffb9994088d2cb9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-common-2.1.0.pom\">\n            <sha256 value=\"0e35c2444d46014dfade076016b787c9d533f9858109df1e4ce67ced4d1a96c3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-common\" version=\"2.1.10\">\n         <artifact name=\"kotlin-build-common-2.1.10.jar\">\n            <sha256 value=\"9976a94bf5fa8174eb398fb7634bb9f4652e0557c98737cb262eea50a3e0e25f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-common-2.1.10.pom\">\n            <sha256 value=\"ce8e5bbc66feb17280b315b3a355a381e07ce2ac5ed7f3d56017b27bd4640303\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-statistics\" version=\"2.0.0\">\n         <artifact name=\"kotlin-build-statistics-2.0.0.jar\">\n            <sha256 value=\"f089b5f057f7c78630107bf4661f75b68cf1ce7492f415bdf2b50bc2b47ef815\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-statistics-2.0.0.pom\">\n            <sha256 value=\"9ac80f8df65172a45f80f5b421001377098133b7cb5d73387cffbf2b2239be69\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-statistics\" version=\"2.0.10\">\n         <artifact name=\"kotlin-build-statistics-2.0.10.jar\">\n            <sha256 value=\"a5eab4b96830609c6fad2948b77ebc4e93da8fce0945235b72208efc105822bd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-statistics-2.0.10.pom\">\n            <sha256 value=\"ea15e1a05da056d1e9408a41c01fa686677dbd6842f5c0124e8f7a0186628326\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-statistics\" version=\"2.0.20\">\n         <artifact name=\"kotlin-build-statistics-2.0.20.jar\">\n            <sha256 value=\"73a7d71513755b317d2b1b6da766d6e6b7a25dc99dcefe4313325336422ece11\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-statistics-2.0.20.pom\">\n            <sha256 value=\"d7418ad25c806de836150bdd350b00be6c2d25099e5d741ddfe3f381c52ead8d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-statistics\" version=\"2.0.21\">\n         <artifact name=\"kotlin-build-statistics-2.0.21.jar\">\n            <sha256 value=\"80120b74df03633d6f79e08864131eee3b7a7486f6c05d2f2edc8683753c54da\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-statistics-2.0.21.pom\">\n            <sha256 value=\"fe24dc606fec83ec98dd08bc8bb1cf99e5405de8e917c5119d5a0cb7efac559d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-statistics\" version=\"2.1.0\">\n         <artifact name=\"kotlin-build-statistics-2.1.0.jar\">\n            <sha256 value=\"32bc03764535ddbc2db1f98836579af6b631c8bea62071864ab02145f2769fbb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-statistics-2.1.0.pom\">\n            <sha256 value=\"2c8c6ac4cf534eacaba9ff5ed3fa45d8029d3a31b211e9e002dfce79fc7a21ca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-statistics\" version=\"2.1.10\">\n         <artifact name=\"kotlin-build-statistics-2.1.10.jar\">\n            <sha256 value=\"f1731e3df70c487d10074b460064292d8f7dc70423d4856418dd926fa0da5d83\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-statistics-2.1.10.pom\">\n            <sha256 value=\"a94f70b218dc6b228061a2d3abe11136931e8c8f689d6b0287c4fce577dbf423\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-statistics\" version=\"2.1.20\">\n         <artifact name=\"kotlin-build-statistics-2.1.20.jar\">\n            <sha256 value=\"4d28f183a76c30a8cac20e7a3fa87054c2dd1db8864b3c9cd389e18dd997d31e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-statistics-2.1.20.pom\">\n            <sha256 value=\"391f6d734b834c91b7a801e223adfc736b580dbdce0f139a7e4bd47649c04ca3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-statistics\" version=\"2.1.21\">\n         <artifact name=\"kotlin-build-statistics-2.1.21.jar\">\n            <sha256 value=\"3a762c1e558559447daf4217fde2b982b2508756eb102a6571194f12dd41acfa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-statistics-2.1.21.pom\">\n            <sha256 value=\"1d20eb1cac069b988577171c34e04005fa5c6e6935991d6f7ba9862a5eae1a78\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-tools-api\" version=\"2.0.0\">\n         <artifact name=\"kotlin-build-tools-api-2.0.0.jar\">\n            <sha256 value=\"8be57288054decd4bca5a2dcb89e4e8e896c2520e45a2488765d813ffd229f11\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-tools-api-2.0.0.pom\">\n            <sha256 value=\"cc39e9e0c9bbeec5a0ccfe0a78734c541c00fca3027c6de8ebc13bade0f5400b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-tools-api\" version=\"2.0.10\">\n         <artifact name=\"kotlin-build-tools-api-2.0.10.jar\">\n            <sha256 value=\"740b22354e6239118c0f9445403b66fd424f9440e439f85feb1aefe4e85b05f2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-tools-api-2.0.10.pom\">\n            <sha256 value=\"e5d5e14359c87fa0cc6a43820e503c14a63da9693dc851d5399d1725a59e74ad\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-tools-api\" version=\"2.0.20\">\n         <artifact name=\"kotlin-build-tools-api-2.0.20.jar\">\n            <sha256 value=\"57ed50220e78ec39e8a80014330f295e5485b5638c1129af9ed7d53d7858c5c2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-tools-api-2.0.20.pom\">\n            <sha256 value=\"9c7ad5868fb2189b1bf4d6c22f6c94983b3a8e1a294e95a5412cb82e0f42ddb2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-tools-api\" version=\"2.0.21\">\n         <artifact name=\"kotlin-build-tools-api-2.0.21.jar\">\n            <sha256 value=\"8fca2b4af6c4cf24565d9a7f64c3178489518d049e106981db6718ef22cae18e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-tools-api-2.0.21.pom\">\n            <sha256 value=\"ccbd97693036634816295198e4944534fafb73d778f8cd4d439f3c87b090f494\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-tools-api\" version=\"2.1.0\">\n         <artifact name=\"kotlin-build-tools-api-2.1.0.jar\">\n            <sha256 value=\"f145b814f9c01328c2c369a6b8fc77434cac02a7d68f0e05d0dd4cada78bbac7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-tools-api-2.1.0.pom\">\n            <sha256 value=\"e3cfc8da8ddf3bbd3f0ca07183a51feb4893e8bcb8fee801f4b8ce05ef9443a9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-tools-api\" version=\"2.1.10\">\n         <artifact name=\"kotlin-build-tools-api-2.1.10.jar\">\n            <sha256 value=\"25716795002c7b02dbcce510c9916fae7e94685c4878f4f7bf3c4d03ec91aabe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-tools-api-2.1.10.pom\">\n            <sha256 value=\"9c660c04346f05605fc68cf180379d6b7c834e73b79a8399a0dcb746d85a874d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-tools-api\" version=\"2.1.20\">\n         <artifact name=\"kotlin-build-tools-api-2.1.20.jar\">\n            <sha256 value=\"533c36cb362e6ed2d15f58732e7f4c6d2bed5c9d5179b897bc4b09d16d605377\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-tools-api-2.1.20.pom\">\n            <sha256 value=\"927f61f797261c59e4b5310314d69fd4a3ab8ef4f7039f7a5326075c42a4173a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-tools-api\" version=\"2.1.21\">\n         <artifact name=\"kotlin-build-tools-api-2.1.21.jar\">\n            <sha256 value=\"06bb6b3671d4bc3ba74c0e0efabbdcd555ccc2d4cc2ef67cd309c5738c8d1e54\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-tools-api-2.1.21.pom\">\n            <sha256 value=\"5396a0d2606c30e03ae994a797c6f91684c6e3b2d9e9a45fd692e5e93eec0c93\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-tools-impl\" version=\"2.0.0\">\n         <artifact name=\"kotlin-build-tools-impl-2.0.0.jar\">\n            <sha256 value=\"551cce7299ed378a4fed97e6c26179af10f18b7b263f9599ae0086faa160446b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-tools-impl-2.0.0.pom\">\n            <sha256 value=\"21778645ed218ca2937782991610716826efdbd490dc8129e3534705fb6a1002\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-tools-impl\" version=\"2.0.10\">\n         <artifact name=\"kotlin-build-tools-impl-2.0.10.jar\">\n            <sha256 value=\"6601875072743ad7ecd9d7768421f785b2170a0c973d42f710efef0adab3388e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-tools-impl-2.0.10.pom\">\n            <sha256 value=\"1d954a02244f63a9fbd27388b8c99a51e900b68023b74224a2e232eb1f3226a8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-tools-impl\" version=\"2.0.20\">\n         <artifact name=\"kotlin-build-tools-impl-2.0.20.jar\">\n            <sha256 value=\"9ce6f81a699cc37db363a2837150bc62a24903daf6121034d12979aa9501446b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-tools-impl-2.0.20.pom\">\n            <sha256 value=\"0f28aa3b1de8d805a6f87957d3c3d66c339e0c432669995cf597f9f2be89e082\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-tools-impl\" version=\"2.0.21\">\n         <artifact name=\"kotlin-build-tools-impl-2.0.21.jar\">\n            <sha256 value=\"ba6ea24daed44717f503072a91c59b0da7e9caf0002bd0ec1be773294c127dcb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-tools-impl-2.0.21.pom\">\n            <sha256 value=\"7a93c8db6b6aa85b4fcaf0f48ca7016b9a84cd2396a0652b7ae9ade7679a4e41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-tools-impl\" version=\"2.1.0\">\n         <artifact name=\"kotlin-build-tools-impl-2.1.0.jar\">\n            <sha256 value=\"958827bc3711fc3c3491fc77f367a999ad558352b1a2b32d18f5916cce15ed39\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-tools-impl-2.1.0.pom\">\n            <sha256 value=\"58ee953420c53e1ea3ab896aaef9964960b444ca8e0a07f76e951e05c62102f9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-tools-impl\" version=\"2.1.10\">\n         <artifact name=\"kotlin-build-tools-impl-2.1.10.jar\">\n            <sha256 value=\"656675c7f07d9cbdbc94f098f34953571ee3ecfc7bc3e257a807f38079fa4869\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-tools-impl-2.1.10.pom\">\n            <sha256 value=\"6c1ccf0407b72fc7117a6fa21a9ccf4335faa9f77f7fa60c9a970ea2059a3920\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-tools-impl\" version=\"2.1.20\">\n         <artifact name=\"kotlin-build-tools-impl-2.1.20.jar\">\n            <sha256 value=\"6e94896e321603e3bfe89fef02478e44d1d64a3d25d49d0694892ffc01c60acf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-tools-impl-2.1.20.pom\">\n            <sha256 value=\"10fb1e35e0e8706747e8e83eae8f8b43406ba664e4201ec9dfcb9af7da6b42ba\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-build-tools-impl\" version=\"2.1.21\">\n         <artifact name=\"kotlin-build-tools-impl-2.1.21.jar\">\n            <sha256 value=\"e6c7f18a3228f56ca91400a54ddad21e1d789a9f9a07263b560c8c95347c63cd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-build-tools-impl-2.1.21.pom\">\n            <sha256 value=\"5ad91cfe6082487e6df217558d4727083078bc7563cb4cd9044b7a7b4d2c058e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-compiler-embeddable\" version=\"1.9.10\">\n         <artifact name=\"kotlin-compiler-embeddable-1.9.10.jar\">\n            <sha256 value=\"b6d3965fdb3fc2a5f8d965681c215c37552b28ae5ad19fcadbc1568c9b65dab4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-embeddable-1.9.10.pom\">\n            <sha256 value=\"c5456b1c82a3ef2153b9939f71d190215f6e53a8192d26e8d76eec23325556bd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-compiler-embeddable\" version=\"2.0.0\">\n         <artifact name=\"kotlin-compiler-embeddable-2.0.0.jar\">\n            <sha256 value=\"eb8ae09df38e212eec3965cafa97ab08112773fe2e870ebeb6131b8f69bfb92e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-embeddable-2.0.0.pom\">\n            <sha256 value=\"13c04c2c983a8faab531b64d0662db247fd35a1d88489330a1c29dc4a91e569e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-compiler-embeddable\" version=\"2.0.10\">\n         <artifact name=\"kotlin-compiler-embeddable-2.0.10.jar\">\n            <sha256 value=\"ea76850ffe3b84c92654a73f8e366964857f7e95687ca158882241cebef591e8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-embeddable-2.0.10.pom\">\n            <sha256 value=\"c453b7cc1f761671108743c5685b5e1cd51aebbfca955c40c06071ea6042135b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-compiler-embeddable\" version=\"2.0.20\">\n         <artifact name=\"kotlin-compiler-embeddable-2.0.20.jar\">\n            <sha256 value=\"a3604bf350c8bcce27102158bbb383fa4d1814bc486aaed59f278eada51ff6ad\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-embeddable-2.0.20.pom\">\n            <sha256 value=\"597043fb8c6527f42999ca04ed352963922cd16e6988aaa52d3db32da1db859d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-compiler-embeddable\" version=\"2.0.21\">\n         <artifact name=\"kotlin-compiler-embeddable-2.0.21.jar\">\n            <sha256 value=\"9fa8cdd1de0dccffe154c997d423ec6b5f53cd6d9177e3a77a9b0de03fb1bc81\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-embeddable-2.0.21.pom\">\n            <sha256 value=\"bd4656a46ec418252e5bc5e1c20eb2029fb2a8e0e3cc94eeddfac7e87c8cd5b6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-compiler-embeddable\" version=\"2.1.0\">\n         <artifact name=\"kotlin-compiler-embeddable-2.1.0.jar\">\n            <sha256 value=\"c1b139a6f251c3b99e92befa326cb75d93a001d74c3ac601155a8cdb0d253783\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-embeddable-2.1.0.pom\">\n            <sha256 value=\"0044fa45046fba7ca808d98f9895f25b16510edb53c1e282107db006d126d67f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-compiler-embeddable\" version=\"2.1.10\">\n         <artifact name=\"kotlin-compiler-embeddable-2.1.10.jar\">\n            <sha256 value=\"396f28856f0fd704320819398d5959a781bdf225b2dc2ac02cd5248442ebd5b8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-embeddable-2.1.10.pom\">\n            <sha256 value=\"6de73e203918a8dc95ff9aa6e65f50227d9e0853ee875cb4a3723c603cf6f392\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-compiler-embeddable\" version=\"2.1.20\">\n         <artifact name=\"kotlin-compiler-embeddable-2.1.20.jar\">\n            <sha256 value=\"c54a00718c8c0e3ee858bf42771c7f401c5e3c1738861e18e9536371042fa1b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-embeddable-2.1.20.pom\">\n            <sha256 value=\"227404eac6d809bc0d94def89336dfdf7d9a7d538792a234d52bdbafc2ae85af\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-compiler-embeddable\" version=\"2.1.21\">\n         <artifact name=\"kotlin-compiler-embeddable-2.1.21.jar\">\n            <sha256 value=\"67a2e3673765f097725608cc7c843b0d8fdd94bd9af41327211361614aa57d49\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-embeddable-2.1.21.pom\">\n            <sha256 value=\"dbbf8ac2550d5b1ae2a627f204f28b16f9271e36c44d8994aa3b139cbf70e45a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-compiler-runner\" version=\"2.0.0\">\n         <artifact name=\"kotlin-compiler-runner-2.0.0.jar\">\n            <sha256 value=\"18f22b00697b84ef45a41d2b0a572261f299eaa7dcdda819d8773948e4472474\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-runner-2.0.0.pom\">\n            <sha256 value=\"42e6632358fa62be99bb8e4a278707e6b810dfc71ad3e5eea17e54ae39c83aac\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-compiler-runner\" version=\"2.0.10\">\n         <artifact name=\"kotlin-compiler-runner-2.0.10.jar\">\n            <sha256 value=\"ff5c0b6f1a1640ffb2adcb587a7363c3a57d779164ef730c9db1c25856a8ad02\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-runner-2.0.10.pom\">\n            <sha256 value=\"2d66c1a340bada93e13898bfbaf2494b138ca8a10e680100dba392b298db1cbc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-compiler-runner\" version=\"2.0.20\">\n         <artifact name=\"kotlin-compiler-runner-2.0.20.jar\">\n            <sha256 value=\"e03cf04b0340f1ae151210630b5d2915c297988c6e22e4dedb4ea7cfb74acf67\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-runner-2.0.20.pom\">\n            <sha256 value=\"dccdf1ba0c4fcd8bd4230345ae83fa7dbe9282563d8a53fd5e61c5335b5b7180\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-compiler-runner\" version=\"2.0.21\">\n         <artifact name=\"kotlin-compiler-runner-2.0.21.jar\">\n            <sha256 value=\"08e605be81060ff612d0aeb94058a19bc4ac99625c35c461c6c0b302560e9104\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-runner-2.0.21.pom\">\n            <sha256 value=\"f9676ad4954114b81cdfd091e9b5b427bc6491cfa94484668d653d4d19023e6d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-compiler-runner\" version=\"2.1.0\">\n         <artifact name=\"kotlin-compiler-runner-2.1.0.jar\">\n            <sha256 value=\"915872c85112df5bc08ec25a1af5d86a2d3f82b1d845310eee62be5508c13497\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-runner-2.1.0.pom\">\n            <sha256 value=\"13ad1bfcea4778db8336d30bd8edf02239354475f2c4d3289ddffb5a183205d5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-compiler-runner\" version=\"2.1.10\">\n         <artifact name=\"kotlin-compiler-runner-2.1.10.jar\">\n            <sha256 value=\"c42d0e0e9ce44f5cf344ff252687ad2af3edde58469500102394d137513c82af\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-runner-2.1.10.pom\">\n            <sha256 value=\"238f6c87380fd77436f0605fe72254edc50552dcb93282db2856a14194f8b380\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-compiler-runner\" version=\"2.1.20\">\n         <artifact name=\"kotlin-compiler-runner-2.1.20.jar\">\n            <sha256 value=\"de3b5423d8fbf86ea2bd1334d401bc4aa84e28ec48945952d11c00b10b1402b6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-runner-2.1.20.pom\">\n            <sha256 value=\"c6035d2372804534802c37ce554e8c8cbaaae84514a7bad6cc096424d8f24945\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-compiler-runner\" version=\"2.1.21\">\n         <artifact name=\"kotlin-compiler-runner-2.1.21.jar\">\n            <sha256 value=\"70a8972bb7be1b2bb098c9a5da70bec1dd44cb104d4da1aa6e33dc551028d49a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-compiler-runner-2.1.21.pom\">\n            <sha256 value=\"fc19844ed29177ec7ab6c3798d1d039da46ba2771bf8712e29c2f24459dc5b8e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-daemon-client\" version=\"2.0.0\">\n         <artifact name=\"kotlin-daemon-client-2.0.0.jar\">\n            <sha256 value=\"dfa5ae84fc665b0478475fd9a63f2f984a9155ce1bfb4dc2abea278c6a0f2d94\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-daemon-client-2.0.0.pom\">\n            <sha256 value=\"dbbc417fbbe94efab6a05a081d0f6336dacffa9d0426375e2a1781c57c5c2991\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-daemon-client\" version=\"2.0.10\">\n         <artifact name=\"kotlin-daemon-client-2.0.10.jar\">\n            <sha256 value=\"f3e692bbf6fd20df2628d423c34a1af7059abbafcea3f008da2f2296f5f1a509\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-daemon-client-2.0.10.pom\">\n            <sha256 value=\"4a284530fb7563d59932abd3e2e17e73c7ea05788dd8d0d5ad2505a84e99996f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-daemon-client\" version=\"2.0.20\">\n         <artifact name=\"kotlin-daemon-client-2.0.20.jar\">\n            <sha256 value=\"73152cc1fd821d07139473abcbf8c7d01d00e68684b961e192eae880dc9c7da4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-daemon-client-2.0.20.pom\">\n            <sha256 value=\"a947117888f4cffb6393d42eaea611b63df589bf29617826ccb7253712bf3ac3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-daemon-client\" version=\"2.0.21\">\n         <artifact name=\"kotlin-daemon-client-2.0.21.jar\">\n            <sha256 value=\"371ea08e4f036882cc8e064ffcf6445990df444295ba1ec68928e7cc2b5bc015\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-daemon-client-2.0.21.pom\">\n            <sha256 value=\"f28638246b505520bfe935f15f3ecf39e4ba5526fa45c8f32ac7de7a31237400\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-daemon-client\" version=\"2.1.0\">\n         <artifact name=\"kotlin-daemon-client-2.1.0.jar\">\n            <sha256 value=\"1751dabfcd76b58f878b90df6a602241ec4e4cd6fed60e2d5c2201c5068451e3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-daemon-client-2.1.0.pom\">\n            <sha256 value=\"43aebe513576d51f48129cd85c860d0813de6a1cc7591aca7c28e5432cf8df1b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-daemon-client\" version=\"2.1.10\">\n         <artifact name=\"kotlin-daemon-client-2.1.10.jar\">\n            <sha256 value=\"cf18a76182035ae2d48e82599650524e1e151e7343e8ab0fd06d0607c4145cd1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-daemon-client-2.1.10.pom\">\n            <sha256 value=\"4b7b19529887c25d2a0ad76f0163b6935aabcf34564320833a282842a64910a0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-daemon-client\" version=\"2.1.20\">\n         <artifact name=\"kotlin-daemon-client-2.1.20.jar\">\n            <sha256 value=\"3630a30182c63570eb519ae65aaa9419217dbad0814fede42c8dde704465a4c6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-daemon-client-2.1.20.pom\">\n            <sha256 value=\"faaa60be4270e9149b59439266396192beb47ff5e3a40985deedc54e591722d2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-daemon-client\" version=\"2.1.21\">\n         <artifact name=\"kotlin-daemon-client-2.1.21.jar\">\n            <sha256 value=\"3070dd0359efe4a1348c0ce9b95b0324799765598bb7b6876f1549ab5347e94f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-daemon-client-2.1.21.pom\">\n            <sha256 value=\"4d5793f579b79940e8782c58bd681b9f164bdb2bef01b72ad9be69a91eaeabee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-daemon-embeddable\" version=\"1.9.10\">\n         <artifact name=\"kotlin-daemon-embeddable-1.9.10.jar\">\n            <sha256 value=\"79bd4bf388da4430b0a9be86d2f72a111110941965edd478e99f3ae083156116\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-daemon-embeddable-1.9.10.pom\">\n            <sha256 value=\"c733493de5f7bf1e082cec0edf474b34d90b074740c3b3d0d383cf81b7522f29\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-daemon-embeddable\" version=\"2.0.0\">\n         <artifact name=\"kotlin-daemon-embeddable-2.0.0.jar\">\n            <sha256 value=\"b907a36e9cfa587ca0523793d89eb2ea9bb545456935f180e12422486c14049f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-daemon-embeddable-2.0.0.pom\">\n            <sha256 value=\"ce23393a051fa5e94275854e12cee7ac1c1e9f641bd71ace81cba6fd54f9bc1a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-daemon-embeddable\" version=\"2.0.10\">\n         <artifact name=\"kotlin-daemon-embeddable-2.0.10.jar\">\n            <sha256 value=\"a500d6f7bb2152a8387a9e24b886d0654fdbdb6662ec264c544ce9346f186141\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-daemon-embeddable-2.0.10.pom\">\n            <sha256 value=\"0c50d6b3ead788ce77a765cf0c96bc970ac3b7d57a6d6636769fcdfedbb392b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-daemon-embeddable\" version=\"2.0.20\">\n         <artifact name=\"kotlin-daemon-embeddable-2.0.20.jar\">\n            <sha256 value=\"5bd5113b85ab8528e192e2bb3fc197f5bc3448bcdbd058790b37fd37f4ee57af\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-daemon-embeddable-2.0.20.pom\">\n            <sha256 value=\"219828266ea478eeeb42e4f52f96d0b907d8ca4847cf86aae39169ad8b2ea4a5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-daemon-embeddable\" version=\"2.0.21\">\n         <artifact name=\"kotlin-daemon-embeddable-2.0.21.jar\">\n            <sha256 value=\"b1a0a73c5022f8dd05a638c6b76b2bd7361818a1f3860ff2644133b1dd2bdb03\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-daemon-embeddable-2.0.21.pom\">\n            <sha256 value=\"8db67b40dd6025a2ed069294f2c9bcfb6b96db3159cfef76edd7841c266afbf0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-daemon-embeddable\" version=\"2.1.0\">\n         <artifact name=\"kotlin-daemon-embeddable-2.1.0.jar\">\n            <sha256 value=\"6aa581bd53c3500e380e4bb6b2407f6d233910012f425349c2ed5a8ddbe29eac\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-daemon-embeddable-2.1.0.pom\">\n            <sha256 value=\"c85b7aec38f0a3e53cd221265d08233d9ab1f0600902b7d3d74754def84abf18\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-daemon-embeddable\" version=\"2.1.10\">\n         <artifact name=\"kotlin-daemon-embeddable-2.1.10.jar\">\n            <sha256 value=\"7efa3fa5b706eb1bdbcdaa476164519b9f09c2dc1680019435348d39ce24be1d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-daemon-embeddable-2.1.10.pom\">\n            <sha256 value=\"300c380ca114d87999106efc4f99110c7ac42b19b6bad9a24858b02c6cc8bdb0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-daemon-embeddable\" version=\"2.1.20\">\n         <artifact name=\"kotlin-daemon-embeddable-2.1.20.jar\">\n            <sha256 value=\"d9e83df1d847a201ba3c016a786ced091be9503997d09f6a9cf1796ee489f374\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-daemon-embeddable-2.1.20.pom\">\n            <sha256 value=\"b1d38c0afd6e1d15c48c1c5d156ce60578f433136bec523f4eb199f7af3f8229\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-daemon-embeddable\" version=\"2.1.21\">\n         <artifact name=\"kotlin-daemon-embeddable-2.1.21.jar\">\n            <sha256 value=\"9401effd82de8606df3289308a275cc1d3573768665ca5edd09dc319c71715f4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-daemon-embeddable-2.1.21.pom\">\n            <sha256 value=\"19b2630eeb1a8ecac8cf70a51762410a201752f0311eb1b6f91c01d41df9d1dc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin\" version=\"2.0.0\">\n         <artifact name=\"kotlin-gradle-plugin-2.0.0-gradle85.jar\">\n            <sha256 value=\"fa9f364fb3ff1330ea2908e6ddfe66ee3d20abe975d61ae9f81e1e6bd276eaf7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-2.0.0.module\">\n            <sha256 value=\"e45806404e7e0c398a79bb5800205cb6ab2e4ad8d9b604170d33437c45351189\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin\" version=\"2.0.10\">\n         <artifact name=\"kotlin-gradle-plugin-2.0.10-gradle85.jar\">\n            <sha256 value=\"d648dbb4853861ba15030c41ac066b5093ede3a7484fea3b65d6509959b059f6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-2.0.10.module\">\n            <sha256 value=\"487db03e4751dc80fcf628414e05f0ef655ebe931fe944d3c3c1ac775987451b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin\" version=\"2.0.20\">\n         <artifact name=\"kotlin-gradle-plugin-2.0.20-gradle85.jar\">\n            <sha256 value=\"8129f62cb7c627b5ce82187e42a6d87c42952bc7ba64b805a3547f6852319662\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-2.0.20.module\">\n            <sha256 value=\"6813cca41ef0fbf15c88becc401e38706b96944c21b6bec73dd88cf90a0f201e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin\" version=\"2.0.21\">\n         <artifact name=\"kotlin-gradle-plugin-2.0.21-gradle85.jar\">\n            <sha256 value=\"9df5c7ff13b1fc68ac9450ca63c53111891d6f647bddec0f4398b3e7225bf6d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-2.0.21.module\">\n            <sha256 value=\"0f9897a06c07a3e87d647131cc3490a1f72d1ae54c107f13f72269d5344b087a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin\" version=\"2.1.0\">\n         <artifact name=\"kotlin-gradle-plugin-2.1.0-gradle85.jar\">\n            <sha256 value=\"caafc71157634bf7864f44026f5a63d256881c1cd9711456325266a53bafe728\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-2.1.0.module\">\n            <sha256 value=\"0a846b51225d2a0443f005316cbb1318591f5855ae6e955f7860c25bee9d2b17\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin\" version=\"2.1.10\">\n         <artifact name=\"kotlin-gradle-plugin-2.1.10-gradle85.jar\">\n            <sha256 value=\"8c26ae82c24dabd327d877d22ec356f2677dcdd6271712766b63f135e4ddcaa2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-2.1.10.module\">\n            <sha256 value=\"1369a6f9ec47075561dc2735c7bb1de8c9992d91542e76989093dbf85bf498a6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin\" version=\"2.1.20\">\n         <artifact name=\"kotlin-gradle-plugin-2.1.20-gradle85.jar\">\n            <sha256 value=\"fb016e643b58e0aa2aec89110eaf14e78b3768c157f254345795fd6aa10493eb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-2.1.20.module\">\n            <sha256 value=\"e947b544f4cd09c150afd8791bbd32a3137ddae3045a7d5394bea509aab96c57\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin\" version=\"2.1.21\">\n         <artifact name=\"kotlin-gradle-plugin-2.1.21-gradle85.jar\">\n            <sha256 value=\"eac04876c1ab66036f6016fd90833f204b0236c2764759cad069276e02cb43e6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-2.1.21.module\">\n            <sha256 value=\"7e120e4dfca08edd4890afe0b68bba5aa89f27fba11d8fe68f6b6da0b2129358\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-annotations\" version=\"2.0.0\">\n         <artifact name=\"kotlin-gradle-plugin-annotations-2.0.0.jar\">\n            <sha256 value=\"42b614cf70363be1195490e2567ad38cf26ccb32cf45db90509434e9621cb633\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-annotations-2.0.0.pom\">\n            <sha256 value=\"214751a3993b10e16c72ef63f961f56d37a1c751aaef234e269172e1c40e528f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-annotations\" version=\"2.0.10\">\n         <artifact name=\"kotlin-gradle-plugin-annotations-2.0.10.jar\">\n            <sha256 value=\"884f5f7700c8dddeccd3a0f2c157cfced134ffe05ae63352ce99c2ad0ad6b4dc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-annotations-2.0.10.pom\">\n            <sha256 value=\"5e2a83a633bbac23623af5152d8d14e2629df0a2c2a7db8e53b37ef251c4a741\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-annotations\" version=\"2.0.20\">\n         <artifact name=\"kotlin-gradle-plugin-annotations-2.0.20.jar\">\n            <sha256 value=\"8b63b4ffb7ba68e28720569ad47a96cc065c94564ed161eea15ac864887ba4de\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-annotations-2.0.20.pom\">\n            <sha256 value=\"0fc79a3c883c7db6ec0fa954d5c8a68ae811065226fb85916e1cbff699e5c147\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-annotations\" version=\"2.0.21\">\n         <artifact name=\"kotlin-gradle-plugin-annotations-2.0.21.jar\">\n            <sha256 value=\"5b4707a32e467efbe122c318ff6abdca17a2fc7d8c83f66037c9a120b6dcbc2f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-annotations-2.0.21.pom\">\n            <sha256 value=\"3fe08b95437b0b4ef8b16b77f61a889b39f5c46b7e971d4dfbade66d440ea1d8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-annotations\" version=\"2.1.0\">\n         <artifact name=\"kotlin-gradle-plugin-annotations-2.1.0.jar\">\n            <sha256 value=\"d53e97f0e13a37d8fa98fb44cd67e45d3bcf8b4278fdbe1acd1ddbccc740f74b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-annotations-2.1.0.pom\">\n            <sha256 value=\"6c1ca8596963f1cd12951aee50e34c47b3c0a58893d20f138240f5786c68e4bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-annotations\" version=\"2.1.10\">\n         <artifact name=\"kotlin-gradle-plugin-annotations-2.1.10.jar\">\n            <sha256 value=\"8613d5d53e31e52792dea15eacdd95e85e92484dc032d65a0b80fc3ab0a2683a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-annotations-2.1.10.pom\">\n            <sha256 value=\"813a092dbf9a493fe5ad1c75cf2d34af7790627113ceb5642ef484d8f13b90ff\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-annotations\" version=\"2.1.20\">\n         <artifact name=\"kotlin-gradle-plugin-annotations-2.1.20.jar\">\n            <sha256 value=\"b24f526d0dfefb0296ae0f4ab362f9d6ca0257725cc273083a9ae337ea28267d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-annotations-2.1.20.pom\">\n            <sha256 value=\"c0ab34e9f7d00afdcb22fd03e52e8f859a4647d958e0b87b7d0cd26344163a5a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-annotations\" version=\"2.1.21\">\n         <artifact name=\"kotlin-gradle-plugin-annotations-2.1.21.jar\">\n            <sha256 value=\"784bbf6f8834d1ecf65ec51fe7b44b416f33052e821962a59b9e7f74e094f696\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-annotations-2.1.21.pom\">\n            <sha256 value=\"4310292b741cdba06eea2682f185395388be3af3cb013cc8a3e81e8b93689100\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-api\" version=\"2.0.0\">\n         <artifact name=\"kotlin-gradle-plugin-api-2.0.0.jar\">\n            <sha256 value=\"f95693a82de0bbfb06d6b1eac364954b68bf488ba0c8cc2ff273976bb28ee223\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-api-2.0.0.module\">\n            <sha256 value=\"9f6ac6f6dcb3c3d933fde92e4de93381b78d3212ae68eb66702da812bf6ecfa9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-api\" version=\"2.0.10\">\n         <artifact name=\"kotlin-gradle-plugin-api-2.0.10.jar\">\n            <sha256 value=\"780102b4cb9cf93907844d0a3492832e34f068be6d99a784413b96b0831448e5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-api-2.0.10.module\">\n            <sha256 value=\"58eea09ab14f89ea2de1e9ab68e6a254f76aafd4fb4d8b449a3344d825fc45c9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-api\" version=\"2.0.20\">\n         <artifact name=\"kotlin-gradle-plugin-api-2.0.20.jar\">\n            <sha256 value=\"0f7357bc5ccc8e3681ec3b4643c70cad2883b246c8b7af7d6d971c41e3934f2d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-api-2.0.20.module\">\n            <sha256 value=\"089f1208913ad5c6a5334f67bbca48fc7b0afa10afd0bda5153fbcb52cc2a96c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-api\" version=\"2.0.21\">\n         <artifact name=\"kotlin-gradle-plugin-api-2.0.21.jar\">\n            <sha256 value=\"52eaf52ce303b529de67abc3bac13e4f13596357543dfa831c4d72d2d6310e50\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-api-2.0.21.module\">\n            <sha256 value=\"cf6f5d344c555554bfac64051ead0085cbd4338676baa3fc87b503e9e4abbe34\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-api\" version=\"2.1.0\">\n         <artifact name=\"kotlin-gradle-plugin-api-2.1.0.jar\">\n            <sha256 value=\"bf03d64ecffcb66d73fea0991768dd75cbeb1192d47c7a48b61ba7f7ca258858\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-api-2.1.0.module\">\n            <sha256 value=\"9ad196cf9a5c7d8840ad974d697a3af94990ecf16df681e755a90bf42a3ea410\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-api\" version=\"2.1.10\">\n         <artifact name=\"kotlin-gradle-plugin-api-2.1.10.jar\">\n            <sha256 value=\"ae1bad3c361630c66b441c0de823c8d672ec3d249ac3d8b696d1f4e9368d267a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-api-2.1.10.module\">\n            <sha256 value=\"a9fca91f6a98ba5fff444ff2746d90b0c7c6895c9e9319c2c9499b53ea6635db\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-api\" version=\"2.1.20\">\n         <artifact name=\"kotlin-gradle-plugin-api-2.1.20-gradle85.jar\">\n            <sha256 value=\"7e3619966fe389df48579f43b18f2c0b073696559915377c9442eba8cfbbfbf6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-api-2.1.20.jar\">\n            <sha256 value=\"7e3619966fe389df48579f43b18f2c0b073696559915377c9442eba8cfbbfbf6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-api-2.1.20.module\">\n            <sha256 value=\"02c26c265012470d72adcddbb824d238e6b289e100cd4bbf9a82750a3d49bfc0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-api\" version=\"2.1.21\">\n         <artifact name=\"kotlin-gradle-plugin-api-2.1.21-gradle85.jar\">\n            <sha256 value=\"558f8a32baf5a87e9694c8bb395570a9e76e0aeaabaa683f9ac1fcde8ba3aacc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-api-2.1.21.jar\">\n            <sha256 value=\"558f8a32baf5a87e9694c8bb395570a9e76e0aeaabaa683f9ac1fcde8ba3aacc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-api-2.1.21.module\">\n            <sha256 value=\"abd7c700e9a94c5df3ccd95e93d2eeab0c192645d707ead95c5cea47e81cc27b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-idea\" version=\"2.0.0\">\n         <artifact name=\"kotlin-gradle-plugin-idea-2.0.0.jar\">\n            <sha256 value=\"c1f4ea0c19267f1eed474b541b07715c49167acfbf027a8a2fd07cbbc81b8e72\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-idea-2.0.0.module\">\n            <sha256 value=\"4163bd47a34ba1bd74c323577fe8426b78d5662b760658106352b791bad4dcf8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-idea\" version=\"2.0.10\">\n         <artifact name=\"kotlin-gradle-plugin-idea-2.0.10.jar\">\n            <sha256 value=\"c1f4ea0c19267f1eed474b541b07715c49167acfbf027a8a2fd07cbbc81b8e72\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-idea-2.0.10.module\">\n            <sha256 value=\"97d68a8200bc11b10bb7d2b6ec1636cb230d18715581f0ed8ee54784126fdd08\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-idea\" version=\"2.0.20\">\n         <artifact name=\"kotlin-gradle-plugin-idea-2.0.20.jar\">\n            <sha256 value=\"c1f4ea0c19267f1eed474b541b07715c49167acfbf027a8a2fd07cbbc81b8e72\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-idea-2.0.20.module\">\n            <sha256 value=\"c32f14c34497802a8e8d793b2b5d67923e2022539478f366e18a7ef6414ebade\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-idea\" version=\"2.0.21\">\n         <artifact name=\"kotlin-gradle-plugin-idea-2.0.21.jar\">\n            <sha256 value=\"c1f4ea0c19267f1eed474b541b07715c49167acfbf027a8a2fd07cbbc81b8e72\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-idea-2.0.21.module\">\n            <sha256 value=\"62a70d020dbb0780647b115518804713e67606405ae97a10d8fda3829388d149\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-idea\" version=\"2.1.0\">\n         <artifact name=\"kotlin-gradle-plugin-idea-2.1.0.jar\">\n            <sha256 value=\"1a7e8d40f5498649e7b1995e87bd73504875254ad9cad093b86b81347e80151c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-idea-2.1.0.module\">\n            <sha256 value=\"cb206888b337cc56acba00bded11942b03b463333fedf25cccd741ef73a8c3e9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-idea\" version=\"2.1.10\">\n         <artifact name=\"kotlin-gradle-plugin-idea-2.1.10.jar\">\n            <sha256 value=\"1a7e8d40f5498649e7b1995e87bd73504875254ad9cad093b86b81347e80151c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-idea-2.1.10.module\">\n            <sha256 value=\"f992bb9a362b00e6a117aba041eec40d83f684f630de1300fadf2fda30a561d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-idea\" version=\"2.1.20\">\n         <artifact name=\"kotlin-gradle-plugin-idea-2.1.20.jar\">\n            <sha256 value=\"00f6f843abc930d0c61abb4e3e302c8d17761291f9b2bc2586fe12b0cb975ead\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-idea-2.1.20.module\">\n            <sha256 value=\"b5def005f229a21b2ad6926df708cf84ba9efbc4ec19c635ebfe5b693731db08\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-idea\" version=\"2.1.21\">\n         <artifact name=\"kotlin-gradle-plugin-idea-2.1.21.jar\">\n            <sha256 value=\"00f6f843abc930d0c61abb4e3e302c8d17761291f9b2bc2586fe12b0cb975ead\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-idea-2.1.21.module\">\n            <sha256 value=\"808586c3cf7ace4cdf08b1185fbcafd0f55c52134850f366525afbae50bbc53a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-idea-proto\" version=\"2.0.0\">\n         <artifact name=\"kotlin-gradle-plugin-idea-proto-2.0.0.jar\">\n            <sha256 value=\"51d31fe50bc89ac080d49bc87cc77f139586cfcb1098d4aaafbbc72a71d8e207\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-idea-proto-2.0.0.pom\">\n            <sha256 value=\"acbec7892f527cb610b62493551221e4d0d08e0b38973464bd6d747f1bab227a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-idea-proto\" version=\"2.0.10\">\n         <artifact name=\"kotlin-gradle-plugin-idea-proto-2.0.10.jar\">\n            <sha256 value=\"f65277fd77f98790eff10c47ad1e9b5e89b1d7a4099106402677275e54b390b0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-idea-proto-2.0.10.pom\">\n            <sha256 value=\"f068600784963db5be2aae7e23525e6de27cd00f6ae4acddf0ae205b30f48fd0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-idea-proto\" version=\"2.0.20\">\n         <artifact name=\"kotlin-gradle-plugin-idea-proto-2.0.20.jar\">\n            <sha256 value=\"09edb027b9a1f3df716271aecad7bb41a1ddbc2f9c11317297900d4f2bdce88c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-idea-proto-2.0.20.pom\">\n            <sha256 value=\"c198ab78c266cf3be7a1d24705e5bb1886d4945fdca4f717f54efb86ff4cd74a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-idea-proto\" version=\"2.0.21\">\n         <artifact name=\"kotlin-gradle-plugin-idea-proto-2.0.21.jar\">\n            <sha256 value=\"53355742b57ba8e16fbdf0a20439f8b345276071edb144e7b3da6e60be363188\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-idea-proto-2.0.21.pom\">\n            <sha256 value=\"38cc9a2cb7f9e4afd439c31076f833153848b1f7ed2133200835d1b420df6eab\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-idea-proto\" version=\"2.1.0\">\n         <artifact name=\"kotlin-gradle-plugin-idea-proto-2.1.0.jar\">\n            <sha256 value=\"96d0c169ae7e8191935f748146b9f64a1f6f25d121941e29714faaab089da910\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-idea-proto-2.1.0.pom\">\n            <sha256 value=\"0ec74e3cc7c7a20ca4d8860f9d2cd965670ec419b389ead09d712c81d1bc6047\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-idea-proto\" version=\"2.1.10\">\n         <artifact name=\"kotlin-gradle-plugin-idea-proto-2.1.10.jar\">\n            <sha256 value=\"d2f723f1495c7d82e3d666e100a611004c592a1d8d3b5cd32e696be90ac82e7e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-idea-proto-2.1.10.pom\">\n            <sha256 value=\"9a72152915ff78b74a4cebc1dce14b93850f9d312c3cf4ab791610fec7539856\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-idea-proto\" version=\"2.1.20\">\n         <artifact name=\"kotlin-gradle-plugin-idea-proto-2.1.20.jar\">\n            <sha256 value=\"eaf10b20bba3923a07f8fb182fb8cd565699e157ee73d12599af1f5caba25040\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-idea-proto-2.1.20.pom\">\n            <sha256 value=\"3dd61e6936dc51006ce4c37effe43efe1400b841e09ec4b1ee4a94f6b919382a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-idea-proto\" version=\"2.1.21\">\n         <artifact name=\"kotlin-gradle-plugin-idea-proto-2.1.21.jar\">\n            <sha256 value=\"0583b9979edd4c8f5fefc08d5911821e9c3b05a91b839fa1aa070f926ee7cba0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-idea-proto-2.1.21.pom\">\n            <sha256 value=\"14b6e5dff23f94dcd3326c3d257bf625e455b1509526205c20b340b42c357fa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-model\" version=\"2.0.0\">\n         <artifact name=\"kotlin-gradle-plugin-model-2.0.0.jar\">\n            <sha256 value=\"b7b436caef0b0d5f571ddd88214418cf8580a34ec8e81f22503cef35755552d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-model-2.0.0.module\">\n            <sha256 value=\"ecc56ff4219215ae9626e06d51aa9a3ef59bf5e6d4509260328593c059805b06\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-model\" version=\"2.0.10\">\n         <artifact name=\"kotlin-gradle-plugin-model-2.0.10.jar\">\n            <sha256 value=\"062f0784338dce49d23941d2439758e6caea5ccd0e9bc730d56e8b9ac02282cb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-model-2.0.10.module\">\n            <sha256 value=\"4c4764da34ccbb1400cc0c1f557afce3b2811f22dce1dc594e8bdb7199eb7a87\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-model\" version=\"2.0.20\">\n         <artifact name=\"kotlin-gradle-plugin-model-2.0.20.jar\">\n            <sha256 value=\"514c7f17dc5e54ee5d16a761b364b9d343956bcad49dfd08e085962257737e19\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-model-2.0.20.module\">\n            <sha256 value=\"1cf9f6d3ec6d305aa089032ac892ffae881cc105003f456f2c15fd3c30320a6e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-model\" version=\"2.0.21\">\n         <artifact name=\"kotlin-gradle-plugin-model-2.0.21.jar\">\n            <sha256 value=\"951d77989b357009631ff1efb12b0161ccf329c529c546a529f8a1d31f9bc03c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-model-2.0.21.module\">\n            <sha256 value=\"eaa9fd9f86fbd44ff6070a197dc7bdd1980f0d41e8db49b252803d03aa4c55ac\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-model\" version=\"2.1.0\">\n         <artifact name=\"kotlin-gradle-plugin-model-2.1.0.jar\">\n            <sha256 value=\"306832bc994a061f3bf3f1be592b23945057080499e7dc33c52cb69e33d19164\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-model-2.1.0.module\">\n            <sha256 value=\"fdb78fa159a111bf9cd0c08023b728c77aebddcb95cfdc505f926a9218adc6a1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-model\" version=\"2.1.10\">\n         <artifact name=\"kotlin-gradle-plugin-model-2.1.10.jar\">\n            <sha256 value=\"64cee537e2efa808c8af4ac27591c845f0861c51fba0d064dbd74ba4dedd83ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-model-2.1.10.module\">\n            <sha256 value=\"4551e2c04331e1659fdb990dbcdd99606d8734b5a408df0a7b3b85b8c2984d70\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-model\" version=\"2.1.20\">\n         <artifact name=\"kotlin-gradle-plugin-model-2.1.20.jar\">\n            <sha256 value=\"d637fba470b3bf713b0a65e6717ad5dd03a8725fcc94530289473ab26b42e82b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-model-2.1.20.module\">\n            <sha256 value=\"5899b97e7a9b171e6c05e549ce2a9ba3c75d2593159d4b2b01566414b568516a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugin-model\" version=\"2.1.21\">\n         <artifact name=\"kotlin-gradle-plugin-model-2.1.21.jar\">\n            <sha256 value=\"6804cd5f05d77fa954ac7b7a930e7b57fae08caf024e2291880a3c28a49fc075\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugin-model-2.1.21.module\">\n            <sha256 value=\"21fa2a83b1537806bbc7ed6556b99522a5e16f3891e8288a1bcfe8cdfd2642b8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugins-bom\" version=\"2.0.0\">\n         <artifact name=\"kotlin-gradle-plugins-bom-2.0.0.module\">\n            <sha256 value=\"eab8df114dc10987acd3093ca2ae310b753a13b718a263d5b5d83a6595c04bda\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugins-bom-2.0.0.pom\">\n            <sha256 value=\"c4a0586af77f0fb4f7e367033a02ac718beff0d0193cc7989583a982aa2752f2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugins-bom\" version=\"2.0.10\">\n         <artifact name=\"kotlin-gradle-plugins-bom-2.0.10.module\">\n            <sha256 value=\"4cb7fd631f34209ff9e8ad1c9b41f758ccaf89fee75feb382ddd8f1b7b9ce567\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugins-bom-2.0.10.pom\">\n            <sha256 value=\"772e5ecadd154fdb1722b26401e3255475831bcb7992eb3c1cd68dc68164f5e4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugins-bom\" version=\"2.0.20\">\n         <artifact name=\"kotlin-gradle-plugins-bom-2.0.20.module\">\n            <sha256 value=\"1b03231efa7b3b6d31b0936872941f87e27a819c003718b3d09880b76e63d7cd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugins-bom-2.0.20.pom\">\n            <sha256 value=\"4c32eb35094c16359df78deaec11ce523be360407414fa0aecc8aefc67ed4a43\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugins-bom\" version=\"2.0.21\">\n         <artifact name=\"kotlin-gradle-plugins-bom-2.0.21.module\">\n            <sha256 value=\"f0945487fe51959fdf8b6a1441707a29ed5f1ac31a231c7fdebe2c3ddd22fdf1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugins-bom-2.0.21.pom\">\n            <sha256 value=\"675013d4cbeee09c88920ae2ba246f99f28a789b874f634049e012fa3eebf4c8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugins-bom\" version=\"2.1.0\">\n         <artifact name=\"kotlin-gradle-plugins-bom-2.1.0.module\">\n            <sha256 value=\"a81bd9adbd3ba75a05a6c3a3ed846e0c92a5a7ac4ce8363cf604b4f2c8a7b75c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugins-bom-2.1.0.pom\">\n            <sha256 value=\"9216b199d987cab680450aac715caa57571f8a67800e36e37026f8f453c1feb1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugins-bom\" version=\"2.1.10\">\n         <artifact name=\"kotlin-gradle-plugins-bom-2.1.10.module\">\n            <sha256 value=\"68dd1f3191b47a24c9b723e8a7df836ee727459bb0e86d3dc7a1f5eb884ad6c6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugins-bom-2.1.10.pom\">\n            <sha256 value=\"d3ad91ae22dd0022738339af1ef40c142fd31f3e17a48f55b08644432b40ec29\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugins-bom\" version=\"2.1.20\">\n         <artifact name=\"kotlin-gradle-plugins-bom-2.1.20.module\">\n            <sha256 value=\"205e1169c628bec05f1d59e44d32091528ae9fd53a7e33ec543bcefdb1288de6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugins-bom-2.1.20.pom\">\n            <sha256 value=\"639ca6c7653e1a9da95df2a3bae26ccb701c03afd58c797ab6bf6f255f64c301\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-gradle-plugins-bom\" version=\"2.1.21\">\n         <artifact name=\"kotlin-gradle-plugins-bom-2.1.21.module\">\n            <sha256 value=\"6af494ac656e7248341ceba439e3d626116d0117c9fbdf97abee6570e11a0877\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-gradle-plugins-bom-2.1.21.pom\">\n            <sha256 value=\"79398f847d6b7ca8a96a4e4639ffa22e1691248afeb4e81019e11d1bd0bb2052\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-klib-commonizer-api\" version=\"2.0.0\">\n         <artifact name=\"kotlin-klib-commonizer-api-2.0.0.jar\">\n            <sha256 value=\"1e1b57dc1f802aa778f5f46054a253213d8b03c58357e347f08222a2d1950175\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-klib-commonizer-api-2.0.0.pom\">\n            <sha256 value=\"72aea51ffd69e7a6d7de7e2ca9ac192c69918f5a0339974caf5e9fa4c762cd58\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-klib-commonizer-api\" version=\"2.0.10\">\n         <artifact name=\"kotlin-klib-commonizer-api-2.0.10.jar\">\n            <sha256 value=\"fbd265ee03df04b3e312eb8c212702788e013f2a142e81a25110a45c5cc5ddf5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-klib-commonizer-api-2.0.10.pom\">\n            <sha256 value=\"47ae001218fa4a3102c7f410cd0ea0ca2d4ffcd13cb010455e060c11585e44a1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-klib-commonizer-api\" version=\"2.0.20\">\n         <artifact name=\"kotlin-klib-commonizer-api-2.0.20.jar\">\n            <sha256 value=\"42c42fbe273fa0304e4e17f7392c66b39e91f99d35f85c068b11bdd56b9e99dc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-klib-commonizer-api-2.0.20.pom\">\n            <sha256 value=\"e5fe068c4ebd5c8858c35c39e8623abeb9c86f8a17254742e7f5598e43fada3c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-klib-commonizer-api\" version=\"2.0.21\">\n         <artifact name=\"kotlin-klib-commonizer-api-2.0.21.jar\">\n            <sha256 value=\"4757891165b698fbdace8f4da6f2bc0e988eaef9ef36713548865a8f27069afd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-klib-commonizer-api-2.0.21.pom\">\n            <sha256 value=\"63fe87bd2235b129409c722a09b62c20a7b77ae79019e22031248af736b03c54\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-klib-commonizer-api\" version=\"2.1.0\">\n         <artifact name=\"kotlin-klib-commonizer-api-2.1.0.jar\">\n            <sha256 value=\"05fcb427938d6e2379a8430bb6613ab2fe2089d057e064530e7225b864cf9e37\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-klib-commonizer-api-2.1.0.pom\">\n            <sha256 value=\"6ee261b9393ccd649ef39efea73bef2e98e46caed5622008dedd769e4cd877eb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-klib-commonizer-api\" version=\"2.1.10\">\n         <artifact name=\"kotlin-klib-commonizer-api-2.1.10.jar\">\n            <sha256 value=\"1bec2ac95262034be8168793a05414ee5628cc1e28c487b25d5f9749ce72da5b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-klib-commonizer-api-2.1.10.pom\">\n            <sha256 value=\"fa4f8f1e2272c1e785e1cd9e54e8b22ead340786bcc74b8ac760b633350356b6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-klib-commonizer-api\" version=\"2.1.20\">\n         <artifact name=\"kotlin-klib-commonizer-api-2.1.20.jar\">\n            <sha256 value=\"132198115986095904b0cb01efaae1d81249641ef9149e05b344f864aae975f4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-klib-commonizer-api-2.1.20.pom\">\n            <sha256 value=\"2d96b256f0fc91eb12bceb6e4761e13d701ff1353f0592fc572988dae6a2d19b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-klib-commonizer-api\" version=\"2.1.21\">\n         <artifact name=\"kotlin-klib-commonizer-api-2.1.21.jar\">\n            <sha256 value=\"43e0a40c1df79c33a3049914bc9e666e44fbcb20f07d4568eea0595e972a2c71\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-klib-commonizer-api-2.1.21.pom\">\n            <sha256 value=\"dc5f80e91182cf9e2a04dfd729d70e7d314e1edf8d64624b166e68f74952c3d4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-klib-commonizer-embeddable\" version=\"2.0.0\">\n         <artifact name=\"kotlin-klib-commonizer-embeddable-2.0.0.jar\">\n            <sha256 value=\"687bca71931939389e9d0200f95ecc1508e0d41851ede51f4610f876d037a1dd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-klib-commonizer-embeddable-2.0.0.pom\">\n            <sha256 value=\"7aab0a39bad95150823df619659fc49ba951de0b7dfa683fce27bcea18da3c9e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-klib-commonizer-embeddable\" version=\"2.0.10\">\n         <artifact name=\"kotlin-klib-commonizer-embeddable-2.0.10.jar\">\n            <sha256 value=\"cb3f1b96497cd9979e41c8e6991ac5f33811e7370e832782bea217968f2b02d2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-klib-commonizer-embeddable-2.0.10.pom\">\n            <sha256 value=\"105c599419b72a6e54bab26c35ed281a7c62dbf2ad567aeb8c4999ea21adfb96\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-klib-commonizer-embeddable\" version=\"2.0.20\">\n         <artifact name=\"kotlin-klib-commonizer-embeddable-2.0.20.jar\">\n            <sha256 value=\"6731c2564b973971835825490140b7ad9eb726d938fe0cef4ebef2ec592deb03\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-klib-commonizer-embeddable-2.0.20.pom\">\n            <sha256 value=\"ad54a0da72f1012974f1eeec769d84a29327cf37ccad5531b78713fc60f4b676\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-klib-commonizer-embeddable\" version=\"2.0.21\">\n         <artifact name=\"kotlin-klib-commonizer-embeddable-2.0.21.jar\">\n            <sha256 value=\"d86bf4338a6d841cccdfbbff2da05bd03a49c3db8c3f97ab85e77e021ad0845b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-klib-commonizer-embeddable-2.0.21.pom\">\n            <sha256 value=\"7ac81f3bb07c4d6aa8fa98ff5a399a47abd1ce1c786d4f3fad96ef28120bdf8a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-klib-commonizer-embeddable\" version=\"2.1.0\">\n         <artifact name=\"kotlin-klib-commonizer-embeddable-2.1.0.jar\">\n            <sha256 value=\"d937f731886937ba369a46b2263294cf1170989d3321d07153c91d9cb86a99d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-klib-commonizer-embeddable-2.1.0.pom\">\n            <sha256 value=\"67ec3e97100b876dd2b805c9d30fd96d000e56661979a976c483d20a900f29bd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-klib-commonizer-embeddable\" version=\"2.1.10\">\n         <artifact name=\"kotlin-klib-commonizer-embeddable-2.1.10.jar\">\n            <sha256 value=\"d3327a42701984d992fbf25abd728d944dcb2e3f132f5c32539f9c71a6cf90db\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-klib-commonizer-embeddable-2.1.10.pom\">\n            <sha256 value=\"cc060b9fc473b3be2514fb0d784bb8e9a97accb1c55def1fe22ed43cf50702b1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-klib-commonizer-embeddable\" version=\"2.1.20\">\n         <artifact name=\"kotlin-klib-commonizer-embeddable-2.1.20.jar\">\n            <sha256 value=\"4d13fee05bbb471942c3b5ede0f28aba2e011960e6412674b8287bad866e2dfa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-klib-commonizer-embeddable-2.1.20.pom\">\n            <sha256 value=\"c4056abd4f2f0e0ec9501759d87d5a44b950e7f22ab8073e746ece3eb7361c82\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-klib-commonizer-embeddable\" version=\"2.1.21\">\n         <artifact name=\"kotlin-klib-commonizer-embeddable-2.1.21.jar\">\n            <sha256 value=\"70f0f498d08f3b80b2a702295c79acd6a42d0a2c36bcfb89f903cbbfe0388bc0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-klib-commonizer-embeddable-2.1.21.pom\">\n            <sha256 value=\"a9e5708e5c64f2dfc21bae19b10a682176a0ddd7be1fb2149e220a3b86b24ed3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-metadata-jvm\" version=\"2.1.10\">\n         <artifact name=\"kotlin-metadata-jvm-2.1.10.jar\">\n            <sha256 value=\"da86ed4f3a8c8885592d6b8aa691fb8607b49f3773c8bbd08c3b14a31b14d2fd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-metadata-jvm-2.1.10.pom\">\n            <sha256 value=\"399c6b305357af32e734a1da48dc9d311ef7661552051f481c724f05e4cdc01c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-native-prebuilt\" version=\"2.0.0\">\n         <artifact name=\"kotlin-native-prebuilt-2.0.0-linux-x86_64.tar.gz\">\n            <sha256 value=\"1c1e18487ffcee3c19a1ca6500dd6589efdae844bade5ec071fbeca801292aa3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-native-prebuilt-2.0.0-macos-aarch64.tar.gz\">\n            <sha256 value=\"d60bea435a0b23fd1bb1b4ad6ae50c778b52cf300cb3421471b252e44bf184c5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-native-prebuilt-2.0.0.pom\">\n            <sha256 value=\"c83bc3c52dd174531b5dd48e167e00fcaa9a1459752e8ce21d9e381b893af406\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-native-prebuilt\" version=\"2.0.10\">\n         <artifact name=\"kotlin-native-prebuilt-2.0.10-linux-x86_64.tar.gz\">\n            <sha256 value=\"c48badc9e0a01ed084bad6b13d81315910e27d50178351445c3c81991b6f090a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-native-prebuilt-2.0.10-macos-aarch64.tar.gz\">\n            <sha256 value=\"3a8f31ab752acf52324299d945df9d32ad65043411701e0be47b51fef75decbb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-native-prebuilt-2.0.10.pom\">\n            <sha256 value=\"8c420d622d3f25b2fb22860b658ceeb3e9b487174d04826868910baaef76757f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-native-utils\" version=\"2.0.0\">\n         <artifact name=\"kotlin-native-utils-2.0.0.jar\">\n            <sha256 value=\"20d5904b4f0fa20624cab109ae303dff039142651b77901e0e14aae5feeb0ae6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-native-utils-2.0.0.pom\">\n            <sha256 value=\"56317d6fc49729f42e935d1f8c9769d3ad855264563a57a691503ba80ae3d452\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-native-utils\" version=\"2.0.10\">\n         <artifact name=\"kotlin-native-utils-2.0.10.jar\">\n            <sha256 value=\"f30f60f2f9a624d0cea7b4ec8cf03d03db295cc8d2fb0734f66419ddbbb78931\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-native-utils-2.0.10.pom\">\n            <sha256 value=\"c4459eefeb75ba2dd0c01e8cca520df61ed9719167269eee0b71f14d3ad2f8d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-native-utils\" version=\"2.0.20\">\n         <artifact name=\"kotlin-native-utils-2.0.20.jar\">\n            <sha256 value=\"c166f2051e91d199e960ffc7b2764485c1510cd17674dd7b8ce3c2fcd06a872b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-native-utils-2.0.20.pom\">\n            <sha256 value=\"98849931fb70916852eaa7c20e6d8faf522c50d77adbbafd9364f526b7cdec42\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-native-utils\" version=\"2.0.21\">\n         <artifact name=\"kotlin-native-utils-2.0.21.jar\">\n            <sha256 value=\"45eb08a3929f97c48a92912c9625779d1540bc6f3f212fb9e94620d0326bcc00\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-native-utils-2.0.21.pom\">\n            <sha256 value=\"6690773e7649d1d0fad55d0609a4e21e1ebc985dd0fa261e9c6ffd389867061d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-native-utils\" version=\"2.1.0\">\n         <artifact name=\"kotlin-native-utils-2.1.0.jar\">\n            <sha256 value=\"c4396feba6d0a24ab717426b36418e945b7cd0f50d77c866524f26676f968439\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-native-utils-2.1.0.pom\">\n            <sha256 value=\"e8d410f736cfaca2fb277b98e4a2796f0e544e1e096a004385c7befce531ee01\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-native-utils\" version=\"2.1.10\">\n         <artifact name=\"kotlin-native-utils-2.1.10.jar\">\n            <sha256 value=\"2fc05e867dc4470f65851d16263498fb17ddcb182512b83d15e1788159e0a26a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-native-utils-2.1.10.pom\">\n            <sha256 value=\"961068d4b5559c1954004568091a0950976c655cf7f75161f6fe2422acb5dab4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-native-utils\" version=\"2.1.20\">\n         <artifact name=\"kotlin-native-utils-2.1.20.jar\">\n            <sha256 value=\"a7256273abb9df2235924d80fdd36d678b458467c3076c66851c42437bdd3c66\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-native-utils-2.1.20.pom\">\n            <sha256 value=\"d4679ce80b04458e5fccbd69b5e314bf1c0c167987e0439546fdfecfb53e3346\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-native-utils\" version=\"2.1.21\">\n         <artifact name=\"kotlin-native-utils-2.1.21.jar\">\n            <sha256 value=\"dc409485c95cd38a5f30d5878ebe9a8bf2e6e6f254b6fe9e45cca0999905e070\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-native-utils-2.1.21.pom\">\n            <sha256 value=\"d915bb64431185fbdb865c4d2b12e6ba78aa68c1347c59dfae279a32a23284f9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-parcelize-compiler\" version=\"2.0.0\">\n         <artifact name=\"kotlin-parcelize-compiler-2.0.0.jar\">\n            <sha256 value=\"a5014fb9369dca119d88df58205f7aa5ddc2589aa2ad5daa90c2f95e3ff4e86e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-parcelize-compiler-2.0.0.pom\">\n            <sha256 value=\"50d45000569ca3ba08735a1c59bdc305dab3c0e2333ff18def9b111a040b3953\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-parcelize-compiler\" version=\"2.0.10\">\n         <artifact name=\"kotlin-parcelize-compiler-2.0.10.jar\">\n            <sha256 value=\"23f2181beb331a8be855ca1a8942e3695b9be999da2996f355cc1b99cded4726\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-parcelize-compiler-2.0.10.pom\">\n            <sha256 value=\"654fc5ab0357c8dbd5afc15cba1f38f19390a91f0f13005774c0f2e01c621546\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-parcelize-compiler\" version=\"2.0.20\">\n         <artifact name=\"kotlin-parcelize-compiler-2.0.20.jar\">\n            <sha256 value=\"60f8d8a2703121662928a7a956b7de71cca3a44ff9e1acb82803a8d5555c2f82\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-parcelize-compiler-2.0.20.pom\">\n            <sha256 value=\"84908deb4edb193dcea31234efa7536f880e7a0ab3a0fe27d923e441d3fbc5bc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-parcelize-compiler\" version=\"2.0.21\">\n         <artifact name=\"kotlin-parcelize-compiler-2.0.21.jar\">\n            <sha256 value=\"e350bd993f9221d926cdca9896867d23f5dadd0edbbc8b2573f77d3e9af46c0f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-parcelize-compiler-2.0.21.pom\">\n            <sha256 value=\"c75c50c69c0ec47fff2b4fb841f7be870356ffb7b565fbeb403b0daf000cc367\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-parcelize-compiler\" version=\"2.1.0\">\n         <artifact name=\"kotlin-parcelize-compiler-2.1.0.jar\">\n            <sha256 value=\"1e015b804a7fcfe1cf0d8c0157acc39cc8fdf00180df0f2128957e5227c15664\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-parcelize-compiler-2.1.0.pom\">\n            <sha256 value=\"7dc4859decaaa89851705e3a315344a3c98bc8726bdb9c69250a5fc94af93437\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-parcelize-compiler\" version=\"2.1.10\">\n         <artifact name=\"kotlin-parcelize-compiler-2.1.10.jar\">\n            <sha256 value=\"5d49ea824b79f28c3c38a510a3d8470d27b3a49cf85d3c86f04b69226079e442\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-parcelize-compiler-2.1.10.pom\">\n            <sha256 value=\"93684073b4c9a6b961aa52f30ec79ed61b4b2925a9c492d64386a77eef6bf901\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-parcelize-compiler\" version=\"2.1.20\">\n         <artifact name=\"kotlin-parcelize-compiler-2.1.20.jar\">\n            <sha256 value=\"d00dffad577f5ef3ecb9e1617f5ee682a92f7c7256c9ad27149c1b84baa4e3ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-parcelize-compiler-2.1.20.pom\">\n            <sha256 value=\"435ca1b94b0ac363e7573ededa02a4f3117c9620ec262cb226025b49b06ecebf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-parcelize-compiler\" version=\"2.1.21\">\n         <artifact name=\"kotlin-parcelize-compiler-2.1.21.jar\">\n            <sha256 value=\"0dfcb04c6150827dff861a58defada9485b1525a877bfaa20fcb0f0a90abe846\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-parcelize-compiler-2.1.21.pom\">\n            <sha256 value=\"a958631a024fe4f770ca8e04585e244e84e30d3912da40a49f311804fae565e7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-parcelize-runtime\" version=\"2.0.0\">\n         <artifact name=\"kotlin-parcelize-runtime-2.0.0-sources.jar\">\n            <sha256 value=\"b7cf21217b9bbfbea21dd944c163454a8592344bef5b0b92ba2fa46aa1e97660\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-parcelize-runtime-2.0.0.jar\">\n            <sha256 value=\"d75402374e546f61db07a8467cac7537b59d22e0860ffeed370ce2a1aeefba21\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-parcelize-runtime-2.0.0.pom\">\n            <sha256 value=\"54d7c62af931be9993df74a08facd1de3f161b60f0c20a58281fd1133ee26bea\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-parcelize-runtime\" version=\"2.0.10\">\n         <artifact name=\"kotlin-parcelize-runtime-2.0.10.jar\">\n            <sha256 value=\"d83e623d0782c7bf2d37b24da27b3217d96d7e1c0c7b9a757d350bdc4d3cadde\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-parcelize-runtime-2.0.10.pom\">\n            <sha256 value=\"47d3b4dd1d84675eddd2d928e0f8919fa2126a0bbd2d1462fcc5ddc5b564db31\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-parcelize-runtime\" version=\"2.0.20\">\n         <artifact name=\"kotlin-parcelize-runtime-2.0.20.jar\">\n            <sha256 value=\"3f2ec02a496efeb9e56166dfb86c741ac6bbd8f238ed0aea6e1ed04b7bcd5cd7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-parcelize-runtime-2.0.20.pom\">\n            <sha256 value=\"2ae26fbd762d313960c17ce7ea807a9dee40a22dc92724224227d29638e6a5f0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-parcelize-runtime\" version=\"2.0.21\">\n         <artifact name=\"kotlin-parcelize-runtime-2.0.21.jar\">\n            <sha256 value=\"8896ae6fd5ae308ff0501560cfb2e29cb6f37383389f9c9665a9e4dc8d7ffb0a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-parcelize-runtime-2.0.21.pom\">\n            <sha256 value=\"74c006f9ba380e80069b25acd73e5673040c81ad61755869c3219ade40457c7b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-parcelize-runtime\" version=\"2.1.0\">\n         <artifact name=\"kotlin-parcelize-runtime-2.1.0.jar\">\n            <sha256 value=\"dce0e2bb2aa645fe750700b793a7f6fbc752b140d374120efaece930123323c5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-parcelize-runtime-2.1.0.pom\">\n            <sha256 value=\"d2e6941fca35768a49b360064af059e58406a8fbce729674a9d69fcd0efaf519\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-parcelize-runtime\" version=\"2.1.10\">\n         <artifact name=\"kotlin-parcelize-runtime-2.1.10.jar\">\n            <sha256 value=\"5213dce305312404121d5d41549e86c99130615c123e21b50d7ab6a0e311f0f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-parcelize-runtime-2.1.10.pom\">\n            <sha256 value=\"a81822cbd1fd598bfbb3924b968da3d38d5065a6e0d60135f87497c90df82ac7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-parcelize-runtime\" version=\"2.1.20\">\n         <artifact name=\"kotlin-parcelize-runtime-2.1.20.jar\">\n            <sha256 value=\"8d5fb6f1f2eaab779997d09283c30ff7eb5741ea4b54dd3ef32d3372a55aff46\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-parcelize-runtime-2.1.20.pom\">\n            <sha256 value=\"4db727a898334fde377ee991e89ab3743547921f2277d42ea71061a8622d9239\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-parcelize-runtime\" version=\"2.1.21\">\n         <artifact name=\"kotlin-parcelize-runtime-2.1.21.jar\">\n            <sha256 value=\"9dabea4e0b05526bb94f291d5074be45aeb37c7ba707ffd68028aaa2b2b67bae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-parcelize-runtime-2.1.21.pom\">\n            <sha256 value=\"6680081f68107bd1e28282d4b3360d52e5d9553925d8da8dcb338f6ff95e6b00\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-reflect\" version=\"1.6.10\">\n         <artifact name=\"kotlin-reflect-1.6.10.jar\">\n            <sha256 value=\"3277ac102ae17aad10a55abec75ff5696c8d109790396434b496e75087854203\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-reflect-1.6.10.pom\">\n            <sha256 value=\"57905524274a00ae028aaccc27283f6bc5925a934a046c1cc5d06c8ee4d6d5a9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-reflect\" version=\"1.8.21\">\n         <artifact name=\"kotlin-reflect-1.8.21.jar\">\n            <sha256 value=\"8a6cd5a3cf092acee274ce2c444dc36eefdb631579859dd4d857b3309a529c91\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-reflect-1.8.21.pom\">\n            <sha256 value=\"39d78db33222cdbb32b618c7c5223d4457cc19742856d116a85090e4a96f623a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-reflect\" version=\"1.9.20\">\n         <artifact name=\"kotlin-reflect-1.9.20.jar\">\n            <sha256 value=\"49b66f9a89d50fd2954c2e8aeac80e4f488b0a09322a25efad6261576713dc0f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-reflect-1.9.20.pom\">\n            <sha256 value=\"942b5e8602d317ec13652f1c0222052bb90817f28cf6fe9d47112f09b3e8e67d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-reflect\" version=\"1.9.24\">\n         <artifact name=\"kotlin-reflect-1.9.24.jar\">\n            <sha256 value=\"a65166445bb85ef816cde127279fe0017d2b7cc439b3b972390e1b736d64e94c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-reflect-1.9.24.pom\">\n            <sha256 value=\"0a085c30051bd6d4ab765ad5a0c5179c413b35f7418f2883172fbd9ba1abccc9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-reflect\" version=\"2.0.21\">\n         <artifact name=\"kotlin-reflect-2.0.21.jar\">\n            <sha256 value=\"3ad2fcad0c09ddc0922debab4444d612144b7b465b75a8bb7587e20ddfafd799\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-reflect-2.0.21.pom\">\n            <sha256 value=\"02ab7aeab03c68f40103026e5e9c277360cbc360818a5b2e36b9a3a9d8e8b049\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-reflect\" version=\"2.1.0\">\n         <artifact name=\"kotlin-reflect-2.1.0.jar\">\n            <sha256 value=\"b5f608edfa98a8cfa2372cc12d18ada974be1c56c1093eff06cc061f4fc088b2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-reflect-2.1.0.pom\">\n            <sha256 value=\"9cd84b3d4f717c96235e4ba3b7276895ccffd55de411c7ce0b3f7bab562efe42\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-script-runtime\" version=\"1.9.10\">\n         <artifact name=\"kotlin-script-runtime-1.9.10.jar\">\n            <sha256 value=\"2a6087375be9bdfaaadb4ba4be9833bba0de8edab1255c916642acaabfd20932\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-script-runtime-1.9.10.pom\">\n            <sha256 value=\"5748be5895ed7dc30154e892f8e15b0236599e89e500c2da0bb6549e3385d2c7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-script-runtime\" version=\"2.0.0\">\n         <artifact name=\"kotlin-script-runtime-2.0.0.jar\">\n            <sha256 value=\"b57a14387a504f1d3d8634899a830cb0bc5fe1adb86a62cc65d940fe982b04f9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-script-runtime-2.0.0.pom\">\n            <sha256 value=\"e7540d47f555359526927b747aa47323f9897b94f72eb8ce451e36de752533db\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-script-runtime\" version=\"2.0.10\">\n         <artifact name=\"kotlin-script-runtime-2.0.10.jar\">\n            <sha256 value=\"58f4f7ad99a4a045964b44fe55f0b2604d2c5f51ff4d97c7e6817983fdf92ea7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-script-runtime-2.0.10.pom\">\n            <sha256 value=\"916ea02b4d530a530284e493d1df4d6fbd780bff91e92489fdfd872a14319b92\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-script-runtime\" version=\"2.0.20\">\n         <artifact name=\"kotlin-script-runtime-2.0.20.jar\">\n            <sha256 value=\"fe97002a6798f7207564648919d6eeccfb338b95dc04b48886d856655bc64a4e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-script-runtime-2.0.20.pom\">\n            <sha256 value=\"a3a37629c985cedd7bf9dd76ac67496b3f80a59228541e968802a0ee86c4b914\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-script-runtime\" version=\"2.0.21\">\n         <artifact name=\"kotlin-script-runtime-2.0.21.jar\">\n            <sha256 value=\"9c111f8d08ade455566272d561921adc2b2cb6b7a4ccee38d9829c5e3a1ca6a3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-script-runtime-2.0.21.pom\">\n            <sha256 value=\"95b2e929afa1071bd952fd137b2e7e81d04fe1bbb81b757ebed06b216e5a4524\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-script-runtime\" version=\"2.1.0\">\n         <artifact name=\"kotlin-script-runtime-2.1.0.jar\">\n            <sha256 value=\"15a2b82119e9f145ea028029bd31166584648a419157c20948c124fa33d40e50\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-script-runtime-2.1.0.pom\">\n            <sha256 value=\"f3332fc0f5e962f6aefe0a2c08d3c4d7ab35b13a05dac84c4bc6914e26ed27cd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-script-runtime\" version=\"2.1.10\">\n         <artifact name=\"kotlin-script-runtime-2.1.10.jar\">\n            <sha256 value=\"e244c0e7f664111755f2e6e977861b71a6eba3b4f45162704833e46dfa883ae8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-script-runtime-2.1.10.pom\">\n            <sha256 value=\"cd25a102c127cbdf4a5b99f5336a584b0c8d475ccfcc3502c9ad8ba5e947db37\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-script-runtime\" version=\"2.1.20\">\n         <artifact name=\"kotlin-script-runtime-2.1.20.jar\">\n            <sha256 value=\"ae4397fbb3aa2a1ada09290e753bba99a4114548977c3115526b9958f4cb1a04\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-script-runtime-2.1.20.pom\">\n            <sha256 value=\"0f83b5a90156c61a6ff109557b2d988e2710ee3fbe9f4a4257a6ea0d8748c3d6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-script-runtime\" version=\"2.1.21\">\n         <artifact name=\"kotlin-script-runtime-2.1.21.jar\">\n            <sha256 value=\"d8221f445854f30ac92c248d543609e0ecb5d85bb5ba34c043684b013cb5b897\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-script-runtime-2.1.21.pom\">\n            <sha256 value=\"fd1093f27729f6e60c1bac639056240cc5ef3f5eb34144ff2ea81a8457811494\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-common\" version=\"2.0.0\">\n         <artifact name=\"kotlin-scripting-common-2.0.0.jar\">\n            <sha256 value=\"3cb9f18af2409c90793dfc6ce265a1a9268df4c7e5de3e2a2bcee7ec86059179\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-common-2.0.0.pom\">\n            <sha256 value=\"97283d9b9908d89039cd6e40df6dd810e9aa144c4320eae6b6310a8b6eecee50\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-common\" version=\"2.0.10\">\n         <artifact name=\"kotlin-scripting-common-2.0.10.jar\">\n            <sha256 value=\"37d4671e73ca6599f597aba464577ebb3b8771a31ee9d7dcb52d916762d16871\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-common-2.0.10.pom\">\n            <sha256 value=\"487ce9ee9a20d606d1f7acb884ca960ff34edbc7158f44157261b10873c26210\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-common\" version=\"2.0.20\">\n         <artifact name=\"kotlin-scripting-common-2.0.20.jar\">\n            <sha256 value=\"5d3753393e7fecf1d21baee5db7d788326782bdbf8a8ec6a2b2cccf7b55ee6c6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-common-2.0.20.pom\">\n            <sha256 value=\"05eb149a2099f082c97f5c454351d0b8ca612c5530a3ac321d2c8c075db01155\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-common\" version=\"2.0.21\">\n         <artifact name=\"kotlin-scripting-common-2.0.21.jar\">\n            <sha256 value=\"f87deb2b14d068f99cba18217d80af85481c029c731ad8704458e9add9ca20f8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-common-2.0.21.pom\">\n            <sha256 value=\"84fe9ecea8e557effa8856c9021325ad63c21d9d13121eaaeb1199f6a6586575\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-common\" version=\"2.1.0\">\n         <artifact name=\"kotlin-scripting-common-2.1.0.jar\">\n            <sha256 value=\"d3ebe15699ec1a7fb6c3b5fa939eb6b888b3273e6c0597d2c2e3aaa0e46afa45\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-common-2.1.0.pom\">\n            <sha256 value=\"ab2b23f0cb72ec042c2b808fb18985a7ebe75a65aaa00527969e94325c6c006b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-common\" version=\"2.1.10\">\n         <artifact name=\"kotlin-scripting-common-2.1.10.jar\">\n            <sha256 value=\"477572086b7542d95db08c86637ac0edb9bf0d6b22ab9ba1340e41a048941079\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-common-2.1.10.pom\">\n            <sha256 value=\"0ff7977b082d6d59de055faaff60026558c9c59c65973b039d11b78b44af124a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-common\" version=\"2.1.20\">\n         <artifact name=\"kotlin-scripting-common-2.1.20.jar\">\n            <sha256 value=\"5fdbf6ae72237ce335d603eb12c49b09bc9c1a33c0c01f1d62e77ff33663cefb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-common-2.1.20.pom\">\n            <sha256 value=\"1f77709045dd905eb7505a94280d37ec757f08709cfe9f3a74aba73bbf99f79b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-common\" version=\"2.1.21\">\n         <artifact name=\"kotlin-scripting-common-2.1.21.jar\">\n            <sha256 value=\"4582e2a7c07f9533a9b4a6408a32a5f57965dfb145d646860ad867d4630843f1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-common-2.1.21.pom\">\n            <sha256 value=\"3b4e30f03b96edebb0d138630c223048de70e8c4082c90d06943eca24d41eed5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-compiler-embeddable\" version=\"2.0.0\">\n         <artifact name=\"kotlin-scripting-compiler-embeddable-2.0.0.jar\">\n            <sha256 value=\"1f914b74e4e135d52478d63210570f90dab04cc6a6f7d54e1f3ea8cf57a1a754\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-compiler-embeddable-2.0.0.pom\">\n            <sha256 value=\"072ff8c68f0a522837fa2c667071fbf7a7b3d9d6d3bc3b58d5a92f20d0af7c9b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-compiler-embeddable\" version=\"2.0.10\">\n         <artifact name=\"kotlin-scripting-compiler-embeddable-2.0.10.jar\">\n            <sha256 value=\"6c83faccacfc9ed71ade5e5ad1f22202a6b5be37deea10d2bc7df4dc3abdab3a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-compiler-embeddable-2.0.10.pom\">\n            <sha256 value=\"c4657896dadbcb3710884b7bb3342833b01934f29c84823549c2b7e23eaebd81\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-compiler-embeddable\" version=\"2.0.20\">\n         <artifact name=\"kotlin-scripting-compiler-embeddable-2.0.20.jar\">\n            <sha256 value=\"21ef303ab4b9e0f9f397c14896253aae490257bfb0dd50089c1c1c04f0187171\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-compiler-embeddable-2.0.20.pom\">\n            <sha256 value=\"cebf2cc119ae1cf26a3f6b440b189dc2baee852d27012534eaa36aacdb9ee152\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-compiler-embeddable\" version=\"2.0.21\">\n         <artifact name=\"kotlin-scripting-compiler-embeddable-2.0.21.jar\">\n            <sha256 value=\"2413c230fdd8cd47ebbeba273e4df94cf3b44cb3ec95d2cb35472c93768c9f1c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-compiler-embeddable-2.0.21.pom\">\n            <sha256 value=\"d4287a7d40f8f818abbf7cc9847e7f392782d147dbed6a8440e473bc4f6bf2e8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-compiler-embeddable\" version=\"2.1.0\">\n         <artifact name=\"kotlin-scripting-compiler-embeddable-2.1.0.jar\">\n            <sha256 value=\"b2abc6d959c915af92a289aed14a530eaf09e48613f283da0a4e8d3444340fc3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-compiler-embeddable-2.1.0.pom\">\n            <sha256 value=\"cbfaecdb0693983ab5b6aeab5e70813969f99a239c731c46f8f7404c055d7227\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-compiler-embeddable\" version=\"2.1.10\">\n         <artifact name=\"kotlin-scripting-compiler-embeddable-2.1.10.jar\">\n            <sha256 value=\"49e5fc84ad9be6ce5319466b38a1717d41a1e230d9e24db26fac48b1eeac4a8d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-compiler-embeddable-2.1.10.pom\">\n            <sha256 value=\"8ac23b5761680e5e6564789c64cbf110fe49597a7724da864024532df50dadca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-compiler-embeddable\" version=\"2.1.20\">\n         <artifact name=\"kotlin-scripting-compiler-embeddable-2.1.20.jar\">\n            <sha256 value=\"3d4f772b238414650017e97462256b7c4d5edfa1013cbf5477573eb1ac2e2884\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-compiler-embeddable-2.1.20.pom\">\n            <sha256 value=\"0fff7ff1d3bfa9cce3efbb4db38989c268a51eb67f81efd0311b8a64618b85a9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-compiler-embeddable\" version=\"2.1.21\">\n         <artifact name=\"kotlin-scripting-compiler-embeddable-2.1.21.jar\">\n            <sha256 value=\"b5b1e0f4062f91cfe216d70617e8af9774b5288fd819e0ce5f6050f8d86e92fa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-compiler-embeddable-2.1.21.pom\">\n            <sha256 value=\"4822d6f68ad42d9cd944fd735290a5bdb5cdf0fb1dd5da6ccc6e85fc08ed5df9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-compiler-impl-embeddable\" version=\"2.0.0\">\n         <artifact name=\"kotlin-scripting-compiler-impl-embeddable-2.0.0.jar\">\n            <sha256 value=\"98de5f7838914e6880ecaef3a6e08e5cb165f16629afa0a2df3550cf7f22d2bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-compiler-impl-embeddable-2.0.0.pom\">\n            <sha256 value=\"5bf861970ba3f7320df97e4e423727ae405aee331adf86486bbeb96eed908dc8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-compiler-impl-embeddable\" version=\"2.0.10\">\n         <artifact name=\"kotlin-scripting-compiler-impl-embeddable-2.0.10.jar\">\n            <sha256 value=\"97749ff32fce25ac35b2fd333080d34b6fc4d7a6b6ffb0499ece09ffebd123c8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-compiler-impl-embeddable-2.0.10.pom\">\n            <sha256 value=\"59b1ce034f400d1796d9b6fa96d9e463cff57831c63581096655b24eb74bfe92\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-compiler-impl-embeddable\" version=\"2.0.20\">\n         <artifact name=\"kotlin-scripting-compiler-impl-embeddable-2.0.20.jar\">\n            <sha256 value=\"5a06ae7303b54cbd177589d6105ba6bfd59b1b182eafb5b668725ff72a5fd32d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-compiler-impl-embeddable-2.0.20.pom\">\n            <sha256 value=\"cfa6a5f58389cb72b44912d3001a01f5ea8bfafc7999bafa0511b3eedfcb61d2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-compiler-impl-embeddable\" version=\"2.0.21\">\n         <artifact name=\"kotlin-scripting-compiler-impl-embeddable-2.0.21.jar\">\n            <sha256 value=\"6ed0fa5beb25466883989b5641f36809479260b7014535502fd387ce6c7ba833\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-compiler-impl-embeddable-2.0.21.pom\">\n            <sha256 value=\"d32b1bf24ba929a2fa32a6e344320fa7b9e7be06ce37fcf76ef3a6dc84e236b1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-compiler-impl-embeddable\" version=\"2.1.0\">\n         <artifact name=\"kotlin-scripting-compiler-impl-embeddable-2.1.0.jar\">\n            <sha256 value=\"8a900406012ba5eda8925856253f72235451db387f0ce50ed31d655c9e5c66d6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-compiler-impl-embeddable-2.1.0.pom\">\n            <sha256 value=\"8b549ab2aadab49d369bfe8f1806f71ff98ffafa1570672ad8f7a8b01b236c7b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-compiler-impl-embeddable\" version=\"2.1.10\">\n         <artifact name=\"kotlin-scripting-compiler-impl-embeddable-2.1.10.jar\">\n            <sha256 value=\"d7a9155f7053f9be1ce135f9ffc416e1168bb23d1509eb256285473fd39fff80\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-compiler-impl-embeddable-2.1.10.pom\">\n            <sha256 value=\"16427d0744590c78641fd472c11344be405b05c03c08d9a72044bfedd8d1ccc8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-compiler-impl-embeddable\" version=\"2.1.20\">\n         <artifact name=\"kotlin-scripting-compiler-impl-embeddable-2.1.20.jar\">\n            <sha256 value=\"f665d70b1a0837ff3a0ef7bec4fc5d9fed67ea75e4697de158eb51f1ea501c3f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-compiler-impl-embeddable-2.1.20.pom\">\n            <sha256 value=\"b639ae20d87a815e304ddd20a0e4c4937e13b5fc7a4267b5e15c0e5902298665\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-compiler-impl-embeddable\" version=\"2.1.21\">\n         <artifact name=\"kotlin-scripting-compiler-impl-embeddable-2.1.21.jar\">\n            <sha256 value=\"a1295f282b070c0cefdb968614f6f64aa71f1bdbe746f1edf63527407d5d96b1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-compiler-impl-embeddable-2.1.21.pom\">\n            <sha256 value=\"58cf3878a446d46f3f6040986b9c2b53d7f7a4d9de07ed2643335d580b837604\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-jvm\" version=\"2.0.0\">\n         <artifact name=\"kotlin-scripting-jvm-2.0.0.jar\">\n            <sha256 value=\"7f20010fba093904eed7a8b84938bf9934be4747ef25f676d17bc301bd139a62\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-jvm-2.0.0.pom\">\n            <sha256 value=\"0499bd736d62273065604f65b1632d5a0f2ff1b0309f079f0840f7f6e17ca107\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-jvm\" version=\"2.0.10\">\n         <artifact name=\"kotlin-scripting-jvm-2.0.10.jar\">\n            <sha256 value=\"5259a5173e2ea1b0256fb5ab994be50c18fdc15ed4f5b62edcf7e2579ecc9a7a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-jvm-2.0.10.pom\">\n            <sha256 value=\"bdc55e89a8e80aba9626704405690ddb62391ab8f1428c88a63152f44e97194e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-jvm\" version=\"2.0.20\">\n         <artifact name=\"kotlin-scripting-jvm-2.0.20.jar\">\n            <sha256 value=\"b0bb500f6333b4b16c8eb69ea394ef684f33453f8d3431034a8907a9f18db6f1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-jvm-2.0.20.pom\">\n            <sha256 value=\"9bcb8d1c23af726db52a936ba5b9177b2468292058c53f0291de4cc0da4ece1e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-jvm\" version=\"2.0.21\">\n         <artifact name=\"kotlin-scripting-jvm-2.0.21.jar\">\n            <sha256 value=\"88427f0f7a4c47845fa2221d29f6e0e0d7cbe73c3edf8bca30b4d8b3a336a77c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-jvm-2.0.21.pom\">\n            <sha256 value=\"a290858befb4299734f51b53ed9a9415a294e79ba6fc213c04c427cdc8799c0d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-jvm\" version=\"2.1.0\">\n         <artifact name=\"kotlin-scripting-jvm-2.1.0.jar\">\n            <sha256 value=\"c5a21b6d07ef677970b328f9ebff115282285e62c85fa1866e84e4d7be3a44a3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-jvm-2.1.0.pom\">\n            <sha256 value=\"f0dd3c1c8a8b1dc258b566668a2dbd777ed9ad48ccafa60ec1752480b54d347a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-jvm\" version=\"2.1.10\">\n         <artifact name=\"kotlin-scripting-jvm-2.1.10.jar\">\n            <sha256 value=\"95466da50f428c01bd836584d30c55a689861c93b3d9777874a6363d19cf2ddc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-jvm-2.1.10.pom\">\n            <sha256 value=\"ffea27a00a63a315fa6680d0724234c6db6e4893b8b8603a526b8d62e5be8dcd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-jvm\" version=\"2.1.20\">\n         <artifact name=\"kotlin-scripting-jvm-2.1.20.jar\">\n            <sha256 value=\"69f457acab98364c0eb578c497e0c3ca930b8cfb82be774049da04cde38087f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-jvm-2.1.20.pom\">\n            <sha256 value=\"3c4453391137ec455c74be496f71d9a498696d2549be64f59a60647ceee2553d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-scripting-jvm\" version=\"2.1.21\">\n         <artifact name=\"kotlin-scripting-jvm-2.1.21.jar\">\n            <sha256 value=\"b3fe1f72e9ad482d726f89e139f45c4afe7b3f80adfe4cdc91dcc0a22637978d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-scripting-jvm-2.1.21.pom\">\n            <sha256 value=\"821a8f101caca6381ada36f233b9c91fcc0886b3584f5eaa5cf3044849bab6a2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"1.7.10\">\n         <artifact name=\"kotlin-stdlib-1.7.10.pom\">\n            <sha256 value=\"6cc0cf5a2bc02dee060ebb90c3535fc3ddbd7a3bab210ace3e142aaf81764d81\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"1.8.20\">\n         <artifact name=\"kotlin-stdlib-1.8.20.pom\">\n            <sha256 value=\"c9c1efc4ba4b46c632e2a21e693258a3eced07ebeaa00af4d3c346d3990b201e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"1.8.21\">\n         <artifact name=\"kotlin-stdlib-1.8.21.jar\">\n            <sha256 value=\"042a1cd1ac976cdcfe5eb63f1d8e0b0b892c9248e15a69c8cfba495d546ea52a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-1.8.21.pom\">\n            <sha256 value=\"fe0cd9e32193e453333fd2b1f577e662fb5abc6907102bb967817bc131280fd7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"1.8.22\">\n         <artifact name=\"kotlin-stdlib-1.8.22.jar\">\n            <sha256 value=\"03a5c3965cc37051128e64e46748e394b6bd4c97fa81c6de6fc72bfd44e3421b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-1.8.22.pom\">\n            <sha256 value=\"596f4a62f3086ad98f0e78b3e257ba5b247cd313bffa9818e509696210e83a37\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"1.9.0\">\n         <artifact name=\"kotlin-stdlib-1.9.0.jar\">\n            <sha256 value=\"35aeffbe2db5aa446072cee50fcee48b7fa9e2fc51ca37c0cc7d7d0bc39d952e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-1.9.0.pom\">\n            <sha256 value=\"37752263f62cc3e3250856e288ee4a73d4102d726a77627034f94806c8c10aca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"1.9.10\">\n         <artifact name=\"kotlin-stdlib-1.9.10.jar\">\n            <sha256 value=\"55e989c512b80907799f854309f3bc7782c5b3d13932442d0379d5c472711504\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-1.9.10.pom\">\n            <sha256 value=\"7e29fbf73fdf71e0679d3dee7e680fd573464fa01644a4f58ab819d2c088d3d2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"1.9.20\">\n         <artifact name=\"kotlin-stdlib-1.9.20.jar\">\n            <sha256 value=\"28a35bcdff46d864f80f346a617e486284b208d17378c41900dfb1de95a90e6c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-1.9.20.module\">\n            <sha256 value=\"dccaa5d315470fab3920502886bbb85f2da6c86102c65d9c04410544eedb2019\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"1.9.21\">\n         <artifact name=\"kotlin-stdlib-1.9.21.jar\">\n            <sha256 value=\"3b479313ab6caea4e5e25d3dee8ca80c302c89ba73e1af4dafaa100f6ef9296a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-1.9.21.module\">\n            <sha256 value=\"d3019f7f0d71924ce47298c9cc46af0245f75219719b35c5915fbcc7e7a69395\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"1.9.22\">\n         <artifact name=\"kotlin-stdlib-1.9.22-all.jar\">\n            <sha256 value=\"cec38bc3302e72a8aaf9cde436b5a9071ee0331e2ad05e84d8bb897334d7e9d4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-1.9.22.module\">\n            <sha256 value=\"f482314b5079c1455f6fb0d4257a745d101c6124ce961522ba86f9dc90901e47\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"1.9.23\">\n         <artifact name=\"kotlin-stdlib-1.9.23.jar\">\n            <sha256 value=\"8910cc238807d86ef550cb1f0b10dd5ed40b35a4ec1a52525f760aede84ead37\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-1.9.23.module\">\n            <sha256 value=\"5195193b37dcdada2e1c0ab0d512c422b2ad76af3557843a1b9c3480f4e71d0e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"1.9.24\">\n         <artifact name=\"kotlin-stdlib-1.9.24.jar\">\n            <sha256 value=\"858b902696da9cf585ab9d98ffc1c2712269828354dfe9107e3711b084a36468\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-1.9.24.module\">\n            <sha256 value=\"f2e2a6573b5b5265c412d5c581fbf8ea00c62b10b9c92d5674c9e97f2f3335b3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"2.0.0\">\n         <artifact name=\"kotlin-stdlib-2.0.0-all.jar\">\n            <sha256 value=\"30e05222bc067fffb896a3276b5f1e3f29450bf1d9461d27a19ce0efc793b5cd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-2.0.0-sources.jar\">\n            <sha256 value=\"256f2c1caf3df558d6c41b79fb83add98edcc08436b821a80b5f17d806c664a1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-2.0.0.jar\">\n            <sha256 value=\"240938c4aab8e73e888703e3e7d3f87383ffe5bd536d6d5e3c100d4cd0379fcf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-2.0.0.module\">\n            <sha256 value=\"64f96ea8e7b9896731052241ffd3a265f8274d761e5fe9dc088ac45b31718341\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"2.0.0-Beta5\">\n         <artifact name=\"kotlin-stdlib-2.0.0-Beta5.jar\">\n            <sha256 value=\"bc97646d4a7c7f0b49e809fe65aa5d6c654d59f337ad0ce2a6180f5717697d69\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-2.0.0-Beta5.module\">\n            <sha256 value=\"6419ed63756bc7494ce6c4768dd91986c48f0756537533928b9ba0807ae85a39\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"2.0.10\">\n         <artifact name=\"kotlin-stdlib-2.0.10-all.jar\">\n            <sha256 value=\"30e05222bc067fffb896a3276b5f1e3f29450bf1d9461d27a19ce0efc793b5cd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-2.0.10.jar\">\n            <sha256 value=\"60f1cefbf1c101676abc9f413f569dad464929d7dc63d5e70e15ae26986e08ac\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-2.0.10.module\">\n            <sha256 value=\"319fd65cd4fe27603ada96a56af22c94c86f132e70b5b4ad00ef4b2b80b95bc9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"2.0.20\">\n         <artifact name=\"kotlin-stdlib-2.0.20-all.jar\">\n            <sha256 value=\"50ffadeb20b4d2456a526595a4f7a9e85889682715073e6cdba1b1d80e3ad458\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-2.0.20.jar\">\n            <sha256 value=\"fb169596659a518357c4b2c16f43dc75ab1c4980565ed4b4a317a050e5e39006\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-2.0.20.module\">\n            <sha256 value=\"dc051dc04c6a196f2d06d0d3c9af33b9f12bc9b4fe139ae1290140508236b67b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"2.0.21\">\n         <artifact name=\"kotlin-stdlib-2.0.21-all.jar\">\n            <sha256 value=\"50ffadeb20b4d2456a526595a4f7a9e85889682715073e6cdba1b1d80e3ad458\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-2.0.21.jar\">\n            <sha256 value=\"f31cc53f105a7e48c093683bbd5437561d1233920513774b470805641bedbc09\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-2.0.21.module\">\n            <sha256 value=\"81fd6d181012487ee3246eff4e2bacb64b58c46e5b5aa72971a4ddf1bd1541ed\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"2.1.0\">\n         <artifact name=\"kotlin-stdlib-2.1.0-all.jar\">\n            <sha256 value=\"a7412f66d71bcd2721c398307972fbb5f9409f945643eee05d1080b289a339cb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-2.1.0.jar\">\n            <sha256 value=\"d6f91b7b0f306cca299fec74fb7c34e4874d6f5ec5b925a0b4de21901e119c3f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-2.1.0.module\">\n            <sha256 value=\"dcfbc8e8bf32cd67a7efadd91d31152bce9870911d6ec50878f4fdb6e03e70e2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"2.1.10\">\n         <artifact name=\"kotlin-stdlib-2.1.10-all.jar\">\n            <sha256 value=\"a7412f66d71bcd2721c398307972fbb5f9409f945643eee05d1080b289a339cb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-2.1.10.jar\">\n            <sha256 value=\"5f2ac1ca8dc8b37a3f4314e716d36969ebf0227a75181d32699d0a8f645b1c21\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-2.1.10.module\">\n            <sha256 value=\"8d2c1d717c73546d56382d136c8650b59a7159940172263818934ace44cb048d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"2.1.20\">\n         <artifact name=\"kotlin-stdlib-2.1.20-all.jar\">\n            <sha256 value=\"81e07de34e84b29e14f3fdef902f4bc4cf1d5da959b867df683fbe1cc54ce1e1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-2.1.20.jar\">\n            <sha256 value=\"1bcc74e8ce84e2c25eaafde10f1248349cce3062b6e36978cbeec610db1e930a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-2.1.20.module\">\n            <sha256 value=\"55d296e45445f6c88699b0896706ea9550af87ad94873dc13b65bebbd5660a6f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib\" version=\"2.1.21\">\n         <artifact name=\"kotlin-stdlib-2.1.21-all.jar\">\n            <sha256 value=\"81e07de34e84b29e14f3fdef902f4bc4cf1d5da959b867df683fbe1cc54ce1e1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-2.1.21.jar\">\n            <sha256 value=\"263bdc679e1f62012db7b091796279b6d71cf36f4797a98ff1ace05835f201c8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-2.1.21.module\">\n            <sha256 value=\"0d3735043d68b7a5afb44d27de65f80a9d2b208462709c2edbb48fd5b395ad8a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-common\" version=\"1.7.10\">\n         <artifact name=\"kotlin-stdlib-common-1.7.10.pom\">\n            <sha256 value=\"1011c63b88ee94cdff5d596937307559bc55037b733cc00ce63cda3cfae0a8eb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-common\" version=\"1.8.20\">\n         <artifact name=\"kotlin-stdlib-common-1.8.20.pom\">\n            <sha256 value=\"605591b89b372127e6b29c69325fa2f6a8c46f468c45d09410e78eb59fc80a17\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-common\" version=\"1.8.21\">\n         <artifact name=\"kotlin-stdlib-common-1.8.21.jar\">\n            <sha256 value=\"6a44c9ecc9d7754d9e943fb1e3588c74d4a3f1785be51074f49d6c5723682a73\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-common-1.8.21.pom\">\n            <sha256 value=\"e19a5577cbcea89728970db5333c8264c8c69ae722eeb79cbf41d5f0b0c9ae65\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-common\" version=\"1.8.22\">\n         <artifact name=\"kotlin-stdlib-common-1.8.22.jar\">\n            <sha256 value=\"d0c2365e2437ef70f34586d50f055743f79716bcfe65e4bc7239cdd2669ef7c5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-common-1.8.22.pom\">\n            <sha256 value=\"a72b11df08b5322d7a5e8e620789ee3e4cfef38e86c430e7d113bfa9e54c581e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-common\" version=\"1.9.0\">\n         <artifact name=\"kotlin-stdlib-common-1.9.0.jar\">\n            <sha256 value=\"283274204bd7c020789ec46f8f8e72af4244d7f550b3392a57e5ca006ad7aa2c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-common-1.9.0.pom\">\n            <sha256 value=\"3660d36a70feb3abe49f11b90633e41d36273576f071b0e109da9b3a0df082a5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-common\" version=\"1.9.10\">\n         <artifact name=\"kotlin-stdlib-common-1.9.10.jar\">\n            <sha256 value=\"cde3341ba18a2ba262b0b7cf6c55b20c90e8d434e42c9a13e6a3f770db965a88\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-common-1.9.10.pom\">\n            <sha256 value=\"7d4b70547910676b3bdfc8925a88f3b6bfb24582c9784542805544ceef490a92\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-common\" version=\"1.9.20\">\n         <artifact name=\"kotlin-stdlib-common-1.9.20.module\">\n            <sha256 value=\"858828bc5191b9e602affa14e01d66489dafb08c4c18d2faee3cbed7ba7d9992\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-common\" version=\"1.9.21\">\n         <artifact name=\"kotlin-stdlib-common-1.9.21.module\">\n            <sha256 value=\"68dc8e84aa05f5278c16505247d71346d3512b9edadd41f613d657c94c59993b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-common\" version=\"1.9.22\">\n         <artifact name=\"kotlin-stdlib-common-1.9.22.module\">\n            <sha256 value=\"f93c9e9abf8d52d8e8fd8e851aa802ecec55132161c4aeee7d3cd924bf794246\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-common\" version=\"2.0.0\">\n         <artifact name=\"kotlin-stdlib-common-2.0.0.module\">\n            <sha256 value=\"2335187440c51d0d69e1b906fefc31f6169691c8598177b0e610c9b9a92ce6b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-common\" version=\"2.0.10\">\n         <artifact name=\"kotlin-stdlib-common-2.0.10.module\">\n            <sha256 value=\"ab210c7fce363f8d8facec3d7e8f764bd09e6cf8fbad7c9e3c047567c5de05fc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-common\" version=\"2.0.20\">\n         <artifact name=\"kotlin-stdlib-common-2.0.20.module\">\n            <sha256 value=\"b597b705efd4e2d827142090c36054265548ed51b4f52377f2bf89c4594d536f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-common\" version=\"2.0.21\">\n         <artifact name=\"kotlin-stdlib-common-2.0.21.module\">\n            <sha256 value=\"6f5df8af633600a6b9cfb0fcc764af3d5119f376677677b91b6aee816b1d30ab\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-common\" version=\"2.1.0\">\n         <artifact name=\"kotlin-stdlib-common-2.1.0.module\">\n            <sha256 value=\"2b9a5ae785f8513a93f8cec3f6e5e07f8b1766f8497b3a487f3441a251d67563\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-common\" version=\"2.1.10\">\n         <artifact name=\"kotlin-stdlib-common-2.1.10.module\">\n            <sha256 value=\"7e0ba5dd49599ce276c286be334858f251284a20f76db9bc0f5da0fbc99bb5f5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-common\" version=\"2.1.20\">\n         <artifact name=\"kotlin-stdlib-common-2.1.20.module\">\n            <sha256 value=\"94d0ad2b2319b85c40351cf9ee7077da12dd3850392e6cf10a3fe8159fbc73f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-common\" version=\"2.1.21\">\n         <artifact name=\"kotlin-stdlib-common-2.1.21.module\">\n            <sha256 value=\"a4d8fc14cedb3779843a47fbce522fd173e9875091964dbac1b8dd7884f6c1f9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk7\" version=\"1.8.20\">\n         <artifact name=\"kotlin-stdlib-jdk7-1.8.20.jar\">\n            <sha256 value=\"af1ec40c3b951afdcc0c2a0173c7b81763c5281c2d5bafbf0a8544a24c5dcc0c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk7-1.8.20.pom\">\n            <sha256 value=\"3622d106578cddcc0a9ec20f8ce815f7f49ff542f640228d2141fcaf80616b06\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk7\" version=\"1.8.21\">\n         <artifact name=\"kotlin-stdlib-jdk7-1.8.21.jar\">\n            <sha256 value=\"33d148db0e11debd0d90677d28242bced907f9c77730000fd597867089039d86\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk7-1.8.21.pom\">\n            <sha256 value=\"9bb107d5d5e3930bc5977f007a43cd20b7d24d91b1c1e528ea6ee0f248f14d36\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk7\" version=\"1.8.22\">\n         <artifact name=\"kotlin-stdlib-jdk7-1.8.22.jar\">\n            <sha256 value=\"055f5cb24287fa106100995a7b47ab92126b81e832e875f5fa2cf0bd55693d0b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk7-1.8.22.pom\">\n            <sha256 value=\"4f958aa993d5984f8f5ebed4146562a5f3a9f695b6049c9f287381379cadab33\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk7\" version=\"1.9.0\">\n         <artifact name=\"kotlin-stdlib-jdk7-1.9.0.jar\">\n            <sha256 value=\"b7979a7aac94055f0d9f1fd3b47ce5ffe1cb6032a842ba9fbe7186f085289178\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk7-1.9.0.pom\">\n            <sha256 value=\"c11074f0c898a98b863c614471d438d3df92a1ec3382a6e37f935d7d71954b5a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk7\" version=\"1.9.10\">\n         <artifact name=\"kotlin-stdlib-jdk7-1.9.10.jar\">\n            <sha256 value=\"ac6361bf9ad1ed382c2103d9712c47cdec166232b4903ed596e8876b0681c9b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk7-1.9.10.pom\">\n            <sha256 value=\"c7fa67c7961320b89d85a3ca59a2e18c2c65850845595dcae4b46af6945edcd5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk7\" version=\"1.9.20\">\n         <artifact name=\"kotlin-stdlib-jdk7-1.9.20.jar\">\n            <sha256 value=\"c5451d67a27f33afd09913c67e1ceba3897ae70884b24ef0ff71157e55b60865\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk7-1.9.20.pom\">\n            <sha256 value=\"012e1c55ed6ade417bcb824112ebea682ad625dfbee16085c379ccfa14faf033\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk7\" version=\"1.9.24\">\n         <artifact name=\"kotlin-stdlib-jdk7-1.9.24.jar\">\n            <sha256 value=\"b6699b850ba0789f2e904279cd8bdc7bea9130ffd157cdba001fc7425d8a47b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk7-1.9.24.pom\">\n            <sha256 value=\"4586a937d5bcbc3ab3042c0409a1c729614bcba3c7a7296f252d626ee37387d4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk7\" version=\"2.0.0\">\n         <artifact name=\"kotlin-stdlib-jdk7-2.0.0.jar\">\n            <sha256 value=\"dd958064f946b01f745365c2efa11e4c5812a22e26b6caa4433f207fb5b4a5c5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk7-2.0.0.pom\">\n            <sha256 value=\"1ea14bf50d37b24cee99b3bbeca0e24a07ff361d906bb20067cf41606e143096\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk7\" version=\"2.0.21\">\n         <artifact name=\"kotlin-stdlib-jdk7-2.0.21.jar\">\n            <sha256 value=\"712f480760edeee48a84369e6be89f6ab52375408bb2ca3be14ef663f72bee31\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk7-2.0.21.pom\">\n            <sha256 value=\"4d713e7538b92a1d79717ea71cf1d02357a84e11450c46cb92e32079ee34db6e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk7\" version=\"2.1.0\">\n         <artifact name=\"kotlin-stdlib-jdk7-2.1.0.jar\">\n            <sha256 value=\"fdea6c4203724f42e8e64bef2f0bf79129ccd1df1edf1ccffdc22de7df498c76\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk7-2.1.0.pom\">\n            <sha256 value=\"06fbc14ecb14a0af47b5a3f8d34763f4933d5cba5a3d245045bfe2f2bdb91b1e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk7\" version=\"2.1.20\">\n         <artifact name=\"kotlin-stdlib-jdk7-2.1.20.jar\">\n            <sha256 value=\"5343bf795783932e5fa538b0bca05af810bb07213edb9baa770c784068f57867\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk7-2.1.20.pom\">\n            <sha256 value=\"dcf3de1ba53393a449c789f1e515f9aa88c603a6d356a480ea42ff7d4a98b737\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk8\" version=\"1.8.20\">\n         <artifact name=\"kotlin-stdlib-jdk8-1.8.20.jar\">\n            <sha256 value=\"e398b67977622718bf18ff99b739c7d9da060f33fb458a2e25203221c16af010\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk8-1.8.20.pom\">\n            <sha256 value=\"3a462214a336e995687769531b1e37b0c81d8e10c9949cd5ea7ae1d7803a0232\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk8\" version=\"1.8.21\">\n         <artifact name=\"kotlin-stdlib-jdk8-1.8.21.jar\">\n            <sha256 value=\"3db752a30074f06ee6c57984aa6f27da44f4d2bbc7f5442651f6988f1cb2b7d7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk8-1.8.21.pom\">\n            <sha256 value=\"3839d728d7c309a5c368b0270b44b4f1c7878ff5ca5d32a9a204faa3491459d8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk8\" version=\"1.8.22\">\n         <artifact name=\"kotlin-stdlib-jdk8-1.8.22.jar\">\n            <sha256 value=\"4198b0eaf090a4f25b6f7e5a59581f4314ba8c9f6cd1d13ee9d348e65ed8f707\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk8-1.8.22.pom\">\n            <sha256 value=\"928f2187217476313cb816d48070bc7654aa3b9a5ae81d3fc5f8c279cc8f8d9e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk8\" version=\"1.9.0\">\n         <artifact name=\"kotlin-stdlib-jdk8-1.9.0.jar\">\n            <sha256 value=\"a59fa24fdf1ffb594baecdbf0fd10010f977cea10236d487fe3464977a7377fa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk8-1.9.0.pom\">\n            <sha256 value=\"64d598dd88e250466731e20304ab6f06cbbbbab7ee322b4703b6b59f881c4f92\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk8\" version=\"1.9.10\">\n         <artifact name=\"kotlin-stdlib-jdk8-1.9.10.jar\">\n            <sha256 value=\"a4c74d94d64ce1abe53760fe0389dd941f6fc558d0dab35e47c085a11ec80f28\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk8-1.9.10.pom\">\n            <sha256 value=\"5f4b94dd3065a7764c37fa15de2ad6d81f40d59f8cb33f17d181c6384fb7a72e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk8\" version=\"1.9.20\">\n         <artifact name=\"kotlin-stdlib-jdk8-1.9.20.jar\">\n            <sha256 value=\"f833fcc94f0bb1c31b9e78bd4bda7ea23f579ff3408ae1a94e2eb5747086a2ab\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk8-1.9.20.pom\">\n            <sha256 value=\"a3b07deb091f2aed59d6559884f44f99cff5df9b9fa35a24bcd6b8b069cff48d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk8\" version=\"1.9.24\">\n         <artifact name=\"kotlin-stdlib-jdk8-1.9.24.jar\">\n            <sha256 value=\"5b5bbfb3e1184b5e13317c3d42237fa24add443b2e7781961eea334db136adb1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk8-1.9.24.pom\">\n            <sha256 value=\"06e06def49f96aaf6e5c3ec42836ae59d6e2da6254700914281675679dc9f2a5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk8\" version=\"2.0.0\">\n         <artifact name=\"kotlin-stdlib-jdk8-2.0.0.jar\">\n            <sha256 value=\"92035a0fa8b97a97bb430d30ba03e5ad51f4cfa839cf1559e55245cba735aa94\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk8-2.0.0.pom\">\n            <sha256 value=\"afe5006f9d2bb7a26a1f1b92b007a871be26dd82fadbbb2cca9f3757534c5b83\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk8\" version=\"2.0.21\">\n         <artifact name=\"kotlin-stdlib-jdk8-2.0.21.jar\">\n            <sha256 value=\"15c8c0acb311483c068d1697501965474b70dfd80ac79580eca3a03cf51e4a1d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk8-2.0.21.pom\">\n            <sha256 value=\"310d6d5c65413e3110b9402bd8075fcae3f4be519d1fd9073136a18fe727bc57\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-stdlib-jdk8\" version=\"2.1.0\">\n         <artifact name=\"kotlin-stdlib-jdk8-2.1.0.jar\">\n            <sha256 value=\"238d3c7e492f119b50da1c22546dd762462e55f22409611f5e53dd77625cd544\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-stdlib-jdk8-2.1.0.pom\">\n            <sha256 value=\"e762b8c45690ae8a6a35df584f54be9c9da65885e61a905426aeafca5937e1ce\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-tooling-core\" version=\"2.0.0\">\n         <artifact name=\"kotlin-tooling-core-2.0.0.jar\">\n            <sha256 value=\"73464aa3c214567013a4373f09e7b6f0b63185b3a6df6988b347430d7777a971\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-tooling-core-2.0.0.pom\">\n            <sha256 value=\"cf6255cbe64be5cfad16dd9a037e504264496c57c4f755e2f3527ab45aa166ba\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-tooling-core\" version=\"2.0.10\">\n         <artifact name=\"kotlin-tooling-core-2.0.10.jar\">\n            <sha256 value=\"73464aa3c214567013a4373f09e7b6f0b63185b3a6df6988b347430d7777a971\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-tooling-core-2.0.10.pom\">\n            <sha256 value=\"86c937110cd079698b20bead4d5fad822bc302fcf8d0dfc9165adafd0a352431\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-tooling-core\" version=\"2.0.20\">\n         <artifact name=\"kotlin-tooling-core-2.0.20.jar\">\n            <sha256 value=\"5b6f148548fe9e074df51f4225344433bf0375ac5b39ffcd3d7bd7d7f602d629\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-tooling-core-2.0.20.pom\">\n            <sha256 value=\"5e123111e0107b04664883a0a408c1ff3bdb5d047e4901f82f4c42f10578062d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-tooling-core\" version=\"2.0.21\">\n         <artifact name=\"kotlin-tooling-core-2.0.21.jar\">\n            <sha256 value=\"5b6f148548fe9e074df51f4225344433bf0375ac5b39ffcd3d7bd7d7f602d629\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-tooling-core-2.0.21.pom\">\n            <sha256 value=\"32255efe8fcf11297bd373a8cc77f8b185d73984e91b189e79166529bdfa5d5a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-tooling-core\" version=\"2.1.0\">\n         <artifact name=\"kotlin-tooling-core-2.1.0.jar\">\n            <sha256 value=\"4176c612098cb92df38a485ff8b10aaa24abb400f610d48f5088aeb07c8002c8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-tooling-core-2.1.0.pom\">\n            <sha256 value=\"a5a4e9f54a413cdb2c1d140c349b559f684b0da8b0216a0a5645206f3fc581af\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-tooling-core\" version=\"2.1.10\">\n         <artifact name=\"kotlin-tooling-core-2.1.10.jar\">\n            <sha256 value=\"4176c612098cb92df38a485ff8b10aaa24abb400f610d48f5088aeb07c8002c8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-tooling-core-2.1.10.pom\">\n            <sha256 value=\"a3d296e6c341290cb7ea285b3429d78d2c2212da30df7f46d94715f340f5249e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-tooling-core\" version=\"2.1.20\">\n         <artifact name=\"kotlin-tooling-core-2.1.20.jar\">\n            <sha256 value=\"b4fbb523e8662d4a8451b9a36a9e7fd43f637cb0cd6a9b9e3681719665dabd8d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-tooling-core-2.1.20.pom\">\n            <sha256 value=\"3cef1c4b7c82eca8cc01c30caedd1549059e65f2f9d4162c8c9d77fba2413176\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-tooling-core\" version=\"2.1.21\">\n         <artifact name=\"kotlin-tooling-core-2.1.21.jar\">\n            <sha256 value=\"b4fbb523e8662d4a8451b9a36a9e7fd43f637cb0cd6a9b9e3681719665dabd8d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-tooling-core-2.1.21.pom\">\n            <sha256 value=\"45dccd36fb20cf4076f1738c99bcedf7cadd7775ed8bc716a2982bd15ce96830\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-io\" version=\"2.0.0\">\n         <artifact name=\"kotlin-util-io-2.0.0.jar\">\n            <sha256 value=\"088e45d9522db6406f0b1e4ed328389c9b5992a9567cd91b57ae21c1b9221610\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-io-2.0.0.pom\">\n            <sha256 value=\"c2cf75fd427eb63b7d321f4f10914675fe63320a90595f465a82cc5a1b64f4f7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-io\" version=\"2.0.10\">\n         <artifact name=\"kotlin-util-io-2.0.10.jar\">\n            <sha256 value=\"e3ba3ddc321a0e8f90555834192f0c05267c93d0333ac802b39e6955baa15ecd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-io-2.0.10.pom\">\n            <sha256 value=\"f27c0dfb7acae4810890f6299dfc7e77107154695472177268b178c70eba7b12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-io\" version=\"2.0.20\">\n         <artifact name=\"kotlin-util-io-2.0.20.jar\">\n            <sha256 value=\"6464db8d4172c21a17a790b6d1789022ed67adb37c50be6b8b9f582b552b8522\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-io-2.0.20.pom\">\n            <sha256 value=\"2eb07155fa84178e995639ce7b76917287cae542a35d29b56bb099101d286a3c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-io\" version=\"2.0.21\">\n         <artifact name=\"kotlin-util-io-2.0.21.jar\">\n            <sha256 value=\"0efee4c20f3e7f912b31c796c4e47f9d14ea68803ec7ed4e5d4f24258e3aa61e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-io-2.0.21.pom\">\n            <sha256 value=\"e200f91767db08526c8d94addce07b90f3425414b04ecfd7ccf8e41c9f1098a0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-io\" version=\"2.1.0\">\n         <artifact name=\"kotlin-util-io-2.1.0.jar\">\n            <sha256 value=\"001a50db3da0a89a954db615fcb0e3f4a81a5341d407060ea88c9356f10f23e1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-io-2.1.0.pom\">\n            <sha256 value=\"ec557203d9248a3701e1665a256cf1e91691733d95fdf2f18f39e8a8ec93c7a1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-io\" version=\"2.1.10\">\n         <artifact name=\"kotlin-util-io-2.1.10.jar\">\n            <sha256 value=\"44b595ed5b4a12aaa7dd6bf8cd8b5603e12edd4d329219113e52685f8c43edca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-io-2.1.10.pom\">\n            <sha256 value=\"ca39a6a350a390412f285f5459c979adb92490879306498e4e3758c312d3fa2b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-io\" version=\"2.1.20\">\n         <artifact name=\"kotlin-util-io-2.1.20.jar\">\n            <sha256 value=\"82a3b29a611d47ce634ae2e6c509cde2a86f94b23b86be30864eb3d4b8fe8e7e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-io-2.1.20.pom\">\n            <sha256 value=\"7924277ed2020b8510d45f0dd10811126568103007d83f9971fc184660bd84a3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-io\" version=\"2.1.21\">\n         <artifact name=\"kotlin-util-io-2.1.21.jar\">\n            <sha256 value=\"e372492a2b0556d62fd038e3edfc4531b55065486ce28d04f47063d2bc030c1c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-io-2.1.21.pom\">\n            <sha256 value=\"5f37d25ae243a6b105007a07d7c8f459de337a9f387cc8b3eb754f98d642a00e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-klib\" version=\"2.0.0\">\n         <artifact name=\"kotlin-util-klib-2.0.0.jar\">\n            <sha256 value=\"95f1a677e8d24bc0b32e76783ef173c5c0e09ed41b50471736d6599bed19d875\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-klib-2.0.0.pom\">\n            <sha256 value=\"0b9321f812048eecd0391765c882188fb7ea0f30ea84f8cf6874ab58371ee21f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-klib\" version=\"2.0.10\">\n         <artifact name=\"kotlin-util-klib-2.0.10.jar\">\n            <sha256 value=\"1c5c9429e75878f8e407596df9bbe8b3e1a37dc9fa194efae07d46a931b608cf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-klib-2.0.10.pom\">\n            <sha256 value=\"914b59becc3b3d0bfcc0aaf3e5e3333f318552ed34f691b5eec7c7f5e9833bcc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-klib\" version=\"2.0.20\">\n         <artifact name=\"kotlin-util-klib-2.0.20.jar\">\n            <sha256 value=\"87dd838dc77782cb9567f1a761499b3e4a50f528c005b2638a2e3e57410a963b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-klib-2.0.20.pom\">\n            <sha256 value=\"7db4d1c3bda6759be27ee937e607e8b1c46958dc08477132fdaeede016e738ff\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-klib\" version=\"2.0.21\">\n         <artifact name=\"kotlin-util-klib-2.0.21.jar\">\n            <sha256 value=\"a13b73896554b48e4bef4d8a4630ea7e940149ac4cadccac06914639146549ea\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-klib-2.0.21.pom\">\n            <sha256 value=\"ef6e275998943b96f58a64964085320f103174d609ec66a4a949e60123c798f5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-klib\" version=\"2.1.0\">\n         <artifact name=\"kotlin-util-klib-2.1.0.jar\">\n            <sha256 value=\"6260a30e876a162d8268faaff6aa2d451e7bba008a03522075792a4e71a61c29\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-klib-2.1.0.pom\">\n            <sha256 value=\"9ebfbbc73137f4d19883df909255adbfc6d13d8fa7ec9ef47066a3b688c96cdc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-klib\" version=\"2.1.10\">\n         <artifact name=\"kotlin-util-klib-2.1.10.jar\">\n            <sha256 value=\"c1f073315cef90b68f23ebed6847d67f19f2f802d1dd446d3644c1af28402876\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-klib-2.1.10.pom\">\n            <sha256 value=\"69719608db1a898083e643abe4647b952e3bd6d40ac52ef81a7f3166cc0edf80\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-klib\" version=\"2.1.20\">\n         <artifact name=\"kotlin-util-klib-2.1.20.jar\">\n            <sha256 value=\"ff79c5b0e6e42d920ebb1c76ba10cc2ddbf224e805645a8eeacade4916e2aace\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-klib-2.1.20.pom\">\n            <sha256 value=\"a6cdd38d775dfd07d07bd159d342cf7a0a96838a87e7482e220c63aed96e1280\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-klib\" version=\"2.1.21\">\n         <artifact name=\"kotlin-util-klib-2.1.21.jar\">\n            <sha256 value=\"a524831e9795d3e756d4de54cbd5b210de8097dad7c478abc957ae3f60e0a716\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-klib-2.1.21.pom\">\n            <sha256 value=\"0b3788a124a4715326fa8677885cfb29891fef78cb2b16ce0613ff241099f518\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-klib-metadata\" version=\"2.1.0\">\n         <artifact name=\"kotlin-util-klib-metadata-2.1.0.jar\">\n            <sha256 value=\"1a8a58974132dbf08193336a45c9350749a1af489667a199da3ebb3a8849907d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-klib-metadata-2.1.0.pom\">\n            <sha256 value=\"e329322576dc1ca8cbe20a3afe4fd1f5724da3b95349b5538cd03b184ff971c2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-klib-metadata\" version=\"2.1.10\">\n         <artifact name=\"kotlin-util-klib-metadata-2.1.10.jar\">\n            <sha256 value=\"a1bc60c265754a9174eac07b246ee3b6ccb3e27856a12f0e5ed01a26873a0c5e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-klib-metadata-2.1.10.pom\">\n            <sha256 value=\"af4137568673310b0e951a4648dd09a89b98e5c2390a5d8eee9e476fbb42453f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-klib-metadata\" version=\"2.1.20\">\n         <artifact name=\"kotlin-util-klib-metadata-2.1.20.jar\">\n            <sha256 value=\"f2d5e684715b920b6084968e6c33c8bb05b0b6b97919800e2f221d9418240c7d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-klib-metadata-2.1.20.pom\">\n            <sha256 value=\"842755b95c31db4bdb92cf6d42c8541a1701fa2bdcf2521a8706bcb032a0a197\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin\" name=\"kotlin-util-klib-metadata\" version=\"2.1.21\">\n         <artifact name=\"kotlin-util-klib-metadata-2.1.21.jar\">\n            <sha256 value=\"94c7fcb40405f56482400baa235c96e81010c1e043bff6300b70b34e5ea8d9bb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlin-util-klib-metadata-2.1.21.pom\">\n            <sha256 value=\"7a87b3ad66dd27a80a0335afdd1f478a3dd2ae576a9a943bb1f376391bf8df91\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin.android\" name=\"org.jetbrains.kotlin.android.gradle.plugin\" version=\"2.0.0\">\n         <artifact name=\"org.jetbrains.kotlin.android.gradle.plugin-2.0.0.pom\">\n            <sha256 value=\"82549d03a6f5dbd67afb0901d8b77cd402ec3ab9d6223a91de604beadddce1f8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin.android\" name=\"org.jetbrains.kotlin.android.gradle.plugin\" version=\"2.0.10\">\n         <artifact name=\"org.jetbrains.kotlin.android.gradle.plugin-2.0.10.pom\">\n            <sha256 value=\"d06e585ba8b771322b78f8fb0adc22501a265bafc20b8da0916ed4cf1482cdcb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin.android\" name=\"org.jetbrains.kotlin.android.gradle.plugin\" version=\"2.0.20\">\n         <artifact name=\"org.jetbrains.kotlin.android.gradle.plugin-2.0.20.pom\">\n            <sha256 value=\"c4ae1a10ed9218d622bce0aabc0eddf49b2731a8516d68e1cdf845a570f91c1a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin.android\" name=\"org.jetbrains.kotlin.android.gradle.plugin\" version=\"2.0.21\">\n         <artifact name=\"org.jetbrains.kotlin.android.gradle.plugin-2.0.21.pom\">\n            <sha256 value=\"9d841037c59644dc5bbe814e792ed8774eb48646f0b3a779604ee5c1b307f969\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin.android\" name=\"org.jetbrains.kotlin.android.gradle.plugin\" version=\"2.1.0\">\n         <artifact name=\"org.jetbrains.kotlin.android.gradle.plugin-2.1.0.pom\">\n            <sha256 value=\"96e007b3ecb22cc6d9617e414484539fe5b77b28e6659c8c916b4fddf8961ced\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin.android\" name=\"org.jetbrains.kotlin.android.gradle.plugin\" version=\"2.1.10\">\n         <artifact name=\"org.jetbrains.kotlin.android.gradle.plugin-2.1.10.pom\">\n            <sha256 value=\"cb0e40af0ca427027fc777852bee3e03fd1a571000779c5e528441e61cd0af36\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin.android\" name=\"org.jetbrains.kotlin.android.gradle.plugin\" version=\"2.1.20\">\n         <artifact name=\"org.jetbrains.kotlin.android.gradle.plugin-2.1.20.pom\">\n            <sha256 value=\"c967697eb83205c45153c86d79a662f1c4b66a01cdee9f7fdd07bb934029a135\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin.android\" name=\"org.jetbrains.kotlin.android.gradle.plugin\" version=\"2.1.21\">\n         <artifact name=\"org.jetbrains.kotlin.android.gradle.plugin-2.1.21.pom\">\n            <sha256 value=\"c9027c3c5bef33e8ee4d5d61543a1043e9552b79f0f3ad4452574f80239cd832\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin.plugin.parcelize\" name=\"org.jetbrains.kotlin.plugin.parcelize.gradle.plugin\" version=\"2.0.0\">\n         <artifact name=\"org.jetbrains.kotlin.plugin.parcelize.gradle.plugin-2.0.0.pom\">\n            <sha256 value=\"c96cb56fc41ad5298cf93117ab438999bb4d661e3e596ee9d4eafb9017c84150\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin.plugin.parcelize\" name=\"org.jetbrains.kotlin.plugin.parcelize.gradle.plugin\" version=\"2.0.10\">\n         <artifact name=\"org.jetbrains.kotlin.plugin.parcelize.gradle.plugin-2.0.10.pom\">\n            <sha256 value=\"7879f938e73aab3561349e4c7e4ae5c917fce6144c15026e9464656b4b47771e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin.plugin.parcelize\" name=\"org.jetbrains.kotlin.plugin.parcelize.gradle.plugin\" version=\"2.0.20\">\n         <artifact name=\"org.jetbrains.kotlin.plugin.parcelize.gradle.plugin-2.0.20.pom\">\n            <sha256 value=\"2d517a39a294c4b1b8715ee5762ca1431fc40cbf95579292ad24d4e41e259c59\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin.plugin.parcelize\" name=\"org.jetbrains.kotlin.plugin.parcelize.gradle.plugin\" version=\"2.0.21\">\n         <artifact name=\"org.jetbrains.kotlin.plugin.parcelize.gradle.plugin-2.0.21.pom\">\n            <sha256 value=\"449d7ad7c4815ac7ef64a9c2c173ab262019f16e39abf10fc7fc13bf204cf362\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin.plugin.parcelize\" name=\"org.jetbrains.kotlin.plugin.parcelize.gradle.plugin\" version=\"2.1.0\">\n         <artifact name=\"org.jetbrains.kotlin.plugin.parcelize.gradle.plugin-2.1.0.pom\">\n            <sha256 value=\"8d63aa1547dc4fc8d54d81427fcdb5b3d2e3139e694abaa8a654f29354895506\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin.plugin.parcelize\" name=\"org.jetbrains.kotlin.plugin.parcelize.gradle.plugin\" version=\"2.1.10\">\n         <artifact name=\"org.jetbrains.kotlin.plugin.parcelize.gradle.plugin-2.1.10.pom\">\n            <sha256 value=\"985849c73c2d8c4ef1efe0976d904ff9db4f34fc2e2b8cb8a93c510918285582\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin.plugin.parcelize\" name=\"org.jetbrains.kotlin.plugin.parcelize.gradle.plugin\" version=\"2.1.20\">\n         <artifact name=\"org.jetbrains.kotlin.plugin.parcelize.gradle.plugin-2.1.20.pom\">\n            <sha256 value=\"93a253cb71abf6fac40bbd7b3b8b452359187ee7ec6651849ef29453d4b95827\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlin.plugin.parcelize\" name=\"org.jetbrains.kotlin.plugin.parcelize.gradle.plugin\" version=\"2.1.21\">\n         <artifact name=\"org.jetbrains.kotlin.plugin.parcelize.gradle.plugin-2.1.21.pom\">\n            <sha256 value=\"04463ab694ae847d784dca6fe72823a75d29b0c7e7f3da431241be92f87c04c2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"atomicfu\" version=\"0.17.0\">\n         <artifact name=\"atomicfu-0.17.0.module\">\n            <sha256 value=\"12e828b1269614b2e50adfaf0d834c98ba5bba782b93fd157ce1e0a35e60cc0b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"atomicfu\" version=\"0.20.2\">\n         <artifact name=\"atomicfu-0.20.2.module\">\n            <sha256 value=\"2c995e0e83c583e125706fba3fe85170020d17a88f89d6294a53cd8bd7c4c384\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"atomicfu-metadata-0.20.2-all.jar\">\n            <sha256 value=\"2a91f10b826d3febc47c2b664e268615757c311114239787f5dc37481fdec441\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"atomicfu\" version=\"0.22.0\">\n         <artifact name=\"atomicfu-0.22.0.module\">\n            <sha256 value=\"5c876ef7e1ee07dd30721c43b46ead8eda23ce2b22260e70f933cbe004e80607\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"atomicfu\" version=\"0.23.1\">\n         <artifact name=\"atomicfu-0.23.1.module\">\n            <sha256 value=\"3e891fe636b55108192100fcf38b1a39bcd1c2533e23c462fc07644eeafcb20f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"atomicfu-metadata-0.23.1.jar\">\n            <sha256 value=\"7db8660ebe4b91bb478edb3616c4e3a50ba59c07dca517d1e1284c03fe86ac57\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"atomicfu-jvm\" version=\"0.22.0\">\n         <artifact name=\"atomicfu-jvm-0.22.0.jar\">\n            <sha256 value=\"2da073727f3ab5e5584e74c12e11519c908ae2dfaf6aeb25ded42b6682297882\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"atomicfu-jvm-0.22.0.module\">\n            <sha256 value=\"35070f923ce69f87c6f90e5305720e2704409b69a2374492ac45be70075ee49a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-android\" version=\"1.10.1\">\n         <artifact name=\"kotlinx-coroutines-android-1.10.1.jar\">\n            <sha256 value=\"bc5e60e0e61842558dd19c52bdd24882d40b001e6b1beaea9c4120af7b95ba1c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-android-1.10.1.module\">\n            <sha256 value=\"b3707d750fae0a4b04b0995160da6a4e84e0226491ac71d8efa315cd5fb89f33\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-android\" version=\"1.10.2\">\n         <artifact name=\"kotlinx-coroutines-android-1.10.2.jar\">\n            <sha256 value=\"e713f1f874244115a07571065cffa0f24f5e78300e9720fea16de3af1d75fd41\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-android-1.10.2.module\">\n            <sha256 value=\"092fe38103eec62e94540ca0cd61039ef8f7d8e46694ec033be1f63f0ea2013d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-android\" version=\"1.7.1\">\n         <artifact name=\"kotlinx-coroutines-android-1.7.1.jar\">\n            <sha256 value=\"107313760c18f8da174e8d8103504a468e806e88f7b55a84bd1c0eaeea118e9a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-android-1.7.1.module\">\n            <sha256 value=\"beb7ff0f5ebc63a0b30af2ae1214e0b622a7b7e408240e64a8ea5b213c4d5334\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-android\" version=\"1.7.3\">\n         <artifact name=\"kotlinx-coroutines-android-1.7.3.jar\">\n            <sha256 value=\"59fffb26bee12c32dadcfa5d420c2a7db85d3253518128b170efda726613256d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-android-1.7.3.module\">\n            <sha256 value=\"48dfd8139edee5481bcc8b25e24d7586aca615f0d1ed2beb242dc7478ed4cee0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-android\" version=\"1.8.1\">\n         <artifact name=\"kotlinx-coroutines-android-1.8.1.jar\">\n            <sha256 value=\"a134dacf4e6578b29b32e97aa50548d09cb45e3cb3551ce77ac27e55e265d8f5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-android-1.8.1.module\">\n            <sha256 value=\"f00af0920cb7dc4611205ff592eec5aa0071bc959b3797026abfe43cf14bfad4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-android\" version=\"1.9.0\">\n         <artifact name=\"kotlinx-coroutines-android-1.9.0.jar\">\n            <sha256 value=\"bd783acd2f9738845d58380f46f45b5cde95d0cb03027d56725338b26bfc4d72\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-android-1.9.0.module\">\n            <sha256 value=\"7df1e04d77f0cc411890d999a9449b0e3bcd4f159a46c3060b110204ca607d43\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-bom\" version=\"1.10.1\">\n         <artifact name=\"kotlinx-coroutines-bom-1.10.1.pom\">\n            <sha256 value=\"9cbd04ba63e7399856745713e312d2f2161a1d44eda506ded47c8d56daf8461f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-bom\" version=\"1.10.2\">\n         <artifact name=\"kotlinx-coroutines-bom-1.10.2.pom\">\n            <sha256 value=\"faf0c6538e53ddc0499a63664d8e763c216580b2e18e722ccbdf1b431a6afe26\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-bom\" version=\"1.6.4\">\n         <artifact name=\"kotlinx-coroutines-bom-1.6.4.pom\">\n            <sha256 value=\"ab2614855fba66aa8a42514dbe3d5a884315ffe1ed63f5932e710a8006245ce1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-bom\" version=\"1.7.1\">\n         <artifact name=\"kotlinx-coroutines-bom-1.7.1.pom\">\n            <sha256 value=\"b925aa988c40a5c7aa0c77b21373feb18c39414926bd51c76ef44434f5bae9c2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-bom\" version=\"1.7.3\">\n         <artifact name=\"kotlinx-coroutines-bom-1.7.3.pom\">\n            <sha256 value=\"4e5d1900e6379ef3f5970d04a8f30529adc82f859e8cc107c21ce8149ef666c4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-bom\" version=\"1.8.0\">\n         <artifact name=\"kotlinx-coroutines-bom-1.8.0.pom\">\n            <sha256 value=\"1239e9dbe1397cd5971342956b2511bc3ace7b641842e4372a088dcfa8b9ad55\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-bom\" version=\"1.8.1\">\n         <artifact name=\"kotlinx-coroutines-bom-1.8.1.pom\">\n            <sha256 value=\"563e4aa29fa8fe09a6e1746d0a5b51308f7c7dedc468dc5a0ca810a485877030\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-bom\" version=\"1.9.0\">\n         <artifact name=\"kotlinx-coroutines-bom-1.9.0.pom\">\n            <sha256 value=\"bea5511e9001f2c593ab5080df131b219ab5e2085cc5979ce583eacd4946fd78\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-core\" version=\"1.10.1\">\n         <artifact name=\"kotlinx-coroutines-core-1.10.1.module\">\n            <sha256 value=\"cbfd6d173e0a5c2986af953f8b1ccf29802aad09eaca6a4e9114108f8acac8b1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-core-metadata-1.10.1.jar\">\n            <sha256 value=\"fae4771dd987cfadabae129dd7f625af40d9e4f14abb7ffc72e42dccb97b7010\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-core\" version=\"1.10.2\">\n         <artifact name=\"kotlinx-coroutines-core-1.10.2.module\">\n            <sha256 value=\"8fe254177e711a7cd18a3c06d8242fce945f41c2cca13dc19b33ae42a5435016\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-core-metadata-1.10.2.jar\">\n            <sha256 value=\"319b653009d49c70982f98df29cc84fc7025b092cb0571c8e7532e3ad4366dae\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-core\" version=\"1.3.4\">\n         <artifact name=\"kotlinx-coroutines-core-1.3.4.pom\">\n            <sha256 value=\"c7cc337927e05dfe4437717eb2ca7c3c9a58f10efecb93d387c3b806829adee6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-core\" version=\"1.6.4\">\n         <artifact name=\"kotlinx-coroutines-core-1.6.4.module\">\n            <sha256 value=\"a6eed4a1835588e7c84fcd7b0475fce9a7b3444c870ebc797b88ba64ccf4576b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-core\" version=\"1.7.1\">\n         <artifact name=\"kotlinx-coroutines-core-1.7.1.module\">\n            <sha256 value=\"a9cc0c2bee3c6fc4ba8d0e753a3f3e70e181da5df3a2589ee54e92807b33accf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-core-metadata-1.7.1-all.jar\">\n            <sha256 value=\"b7d5370ed0e54952003b13595a67b97ced3f873d919f5ddfbe50fcd499cbf0a7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-core\" version=\"1.7.3\">\n         <artifact name=\"kotlinx-coroutines-core-1.7.3.module\">\n            <sha256 value=\"7fb162396594ec28e1b6a4411b457949a7670f5e12019176774e1fd6b9471bbf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-core\" version=\"1.8.1\">\n         <artifact name=\"kotlinx-coroutines-core-1.8.1.module\">\n            <sha256 value=\"08cbaf3325b54e0f8ef8da85e4eb596f7d946f843e5d1600385463f3268a4ef0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-core-metadata-1.8.1.jar\">\n            <sha256 value=\"daf50f1c9404b224a1d6dd5286f8e8ee7d63fe807f78ea98f71795c183b6025f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-core\" version=\"1.9.0\">\n         <artifact name=\"kotlinx-coroutines-core-1.9.0.module\">\n            <sha256 value=\"ad534034a953b4e12cbeeb874c66adf8b1ca14df15fe0d2e6547aa34e86dfeca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-core-metadata-1.9.0.jar\">\n            <sha256 value=\"7089c33c145865020760d3dbca5e4634133cc3dd7feb926e830f6de6ede28ac6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-core-jvm\" version=\"1.10.1\">\n         <artifact name=\"kotlinx-coroutines-core-jvm-1.10.1.jar\">\n            <sha256 value=\"069c5988633230e074ec0d39321ec3cdaa4547c49e90ba936c63d8fc91c8c00d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-core-jvm-1.10.1.module\">\n            <sha256 value=\"18dd65465ec80d0e6e5d71818bf1192ef4817cf5d201282b5b9b1b713ac7969a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-core-jvm\" version=\"1.10.2\">\n         <artifact name=\"kotlinx-coroutines-core-jvm-1.10.2.jar\">\n            <sha256 value=\"5ca175b38df331fd64155b35cd8cae1251fa9ee369709b36d42e0a288ccce3fd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-core-jvm-1.10.2.module\">\n            <sha256 value=\"e9e4a74b4dbfe0f5ebeed88d49f3546c3ec3089419b20e5250403135c2c64c53\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-core-jvm\" version=\"1.5.0\">\n         <artifact name=\"kotlinx-coroutines-core-jvm-1.5.0.jar\">\n            <sha256 value=\"78d6cc7135f84d692ff3752fcfd1fa1bbe0940d7df70652e4f1eaeec0c78afbb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-core-jvm-1.5.0.module\">\n            <sha256 value=\"c885dd0281076c5843826de317e3cbcdc3d8859dbeef53ae1cfacd1b9c60f96e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-core-jvm\" version=\"1.6.4\">\n         <artifact name=\"kotlinx-coroutines-core-jvm-1.6.4.jar\">\n            <sha256 value=\"c24c8bb27bb320c4a93871501a7e5e0c61607638907b197aef675513d4c820be\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-core-jvm-1.6.4.module\">\n            <sha256 value=\"0d94c8a41483e7c2707ebd693e1b1357a84152998ce85550ebbc54ca4321a3a7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-core-jvm\" version=\"1.7.1\">\n         <artifact name=\"kotlinx-coroutines-core-jvm-1.7.1.jar\">\n            <sha256 value=\"7496cffdd3eb10109acdda1c3212f6ac7815789e09380dc9e2ccdec496dba3fc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-core-jvm-1.7.1.module\">\n            <sha256 value=\"db1fe0110fa82b565d332d39d3f3e62c1dc7eb6238333e3b15e4377fa56e39cb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-core-jvm\" version=\"1.7.3\">\n         <artifact name=\"kotlinx-coroutines-core-jvm-1.7.3.jar\">\n            <sha256 value=\"1ab3acc38f3e7355c4f9d1ec62107a46fa73c899f3070d055e5d4373dfe67e12\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-core-jvm-1.7.3.module\">\n            <sha256 value=\"34d6ee99b76ac062b51555b4a70be18349fe5566da79a190614f171c80b6538e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-core-jvm\" version=\"1.8.0\">\n         <artifact name=\"kotlinx-coroutines-core-jvm-1.8.0.jar\">\n            <sha256 value=\"9860906a1937490bf5f3b06d2f0e10ef451e65b95b269f22daf68a3d1f5065c5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-core-jvm-1.8.0.module\">\n            <sha256 value=\"ff6a22da40040938751db0ae21177e76517dbf126a76796f5426727bf76c1228\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-core-jvm\" version=\"1.8.1\">\n         <artifact name=\"kotlinx-coroutines-core-jvm-1.8.1.jar\">\n            <sha256 value=\"f3d4f5de1c391bbcc20f3b3435ccbac013521e76b6902d7d59635ec15c1f797e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-core-jvm-1.8.1.module\">\n            <sha256 value=\"09b81c9d11c2deebf133ad87b707927c1f04099cb611ef008c7725b3eb308329\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-core-jvm\" version=\"1.9.0\">\n         <artifact name=\"kotlinx-coroutines-core-jvm-1.9.0.jar\">\n            <sha256 value=\"ad89c2892235e670f222d819cb3d81188143cb19a05b59df9889ae4269f5c70a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-core-jvm-1.9.0.module\">\n            <sha256 value=\"b321a899e40d3ce345707aa2cfda9983ad0dcc69fea74a9b8bf906a16c1cf8a9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-test\" version=\"1.10.1\">\n         <artifact name=\"kotlinx-coroutines-test-1.10.1.module\">\n            <sha256 value=\"024bcae79a0c2b6d18b0ba914c9f5de145bbfbc9dc919f270f895b2e3df87155\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-test-metadata-1.10.1.jar\">\n            <sha256 value=\"fadbe04fbda7a27728770d8eaecbdec0a9b0b29693c20cbea77655d783d8bd78\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-test\" version=\"1.10.2\">\n         <artifact name=\"kotlinx-coroutines-test-1.10.2.module\">\n            <sha256 value=\"422072cee3b69f68d5b1503bb6651be78946b04c39284a1cc026cce8bdf1f806\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-test-metadata-1.10.2.jar\">\n            <sha256 value=\"fadbe04fbda7a27728770d8eaecbdec0a9b0b29693c20cbea77655d783d8bd78\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-test\" version=\"1.8.1\">\n         <artifact name=\"kotlinx-coroutines-test-1.8.1.module\">\n            <sha256 value=\"a1cee2dab296c13b78ec1c060e18fe40334a440c8a077e90cca6de72527d8cde\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-test-metadata-1.8.1.jar\">\n            <sha256 value=\"d5a9b8769a2167eb9dc911d1b2c54fe8270387b8160533d8ae8bda942e2998b1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-test\" version=\"1.9.0\">\n         <artifact name=\"kotlinx-coroutines-test-1.9.0.module\">\n            <sha256 value=\"3a5f38700b2a4eb290e3507a0e3e4f9cc0bd63e70cca7f15e911dbf37c4f44ca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-test-metadata-1.9.0.jar\">\n            <sha256 value=\"b9f0603718765fe9f93b4a139198ada254f11c7bf18e48c99629a3a73ce281d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-test-jvm\" version=\"1.10.1\">\n         <artifact name=\"kotlinx-coroutines-test-jvm-1.10.1.jar\">\n            <sha256 value=\"ac3f456c9e25c3fc01542dc208655d0583cd37b5f72c35856267b74bd1664ab6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-test-jvm-1.10.1.module\">\n            <sha256 value=\"d55cb7baa4bd571857a2fb0096ada90839290cf6f3970de1c86a374aeb238582\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-test-jvm\" version=\"1.10.2\">\n         <artifact name=\"kotlinx-coroutines-test-jvm-1.10.2.jar\">\n            <sha256 value=\"590a549f8c1db590c9d98a8a20424a1f581a34162a369e6a6bd884ce7d36d3d7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-test-jvm-1.10.2.module\">\n            <sha256 value=\"56b20817cc51ad88bdb59c01216b09897cd4fa698d517bb477d92a972a7a1aaf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-test-jvm\" version=\"1.8.1\">\n         <artifact name=\"kotlinx-coroutines-test-jvm-1.8.1-sources.jar\">\n            <sha256 value=\"bea89f1396fcb311f672d6f82ea6504c5bf60b426d97611473ad04ffaf4253ba\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-test-jvm-1.8.1.jar\">\n            <sha256 value=\"c4ef1deb31be3f81ed82ecf237220cc95886868a7ec527a418599dfff159dedb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-test-jvm-1.8.1.module\">\n            <sha256 value=\"fb08fc257c900433d2df997bd6c29e049cd9f7bf541c0b776180e0998241f576\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-coroutines-test-jvm\" version=\"1.9.0\">\n         <artifact name=\"kotlinx-coroutines-test-jvm-1.9.0.jar\">\n            <sha256 value=\"68b87fa90db3dab1e794ff6078364087c07f87e5e4a4d0c8d3272a222ee8fe7e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-coroutines-test-jvm-1.9.0.module\">\n            <sha256 value=\"e2364beb540720b3c117957853379d4ae222058ad88f73a2ac73026c836f839f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-bom\" version=\"1.6.3\">\n         <artifact name=\"kotlinx-serialization-bom-1.6.3.pom\">\n            <sha256 value=\"29d69842bb7d449be2aa4ade6a4a7ce6aa55827d0ab13d168745fe6d95739332\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-bom\" version=\"1.7.3\">\n         <artifact name=\"kotlinx-serialization-bom-1.7.3.pom\">\n            <sha256 value=\"4226a491c5b59ce909f73b65aa98944191c8dcac3825637c6be1069e6b589a46\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-bom\" version=\"1.8.0\">\n         <artifact name=\"kotlinx-serialization-bom-1.8.0.pom\">\n            <sha256 value=\"c43e487529ccfd1209eba8653ab8e89598203464aafbfe5f0448ded992871509\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-core\" version=\"1.4.1\">\n         <artifact name=\"kotlinx-serialization-core-1.4.1.module\">\n            <sha256 value=\"60e581c397ddb9461ec1f1dee5bbb4a23bb7ec7d09b296024196220022aa7090\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-core\" version=\"1.6.3\">\n         <artifact name=\"kotlinx-serialization-core-1.6.3.module\">\n            <sha256 value=\"361e9e31eb7296174b74085ac49edd84a4f3900ba9431a4e40cd1c23de76a328\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-serialization-core-metadata-1.6.3.jar\">\n            <sha256 value=\"2fa05aff0f33a70da873c09a0ff66b5d54ccdc15e39e7ca4b82633e70c792f34\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-core\" version=\"1.7.3\">\n         <artifact name=\"kotlinx-serialization-core-1.7.3.module\">\n            <sha256 value=\"39d09a6e02df2b32558440a64c628f9c605fae8c4f6090321798334c82177e64\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-serialization-core-metadata-1.7.3.jar\">\n            <sha256 value=\"4850682e0e5976862695330d84eb8699f1dc5d50849f625263995cc88bc6f37b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-core\" version=\"1.8.0\">\n         <artifact name=\"kotlinx-serialization-core-1.8.0.module\">\n            <sha256 value=\"984d9aa9a6e9bcc38d7e836ea8d000b13872087fc6658d0d8d62257633f395f1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-core-jvm\" version=\"1.4.1\">\n         <artifact name=\"kotlinx-serialization-core-jvm-1.4.1.jar\">\n            <sha256 value=\"eba7f1c854296e4ce1418fb01360f8f10c5683e7c45aa3472018417a067636f3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-serialization-core-jvm-1.4.1.module\">\n            <sha256 value=\"73bc94bdd5fc86621509a6715c3fe344904ee7db5806a0c61792ce2356089ee9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-core-jvm\" version=\"1.6.3\">\n         <artifact name=\"kotlinx-serialization-core-jvm-1.6.3.jar\">\n            <sha256 value=\"29c821a8d4e25cbfe4f2ce96cdd4526f61f8f4e69a135f9612a34a81d93b65f1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-serialization-core-jvm-1.6.3.module\">\n            <sha256 value=\"329104dbd34e4bde905611d427c7584e53c3f8c411836fb9f699ac9dba5baa6c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-core-jvm\" version=\"1.7.3\">\n         <artifact name=\"kotlinx-serialization-core-jvm-1.7.3.jar\">\n            <sha256 value=\"f0adde45864144475385cf4aa7e0b7feb27f61fcf9472665ed98cc971b06b1eb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-serialization-core-jvm-1.7.3.module\">\n            <sha256 value=\"73bb4c02793f87c29ef64bea4ba0258076f4d4c963fcda633d1248ef24b4b4ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-core-jvm\" version=\"1.8.0\">\n         <artifact name=\"kotlinx-serialization-core-jvm-1.8.0.jar\">\n            <sha256 value=\"d3c94e9d829bba6e0c4cd3ae478a40846dd49d5475d6707877be853976afe416\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-serialization-core-jvm-1.8.0.module\">\n            <sha256 value=\"3731fcd238561a90a9752b3485f1d635e01b445e4a77817d7b077f4b9d2f422d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-json\" version=\"1.4.1\">\n         <artifact name=\"kotlinx-serialization-json-1.4.1.module\">\n            <sha256 value=\"e9922300aff663e55ecef7d3fca305cb60a14755b1f980d94039e3c1cab645cc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-json\" version=\"1.6.3\">\n         <artifact name=\"kotlinx-serialization-json-1.6.3.module\">\n            <sha256 value=\"80d1d87fa0a63bff8395ea3910bda80d09f0f583504ddea8ed007bc7a86b4cd4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-serialization-json-metadata-1.6.3.jar\">\n            <sha256 value=\"8c0016890a79ab5980dd520a5ab1a6738023c29aa3b6437c482e0e5fdc06dab1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-json\" version=\"1.7.3\">\n         <artifact name=\"kotlinx-serialization-json-1.7.3.module\">\n            <sha256 value=\"1cf0228a3588731d6baf3bcbbdb08a322501f70420d50e292ab501e55d8ccf4f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-json\" version=\"1.8.0\">\n         <artifact name=\"kotlinx-serialization-json-1.8.0.module\">\n            <sha256 value=\"94afde53c191c3e1e07b9f808aa1777f862bc8a95bc50b46628cd09219d56858\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-json-jvm\" version=\"1.4.1\">\n         <artifact name=\"kotlinx-serialization-json-jvm-1.4.1.jar\">\n            <sha256 value=\"af604c46737121d4225fdb60ef0e17766a3c94b7c1c9ef76b4e3a5c7733d557e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-serialization-json-jvm-1.4.1.module\">\n            <sha256 value=\"c8fbfde4b5ee1e41a69175165e839991d1501665a7590e23162326501ac6122c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-json-jvm\" version=\"1.6.3\">\n         <artifact name=\"kotlinx-serialization-json-jvm-1.6.3.jar\">\n            <sha256 value=\"d3234179bcff1886d53d67c11eca47f7f3cf7b63c349d16965f6db51b7f3dd9a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-serialization-json-jvm-1.6.3.module\">\n            <sha256 value=\"227a2a9ad38c010b107bc8058cd615177da5aaa86db37f7d58d49d9c9b7f97d0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-json-jvm\" version=\"1.7.3\">\n         <artifact name=\"kotlinx-serialization-json-jvm-1.7.3.jar\">\n            <sha256 value=\"b1e9138499ed8d20375edda3f2b1c95f3103a258eff6af9edc5ea07100f2b29c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-serialization-json-jvm-1.7.3.module\">\n            <sha256 value=\"0ff70e2131f2a6575822f7611c05e283c4ae08173303f410494cb41289bd3ef6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-json-jvm\" version=\"1.8.0\">\n         <artifact name=\"kotlinx-serialization-json-jvm-1.8.0.jar\">\n            <sha256 value=\"7b7c445880cef94dc464f4733da1b33b94bee78805041ea08ae06e8507e4620e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-serialization-json-jvm-1.8.0.module\">\n            <sha256 value=\"97e35997fea9ad963ade5bf4c03928fe53974b826521d4b03fbfb3cab0208aaa\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jetbrains.kotlinx\" name=\"kotlinx-serialization-json-okio\" version=\"1.6.3\">\n         <artifact name=\"kotlinx-serialization-json-okio-1.6.3.module\">\n            <sha256 value=\"37784ebeff04d209b2982cc187d4cdf1743567932d9b57f3d45b2ac566f39e85\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"kotlinx-serialization-json-okio-metadata-1.6.3.jar\">\n            <sha256 value=\"ed0bbff050a7710eefb2f54f77d4b99e7aabaf50c7d232f57938f3bb22c51dc2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jlleitschuh.gradle\" name=\"ktlint-gradle\" version=\"12.1.1\">\n         <artifact name=\"ktlint-gradle-12.1.1.jar\">\n            <sha256 value=\"f314e27ae92dda118e4f0b5eb9f2d867286ed0ccb72090a0a53b5c9f15c032ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ktlint-gradle-12.1.1.module\">\n            <sha256 value=\"748378699d6028dab55c6cf7e4cc663aa992e9dd2c90c19a3a92dabaf1700d8a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jlleitschuh.gradle\" name=\"ktlint-gradle\" version=\"12.1.2\">\n         <artifact name=\"ktlint-gradle-12.1.2.jar\">\n            <sha256 value=\"8a1dcadb7087be4beb158e4cf77cc4d430084382ac8a5d8c3706ac620a7b329c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ktlint-gradle-12.1.2.module\">\n            <sha256 value=\"6079d4cc37b4b49d519e84d82723759805d8d8a8fac1d1566185ae167773517e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jlleitschuh.gradle\" name=\"ktlint-gradle\" version=\"12.2.0\">\n         <artifact name=\"ktlint-gradle-12.2.0.jar\">\n            <sha256 value=\"ec87bc5d089a83614930533e870571f2160907dcd76ea504fca940ed6b238b4c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"ktlint-gradle-12.2.0.module\">\n            <sha256 value=\"c5be4655d9bcee94c31f0737b4373c2188a6934f6c46da2a10fd48a3718aecb8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jlleitschuh.gradle.ktlint\" name=\"org.jlleitschuh.gradle.ktlint.gradle.plugin\" version=\"12.1.1\">\n         <artifact name=\"org.jlleitschuh.gradle.ktlint.gradle.plugin-12.1.1.pom\">\n            <sha256 value=\"5a99bee1b84a692595f2df151b5055305ec94a978959612f7b94ada3fb0aa6d8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jlleitschuh.gradle.ktlint\" name=\"org.jlleitschuh.gradle.ktlint.gradle.plugin\" version=\"12.1.2\">\n         <artifact name=\"org.jlleitschuh.gradle.ktlint.gradle.plugin-12.1.2.pom\">\n            <sha256 value=\"f7520a60cf92f22d0281ee1aabda833d7f686e8c1d88018411db6041dd439a6e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jlleitschuh.gradle.ktlint\" name=\"org.jlleitschuh.gradle.ktlint.gradle.plugin\" version=\"12.2.0\">\n         <artifact name=\"org.jlleitschuh.gradle.ktlint.gradle.plugin-12.2.0.pom\">\n            <sha256 value=\"2331f7b912482e584a4cd649dfa74a578bec4aedc15f2d80ba808ceafda5365d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jspecify\" name=\"jspecify\" version=\"0.3.0\">\n         <artifact name=\"jspecify-0.3.0.jar\">\n            <sha256 value=\"e1c7e1832b6095fcfcbe57485700c7330d53d4e57e2c5bbf9c71819b02e978be\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"jspecify-0.3.0.module\">\n            <sha256 value=\"33b8c22f2424c2903241a7fea258fc41ab0c4d6889776576c519047562ee43a5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jspecify\" name=\"jspecify\" version=\"1.0.0\">\n         <artifact name=\"jspecify-1.0.0.jar\">\n            <sha256 value=\"1fad6e6be7557781e4d33729d49ae1cdc8fdda6fe477bb0cc68ce351eafdfbab\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"jspecify-1.0.0.module\">\n            <sha256 value=\"d307ca77a54e18ac1ef1aaed4e5bbe014bd2f49f29e1d2f813e47c278283195b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.junit\" name=\"junit-bom\" version=\"5.10.1\">\n         <artifact name=\"junit-bom-5.10.1.module\">\n            <sha256 value=\"21b0afcfffe2ecb3770f5eb00ae7a19feaee94e771fa3918173850dae78067b7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"junit-bom-5.10.1.pom\">\n            <sha256 value=\"21c4b0286f4b20069577ff4b20978a85c100ac8a46b6f1c8672fbaab337bc3f2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.junit\" name=\"junit-bom\" version=\"5.10.2\">\n         <artifact name=\"junit-bom-5.10.2.module\">\n            <sha256 value=\"de23b114b3e4119a8fe6eb17bed5a3852816698bace67071579d6d927ebb080a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"junit-bom-5.10.2.pom\">\n            <sha256 value=\"169dd904a4b0f6520cffe658cc62292bfe9f3c14a989fa92120724cde43a9968\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.junit\" name=\"junit-bom\" version=\"5.10.3\">\n         <artifact name=\"junit-bom-5.10.3.module\">\n            <sha256 value=\"aa7940c9d68312e39d89a65285aa9af45f14d8f434d850ee8d93db6a56d167bb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"junit-bom-5.10.3.pom\">\n            <sha256 value=\"10937d44c425984cb8739225d34712e1a3145641ca93ac3f7ef186fa25f6babc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.junit\" name=\"junit-bom\" version=\"5.11.0\">\n         <artifact name=\"junit-bom-5.11.0.module\">\n            <sha256 value=\"f7edbe67f22042708c410abc547408e5c476f409f556236a1179221274a2ed2d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"junit-bom-5.11.0.pom\">\n            <sha256 value=\"e67459d4882424ac6374f40db1c8f4a2e88946b340ba072c80be932a2be4644d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.junit\" name=\"junit-bom\" version=\"5.9.2\">\n         <artifact name=\"junit-bom-5.9.2.module\">\n            <sha256 value=\"ab137ba5a8e32c9b066bf9126a1c76dd5614b724ba5c0b02549772b5e9f4cf1f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"junit-bom-5.9.2.pom\">\n            <sha256 value=\"2ed07d65845131f5336a86476c9a4056b59d0b58b9815ab3679bb0f36f35f705\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.junit\" name=\"junit-bom\" version=\"5.9.3\">\n         <artifact name=\"junit-bom-5.9.3.module\">\n            <sha256 value=\"b401fd25901e582a524aa5343c4b39e28bc56e24961c1069bf2b4bbfcee46b93\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"junit-bom-5.9.3.pom\">\n            <sha256 value=\"4d0329cd9e72f2420e5ca15724cbfe6ffa6e5fd2888361516271190fdc342ed7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.jvnet.staxex\" name=\"stax-ex\" version=\"1.8.1\">\n         <artifact name=\"stax-ex-1.8.1.jar\">\n            <sha256 value=\"20522549056e9e50aa35ef0b445a2e47a53d06be0b0a9467d704e2483ffb049a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"stax-ex-1.8.1.pom\">\n            <sha256 value=\"8fc84f36ce6da6ce8c893b6538199a7f69a69a0706d9b17a3ee6a3a09452eed6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.mockito\" name=\"mockito-core\" version=\"5.12.0\">\n         <artifact name=\"mockito-core-5.12.0.jar\">\n            <sha256 value=\"4a2eb29237050da749e90a46f948bce7e26ec22b671e41f59b1ac6f4b6408229\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"mockito-core-5.12.0.pom\">\n            <sha256 value=\"6dc72fc0a7b534775555f833074862a9c53013a673383e21312b581ca23b7612\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.mockito\" name=\"mockito-core\" version=\"5.7.0\">\n         <artifact name=\"mockito-core-5.7.0-sources.jar\">\n            <sha256 value=\"a0a2b963d94a9dbb7057bdf421a4677d578a1db55b7c7e9f94ac44f0780aff3f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"mockito-core-5.7.0.jar\">\n            <sha256 value=\"dbad5e746654910a11a59ecb4d01e38461f3e5d16161689dc2588d5554432521\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"mockito-core-5.7.0.pom\">\n            <sha256 value=\"79e673a535f48ca37eebf76cb7ac4c699d4946ceed6f082b040c5936d44300ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.mockito\" name=\"mockito-inline\" version=\"5.2.0\">\n         <artifact name=\"mockito-inline-5.2.0-sources.jar\">\n            <sha256 value=\"ee52e1c299a632184fba274a9370993e09140429f5e516e6c5570fd6574b297f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"mockito-inline-5.2.0.jar\">\n            <sha256 value=\"ee52e1c299a632184fba274a9370993e09140429f5e516e6c5570fd6574b297f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"mockito-inline-5.2.0.pom\">\n            <sha256 value=\"706d3470e56d31a3b5630698d1079befdb983145b0184e4ba2b84da387a8f684\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.mockito.kotlin\" name=\"mockito-kotlin\" version=\"5.3.1\">\n         <artifact name=\"mockito-kotlin-5.3.1-sources.jar\">\n            <sha256 value=\"52fa63b4f95999a631abb196d3195a7c10d42762690a5e5498f9c8527629ce84\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"mockito-kotlin-5.3.1.jar\">\n            <sha256 value=\"e52ad013a6e64d352741835346129f54f7235db1aacb5030f296c4c6ec19b899\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"mockito-kotlin-5.3.1.pom\">\n            <sha256 value=\"5f6b44674872eb8fd27a84ff421af3e0f965c4874367a1eef2f053ccfadd4dbf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.mockito.kotlin\" name=\"mockito-kotlin\" version=\"5.4.0\">\n         <artifact name=\"mockito-kotlin-5.4.0.jar\">\n            <sha256 value=\"c97a3c0ad362d9352a135323767fd3dad64796f26339399b129fe19d7e30356a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"mockito-kotlin-5.4.0.pom\">\n            <sha256 value=\"9de847e498eaf9790e448d8e6732137f8a9a8f173c2143c6283ea663f47fd8bb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.objenesis\" name=\"objenesis\" version=\"3.3\">\n         <artifact name=\"objenesis-3.3-sources.jar\">\n            <sha256 value=\"d06164f8ca002c8ef193cef2d682822014dd330505616af93a3fb64226fc131d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"objenesis-3.3.jar\">\n            <sha256 value=\"02dfd0b0439a5591e35b708ed2f5474eb0948f53abf74637e959b8e4ef69bfeb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"objenesis-3.3.pom\">\n            <sha256 value=\"ba0c40da2669a048b6e24ef7066a471f0fbcbfcc509e6a3e856ca4ddfa614ad3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.objenesis\" name=\"objenesis-parent\" version=\"3.3\">\n         <artifact name=\"objenesis-parent-3.3.pom\">\n            <sha256 value=\"305c384aa2f1e1c7fe53a96da41c3ec35243b97d428d24a8f779818cc10be4ff\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ow2\" name=\"ow2\" version=\"1.5\">\n         <artifact name=\"ow2-1.5.pom\">\n            <sha256 value=\"0f8a1b116e760b8fe6389c51b84e4b07a70fc11082d4f936e453b583dd50b43b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ow2\" name=\"ow2\" version=\"1.5.1\">\n         <artifact name=\"ow2-1.5.1.pom\">\n            <sha256 value=\"321ddbb7ee6fe4f53dea6b4cd6db74154d6bfa42391c1f763b361b9f485acf05\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ow2.asm\" name=\"asm\" version=\"9.3\">\n         <artifact name=\"asm-9.3.jar\">\n            <sha256 value=\"1263369b59e29c943918de11d6d6152e2ec6085ce63e5710516f8c67d368e4bc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"asm-9.3.pom\">\n            <sha256 value=\"8eac07e29f8aea83a8156d7b29fa368f6ebf3becfb209c9a1ac36abd906123e0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ow2.asm\" name=\"asm\" version=\"9.6\">\n         <artifact name=\"asm-9.6-sources.jar\">\n            <sha256 value=\"2b6e12f0da3d065ba628a024a8851ab0d5b5d3501dacfcc18769243250f4f77e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"asm-9.6.jar\">\n            <sha256 value=\"3c6fac2424db3d4a853b669f4e3d1d9c3c552235e19a319673f887083c2303a1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"asm-9.6.pom\">\n            <sha256 value=\"92eee24bc3c843e4881d46c1dd6505471ee3142facfb466b428cfea5a56c6b60\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ow2.asm\" name=\"asm\" version=\"9.7\">\n         <artifact name=\"asm-9.7.jar\">\n            <sha256 value=\"adf46d5e34940bdf148ecdd26a9ee8eea94496a72034ff7141066b3eea5c4e9d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"asm-9.7.pom\">\n            <sha256 value=\"de00115f1d84f3a0b2ee3a4b6f6192d066f86d185d67b9d1522f2c80feac5f00\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ow2.asm\" name=\"asm\" version=\"9.7.1\">\n         <artifact name=\"asm-9.7.1.jar\">\n            <sha256 value=\"8cadd43ac5eb6d09de05faecca38b917a040bb9139c7edeb4cc81c740b713281\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"asm-9.7.1.pom\">\n            <sha256 value=\"7229b03b30a73ee91008072d9e4569a51d8547fae8c50f527841aef4c1b0baa8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ow2.asm\" name=\"asm-analysis\" version=\"9.6\">\n         <artifact name=\"asm-analysis-9.6.jar\">\n            <sha256 value=\"d92832d7c37edc07c60e2559ac6118b31d642e337a6671edcb7ba9fae68edbbb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"asm-analysis-9.6.pom\">\n            <sha256 value=\"fa3f995021cff4f4139306e6cffeeea07539106440d29b19cc06a7a636a13850\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ow2.asm\" name=\"asm-analysis\" version=\"9.7\">\n         <artifact name=\"asm-analysis-9.7.jar\">\n            <sha256 value=\"7bc6bcbc21379948a0c8c467fb0f864206e5b818f6bc0b546872f5c9f941556f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"asm-analysis-9.7.pom\">\n            <sha256 value=\"9c33080ebcb631ae4f77eb62ed67bfc40cb872e8cfd058ac863e445c1dd973df\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ow2.asm\" name=\"asm-analysis\" version=\"9.7.1\">\n         <artifact name=\"asm-analysis-9.7.1.jar\">\n            <sha256 value=\"85b29371884ba31bb76edf22323c2c24e172c3267a67152eba3d1ccc2e041ef2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"asm-analysis-9.7.1.pom\">\n            <sha256 value=\"25c2379f2bfc2a1e64e62c39e2b93cfb0e489707852b08d6fc470b1c6a52b9ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ow2.asm\" name=\"asm-commons\" version=\"9.6\">\n         <artifact name=\"asm-commons-9.6.jar\">\n            <sha256 value=\"7aefd0d5c0901701c69f7513feda765fb6be33af2ce7aa17c5781fc87657c511\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"asm-commons-9.6.pom\">\n            <sha256 value=\"a98ae4895334baf8ff86bd66516210dbd9a03f1a6e15e47dda82afcf6b53d77c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ow2.asm\" name=\"asm-commons\" version=\"9.7\">\n         <artifact name=\"asm-commons-9.7.jar\">\n            <sha256 value=\"389bc247958e049fc9a0408d398c92c6d370c18035120395d4cba1d9d9304b7a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"asm-commons-9.7.pom\">\n            <sha256 value=\"5acee3ee7252ed90b8074c755d022787499a95fafff98ac4a685107c4da409b4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ow2.asm\" name=\"asm-commons\" version=\"9.7.1\">\n         <artifact name=\"asm-commons-9.7.1.jar\">\n            <sha256 value=\"9a579b54d292ad9be171d4313fd4739c635592c2b5ac3a459bbd1049cddec6a0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"asm-commons-9.7.1.pom\">\n            <sha256 value=\"0bf1d31da0c9f9d8edc2f27dbbfdbbf73f1a715b72cd2fa28f3f195994d74ad1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ow2.asm\" name=\"asm-tree\" version=\"9.6\">\n         <artifact name=\"asm-tree-9.6.jar\">\n            <sha256 value=\"c43ecf17b539c777e15da7b5b86553b377e2d39a683de6285567d5283888e7ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"asm-tree-9.6.pom\">\n            <sha256 value=\"1bcb481d7fc16b955bb60ca07c8cfa2424bcee78bdc405bba31c7d6f5dc2d113\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ow2.asm\" name=\"asm-tree\" version=\"9.7\">\n         <artifact name=\"asm-tree-9.7.jar\">\n            <sha256 value=\"62f4b3bc436045c1acb5c3ba2d8ec556ec3369093d7f5d06c747eb04b56d52b1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"asm-tree-9.7.pom\">\n            <sha256 value=\"a34ea1e3e4128c01038db43c6976e88c779cf5af84b0505da266dfe6965668ec\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ow2.asm\" name=\"asm-tree\" version=\"9.7.1\">\n         <artifact name=\"asm-tree-9.7.1.jar\">\n            <sha256 value=\"9929881f59eb6b840e86d54570c77b59ce721d104e6dfd7a40978991c2d3b41f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"asm-tree-9.7.1.pom\">\n            <sha256 value=\"13b905f65e7fd43ca7674f40cdaa37679ba4858c6c9d9fb8f17a7afd9baabc9e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ow2.asm\" name=\"asm-util\" version=\"9.6\">\n         <artifact name=\"asm-util-9.6.jar\">\n            <sha256 value=\"c635a7402f4aa9bf66b2f4230cea62025a0fe1cd63e8729adefc9b1994fac4c3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"asm-util-9.6.pom\">\n            <sha256 value=\"52c5c1d357404779d1a99b49a85bf9d3a085025b8516cb73dbef77c8ae34005e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ow2.asm\" name=\"asm-util\" version=\"9.7\">\n         <artifact name=\"asm-util-9.7.jar\">\n            <sha256 value=\"37a6414d36641973f1af104937c95d6d921b2ddb4d612c66c5a9f2b13fc14211\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"asm-util-9.7.pom\">\n            <sha256 value=\"5d014d8c870d4871825bd2ddb5567b21ef6dac8ec48bbb8dbb465b0b3a2bf452\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.ow2.asm\" name=\"asm-util\" version=\"9.7.1\">\n         <artifact name=\"asm-util-9.7.1.jar\">\n            <sha256 value=\"f885be71b5c90556f5f1ad1c4f9276b29b96057c497d46666fe4ddbec3cb43c6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"asm-util-9.7.1.pom\">\n            <sha256 value=\"7fb5e63362b2d52d77dca3b754aebad635751d3fc520191e9500ece9e2345b71\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.pageseeder.diffx\" name=\"pso-diffx\" version=\"1.1.1\">\n         <artifact name=\"pso-diffx-1.1.1.jar\">\n            <sha256 value=\"c539842b0459fe625062a5ef46cc4449c59f553110cfbdc8c99cc9903bec9690\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"pso-diffx-1.1.1.module\">\n            <sha256 value=\"810b32c25f20b1edaa19289f819936741564a9cdf18e52593fc0e20252b3fbac\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.pageseeder.diffx\" name=\"pso-diffx\" version=\"1.1.2\">\n         <artifact name=\"pso-diffx-1.1.2.jar\">\n            <sha256 value=\"1deb717c78f712e41595ed4945ddf990137ecc83fd2eace2d0be5adf8e222b5c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"pso-diffx-1.1.2.module\">\n            <sha256 value=\"229d3158b558bce81d6d07c256e163b254e33bd56d30147cdcef1df43ae81e9a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.pageseeder.xmlwriter\" name=\"pso-xmlwriter\" version=\"1.0.4\">\n         <artifact name=\"pso-xmlwriter-1.0.4.jar\">\n            <sha256 value=\"3d5c89f22fd7b8097665a773574679aedf0ca5bc605cd3b2aed17ccba9e47e3e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"pso-xmlwriter-1.0.4.module\">\n            <sha256 value=\"8fbaab52db349a1380d366532d2f5167d3d78fc47ecc416cef22ae3d4655f067\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"annotations\" version=\"4.12.2\">\n         <artifact name=\"annotations-4.12.2.jar\">\n            <sha256 value=\"329ce893a1b3e96c06ee75d07b9b9f99ecf6389acb5c0d17fcb9d25350db0a7a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-4.12.2.module\">\n            <sha256 value=\"48fc50360373e13da0596f0cea62b0f3b4e8288c20571194b6c775f5d36e0aa5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"annotations\" version=\"4.13\">\n         <artifact name=\"annotations-4.13.jar\">\n            <sha256 value=\"d813def0542230c510fb1a8f062f0e05e81b914878a4d961281437c99c177e21\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-4.13.module\">\n            <sha256 value=\"c422d5c8842d7a01f39b323120b87dec4725337a5b03995df03494a18f88c9a8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"annotations\" version=\"4.14.1\">\n         <artifact name=\"annotations-4.14.1.jar\">\n            <sha256 value=\"463a5ad1386c31010bc9af00bfe19a1b758d8c2dedd8c19e5c75d29ab8abb9ba\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"annotations-4.14.1.module\">\n            <sha256 value=\"f41e24bf354432477e9022b69843513c4d5a39d722ceb73ee0a508c2889faf4f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"junit\" version=\"4.12.2\">\n         <artifact name=\"junit-4.12.2.jar\">\n            <sha256 value=\"f3f6ebf476b4ecdffcfe4e8b3b3d6119cbe2fc59f19822d8a6c7df35dbf22c48\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"junit-4.12.2.module\">\n            <sha256 value=\"1b0e41d67cf4023014503af4fbf73b24f67ddc47ddd45744d3f99993be9e4847\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"junit\" version=\"4.13\">\n         <artifact name=\"junit-4.13.jar\">\n            <sha256 value=\"945e0ac1868aa8f6550e7021ad0e00efa00f25da5a62d12583d2dbe16117b63a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"junit-4.13.module\">\n            <sha256 value=\"a669f1f50392b26c5d510285663f2e8a870e0a7b875e862474d476147568af5f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"junit\" version=\"4.14.1\">\n         <artifact name=\"junit-4.14.1.jar\">\n            <sha256 value=\"2cee817aadce3552706b09450ad1ea7ff5981924072d2adfe40ddad57d5fa123\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"junit-4.14.1.module\">\n            <sha256 value=\"91e77ccecdbd485c67b84c85728897df116ed3eb90f0e726f0ec79d04768c4d7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"nativeruntime\" version=\"4.12.2\">\n         <artifact name=\"nativeruntime-4.12.2.jar\">\n            <sha256 value=\"f8e55ab954404735f5931b5179e139e158367139b7deeddf6ded7086a0467d9d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"nativeruntime-4.12.2.module\">\n            <sha256 value=\"bccb3547dccc7dc990d60ed3b9a771982a008aab31c8a3021e8508614c0e95b6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"nativeruntime\" version=\"4.13\">\n         <artifact name=\"nativeruntime-4.13.jar\">\n            <sha256 value=\"2c3d6945cdf4b8569125d35c2ffc72444ba0cfde24717127becd56cb77e0dff5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"nativeruntime-4.13.module\">\n            <sha256 value=\"3fcab094062f01d3a717006603f05d3ee961e843df424f0c3e4e1e6146333d64\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"nativeruntime\" version=\"4.14.1\">\n         <artifact name=\"nativeruntime-4.14.1.jar\">\n            <sha256 value=\"c07b66d315aec3272a7c64aa5f154b4194be2cc6030a733d16f2ee87330232a8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"nativeruntime-4.14.1.module\">\n            <sha256 value=\"91b52e58cc84778086941e439659264e3804aeae45df00b47e80962ec9104da3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"nativeruntime-dist-compat\" version=\"1.0.10\">\n         <artifact name=\"nativeruntime-dist-compat-1.0.10.jar\">\n            <sha256 value=\"1159b8394b9d9640b53b63f07ec1fe676a7b394a90b8361eef2a88868cca3f3d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"nativeruntime-dist-compat-1.0.10.pom\">\n            <sha256 value=\"de771e6ce96737fc1d50713b2b5f28f0624d65b8ba323526775bb3b7ca07575e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"nativeruntime-dist-compat\" version=\"1.0.12\">\n         <artifact name=\"nativeruntime-dist-compat-1.0.12.jar\">\n            <sha256 value=\"688d499acc8b33315c1f799cd9afb1f0486cd4605b89e3f8e7df72588365bccd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"nativeruntime-dist-compat-1.0.12.pom\">\n            <sha256 value=\"4acdac5ceb7e1ed5574abe3510be76180316f60381501884d48cd770e82c33ef\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"nativeruntime-dist-compat\" version=\"1.0.16\">\n         <artifact name=\"nativeruntime-dist-compat-1.0.16.jar\">\n            <sha256 value=\"2f4e879b00eed634d0e43353ecff80db4d5ce24b3b213d1e6053cb21b0ced10f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"nativeruntime-dist-compat-1.0.16.pom\">\n            <sha256 value=\"053dc5be36c03495d157186588b73952f4098cb9890f75cbd6ee26e36fd83d04\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"pluginapi\" version=\"4.12.2\">\n         <artifact name=\"pluginapi-4.12.2.jar\">\n            <sha256 value=\"822af3ccba184421c36684ec4678e1b1b4424520891d46b1f568c10d3b036ba5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"pluginapi-4.12.2.module\">\n            <sha256 value=\"4328d5d9072cd1cbeb447bcf7eb13969e29bd9a2350387ba4fca4a976849a99c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"pluginapi\" version=\"4.13\">\n         <artifact name=\"pluginapi-4.13.jar\">\n            <sha256 value=\"48a31c50c4cfd90b2f27b70ebc5d1946b4cc6dc94df275e4743c48c75ea6a25e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"pluginapi-4.13.module\">\n            <sha256 value=\"e1e1fcded3313d9962150f1354e5ad2a8f9cdcae170dd23e608584ecba8a00a2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"pluginapi\" version=\"4.14.1\">\n         <artifact name=\"pluginapi-4.14.1.jar\">\n            <sha256 value=\"ad8b74238d59bce6631e29190c105dd0c4701e836a2631060678407f621c7b7a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"pluginapi-4.14.1.module\">\n            <sha256 value=\"f1be495b31fa44917a42c85437eb66ba48df2cf8b609e786a5a1694162ecf118\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"plugins-maven-dependency-resolver\" version=\"4.12.2\">\n         <artifact name=\"plugins-maven-dependency-resolver-4.12.2.jar\">\n            <sha256 value=\"af77ec038d8c9771fed6942fc905520c80231c1aef321ede2869227e9bd8fb08\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"plugins-maven-dependency-resolver-4.12.2.pom\">\n            <sha256 value=\"9f33e449083d5d4d349725c34f2c8bd7f4cd7a388f2678575a8644c3f1789d17\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"plugins-maven-dependency-resolver\" version=\"4.13\">\n         <artifact name=\"plugins-maven-dependency-resolver-4.13.jar\">\n            <sha256 value=\"0cb77f7bf1f2cb7e54b5cb72caa3ad0f0d03f856590a50dff1e50d35a1dab890\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"plugins-maven-dependency-resolver-4.13.pom\">\n            <sha256 value=\"2a6f81f13e3f8cef1b25db4f8bbe24e8fc0486ffcc5fc9b43694a6bc4cdbe8b5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"plugins-maven-dependency-resolver\" version=\"4.14.1\">\n         <artifact name=\"plugins-maven-dependency-resolver-4.14.1.jar\">\n            <sha256 value=\"6c8dbc979db0780755e712acab9eeb9396811b2d4dc31a92a5b259f9876205ec\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"plugins-maven-dependency-resolver-4.14.1.pom\">\n            <sha256 value=\"21ab442a41f775ba7ddad9f92bbcb6d073ef4822d7c63c7d269b092890be2af0\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"resources\" version=\"4.12.2\">\n         <artifact name=\"resources-4.12.2.jar\">\n            <sha256 value=\"7a3371613ac23070030566ac590297b301362aba8cba9372acf0f3701cfe5c99\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"resources-4.12.2.module\">\n            <sha256 value=\"76f9990411816bb6ccbccb4840d308415cc7c46319f9dad19ee488c207f0e633\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"resources\" version=\"4.13\">\n         <artifact name=\"resources-4.13.jar\">\n            <sha256 value=\"a7231dd85420ef1db2b1c17da665fe12bef6b1d60f2010b7dfe349b695955fa6\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"resources-4.13.module\">\n            <sha256 value=\"775f068c6b9c5134a7308bbfac5931ac3f2ac84b652577e639a88e6e1ca19cb2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"resources\" version=\"4.14.1\">\n         <artifact name=\"resources-4.14.1.jar\">\n            <sha256 value=\"54eb274a47dec9e74cc9b45b9e4335bb5d83857c63b2a49dd8d1993e6321f2c5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"resources-4.14.1.module\">\n            <sha256 value=\"b2ae6c390c2ba8e0cb459106cff79f416bd5ecca1073b4c4144d58a8b1892f89\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"robolectric\" version=\"4.12.2\">\n         <artifact name=\"robolectric-4.12.2.jar\">\n            <sha256 value=\"b8eb9d7cf85bb9636f430d68a50768d1a01a747c94b40b8e8a79abe6a3f95f82\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"robolectric-4.12.2.module\">\n            <sha256 value=\"66c2cdcd83b4ddf4bddd8894d5515e9a5eb27536d39c4b9acf9ae121abbd94a4\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"robolectric\" version=\"4.13\">\n         <artifact name=\"robolectric-4.13.jar\">\n            <sha256 value=\"10006cb69518e3b29225368f4047d62f7e5a3cc0c3d9e228ff547abe40b70c6c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"robolectric-4.13.module\">\n            <sha256 value=\"1c4ea47a7de2c52150082e2cf99c1fb023148316bf62d4f5919ce9afb0ca1752\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"robolectric\" version=\"4.14.1\">\n         <artifact name=\"robolectric-4.14.1.jar\">\n            <sha256 value=\"e0a73d45bceb94a5a0352b66e2120ad4a4b222fe406079130893b6c79d4441d1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"robolectric-4.14.1.module\">\n            <sha256 value=\"cc223907e19a2cd8d434e0981bf2d604b849d90aea182783c5c7e1a40fc6e398\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"sandbox\" version=\"4.12.2\">\n         <artifact name=\"sandbox-4.12.2.jar\">\n            <sha256 value=\"8f0c3966ab51d0fca1ede8a4e706440d3783dbf4f6ec5c484fd3fcf0d9b9c9bf\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sandbox-4.12.2.module\">\n            <sha256 value=\"9c4ff684965cc1e6d0249b336caf70b3edba93b71743feaa17f347494b520d9c\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"sandbox\" version=\"4.13\">\n         <artifact name=\"sandbox-4.13.jar\">\n            <sha256 value=\"6536350562eb11ab289b1ac28423b5fdcfbfe090ef5e6360ce441333191d0cd5\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sandbox-4.13.module\">\n            <sha256 value=\"708a128b05c2941d16b3e1d82b4cae3da8c1f54802e79f687d7b8a72addb3fc7\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"sandbox\" version=\"4.14.1\">\n         <artifact name=\"sandbox-4.14.1.jar\">\n            <sha256 value=\"de361f3de8c08d4488cf156683830f2bd43db1da85a5b136ad6d065b868d3bab\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sandbox-4.14.1.module\">\n            <sha256 value=\"e1e53e16d1a8dc1675711e34108b3e0d71b6a6b7fce02e028c819a9e45b4f3cb\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"shadowapi\" version=\"4.12.2\">\n         <artifact name=\"shadowapi-4.12.2.jar\">\n            <sha256 value=\"1918a7cfd69f82e2f125a56fa032e3828437a941ec9f077e7a3a652e84cb5cdc\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shadowapi-4.12.2.module\">\n            <sha256 value=\"d7188d54f1eb0f2569f60a90734f7531670c43e57722e92eebdf41f4094cb940\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"shadowapi\" version=\"4.13\">\n         <artifact name=\"shadowapi-4.13.jar\">\n            <sha256 value=\"277b664d4829701314dd464dfea10ce74a0bd0b2b4811ae7dcc1c335e1b440c3\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shadowapi-4.13.module\">\n            <sha256 value=\"5db21aa2eb063cffa3faae654ff43603f9092d7409e1fadd784e2eed115ddbfe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"shadowapi\" version=\"4.14.1\">\n         <artifact name=\"shadowapi-4.14.1.jar\">\n            <sha256 value=\"fd158863cee488475206ba1d23ff4c7d29be412eccd21b12d9416b0030aa582d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shadowapi-4.14.1.module\">\n            <sha256 value=\"87b1fef13788f52d7bfced79ee68ef243546c5ac1ce1519274f90410fc77e637\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"shadows-framework\" version=\"4.12.2\">\n         <artifact name=\"shadows-framework-4.12.2.jar\">\n            <sha256 value=\"907dd8bb9966ba4b83a017822449fc8ab31ab0a437b29342cb2cfca1177354e1\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shadows-framework-4.12.2.module\">\n            <sha256 value=\"7c488a3496378b75e4053a190c8f65b4ed6fe5fb9ad459945425e25cab80ece8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"shadows-framework\" version=\"4.13\">\n         <artifact name=\"shadows-framework-4.13.jar\">\n            <sha256 value=\"101e89d6dd3379368b113fd50883b8a5546189f6695bcde9b188ba8459e83083\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shadows-framework-4.13.module\">\n            <sha256 value=\"bebeb74c7a6543e6d67667906bc6a3cfb0acc080ef9c8003dfd3dcd14abfb718\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"shadows-framework\" version=\"4.14.1\">\n         <artifact name=\"shadows-framework-4.14.1.jar\">\n            <sha256 value=\"f3cf7785eecf9b2e80fbb4caac4c42f63eeea3506e289581c04696a56a494622\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shadows-framework-4.14.1.module\">\n            <sha256 value=\"d45a50ae4255b9248d341ebe57438041451d223b8c32f6754555227281db5c46\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"shadows-versioning\" version=\"4.12.2\">\n         <artifact name=\"shadows-versioning-4.12.2.jar\">\n            <sha256 value=\"86126b5b074cb69c6953666ae467de1fa3b6d33bf794633d5b80a1be97ff4b1a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"shadows-versioning-4.12.2.module\">\n            <sha256 value=\"cb73240b5e1e037c00e1aba77c4ef24e5e29391a3c84a6adaf1018dc00d363ca\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"utils\" version=\"4.12.2\">\n         <artifact name=\"utils-4.12.2.jar\">\n            <sha256 value=\"80f49b35125981818d73b3a8df7324c08fe86a8ce4ca94b5fea324efecb034a9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utils-4.12.2.pom\">\n            <sha256 value=\"19c600cd3c68401806fd728c6ab229c408a89ca2bafe2cd1e35443d3bd09ff53\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"utils\" version=\"4.13\">\n         <artifact name=\"utils-4.13.jar\">\n            <sha256 value=\"1f55e97fdcba5b4224e6f26744a86e8545888638747f738d2eec409e91eeda05\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utils-4.13.pom\">\n            <sha256 value=\"59d7ac54a24460c884fbb40625dad4f989bba021429d7e055e78574abf688797\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"utils\" version=\"4.14.1\">\n         <artifact name=\"utils-4.14.1.jar\">\n            <sha256 value=\"6884eec32c9c9b23d74250e30a5ba9c5ece48784f808feba98f119b215ab59d8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utils-4.14.1.pom\">\n            <sha256 value=\"dd438f68cdf56644fff3aff48a88561c2bd1850e74334b37de435eeed9d2a1fe\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"utils-reflector\" version=\"4.12.2\">\n         <artifact name=\"utils-reflector-4.12.2.jar\">\n            <sha256 value=\"7e8a926d88d473a05af7cbef07941e03ddf676e987d70f40096193dba0cf5621\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utils-reflector-4.12.2.module\">\n            <sha256 value=\"5866557c1e7f48778368fd8f2d30be0c42807200c92837ffb41d8f7e8ab1c15f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"utils-reflector\" version=\"4.13\">\n         <artifact name=\"utils-reflector-4.13.jar\">\n            <sha256 value=\"d54286f22b0af6491064546326221b9c593ba2a72f0a6506caf86af23f549ccd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utils-reflector-4.13.module\">\n            <sha256 value=\"5ebb1c7a2a86ad1699af0e68617513f17bb6a516d24e7936ce7d14a1d66812e8\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.robolectric\" name=\"utils-reflector\" version=\"4.14.1\">\n         <artifact name=\"utils-reflector-4.14.1.jar\">\n            <sha256 value=\"eb8f52cdc24f59ae4cf13369c5bf990354c19c386e3e8f9f5d5cee04d836557b\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"utils-reflector-4.14.1.module\">\n            <sha256 value=\"bd14da5907a107813fb0fa0b2c4e02c0f3958a1550f88b872ec57424a9377bb9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.slf4j\" name=\"slf4j-api\" version=\"1.7.30\">\n         <artifact name=\"slf4j-api-1.7.30.jar\">\n            <sha256 value=\"cdba07964d1bb40a0761485c6b1e8c2f8fd9eb1d19c53928ac0d7f9510105c57\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"slf4j-api-1.7.30.pom\">\n            <sha256 value=\"7e0747751e9b67e19dcb5206f04ea22cc03d250c422426402eadd03513f2c314\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.slf4j\" name=\"slf4j-api\" version=\"2.0.4\">\n         <artifact name=\"slf4j-api-2.0.4.jar\">\n            <sha256 value=\"57fa874599ace9259286b99253d7a877afdd2db4b07a6827ac6c847ca5d601a2\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"slf4j-api-2.0.4.pom\">\n            <sha256 value=\"85b1af0535665ce8f23a2b9f1f581cc1e7877bb1289304140827731216c78ffd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.slf4j\" name=\"slf4j-parent\" version=\"1.7.30\">\n         <artifact name=\"slf4j-parent-1.7.30.pom\">\n            <sha256 value=\"11647956e48a0c5bfb3ac33f6da7e83f341002b6857efd335a505b687be34b75\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.slf4j\" name=\"slf4j-parent\" version=\"2.0.4\">\n         <artifact name=\"slf4j-parent-2.0.4.pom\">\n            <sha256 value=\"dc9dc87f53a8af721ee49dbb521bd06cda06134214fdad9400d872a75426cffd\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.sonatype.oss\" name=\"oss-parent\" version=\"4\">\n         <artifact name=\"oss-parent-4.pom\">\n            <sha256 value=\"c513995cf019d9213d4fda666589937b2bf1bea5c4cdd337e6170e80b18406ee\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.sonatype.oss\" name=\"oss-parent\" version=\"7\">\n         <artifact name=\"oss-parent-7.pom\">\n            <sha256 value=\"b51f8867c92b6a722499557fc3a1fdea77bdf9ef574722fe90ce436a29559454\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.sonatype.oss\" name=\"oss-parent\" version=\"9\">\n         <artifact name=\"oss-parent-9.pom\">\n            <sha256 value=\"fb40265f982548212ff82e362e59732b2187ec6f0d80182885c14ef1f982827a\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.tensorflow\" name=\"tensorflow-lite-metadata\" version=\"0.1.0-rc2\">\n         <artifact name=\"tensorflow-lite-metadata-0.1.0-rc2.jar\">\n            <sha256 value=\"2c2a264f842498c36d34d2a7b91342490d9a962862c85baac1acd54ec2fca6d9\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tensorflow-lite-metadata-0.1.0-rc2.pom\">\n            <sha256 value=\"9a4f5e5674366c156c90391662f03ed7c5971d6aa63832df74a271da6ff82e96\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.tensorflow\" name=\"tensorflow-lite-metadata\" version=\"0.2.0\">\n         <artifact name=\"tensorflow-lite-metadata-0.2.0.jar\">\n            <sha256 value=\"e9f18b8a41f017e9033cb0ed85c8a2ba2307292cdfe25eae365923e7a31d2a70\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"tensorflow-lite-metadata-0.2.0.pom\">\n            <sha256 value=\"0fe31326e83b7622cbcd9c75d467b291f01ffe3cc6e3e76651ac05a1c1c7a360\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.xerial\" name=\"sqlite-jdbc\" version=\"3.41.2.2\">\n         <artifact name=\"sqlite-jdbc-3.41.2.2.jar\">\n            <sha256 value=\"0cdab410947e04b6743df99cf1543267ddd107357d6f76948d145be590fd497d\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"sqlite-jdbc-3.41.2.2.pom\">\n            <sha256 value=\"ae11a3b11dcbac1b6403689e3fd8d82b2ceea55e82dbfc4bb32aededf8ccac8e\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n      <component group=\"org.yaml\" name=\"snakeyaml\" version=\"2.3\">\n         <artifact name=\"snakeyaml-2.3.jar\">\n            <sha256 value=\"63a76fe66b652360bd4c2c107e6f0258daa7d4bb492008ba8c26fcd230ff9146\" origin=\"Generated by Gradle\"/>\n         </artifact>\n         <artifact name=\"snakeyaml-2.3.pom\">\n            <sha256 value=\"0f5a265a06331b0049e352be32ca322de18b17f3d4dbb70635d40da692e3582f\" origin=\"Generated by Gradle\"/>\n         </artifact>\n      </component>\n   </components>\n</verification-metadata>\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.14-bin.zip\nnetworkTimeout=10000\nvalidateDistributionUrl=true\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "org.gradle.caching=true\n# If jvmargs is changed then the default values must also be included, see https://github.com/gradle/gradle/issues/19750\norg.gradle.jvmargs=-XX:+UseParallelGC -Xmx4g -Dfile.encoding=UTF-8 -XX:MaxMetaspaceSize=2g -XX:+HeapDumpOnOutOfMemoryError -Xms256m\n# use parallel execution\norg.gradle.parallel=true\norg.gradle.configuration-cache=true\n\n# Disable buildFeatures flags by default\nandroid.defaults.buildfeatures.resvalues=false\nandroid.defaults.buildfeatures.shaders=false\nandroid.useAndroidX=true\n\n# Work around build error with Moshi 1.15.2 and KSP 2.1.21-2.0.1\nksp.useKSP2=false\n"
  },
  {
    "path": "gradlew",
    "content": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\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#      https://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#\n# SPDX-License-Identifier: Apache-2.0\n#\n\n##############################################################################\n#\n#   Gradle start up script for POSIX generated by Gradle.\n#\n#   Important for running:\n#\n#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is\n#       noncompliant, but you have some other compliant shell such as ksh or\n#       bash, then to run this script, type that shell name before the whole\n#       command line, like:\n#\n#           ksh Gradle\n#\n#       Busybox and similar reduced shells will NOT work, because this script\n#       requires all of these POSIX shell features:\n#         * functions;\n#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,\n#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;\n#         * compound commands having a testable exit status, especially «case»;\n#         * various built-in commands including «command», «set», and «ulimit».\n#\n#   Important for patching:\n#\n#   (2) This script targets any POSIX shell, so it avoids extensions provided\n#       by Bash, Ksh, etc; in particular arrays are avoided.\n#\n#       The \"traditional\" practice of packing multiple parameters into a\n#       space-separated string is a well documented source of bugs and security\n#       problems, so this is (mostly) avoided, by progressively accumulating\n#       options in \"$@\", and eventually passing that to Java.\n#\n#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,\n#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;\n#       see the in-line comments for details.\n#\n#       There are tweaks for specific operating systems such as AIX, CygWin,\n#       Darwin, MinGW, and NonStop.\n#\n#   (3) This script is generated from the Groovy template\n#       https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt\n#       within the Gradle project.\n#\n#       You can find Gradle at https://github.com/gradle/gradle/.\n#\n##############################################################################\n\n# Attempt to set APP_HOME\n\n# Resolve links: $0 may be a link\napp_path=$0\n\n# Need this for daisy-chained symlinks.\nwhile\n    APP_HOME=${app_path%\"${app_path##*/}\"}  # leaves a trailing /; empty if no leading path\n    [ -h \"$app_path\" ]\ndo\n    ls=$( ls -ld \"$app_path\" )\n    link=${ls#*' -> '}\n    case $link in             #(\n      /*)   app_path=$link ;; #(\n      *)    app_path=$APP_HOME$link ;;\n    esac\ndone\n\n# This is normally unused\n# shellcheck disable=SC2034\nAPP_BASE_NAME=${0##*/}\n# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)\nAPP_HOME=$( cd -P \"${APP_HOME:-./}\" > /dev/null && printf '%s\\n' \"$PWD\" ) || exit\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=maximum\n\nwarn () {\n    echo \"$*\"\n} >&2\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n} >&2\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"$( uname )\" in                #(\n  CYGWIN* )         cygwin=true  ;; #(\n  Darwin* )         darwin=true  ;; #(\n  MSYS* | MINGW* )  msys=true    ;; #(\n  NONSTOP* )        nonstop=true ;;\nesac\n\nCLASSPATH=\"\\\\\\\"\\\\\\\"\"\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=$JAVA_HOME/jre/sh/java\n    else\n        JAVACMD=$JAVA_HOME/bin/java\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=java\n    if ! command -v java >/dev/null 2>&1\n    then\n        die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nfi\n\n# Increase the maximum file descriptors if we can.\nif ! \"$cygwin\" && ! \"$darwin\" && ! \"$nonstop\" ; then\n    case $MAX_FD in #(\n      max*)\n        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        MAX_FD=$( ulimit -H -n ) ||\n            warn \"Could not query maximum file descriptor limit\"\n    esac\n    case $MAX_FD in  #(\n      '' | soft) :;; #(\n      *)\n        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        ulimit -n \"$MAX_FD\" ||\n            warn \"Could not set maximum file descriptor limit to $MAX_FD\"\n    esac\nfi\n\n# Collect all arguments for the java command, stacking in reverse order:\n#   * args from the command line\n#   * the main class name\n#   * -classpath\n#   * -D...appname settings\n#   * --module-path (only if needed)\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif \"$cygwin\" || \"$msys\" ; then\n    APP_HOME=$( cygpath --path --mixed \"$APP_HOME\" )\n    CLASSPATH=$( cygpath --path --mixed \"$CLASSPATH\" )\n\n    JAVACMD=$( cygpath --unix \"$JAVACMD\" )\n\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    for arg do\n        if\n            case $arg in                                #(\n              -*)   false ;;                            # don't mess with options #(\n              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath\n                    [ -e \"$t\" ] ;;                      #(\n              *)    false ;;\n            esac\n        then\n            arg=$( cygpath --path --ignore --mixed \"$arg\" )\n        fi\n        # Roll the args list around exactly as many times as the number of\n        # args, so each arg winds up back in the position where it started, but\n        # possibly modified.\n        #\n        # NB: a `for` loop captures its iteration list before it begins, so\n        # changing the positional parameters here affects neither the number of\n        # iterations, nor the values presented in `arg`.\n        shift                   # remove old arg\n        set -- \"$@\" \"$arg\"      # push replacement arg\n    done\nfi\n\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Collect all arguments for the java command:\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,\n#     and any embedded shellness will be escaped.\n#   * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be\n#     treated as '${Hostname}' itself on the command line.\n\nset -- \\\n        \"-Dorg.gradle.appname=$APP_BASE_NAME\" \\\n        -classpath \"$CLASSPATH\" \\\n        -jar \"$APP_HOME/gradle/wrapper/gradle-wrapper.jar\" \\\n        \"$@\"\n\n# Stop when \"xargs\" is not available.\nif ! command -v xargs >/dev/null 2>&1\nthen\n    die \"xargs is not available\"\nfi\n\n# Use \"xargs\" to parse quoted args.\n#\n# With -n1 it outputs one arg per line, with the quotes and backslashes removed.\n#\n# In Bash we could simply go:\n#\n#   readarray ARGS < <( xargs -n1 <<<\"$var\" ) &&\n#   set -- \"${ARGS[@]}\" \"$@\"\n#\n# but POSIX shell has neither arrays nor command substitution, so instead we\n# post-process each arg (as a line of input to sed) to backslash-escape any\n# character that might be a shell metacharacter, then use eval to reverse\n# that process (while maintaining the separation between arguments), and wrap\n# the whole thing up as a single \"set\" statement.\n#\n# This will of course break if any of these variables contains a newline or\n# an unmatched quote.\n#\n\neval \"set -- $(\n        printf '%s\\n' \"$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\" |\n        xargs -n1 |\n        sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |\n        tr '\\n' ' '\n    )\" '\"$@\"'\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      https://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n@rem SPDX-License-Identifier: Apache-2.0\r\n@rem\r\n\r\n@if \"%DEBUG%\"==\"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\"==\"\" set DIRNAME=.\r\n@rem This is normally unused\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif %ERRORLEVEL% equ 0 goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\ngoto fail\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=\r\n\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" -jar \"%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\" %*\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif %ERRORLEVEL% equ 0 goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nset EXIT_CODE=%ERRORLEVEL%\r\nif %EXIT_CODE% equ 0 set EXIT_CODE=1\r\nif not \"\"==\"%GRADLE_EXIT_CONSOLE%\" exit %EXIT_CODE%\r\nexit /b %EXIT_CODE%\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "settings.gradle",
    "content": "pluginManagement {\n    repositories {\n        google {\n            content {\n                includeGroupByRegex(\".*google.*\")\n                includeGroupByRegex(\".*android.*\")\n            }\n        }\n        gradlePluginPortal()\n    }\n}\n\nplugins {\n    id 'com.gradle.develocity' version '4.0.1'\n}\n\ndef isCI = providers.environmentVariable(\"CI\").present\n\ndevelocity {\n    buildScan {\n        termsOfUseUrl = \"https://gradle.com/terms-of-service\"\n        termsOfUseAgree = \"yes\"\n        publishing.onlyIf { isCI }\n    }\n}\n\ndependencyResolutionManagement {\n    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n    repositories {\n        google {\n            content {\n                includeGroupByRegex(\".*google.*\")\n                includeGroupByRegex(\".*android.*\")\n            }\n        }\n        mavenCentral()\n        maven { url 'https://jitpack.io' }\n    }\n}\n\nenableFeaturePreview(\"STABLE_CONFIGURATION_CACHE\")\n\ninclude ':app'\n"
  }
]